[
  {
    "path": ".github/ISSUE_TEMPLATE/01-Bug Report.yml",
    "content": "name: Bug Report\ndescription: File a bug report\nlabels: [\"bug\", \"triage\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        > [!IMPORTANT]\n        > **Disclaimer Regarding Forks and Clones**\n        >\n        > Support is provided for the original, unmodified version of QLog.\n        > If you are using a fork, clone, or any modified version of this project, please direct your issue to the maintainer of that specific repository.\n        > This includes issues related to **core features**, as changes introduced in forks may directly or indirectly affect their behavior.\n\n        Please reserve the issue tracker for reporting presumed bugs in QLog. If you have a question about usage or installation, please use the [QLog Discussions](https://github.com/foldynl/QLog/discussions)\n\n  - type: textarea\n    id: what-happened\n    attributes:\n      label: What happened? How can it be reproduced? Provide as much information as possible.\n      description: Also, what did you expect to happen?\n    validations:\n      required: true\n\n  - type: input\n    id: specific-version\n    attributes:\n      label: QLog Version\n      description: \"Version reported in **Main Menu → Help → About**\"\n      value: \"0.0.0\"\n    validations:\n      required: true\n\n  - type: dropdown\n    id: ostype\n    attributes:\n      label: Which OS are you using?\n      options:\n        - Linux\n        - macOS\n        - Windows\n    validations:\n      required: true\n\n  - type: dropdown\n    id: osinstallation\n    attributes:\n      label: 'QLog Installation Method'\n      description: 'Select the installation method'\n      options:\n        - DEB/RPM\n        - Flatpak\n        - EXE\n        - DMG\n        - Self-Compiled\n        - I don't know\n    validations:\n      required: true\n\n  - type: textarea\n    id: system-information\n    attributes:\n      label: Installation Details\n      description: |\n        If you're not familiar with the QLog Installation Method mentioned above, please attach a screenshot of Main Menu → Help → About or provide more details about your OS.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/02-Feature Request.yml",
    "content": "name: Feature Request\ndescription: Request a new feature or enhancement for QLog\nlabels: [\"enhancement\"]\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Please describe the feature you would like to see and why it would be beneficial.  \n\n        Before submitting a request, check if a similar feature has already been suggested in the [existing issues](https://github.com/foldynl/QLog/issues).  \n\n  - type: textarea\n    id: feature-description\n    attributes:\n      label: Feature Description\n      description: Describe the feature or enhancement in detail. How should it work? Why is this feature useful?\n    validations:\n      required: true\n\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\ncontact_links:\n- name: \"📖 Find documentation\"\n  url: https://github.com/foldynl/QLog/wiki\n  about: \"Most documentation is on the QLog wiki\"\n- name: \"📨 Ask a question\t— Discussions\"\n  url: https://github.com/foldynl/QLog/discussions\n  about: \"Please use GitHub Discussions for general questions\"\n"
  },
  {
    "path": ".github/workflows/c-cpp.yml",
    "content": "name: CI Linux/macOS\n\non:\n  push:\n    branches:\n      - 'testing_*'\n  pull_request:\n    branches:\n      - 'testing_*'\n      - master\n  workflow_dispatch:\njobs:\n  ubuntu-build-qt5:\n    name: Ubuntu CI QT5\n    strategy:\n      matrix:\n        os: [ubuntu-22.04, ubuntu-24.04]\n\n    runs-on: ${{ matrix.os }}\n\n    steps:\n    - name: Install dependencies\n      run: |\n         sudo apt-get update\n         sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libsqlite3-dev libhamlib++-dev libqt5charts5-dev qttools5-dev-tools libqt5keychain1 qt5keychain-dev qtwebengine5-dev build-essential libqt5serialport5-dev pkg-config libqt5websockets5-dev\n    - name: Checkout code\n      uses: actions/checkout@v5\n    - name: configure\n      run: qmake QLog.pro\n    - name: make\n      run: make -j2\n\n  ubuntu-build-qt6:\n    name: Ubuntu CI QT6\n    strategy:\n      matrix:\n        os: [ubuntu-22.04, ubuntu-24.04]\n        \n    runs-on: ${{ matrix.os }}\n\n    steps:\n    - name: Install dependencies\n      run: |\n         sudo apt-get update\n         sudo apt-get -y install libhamlib-dev build-essential pkg-config qt6-base-dev qtkeychain-qt6-dev qt6-webengine-dev libqt6charts6-dev libqt6serialport6-dev libqt6webenginecore6-bin libqt6svg6-dev libgl-dev libqt6websockets6-dev\n    - name: Checkout code\n      uses: actions/checkout@v5\n    - name: configure\n      run: qmake6 QLog.pro\n    - name: make\n      run: make -j2\n\n  macos-build:\n     name: MacOS CI\n     if: vars.ENABLE_MACOS == 'true'\n     strategy:\n       matrix:\n         os: [macos-15]\n\n     runs-on: ${{ matrix.os }}\n\n     steps:\n     - name: Install dependencies\n       run: |\n         unset HOMEBREW_NO_INSTALL_FROM_API\n         brew update\n         brew upgrade || true\n         brew install qt6\n         brew link qt6 --force\n         brew install hamlib\n         brew link hamlib --force\n         brew install qtkeychain\n         brew install dbus-glib\n         brew install brotli\n         brew install icu4c\n         brew install pkg-config\n\n     - name: Checkout code\n       uses: actions/checkout@v5\n       with:\n         fetch-depth: 0\n     - name: Get version from tag\n       run : |\n         TAGVERSION=$(git describe --tags)\n         echo \"TAGVERSION=${TAGVERSION:1}\" >> $GITHUB_ENV\n     - name: Configure and compile\n       run: |\n         cd build\n         qmake6 -config release ..\n         make -j4\n\n  deb-package:\n    name: DEB Package Build\n    if: github.event_name != 'pull_request'\n    runs-on: ubuntu-24.04\n\n    steps:\n    - name: Checkout code\n      uses: actions/checkout@v5\n\n    - name: Install tools and build dependencies\n      run: |\n        sudo apt-get update\n        sudo apt-get -y install devscripts equivs dpkg-dev fakeroot lintian libconfig-model-dpkg-perl licensecheck\n        sudo mk-build-deps --install --remove debian/control --tool \"apt-get -y --no-install-recommends\"\n\n    - name: Check debian/copyright\n      run: cme check dpkg-copyright\n\n    - name: Build DEB package\n      run: dpkg-buildpackage -b -us -uc -j4\n\n    - name: Verify DEB was created\n      run: ls -la ../qlog_*.deb\n\n    - name: Run lintian\n      run: lintian --no-tag-display-limit --fail-on error ../qlog_*.changes \n\n    - name: Upload DEB artifact\n      uses: actions/upload-artifact@v5\n      with:\n        name: deb-package\n        path: /home/runner/work/QLog/qlog_*.deb\n        retention-days: 1\n\n  deb-smoke-test:\n    name: DEB Smoke Test\n    needs: deb-package\n    runs-on: ubuntu-24.04\n\n    steps:\n    - name: Download DEB artifact\n      uses: actions/download-artifact@v5\n      with:\n        name: deb-package\n\n    - name: Install and smoke test\n      run: |\n        sudo apt-get update\n        sudo apt-get install -y ./qlog_*.deb\n        QT_QPA_PLATFORM=offscreen qlog --help 2>&1 | grep -q \"QLog Help\"\n\n  rpm-package:\n    name: RPM Package Build\n    if: github.event_name != 'pull_request'\n    runs-on: ubuntu-latest\n    container:\n      image: fedora:43\n\n    steps:\n    - name: Install base tools\n      run: dnf install -y git rpm-build rpmdevtools rpmlint dnf-plugins-core\n\n    - name: Checkout code\n      uses: actions/checkout@v5\n      with:\n        fetch-depth: 0\n\n    - name: Get version from tag\n      run: |\n        git config --global --add safe.directory \"$GITHUB_WORKSPACE\"\n        VERSION=$(git describe --tags --abbrev=0 | sed 's/^v//')\n        echo \"REPO_VERSION=${VERSION}\" >> $GITHUB_ENV\n\n    - name: Install build dependencies from spec\n      run: dnf builddep -y rpm_spec/qlog.spec\n\n    - name: Prepare RPM build tree\n      run: |\n        rpmdev-setuptree\n        TAR_DIR=\"QLog-${REPO_VERSION}\"\n        mkdir -p \"/tmp/${TAR_DIR}\"\n        cp -a . \"/tmp/${TAR_DIR}/\"\n        tar czf ~/rpmbuild/SOURCES/qlog-${REPO_VERSION}.tar.gz --exclude='.git' -C /tmp \"${TAR_DIR}\"\n\n    - name: Build RPM package\n      run: rpmbuild -bb rpm_spec/qlog.spec\n\n    - name: Verify RPM was created\n      run: ls -la ~/rpmbuild/RPMS/*/QLog-*.rpm\n\n    - name: Run rpmlint\n      run: rpmlint ~/rpmbuild/RPMS/*/*.rpm || true\n\n    - name: Upload RPM artifact\n      uses: actions/upload-artifact@v5\n      with:\n        name: rpm-package\n        path: ~/rpmbuild/RPMS/*/QLog-*.rpm\n        retention-days: 1\n\n  rpm-smoke-test:\n    name: RPM Smoke Test\n    needs: rpm-package\n    runs-on: ubuntu-latest\n    container:\n      image: fedora:43\n\n    steps:\n    - name: Download RPM artifact\n      uses: actions/download-artifact@v5\n      with:\n        name: rpm-package\n\n    - name: Install and smoke test\n      run: |\n        dnf install -y $(find . -name 'QLog-*.rpm')\n        QT_QPA_PLATFORM=offscreen qlog --help 2>&1 | grep -q \"QLog Help\"\n"
  },
  {
    "path": ".github/workflows/macOSBuild.yml",
    "content": "name: macOS deployment\n\n#on: [push, pull_request]\n\non:\n  workflow_dispatch:\n  push:\n     branches:\n       - master\n\njobs:\n  macos-build:\n     name: MacOS Build\n     strategy:\n       matrix:\n         os: [macos-12, macos-13]\n\n     runs-on: ${{ matrix.os }}\n\n     steps:\n     - name: Install Dependencies\n       run: |\n         unset HOMEBREW_NO_INSTALL_FROM_API\n         brew update\n         brew upgrade || true\n         brew install qt6\n         brew install qt6-webengine\n         brew link qt6 --force\n         brew link qt6-webengine --force\n         brew install hamlib\n         brew link hamlib --force\n         brew install qtkeychain\n         brew install dbus-glib\n         brew install brotli\n         brew install icu4c\n         brew install pkg-config\n     - name: Checkout Code\n       uses: actions/checkout@v4\n       with:\n         fetch-depth: 0\n     - name: Get version from tag\n       run : |\n         TAGVERSION=$(git describe --tags)\n         echo \"TAGVERSION=${TAGVERSION:1}\" >> $GITHUB_ENV\n\n     - name: Configure and compile\n       run: |\n         mkdir build\n         cd build\n         qmake -config release ..\n         make -j4\n     - name: Build dmg\n       run: |\n         cd build\n         macdeployqt qlog.app -executable=./qlog.app/Contents/MacOS/qlog\n         cp `brew --prefix`/lib/libhamlib.dylib qlog.app/Contents/Frameworks/libhamlib.dylib\n         cp `brew --prefix`/lib/libqt6keychain.dylib qlog.app/Contents/Frameworks/libqt6keychain.dylib\n         cp `brew --prefix`/lib/libdbus-1.dylib qlog.app/Contents/Frameworks/libdbus-1.dylib\n         cp `brew --prefix brotli`/lib/libbrotlicommon.1.dylib qlog.app/Contents/Frameworks/libbrotlicommon.1.dylib\n         cp `brew --prefix`/opt/icu4c/lib/libicui18n.74.dylib qlog.app/Contents/Frameworks/libicui18n.74.dylib\n         install_name_tool -change `brew --prefix`/lib/libhamlib.dylib @executable_path/../Frameworks/libhamlib.dylib qlog.app/Contents/MacOS/qlog\n         install_name_tool -change `brew --prefix`/lib/libqt6keychain.dylib @executable_path/../Frameworks/libqt6keychain.dylib qlog.app/Contents/MacOS/qlog\n         install_name_tool -change @loader_path/libbrotlicommon.1.dylib @executable_path/../Frameworks/libbrotlicommon.1.dylib qlog.app/Contents/MacOS/qlog \n         install_name_tool -change /usr/local/opt/icu4c/lib/libicui18n.74.dylib @executable_path/../Frameworks/libicui18n.74.dylib qlog.app/Contents/MacOS/qlog\n         otool -L qlog.app/Contents/MacOS/qlog\n         macdeployqt qlog.app -dmg\n     - name: Copy artifact\n       uses: actions/upload-artifact@v4\n       with:\n         name: QLog-${{ env.TAGVERSION }}-${{ matrix.os }}\n         path: /Users/runner/work/QLog/QLog/build/qlog.dmg\n\n"
  },
  {
    "path": ".gitignore",
    "content": "# C++ objects and libs\n*.slo\n*.lo\n*.o\n*.a\n*.la\n*.lai\n*.so\n*.dll\n*.dylib\n\n*.patch\n\n# Qt-es\nobject_script.*.Release\nobject_script.*.Debug\n*_plugin_import.cpp\n/.qmake.cache\n/.qmake.stash\n*.pro.user\n*.pro.user.*\n*.qbs.user\n*.qbs.user.*\n*.moc\nmoc_*.cpp\nmoc_*.h\nqrc_*.cpp\nui_*.h\n*.qmlc\n*.jsc\nMakefile*\n\n# Qt unit tests\ntarget_wrapper.*\n\n# QtCreator\n*.autosave\n\n# QtCreator Qml\n*.qmlproject.user\n*.qmlproject.user.*\n\n# QtCreator CMake\nCMakeLists.txt.user*\n\n# QtCreator 4.8< compilation database \ncompile_commands.json\n\n# QtCreator local machine specific files for imported projects\n*creator.user*\n.DS_Store\n/build\n"
  },
  {
    "path": ".gitmodules",
    "content": ""
  },
  {
    "path": "AUTHORS",
    "content": "MAINTAINERS:\n   Ladislav Foldyna OK1MLG <foldyna@gmail.com>\n\nPAST MAINTAINERS:\n   Thomas Gatzweiler DL2IC <mail@thomasgatzweiler.com>\n\nCONTRIBUTORS:\n   Wolfgang DL2KI\n   Fabian Kurz DJ5CW\n   gerbert\n   Florian Thienel\n   AsciiWolf\n   Maciej Krüger\n   BG7JAF\n   Juan Carlos EA5WA\n   Diego LU1IDC\n   Alfredo IK1VQY\n   Michael AA5SH\n   Emilio EA7QL\n   Kyle Boyle VE9KZ\n   Stéphane Fillod F8CFE\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "## How Can I Contribute?\n\n### Reporting Bugs\n*Please* contact me via the repository's Discussion page or email (you can find it \n[QRZ](https://www.qrz.com/db/OK1MLG) or [HamQTH](https://www.hamqth.com/ok1mlg) ) \n\nIf you run into an issue, please search [Issue tracking](https://github.com/foldynl/QLog/issues) \n*first* to ensure the issue hasn't been reported before. Open a new issue only if you haven't \nfound anything similar to your issue.\n\n#### When opening a new issue, please include the following information at the top of the issue:\n* What version you are using.\n* Describe the issue you are experiencing.\n* Describe how to reproduce the issue.\n* Including any warning/errors/backtraces - see debug details in \nQLog [Wiki](https://github.com/foldynl/QLog/wiki/Debug-Log-Level).\n\nIn general, the more detail you share about a problem the quicker a\ndeveloper can resolve it. For example, providing a simple test case is always\nexceptionally helpful.\n\nBe prepared to work with the developers investigating your issue. Your\nassistance is crucial in providing a quick solution. They may ask for\ninformation like:\n\n* Your non-sensitive information - ADIF export, log file etc.\n* Your hardware configuration\n* Your OS, distribution etc.\n* Your version of libraries (especial Qt, Hamlib)\n\n### Pull Requests\n\n#### General\n\n* All pull requests must be based on the current `master` branch \nand should apply without conflicts.\n* Please attempt to limit pull requests to a single commit which resolves\none specific issue.\n* Make sure your commit messages are in the correct format. See the\n[Commit Message Formats](#commit-message-formats) section for more information.\n* When updating a pull request squash multiple commits by performing a\n[rebase](https://git-scm.com/docs/git-rebase) (squash).\n* For large pull requests consider structuring your changes as a stack of\nlogically independent patches which build on each other.  This makes large\nchanges easier to review and approve which speeds up the merging process.\n* Try to keep pull requests simple. Simple code with comments is much easier\nto review and approve.\n* If you have an idea you'd like to discuss or which requires additional testing, consider opening it as a draft pull request.\nOnce everything is in good shape and the details have been worked out you can remove its draft status.\nAny required reviews can then be finalized and the pull request merged.\n\n### Testing\nIf you're in a position to run the latest code\nconsider helping us by reporting any functional problems, performance\nregressions or other suspected issues. By running the latest code to a wide\nrange of realistic workloads, configurations and architectures we're better\nable quickly identify and resolve potential issues.\n\n## Style Guides\n\n### Repository Structure\n\n**Branch Names:**\n- Latest Public Release branch: `master`\n- Upcoming release branch: `testing_$VERSION`\n\n### Coding Conventions\n\n* Conditional \n```\nif ( cond )\n{\n   command;\n}\n````\n* Use spaces around operators\n    * `count + 1` instead of `count+1`\n* Use spaces after commas (unless separated by newlines)\n* Keep in mind that QLog can run under Linux, Windows and MacOS - do not use platform-depend code\n\n#### Modules\nIf possible, one class one file. Each mode (except models) \nhas to include `debug.h` and define \n```\nMODULE_IDENTIFICATION(\"qlog.ui.mainwindow\");\n```\n\nEach function (except models) has to contain \n```\nFCT_IDENTIFICATION;\n```\n\n### Commit Message Formats\n#### New Changes\nCommit messages for new changes must meet the following guidelines:\n* In 72 characters or less, provide a summary of the change as the\nfirst line in the commit message.\n* A body which provides a description of the change. If necessary,\nplease summarize important information such as why the proposed\napproach was chosen or a brief description of the bug you are resolving.\nEach line of the body must be 72 characters or less.\n* Provides a subject line in the format of\n`Module_Name: Change description` where `Module_name` defines a part of source code where the change was made or new feature name (short name).\n\n```\nModule_Name: This line is a brief summary of your change\n\nPlease provide at least a couple sentences describing the\nchange. If necessary, please summarize decisions such as\nwhy the proposed approach was chosen or what bug you are\nattempting to solve.\n```\n\n#### Bug Fixes\nIf you are submitting a fix\nthe commit message should meet the following guidelines:\n* Provides a subject line in the format of\n`Fixed #ddd: Fix name...` where `ddd` represents\neach [Issue](https://github.com/foldynl/QLog/issues) .\n\nBugfixes not listed in the Github Issue are introduced by the same way as Improvements (Module Name etc).\n"
  },
  {
    "path": "Changelog",
    "content": "2026/04/26 - 0.50.0\n- [NEW] - Added Split detection\n- [NEW] - Added Developer and Support tools (PR #991 @aa5sh @foldynl)\n- [NEW] - Added a simple QSL label printing dialog (issue #562)\n- [NEW] - Added Cabrillo contest export\n- [NEW] - Added direct labeling of QSL Requested and QSL Received to the QSO context menu (PR #982 @aa5sh)\n- [NEW] - DXCC Submission Report (PR #967 @aa5sh)\n- [NEW] - DXC - Search pre-fills the callsign from New Contact if callsign is present\n- [NEW] - Settings - Added Danger Zone tab with Delete all passwords and QSOs\n- [CHANGED] - Mutex-free Omnirig1 and Omnirig2\n- [CHANGED] - POTA/SOTA/WWFF/SAT list are download from QLog LOV-repo\n- [CHANGED] - Used an external lib for CSV parsing for LOV Download\n- [CHANGED] - Import - ADIF import updates DXCC only if it is missing in the QSO (issue #983)\n- [REMOVED] - Import - ADIF import does not include the option to update DXCC during the import - no longer needed\n- Fixed Callsign disappears when calling a DX in a split via VFO-B (issue #799)\n- Fixing Rendering issue (issue #989)\n- Updated debian packaging (PR @979 thx @dawkagaming)\n- Hamlib rigctld switching between VFO A/B doesnt change the band mode - added workaround (issue #999)\n- Awards internal redesign\n- Removed AN from the WAC award (issue #1010)\n\n2026/03/19 - 0.49.1\n- Fixed Online Map OSM Access Blocked banner (issue #956)\n- Fixed Package build process issue - openssl-dev is missing (issue #957)\n- Fixed Missing dependence for QTKeychain (issue #964)\n- Added French Translation (PR #969 thx @fillods)\n\n2026/03/13 - 0.49.0\n- [NEW] - Added Pack and Unpack Data and Setting - Computer to Computer Migration (issue #535)\n- [NEW] - Added Rig Sharing via Rigctld (PR #736 issue #159 @aa5sh @foldynl)\n- [NEW] - Added QSL Gallery\n- [NEW] - QSO Filter - Added REGEXP operator\n- [NEW] - Settings - TQSL - Added Path auto-detect and validation\n- [NEW] - Upload QSO - Added LoTW Station Location Combo (PR #929 @TrgoSk @foldynl)\n- [NEW] - QSO Export - Added Station Profile Filter\n- [NEW] - BandMap shows emergency frequencies (issue #462)\n- [NEW] - Added Speed Up Down Macros - WinKey and CWDaemon (issue #491)\n- [NEW] - Settings Winkey v2 - Added PaddleOnly Sidetone (issue #739)\n- [NEW] - Settings Winkey v2 and CWDaemon - Added Sidetone Freq\n- [NEW] - All County fields contain Completer for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n- [NEW] - Added County Awards for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n- [NEW] - ADIF 3.1.7 - Added new modes FT2, FREEDATA, RIBBIT_PIX, RIBBIT_SMS (issue #934)\n- [CHANGED] - Generic FTx for FT8/FT4 (FT2) in Alert and DXC filter (issue #937)\n- [CHANGED] - LoTW QSL matching algorithm uses Mode and Mode Group matching (issue #942)\n- [CHANGED] - Reduced download period for DXCC Entities from 21 to 7 days\n- LogbookWidget: Delete Performance Optimization\n- Fixed Awards POTA Activator Filter\n- Fixed man page\n- Fixing SATmode Activity is blank (issue #948)\n\n2026/01/30 - 0.48.0\n- [NEW] - Rig Widget - tuning rig with mouse (issue #855)\n- [NEW] - Awards - Added User Filter Combo (issue #870)\n- [NEW] - Statistics - Added User Filter; new Dialog layout (issue #870)\n- [NEW] - Alerts - Added detailed Log Status settings (issue #817)\n- [NEW] - Settings - Enable/Disable sending color-coded status indicators back to WSJT-X (issue #885 @aa5sh @foldynl)\n- [CHANGED] - Omnirig Drivers: Removed QT AXContainers - pure Windows API code\n- [CHANGED] - Enabled Chekbox in Alerts Table (issue #867)\n- [CHANGED] - Serial Port Completer contains Horizontal ScrollBar\n- [CHANGED] - TCI - Settings - Default PWR defines the maximum output power\n- Fixed Omnirig drivers keep sending frequency change (issue #872)\n- Fixed ADIF import does not accept a default operator name (issue #884)\n- Fixed HamQTH URL from http to https (PR #886 @aa5sh)\n- Fixed Missing Band value when QSO from FLDigi (issue #892)\n\n2025/12/19 - 0.47.1\n- [CHANGED] - DXC - VE7CC-type Cluster is correctly detected (PR #851 @kyleboyle)\n- [CHANGED] - Chat - Changed ON4KST URL (issue #857)\n- Fixed missing clear button for Search Callsign (issue #753)\n- Fixed Updated QSOs are not sent to wavelog (issue #847)\n- Fixed Fixed Omnirig(v2) getFreq, getVFO, setFreq (issue #853)\n- Fixed ADI Header does not follow ADIF Spec (issue #859)\n- Fixed OmniRig settings are not saved (issue #862)\n\n2025/12/06 - 0.47.0\n- [NEW] - Adds theme options - native, light, dark (PR #718 @kyleboyle)\n- [NEW] - Implemented ADIF 3.1.6\n- [NEW] - ADIF 3.1.6 - Added new modes FSK and MTONE\n- [NEW] - ADIF 3.1.6 - Added new contest IDs\n- [NEW] - ADIF 3.1.6 - Added new column EQSL_AG (Import/Export only)\n- [NEW] - Statistics, QSODetail contain deleted DXCC Entities (PR #728 @aa5sh @foldynl)\n- [NEW] - Settings Hamlib - Added support to define CIV Addr for Icom and Ten-Tec (issue #747)\n- [NEW] - Settings Hamlib - Added RTS and DTR control (PR #809 @aa5sh)\n- [NEW] - Settings GUI - Added options to switch distance unit\n- [NEW] - Added Linux manpage (PR #791 @dawkagaming)\n- [NEW] - Added a link to the GitHub release notes under Help-Whats New\n- [NEW] - Added workaround for WriteLog - always call callbook lookups (PR #833 @sjwoodr)\n- [NEW] - Awards - Added Not-Confirmed filter (PR #836 @aa5sh)\n- [NEW] - Rotator Widget - Added buttons to change button profiles\n- [CHANGED] - Settings - Added network loop detection for WSJTX Forward (issue #815 @aa5sh @foldynl)\n- [CHANGED] - Rotator - Rotator timeout is set to 5s (PR #823 @aa5sh)\n- [CHANGED] - Double Spin Boxes - the decimal separator is forced to be a period\n- [DELETED] - WSJTX Widget - Removed Freq and Mode\n- Fixed QSODetail - Anti-meridian bug on map (issue #786)\n- Fixed Statistics: Center maps on QTH longitude (issue #824)\n- Fixed OmniRig disconnecting when its status changed unexpectedly (issue #832)\n\n2025/10/31 - 0.46.2\n- Fixed Spaces after QRZ.com name (issue #767)\n- Fixed SPID Rot1Prog Rotator more 360 deg (issue #775)\n- Fixed build instructions on Debian (PR #777 @leventelist)\n- Fixed Bandmap truncated output despite having space (issue #779)\n- Fixed Statistics - Anti-meridian bug on map (issue #786)\n- Fixed Binary file in the tarballs (issue #794)\n- Fixed LOTW and eQSL upload status updated even when nothing is uploaded (issue #807)\n- Fixed Imported QSOs contain incorrect My DXCC info (issue #812)\n- Fixed Statistics Dialog does not show confirmed grids\n\n2025/09/26 - 0.46.1\n- Fixed QSO filter incorrectly displays inserted date (issue #752)\n- Fixed Logbook Search Icon is not centered (issue #753)\n- Fixed Using CQRLog API Key for Clublog (issue #759)\n- Fixed Online Service Password leaking via debug files (issue #760)\n- Fixed Tabs are not showed properly (PR #762 @aa5sh)\n- Fixed inability to edit Power in QSO Detail (issue #763)\n\n2025/09/12 - 0.46.0\n- [NEW] - NewContact: POTA/SOTA/WWFF/IOTA info is taken from the nearest spot (@aa5sh @foldynl)\n- [NEW] - DXSpots are sent to Flex Radio (PR #694 @aa5sh)\n- [NEW] - CWConsole - Added support for automatic periodic sending of CW Macros (issue #708)\n- [NEW] - Added mapping of Winkey hardware buttons to CW macro keys F1–F4 (issue #711)\n- [NEW] - Added Search Types to the Logbook Search Editbox (issue #733)\n- [NEW] - Rig - Periodic Rig status reporting independent of its changes (PR #730 @aa5sh)\n- [NEW] - Settings - Serial Port Completer for MacOS and Linux (PR #737 @aa5sh)\n- [NEW] - Hamlib - Attempt to send Power On when connecting the Rig\n- [NEW] - POTA Spots Info is received from the API at api.pota.app to improve POTA detection\n- [CHANGED] - Logbook Search Filter Widget - Added Search Widget\n- [CHANGED] - QSO Detail Country boxes use the new Search Filter Widget\n- [CHANGED] - NewContact - RST field uses the Overwrite Mode\n- [CHANGED] - NewContact - Default cursor position in RST is at the first character\n- [CHANGED] - Setting Dialog - Modes - Default Report can define cursor position\n- [CHANGED] - HamlibRot - Changed Poll Interval from 500 to 2000ms\n- Fixed DUPE is not detected for the first Contest QSO (issue #699)\n- Fixed FREQ_RX/BAND_RX is present only when RX and TX freqs are different (issue #714)\n- Fixed Repeated log recording (issue #722)\n- Fixed QSO Filter contains untranslated QSO items (issue #732)\n\n2025/07/11 - 0.45.0\n- [NEW] - Single Dialog for Upload/Download Online Services (issue #448)\n- [NEW] - Added option to swap paddles to Winkey settings (issue #676)\n- [NEW] - Added native support for the FLRig interface (issue #679)\n- [NEW] - Added New Version Notification - only for MacOS and Windows (PR #669 @aa5sh)\n- [NEW] - QRZ Upload - Added support for multiple API Keys\n- [NEW] - Logbook - Added highlighting to the filter button when a filter is active\n- [NEW] - WSJTX - Filtered label is shown when filter is enabled\n- [NEW] - DXC - Filtered label is shown when filter is enabled\n- [NEW] - Added support to Upload Cloudlog/Wavelog\n- [NEW] - Add JS8 to legacy_modes.json (issue #677)\n- [CHANGED] - Unification Settings storage\n- [CHANGED] - Calculate distances according to IARU rules\n- Fixed missing Wsjtx Spot values in the AlertWindow\n\n2025/05/11 - 0.44.1\n- Fixed Rotator Widget Seg Fault for new users (issue #666)\n\n2025/05/09 - 0.44.0\n- [NEW] - Activity Manager - Added SKCC, UKSMG and FISTS as Dynamic Fields\n- [NEW] - QSO - FISTS, SKCC, and UKSMG are auto-filled from MembershipQE (issue #628)\n- [NEW] - Rotator - Added QSO destination needle (issue #644)\n- [NEW] - QSO Detail - Adds grayline and short path (PR #653 @kyleboyle)\n- [CHANGED] - Rotator - Needle colors correspond to the online map (issue #644)\n- Fixed TCI cw_macros must contain RigID (issue #663)\n- Fixed TCI setKeySpeed sets keyer and macros speed (issue #663)\n- Fixed Data mode missing in rig control window - rigctld (issue #660 @aa5sh)\n- Improved DXC Mode detection\n- Updated Simplified Chinese translation\n\n2025/04/19 - 0.43.1\n- Fixed Click on PHONE DX Spots sets wrong mode (issue #453)\n- Fixed No freq via Omnirig for IC7400 (issue #639)\n\n2025/04/04 - 0.43.0\n- [NEW] - Added support to receive QSOs from CSN SAT Device (PR #610 @aa5sh)\n- [NEW] - Bandmap - Multiple independent bandmap windows (PR #593 @kyleboyle @foldynl)\n- [NEW] - Winkey Keyer driver currently supports v1 and v2 hardware\n- [NEW] - QSO Detail - QSLs QSLr Msg is editable\n- [NEW] - Activity Manager - Added new dynamic field - QSL Message Send\n- [CHANGED] - HamlibDrv - Enabled Power, RIT, XIT, Morse for RIG Netctl\n- [CHANGED] - QSO Detail - QSLMSG replaced by QSLMSG_RCVD (issue #633)\n- [CHANGED] - eQSL Upload - Added an option to choose a QSLMsg field\n- [CHANGED] - eQSL Download - eQSL QSLMSG is stored to QLog QSLMSG_RCVD\n- [CHANGED] - eQSL Download - Added QSLMSG_RCVD merging - eQSL message is appended\n- Fixed Speed pot doesn't seem to work with a WinKeyer; double chars (issue #618)\n- Fixed BandMap Spots colour change after a QSO (issue #632)\n- Fixed Incorrect Field Mapping for Received eQSL Messages (issue #633)\n\n2025/03/07 - 0.42.2\n- Fixed Logbook country translations (issue #608)\n- Fixed Unexpected dialog when QSO after contest (issue #614)\n- Fixed Statistics Widget does not display NULL continents (@aa5sh)\n- Fixed Statistics Widget does not display NULL Band, Mode\n- Fixed Statistics Widget TOP10 does not display removed DXCCs\n- Fixed Statistics Widget TOP10 does not display translated country names\n- Fixed Awards Widget does not display removed DXCCs\n\n2025/02/22 - 0.42.1\n- Fixed Unexpected timezone info (issue #600)\n- Fixed DXCC Statistics picks more entities (issue #601)\n- Fixed a crash when no internet connection\n\n2025/02/14 - 0.42.0\n- [NEW] - Awards - Added Slots - total over each band (issue #538)\n- [NEW] - Awards - Added Grid Award - 2/4/6 Chars grid (issue #564)\n- [NEW] - Settings - Added options to switch 12/24 time and date format (issue #573)\n- [NEW] - Activity Manager - Added new dynamic fields - Rig (issue #575)\n- [NEW] - LoTW Import - Fill missing information also for confirmed QSOs (@aa5sh)\n- [NEW] - Added CW macro QTH\n- [NEW] - DXC - Added 15min Trend\n- [CHANGED] - Changed IOTA LOV Source, the official web is used\n- [CHANGED] - CSV Export: Time and Date formats use ISO8601 format (issue #562)\n- [CHANGED] - Settings - Renamed Shortcuts to GUI tab\n- [CHANGED] - LOV - Improved LOV download performance (PR #582 @aa5sh)\n- Partial fix Windows State/Size does not save in case of fullscreen (issue #418)\n- Fixing TCI error when you change Rig (issue #526)\n- Fixed DXCC Award total worked confirmed counts included deleted entities (PR #588 @aa5sh)\n- Fixed Raspberry PI Flatpak - Import Select file dialog crashes (issue #589)\n- Suppressed the ability to edit Contest fields after the start (issue #590)\n\n2025/01/21 - 0.41.1\n- Fixed compilation issue under Debian 12 (issue #571)\n- Fixed Incorrect GPL version in rpm/deb packages (issue #572)\n- Fixed MacOS floating utility window bug (PR #576 @kyleboyle)\n- Updated IT translation\n\n2025/01/11 - 0.41.0\n- [NEW] - Logbook - Added a new context menu item - Update QSO from Callbook (issue #450 @aa5sh)\n- [NEW] - DIGI mode is used in case of DXC Digi Spots (issue #480)\n- [NEW] - DXC - Retrieve information about SOTA, POTA, IOTA and WWFF from comment (issue #482)\n- [NEW] - Alert - Added SOTA, POTA, IOTA and WWFF filter\n- [NEW] - Added the COM Port Completer for Windows platform (issue #490)\n- [NEW] - Settings - Added DXCC Confirmed By options (issue #508)\n- [NEW] - Added POTA Export Formatter (activator/hunter) (PR #514 @kyleboyle)\n- [NEW] - CW Console - CW Halt with the user-defined shortcut (issue #518)\n- [NEW] - Added an input parameter to save debug message to file\n- [NEW] - Logbook - Added sorting function to logbook table columns (PR #540 @kyleboyle)\n- [NEW] - Network Notification - Added Rig Status Notification\n- [NEW] - Implemented ADIF 3.1.5\n- [NEW] - ADIF 3.1.5 - Added new submodes FSKH245 and FSKH105 for HELL\n- [NEW] - ADIF 3.1.5 - Added new contest IDs\n- [NEW] - ADIF 3.1.5 - Added new columns (Import/Export only)\n- [NEW] - ADIF 3.1.5 - Added My DARC DOK to Station Profile\n- [CHANGED] - Settings: disabled band and mode name modification\n- [CHANGED] - DX Stats contain all enabled bands (issue #538)\n- [CHANGED] - Removed Freq, TimeDate On/Off Data Type Indicators (issue #552)\n- [CHANGED] - ADIF 3.1.5 - VUCC and MY_VUCC can contain 6 or 4-chars locators\n- [CHANGED] - Stop exporting default value N for qsl_rcvd, qsl_sent, lotw/dcl/eslq_qsl_rcvd/sent\n- [CHANGED] - Extended QSL/Import Dupe matching rule to Callsign, Band, Mode, Time and Sat_Name (issue #563)\n- Fixed MacOS - keep floating windows visible on app unfocus (issue #530)\n- Fixed Contest Filter ignores the first QSO (issue #529)\n- Fixed It is not possible to quit Qlog with detached widgets Rot and Rig (issue #534)\n- Fixed ADX/CSV/JSON do not export non-ASCII chars (issue #542)\n- Fixed Checking the 60m checkbox in cluster filters allows 160m spots to appear (issue #543 @aa5sh)\n- Fixed Problems uploading to QRZ.com (issue #559 PR #561 @aa5sh)\n- Fixed DX Stat screen is jumping up/down\n- Fixed Omnirig drivers: Digi modes are not correclty recognized\n\n2024/11/29 - 0.40.1\n- Fixed Bands - Added missing 8m band (issue #515)\n- Fixed CW Console - EXCSTR does not work properly (issue #517)\n- Fixed Activity Manager - Missing Propagation Mode None (issue #519)\n- Fixed QSO Filter - filter fields with random order (PR #525 @aa5sh)\n- Fixed TCI error when you change Rig (issue #526)\n- Fixed NewContact - satellite mode too wide (issue #527)\n\n2024/11/24 - 0.40.0\n- [NEW] - Activity Manager - merged Layout Manager and profiles (issue #408)\n- [NEW] - Activity Manager - Added new dynamic fields - Contest fields, RX/TX Power\n- [NEW] - Added light support for contests (issue #345)\n- [NEW] - Added CW macros EXCHSTR, EXCHNR, EXCHNRN\n- [NEW] - Export Filter - Added user filter combo (original idea PR #476 @aa5sh)\n- [NEW] - New Contact -  Added expand/collapse button to QSO field tab widget (PR #495 @kyleboyle)\n- [NEW] - Alert - Added CQZ and ITUZ filters\n- [NEW] - KSTChat - Added a new 40MHz room (PR #496 @kyleboyle)\n- [NEW] - Station Profile contains Operator Callsign (issue #441 @kyleboyle)\n- [NEW] - Station Profile contains County (issue #493 @kyleboyle)\n- [NEW] - Statistics - Adds time of day and better qso mapping (PR #501 @kyleboyle)\n- [NEW] - Bandmap - Tooltip shows a spotter callsign (PR #507 @Skittlebrau)\n- [CHANGED] - New Contact - Renamed DXCC Tab to DX Stats contains DXCC and Station Statistics (issue #477)\n- [CHANGED] - QSL Import dialog - Detail text is selectable by mouse and keyboard\n- [CHANGED] - Removed Main Menu Layout; Activity Manager is in the bottom-left corner\n- [CHANGED] - Removed Keep Options from the Equipment Menu - use Activity Manager for it\n- Fixed issue when CW is always selected after Settings exiting or connecting the Rig\n- Updated Timezone definition file - version 2024b\n\n2024/10/05 - 0.39.0\n- [NEW] - DXC - Added Full-text search\n- [NEW] - Select S in RST Edit when focused (issue #454)\n- [NEW] - Alerts - Added Member Column\n- [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep\n- [CHANGED] - Changed Backup policy\n- [CHANGED] - Logbook page size - improved performance\n- [CHANGED] - Logbook - CTRL-A (Select All) is disabled\n- [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452)\n- [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh)\n- [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh)\n- [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map\n- [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received\n- [CHANGED] - Added a postponed handling for Rig soft errors (issue #472)\n- Fixed WSJT-X does not emit band change if rig is disconnected (issue #447)\n- Fixed Wrong import of ADIF file of another log program (issue #455)\n- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458)\n- Fixed ADIF import does not import records with old DXCC Entities (issue #459)\n- Fixed ADIF import incorrectly uses Station Profile parameters (issue #461)\n- Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464)\n- Fixed Alerts Window displays OOB Spots (issue #469)\n- Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470)\n\n2024/08/29 - 0.38.0\n- [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu\n- [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh)\n- [NEW] - Rig Setting - Added RTS/DTR PTT Type support (issue #353)\n- [NEW] - Bandmap - Scrollbar position is saved per band (issue #415)\n- [NEW] - New Contact - Added a dynamic value completer for SIG field (issue #425)\n- [NEW] - Awards - Added SOTA/POTA/WWFF (@aa5sh issue #311)\n- [NEW] - Awards - Added Not-Worked Filter\n- [NEW] - New Contact - Added Long Path Azimuth info\n- [NEW] - POTA Fields allow a comma-delimited list of one or more POTA Refs\n- [NEW] - WSJTX tunes freq/mode like Rig if rig is disconnected\n- [CHANGED] - Alert Widget is a Dock Widget (issue #399)\n- [CHANGED] - QLog adds more information from callbook for WSJTX QSOs (issues #403 #405 #420)\n- [CHANGED] - File Open dialogs are not a native dialog under Linux (issue #427)\n- [CHANGED] - Profiles transferred to DB\n- [CHANGED] - LOV last_dates transferred to DB\n- [CHANGED] - DX Cluster - Login Callsign is always the base Callsign\n- [REMOVED] - Setting DXCC Date\n- Fix for MacOS Layout Geometry Restore (@aa5sh)\n- Fixed TQSL does not block GUI thread\n- Fixed MacOS build process (@aa5sh)\n\n2024/07/26 - 0.37.2\n- Fixed Field QSL Send Via should be retained (issue #413)\n- Fixed Set rotator position fails if azimuth > 180 (issue #417)\n- Fixed Windows State/Size does not save in case of fullscreen (issue #418)\n- Fixed Significant rounding during azimuth calculation (issue #422)\n- Updated Simplified Chinese translation\n- Updated Spanish translaction\n- Added Italian translation (thx IK1VQY)\n\n2024/07/10 - 0.37.1\n- Fixed QSO Table Callsign filter is not filled properly (issue #401)\n- Fixed DXC zero frequency for last QSO in case of FT8 QSOs (issue #404)\n- Fixed Callsign Context Menu does not work (issue #409)\n- Fixed QSO Detail Save and Edit buttons are not translated (issue #410)\n\n2024/07/01 - 0.37.0\n- [NEW] - Added Shortcuts Editor (issue #293)\n- [NEW] - Added QO100 Bandplan to correctly categorize the DX Spots\n- [NEW] - Improveded detection of SH/DX SHF Spots\n- [NEW] - Online Map - Added WSJTX CQ Spots\n- [NEW] - WSJTX - Sortable View\n- [NEW] - Alerts - Sortable View\n- [NEW] - Added Spanish translation (thx LU1IDC)\n- [NEW[ - Added Search Callsign Clear Button (issue #396)\n- [CHANGED] - QRZ auth should be over POST with form data (issue #389)\n- [CHANGED] - Big CTY file is used\n- [CHANGED] - Callbook Country DXCC ID is used in case of difference from Big CTY\n- [CHANGED] - Removed ALT+W and CTRL+DEL shortcuts\n- [CHANGED] - Removed New Contact and Save Contact from Logbook Main Menu\n- Fixed Guantanamo KG4 Issue (issue #372)\n- Fixed QRZ Lookup Not Including Full Name - History (issue #388)\n- Fixed Spot Last QSO contains TX freq, should contain RX freq (issue #390)\n- Fixed Spot Last QSO must contain Freq in kHz (issue #391)\n- Fixed Bandmap select previous selected callsign issue (issue #394)\n- Fixed Malfunctioning tuning of WSJTX Alert spot\n- Fixed DXCC Status for FT4 Spots incorrectly identified in WSJTX\n\n2024/06/07 - 0.36.0\n- [NEW] - WSJTX: Added support to received ADIF QSO Log record\n- [NEW] - Sat mode is derived from RX/TX Freq\n- [NEW] - Logbook filters change color when enabled\n- [NEW] - Frequency input boxes PageUp/Dn switches the band (issue #360)\n- [NEW] - CTRL + PgUp/Dn switch band on the connected rig - global shortcut (issue #360)\n- [NEW] - Added number of filtered QSOs (issue #374)\n- Fixed Callbook query does not work (issue #377)\n- Fixed Logbook columns are reordered after Delete (issue #383)\n- Fixed Missing Republic of Kosovo flag (issue #384)\n\n2024/05/21 - 0.35.2\n- Improved delete performance; added delete progress bar (issue #351)\n- Fixed Password with plus is incorrectly sent to online services (issue #366)\n- Fixed Compilation issue under v4.6 (issue #368)\n- Fixed Network Rig configuration is not saved (issue #370)\n\n2024/05/06 - 0.35.1\n- Fixed Free QRZ callbook - Name is not populating (issue #363)\n- Fixed Incorrect CW segment freqs (issue #365)\n\n2024/05/03 - 0.35.0\n- [NEW] - Added Rot Interface PSTRotator Network\n- [NEW] - Added QSO/QSL Since option to eQSL Dialog\n- [NEW] - Bandmap - Current Mode segment visualisation\n- [NEW] - CW Console - Added Word/Whole mode switch\n- [NEW] - Added Callbook Profile Image Widget\n- [NEW] - ASCII conversion based on Text-Unidecode/iconv algorithm (issue #316 #350)\n- [NEW] - ITU/CQ Zones can be defined in Station Profile (issue #358)\n- [CHANGED] - Spacebar is used as a focus changer for fields where space is not allowed\n- [CHANGED] - Focus does not select text in the input fields\n- [CHANGED] - Force XCB under Linux Wayland\n- [CHANGED] - Bandmap - Added Callsign/Freq/Mode to tooltip (issue #355)\n- Fixed incorrect ADIF date format for clublog_qso_upload_date (issue #342)\n- Fixed The last name from Callbooks queries (issue #346)\n\n2024/03/25 - 0.34.0\n- [NEW] - Rotator Widget - Azimuth by Clicking\n- [NEW] - Rotator Widget - QSO button provides Short/Long Path (issue #330)\n- [NEW] - Equipment Menu - Added Keep Options between application restart (issue #331)\n- Fixed TCI - Thetis Connection issue (issue #327)\n- Fixed TCI - Spots To Rig are not displayed (issue #328)\n- Fixed Bandmap unintentionally emits frequency labels (issue #333)\n- Fixed Failing to load grid square for G and EI SOTA summits (issue #336)\n- Fixed HRDLog On-Air message is not sent (issue #337)\n- Fixed Offline Map - Improved Path drawing\n\n2024/03/09 - 0.33.1\n- Fixed Rotator offline map is incorrectly centered (issue #324)\n- Fixed Hamlib integration not working (issue #325)\n- Fixed issue when Hamlib reopen rig caused Initialization Error\n- Fixed issue when Omnirig Drv did not emit rigIsReady signal\n\n2024/03/08 - 0.33.0\n- [NEW] - Added Rig Interface TCI\n- [NEW] - Callbook search can be temporarily paused\n- Improved DXC Mode recognition\n- Fixed Modal dialog blinks - Windows platform (issue #315)\n- Fixed LoTW and eQSL download are only QSLs dowloads - button label changed (issue #318)\n- Fixed i18n: Country Names and Prop-modes are translated (issue #322)\n\n2024/02/10 - 0.32.0\n- [NEW] - Added Rig Interface Omnirig v1 (Windows only)\n- [NEW] - Added Rig Interface Omnirig v2 (Windows only)\n- [NEW] - Clublog - Added Clear Clublog and reupload QSOs\n- [NEW] - Clublog - Added Real-time Insert/Update/Delete\n- [CHANGED] - Clublog - Upload callsign is derived from the Current Profile Callsign\n- Fixed clang linker failed issue (issue #301)\n- Fixed SAT Mode U/U missing (issue #308 PR #309 thanks ea5wa)\n- Fixed Multiple QSO selection. Callsigns modified by mistake (issue #310)\n- Fixed Callbook query cache is not properly cleared when Callbook settings change (issue #313)\n\n2024/01/05 - 0.31.0\n- [NEW] - DXC - Improved Mode recognition\n- [NEW] - DXC - Switch Rig mode based on DXC Spot Mode (issue #217)\n- [NEW] - DXC - Added Spot Country Column (issue #273)\n- [NEW] - DXC - Added Menu for server management\n- [NEW] - DXC - Added Auto-connect to server\n- [NEW] - DXC - Added Keep QSOs Context Menu\n- [NEW] - DXC - Added Clear QSO Context Menu\n- [NEW] - DXC - Added support for SH/DX response parsing\n- [NEW] - DXC - Added support for username, password for connection\n- [CHANGED] - DXC - Commands Combo changed to function button with selectable function\n- [CHANGED] - DXC - DX Spot is prepared via DXC Command Line, Remark dialog was removed\n- [NEW] - Online Map - IBP station double-click tunes freq and switch Rig mode\n- [NEW] - Main Window - Current profile name is shown (issue #282)\n- [NEW] - Import - Details can be saved to file (issue #284)\n- [NEW] - Added Simplified Chinese translation (PR #285 thank BG7JAF)\n- [NEW] - New Contact - Enter saves QSO if QSO time is running (issue #293 - partial)\n- [NEW] - New Contact - Callsign Enter event saves QSO if no Callbook is active - Pileup Mode (issue #293)\n- [NEW] - RIG Widget - RIT/XIT are displayed with user-friendly units (issue #294)\n- [CHANGED] - SAT List download - Shortened download period for SAT list from 30 to 7 days\n- Fixed ADI Import is too slow (issue #270)\n- Improved Import/Export Performance\n- Fixed Missing Satellite Mode SX (issue #291)\n- Fixed QSO Detail - Issue when Sat-Name field was always disabled\n- Fixed RPM build - Installed (but unpackaged) metainfo file issue\n\n2023/12/01 - 0.30.0\n- [NEW] - QSL Images are stored in the database\n- [NEW] - Added AppStream Metainfo File (PR #262 thanks AsciiWolf)\n- [NEW] - Added (WPX) prefix (issue #263)\n- [NEW] - Added WPX Award statistics\n- [NEW] - Added support for external translation files(issue #275)\n- [CHANGED] - Removed QSOID from Export dialog column setting (issue #258)\n- Fixed Date editor does not support NULL value in Logbook Direct Editor (issue #256)\n- Fixed duplicate entry in Windows Add or Remove - only Window platform (issue #260)\n- Fixed RST fields revert to 59 after changing them (issue #261)\n- Fixed Cannot change TQSL Path in Settings - flatpak (issue #271)\n\n2023/11/13 - 0.29.2\n- Fixed QLog is already running error popup on MacOS (issue #257 thanks rjesson)\n\n2023/11/10 - 0.29.1\n- Fixed QSL cards tooltip are not displayed under qt6.5 (issue #248)\n- Fixed Distance unit is not displayed in QSO Info under Windows (issue #250)\n- Fixed Editing STATION_CALLSIGN can cause unwanted change in QSO Detail (issue #251)\n- Fixed QSO Detail Operator Name containes an incorrect value (issue #252)\n- Fixed Calls with VE, VA are coding as Amsterdam & St Paul Islands instead of Canada (issue #253)\n- Fixed LoTW QSL import reports unmatched QSOs sometime (issue #254)\n\n2023/10/20 - 0.29.0\n- [NEW] - Added user-defined layout for New QSO Detail widget\n- [NEW] - Main window State and Geometry can be saved to layout profile\n- [NEW] - Awards - Added WAS\n- [NEW] - Awards - WAZ/ITU/WAC show all possible values\n- [NEW] - Distance unit (km/miles) is controlled by OS Locale\n- [CHANGED] - Removed SAT Tab - field can be added via Layout Editor\n- Improved Import QSO performance\n- Fixed QLog crashes if POTA, SOTA or WWFF contain incorrect values (issue #245)\n- Fixed QSOs are not uploaded to QRZ and HRDLog if fields contain HTML delimiter strings (issue #247)\n\n2023/09/22 - 0.28.0\n- [NEW] - Added ON4KST Chat Support\n- [NEW] - Added Az BeamWidth and Az Offset to Antenna Profile\n- [NEW] - Double-Clicking the IBP callsign in the online map tunes the frequency\n- Fixed Browse button should open an expecting folder (issue #241)\n- Fixed Reword QSL buttons and Settings in QSO Details and Settings (issue #242)\n\n2023/08/21 - 0.27.0\n- [NEW] - Added HRDLog Support\n- Fixed Text field alignment (issue #233)\n- Fixed Rig/Rot Connection port type selection (issue #235)\n- Fixed Incorrect Distance Value in WSJTX Widget (issue #236)\n- Fixed Incorrect WSJTX locator target on the map (issue #237)\n\n2023/07/30 - 0.26.0\n- [NEW] - Added user-defined layout for New QSO widget\n- [NEW] - Pressing Spacebar in Callsign field skips RST fields\n- [NEW] - Added user-defined URL for web lookup (issue #230)\n- Fixed WSJTX QSOs should have an Operator Name from Callbook (issue #223)\n- Fixed US call area suffixes not handled correctly (issue #226 thanks Florian)\n- Fixed QSO Filter Detail allows to save an empty Filter Name (issue #228)\n\n2023/07/17 - 0.25.1\n- Fixed Unexpected mode change when Setting Dialog is saved (issue #222)\n- Fixed QSL_SENT field has an incorrect ADIF name (issue #225)\n\n2023/07/04 - 0.25.0\n- [NEW] - Export - Added CSV Format\n- [NEW] - Export - Added Type of Export Generic/QSLs (issue #209)\n- [NEW] - Export - Added Exported Columns Setting\n- [NEW] - Export - All export formats use the ADIF field name convention\n- [CHANGED] - Export - JSON format contains a header - JSON format change\n- [CHANGED] - Default Statistics Interval is curr_date-1 and curr_day\n- Fixed Errors from Secure Storage are not shown (issue #216)\n- Fixed RX/TX Bands are uneditable when RX/TX freqs are missing (issue #220)\n\n2023/06/16 - 0.24.0\n- Fixed Incorrect FT4 mode-submode (issue #212)\n- Fixed CONTESTIA mode should be CONTESTI (issue #213)\n- Fixed Context menu deselects NewContactEditLine (issue #215)\n- FIxed incorrect WSJTX Filter initialization (issue #218)\n\n2023/06/09 - 0.23.0\n- [NEW] - Added CWDaemon Keyer Support\n- [NEW] - Added FLDigi Keyer Support\n- [NEW] - Online Map - based on locale, the map language is selected (Only EN, FR, GE supported - issue #180)\n- Fixed After entering longer QTH, the field content is not left-aligned (issue #157)\n- Fixed wrong QSO Time in case of JTDX (issue #204)\n- Fixed QSL Sent Date fields are not filled if QSL Sent Status fields are Y (issue #207)\n\n2023/05/07 - 0.22.0\n- [NEW] - ADIF Import - My Profile is used to define default values\n- [NEW] - ADIF Import - Checking a minimal set of input fields (start_time, call, band, mode, station_callsign)\n- [NEW] - ADIF Import - Added Import Result Summary + Import Detail Info\n- [NEW] - Main Menu - Added Help -> Mailing List.\n- [NEW] - Export - Filter for the exported QSOs\n- [CHANGE] - Renamed Locator to Gridsquare\n- Fixed Some anomalies in the input and processing of QSLr Date (issue #192)\n- Fixed User unfriedly CW Keyer Error (issue #194)\n- Fixed ADIF import (issue #196)\n- Fixed Operator field is incorrectly used  (issue #197)\n- Fixed Crash if an unknown POTA & SOTA/WWFF Setting is entered (issue #198)\n- Fixed FLDIGI cannot connect QLog (issue #199)\n- Fixed if ADIF record is missing band info, add this from freq field (thx DJ5CW)\n\n2023/04/16 - 0.21.0\n- [NEW] - Rotator - Added Used-Defined Buttons\n- [NEW] - Rotator - Added Destination Azimuth Needle\n- [NEW] - Online Map - Added Antenna Beam Path\n- [NEW] - Rig - Combos are disbled when disconnected\n- [NEW] - Club Member Lists (issue #60)\n- [NEW] - Alert Table shows rule names\n- [CHANGED] - Alerts, DXC and WSJTX Network Notifications\n- Fixed Antenna Azimuth Negative Value (issue #191)\n- Fixed CTY file is not loaded when duplicate record (issue #193)\n\n2023/03/14 - 0.20.0\n- [NEW] - Added MUF Layer to online map\n- [NEW] - Added International Beacon Project (IBP) Beacons to online map\n- [NEW] - Centering the map on the current profile at start (issue #185)\n- Fixed incorrect ADIF interpretation of _SENT fields (issue #176)\n- Fixed Awards Dialog, Table double click for ITU/CQZ/WAZ/IOTA shows incorrect QSOs (issue #177)\n- Fixed ADIF double-type fields when 0.0 is currently mapped to NULL (issue #178)\n- Fixed QSO Detail to save NULL instead of empty string (issue #179)\n- Fixed ADIF Import default _INTL values are now stored correctly (issue #183)\n- Fixed Maps show an incorrect path if from/to grids are the same (issue #186)\n- Fixed Online Maps incorrect Bounds if Bandmap callsign double-click (issue #188)\n- Updated German translation (thx DL2KI)\n\n2023/02/17 - 0.19.0\n- [NEW] - Added Aurora Layer to online map\n- [NEW] - Logbook - filter options are saved and restored\n- [NEW] - Map Setting is saved and restored (issue #140)\n- [NEW] - QSO Duration (issue #158)\n- [NEW] - DX Cluster uses monospace font (issue #164)\n- [NEW] - Awards - if click on the Entity/band the logbook filter is set (issue #168)\n- [NEW] - WSJTX - Added Multicast support (issue #172)\n- Fixed WWFF LOV Download (issue #169)\n\n2023/01/15 - 0.18.0\n- [NEW] - ADIF 3.1.4 updates\n        - Added new modes FREEDV and M17\n        - Added new band (submm)\n        - Adopted Altitude (for SOTA only)\n        - Adopted POTA (includes POTA List)\n        - Adopted Gridsquare_ext (only import/export)\n        - Adopted Hamlogeu_* (only import/export)\n        - Adopted HamQTH_* (only import/export)\n- [NEW] - Added new DXCC Status and color for it - Confirmed\n- [NEW] - New Contact - Tab selection is saved\n- [NEW] - Grid can contain 8-characters\n- [NEW] - User filter can contain NULL value\n- [NEW] - Compilation - added variables for external sources\n- [NEW] - My DXCC/CQZ/ITUZ/Country is filled\n- [NEW] - Alerts - Added Aging (issue #153)\n- [NEW] - Alerts - Added DXCC Status Color (issue #153)\n- [NEW] - DXC - Added Log Status to filter (issue #154)\n- [NEW] - DXC - Added Spot deduplication to filter (issue #154)\n- [NEW] - WSJTX - Added CQ-Spot Filter (issue #155)\n- [NEW] - QSO Detail contains DXCC Tab (issue #156)\n- [CHANGED] - New QSO DXCC Tab reworked (issue #144)\n- [CHANGED] - All DXCC Stats are computed based on My DXCC instead of My Callsign\n- [CHANGED] - Station Profile Setting layout\n\n2022/12/18 - 0.17.0\n- [NEW] - NetPort and Polling interval can be defined for NET Rigs\n- [NEW] - NetPort can be defined for NET Rots\n- [NEW] - Added Saving Bandmap Zoom per band (issue #137)\n- [NEW] - CW speed synchronisation (issue #139)\n- Fixed Missing callbook data when callsign has prefix (issue #133)\n- Fixed Winkey2 echo chars are incorrectly displayed in CW Console (issue #141)\n- [CHANGED] - Online Map - Gray-Line is enabled by default\n- Update Timezone database\n\n2022/11/20 - 0.16.0\n- [NEW] - SOTA/IOTA lists updated regularly\n- [NEW] - Added WWFF list, updated regularly\n- [NEW] - QTH/Grid are filled based on SOTA/WWFF\n- [NEW] - DXC/WSJTX columns are movable, added column visibility setting\n- [NEW] - DXC/WSJTX columns layout is saved\n- [NEW] - Added Wiki&Report Issue links to Help section\n- [NEW] - About dialog contains run-time information\n- [NEW] - Solar Info as a ToolTip\n- [NEW] - QSO Manual Entry Mode\n- Fixed Bandmap unlogical animation when band is changed (issue #128)\n- Fixed Bandmap marks are not displayed correctly when RIT/XI (issue #131)\n- Fixed Setting Dialog size\n- Update Timezone database\n\n2022/10/16 - 0.15.0\n- Fixed Keeping the Bandmap RX mark always visible when centre RX is disabled (issue #115)\n- Fixed Equipment Menu: Swapped Connect Keyer and Rig (issue #122)\n- Fixed Callsign is deleted when clicking bandmap (issue #126)\n- Fixed typo in the Map layer menu (issue #127)\n- Fixed compilation issues & warning under QT6 - preparation for QT6 migration\n\n2022/10/02 - 0.14.1\n- Fixed CW Console - HALT Button is not enabled under Ubuntu flavours (issue #124)\n\n2022/09/29 - 0.14.0\n- [NEW] CW Console (Winkey2, Morse over CAT support)\n- [NEW] DX Cluster pre-defined commands (send last spot, get stats)\n- [NEW] Added DX Cluster Views (Spots, WCY, WWV, ToALL)\n- [NEW] Implemented DX Cluster Reconnection\n- [NEW] Remember last used DX Cluster\n- [CHANGED] - UI unifications - Rot/Rig/DXC\n- Fixed COM port validation for Windows platform\n- Fixed Reconnecting (DXC/Callbook) (issue #110)\n- Fixed DX Cluster crashes when DXC server is not connected and a command is sent (issue #111)\n- Fixed Bandmap callsign selection not fully works (issue #116)\n\n2022/08/06 - 0.13.0\n- [NEW] QSY Contact Wiping (issue #100)\n- [NEW] Timeoff is highlighted when QSO timer is running (issue #100)\n- [NEW] Callsign whisperer\n- [NEW] Bandmap - Spot's color is recalculated when QSO is saved\n- [NEW] BandMap - CTRL + Wheel zooming\n- [NEW] BandMap - Zooming via buttons keeps a focus on centre freq\n- [NEW] BandMap - DX Spot's Comment as a tooltip\n- [CHANGED] BandMap - UI Layout\n- Fixed MacOS builds (PR #102) (thx gerbert)\n- Fixed templates under MacOS (PR #101) (thx gerbert)\n- Fixed WindowsOS Installer - Unable to upgrade version\n\n2022/07/15 - 0.12.0\n- [NEW] Statistics - Show ODX on the map\n- [EXPERIMENTAL] Support for QT Styles (issue #88)\n- [CHANGED] - Removed F2 as a shortcut for QSO field editing\n- Next fixing of a high CPU load when DXC is processed (issue #52)\n- Fixed QSO fields from prev QSOs when Prefix - Callsign - Suffix (issue #90)\n- Fixed Chaotic QSO start time (issue #93)\n- Offline maps - Lighter colors, night sky removed, Sun position removed (issue #97)\n- Fixed incorrect A-Index colort (issue #98)\n- Fixed Stats Widget - percents - does not reflect date range (issue #99)\n- Fixed potential LogParam Cache issue\n- Import/Export polishing\n\n2022/06/26 - 0.11.0\n- [NEW] QSO Detail/Edit Dialog\n- [NEW] Added mW power Support\n- [NEW] Implemented ADIF 3.1.3\n- [NEW] Rigwidget saves last used freq for bands\n- Fixed Rig Combo size when Rig Profile name is long (issue #31)\n- Fixed CQZ, ITUZ do not validate whether their entered value is a number (issue #75)\n- Fixed vucc, myvucc must be uppercase - Edit mode (issue #76)\n- Fixed Greyline-Map is very dark (issue #78)\n- Fixed DX Country is not saved properly when name is between S-Z (issue #79)\n- Fixed Bandmap call selection - only left mouse button (issue #82)\n- Fixed My Notes Copy & Paste - Rich Text (issue #83)\n- Fixed Font appearance in the context menu (issue #84)\n\n2022/06/05 - 0.10.0\n- [NEW] Bandmap shows XIT/RIT Freq \n- [NEW] Bandmap RX Mark Center (issue #69)\n- [NEW] Getting PTT State from RIG - only for CAT-controlled rigs\n- [NEW] PTT Shortchut - only for CAT-controlled rigs\n- Fixed Lost internet conneciton is not detected properly (issue #56)\n- Fixed Cannot manually edit QSO Date&Time (issue #66)\n- Fixed Field contents in capital letters (issue #67)\n- Fixed Band RX is not updated when RX Freq is edited (issue #72)\n- Fixed Stat Windget does not handle a date range correctly (issue #73)\n- Fixed eQSL card is incorreclty handled when a callsign contains special characters (issue #74)\n\n2022/05/20 - 0.9.0\n- [NEW] User-defined Spot Alerts\n- [NEW] User filter contains a new operator \"Starts with\"\n- [NEW] a real local time is shown for the DX callsign (issue #45)\n- [NEW] Lotw/eQSL registration info is showed from callbooks\n- [NEW] Added shortcuts for menu and tabs\n- [NEW] Bandmap - Switching a band view via Bandmap context menu (issue #57)\n- [CHANGED] - Network Notification format\n   - logid field is included in all messages\n- Fixed issue with My Notes multiple lines edit/show mode (issue 39)\n- Fixed issue when GUI froze when Rig disconnect was called (issue #50)\n- Partially fixed a high CPU load when DXC is processed (issue #52)\n- Fixed crashes under Debian \"bullseye\" - 32bit (issue #55)\n- Fixed Bandmap Callsign selection margin (issue #61)\n- Fixed issue when it was not possible to enter RX/TX freq manually\n\n2022/04/22 - 0.8.0\n- RIT/XIT offset enable/disable detection (issue #26)\n- Fixed Rig Setting, Data Bits (issue #28)\n- Added default PWR for Rig profile (issue #30)\n- Fixed issue when GUI freezes during Rig connection (issue #32 & #33)\n- Fixed issue with an incorrect value of A-Index (issue #34)\n- Fixed ADI Import - incorrect _INTL fields import (issue #35)\n- Fixed isuue with an editing of bands in Setting dialog (issue #36)\n- Fixed issue with hamlib when get_pwr crashes for a network rig (issue #37)\n- Improved new QSO fields are filled from prev QSO (issue #40)\n- Added mode for a network Rig (issue #41)\n- Fixed warning - processing a new request but the previous one hasn't been completed (issue #42)\n- Fixed Info widget when Country name is long (issue #43)\n- Reordered column visibility Tabs (issue #46)\n- Improved Rig tunning when XIT/RIT is enabled (issue #47)\n\n2022/04/08 - 0.7.0\n- Settings - Ant/Rig/Rot are profiles\n   - Reworked Ant/Rig/Rot Pages\n   - Added RIG Properties (issue #18)\n- Rig Widget - added Band/Rig/Mode selection (issue #5)\n   - added VFO/XIT/RIT/PWR Indicators (issue #20 and issue #23)\n- Rot Widget - works again\n   - AZ/EL are stored to database if rot is connected (issue #22)\n- Fixed issues with the Statistic Widget Combos (issue 25)\n\n2022/03/10 - 0.6.5\n- Fixed missing modes in Setting Dialog (issue #11)\n- Fixed Station Profile text color in dark mode (issue #10)\n- Fixed DXCluster Server Combo (issue #12)\n- Fixed TAB focus on QSO Fields (issue #14)\n\n2022/03/06 - 0.6.0\n- [NEW] QSL - added import a file with QSL - with QSLr column\n- Fixed QLog start when Band is 3cm (too long start time due to the Bandmap drawing) (issue #6)\n- Fixed Rotator Widget Warning - map transformation issue (issue #8)\n- Changed Bandmap window narrow size (issue #3)\n- Changed User Filter Widget size\n- Removed Units from Logbook widget\n- Removed UTC string\n- Renamed RSTs, RSTr etc. (issue #4)\n- Renamed Main Menu Services->Service and Station->Equipment\n- Internal - reworked Service networking signal handling\n\n2022/02/19 - 0.5.0\n- DB: Added submodes used by FLDigi and added their mapping to LoTW, Clublog etc.\n- DB: Added all ADIF-defined modes/submodes\n- DB: Remapped QSO fields to International field - NAME_INTL etc.\n      - DB is converted to a new schema to use *_INTL columns\n      - non-INTL columns are recalculated from _INTL columns - accents removal function\n- GUI: Added Dark mode\n- GUI: Time/date format is controlled by Locale (except WSJTX, FLDigi inputs)\n- Import/Export: ADI do not export UTF-8 characters and *_INTL fields\n- Import/Export: ADX exports UTF-8 characters and *_INTL fields\n- Import/Export: Added Import of ADX file format\n- Logbook: Shows QSO summary as a Callsign's tooltip\n- Logbook: QSO time is shown with seconds; added timezone\n- New QSO: Added My notes - free text for your personal notes\n- Backup: Change backup format form ADI to ADX (ADX supports UTF-8)\n- Settings: WSJTX Port is changable\n\n2022/01/09 - 0.4.0\n- Stats: Added Show on Map - QSOs and Worked&Confirmed Grids\n- Stats: Stats are refreshed after every QSO\n- WSJTX: Remove TRX/Monitoring Status\n- Added Split mode - RX/TX RIG Offset\n- Added export of selected QSOs\n- Fixed FLdigi interface\n- CPPChecks & Clazy cleanup\n\n2021/12/19 - 0.3.0\n- Added new fields to Station Profile\n- Station Profile is stored in DB (not in QSetting)\n- Added VUCC field for QSO\n- Added BandMap marks (CTRL+M)\n- Clublog is uploaded the same way as EQSL and LOTW (modifications are resent too)\n- Clublog real-time upload was removed (temporary)\n- QRZ.com - Added callsign query and upload QSO support\n- Callbook cooperation - Primary&Secondary - Secondary used when Primary did not find\n\n2021/11/28 - 0.2.0\n- Initial fork changes\n- Changed Logging format (Time + severity + context)\n- Added Application singleton\n- GUI Tweaking\n   - Changed Tab-key behaviour\n   - DXC Widget\n   - manu others\n- DXCCInfo is clean correctly when callsign is reset\n- Password are stored in a Secure Storage\n- Changed sorting criteria for BandFilter Combobox [Logbook View]\n- Added DXCluster Filters - Context Menu of the DXC\n- DXCluster spot time in UTC\n- Changed Style for Enable/Disable column in QTableView (Checkbox)\n- Fixed issue when mode combo is not refreshed after editing modes\n  in Setting Dialog\n- Database export to ADIF before starting\n- Added Splashscreen\n- Hamlib rework\n   - Reworked Hamlib Setting Dialog\n   - Detailed Setting for Serial Port\n   - Added Network Radio/Rot Support\n   - Connect/Disconnect Rig and Rot\n   - Improved Error Handling from Rig/Rot\n   - Fixed Setting freq/mode/submode from/to GUI\n- Debug mode is more verbose and controled by QT_LOGGING_RULES variable\n- BandMap automatically clear spots when Aging Time is enabled\n- BandMap band is set based on NewContact Widget frequency\n- Many changes and improvements in LogWindow\n   - Minor changes in the input QSO forms\n   - Changed Editing QSO flow\n   - Full ADIF parsing and storing\n   - Added Column Visibility Setting\n- Added DEB control files\n- CTY is updated regularly\n- Main&NewContact Window reworking\n   - Removed Contest Tab\n   - Saving correct values for PROPMODE, QSL Sent/RCVD, SATs, IOTA, SOTA\n     SIG, SIG_INFO, DOK\n   - Added k-index, SFI saving\n   - Added my Ant parameter\n- LoTW Import/Export is verified and improved\n- Added Rig offset support (support for Transverters)\n- Added Station Location Profiles\n- Added User-defined filters\n- Added eQSL upload/download ADIF, download QSL Image\n- Added Online Map Widget\n- Reworked WSJTX Widget\n   - Added Spot Aging\n   - Sorted based on Last Activity Time\n- Reworked Stats\n- Added Awards\n- Added Czech Translation\n"
  },
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<http://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<http://www.gnu.org/philosophy/why-not-lgpl.html>.\n\n\nZoneDetect\n==========\n(https://github.com/BertoldVdb/ZoneDetect)\n\nCopyright (c) 2018-2019, Bertold Van den Bergh (vandenbergh@bertold.org)\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n    * Redistributions in binary form must reproduce the above copyright\n      notice, this list of conditions and the following disclaimer in the\n      documentation and/or other materials provided with the distribution.\n    * Neither the name of the author nor the\n      names of its contributors may be used to endorse or promote products\n      derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTOR BE LIABLE FOR ANY\nDIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\nON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n\nTimeZone Database\n=================\n(https://github.com/evansiroky/timezone-boundary-builder/blob/master/DATA_LICENSE)\n\nOpen Database License (ODbL) v1.0\nDisclaimer\nOpen Data Commons is not a law firm and does not provide legal services of any kind.\n\nOpen Data Commons has no formal relationship with you. Your receipt of this document\ndoes not create any kind of agent-client relationship. Please seek the advice of \na suitably qualified legal professional licensed to practice in your jurisdiction\nbefore using this document.\n\nNo warranties and disclaimer of any damages. This information is provided ‘as is‘, and\nthis site makes no warranties on the information provided. Any damages resulting from\nits use are disclaimed.\n\nPlain language summary\nA plain language summary of the Open Database License is available.\n\nAlternative formats:\nPlain Text\n\nODC Open Database License (ODbL)\nPreamble\nThe Open Database License (ODbL) is a license agreement intended to\nallow users to freely share, modify, and use this Database while\nmaintaining this same freedom for others. Many databases are covered by\ncopyright, and therefore this document licenses these rights. Some\njurisdictions, mainly in the European Union, have specific rights that\ncover databases, and so the ODbL addresses these rights, too. Finally,\nthe ODbL is also an agreement in contract for users of this Database to\nact in certain ways in return for accessing this Database.\n\nDatabases can contain a wide variety of types of content (images,\naudiovisual material, and sounds all in the same database, for example),\nand so the ODbL only governs the rights over the Database, and not the\ncontents of the Database individually. Licensors should use the ODbL\ntogether with another license for the contents, if the contents have a\nsingle set of rights that uniformly covers all of the contents. If the\ncontents have multiple sets of different rights, Licensors should\ndescribe what rights govern what contents together in the individual\nrecord or in some other way that clarifies what rights apply.\n\nSometimes the contents of a database, or the database itself, can be\ncovered by other rights not addressed here (such as private contracts,\ntrade mark over the name, or privacy rights / data protection rights\nover information in the contents), and so you are advised that you may\nhave to consult other documents or clear other rights before doing\nactivities not covered by this License.\n\nThe Licensor (as defined below)\n\nand\n\nYou (as defined below)\n\nagree as follows:\n\n1.0 Definitions of Capitalised Words\n“Collective Database” – Means this Database in unmodified form as part\nof a collection of independent databases in themselves that together are\nassembled into a collective whole. A work that constitutes a Collective\nDatabase will not be considered a Derivative Database.\n\n“Convey” – As a verb, means Using the Database, a Derivative Database,\nor the Database as part of a Collective Database in any way that enables\na Person to make or receive copies of the Database or a Derivative\nDatabase. Conveying does not include interaction with a user through a\ncomputer network, or creating and Using a Produced Work, where no\ntransfer of a copy of the Database or a Derivative Database occurs.\n“Contents” – The contents of this Database, which includes the\ninformation, independent works, or other material collected into the\nDatabase. For example, the contents of the Database could be factual\ndata or works such as images, audiovisual material, text, or sounds.\n\n“Database” – A collection of material (the Contents) arranged in a\nsystematic or methodical way and individually accessible by electronic\nor other means offered under the terms of this License.\n\n“Database Directive” – Means Directive 96/9/EC of the European\nParliament and of the Council of 11 March 1996 on the legal protection\nof databases, as amended or succeeded.\n\n“Database Right” – Means rights resulting from the Chapter III (“sui\ngeneris”) rights in the Database Directive (as amended and as transposed\nby member states), which includes the Extraction and Re-utilisation of\nthe whole or a Substantial part of the Contents, as well as any similar\nrights available in the relevant jurisdiction under Section 10.4.\n\n“Derivative Database” – Means a database based upon the Database, and\nincludes any translation, adaptation, arrangement, modification, or any\nother alteration of the Database or of a Substantial part of the\nContents. This includes, but is not limited to, Extracting or\nRe-utilising the whole or a Substantial part of the Contents in a new\nDatabase.\n\n“Extraction” – Means the permanent or temporary transfer of all or a\nSubstantial part of the Contents to another medium by any means or in\nany form.\n\n“License” – Means this license agreement and is both a license of rights\nsuch as copyright and Database Rights and an agreement in contract.\n\n“Licensor” – Means the Person that offers the Database under the terms\nof this License.\n\n“Person” – Means a natural or legal person or a body of persons\ncorporate or incorporate.\n\n“Produced Work” – a work (such as an image, audiovisual material, text,\nor sounds) resulting from using the whole or a Substantial part of the\nContents (via a search or other query) from this Database, a Derivative\nDatabase, or this Database as part of a Collective Database.\n\n“Publicly” – means to Persons other than You or under Your control by\neither more than 50% ownership or by the power to direct their\nactivities (such as contracting with an independent consultant).\n\n“Re-utilisation” – means any form of making available to the public all\nor a Substantial part of the Contents by the distribution of copies, by\nrenting, by online or other forms of transmission.\n\n“Substantial” – Means substantial in terms of quantity or quality or a\ncombination of both. The repeated and systematic Extraction or\nRe-utilisation of insubstantial parts of the Contents may amount to the\nExtraction or Re-utilisation of a Substantial part of the Contents.\n\n“Use” – As a verb, means doing any act that is restricted by copyright\nor Database Rights whether in the original medium or any other; and\nincludes without limitation distributing, copying, publicly performing,\npublicly displaying, and preparing derivative works of the Database, as\nwell as modifying the Database as may be technically necessary to use it\nin a different mode or format.\n\n“You” – Means a Person exercising rights under this License who has not\npreviously violated the terms of this License with respect to the\nDatabase, or who has received express permission from the Licensor to\nexercise rights under this License despite a previous violation.\n\nWords in the singular include the plural and vice versa.\n\n2.0 What this License covers\n2.1. Legal effect of this document. This License is:\n\n      a. A license of applicable copyright and neighbouring rights;\n\n      b. A license of the Database Right; and\n\n      c. An agreement in contract between You and the Licensor.\n\n2.2 Legal rights covered. This License covers the legal rights in the\nDatabase, including:\n\n      a. Copyright. Any copyright or neighbouring rights in the Database.\nThe copyright licensed includes any individual elements of the\nDatabase, but does not cover the copyright over the Contents\nindependent of this Database. See Section 2.4 for details. Copyright\nlaw varies between jurisdictions, but is likely to cover: the Database\nmodel or schema, which is the structure, arrangement, and organisation\nof the Database, and can also include the Database tables and table\nindexes; the data entry and output sheets; and the Field names of\nContents stored in the Database;\n\n      b. Database Rights. Database Rights only extend to the Extraction and\nRe-utilisation of the whole or a Substantial part of the Contents.\nDatabase Rights can apply even when there is no copyright over the\n      Database. Database Rights can also apply when the Contents are removed\nfrom the Database and are selected and arranged in a way that would\nnot infringe any applicable copyright; and\n\n      c. Contract. This is an agreement between You and the Licensor for\naccess to the Database. In return you agree to certain conditions of\nuse on this access as outlined in this License.\n\n2.3 Rights not covered.\n\n      a. This License does not apply to computer programs used in the making\nor operation of the Database;\n\n      b. This License does not cover any patents over the Contents or the\nDatabase; and\n\n      c. This License does not cover any trademarks associated with the\n      Database.\n\n2.4 Relationship to Contents in the Database. The individual items of\nthe Contents contained in this Database may be covered by other rights,\nincluding copyright, patent, data protection, privacy, or personality\nrights, and this License does not cover any rights (other than Database\nRights or in contract) in individual Contents contained in the Database.\nFor example, if used on a Database of images (the Contents), this\nLicense would not apply to copyright over individual images, which could\nhave their own separate licenses, or one single license covering all of\nthe rights over the images.\n\n3.0 Rights granted\n3.1 Subject to the terms and conditions of this License, the Licensor\ngrants to You a worldwide, royalty-free, non-exclusive, terminable (but\nonly under Section 9) license to Use the Database for the duration of\nany applicable copyright and Database Rights. These rights explicitly\ninclude commercial use, and do not exclude any field of endeavour. To\nthe extent possible in the relevant jurisdiction, these rights may be\nexercised in all media and formats whether now known or created in the\nfuture.\n\nThe rights granted cover, for example:\n\n      a. Extraction and Re-utilisation of the whole or a Substantial part of\nthe Contents;\n\n      b. Creation of Derivative Databases;\n\n      c. Creation of Collective Databases;\n\n      d. Creation of temporary or permanent reproductions by any means and\nin any form, in whole or in part, including of any Derivative\nDatabases or as a part of Collective Databases; and\n\n      e. Distribution, communication, display, lending, making available, or\nperformance to the public by any means and in any form, in whole or in\npart, including of any Derivative Database or as a part of Collective\n      Databases.\n\n3.2 Compulsory license schemes. For the avoidance of doubt:\n\n      a. Non-waivable compulsory license schemes. In those jurisdictions in\nwhich the right to collect royalties through any statutory or\ncompulsory licensing scheme cannot be waived, the Licensor reserves\nthe exclusive right to collect such royalties for any exercise by You\nof the rights granted under this License;\n\n      b. Waivable compulsory license schemes. In those jurisdictions in\nwhich the right to collect royalties through any statutory or\ncompulsory licensing scheme can be waived, the Licensor waives the\nexclusive right to collect such royalties for any exercise by You of\nthe rights granted under this License; and,\n\n      c. Voluntary license schemes. The Licensor waives the right to collect\nroyalties, whether individually or, in the event that the Licensor is\na member of a collecting society that administers voluntary licensing\nschemes, via that society, from any exercise by You of the rights\ngranted under this License.\n\n3.3 The right to release the Database under different terms, or to stop\ndistributing or making available the Database, is reserved. Note that\nthis Database may be multiple-licensed, and so You may have the choice\nof using alternative licenses for this Database. Subject to Section\n10.4, all other rights not expressly granted by Licensor are reserved.\n\n4.0 Conditions of Use\n4.1 The rights granted in Section 3 above are expressly made subject to\nYour complying with the following conditions of use. These are important\nconditions of this License, and if You fail to follow them, You will be\nin material breach of its terms.\n\n4.2 Notices. If You Publicly Convey this Database, any Derivative\nDatabase, or the Database as part of a Collective Database, then You\nmust:\n\n      a. Do so only under the terms of this License or another license\npermitted under Section 4.4;\n\n      b. Include a copy of this License (or, as applicable, a license\npermitted under Section 4.4) or its Uniform Resource Identifier (URI)\nwith the Database or Derivative Database, including both in the\nDatabase or Derivative Database and in any relevant documentation; and\n\n      c. Keep intact any copyright or Database Right notices and notices\nthat refer to this License.\n\n      d. If it is not possible to put the required notices in a particular\nfile due to its structure, then You must include the notices in a\nlocation (such as a relevant directory) where users would be likely to\nlook for it.\n\n4.3 Notice for using output (Contents). Creating and Using a Produced\nWork does not require the notice in Section 4.2. However, if you\nPublicly Use a Produced Work, You must include a notice associated with\nthe Produced Work reasonably calculated to make any Person that uses,\nviews, accesses, interacts with, or is otherwise exposed to the Produced\nWork aware that Content was obtained from the Database, Derivative\nDatabase, or the Database as part of a Collective Database, and that it\nis available under this License.\n\n      a. Example notice. The following text will satisfy notice under\nSection 4.3:\n\n    Contains information from DATABASE NAME, which is made available\n    here under the Open Database License (ODbL).\nDATABASE NAME should be replaced with the name of the Database and a\nhyperlink to the URI of the Database. “Open Database License” should\ncontain a hyperlink to the URI of the text of this License. If\nhyperlinks are not possible, You should include the plain text of the\nrequired URI’s with the above notice.\n\n4.4 Share alike.\n\n      a. Any Derivative Database that You Publicly Use must be only under\nthe terms of:\n\n           i. This License;\n\n           ii. A later version of this License similar in spirit to this\nLicense; or\n\n           iii. A compatible license.\n\nIf You license the Derivative Database under one of the licenses\nmentioned in (iii), You must comply with the terms of that license.\n\n      b. For the avoidance of doubt, Extraction or Re-utilisation of the\nwhole or a Substantial part of the Contents into a new database is a\nDerivative Database and must comply with Section 4.4.\n\n      c. Derivative Databases and Produced Works. A Derivative Database is\nPublicly Used and so must comply with Section 4.4. if a Produced Work\ncreated from the Derivative Database is Publicly Used.\n\n      d. Share Alike and additional Contents. For the avoidance of doubt,\nYou must not add Contents to Derivative Databases under Section 4.4 a\nthat are incompatible with the rights granted under this License.\n\n      e. Compatible licenses. Licensors may authorise a proxy to determine\ncompatible licenses under Section 4.4 a iii. If they do so, the\nauthorised proxy’s public statement of acceptance of a compatible\nlicense grants You permission to use the compatible license.\n\n4.5 Limits of Share Alike. The requirements of Section 4.4 do not apply\nin the following:\n\n      a. For the avoidance of doubt, You are not required to license\nCollective Databases under this License if You incorporate this\nDatabase or a Derivative Database in the collection, but this License\nstill applies to this Database or a Derivative Database as a part of\nthe Collective Database;\n\n      b. Using this Database, a Derivative Database, or this Database as\npart of a Collective Database to create a Produced Work does not\ncreate a Derivative Database for purposes of Section 4.4; and\n\n      c. Use of a Derivative Database internally within an organisation is\nnot to the public and therefore does not fall under the requirements\nof Section 4.4.\n\n4.6 Access to Derivative Databases. If You Publicly Use a Derivative\nDatabase or a Produced Work from a Derivative Database, You must also\noffer to recipients of the Derivative Database or Produced Work a copy\nin a machine readable form of:\n\n      a. The entire Derivative Database; or\n\n      b. A file containing all of the alterations made to the Database or\nthe method of making the alterations to the Database (such as an\nalgorithm), including any additional Contents, that make up all the\ndifferences between the Database and the Derivative Database.\n\nThe Derivative Database (under a.) or alteration file (under b.) must be\navailable at no more than a reasonable production cost for physical\ndistributions and free of charge if distributed over the internet.\n\n4.7 Technological measures and additional terms\n\n      a. This License does not allow You to impose (except subject to\nSection 4.7 b.) any terms or any technological measures on the\nDatabase, a Derivative Database, or the whole or a Substantial part of\nthe Contents that alter or restrict the terms of this License, or any\nrights granted under it, or have the effect or intent of restricting\nthe ability of any person to exercise those rights.\n\n      b. Parallel distribution. You may impose terms or technological\nmeasures on the Database, a Derivative Database, or the whole or a\nSubstantial part of the Contents (a “Restricted Database”) in\ncontravention of Section 4.74 a. only if You also make a copy of the\nDatabase or a Derivative Database available to the recipient of the\nRestricted Database:\n\n           i. That is available without additional fee;\n\n           ii. That is available in a medium that does not alter or restrict\nthe terms of this License, or any rights granted under it, or have\nthe effect or intent of restricting the ability of any person to\nexercise those rights (an “Unrestricted Database”); and\n\n           iii. The Unrestricted Database is at least as accessible to the\nrecipient as a practical matter as the Restricted Database.\n\n      c. For the avoidance of doubt, You may place this Database or a\nDerivative Database in an authenticated environment, behind a\npassword, or within a similar access control scheme provided that You\ndo not alter or restrict the terms of this License or any rights\ngranted under it or have the effect or intent of restricting the\nability of any person to exercise those rights.\n\n4.8 Licensing of others. You may not sublicense the Database. Each time\nYou communicate the Database, the whole or Substantial part of the\nContents, or any Derivative Database to anyone else in any way, the\nLicensor offers to the recipient a license to the Database on the same\nterms and conditions as this License. You are not responsible for\nenforcing compliance by third parties with this License, but You may\nenforce any rights that You have over a Derivative Database. You are\nsolely responsible for any modifications of a Derivative Database made\nby You or another Person at Your direction. You may not impose any\nfurther restrictions on the exercise of the rights granted or affirmed\nunder this License.\n\n5.0 Moral rights\n5.1 Moral rights. This section covers moral rights, including any rights\nto be identified as the author of the Database or to object to treatment\nthat would otherwise prejudice the author’s honour and reputation, or\nany other derogatory treatment:\n\n      a. For jurisdictions allowing waiver of moral rights, Licensor waives\nall moral rights that Licensor may have in the Database to the fullest\nextent possible by the law of the relevant jurisdiction under Section\n      10.4;\n\n      b. If waiver of moral rights under Section 5.1 a in the relevant\njurisdiction is not possible, Licensor agrees not to assert any moral\nrights over the Database and waives all claims in moral rights to the\nfullest extent possible by the law of the relevant jurisdiction under\nSection 10.4; and\n\n      c. For jurisdictions not allowing waiver or an agreement not to assert\nmoral rights under Section 5.1 a and b, the author may retain their\nmoral rights over certain aspects of the Database.\n\nPlease note that some jurisdictions do not allow for the waiver of moral\nrights, and so moral rights may still subsist over the Database in some\njurisdictions.\n\n6.0 Fair dealing, Database exceptions, and other rights not affected\n6.1 This License does not affect any rights that You or anyone else may\nindependently have under any applicable law to make any use of this\nDatabase, including without limitation:\n\n      a. Exceptions to the Database Right including: Extraction of Contents\nfrom non-electronic Databases for private purposes, Extraction for\npurposes of illustration for teaching or scientific research, and\nExtraction or Re-utilisation for public security or an administrative\nor judicial procedure.\n\n      b. Fair dealing, fair use, or any other legally recognised limitation\nor exception to infringement of copyright or other applicable laws.\n\n6.2 This License does not affect any rights of lawful users to Extract\nand Re-utilise insubstantial parts of the Contents, evaluated\nquantitatively or qualitatively, for any purposes whatsoever, including\ncreating a Derivative Database (subject to other rights over the\nContents, see Section 2.4). The repeated and systematic Extraction or\nRe-utilisation of insubstantial parts of the Contents may however amount\nto the Extraction or Re-utilisation of a Substantial part of the\nContents.\n\n7.0 Warranties and Disclaimer\n7.1 The Database is licensed by the Licensor “as is” and without any\nwarranty of any kind, either express, implied, or arising by statute,\ncustom, course of dealing, or trade usage. Licensor specifically\ndisclaims any and all implied warranties or conditions of title,\nnon-infringement, accuracy or completeness, the presence or absence of\nerrors, fitness for a particular purpose, merchantability, or otherwise.\nSome jurisdictions do not allow the exclusion of implied warranties, so\nthis exclusion may not apply to You.\n\n8.0 Limitation of liability\n8.1 Subject to any liability that may not be excluded or limited by law,\nthe Licensor is not liable for, and expressly excludes, all liability\nfor loss or damage however and whenever caused to anyone by any use\nunder this License, whether by You or by anyone else, and whether caused\nby any fault on the part of the Licensor or not. This exclusion of\nliability includes, but is not limited to, any special, incidental,\nconsequential, punitive, or exemplary damages such as loss of revenue,\ndata, anticipated profits, and lost business. This exclusion applies\neven if the Licensor has been advised of the possibility of such\ndamages.\n\n8.2 If liability may not be excluded by law, it is limited to actual and\ndirect financial loss to the extent it is caused by proved negligence on\nthe part of the Licensor.\n\n9.0 Termination of Your rights under this License\n9.1 Any breach by You of the terms and conditions of this License\nautomatically terminates this License with immediate effect and without\nnotice to You. For the avoidance of doubt, Persons who have received the\nDatabase, the whole or a Substantial part of the Contents, Derivative\nDatabases, or the Database as part of a Collective Database from You\nunder this License will not have their licenses terminated provided\ntheir use is in full compliance with this License or a license granted\nunder Section 4.8 of this License. Sections 1, 2, 7, 8, 9 and 10 will\nsurvive any termination of this License.\n\n9.2 If You are not in breach of the terms of this License, the Licensor\nwill not terminate Your rights under it.\n\n9.3 Unless terminated under Section 9.1, this License is granted to You\nfor the duration of applicable rights in the Database.\n\n9.4 Reinstatement of rights. If you cease any breach of the terms and\nconditions of this License, then your full rights under this License\nwill be reinstated:\n\n      a. Provisionally and subject to permanent termination until the 60th\nday after cessation of breach;\n\n      b. Permanently on the 60th day after cessation of breach unless\notherwise reasonably notified by the Licensor; or\n\n      c. Permanently if reasonably notified by the Licensor of the\nviolation, this is the first time You have received notice of\nviolation of this License from the Licensor, and You cure the\nviolation prior to 30 days after your receipt of the notice.\n\nPersons subject to permanent termination of rights are not eligible to\nbe a recipient and receive a license under Section 4.8.\n\n9.5 Notwithstanding the above, Licensor reserves the right to release\nthe Database under different license terms or to stop distributing or\nmaking available the Database. Releasing the Database under different\nlicense terms or stopping the distribution of the Database will not\nwithdraw this License (or any other license that has been, or is\nrequired to be, granted under the terms of this License), and this\nLicense will continue in full force and effect unless terminated as\nstated above.\n\n10.0 General\n10.1 If any provision of this License is held to be invalid or\nunenforceable, that must not affect the validity or enforceability of\nthe remainder of the terms and conditions of this License and each\nremaining provision of this License shall be valid and enforced to the\nfullest extent permitted by law.\n\n10.2 This License is the entire agreement between the parties with\nrespect to the rights granted here over the Database. It replaces any\nearlier understandings, agreements or representations with respect to\nthe Database.\n\n10.3 If You are in breach of the terms of this License, You will not be\nentitled to rely on the terms of this License or to complain of any\nbreach by the Licensor.\n\n10.4 Choice of law. This License takes effect in and will be governed by\nthe laws of the relevant jurisdiction in which the License terms are\nsought to be enforced. If the standard suite of rights granted under\napplicable copyright law and Database Rights in the relevant\njurisdiction includes additional rights not granted under this License,\nthese additional rights are granted in this License in order to meet the\nterms of this License.\n\n"
  },
  {
    "path": "QLog.pro",
    "content": "#-------------------------------------------------\n#\n# Project created by QtCreator 2019-06-10T09:13:09\n#\n#-------------------------------------------------\n\nQT       += core gui sql network xml charts webenginewidgets serialport dbus quickwidgets webchannel websockets printsupport\n\ngreaterThan(QT_MAJOR_VERSION, 5): QT += widgets\n\nTARGET = qlog\nTEMPLATE = app\nVERSION = 0.50.0\n\nDEFINES += VERSION=\\\\\\\"$$VERSION\\\\\\\"\n\n# Define paths to HAMLIB. Leave empty if system libraries should be used\n#HAMLIBINCLUDEPATH =\n#HAMLIBLIBPATH =\n# Define Hamlib version. Leave empty if pkg-config should detect the version (lib must be installed and registered)\n#HAMLIBVERSION_MAJOR =\n#HAMLIBVERSION_MINOR =\n#HAMLIBVERSION_PATCH =\n\n# Define paths to pthread - needed for Hamlib4.5 and later. Leave empty if system libraries should be used\n#PTHREADINCLUDEPATH =\n#PTHREADLIBPATH =\n\n# Define paths to QTKeyChain. Leave empty if system libraries should be used\n#QTKEYCHAININCLUDEPATH =\n#QTKEYCHAINLIBPATH =\n\n# Define paths to zlib - Leave empty if system libraries should be used\n#ZLIBINCLUDEPATH =\n#ZLIBLIBPATH =\n\n# Define paths to OpenSSL - Leave empty if system libraries should be used\n#OPENSSLINCLUDEPATH =\n#OPENSSLLIBPATH =\n\n# The following define makes your compiler emit warnings if you use\n# any feature of Qt which has been marked as deprecated (the exact warnings\n# depend on your compiler). Please consult the documentation of the\n# deprecated API in order to know how to port your code away from it.\nDEFINES += QT_DEPRECATED_WARNINGS QT_MESSAGELOGCONTEXT\n\n# You can also make your code fail to compile if you use deprecated APIs.\n# In order to do so, uncomment the following line.\n# You can also select to disable deprecated APIs only up to a certain version of Qt.\n#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0\nmacx:QT_CONFIG -= no-pkg-config\n\nCONFIG += c++11 force_debug_info\n#CONFIG += sanitizer sanitize_address\nCONFIG *= link_pkgconfig\n\nSOURCES += \\\n        awards/AwardDefinition.cpp \\\n        awards/AwardDXCC.cpp \\\n        awards/AwardGridsquare.cpp \\\n        awards/AwardIOTA.cpp \\\n        awards/AwardITU.cpp \\\n        awards/AwardJapan.cpp \\\n        awards/AwardNZ.cpp \\\n        awards/AwardRDA.cpp \\\n        awards/AwardSpanishDME.cpp \\\n        awards/AwardUKD.cpp \\\n        awards/AwardUSCounty.cpp \\\n        awards/AwardPOTAActivator.cpp \\\n        awards/AwardPOTAHunter.cpp \\\n        awards/AwardSOTA.cpp \\\n        awards/SecondarySubdivisionAward.cpp \\\n        awards/AwardWAC.cpp \\\n        awards/AwardWAS.cpp \\\n        awards/AwardWAZ.cpp \\\n        awards/AwardWPX.cpp \\\n        awards/AwardWWFF.cpp \\\n        awards/BandTableAward.cpp \\\n        core/AlertEvaluator.cpp \\\n        core/AppGuard.cpp \\\n        core/CallbookManager.cpp \\\n        core/CredentialStore.cpp \\\n        core/FileCompressor.cpp \\\n        core/FldigiTCPServer.cpp \\\n        core/LOVDownloader.cpp \\\n        core/LogDatabase.cpp \\\n        core/LogLocale.cpp \\\n        core/LogParam.cpp \\\n        core/MembershipQE.cpp \\\n        core/Migration.cpp \\\n        core/NetworkNotification.cpp \\\n        core/PasswordCipher.cpp \\\n        core/PlatformParameterManager.cpp \\\n        core/PotaQE.cpp \\\n        core/PropConditions.cpp \\\n        core/QSLPrintLabelRenderer.cpp \\\n        core/QSLStorage.cpp \\\n        core/QSOFilterManager.cpp \\\n        core/WsjtxUDPReceiver.cpp \\\n        core/debug.cpp \\\n        core/EmergencyFrequency.cpp \\\n        core/main.cpp \\\n        core/zonedetect.c \\\n        cwkey/CWKeyer.cpp \\\n        cwkey/drivers/CWCatKey.cpp \\\n        cwkey/drivers/CWDaemonKey.cpp \\\n        cwkey/drivers/CWDummyKey.cpp \\\n        cwkey/drivers/CWFldigiKey.cpp \\\n        cwkey/drivers/CWKey.cpp \\\n        cwkey/drivers/CWWinKey.cpp \\\n        data/ActivityProfile.cpp \\\n        data/AntProfile.cpp \\\n        data/BandPlan.cpp \\\n        data/Accents.cpp \\\n        data/CWKeyProfile.cpp \\\n        data/CWShortcutProfile.cpp \\\n        data/Callsign.cpp \\\n        data/Data.cpp \\\n        data/DxServerString.cpp \\\n        data/Gridsquare.cpp \\\n        data/HostsPortString.cpp \\\n        data/MainLayoutProfile.cpp \\\n        data/RigProfile.cpp \\\n        data/RotProfile.cpp \\\n        data/RotUsrButtonsProfile.cpp \\\n        data/SerialPort.cpp \\\n        data/StationProfile.cpp \\\n        data/UpdatableSQLRecord.cpp \\\n        logformat/AdiFormat.cpp \\\n        logformat/AdxFormat.cpp \\\n        logformat/CabrilloFormat.cpp \\\n        logformat/CSVFormat.cpp \\\n        logformat/JsonFormat.cpp \\\n        logformat/LogFormat.cpp \\\n        logformat/PotaAdiFormat.cpp \\\n        models/AlertTableModel.cpp \\\n        models/AwardsTableModel.cpp \\\n        models/DxccTableModel.cpp \\\n        models/LogbookModel.cpp \\\n        models/RigTypeModel.cpp \\\n        models/RotTypeModel.cpp \\\n        models/SearchFilterProxyModel.cpp \\\n        models/ShortcutEditorModel.cpp \\\n        models/SqlListModel.cpp \\\n        models/WsjtxTableModel.cpp \\\n        rig/Rig.cpp \\\n        rig/RigCaps.cpp \\\n        rig/RigctldManager.cpp \\\n        rig/drivers/FlrigRigDrv.cpp \\\n        rig/drivers/GenericRigDrv.cpp \\\n        rig/drivers/HamlibRigDrv.cpp \\\n        rig/drivers/TCIRigDrv.cpp \\\n        rotator/RotCaps.cpp \\\n        rotator/Rotator.cpp \\\n        rotator/drivers/GenericRotDrv.cpp \\\n        rotator/drivers/HamlibRotDrv.cpp \\\n        rotator/drivers/PSTRotDrv.cpp \\\n        service/GenericCallbook.cpp \\\n        service/GenericQSLDownloader.cpp \\\n        service/GenericQSOUploader.cpp \\\n        service/cloudlog/Cloudlog.cpp \\\n        service/clublog/ClubLog.cpp \\\n        service/eqsl/Eqsl.cpp \\\n        service/hamqth/HamQTH.cpp \\\n        service/hrdlog/HRDLog.cpp \\\n        service/kstchat/KSTChat.cpp \\\n        service/lotw/Lotw.cpp \\\n        service/potaapp/PotaApp.cpp \\\n        service/qrzcom/QRZ.cpp \\\n        ui/ActivityEditor.cpp \\\n        ui/AlertRuleDetail.cpp \\\n        ui/AlertSettingDialog.cpp \\\n        ui/AlertWidget.cpp \\\n        ui/AwardsDialog.cpp \\\n        ui/DXCCSubmissionDialog.cpp \\\n        ui/BandmapWidget.cpp \\\n        ui/CWConsoleWidget.cpp \\\n        ui/ChatWidget.cpp \\\n        ui/ClockWidget.cpp \\\n        ui/ColumnSettingDialog.cpp \\\n        ui/DevToolsDialog.cpp \\\n        ui/DownloadQSLDialog.cpp \\\n        ui/DxFilterDialog.cpp \\\n        ui/DxWidget.cpp \\\n        ui/DxccTableWidget.cpp \\\n        ui/EditActivitiesDialog.cpp \\\n        ui/CabrilloExportDialog.cpp \\\n        ui/CabrilloTemplateDialog.cpp \\\n        ui/ExportDialog.cpp \\\n        ui/ExportPasswordDialog.cpp \\\n        ui/LoadDatabaseDialog.cpp \\\n        ui/PlatformSettingsDialog.cpp \\\n        ui/QSLGalleryDialog.cpp \\\n        ui/QSLPrintLabelDialog.cpp \\\n        ui/RigctldAdvancedDialog.cpp \\\n        ui/ImportDialog.cpp \\\n        ui/InputPasswordDialog.cpp \\\n        ui/KSTChatWidget.cpp \\\n        ui/KSTHighlightRuleDetail.cpp \\\n        ui/KSTHighlighterSettingDialog.cpp \\\n        ui/LogbookWidget.cpp \\\n        ui/MainWindow.cpp \\\n        ui/MapWebChannelHandler.cpp \\\n        ui/MapWidget.cpp \\\n        ui/ModeSelectionController.cpp \\\n        ui/NewContactWidget.cpp \\\n        ui/OnlineMapWidget.cpp \\\n        ui/PaperQSLDialog.cpp \\\n        ui/ProfileImageWidget.cpp \\\n        ui/QSLImportStatDialog.cpp \\\n        ui/QSODetailDialog.cpp \\\n        ui/QSOFilterDetail.cpp \\\n        ui/QSOFilterDialog.cpp \\\n        ui/QTableQSOView.cpp \\\n        ui/RigWidget.cpp \\\n        ui/RotatorWidget.cpp \\\n        ui/SettingsDialog.cpp \\\n        ui/ShowUploadDialog.cpp \\\n        ui/StatisticsWidget.cpp \\\n        ui/UploadQSODialog.cpp \\\n        ui/WebEnginePage.cpp \\\n        ui/WsjtxFilterDialog.cpp \\\n        ui/WsjtxWidget.cpp \\\n        ui/component/BaseDoubleSpinBox.cpp \\\n        ui/component/EditLine.cpp \\\n        ui/component/FreqQSpinBox.cpp \\\n        ui/component/MultiselectCompleter.cpp \\\n        ui/component/RepeatButton.cpp \\\n        ui/component/SmartSearchBox.cpp \\\n        ui/component/SqlHighlighter.cpp \\\n        ui/component/SwitchButton.cpp\n\nHEADERS += \\\n        awards/AwardDefinition.h \\\n        awards/AwardDXCC.h \\\n        awards/AwardGridsquare.h \\\n        awards/AwardIOTA.h \\\n        awards/AwardITU.h \\\n        awards/AwardJapan.h \\\n        awards/AwardNZ.h \\\n        awards/AwardRDA.h \\\n        awards/AwardSpanishDME.h \\\n        awards/AwardUKD.h \\\n        awards/AwardUSCounty.h \\\n        awards/AwardPOTAActivator.h \\\n        awards/AwardPOTAHunter.h \\\n        awards/AwardSOTA.h \\\n        awards/SecondarySubdivisionAward.h \\\n        awards/AwardWAC.h \\\n        awards/AwardWAS.h \\\n        awards/AwardWAZ.h \\\n        awards/AwardWPX.h \\\n        awards/AwardWWFF.h \\\n        awards/BandTableAward.h \\\n        core/AlertEvaluator.h \\\n        core/AppGuard.h \\\n        core/CallbookManager.h \\\n        core/CredentialStore.h \\\n        core/FileCompressor.h \\\n        core/FldigiTCPServer.h \\\n        core/LOVDownloader.h \\\n        core/LogDatabase.h \\\n        core/LogLocale.h \\\n        core/LogParam.h \\\n        core/MembershipQE.h \\\n        core/Migration.h \\\n        core/NetworkNotification.h \\\n        core/PasswordCipher.h \\\n        core/PlatformParameterManager.h \\\n        core/PotaQE.h \\\n        core/PropConditions.h \\\n        core/QSLPrintLabelRenderer.h \\\n        core/QSLStorage.h \\\n        core/QSOFilterManager.h \\\n        core/QuadKeyCache.h \\\n        core/WsjtxUDPReceiver.h \\\n        core/csv.hpp \\\n        core/debug.h \\\n        core/EmergencyFrequency.h \\\n        core/zonedetect.h \\\n        cwkey/CWKeyer.h \\\n        cwkey/drivers/CWCatKey.h \\\n        cwkey/drivers/CWDaemonKey.h \\\n        cwkey/drivers/CWDummyKey.h \\\n        cwkey/drivers/CWFldigiKey.h \\\n        cwkey/drivers/CWKey.h \\\n        cwkey/drivers/CWWinKey.h \\\n        data/ActivityProfile.h \\\n        data/AntProfile.h \\\n        data/Band.h \\\n        data/BandPlan.h \\\n        data/CWKeyProfile.h \\\n        data/CWShortcutProfile.h \\\n        data/Callsign.h \\\n        data/Data.h \\\n        data/DxServerString.h \\\n        data/DxSpot.h \\\n        data/Dxcc.h \\\n        data/Gridsquare.h \\\n        data/HostsPortString.h \\\n        data/MainLayoutProfile.h \\\n        data/POTAEntity.h \\\n        data/POTASpot.h \\\n        data/ProfileManager.h \\\n        data/RigProfile.h \\\n        data/RotProfile.h \\\n        data/RotUsrButtonsProfile.h \\\n        data/SOTAEntity.h \\\n        data/SerialPort.h \\\n        data/SpotAlert.h \\\n        data/StationProfile.h \\\n        data/ToAllSpot.h \\\n        data/UpdatableSQLRecord.h \\\n        data/WCYSpot.h \\\n        data/WWFFEntity.h \\\n        data/WWVSpot.h \\\n        data/WsjtxDecode.h \\\n        data/WsjtxEntry.h \\\n        data/WsjtxLog.h \\\n        data/WsjtxLogADIF.h \\\n        data/WsjtxStatus.h \\\n        logformat/AdiFormat.h \\\n        logformat/AdxFormat.h \\\n        logformat/CabrilloFormat.h \\\n        logformat/CSVFormat.h \\\n        logformat/JsonFormat.h \\\n        logformat/LogFormat.h \\\n        logformat/PotaAdiFormat.h \\\n        models/AlertTableModel.h \\\n        models/AwardsTableModel.h \\\n        models/DxccTableModel.h \\\n        models/LogbookModel.h \\\n        models/RigTypeModel.h \\\n        models/RotTypeModel.h \\\n        models/SearchFilterProxyModel.h \\\n        models/ShortcutEditorModel.h \\\n        models/SqlListModel.h \\\n        models/WsjtxTableModel.h \\\n        rig/Rig.h \\\n        rig/RigCaps.h \\\n        rig/RigctldManager.h \\\n        rig/drivers/FlrigRigDrv.h \\\n        rig/drivers/GenericRigDrv.h \\\n        rig/drivers/HamlibRigDrv.h \\\n        rig/drivers/TCIRigDrv.h \\\n        rig/macros.h \\\n        rotator/RotCaps.h \\\n        rotator/Rotator.h \\\n        rotator/drivers/GenericRotDrv.h \\\n        rotator/drivers/HamlibRotDrv.h \\\n        rotator/drivers/PSTRotDrv.h \\\n        service/GenericCallbook.h \\\n        service/GenericQSLDownloader.h \\\n        service/GenericQSOUploader.h \\\n        service/cloudlog/Cloudlog.h \\\n        service/clublog/ClubLog.h \\\n        service/eqsl/Eqsl.h \\\n        service/hamqth/HamQTH.h \\\n        service/hrdlog/HRDLog.h \\\n        service/kstchat/KSTChat.h \\\n        service/lotw/Lotw.h \\\n        service/potaapp/PotaApp.h \\\n        service/qrzcom/QRZ.h \\\n        ui/ActivityEditor.h \\\n        ui/AlertRuleDetail.h \\\n        ui/AlertSettingDialog.h \\\n        ui/AlertWidget.h \\\n        ui/AwardsDialog.h \\\n        ui/DXCCSubmissionDialog.h \\\n        ui/BandmapWidget.h \\\n        ui/CWConsoleWidget.h \\\n        ui/ChatWidget.h \\\n        ui/ClockWidget.h \\\n        ui/ColumnSettingDialog.h \\\n        ui/DevToolsDialog.h \\\n        ui/DownloadQSLDialog.h \\\n        ui/DxFilterDialog.h \\\n        ui/DxWidget.h \\\n        ui/DxccTableWidget.h \\\n        ui/EditActivitiesDialog.h \\\n        ui/CabrilloExportDialog.h \\\n        ui/CabrilloTemplateDialog.h \\\n        ui/ExportDialog.h \\\n        ui/ExportPasswordDialog.h \\\n        ui/LoadDatabaseDialog.h \\\n        ui/PlatformSettingsDialog.h \\\n        ui/QSLGalleryDialog.h \\\n        ui/QSLPrintLabelDialog.h \\\n        ui/RigctldAdvancedDialog.h \\\n        ui/ImportDialog.h \\\n        ui/InputPasswordDialog.h \\\n        ui/KSTChatWidget.h \\\n        ui/KSTHighlightRuleDetail.h \\\n        ui/KSTHighlighterSettingDialog.h \\\n        ui/LogbookWidget.h \\\n        ui/MainWindow.h \\\n        ui/MapWebChannelHandler.h \\\n        ui/MapWidget.h \\\n        ui/ModeSelectionController.h \\\n        ui/NewContactWidget.h \\\n        ui/OnlineMapWidget.h \\\n        ui/PaperQSLDialog.h \\\n        ui/ProfileImageWidget.h \\\n        ui/QSLImportStatDialog.h \\\n        ui/QSODetailDialog.h \\\n        ui/QSOFilterDetail.h \\\n        ui/QSOFilterDialog.h \\\n        ui/QTableQSOView.h \\\n        ui/ShowUploadDialog.h \\\n        ui/SplashScreen.h \\\n        ui/RigWidget.h \\\n        ui/RotatorWidget.h \\\n        ui/SettingsDialog.h \\\n        ui/StatisticsWidget.h \\\n        ui/UploadQSODialog.h \\\n        ui/WebEnginePage.h \\\n        ui/WsjtxFilterDialog.h \\\n        ui/WsjtxWidget.h \\\n        i18n/dbstrings.tri \\\n        i18n/datastrings.tri \\\n        ui/component/BaseDoubleSpinBox.h \\\n        ui/component/ButtonStyle.h \\\n        ui/component/EditLine.h \\\n        ui/component/FreqQSpinBox.h \\\n        ui/component/MultiselectCompleter.h \\\n        ui/component/RepeatButton.h \\\n        ui/component/ShutdownAwareWidget.h \\\n        ui/component/SmartSearchBox.h \\\n        ui/component/SqlHighlighter.h \\\n        ui/component/StyleItemDelegate.h \\\n        ui/component/SwitchButton.h\n\nFORMS += \\\n        ui/ActivityEditor.ui \\\n        ui/AlertRuleDetail.ui \\\n        ui/AlertSettingDialog.ui \\\n        ui/AlertWidget.ui \\\n        ui/AwardsDialog.ui \\\n        ui/DXCCSubmissionDialog.ui \\\n        ui/BandmapWidget.ui \\\n        ui/CWConsoleWidget.ui \\\n        ui/ChatWidget.ui \\\n        ui/ClockWidget.ui \\\n        ui/ColumnSettingDialog.ui \\\n        ui/ColumnSettingSimpleDialog.ui \\\n        ui/DevToolsDialog.ui \\\n        ui/DownloadQSLDialog.ui \\\n        ui/DxFilterDialog.ui \\\n        ui/DxWidget.ui \\\n        ui/EditActivitiesDialog.ui \\\n        ui/CabrilloExportDialog.ui \\\n        ui/CabrilloTemplateDialog.ui \\\n        ui/ExportDialog.ui \\\n        ui/ExportPasswordDialog.ui \\\n        ui/LoadDatabaseDialog.ui \\\n        ui/PlatformSettingsDialog.ui \\\n        ui/QSLGalleryDialog.ui \\\n        ui/QSLPrintLabelDialog.ui \\\n        ui/RigctldAdvancedDialog.ui \\\n        ui/ImportDialog.ui \\\n        ui/InputPasswordDialog.ui \\\n        ui/KSTChatWidget.ui \\\n        ui/KSTHighlightRuleDetail.ui \\\n        ui/KSTHighlighterSettingDialog.ui \\\n        ui/LogbookWidget.ui \\\n        ui/MainWindow.ui \\\n        ui/NewContactWidget.ui \\\n        ui/PaperQSLDialog.ui \\\n        ui/ProfileImageWidget.ui \\\n        ui/QSLImportStatDialog.ui \\\n        ui/QSODetailDialog.ui \\\n        ui/QSOFilterDetail.ui \\\n        ui/QSOFilterDialog.ui \\\n        ui/RigWidget.ui \\\n        ui/RotatorWidget.ui \\\n        ui/SettingsDialog.ui \\\n        ui/ShowUploadDialog.ui \\\n        ui/StatisticsWidget.ui \\\n        ui/UploadQSODialog.ui \\\n        ui/WsjtxFilterDialog.ui \\\n        ui/WsjtxWidget.ui\n\nRESOURCES += \\\n    i18n/i18n.qrc \\\n    res/flags/flags.qrc \\\n    res/icons/icons.qrc \\\n    res/res.qrc\n\nOTHER_FILES += \\\n    res/stylesheet.css \\\n    res/qlog.rc \\\n    res/qlog.desktop \\\n    res/qlog.1 \\\n    res/io.github.foldynl.QLog.metainfo.xml\n\nTRANSLATIONS = i18n/qlog_cs.ts \\\n               i18n/qlog_de.ts \\\n               i18n/qlog_es.ts \\\n               i18n/qlog_fr.ts \\\n               i18n/qlog_it.ts \\\n               i18n/qlog_zh_CN.ts\n\nRC_ICONS = res/qlog.ico\nICON = res/qlog.icns\n\n# https://stackoverflow.com/questions/56734224/qmake-and-pkg-config?rq=1\ndefineReplace(findPackage) {\n    pkg = $${1}Version\n    !defined($$pkg, var) {\n        $$pkg = $$system($$pkgConfigExecutable() --modversion $$1)\n        isEmpty($$pkg): $$pkg = 0\n        cache($$pkg, stash)\n    }\n    return($$eval($$pkg))\n}\n\ndefineReplace(removeNonDigi) {\n    output = $$1\n    output = $$replace(output, [^0-9], \" \")\n    output = $$split(output, \" \")\n    return($$member(output, 0))\n}\n\nisEmpty(HAMLIBVERSION_MAJOR) {\n   HAMLIBVERSIONSTRING =  $$findPackage(hamlib)\n   HAMLIBVERSIONS = $$split(HAMLIBVERSIONSTRING, \".\")\n   HAMLIBVERSION_MAJOR = $$member(HAMLIBVERSIONS, 0)\n   HAMLIBVERSION_MINOR = $$member(HAMLIBVERSIONS, 1)\n   HAMLIBVERSION_PATCH = $$member(HAMLIBVERSIONS, 2)\n}\n\nHAMLIBVERSION_MINOR = $$removeNonDigi($$HAMLIBVERSION_MINOR)\n\nisEmpty(HAMLIBVERSION_MINOR){\n   HAMLIBVERSION_MINOR=0\n}\n\nHAMLIBVERSION_PATCH = $$removeNonDigi($$HAMLIBVERSION_PATCH)\n\nisEmpty(HAMLIBVERSION_PATCH){\n  HAMLIBVERSION_PATCH=0\n}\n\n!isEmpty(HAMLIBINCLUDEPATH) {\n   INCLUDEPATH += $$HAMLIBINCLUDEPATH\n}\n\n!isEmpty(QTKEYCHAININCLUDEPATH) {\n   INCLUDEPATH += $$QTKEYCHAININCLUDEPATH\n}\n\n!isEmpty(PTHREADINCLUDEPATH) {\n   INCLUDEPATH += $$PTHREADINCLUDEPATH\n}\n\n!isEmpty(ZLIBINCLUDEPATH) {\n   INCLUDEPATH += $$ZLIBINCLUDEPATH\n}\n\n!isEmpty(OPENSSLINCLUDEPATH) {\n   INCLUDEPATH += $$OPENSSLINCLUDEPATH\n}\n\n!isEmpty(HAMLIBLIBPATH) {\n   LIBS += -L$$HAMLIBLIBPATH\n}\n\n!isEmpty(QTKEYCHAINLIBPATH) {\n   LIBS += -L$$QTKEYCHAINLIBPATH\n}\n\n!isEmpty(PTHREADINCLUDEPATH) {\n   LIBS += -L$$PTHREADINCLUDEPATH\n}\n\n!isEmpty(ZLIBLIBPATH) {\n   LIBS += -L$$ZLIBLIBPATH\n}\n\n!isEmpty(OPENSSLLIBPATH) {\n   LIBS += -L$$OPENSSLLIBPATH\n}\n\nunix:!macx {\n   isEmpty(PREFIX) {\n     PREFIX = /usr/local\n   }\n\n   target.path = $$PREFIX/bin\n\n   desktop.path = $$PREFIX/share/applications/\n   desktop.files += res/$${TARGET}.desktop\n\n   manpage.path = $$PREFIX/share/man/man1\n   manpage.files += res/$${TARGET}.1\n\n   icon.path = $$PREFIX/share/icons/hicolor/256x256/apps\n   icon.files += res/$${TARGET}.png\n\n   metainfo.path = $$PREFIX/share/metainfo/\n   metainfo.files += res/io.github.foldynl.QLog.metainfo.xml\n\n   INSTALLS += target desktop icon metainfo manpage\n\n   INCLUDEPATH += /usr/local/include\n   PKGCONFIG += openssl\n   LIBS += -L/usr/local/lib -lhamlib -lsqlite3 -lz\n   equals(QT_MAJOR_VERSION, 6): LIBS += -lqt6keychain\n   equals(QT_MAJOR_VERSION, 5): LIBS += -lqt5keychain\n}\n\nmacx: {\n   # This allows the app to be shipped in a non-bundeled version\n   !isEmpty(PREFIX) {\n      target.path = $$PREFIX\n      INSTALLS += target\n   }\n\n   INCLUDEPATH += /usr/local/include /opt/homebrew/include /opt/local/include\n   LIBS += -L/usr/local/lib -L/opt/homebrew/lib -lhamlib -lsqlite3 -lz -L/opt/local/lib -lssl -lcrypto\n   equals(QT_MAJOR_VERSION, 6): LIBS += -lqt6keychain\n   equals(QT_MAJOR_VERSION, 5): LIBS += -lqt5keychain\n   DISTFILES +=\n}\n\nwin32: {\n   INCLUDEPATH += \\\n        /usr/local/include \\\n        $$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite/\n\n   SOURCES += \\\n        rig/drivers/OmnirigRigDrv.cpp \\\n        rig/drivers/Omnirigv2RigDrv.cpp \\\n        $$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite/sqlite3.c\n\n\n   HEADERS += \\\n        rig/drivers/OmnirigRigDrv.h \\\n        rig/drivers/Omnirigv2RigDrv.h \\\n        rig/drivers/OmniRigEventSink.h \\\n        $$[QT_INSTALL_PREFIX]/../Src/qtbase/src/3rdparty/sqlite/sqlite3.h\n\n   TARGET = qlog\n   QMAKE_TARGET_COMPANY = OK1MLG\n   QMAKE_TARGET_DESCRIPTION = Hamradio logging\n\n   LIBS += -lws2_32 -llibhamlib-4 -lzlib -llibssl -llibcrypto\n   equals(QT_MAJOR_VERSION, 6): LIBS += -lqt6keychain\n   equals(QT_MAJOR_VERSION, 5): LIBS += -lqt5keychain\n\n   DEFINES += WIN32_LEAN_AND_MEAN\n   DEFINES += ZD_EXPORT=\n}\n\nDEFINES += HAMLIBVERSION_MAJOR=$$HAMLIBVERSION_MAJOR\nDEFINES += HAMLIBVERSION_MINOR=$$HAMLIBVERSION_MINOR\nDEFINES += HAMLIBVERSION_PATCH=$$HAMLIBVERSION_PATCH\n\nDISTFILES += \\\n    Changelog \\\n    i18n/dbstrings.tri \\\n    res/data/sat_modes\n"
  },
  {
    "path": "README.md",
    "content": "# QLog\n\nQLog is an Amateur Radio logging application for Linux, Windows. It\nis based on the Qt framework and uses SQLite as database backend.\n\nQLogs aims to be as simple as possible, but to provide everything the operator expects from the log to be. This log is not currently focused on contests.\n\n![Screenshot](https://foldynl.github.io/QLog/screens/qlog_main.png)\n\n## Features\n\n- Customizable GUI\n- Rig control via Hamlib, Omnirig v1 (Windows only), Omnirig v2 (Windows only), TCI, FLRig\n- Rotator control via Hamlib, PSTRotator\n- HamQTH and QRZ.com callbook integration\n- DX cluster integration\n- **LoTW**, **eQSL**, **QRZ.com**, **Clublog**, **HRDLog.net**, **ON4KST Chat**, **Cloudlog/Wavelog** integration (**eQSL includes QSL pictures download**)\n- **Secure Password Storage** for all services with password or security token\n- **Online** and **Offline** map\n- Club Member lookup\n- CW Keyer Support - CWDaemon, FLDigi (all supported modes), Morse Over CAT, WinKey v1 or v2\n- Bandmap\n- CW Console\n- WSJT-X integration\n- Station Location Profile support\n- Various station statistics\n- Basic Awards support\n- Basic Contest support\n- Custom QSO Filters\n- **NO** ads, **NO** user tracking, **NO** hidden telemetry - simply free and open-source\n- SQLite backend.\n\n### Supported OS\n* Linux\n* Windows 10/11 (64bit)\n* MacOS (experimental - only for developers)\n\n### Supported Rigs\n* all supported by [Hamlib](https://hamlib.github.io/)\n* all supported by [Omnirig v1](https://www.dxatlas.com/omnirig/) (Windows only)\n* all supported by [Omnirig v2](https://www.hb9ryz.ch/omnirig/) (Windows only)\n* all supported by [TCI](https://eesdr.com/en/software-en/software-en)\n* all supported by [FLRig](http://www.w1hkj.com/flrig-help/supported_transceivers.html)\n\n### Supported Rotators\n* all supported by [Hamlib](https://hamlib.github.io/)\n\n### Supported Keyers\n* [CWDaemon](https://cwdaemon.sourceforge.net/)\n* [FLDigi](http://www.w1hkj.com/)\n* Morse Over CAT\n* WinKey v1 or v2 compatible hardware\n\n### Supported Secure Password Storage\n* Linux: LibSecretKeyring, GnomeKeyring, Kwallet4, Kwallet5\n* Windows: Windows Credential Store\n* MacOS: macOS Keychain\n\n### Third-party software\n* [TQSL](http://www.arrl.org/tqsl-download) – optional, needed for LoTW support\n\nFor more details, screenshots etc, please, see [QLog Wiki](https://github.com/foldynl/QLog/wiki)\n\nPlease, used [QLog Issues](https://github.com/foldynl/QLog/issues) for reporting any issue or open a [discussion](https://github.com/foldynl/QLog/discussions).\nYou can also use [QLog mailing list](https://groups.io/g/qlog)\n\n\n## Installation\n\n### Minimum Hardware Requirements\n- The recommended graphical resolution: 1920x1080\n- CPU and memory: minimum requirements the same as for your OS\n- Graphic Card with OpenGL support\n- Serial connection if radio control is used\n\n### Linux\n\nPrerequisites:\n\n- Installed Trusted QSL (Optional) - `sudo apt install trustedqsl` or from [ARRL](http://www.arrl.org/tqsl-download)\n\n**DEB packages** for currently supported Ubuntu versions are available for amd64, arm64 platforms via [Ubuntu PPA](https://launchpad.net/~foldyna/+archive/ubuntu/qlog). Ubuntu users can use following commands:\n\n`sudo add-apt-repository ppa:foldyna/qlog`\n\n`sudo apt update`\n\n`sudo apt install qlog`\n\nFedora **RPM packages** are available via GitHub [Releases](https://github.com/foldynl/QLog/releases/latest)\n\n<a href='https://flathub.org/apps/io.github.foldynl.QLog'>   <img width='120' alt='Download on Flathub' src='https://dl.flathub.org/assets/badges/flathub-badge-en.png'/></a>\n\n**Flatpak** package is available via [Flathub](https://flathub.org/apps/io.github.foldynl.QLog). The package contains built-in TrustedQSL.\n\nThe above packages are maintained by the application maintainer. However, there are many other unofficial packages available for other distributions — see the Unofficial Repositories on [QLog Wiki](https://github.com/foldynl/QLog/wiki).\n\n### Windows\n\nPrerequisites:\n\n- Installed [Visual C++ Redistributable](https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170#latest-supported-redistributable-version)\n- Installed [Trusted QSL](http://www.arrl.org/tqsl-download) (Optional)\n- Installed [Omnirig v1](https://www.dxatlas.com/omnirig/) (Optional)\n- Installed [Omnirig v2](https://www.hb9ryz.ch/omnirig/) (Optional)\n\nInstallation package is available via GitHub [Releases](https://github.com/foldynl/QLog/releases) .\n\n### MacOS\n\nMacOS DMG: https://github.com/aa5sh/QLog/releases\n\n## Disclaimer Regarding Forks and Clones\n\nThis project is released as open source and may be forked or modified in accordance with its license.\n\nIf you are using a fork, clone, or any modified version of this project that is not maintained in this official repository, please note:\n\n- We do **not** provide support for any forks, clones, or modified versions of this project.\n- This includes support requests related to \"core features\" as changes introduced in forks may directly or indirectly affect their behavior.\n- Any issues, bug reports, or feature requests concerning a forked or modified version must be directed to the maintainer of that specific repository.\n\nSupport is provided exclusively for the original, unmodified version of the project distributed from this official source.\n\nBy using a fork or modified version, you acknowledge that compatibility, stability, and functionality may differ from the original project, and responsibility\nfor such differences lies solely with the maintainer of that fork.\n\n## Compilation\n\n### General\n\nPrerequisites\n\n- Installed Qt\n- Installed [qtkeychain-devel](https://github.com/frankosterfeld/qtkeychain) library and headers\n- Installed [OpenSSL-devel](https://wiki.openssl.org/index.php/Binaries) libraries and headers\n- Installed [HamLib-devel](https://github.com/Hamlib/Hamlib/releases/latest) libraries and headers\n\n`qmake` supports listed input parameters that affect the compilation process.\n\n- `HAMLIBINCLUDEPATH` - the path to Hamlib Includes \n- `HAMLIBLIBPATH` - the path to Hamlib Library \n- `HAMLIBVERSION_MAJOR` - Hamlib version - major number (must be present if `pkg-config` cannot determine Hamlib version)\n- `HAMLIBVERSION_MINOR` - Hamlib version - minor number (must be present if `pkg-config` cannot determine Hamlib version)\n- `HAMLIBVERSION_PATCH` - Hamlib version - patch number (must be present if `pkg-config` cannot determine Hamlib version)\n- `PTHREADINCLUDEPATH`  - the path to pthread Includes - needed for Windows Hamlib 4.5 and later. Leave empty if system libraries should be used.\n- `PTHREADLIBPATH` - the path to pthread Library - needed for Windows Hamlib 4.5 and later. Leave empty if system libraries should be used.\n- `QTKEYCHAININCLUDEPATH` - the path to QtKeyChain Includes \n- `QTKEYCHAINLIBPATH`- the path to QtKeyChain Library\n- `ZLIBINCLUDEPATH` - the path to ZLIB Includes\n- `ZLIBLIBPATH` - the path to ZLIB Library\n\nLeave variables empty if system libraries and Hamlib version autodetect (calling `pkg-config`) should be used during compilation (for Windows, the parameter must be present)\n\nAn example of use:\n\n`\nC:/Qt/6.4.1/msvc2019_64/bin/qmake.exe C:\\Users\\devel\\development\\QLog\\QLog.pro -spec win32-msvc \"CONFIG+=qtquickcompiler\" \"HAMLIBINCLUDEPATH = C:\\Users\\devel\\development\\hamlib\\include\" \"HAMLIBLIBPATH =  C:\\Users\\devel\\development\\hamlib\\lib\\gcc\" \"HAMLIBVERSION_MAJOR = 4\" \"HAMLIBVERSION_MINOR = 5\" \"HAMLIBVERSION_PATCH = 0\" \"QTKEYCHAININCLUDEPATH = C:\\Users\\devel\\development\\qtkeychain_build\\include\" \"QTKEYCHAINLIBPATH = C:\\Users\\devel\\development\\qtkeychain_build\\lib\" && C:/Qt/Tools/QtCreator/bin/jom/jom.exe qmake_all\n`\n\n### Windows\n\nPrerequisites\n\n- [Visual Studio 2022](https://visualstudio.microsoft.com/vs/community/)\n- QT with source codes (6.x, Qt Webengine, OpenSSL Toolkit)\n- [Omnirig v1](https://www.dxatlas.com/omnirig/)\n- [Omnirig v2](https://www.hb9ryz.ch/omnirig/)\n- [Hamlib](https://github.com/Hamlib/Hamlib/releases)\n  - hamlib-w64-4.5.5.exe is the latest\n    - Need to run the following commands to \"fix\" the library *** Fix Paths if necessary ***\n      CD \"C:\\Program Files\\hamlib-w64-4.5.5\\lib\\msvc\"\n      \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.41.34120\\bin\\Hostx64\\x64\\link.exe\" /lib /machine:X64 /def:libhamlib-4.def\n      copy libhamlib-4.lib hamlib.lib\n- Install C++ Module - https://learn.microsoft.com/en-us/vcpkg/get_started/get-started-vscode?pivots=shell-powershell\n\n\tcd C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\vcpkg\n\tvcpkg install pthreads\n\tvcpkg install qtkeychain-qt6\n\nSystem Environmental Path Settings\n\tC:\\Program Files\\hamlib-w64-4.5.5\\bin\n\tC:\\QTTools\\vcpkg\\packages\\qtkeychain-qt6_x64-windows\\bin\n\nClone QLog Master Branch\nIn QT Creator Projects->Desktop Qt 6.8.0 MSVC2022 64Bit->Build Steps->Additional Arguments\n\t**** You need to update the paths accordingly ****\n\t**** Need to be on same line seperated by spaces ****\n\t\"HAMLIBINCLUDEPATH='C:\\Program Files\\hamlib-w64-4.5.5\\include'\"\n\t\"HAMLIBLIBPATH='C:\\Program Files\\hamlib-w64-4.5.5\\lib\\msvc'\"\n\t\"HAMLIBVERSION_MAJOR=4\"\n\t\"HAMLIBVERSION_MINOR=5\"\n\t\"HAMLIBVERSION_PATCH=5\"\n\t\"QTKEYCHAININCLUDEPATH=C:\\QTTools\\vcpkg\\packages\\qtkeychain-qt6_x64-windows\\include\"\n\t\"QTKEYCHAINLIBPATH=C:\\QTTools\\vcpkg\\packages\\qtkeychain-qt6_x64-windows\\lib\"\n\t\"PTHREADLIBPATH=C:\\QTTools\\vcpkg\\packages\\pthreads_x64-windows\\lib\"\n\t\"PTHREADINCLUDEPATH=C:\\QTTools\\vcpkg\\packages\\pthreads_x64-windows\\include\"\n\n\n### Linux\n\nfor Debian:\n\n`sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libsqlite3-dev libhamlib++-dev libqt5charts5-dev qttools5-dev-tools libqt5keychain1 qt5keychain-dev qtwebengine5-dev build-essential libqt5serialport5-dev pkg-config libqt5websockets5-dev libssl-dev`\n\nfor Debian (QT6):\n\n`sudo apt-get -y install libhamlib-dev build-essential pkg-config qt6-base-dev qtkeychain-qt6-dev qt6-webengine-dev libqt6charts6-dev libqt6serialport6 libqt6webenginecore6-bin libqt6svg6-dev libgl-dev libqt6websockets6-dev qt6-serialport-dev libsqlite3-dev libssl-dev`\n\nfor Fedora:\n\n`dnf install qt5-qtbase-devel qt5-qtwebengine-devel qt5-qtcharts-devel hamlib-devel qtkeychain-qt5-devel qt5-qtserialport-devel pkg-config qt5-qtwebsockets-devel libsqlite3x-devel openssl-devel`\n\nfor both:\n\n`git clone https://github.com/foldynl/QLog.git`\n\n`cd  QLog`\n\nfor Debian:\n\n`qmake QLog.pro`\n\nfor Debian (QT6):\n\n`qmake6 QLog.pro`\n\nfor Fedora:\n\n`/usr/bin/qmake-qt5`\n\nNOTE: if it is necessary then use `qmake` input parameters described above to affect compilation. The input parameter must be use in case when Hamlib or qtkeychain are compiled from their source code repos.\n\nfor all:\n\n`make`\n\n### MacOS\n\nIn order to build QLog on MacOS, following prerequisites must be satisfied.\n\n1. [Xcode](#xcode) command line tools\n2. [Homebrew](https://brew.sh)\n3. [Qt](https://www.qt.io) with QtCreator\n\n##### Xcode\n\nXcode command line tools can be installed by issuing a command in command terminal:\n\n```\nxcode-select --install\n```\n\n**N.B.:** This command doesn't install Xcode itself, however It will take some time to download and\ninstall the tools anyway.\n\n##### MacOS build\n\nLast dependencies before building QLog are:\n\n```\n brew install qt6\n brew link qt6 --force\n brew install hamlib\n brew link hamlib --force\n brew install qtkeychain\n brew install dbus-glib\n brew install brotli\n brew install icu4c\n brew install pkg-config\n```\n\nAs soon as the steps above are finished, QLog source can be opened in QtCreator, configured, built and run.\nQLog app (qlog.app) from the build artifacts folder can be later copied (`installed`) to `~/Applications` and\naccessed via Spotlight search bar.\n\nNOTE: if it is necessary then use `qmake` input parameters described above to affect compilation. The input parameter must be use in case when hamlib or qtkeychain is compiled from their source code repos.\n\n\n\n## License\n\nCopyright (C) 2020  Thomas Gatzweiler\n\nCopyright (C) 2021-2026  Ladislav Foldyna\n\nThis program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "awards/AwardDXCC.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardDXCC.h\"\n\nQString AwardDXCC::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"DXCC\");\n}\n\nQString AwardDXCC::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"translate_to_locale(d.name) col1, d.prefix col2 \");\n}\n\nQString AwardDXCC::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM (SELECT id, name, prefix FROM dxcc_entities_clublog WHERE deleted = 0 \"\n           \"       UNION \"\n           \"       SELECT DISTINCT dxcc, b.name, b.prefix || ' (\"\n           + QCoreApplication::translate(\"AwardsDialog\", \"DELETED\") + \")' \"\n           \"             FROM source_contacts a INNER JOIN dxcc_entities_clublog b ON a.dxcc = b.id AND b.deleted = 1 where a.my_dxcc = '\" + entity + \"') d \"\n           \"   LEFT OUTER JOIN source_contacts c ON (d.id = c.dxcc AND (c.id IS NULL OR c.my_dxcc = '\" + entity + \"'))\"\n           \"   LEFT OUTER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardDXCC::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQString AwardDXCC::clickFilter(const QString &, const QString &) const\n{\n    return QString();\n}\n\nbool AwardDXCC::clickUsesCountryName() const\n{\n    return true;\n}\n"
  },
  {
    "path": "awards/AwardDXCC.h",
    "content": "#ifndef QLOG_AWARDS_AWARDDXCC_H\n#define QLOG_AWARDS_AWARDDXCC_H\n\n#include \"BandTableAward.h\"\n\nclass AwardDXCC : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"dxcc\"); }\n    QString displayName() const override;\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n    bool clickUsesCountryName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDDXCC_H\n"
  },
  {
    "path": "awards/AwardDefinition.cpp",
    "content": "#include \"AwardDefinition.h\"\n\nbool AwardDefinition::entityInputEnabled() const\n{\n    return true;\n}\n\nbool AwardDefinition::notWorkedEnabled() const\n{\n    return true;\n}\n\nAwardDefinition::ConditionResult AwardDefinition::getConditionSelected(const QModelIndex &) const\n{\n    return ConditionResult();\n}\n"
  },
  {
    "path": "awards/AwardDefinition.h",
    "content": "#ifndef QLOG_AWARDS_AWARDDEFINITION_H\n#define QLOG_AWARDS_AWARDDEFINITION_H\n\n#include <QString>\n#include <QStringList>\n#include <QWidget>\n#include <QModelIndex>\n\n/* Filter parameters collected from the AwardsDialog UI controls.\n * Passed to AwardDefinition::updateData() on every filter change. */\nstruct AwardFilterParams\n{\n    QString entitySelected;            /* DXCC entity ID from the \"My DXCC Entity\" combo */\n    QStringList modes;                 /* SQL IN-list values, e.g. {\"'NONE'\", \"'CW'\", \"'PHONE'\"} */\n    QStringList confirmedConditions;   /* SQL OR-conditions for confirmed status */\n    bool notWorkedOnly;                /* Show only entities with no QSOs on any band */\n    bool notConfirmedOnly;             /* Show only entities worked but not confirmed */\n    QString userFilterWhereClause;     /* Extra WHERE clause from QSOFilterManager (includes leading \"AND\") */\n};\n\n/* Abstract base class for all award definitions.\n *\n * To add a completely custom award (non-table display), subclass this directly\n * and implement createWidget() / updateData().\n *\n * For the common band-column table display, subclass BandTableAward instead.\n *\n * Registration: add one line to AwardsDialog::createAwards(). */\nclass AwardDefinition\n{\npublic:\n    virtual ~AwardDefinition() = default;\n\n    /* Unique internal key (e.g. \"dxcc\", \"sota\", \"grid4\"). Used as combo item data. */\n    virtual QString key() const = 0;\n\n    /*Translatable display name shown in the Award combo box. */\n    virtual QString displayName() const = 0;\n\n    /*Whether the \"My DXCC Entity\" combo is shown. Default: true. */\n    virtual bool entityInputEnabled() const;\n\n    /*Whether the Not-Worked / Not-Confirmed checkboxes are shown. Default: true. */\n    virtual bool notWorkedEnabled() const;\n\n    /*Create the display widget. Called once on first selection. Store in m_widget. */\n    virtual QWidget* createWidget(QWidget *parent) = 0;\n\n    /*Refresh data using the current filter parameters. Called on every filter change. */\n    virtual void updateData(const AwardFilterParams &params) = 0;\n\n    /* Return filter data for the logbook based on a double-clicked cell.\n     * The dialog uses ConditionResult to emit AwardConditionSelected(country, band, filter)\n     * which opens the logbook filtered to matching QSOs.\n     * Default implementation returns an invalid (no-op) result. */\n    struct ConditionResult\n    {\n        QString country;   /* Country name for the logbook filter (empty = not used) */\n        QString band;      /* Band name from the column header (empty = all bands) */\n        QString filter;    /* SQL WHERE clause fragment, e.g. \"(sota_ref = 'OE/TI-001')\" */\n        bool valid = false;\n    };\n    virtual ConditionResult getConditionSelected(const QModelIndex &clickedIndex) const;\n\n    /*Returns the cached widget (nullptr before createWidget()). */\n    QWidget* widget() const { return m_widget; }\n\nprotected:\n    QWidget *m_widget = nullptr;\n};\n\n#endif // QLOG_AWARDS_AWARDDEFINITION_H\n"
  },
  {
    "path": "awards/AwardGridsquare.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardGridsquare.h\"\n\nAwardGridsquare::AwardGridsquare(int chars)\n    : m_chars(chars)\n{\n}\n\nQString AwardGridsquare::key() const\n{\n    return QString(\"grid%1\").arg(m_chars);\n}\n\nQString AwardGridsquare::displayName() const\n{\n    switch ( m_chars )\n    {\n    case 2: return QCoreApplication::translate(\"AwardsDialog\", \"Gridsquare 2-Chars\");\n    case 4: return QCoreApplication::translate(\"AwardsDialog\", \"Gridsquare 4-Chars\");\n    case 6: return QCoreApplication::translate(\"AwardsDialog\", \"Gridsquare 6-Chars\");\n    default: return QCoreApplication::translate(\"AwardsDialog\", \"Gridsquare %1-Chars\").arg(m_chars);\n    }\n}\n\nQString AwardGridsquare::headersColumns(const QString &) const\n{\n    return QString(\"substr(c.gridsquare, 1, %1) col1, NULL col2 \").arg(m_chars);\n}\n\nQString AwardGridsquare::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM source_contacts c\"\n           \"      INNER JOIN modes m ON c.mode = m.name AND c.my_dxcc = '\" + entity + \"' \";\n}\n\nQString AwardGridsquare::additionalWhere(const QString &) const\n{\n    return QString(\" AND length(c.gridsquare) >= %1 \").arg(m_chars);\n}\n\nQString AwardGridsquare::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"gridsquare LIKE '%1%%'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardGridsquare.h",
    "content": "#ifndef QLOG_AWARDS_AWARDGRIDSQUARE_H\n#define QLOG_AWARDS_AWARDGRIDSQUARE_H\n\n#include \"BandTableAward.h\"\n\nclass AwardGridsquare : public BandTableAward\n{\npublic:\n    explicit AwardGridsquare(int chars);\n\n    QString key() const override;\n    QString displayName() const override;\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n\nprivate:\n    int m_chars;\n};\n\n#endif // QLOG_AWARDS_AWARDGRIDSQUARE_H\n"
  },
  {
    "path": "awards/AwardIOTA.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardIOTA.h\"\n\nQString AwardIOTA::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"IOTA\");\n}\n\nQString AwardIOTA::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"c.iota col1, NULL col2 \");\n}\n\nQString AwardIOTA::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM source_contacts c\"\n           \"      INNER JOIN modes m ON c.mode = m.name AND c.my_dxcc = '\" + entity + \"'\";\n}\n\nQString AwardIOTA::additionalWhere(const QString &) const\n{\n    return \" AND c.iota is not NULL \";\n}\n\nQString AwardIOTA::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"iota = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardIOTA.h",
    "content": "#ifndef QLOG_AWARDS_AWARDIOTA_H\n#define QLOG_AWARDS_AWARDIOTA_H\n\n#include \"BandTableAward.h\"\n\nclass AwardIOTA : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"iota\"); }\n    QString displayName() const override;\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDIOTA_H\n"
  },
  {
    "path": "awards/AwardITU.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardITU.h\"\n\nQString AwardITU::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"ITU\");\n}\n\nQString AwardITU::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"d.n col1, null col2 \");\n}\n\nQString AwardITU::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM ituzCTE d \"\n           \"   LEFT OUTER JOIN source_contacts c ON d.n = c.ituz AND c.my_dxcc = '\" + entity + \"'\"\n           \"   LEFT OUTER JOIN modes m on c.mode = m.name\";\n}\n\nQString AwardITU::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQStringList AwardITU::additionalCTEs(const QString &, const QString &) const\n{\n    return { generateNumberRangeCTE(\"ituzCTE\", 1, 90) };\n}\n\nQString AwardITU::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"ituz = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardITU.h",
    "content": "#ifndef QLOG_AWARDS_AWARDITU_H\n#define QLOG_AWARDS_AWARDITU_H\n\n#include \"BandTableAward.h\"\n\nclass AwardITU : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"itu\"); }\n    QString displayName() const override;\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QStringList additionalCTEs(const QString &entity, const QString &contactFilter) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDITU_H\n"
  },
  {
    "path": "awards/AwardJapan.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardJapan.h\"\n\nAwardJapan::AwardJapan()\n    : SecondarySubdivisionAward(QStringLiteral(\"japan\"), QStringLiteral(\"339\"))\n{\n}\n\nQString AwardJapan::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"Japanese Cities/Ku/Guns\");\n}\n"
  },
  {
    "path": "awards/AwardJapan.h",
    "content": "#ifndef QLOG_AWARDS_AWARDJAPAN_H\n#define QLOG_AWARDS_AWARDJAPAN_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardJapan : public SecondarySubdivisionAward\n{\npublic:\n    AwardJapan();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDJAPAN_H\n"
  },
  {
    "path": "awards/AwardNZ.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardNZ.h\"\n\nAwardNZ::AwardNZ()\n    : SecondarySubdivisionAward(QStringLiteral(\"nz\"), QStringLiteral(\"170\"))\n{\n}\n\nQString AwardNZ::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"NZ Counties\");\n}\n"
  },
  {
    "path": "awards/AwardNZ.h",
    "content": "#ifndef QLOG_AWARDS_AWARDNZ_H\n#define QLOG_AWARDS_AWARDNZ_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardNZ : public SecondarySubdivisionAward\n{\npublic:\n    AwardNZ();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDNZ_H\n"
  },
  {
    "path": "awards/AwardPOTAActivator.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardPOTAActivator.h\"\n\nQString AwardPOTAActivator::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"POTA Activator\");\n}\n\nQString AwardPOTAActivator::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"p.reference col1, p.name col2 \");\n}\n\nQString AwardPOTAActivator::sqlDetailTable(const QString &) const\n{\n    return \" FROM pota_directory p \"\n           \"      INNER JOIN source_contacts c ON SUBSTR(c.my_pota_ref_str, 1, COALESCE(NULLIF(INSTR(c.my_pota_ref_str, '@'), 0) - 1, LENGTH(c.my_pota_ref_str))) = p.reference\"\n           \"      INNER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardPOTAActivator::additionalWhere(const QString &) const\n{\n    return \" AND c.my_pota_ref_str is not NULL \";\n}\n\nQStringList AwardPOTAActivator::additionalCTEs(const QString &, const QString &contactFilter) const\n{\n    return { generateSplitCTE(\"my_pota_ref\", \"my_pota_ref_str\", contactFilter) };\n}\n\nQString AwardPOTAActivator::sourceContactsOverride(const QString &) const\n{\n    return generateSplitSourceContacts(\"my_pota_ref_str\");\n}\n\nQString AwardPOTAActivator::clickFilter(const QString &col1Value, const QString &) const\n{\n    // Bug fix: original had \"my_pota_ref LIKE = '%%1%'\" (extra '=')\n    return QString(\"my_pota_ref LIKE '%%1%'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardPOTAActivator.h",
    "content": "#ifndef QLOG_AWARDS_AWARDPOTAACTIVATOR_H\n#define QLOG_AWARDS_AWARDPOTAACTIVATOR_H\n\n#include \"BandTableAward.h\"\n\nclass AwardPOTAActivator : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"potaa\"); }\n    QString displayName() const override;\n    bool entityInputEnabled() const override { return false; }\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QStringList additionalCTEs(const QString &entity, const QString &contactFilter) const override;\n    QString sourceContactsOverride(const QString &contactFilter) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDPOTAACTIVATOR_H\n"
  },
  {
    "path": "awards/AwardPOTAHunter.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardPOTAHunter.h\"\n\nQString AwardPOTAHunter::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"POTA Hunter\");\n}\n\nQString AwardPOTAHunter::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"p.reference col1, p.name col2 \");\n}\n\nQString AwardPOTAHunter::sqlDetailTable(const QString &) const\n{\n    return \" FROM pota_directory p \"\n           \"      INNER JOIN source_contacts c ON SUBSTR(c.pota, 1, COALESCE(NULLIF(INSTR(c.pota, '@'), 0) - 1, LENGTH(c.pota))) = p.reference\"\n           \"      INNER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardPOTAHunter::additionalWhere(const QString &) const\n{\n    return \" AND c.pota is not NULL \";\n}\n\nQStringList AwardPOTAHunter::additionalCTEs(const QString &, const QString &contactFilter) const\n{\n    return { generateSplitCTE(\"pota_ref\", \"pota\", contactFilter) };\n}\n\nQString AwardPOTAHunter::sourceContactsOverride(const QString &) const\n{\n    return generateSplitSourceContacts(\"pota\");\n}\n\nQString AwardPOTAHunter::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"pota_ref LIKE '%%1%'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardPOTAHunter.h",
    "content": "#ifndef QLOG_AWARDS_AWARDPOTAHUNTER_H\n#define QLOG_AWARDS_AWARDPOTAHUNTER_H\n\n#include \"BandTableAward.h\"\n\nclass AwardPOTAHunter : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"potah\"); }\n    QString displayName() const override;\n    bool entityInputEnabled() const override { return false; }\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QStringList additionalCTEs(const QString &entity, const QString &contactFilter) const override;\n    QString sourceContactsOverride(const QString &contactFilter) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDPOTAHUNTER_H\n"
  },
  {
    "path": "awards/AwardRDA.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardRDA.h\"\n\nAwardRDA::AwardRDA()\n    : SecondarySubdivisionAward(QStringLiteral(\"rda\"), QStringLiteral(\"15, 54, 61, 126, 151\"))\n{\n}\n\nQString AwardRDA::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"Russian Districts\");\n}\n"
  },
  {
    "path": "awards/AwardRDA.h",
    "content": "#ifndef QLOG_AWARDS_AWARDRDA_H\n#define QLOG_AWARDS_AWARDRDA_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardRDA : public SecondarySubdivisionAward\n{\npublic:\n    AwardRDA();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDRDA_H\n"
  },
  {
    "path": "awards/AwardSOTA.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardSOTA.h\"\n\nQString AwardSOTA::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"SOTA\");\n}\n\nQString AwardSOTA::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"s.summit_code col1, NULL col2 \");\n}\n\nQString AwardSOTA::sqlDetailTable(const QString &) const\n{\n    return \" FROM sota_summits s \"\n           \"     INNER JOIN source_contacts c ON c.sota_ref = s.summit_code \"\n           \"     INNER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardSOTA::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQString AwardSOTA::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"sota_ref = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardSOTA.h",
    "content": "#ifndef QLOG_AWARDS_AWARDSOTA_H\n#define QLOG_AWARDS_AWARDSOTA_H\n\n#include \"BandTableAward.h\"\n\nclass AwardSOTA : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"sota\"); }\n    QString displayName() const override;\n    bool entityInputEnabled() const override { return false; }\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDSOTA_H\n"
  },
  {
    "path": "awards/AwardSpanishDME.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardSpanishDME.h\"\n\nAwardSpanishDME::AwardSpanishDME()\n    : SecondarySubdivisionAward(QStringLiteral(\"spanishdme\"), QStringLiteral(\"21, 29, 32, 281\"))\n{\n}\n\nQString AwardSpanishDME::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"Spanish DMEs\");\n}\n"
  },
  {
    "path": "awards/AwardSpanishDME.h",
    "content": "#ifndef QLOG_AWARDS_AWARDSPANISHDME_H\n#define QLOG_AWARDS_AWARDSPANISHDME_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardSpanishDME : public SecondarySubdivisionAward\n{\npublic:\n    AwardSpanishDME();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDSPANISHDME_H\n"
  },
  {
    "path": "awards/AwardUKD.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardUKD.h\"\n\nAwardUKD::AwardUKD()\n    : SecondarySubdivisionAward(QStringLiteral(\"ukd\"), QStringLiteral(\"288\"))\n{\n}\n\nQString AwardUKD::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"Ukrainian Districts\");\n}\n"
  },
  {
    "path": "awards/AwardUKD.h",
    "content": "#ifndef QLOG_AWARDS_AWARDUKD_H\n#define QLOG_AWARDS_AWARDUKD_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardUKD : public SecondarySubdivisionAward\n{\npublic:\n    AwardUKD();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDUKD_H\n"
  },
  {
    "path": "awards/AwardUSCounty.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardUSCounty.h\"\n\nAwardUSCounty::AwardUSCounty()\n    : SecondarySubdivisionAward(QStringLiteral(\"uscounty\"), QStringLiteral(\"291, 6, 110\"))\n{\n}\n\nQString AwardUSCounty::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"US Counties\");\n}\n"
  },
  {
    "path": "awards/AwardUSCounty.h",
    "content": "#ifndef QLOG_AWARDS_AWARDUSCOUNTY_H\n#define QLOG_AWARDS_AWARDUSCOUNTY_H\n\n#include \"SecondarySubdivisionAward.h\"\n\nclass AwardUSCounty : public SecondarySubdivisionAward\n{\npublic:\n    AwardUSCounty();\n    QString displayName() const override;\n};\n\n#endif // QLOG_AWARDS_AWARDUSCOUNTY_H\n"
  },
  {
    "path": "awards/AwardWAC.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardWAC.h\"\n\n\n/* https://www.arrl.org/wac */\n\nQString AwardWAC::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"WAC\");\n}\n\nQString AwardWAC::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"d.column2 col1, d.column1 col2 \");\n}\n\nQString AwardWAC::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM continents d \"\n           \"   LEFT OUTER JOIN source_contacts c ON d.column1 = c.cont AND c.my_dxcc = '\" + entity + \"'\"\n           \"   LEFT OUTER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardWAC::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQStringList AwardWAC::additionalCTEs(const QString &, const QString &) const\n{\n    return { generateValuesCTE(\"continents\",\n                               { { QStringLiteral(\"NA\"), QCoreApplication::translate(\"AwardsDialog\", \"North America\") },\n                                 { QStringLiteral(\"SA\"), QCoreApplication::translate(\"AwardsDialog\", \"South America\") },\n                                 { QStringLiteral(\"EU\"), QCoreApplication::translate(\"AwardsDialog\", \"Europe\") },\n                                 { QStringLiteral(\"AF\"), QCoreApplication::translate(\"AwardsDialog\", \"Africa\") },\n                                 { QStringLiteral(\"OC\"), QCoreApplication::translate(\"AwardsDialog\", \"Oceania\") },\n                                 { QStringLiteral(\"AS\"), QCoreApplication::translate(\"AwardsDialog\", \"Asia\") }\n                               }) };\n}\n\nQString AwardWAC::clickFilter(const QString &, const QString &col2Value) const\n{\n    return QString(\"cont = '%1'\").arg(col2Value);\n}\n"
  },
  {
    "path": "awards/AwardWAC.h",
    "content": "#ifndef QLOG_AWARDS_AWARDWAC_H\n#define QLOG_AWARDS_AWARDWAC_H\n\n#include \"BandTableAward.h\"\n\nclass AwardWAC : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"wac\"); }\n    QString displayName() const override;\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QStringList additionalCTEs(const QString &entity, const QString &contactFilter) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDWAC_H\n"
  },
  {
    "path": "awards/AwardWAS.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardWAS.h\"\n\nQString AwardWAS::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"WAS\");\n}\n\nQString AwardWAS::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"d.subdivision_name col1, d.code col2 \");\n}\n\nQString AwardWAS::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM adif_enum_primary_subdivision d\"\n           \"   LEFT OUTER JOIN source_contacts c ON d.dxcc = c.dxcc AND d.code = c.state AND c.my_dxcc = '\" + entity + \"' AND d.dxcc in (6, 110, 291)\"\n           \"   LEFT OUTER JOIN modes m on c.mode = m.name\";\n}\n\nQString AwardWAS::additionalWhere(const QString &) const\n{\n    return \" AND d.dxcc in (6, 110, 291) \";\n}\n\nQString AwardWAS::clickFilter(const QString &, const QString &col2Value) const\n{\n    return QString(\"state = '%1' and dxcc in (6, 110, 291)\").arg(col2Value);\n}\n"
  },
  {
    "path": "awards/AwardWAS.h",
    "content": "#ifndef QLOG_AWARDS_AWARDWAS_H\n#define QLOG_AWARDS_AWARDWAS_H\n\n#include \"BandTableAward.h\"\n\nclass AwardWAS : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"was\"); }\n    QString displayName() const override;\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDWAS_H\n"
  },
  {
    "path": "awards/AwardWAZ.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardWAZ.h\"\n\nQString AwardWAZ::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"WAZ\");\n}\n\nQString AwardWAZ::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"d.n col1, null col2 \");\n}\n\nQString AwardWAZ::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM cqzCTE d \"\n           \"   LEFT OUTER JOIN source_contacts c ON d.n = c.cqz AND c.my_dxcc = '\" + entity + \"'\"\n           \"   LEFT OUTER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardWAZ::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQStringList AwardWAZ::additionalCTEs(const QString &, const QString &) const\n{\n    return { generateNumberRangeCTE(\"cqzCTE\", 1, 40) };\n}\n\nQString AwardWAZ::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"cqz = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardWAZ.h",
    "content": "#ifndef QLOG_AWARDS_AWARDWAZ_H\n#define QLOG_AWARDS_AWARDWAZ_H\n\n#include \"BandTableAward.h\"\n\nclass AwardWAZ : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"waz\"); }\n    QString displayName() const override;\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QStringList additionalCTEs(const QString &entity, const QString &contactFilter) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDWAZ_H\n"
  },
  {
    "path": "awards/AwardWPX.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardWPX.h\"\n\nQString AwardWPX::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"WPX\");\n}\n\nQString AwardWPX::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"c.pfx col1, null col2 \");\n}\n\nQString AwardWPX::sqlDetailTable(const QString &entity) const\n{\n    return \" FROM source_contacts c\"\n           \"      INNER JOIN modes m ON c.mode = m.name AND c.my_dxcc = '\" + entity + \"'\";\n}\n\nQString AwardWPX::additionalWhere(const QString &) const\n{\n    return \" AND c.pfx is not null \";\n}\n\nQString AwardWPX::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"pfx = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardWPX.h",
    "content": "#ifndef QLOG_AWARDS_AWARDWPX_H\n#define QLOG_AWARDS_AWARDWPX_H\n\n#include \"BandTableAward.h\"\n\nclass AwardWPX : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"wpx\"); }\n    QString displayName() const override;\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDWPX_H\n"
  },
  {
    "path": "awards/AwardWWFF.cpp",
    "content": "#include <QCoreApplication>\n#include \"AwardWWFF.h\"\n\nQString AwardWWFF::displayName() const\n{\n    return QCoreApplication::translate(\"AwardsDialog\", \"WWFF\");\n}\n\nQString AwardWWFF::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"w.reference col1, w.name col2 \");\n}\n\nQString AwardWWFF::sqlDetailTable(const QString &) const\n{\n    return \" FROM wwff_directory w \"\n           \"     INNER JOIN source_contacts c ON c.wwff_ref = w.reference \"\n           \"     INNER JOIN modes m on c.mode = m.name \";\n}\n\nQString AwardWWFF::additionalWhere(const QString &) const\n{\n    return QString();\n}\n\nQString AwardWWFF::clickFilter(const QString &col1Value, const QString &) const\n{\n    return QString(\"wwff_ref = '%1'\").arg(col1Value);\n}\n"
  },
  {
    "path": "awards/AwardWWFF.h",
    "content": "#ifndef QLOG_AWARDS_AWARDWWFF_H\n#define QLOG_AWARDS_AWARDWWFF_H\n\n#include \"BandTableAward.h\"\n\nclass AwardWWFF : public BandTableAward\n{\npublic:\n    QString key() const override { return QStringLiteral(\"wwff\"); }\n    QString displayName() const override;\n    bool entityInputEnabled() const override { return false; }\n    bool notWorkedEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n};\n\n#endif // QLOG_AWARDS_AWARDWWFF_H\n"
  },
  {
    "path": "awards/BandTableAward.cpp",
    "content": "#include <QHeaderView>\n#include \"BandTableAward.h\"\n#include \"core/debug.h\"\n#include \"data/Band.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.awards.bandtableaward\");\n\nQWidget* BandTableAward::createWidget(QWidget *parent)\n{\n    FCT_IDENTIFICATION;\n\n    m_tableView = new QTableView(parent);\n    m_model = new AwardsTableModel(m_tableView);\n\n    m_tableView->setFocusPolicy(Qt::ClickFocus);\n    m_tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);\n    m_tableView->setAlternatingRowColors(true);\n    m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);\n    m_tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);\n    m_tableView->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel);\n    m_tableView->horizontalHeader()->setVisible(true);\n    m_tableView->horizontalHeader()->setCascadingSectionResizes(true);\n    m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n    m_tableView->verticalHeader()->setVisible(false);\n    m_tableView->verticalHeader()->setMinimumSectionSize(20);\n    m_tableView->verticalHeader()->setDefaultSectionSize(20);\n    m_tableView->verticalHeader()->setHighlightSections(false);\n\n    m_widget = m_tableView;\n    return m_widget;\n}\n\nvoid BandTableAward::updateData(const AwardFilterParams &params)\n{\n    FCT_IDENTIFICATION;\n\n    const QList<Band>& dxccBands = BandPlan::bandsList(false, true);\n\n    if ( dxccBands.size() == 0 )\n        return;\n\n    m_currentEntity = params.entitySelected;\n\n    const QString innerConfirmedCase(QString(\" CASE WHEN (%1) THEN 2 ELSE 1 END \")\n                                         .arg(params.confirmedConditions.isEmpty()\n                                                  ? QStringLiteral(\"1=2\")\n                                                  : params.confirmedConditions.join(\" or \")));\n\n    QStringList stmt_max_part;\n    QStringList stmt_total_padding;\n    QStringList stmt_sum_confirmed;\n    QStringList stmt_sum_worked;\n    QStringList stmt_sum_total;\n    QStringList stmt_having;\n    QStringList stmt_total_band_condition_work;\n    QStringList stmt_total_band_condition_confirmed;\n    QStringList stmt_not_confirmed;\n    QStringList stmt_any_worked;\n\n    for ( const Band& band : dxccBands )\n    {\n        stmt_max_part << QString(\" MAX(CASE WHEN band = '%1' AND m.dxcc IN (%2) THEN %3 ELSE 0 END) as '%4'\")\n                             .arg(band.name, params.modes.join(\",\"), innerConfirmedCase, band.name);\n        stmt_total_padding << QString(\" NULL '%1'\").arg(band.name);\n        stmt_sum_confirmed << QString(\"SUM(CASE WHEN a.'%1' > 1 THEN 1 ELSE 0 END) '%2'\").arg(band.name, band.name);\n        stmt_sum_worked << QString(\"SUM(CASE WHEN a.'%1' > 0 THEN 1 ELSE 0 END) '%2'\").arg(band.name, band.name);\n        stmt_sum_total << QString(\"SUM(d.'%1') '%2'\").arg(band.name, band.name);\n        stmt_having << QString(\"SUM(d.'%1') = 0\").arg(band.name);\n        stmt_total_band_condition_work << QString(\"e.'%1' > 0\").arg(band.name);\n        stmt_total_band_condition_confirmed << QString(\"e.'%1' > 1\").arg(band.name);\n        stmt_not_confirmed << QString(\"MAX(d.'%1') < 2\").arg(band.name);\n        stmt_any_worked << QString(\"MAX(d.'%1') > 0\").arg(band.name);\n    }\n\n    stmt_max_part << QString(\" MAX(CASE WHEN prop_mode = 'SAT' AND m.dxcc IN (%1) THEN %2 ELSE 0 END) as 'SAT' \").arg(params.modes.join(\",\"), innerConfirmedCase)\n                  << QString(\" MAX(CASE WHEN prop_mode = 'EME' AND m.dxcc IN (%1) THEN %2 ELSE 0 END) as 'EME' \").arg(params.modes.join(\",\"), innerConfirmedCase);\n    stmt_total_padding << \" NULL 'SAT' \"\n                       << \" NULL 'EME' \";\n    stmt_sum_confirmed << \" SUM(CASE WHEN a.'SAT' > 1 THEN 1 ELSE 0 END) 'SAT' \"\n                       << \" SUM(CASE WHEN a.'EME' > 1 THEN 1 ELSE 0 END) 'EME' \";\n    stmt_sum_worked << \" SUM(CASE WHEN a.'SAT' > 0 THEN 1 ELSE 0 END) 'SAT' \"\n                    << \" SUM(CASE WHEN a.'EME' > 0 THEN 1 ELSE 0 END) 'EME' \";\n    stmt_sum_total << \" SUM(d.'SAT') 'SAT' \"\n                   << \" SUM(d.'EME') 'EME' \";\n    stmt_having << \" SUM(d.'SAT') = 0\"\n                << \" SUM(d.'EME') = 0\";\n    stmt_total_band_condition_work << \"e.'SAT' > 0\"\n                                   << \"e.'EME' > 0\";\n    stmt_total_band_condition_confirmed << \"e.'SAT' > 1\"\n                                        << \"e.'EME' > 1\";\n    stmt_not_confirmed << \" MAX(d.'SAT') < 2\"\n                       << \" MAX(d.'EME') < 2\";\n    stmt_any_worked << \" MAX(d.'SAT') > 0\"\n                    << \" MAX(d.'EME') > 0\";\n\n    const QString &entity = params.entitySelected;\n\n    QString sourceContactsTable = sourceContactsOverride(params.userFilterWhereClause);\n    if ( sourceContactsTable.isEmpty() )\n    {\n        sourceContactsTable = QString(\" source_contacts AS \"\n                                      \" (SELECT * \"\n                                      \"  FROM contacts \"\n                                      \"  WHERE 1=1 %1 ) \").arg(params.userFilterWhereClause);\n    }\n\n    QStringList addlCTEs = additionalCTEs(entity, params.userFilterWhereClause);\n    addlCTEs.append(sourceContactsTable);\n\n    QStringList havingConditions;\n    if ( params.notWorkedOnly )\n        havingConditions << QString(\"(%1)\").arg(stmt_having.join(\" AND \"));\n    if ( params.notConfirmedOnly )\n        havingConditions << QString(\"(%1) AND (%2)\").arg(stmt_not_confirmed.join(\" AND \"),\n                                                         stmt_any_worked.join(\" OR \"));\n\n    QString havingClause;\n    if ( !havingConditions.isEmpty() )\n        havingClause = QString(\"HAVING %1\").arg(havingConditions.join(\" OR \"));\n\n    QString finalSQL(QString(\n              \"WITH \"\n              \"   %1, \"\n              \"   detail_table AS ( \"\n              \"     SELECT %2, %3 \"\n              \"     %4\"\n              \"     WHERE 1=1 %5\"\n              \"     GROUP BY  1,2), \"\n              \"   unique_worked AS (\"\n              \"     SELECT DISTINCT col1\"\n              \"     FROM detail_table e\"\n              \"      WHERE %6), \"\n              \"   unique_confirmed AS (\"\n              \"     SELECT DISTINCT col1\"\n              \"     FROM detail_table e\"\n              \"      WHERE %7) \"\n              \"SELECT * FROM ( \"\n              \"     SELECT 0 column_idx, '%8', COUNT(*), %9\"\n              \"     FROM unique_worked\"\n              \"   UNION ALL \"\n              \"     SELECT 0 column_idx, '%10', COUNT(*), %11\"\n              \"     FROM unique_confirmed\"\n              \"   UNION ALL \"\n              \"     SELECT 1 column_idx, '%12', NULL prefix, %13\"\n              \"     FROM detail_table a \"\n              \"     GROUP BY 1 \"\n              \"   UNION ALL \"\n              \"     SELECT 2 column_idx, '%14', NULL prefix, %15\"\n              \"     FROM detail_table a \"\n              \"     GROUP BY 1 \"\n              \"   UNION ALL \"\n              \"     SELECT 3 column_idx, col1, col2, %16\"\n              \"     FROM detail_table d \"\n              \"     GROUP BY 2,3 \"\n              \"     %17\"\n              \") \"\n              \"ORDER BY 1,2 COLLATE LOCALEAWARE ASC \").arg(addlCTEs.join(\",\"), // 1\n                                                           headersColumns(entity), // 2\n                                                           stmt_max_part.join(\",\"), // 3\n                                                           sqlDetailTable(entity), // 4\n                                                           additionalWhere(entity), // 5\n                                                           stmt_total_band_condition_work.join(\" OR \"), // 6\n                                                           stmt_total_band_condition_confirmed.join(\" OR \"), // 7\n                                                           QObject::tr(\"TOTAL Worked\"), // 8\n                                                           stmt_total_padding.join(\",\") // 9\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                                                           ,\n#else\n                                                           ).arg(\n#endif\n                                                           QObject::tr(\"TOTAL Confirmed\"), // 10\n                                                           stmt_total_padding.join(\",\"), // 11\n                                                           QObject::tr(\"Confirmed\"), // 12\n                                                           stmt_sum_confirmed.join(\",\") // 13\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                         ,\n#else\n                                                           ).arg(\n#endif\n                                                           QObject::tr(\"Worked\")).arg(  // 14\n                                                           stmt_sum_worked.join(\",\"), // 15\n                                                           stmt_sum_total.join(\",\"), // 16\n                                                           havingClause) // 17\n                                                           );\n    qCDebug(runtime) << finalSQL;\n\n    m_model->setQuery(finalSQL);\n    m_model->setHeaderData(1, Qt::Horizontal, \"\");\n    m_model->setHeaderData(2, Qt::Horizontal, \"\");\n    m_tableView->setModel(m_model);\n    m_tableView->setColumnHidden(0, true);\n}\n\nBandTableAward::ConditionResult BandTableAward::getConditionSelected(const QModelIndex &clickedIndex) const\n{\n    FCT_IDENTIFICATION;\n\n    ConditionResult result;\n\n    if ( !clickedIndex.isValid() || clickedIndex.row() <= 3 )\n        return result;\n\n    const QString col1Value = m_model->data(m_model->index(clickedIndex.row(), 1), Qt::DisplayRole).toString();\n    const QString col2Value = m_model->data(m_model->index(clickedIndex.row(), 2), Qt::DisplayRole).toString();\n\n    QStringList addlFilters;\n\n    if ( entityInputEnabled() )\n        addlFilters << QString(\"my_dxcc='%1'\").arg(m_currentEntity);\n\n    if ( clickUsesCountryName() )\n    {\n        result.country = col1Value;\n    }\n    else\n    {\n        const QString filter = clickFilter(col1Value, col2Value);\n        Q_ASSERT_X(!filter.isEmpty(), \"BandTableAward::getConditionSelected\",\n                    \"clickFilter() returned empty string — subclass must override clickFilter() or clickUsesCountryName()\");\n        addlFilters << filter;\n    }\n\n    if ( clickedIndex.column() > 2 )\n        result.band = m_model->headerData(clickedIndex.column(), Qt::Horizontal).toString();\n\n    result.filter = QString(\"(\") + addlFilters.join(\" and \") + QString(\")\");\n    result.valid = true;\n\n    return result;\n}\n\nQStringList BandTableAward::additionalCTEs(const QString &, const QString &) const\n{\n    return QStringList();\n}\n\nQString BandTableAward::sourceContactsOverride(const QString &) const\n{\n    return QString();\n}\n\nQString BandTableAward::clickFilter(const QString &, const QString &) const\n{\n    return QString();\n}\n\nbool BandTableAward::clickUsesCountryName() const\n{\n    return false;\n}\n\nQString BandTableAward::generateNumberRangeCTE(const QString &name, int min, int max)\n{\n    return QString(\" %1 AS (\"\n                   \"   SELECT %2 AS n, %2 AS value\"\n                   \"   UNION ALL\"\n                   \"   SELECT n + 1, value + 1\"\n                   \"   FROM %1\"\n                   \"   WHERE n < %3 )\").arg(name).arg(min).arg(max);\n}\n\nQString BandTableAward::generateValuesCTE(const QString &name,\n                                           const QList<QPair<QString,QString>> &values)\n{\n    QStringList rows;\n    for ( const QPair<QString,QString> &pair : values )\n        rows << QString(\"('%1', '%2')\").arg(pair.first, pair.second);\n\n    return QString(\" %1 AS (VALUES %2)\").arg(name, rows.join(\",\"));\n}\n\nQString BandTableAward::generateSplitCTE(const QString &sourceColumn,\n                                          const QString &outputColumn,\n                                          const QString &contactFilter)\n{\n    return QString(\" split(id, callsign, station_callsign, my_dxcc, band, dxcc, eqsl_qsl_rcvd, lotw_qsl_rcvd, qsl_rcvd, prop_mode, mode, %1, str) AS (\"\n                   \"   SELECT id, callsign, station_callsign, my_dxcc, band, \"\n                   \"          dxcc, eqsl_qsl_rcvd, lotw_qsl_rcvd, qsl_rcvd, prop_mode, mode, \"\n                   \"          '', %2||',' \"\n                   \"   FROM contacts WHERE 1=1 %3\"\n                   \"   UNION ALL \"\n                   \"   SELECT id, callsign, station_callsign, my_dxcc, band, \"\n                   \"          dxcc, eqsl_qsl_rcvd, lotw_qsl_rcvd, qsl_rcvd, prop_mode, mode, \"\n                   \"          substr(str, 0, instr(str, ',')), TRIM(substr(str, instr(str, ',') + 1)) \"\n                   \"   FROM split \"\n                   \"   WHERE str != '') \").arg(outputColumn, sourceColumn, contactFilter);\n}\n\nQString BandTableAward::generateSplitSourceContacts(const QString &outputColumn)\n{\n    return QString(\" source_contacts AS (\"\n                   \"   SELECT id, callsign, station_callsign, my_dxcc, band, dxcc, eqsl_qsl_rcvd, lotw_qsl_rcvd, qsl_rcvd, prop_mode, mode, %1 \"\n                   \"   FROM split \"\n                   \"   WHERE %1 != '' ) \").arg(outputColumn);\n}\n"
  },
  {
    "path": "awards/BandTableAward.h",
    "content": "#ifndef QLOG_AWARDS_BANDTABLEAWARD_H\n#define QLOG_AWARDS_BANDTABLEAWARD_H\n\n#include <QTableView>\n#include <QPair>\n#include \"AwardDefinition.h\"\n#include \"models/AwardsTableModel.h\"\n\n/* Standard band-column table award — the default display for most awards.\n *\n * This class builds and executes a SQL query that produces a table where:\n *   - Rows  = award entities (countries, zones, parks, summits, ...)\n *   - Cols  = amateur bands + SAT + EME\n *   - Cells = worked / confirmed / not-worked status (color-coded)\n *\n * Summary rows (TOTAL Worked, TOTAL Confirmed, per-band Worked/Confirmed counts)\n * are prepended automatically.\n *\n * === How to add a new band-table award ===\n *\n * 1. Create a subclass of BandTableAward.\n * 2. Implement key() and displayName() (identity).\n * 3. Override entityInputEnabled() / notWorkedEnabled() if needed.\n * 4. Implement the three REQUIRED SQL fragment methods:\n *      - headersColumns()   — what goes into SELECT as col1, col2\n *      - sqlDetailTable()   — FROM + JOINs\n *      - additionalWhere()  — extra WHERE conditions\n * 5. Override clickFilter() so double-click navigates to the right QSOs.\n * 6. Register in AwardsDialog::createAwards().\n *\n * That's it for simple awards. For awards that need a CTE (e.g. a number range\n * or a comma-separated field split), override additionalCTEs() and optionally\n * sourceContactsOverride(). Use the static helper methods to build CTEs without\n * writing raw SQL.\n *\n * === The generated SQL structure ===\n *\n *   WITH\n *     <additionalCTEs>,                        -- optional, from additionalCTEs()\n *     source_contacts AS (SELECT ... FROM contacts WHERE ...),  -- or sourceContactsOverride()\n *     detail_table AS (\n *       SELECT <headersColumns> col1, col2,\n *              MAX(CASE WHEN band='160m' ... END) as '160m',\n *              ...                              -- one column per band + SAT + EME\n *       <sqlDetailTable>                        -- FROM ... JOIN ...\n *       <additionalWhere>                       -- AND ...\n *       GROUP BY 1,2\n *     ),\n *     unique_worked AS (...),\n *     unique_confirmed AS (...)\n *   SELECT ...                                  -- summary rows + detail rows\n *   ORDER BY 1,2 COLLATE LOCALEAWARE ASC\n *\n * === Double-click behavior ===\n *\n * When a user double-clicks a detail row (row > 3), getConditionSelected()\n * builds a ConditionResult by calling clickFilter(col1, col2). The dialog\n * then emits AwardConditionSelected() to filter the logbook.\n *\n * Override clickUsesCountryName() to return true if col1 is a country name\n * that should be passed as the \"country\" parameter instead of a filter clause\n * (used by DXCC). */\nclass BandTableAward : public AwardDefinition\n{\npublic:\n    QWidget* createWidget(QWidget *parent) override;\n    void updateData(const AwardFilterParams &params) override;\n    ConditionResult getConditionSelected(const QModelIndex &clickedIndex) const override;\n\nprotected:\n    // ===================================================================\n    //  REQUIRED — every subclass must implement these three methods\n    // ===================================================================\n\n    /* SQL fragment for the SELECT clause that defines the two label columns.\n     *\n     * Must return exactly two expressions aliased as \"col1\" and \"col2\".\n     * col1 is the primary identifier (displayed in the first column).\n     * col2 is a secondary label (displayed in the second column), or NULL.\n     *\n     * The expressions can reference:\n     *   - \"d\" — the directory/reference table (if using a CTE or lookup table)\n     *   - \"c\" — the source_contacts table\n     *   - \"s\", \"p\", \"w\" — any alias used in sqlDetailTable()\n     *\n     * entity - the selected DXCC entity ID (may be unused if entityInputEnabled() == false)\n     *\n     * Examples:\n     *   \"d.n col1, null col2\"                              — WAZ (zone number, no secondary)\n     *   \"translate_to_locale(d.name) col1, d.prefix col2\"  — DXCC (country name + prefix)\n     *   \"p.reference col1, p.name col2\"                    — POTA (park reference + park name) */\n    virtual QString headersColumns(const QString &entity) const = 0;\n\n    /* SQL fragment starting with FROM that defines the source tables and joins.\n     *\n     * This is inserted into the detail_table CTE after the SELECT clause.\n     * Must join to \"source_contacts c\" and \"modes m\" (m.dxcc is used for mode filtering).\n     *\n     * IMPORTANT: Must NOT contain a WHERE clause at the outer level.\n     * The SQL template adds \"WHERE 1=1\" automatically after this fragment,\n     * followed by additionalWhere(). Place entity filtering in the JOIN ON\n     * conditions, and any other WHERE-level filters in additionalWhere().\n     *\n     * The join to source_contacts can be:\n     *   - LEFT OUTER JOIN -- when all possible entities should appear (even unworked ones).\n     *     Use this for awards with a fixed set of targets (DXCC, WAZ, WAC, WAS, ITU).\n     *   - INNER JOIN -- when only worked entities should appear.\n     *     Use this for open-ended awards (WPX, IOTA, POTA, SOTA, WWFF, Gridsquare).\n     *\n     * entity - the selected DXCC entity ID\n     *\n     * Examples:\n     *   \" FROM cqzCTE d\"\n     *   \"   LEFT OUTER JOIN source_contacts c ON d.n = c.cqz AND c.my_dxcc = '<entity>'\"\n     *   \"   LEFT OUTER JOIN modes m ON c.mode = m.name\"\n     *\n     *   \" FROM sota_summits s\"\n     *   \"     INNER JOIN source_contacts c ON c.sota_ref = s.summit_code\"\n     *   \"     INNER JOIN modes m ON c.mode = m.name\" */\n    virtual QString sqlDetailTable(const QString &entity) const = 0;\n\n    /* Extra WHERE conditions appended to the detail_table query.\n     *\n     * The SQL template always emits \"WHERE 1=1\" before this fragment,\n     * so sqlDetailTable() must NOT contain its own WHERE clause.\n     *\n     * Must start with \" AND \" if non-empty. Return empty QString() if not needed.\n     *\n     * Use this for:\n     *   - filtering the directory/reference table (LEFT OUTER JOIN awards)\n     *   - requiring non-null fields (INNER JOIN awards)\n     * Do NOT duplicate entity filters that are already in sqlDetailTable's JOIN ON.\n     *\n     * entity - the selected DXCC entity ID\n     *\n     * Examples:\n     *   \" AND d.dxcc IN (6, 110, 291)\"   -- filter directory table\n     *   \" AND c.iota is not NULL\"         -- require non-null field\n     *   QString()                         -- no extra filter (SOTA, WWFF) */\n    virtual QString additionalWhere(const QString &entity) const = 0;\n\n    // ===================================================================\n    //  OPTIONAL — override only when the default behavior is not enough\n    // ===================================================================\n\n    /* Return additional CTEs to prepend before source_contacts.\n     *\n     * Override this when the award needs a reference table that doesn't exist\n     * in the database (e.g. a numbered range for zones, a values list for continents,\n     * or a split CTE for comma-separated fields).\n     *\n     * Each string in the list is a single CTE definition (without leading comma).\n     * Default: empty list.\n     *\n     * Use the static helper methods to build CTEs:\n     *   - generateNumberRangeCTE()  — for ITU (1-90), WAZ (1-40)\n     *   - generateValuesCTE()       — for WAC continents\n     *   - generateSplitCTE()        — for POTA (comma-separated references)\n     *\n     * entity        - the selected DXCC entity ID\n     * contactFilter - the user filter WHERE clause (needed by split CTEs) */\n    virtual QStringList additionalCTEs(const QString &entity,\n                                       const QString &contactFilter) const;\n\n    /* Override the default source_contacts CTE.\n     *\n     * By default, source_contacts is: SELECT * FROM contacts WHERE 1=1 <userFilter>.\n     * Override this when the award needs a transformed contact source (e.g. POTA splits\n     * comma-separated references into individual rows).\n     *\n     * Return empty QString() to use the default. Otherwise return a complete CTE definition\n     * for \"source_contacts AS (...)\".\n     *\n     * contactFilter - the user filter WHERE clause\n     *\n     * See generateSplitSourceContacts() — helper for the split pattern. */\n    virtual QString sourceContactsOverride(const QString &contactFilter) const;\n\n    /* Return a SQL WHERE fragment for logbook filtering on double-click.\n     *\n     * Called when the user double-clicks a detail row. The returned string is\n     * combined with entity filter and band into a complete WHERE clause.\n     *\n     * col1Value - value from column 1 (the primary identifier)\n     * col2Value - value from column 2 (the secondary label)\n     *\n     * Examples:\n     *   \"cqz = '15'\"                     — WAZ: filter by CQ zone\n     *   \"sota_ref = 'OE/TI-001'\"         — SOTA: filter by summit\n     *   \"pota_ref LIKE '%K-0001%'\"        — POTA: LIKE match for multi-ref field\n     *   \"state = 'CA' and dxcc in (...)\"  — WAS: compound filter */\n    virtual QString clickFilter(const QString &col1Value,\n                                const QString &col2Value) const;\n\n    /* Return true if col1 is a country name to be passed as the \"country\"\n     * parameter of AwardConditionSelected (instead of a filter clause).\n     * Only DXCC uses this. Default: false. */\n    virtual bool clickUsesCountryName() const;\n\n    // ===================================================================\n    //  STATIC HELPERS — use these in additionalCTEs() / sourceContactsOverride()\n    // ===================================================================\n\n    /* Generate a recursive CTE that produces integers from min to max.\n     * Output columns: n (the integer), value (same as n).\n     * Example: generateNumberRangeCTE(\"cqzCTE\", 1, 40) produces zones 1-40. */\n    static QString generateNumberRangeCTE(const QString &name, int min, int max);\n\n    /* Generate a VALUES CTE from a list of (key, label) pairs.\n     * Output columns: column1 (key), column2 (label).\n     * Example: generateValuesCTE(\"continents\", {{\"NA\",\"North America\"}, {\"EU\",\"Europe\"}, ...}) */\n    static QString generateValuesCTE(const QString &name,\n                                     const QList<QPair<QString,QString>> &values);\n\n    /* Generate a recursive split CTE that expands comma-separated values\n     * from sourceColumn into individual rows with column outputColumn.\n     *\n     * Used for POTA where pota_ref or my_pota_ref may contain \"K-0001,K-0002\".\n     * The CTE is named \"split\" and should be paired with generateSplitSourceContacts().\n     *\n     * sourceColumn  - the contacts table column to split (e.g. \"pota_ref\")\n     * outputColumn  - the name for the split output column (e.g. \"pota\")\n     * contactFilter - the user filter WHERE clause */\n    static QString generateSplitCTE(const QString &sourceColumn,\n                                    const QString &outputColumn,\n                                    const QString &contactFilter);\n\n    /* Generate a source_contacts CTE that reads from the \"split\" CTE.\n     * Companion to generateSplitCTE(). Returns a CTE definition for source_contacts\n     * that selects non-empty rows from the split result.\n     * outputColumn - must match the outputColumn used in generateSplitCTE(). */\n    static QString generateSplitSourceContacts(const QString &outputColumn);\n\nprivate:\n    QTableView *m_tableView = nullptr;\n    AwardsTableModel *m_model = nullptr;\n    QString m_currentEntity;\n};\n\n#endif // QLOG_AWARDS_BANDTABLEAWARD_H\n"
  },
  {
    "path": "awards/SecondarySubdivisionAward.cpp",
    "content": "#include \"SecondarySubdivisionAward.h\"\n\nSecondarySubdivisionAward::SecondarySubdivisionAward(const QString &key, const QString &dxccFilter)\n    : m_key(key),\n      m_dxccFilter(dxccFilter)\n{\n}\n\nQString SecondarySubdivisionAward::headersColumns(const QString &) const\n{\n    return QStringLiteral(\"d.subdivision_name col1, d.code col2 \");\n}\n\nQString SecondarySubdivisionAward::sqlDetailTable(const QString &) const\n{\n    return \" FROM adif_enum_secondary_subdivision d \"\n           \"   LEFT OUTER JOIN (SELECT * FROM source_contacts \"\n           \"                    WHERE dxcc IN (\" + m_dxccFilter + \") \"\n           \"                      AND cnty IS NOT NULL AND cnty != '') c \"\n           \"     ON d.dxcc = c.dxcc AND upper(d.code) = upper(c.cnty) \"\n           \"   LEFT OUTER JOIN modes m ON c.mode = m.name \";\n}\n\nQString SecondarySubdivisionAward::additionalWhere(const QString &) const\n{\n    return \" AND d.dxcc IN (\" + m_dxccFilter + \") \";\n}\n\nQString SecondarySubdivisionAward::clickFilter(const QString &, const QString &col2Value) const\n{\n    return QString(\"upper(cnty) = upper('%1') and dxcc in (%2)\").arg(col2Value, m_dxccFilter);\n}\n"
  },
  {
    "path": "awards/SecondarySubdivisionAward.h",
    "content": "#ifndef QLOG_AWARDS_SECONDARYSUBDIVISIONAWARD_H\n#define QLOG_AWARDS_SECONDARYSUBDIVISIONAWARD_H\n\n#include \"BandTableAward.h\"\n\n/* Base class for awards based on adif_enum_secondary_subdivision table.\n *\n * These awards share identical SQL structure — only the DXCC entity filter,\n * display name, and key differ. Subclasses only need to provide identity\n * (key, displayName) and the DXCC filter via constructor. */\nclass SecondarySubdivisionAward : public BandTableAward\n{\npublic:\n    SecondarySubdivisionAward(const QString &key, const QString &dxccFilter);\n\n    QString key() const override { return m_key; }\n    bool entityInputEnabled() const override { return false; }\n\nprotected:\n    QString headersColumns(const QString &entity) const override;\n    QString sqlDetailTable(const QString &entity) const override;\n    QString additionalWhere(const QString &entity) const override;\n    QString clickFilter(const QString &col1Value, const QString &col2Value) const override;\n\nprivate:\n    QString m_key;\n    QString m_dxccFilter;\n};\n\n#endif // QLOG_AWARDS_SECONDARYSUBDIVISIONAWARD_H\n"
  },
  {
    "path": "core/AlertEvaluator.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n#include <QSqlRecord>\n\n#include \"AlertEvaluator.h\"\n#include \"debug.h\"\n#include \"data/DxSpot.h\"\n#include \"data/WsjtxEntry.h\"\n#include \"data/SpotAlert.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.alertevaluator\");\n\nAlertEvaluator::AlertEvaluator(QObject *parent)\n    : QObject(parent)\n{\n    FCT_IDENTIFICATION;\n    loadRules();\n}\n\nvoid AlertEvaluator::clearRules()\n{\n    FCT_IDENTIFICATION;\n\n    qDeleteAll(ruleList);\n    ruleList.clear();\n}\n\nvoid AlertEvaluator::dxSpot(const DxSpot & spot)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"DX Spot\";\n\n    QStringList matchedRules;\n\n    for ( const AlertRule *rule : static_cast<const QList<AlertRule *>&>(ruleList) )\n    {\n        qCDebug(runtime) << \"Processing \" << *rule;\n\n        if ( rule->match(spot) )\n        {\n            matchedRules << rule->ruleName;\n        }\n    }\n\n    if ( matchedRules.size() > 0 )\n    {\n        SpotAlert alert(matchedRules, spot);\n        emit spotAlert(alert);\n    }\n}\n\nvoid AlertEvaluator::WSJTXCQSpot(const WsjtxEntry &wsjtx)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"WSJTX CQ Spot\";\n\n    QStringList matchedRules;\n\n    for ( const AlertRule *rule : static_cast<const QList<AlertRule *>&>(ruleList) )\n    {\n        qCDebug(runtime) << \"Processing \" << *rule;\n        if ( rule->match(wsjtx) )\n        {\n            matchedRules << rule->ruleName;\n        }\n    }\n\n    if ( matchedRules.size() > 0 )\n    {\n        SpotAlert alert(matchedRules, wsjtx);\n        emit spotAlert(alert);\n    }\n}\n\nvoid AlertEvaluator::loadRules()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ruleList.size() > 0 )\n    {\n        clearRules();\n    }\n\n    QSqlQuery ruleStmt;\n\n    if ( ! ruleStmt.prepare(\"SELECT rule_name FROM alert_rules\") )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n    }\n    else\n    {\n        if ( ruleStmt.exec() )\n        {\n            while (ruleStmt.next())\n            {\n                AlertRule *rule;\n                rule = new AlertRule();\n                if ( rule )\n                {\n                    rule->load(ruleStmt.value(0).toString());\n                    ruleList.append(rule);\n                }\n            }\n        }\n        else\n        {\n            qInfo()<< \"Cannot get filters names from DB\" << ruleStmt.lastError();\n        }\n    }\n}\n\nAlertRule::AlertRule(QObject *parent) :\n    QObject(parent),\n    enabled(false),\n    sourceMap(SpotAlert::UKNOWN),\n    dxCountry(-1),\n    dxLogStatusMap(0),\n    spotterCountry(-1),\n    ituz(0),\n    cqz(0),\n    pota(false),\n    sota(false),\n    iota(false),\n    wwff(false),\n    ruleValid(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nbool AlertRule::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ruleName.isEmpty() )\n    {\n        qCDebug(runtime) << \"rule name is empty - do not save\";\n        return false;\n    }\n\n    QSqlQuery insertUpdateStmt;\n\n    if ( ! insertUpdateStmt.prepare(\"INSERT INTO alert_rules(rule_name, enabled, source, dx_callsign, dx_country, \"\n                                    \"dx_logstatus, dx_continent, spot_comment, mode, band, spotter_country, spotter_continent, dx_member, ituz, cqz, pota, sota, iota, wwff) \"\n                                    \" VALUES (:ruleName, :enabled, :source, :dxCallsign, :dxCountry, \"\n                                    \":dxLogstatus, :dxContinent, :spotComment, :mode, :band, :spotterCountry, :spotterContinent, :dxMember, :ituz, :cqz, :pota, :sota, :iota, :wwff) \"\n                                    \" ON CONFLICT(rule_name) DO UPDATE SET enabled = :enabled, source = :source, dx_callsign =:dxCallsign, \"\n                                    \"dx_country = :dxCountry, dx_logstatus = :dxLogstatus, dx_continent = :dxContinent, spot_comment = :spotComment, \"\n                                    \"mode = :mode, band = :band, spotter_country = :spotterCountry, spotter_continent = :spotterContinent, dx_member = :dxMember, ituz = :ituz, cqz = :cqz, pota = :pota, sota = :sota, iota = :iota, wwff = :wwff \"\n                                    \" WHERE rule_name = :ruleName\"))\n    {\n        qWarning() << \"Cannot prepare insert/update Alert Rule statement\" << insertUpdateStmt.lastError();\n        return false;\n    }\n\n    insertUpdateStmt.bindValue(\":ruleName\", ruleName);\n    insertUpdateStmt.bindValue(\":enabled\", enabled);\n    insertUpdateStmt.bindValue(\":source\", sourceMap);\n    insertUpdateStmt.bindValue(\":dxCallsign\", dxCallsign);\n    insertUpdateStmt.bindValue(\":dxCountry\", dxCountry);\n    insertUpdateStmt.bindValue(\":dxLogstatus\", dxLogStatusMap);\n    insertUpdateStmt.bindValue(\":dxContinent\", dxContinent);\n    insertUpdateStmt.bindValue(\":dxMember\", dxMember.join(\",\"));\n    insertUpdateStmt.bindValue(\":spotComment\", dxComment);\n    insertUpdateStmt.bindValue(\":mode\", mode);\n    insertUpdateStmt.bindValue(\":band\", band);\n    insertUpdateStmt.bindValue(\":spotterCountry\", spotterCountry);\n    insertUpdateStmt.bindValue(\":spotterContinent\", spotterContinent);\n    insertUpdateStmt.bindValue(\":cqz\", cqz);\n    insertUpdateStmt.bindValue(\":ituz\", ituz);\n    insertUpdateStmt.bindValue(\":pota\", pota);\n    insertUpdateStmt.bindValue(\":sota\", sota);\n    insertUpdateStmt.bindValue(\":iota\", iota);\n    insertUpdateStmt.bindValue(\":wwff\", wwff);\n\n    if ( ! insertUpdateStmt.exec() )\n    {\n        qCDebug(runtime)<< \"Cannot Update Alert Rules - \" << insertUpdateStmt.lastError().text();\n        return false;\n    }\n    return true;\n}\n\nbool AlertRule::load(const QString &in_ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_ruleName;\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT rule_name, enabled, source, dx_callsign, dx_country, dx_logstatus, \"\n                         \"dx_continent, spot_comment, mode, band, spotter_country, spotter_continent, dx_member, ituz, cqz, pota, sota, iota, wwff \"\n                         \"FROM alert_rules \"\n                         \"WHERE rule_name = :rule\") )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return false;\n    }\n\n    query.bindValue(\":rule\", in_ruleName);\n\n    if ( query.exec() )\n    {\n        query.next();\n\n        QSqlRecord record = query.record();\n\n        ruleName         = in_ruleName;\n        enabled          = record.value(\"enabled\").toBool();\n        sourceMap        = record.value(\"source\").toInt();\n        dxCallsign       = record.value(\"dx_callsign\").toString();\n        dxCountry        = record.value(\"dx_country\").toInt();\n        dxLogStatusMap   = record.value(\"dx_logstatus\").toInt();\n        dxContinent      = record.value(\"dx_continent\").toString();\n        dxComment        = record.value(\"spot_comment\").toString();\n        dxMember         = record.value(\"dx_member\").toString().split(\",\");\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n        dxMemberSet      = QSet<QString>(dxMember.begin(), dxMember.end());\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n        dxMemberSet      = QSet<QString>(QSet<QString>::fromList(dxMember));\n#endif\n        mode             = record.value(\"mode\").toString();\n        band             = record.value(\"band\").toString();\n        spotterCountry   = record.value(\"spotter_country\").toInt();\n        spotterContinent = record.value(\"spotter_continent\").toString();\n        ituz             = record.value(\"ituz\").toInt();\n        cqz              = record.value(\"cqz\").toInt();\n        pota             = record.value(\"pota\").toBool();\n        sota             = record.value(\"sota\").toBool();\n        iota             = record.value(\"iota\").toBool();\n        wwff             = record.value(\"wwff\").toBool();\n\n        callsignRE.setPattern(dxCallsign);\n        callsignRE.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n\n        commentRE.setPattern(dxComment);\n        commentRE.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    }\n    else\n    {\n        qCDebug(runtime) << \"SQL execution error: \" << query.lastError().text();\n        return false;\n    }\n\n    qCDebug(runtime) << \"Rule: \" << ruleName << \" was loaded\";\n\n    ruleValid = true;\n    return true;\n}\n\nbool AlertRule::match(const WsjtxEntry &wsjtx) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wsjtx;\n\n    auto fail = [&]() -> bool\n    {\n        qCDebug(runtime) << \"Rule name:\" << ruleName << \"- result false\";\n        return false;\n    };\n\n    /* the first part validates a primitive types */\n    if ( !isValid() || !enabled )                     return fail();\n    if ( !(sourceMap & SpotAlert::WSJTXCQSPOT) )      return fail();\n\n    if ( dxCountry && dxCountry != wsjtx.dxcc.dxcc )  return fail();\n    if ( ituz      && ituz      != wsjtx.dxcc.ituz )  return fail();\n    if ( cqz       && cqz       != wsjtx.dxcc.cqz )   return fail();\n    if ( pota || sota || iota || wwff )\n    {\n        const bool refMatch =\n               (pota && wsjtx.containsPOTA)\n            || (sota && wsjtx.containsSOTA)\n            || (iota && wsjtx.containsIOTA)\n            || (wwff && wsjtx.containsWWFF);\n\n        if ( !refMatch ) return fail();\n    }\n\n    if ( !(wsjtx.status & dxLogStatusMap) ) return fail();\n\n    if ( mode != \"*\" )\n    {\n        const QString &group = BandPlan::isFTxMode(wsjtx.decodedMode)\n            ? BandPlan::MODE_GROUP_STRING_FTx\n            : BandPlan::MODE_GROUP_STRING_DIGITAL;\n        if ( !mode.contains(QLatin1Char('|') + group) ) return fail();\n    }\n\n    if ( band != \"*\" && !band.contains(QLatin1Char('|') + wsjtx.band) )  return fail();\n\n    if ( spotterCountry && spotterCountry != wsjtx.dxcc_spotter.dxcc) return fail();\n    if ( dxContinent != \"*\" && !dxContinent.contains(QLatin1Char('|') + wsjtx.dxcc.cont)) return fail();\n    if ( spotterContinent != \"*\" && !spotterContinent.contains(QLatin1Char('|') + wsjtx.dxcc_spotter.cont)) return fail();\n\n    if ( !(dxMember.size() == 1 && dxMember.front() == QLatin1String(\"*\")))\n    {\n        if ( !wsjtx.memberList2Set().intersects(dxMemberSet) ) return fail();\n    }\n\n    qCDebug(runtime) << \"Rule match - phase 1 - OK\";\n    qCDebug(runtime) << \"Callsign RE\" << callsignRE.pattern();\n    qCDebug(runtime) << \"Comment RE\" << commentRE.pattern();\n\n    const bool ret = callsignRE.match(wsjtx.callsign).hasMatch()\n                     && commentRE.match(wsjtx.decode.message).hasMatch();\n\n    qCDebug(runtime) << \"Rule name: \" << ruleName << \" - result \" << ret;\n    return ret;\n}\n\nbool AlertRule::match(const DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << spot;\n\n    auto fail = [&]() -> bool\n    {\n        qCDebug(runtime) << \"Rule name:\" << ruleName << \"- result false\";\n        return false;\n    };\n\n    /* the first part validates a primitive types */\n    if ( !isValid() || !enabled )         return fail();\n    if ( !(sourceMap & SpotAlert::DXSPOT) )  return fail();\n\n    if ( dxCountry != 0 && dxCountry != spot.dxcc.dxcc ) return fail();\n    if ( ituz      != 0 && ituz      != spot.dxcc.ituz ) return fail();\n    if ( cqz       != 0 && cqz       != spot.dxcc.cqz )  return fail();\n    if ( pota || sota || iota || wwff )\n    {\n        const bool refMatch =\n               (pota && spot.containsPOTA)\n            || (sota && spot.containsSOTA)\n            || (iota && spot.containsIOTA)\n            || (wwff && spot.containsWWFF);\n\n        if ( !refMatch ) return fail();\n    }\n\n    if ( !(spot.status & dxLogStatusMap) ) return fail();\n\n    if ( mode != \"*\" )\n    {\n        if (spot.modeGroupString.isEmpty()) return fail();\n        if (!mode.contains(QLatin1Char('|') + spot.modeGroupString)) return fail();\n    }\n\n    if ( band != \"*\" )\n    {\n        if (spot.band.isEmpty()) return fail();\n        if (!band.contains(QLatin1Char('|') + spot.band)) return fail();\n    }\n\n    if ( spotterCountry != 0 && spotterCountry != spot.dxcc_spotter.dxcc ) return fail();\n\n    if ( dxContinent != \"*\" )\n    {\n        if ( spot.dxcc.cont.isEmpty() )              return fail();\n        if ( !dxContinent.contains(QLatin1Char('|') + spot.dxcc.cont) ) return fail();\n    }\n\n    if ( spotterContinent != \"*\" )\n    {\n        if ( spot.dxcc_spotter.cont.isEmpty() ) return fail();\n        if ( !spotterContinent.contains(QLatin1Char('|') + spot.dxcc_spotter.cont) ) return fail();\n    }\n\n    if ( !(dxMember.size() == 1 && dxMember.front() == QLatin1String(\"*\")) )\n    {\n        if (!spot.memberList2Set().intersects(dxMemberSet)) return fail();\n    }\n\n    qCDebug(runtime) << \"Rule match - phase 1 - OK\";\n    qCDebug(runtime) << \"Callsign RE\" << callsignRE.pattern();\n    qCDebug(runtime) << \"Comment RE\" << commentRE.pattern();\n\n    const bool ret =\n        callsignRE.match(spot.callsign).hasMatch() &&\n        commentRE.match(spot.comment).hasMatch();\n\n    qCDebug(runtime) << \"Rule name:\" << ruleName << \"- result\" << ret;\n    return ret;\n}\n\nbool AlertRule::isValid() const\n{\n    FCT_IDENTIFICATION;\n\n    return ruleValid;\n}\n\nAlertRule::operator QString() const\n{\n    return QString(\"AlerRule: \")\n            + \"(\"\n            + \"Rule Name: \"        + ruleName + \"; \"\n            + \"isValid: \"          + QString::number(isValid()) + \"; \"\n            + \"Enabled: \"          + QString::number(enabled) + \"; \"\n            + \"SourceMap: 0b\"      + QString::number(sourceMap,2) + \"; \"\n            + \"dxCallsign: \"       + dxCallsign + \"; \"\n            + \"CQZ: \"              + QString::number(cqz) + \"; \"\n            + \"ITUZ: \"             + QString::number(ituz) + \"; \"\n            + \"POTA: \"             + (pota ? \"true\" : \"false\") + \"; \"\n            + \"SOTA: \"             + (sota ? \"true\" : \"false\") + \"; \"\n            + \"IOTA: \"             + (iota ? \"true\" : \"false\") + \"; \"\n            + \"WWFF: \"             + (wwff ? \"true\" : \"false\") + \"; \"\n            + \"dxMember: \"         + dxMember.join(\", \") + \"; \"\n            + \"dxCountry: \"        + QString::number(dxCountry) + \"; \"\n            + \"dxLogStatusMap: 0b\" + QString::number(dxLogStatusMap,2) + \"; \"\n            + \"dxComment: \"        + dxComment + \"; \"\n            + \"mode: \"             + mode + \"; \"\n            + \"band: \"             + band + \"; \"\n            + \"spotterCountry: \"   + QString::number(spotterCountry) + \"; \"\n            + \"spotterContinent: \" + spotterContinent + \"; \"\n            + \")\";\n}\n"
  },
  {
    "path": "core/AlertEvaluator.h",
    "content": "#ifndef QLOG_CORE_ALERTEVALUATOR_H\n#define QLOG_CORE_ALERTEVALUATOR_H\n\n#include <QObject>\n#include \"data/DxSpot.h\"\n#include \"data/WsjtxEntry.h\"\n#include \"data/SpotAlert.h\"\n#include <QRegularExpression>\n\nclass AlertRule : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit AlertRule(QObject *parent = nullptr);\n    ~AlertRule() {};\n\n    bool save();\n    bool load(const QString &);\n    bool match(const WsjtxEntry &wsjtx) const;\n    bool match(const DxSpot & spot) const;\n    bool isValid() const;\n    operator QString() const;\npublic:\n    QString ruleName;\n    bool enabled;\n    int sourceMap;\n    QString dxCallsign;\n    int dxCountry;\n    int dxLogStatusMap;\n    QString dxContinent;\n    QString dxComment;\n    QStringList dxMember;\n    QString mode;\n    QString band;\n    int spotterCountry;\n    QString spotterContinent;\n    int ituz;\n    int cqz;\n    bool pota;\n    bool sota;\n    bool iota;\n    bool wwff;\n\nprivate:\n    bool ruleValid;\n    QRegularExpression callsignRE;\n    QRegularExpression commentRE;\n    QSet<QString> dxMemberSet;\n\n};\n\nclass AlertEvaluator : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit AlertEvaluator(QObject *parent = nullptr);\n    ~AlertEvaluator() {clearRules();}\n\n    void clearRules();\n\npublic slots:\n    void dxSpot(const DxSpot&);\n    void WSJTXCQSpot(const WsjtxEntry&);\n    void loadRules();\n\nsignals:\n    void spotAlert(SpotAlert alert);\n\nprivate:\n    QList<AlertRule *>ruleList;\n};\n\n#endif // QLOG_CORE_ALERTEVALUATOR_H\n"
  },
  {
    "path": "core/AppGuard.cpp",
    "content": "#include <QCryptographicHash>\n#include <QLoggingCategory>\n#if QT_VERSION >= QT_VERSION_CHECK(6,6,0)\n#include <QNativeIpcKey>\n#endif\n#include \"AppGuard.h\"\n#include \"debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.appguard\");\nnamespace\n{\n\n    QString generateKeyHash( const QString& key, const QString& salt )\n    {\n        QByteArray data;\n\n        data.append( key.toUtf8() );\n        data.append( salt.toUtf8() );\n        data = QCryptographicHash::hash( data, QCryptographicHash::Sha1 ).toHex();\n\n        return data;\n    }\n\n}\n\nAppGuard::AppGuard( const QString& key )\n    : key( key )\n    , memLockKey( generateKeyHash( key, \"_memLockKey\" ) )\n    , sharedmemKey( generateKeyHash( key, \"_sharedmemKey\" ) )\n    , sharedMem(\n#if QT_VERSION >= QT_VERSION_CHECK(6,6,0)\n          QSharedMemory::legacyNativeKey(sharedmemKey)\n#else\n          sharedmemKey\n#endif\n )\n    , memLock(\n#if QT_VERSION >= QT_VERSION_CHECK(6,6,0)\n          QSystemSemaphore::legacyNativeKey(memLockKey),\n#else\n          memLockKey,\n#endif\n     1 )\n{\n    FCT_IDENTIFICATION;\n\n    memLock.acquire();\n    {\n        // linux / unix shared memory is not freed when the application terminates abnormally,\n        // so you need to get rid of the garbage\n\n        QSharedMemory fix(\n#if QT_VERSION >= QT_VERSION_CHECK(6,6,0)\n            QSharedMemory::legacyNativeKey(sharedmemKey)\n#else\n            sharedmemKey\n#endif\n                         );\n        if ( fix.attach() )\n        {\n            fix.detach();\n        }\n    }\n    memLock.release();\n}\n\nAppGuard::~AppGuard()\n{\n    release();\n}\n\nbool AppGuard::isAnotherRunning(void)\n{\n    FCT_IDENTIFICATION;\n\n    if ( sharedMem.isAttached() )\n        return false;\n\n    memLock.acquire();\n    const bool isRunning = sharedMem.attach();\n\n    if ( isRunning )\n    {\n        sharedMem.detach();\n    }\n\n    memLock.release();\n\n    return isRunning;\n}\n\nbool AppGuard::tryToRun(void)\n{\n    FCT_IDENTIFICATION;\n\n    if ( isAnotherRunning() )   // Extra check\n    {\n        return false;\n    }\n\n    memLock.acquire();\n\n    // The following 'attach' call is a workaround required for 'create' to run properly under QT 6.6 and MacOS.\n    // See more details about it in issue #257.\n    // It has no impact on other platforms and versions of Qt, therefore there is no compilation condition.\n    sharedMem.attach();\n\n    const bool result = sharedMem.create( sizeof( quint64 ) );\n    memLock.release();\n    if ( !result )\n    {\n        release();\n        return false;\n    }\n\n    return true;\n}\n\nvoid AppGuard::release(void)\n{\n    FCT_IDENTIFICATION;\n\n    memLock.acquire();\n\n    if ( sharedMem.isAttached() )\n    {\n        sharedMem.detach();\n    }\n\n    memLock.release();\n}\n"
  },
  {
    "path": "core/AppGuard.h",
    "content": "#ifndef QLOG_CORE_APPGUARD_H\n#define QLOG_CORE_APPGUARD_H\n\n#include <QObject>\n#include <QSharedMemory>\n#include <QSystemSemaphore>\n\nclass AppGuard\n{\n\npublic:\n    explicit AppGuard( const QString& key );\n    ~AppGuard();\n\n    bool isAnotherRunning(void);\n    bool tryToRun(void);\n    void release(void);\n\nprivate:\n    const QString key;\n    const QString memLockKey;\n    const QString sharedmemKey;\n\n    QSharedMemory sharedMem;\n    QSystemSemaphore memLock;\n\n    Q_DISABLE_COPY( AppGuard )\n};\n\n#endif // QLOG_CORE_APPGUARD_H\n"
  },
  {
    "path": "core/CallbookManager.cpp",
    "content": "#include <QCache>\n#include \"CallbookManager.h\"\n#include \"core/debug.h\"\n#include \"service/hamqth/HamQTH.h\"\n#include \"service/qrzcom/QRZ.h\"\n#include \"data/Callsign.h\"\n#include \"LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.callbookmanager\");\n\nCallbookManager::CallbookManager(QObject *parent)\n    : QObject{parent},\n    primaryCallbookAuthSuccess(false),\n    secondaryCallbookAuthSuccess(false)\n{\n    FCT_IDENTIFICATION;\n\n    initCallbooks();\n}\n\nvoid CallbookManager::queryCallsign(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    if ( queryCache.contains(callsign) )\n    {\n        emit callsignResult(CallbookResponseData(*queryCache.object(callsign)));\n        return;\n    }\n\n    // create an empty object in cache\n    // if there is the second query for the same call immediately after\n    // the first query, then it returns a result of empty object\n    queryCache.insert(callsign, new CallbookResponseData);\n\n    if ( !primaryCallbook.isNull() )\n    {\n        currentQueryCallsign = callsign;\n        primaryCallbook->queryCallsign(currentQueryCallsign);\n    }\n    else\n    {\n        queryCache.remove(callsign);\n        emit callsignNotFound(callsign);\n    }\n}\n\nbool CallbookManager::isActive()\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = primaryCallbookAuthSuccess || secondaryCallbookAuthSuccess;\n    qCDebug(runtime) << ret;\n    return ret;\n}\n\nGenericCallbook *CallbookManager::createCallbook(const QString &callbookID)\n{\n    FCT_IDENTIFICATION;\n\n    GenericCallbook *ret = nullptr;\n\n    if (callbookID == HamQTHCallbook::CALLBOOK_NAME )\n    {\n        ret = new HamQTHCallbook(this);\n    }\n    else if ( callbookID == QRZCallbook::CALLBOOK_NAME )\n    {\n        ret = new QRZCallbook(this);\n    }\n\n    if ( ret )\n    {\n        connect(ret, &GenericCallbook::callsignResult, this, &CallbookManager::processCallsignResult);\n    }\n\n    return ret;\n}\n\nvoid CallbookManager::initCallbooks()\n{\n    primaryCallbook.clear();\n    secondaryCallbook.clear();\n    primaryCallbookAuthSuccess = false;\n    secondaryCallbookAuthSuccess = false;\n\n    queryCache.clear();\n    currentQueryCallsign = QString();\n\n    primaryCallbook = createCallbook(LogParam::getPrimaryCallbook(GenericCallbook::CALLBOOK_NAME));\n    secondaryCallbook = createCallbook(LogParam::getSecondaryCallbook(GenericCallbook::CALLBOOK_NAME));\n\n    if ( !primaryCallbook.isNull() )\n    {\n        connect(primaryCallbook, &GenericCallbook::callsignNotFound, this, &CallbookManager::primaryCallbookCallsignNotFound);\n        connect(primaryCallbook, &GenericCallbook::loginFailed, this, [this]()\n        {\n            primaryCallbookAuthSuccess = false;\n            emit loginFailed(primaryCallbook->getDisplayName());\n        });\n        connect(primaryCallbook, &GenericCallbook::lookupError, this, [this](const QString &error)\n        {\n            emit lookupError(primaryCallbook->getDisplayName()\n                             + \" - \" + error\n                             + ((!secondaryCallbook.isNull()) ? tr(\"<p>The secondary callbook will be used</p>\") : \"\"));\n            primaryCallbookCallsignNotFound(currentQueryCallsign);\n        });\n        primaryCallbookAuthSuccess = true;\n    }\n\n    if ( !secondaryCallbook.isNull() )\n    {\n        connect(secondaryCallbook, &GenericCallbook::callsignNotFound, this, &CallbookManager::secondaryCallbookCallsignNotFound);\n        connect(secondaryCallbook, &GenericCallbook::loginFailed, this, [this]()\n        {\n            secondaryCallbookAuthSuccess = false;\n            emit loginFailed(secondaryCallbook->getDisplayName());\n        });\n        connect(secondaryCallbook, &GenericCallbook::lookupError, this, [this](const QString &error)\n        {\n            emit lookupError(secondaryCallbook->getDisplayName() + \" - \" + error);\n            secondaryCallbookCallsignNotFound(currentQueryCallsign);\n        });\n        secondaryCallbookAuthSuccess = true;\n    }\n}\n\nvoid CallbookManager::abortQuery()\n{\n    FCT_IDENTIFICATION;\n\n    queryCache.remove(currentQueryCallsign);\n    if ( ! primaryCallbook.isNull() ) primaryCallbook->abortQuery();\n    if ( ! secondaryCallbook.isNull() ) secondaryCallbook->abortQuery();\n}\n\nvoid CallbookManager::primaryCallbookCallsignNotFound(const QString &notFoundCallsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << notFoundCallsign;\n\n    queryCache.remove(notFoundCallsign);\n\n    if ( notFoundCallsign != currentQueryCallsign ) return ;\n\n    if ( secondaryCallbook.isNull() )\n    {\n        emit callsignNotFound(notFoundCallsign);\n        return;\n    }\n\n    qCDebug(runtime) << \"Callsign not found - primary - trying the secondary callbook\";\n\n    secondaryCallbook->queryCallsign(notFoundCallsign);\n}\n\nvoid CallbookManager::secondaryCallbookCallsignNotFound(const QString &notFoundCallsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << notFoundCallsign;\n\n    queryCache.remove(notFoundCallsign);\n\n    if ( notFoundCallsign != currentQueryCallsign ) return ;\n\n    qCDebug(runtime) << \"Callsign not found - secondary \";\n\n    emit callsignNotFound(notFoundCallsign);\n}\n\nvoid CallbookManager::processCallsignResult(const CallbookResponseData &data)\n{\n    FCT_IDENTIFICATION;\n\n    CallbookResponseData *cacheData = new CallbookResponseData;\n    *cacheData = data;\n    queryCache.insert(data.call, cacheData);\n\n    // Callbook returned queried callsign\n    if ( data.call == currentQueryCallsign )\n    {\n        emit callsignResult(data);\n        return;\n    }\n\n    Callsign queryCall(currentQueryCallsign);\n\n    if ( ! queryCall.isValid() )\n    {\n        qCDebug(runtime) << \"Query callsign is not valid \" << currentQueryCallsign;\n        return;\n    }\n\n    // If not exists full match record for example for SP/OK1xxx in a callbook\n    // then callbooks return a partial result (usually base callsign) OK1xxx. In this case, QLog\n    // takes only selected fields from the callbook response.\n\n    if ( queryCall.getBase() == data.call )\n    {\n        qCDebug(runtime) << \"Partial match for result - forwarding limited set of information\";\n\n        CallbookResponseData newData;\n\n        newData.call = currentQueryCallsign;\n        newData.fname = data.fname;\n        newData.lname = data.lname;\n        newData.lic_year = data.lic_year;\n        newData.qsl_via = data.qsl_via;\n        newData.email = data.email;\n        newData.born = data.born;\n        newData.url = data.url;\n        newData.name_fmt = data.name_fmt;\n        newData.nick = data.nick;\n        newData.image_url = data.image_url;\n\n        CallbookResponseData *cdata = new CallbookResponseData;\n        *cdata = newData;\n\n        queryCache.insert(currentQueryCallsign, cdata);\n        emit callsignResult(newData);\n    }\n}\n\nQCache<QString, CallbookResponseData> CallbookManager::queryCache(100);\n"
  },
  {
    "path": "core/CallbookManager.h",
    "content": "#ifndef QLOG_CORE_CALLBOOKMANAGER_H\n#define QLOG_CORE_CALLBOOKMANAGER_H\n\n#include <QObject>\n#include <QPointer>\n#include \"service/GenericCallbook.h\"\n\nclass CallbookManager : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit CallbookManager(QObject *parent = nullptr);\n\n    void queryCallsign(const QString &callsign);\n    bool isActive();\n\nsignals:\n    void loginFailed(QString);\n    void callsignResult(CallbookResponseData);\n    void callsignNotFound(QString);\n    void lookupError(QString);\n\npublic slots:\n    void initCallbooks();\n    void abortQuery();\n\nprivate slots:\n    void primaryCallbookCallsignNotFound(const QString&);\n    void secondaryCallbookCallsignNotFound(const QString&);\n    void processCallsignResult(const CallbookResponseData &data);\n\nprivate:\n    GenericCallbook *createCallbook(const QString&);\n\nprivate:\n    QPointer<GenericCallbook> primaryCallbook;\n    bool primaryCallbookAuthSuccess;\n    QPointer<GenericCallbook> secondaryCallbook;\n    bool secondaryCallbookAuthSuccess;\n    QString currentQueryCallsign;\n    static QCache<QString, CallbookResponseData> queryCache;\n\n};\n\n#endif // QLOG_CORE_CALLBOOKMANAGER_H\n"
  },
  {
    "path": "core/CredentialStore.cpp",
    "content": "#include <QEventLoop>\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n#include <qt5keychain/keychain.h>\n#else\n#include <qt6keychain/keychain.h>\n#endif\n#include <QApplication>\n#include <QMessageBox>\n#include <QJsonDocument>\n#include <QJsonObject>\n#include <QJsonArray>\n#include <openssl/rand.h>\n#include \"CredentialStore.h\"\n#include \"core/debug.h\"\n#include \"core/PasswordCipher.h\"\n#include \"core/LogParam.h\"\n#include \"core/LogDatabase.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.credentialstore\");\n\nusing namespace QKeychain;\n\nCredentialRegistry &CredentialRegistry::instance()\n{\n    static CredentialRegistry r;\n    return r;\n}\n\nvoid CredentialRegistry::add(const QString &, const std::function<QList<CredentialDescriptor>()> &fn)\n{\n    callbacks.append(fn);\n}\n\nQList<CredentialDescriptor> CredentialRegistry::allDescriptors() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<CredentialDescriptor> result;\n\n    for ( const std::function<QList<CredentialDescriptor>()> &fn : callbacks ) result.append(fn());\n    return result;\n}\n\nCredentialStore::CredentialStore(QObject *parent) : QObject(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\nint CredentialStore::savePassword(const QString &storage_key, const QString &user, const QString &pass)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << storage_key << \" \" << user;\n\n    if ( user.isEmpty() || storage_key.isEmpty() || pass.isEmpty() )\n       return 1;\n\n    QString locStorageKey = qApp->applicationName() + \":\" + storage_key;\n    QString locUser = user;\n    QString locPass = pass;\n    QEventLoop loop;\n\n    // write a password to Credential Storage\n    WritePasswordJob job(QLatin1String(locStorageKey.toStdString().c_str()));\n    job.setAutoDelete(false);\n#ifdef Q_OS_WIN\n    // see more qtkeychain issue #105\n    locUser.prepend(locStorageKey + \":\");\n#endif\n    job.setKey(locUser);\n    job.setTextData(locPass);\n\n    job.connect(&job, &WritePasswordJob::finished, &loop, &QEventLoop::quit);\n\n    job.start();\n    loop.exec();\n\n    if ( job.error() && job.error() != EntryNotFound )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Critical\"),\n                              QMessageBox::tr(\"Cannot save a password for %1 to the Credential Store\").arg(storage_key)\n                              + \"<p>\"\n                              + job.errorString());\n        qWarning() << \"Cannot save a password. Error \" << job.errorString();\n        return 1;\n    }\n\n    return 0;\n}\n\nQString CredentialStore::getPassword(const QString &storage_key, const QString &user)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << storage_key << \" \" << user;\n\n    if ( user.isEmpty() || storage_key.isEmpty() )\n        return QString();\n\n    QString locStorageKey = qApp->applicationName() + \":\" + storage_key;\n    QString locUser = user;\n    QString pass;\n    QEventLoop loop;\n\n    // get a password from Credential Storage\n    ReadPasswordJob job(QLatin1String(locStorageKey.toStdString().c_str()));\n    job.setAutoDelete(false);\n#ifdef Q_OS_WIN\n    // see more qtkeychain issue #105\n    locUser.prepend(locStorageKey + \":\");\n#endif\n    job.setKey(locUser);\n\n    job.connect(&job, &ReadPasswordJob::finished, &loop, &QEventLoop::quit);\n\n    job.start();\n    loop.exec();\n\n    pass = job.textData();\n\n    if ( job.error() && job.error() != EntryNotFound )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Critical\"),\n                              QMessageBox::tr(\"Cannot get a password for %1 from the Credential Store\").arg(storage_key)\n                              + \"<p>\"\n                              + job.errorString());\n        qCDebug(runtime) << \"Cannot get a password. Error \" << job.errorString();\n        return QString();\n    }\n\n    return pass;\n}\n\nvoid CredentialStore::deletePassword(const QString &storage_key, const QString &user)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << storage_key << \" \" << user;\n\n    if ( user.isEmpty() || storage_key.isEmpty() )\n        return;\n\n    QString locStorageKey = qApp->applicationName() + \":\" + storage_key;\n    QString locUser = user;\n    QEventLoop loop;\n\n    // delete password from Secure Storage\n    DeletePasswordJob job(QLatin1String(locStorageKey.toStdString().c_str()));\n    job.setAutoDelete(false);\n#ifdef Q_OS_WIN\n    // see more qtkeychain issue #105\n    locUser.prepend(locStorageKey + \":\");\n#endif\n    job.setKey(locUser);\n\n    job.connect(&job, &DeletePasswordJob::finished, &loop, &QEventLoop::quit);\n    job.start();\n\n    loop.exec();\n\n    return;\n}\n\nbool CredentialStore::exportPasswords(const QString &passphrase)\n{\n    FCT_IDENTIFICATION;\n\n    /*\n     * Password storage format:\n     * 1. Build JSON object:\n     *    {\n     *      \"credentials\": [\n     *        {\"storagekey\": \"...\", \"username\": \"...\", \"password\": \"...\"},\n     *        ...\n     *      ],\n     *      \"padding\": \"<base64 random 128-512 bytes>\"\n     *    }\n     * 2. Encrypt JSON with AES-256-GCM using passphrase (via PasswordCipher)\n     * 3. Store base64-encoded ciphertext in LogParam (\"security/encryptedpasswords\")\n     */\n\n    const QList<CredentialDescriptor> list = CredentialRegistry::instance().allDescriptors();\n\n    QJsonArray credArray;\n    for ( const CredentialDescriptor &desc : list )\n    {\n        QString user = desc.usernameFn();\n        QString pass = getPassword(desc.storageKey, user);\n\n        if ( !pass.isEmpty() )\n        {\n            QJsonObject entry;\n            entry[\"storagekey\"] = desc.storageKey;\n            entry[\"username\"] = user;\n            entry[\"password\"] = pass;\n            credArray.append(entry);\n        }\n    }\n\n    // generate random padding (128-512 bytes)\n    // add this padding to make it more difficult to estimate the length of passwords.\n    unsigned char randLenBuf[2];\n    if ( RAND_bytes(randLenBuf, 2) != 1 )\n    {\n        qWarning() << \"RAND_bytes failed for padding length\";\n        return false;\n    }\n    int paddingLen = 128 + (static_cast<int>((randLenBuf[0] << 8) | randLenBuf[1]) % (512 - 128 + 1));\n\n    QByteArray paddingRaw(paddingLen, '\\0');\n    if ( RAND_bytes(reinterpret_cast<unsigned char*>(paddingRaw.data()), paddingLen) != 1 )\n    {\n        qWarning() << \"RAND_bytes failed for padding data\";\n        return false;\n    }\n    QString paddingB64 = QString::fromLatin1(paddingRaw.toBase64());\n\n    QJsonObject root;\n    root[\"credentials\"] = credArray;\n    root[\"padding\"] = paddingB64;\n\n    const QByteArray json = QJsonDocument(root).toJson(QJsonDocument::Compact);\n\n    QByteArray blobB64;\n    if ( !PasswordCipher::encrypt(passphrase, json, blobB64) )\n    {\n        qWarning() << \"Password encryption failed\";\n        return false;\n    }\n\n    LogParam::setEncryptedPasswords(blobB64);\n    LogParam::setSourcePlatform(LogDatabase::currentPlatformId());\n\n    return true;\n}\n\nbool CredentialStore::importPasswords(const QString &passphrase)\n{\n    FCT_IDENTIFICATION;\n\n    /*\n     * Import process (reverse of exportPasswords):\n     * 1. Read base64-encoded ciphertext from LogParam (\"security/encryptedpasswords\")\n     * 2. Decrypt with AES-256-GCM using passphrase (via PasswordCipher)\n     * 3. Parse JSON and restore each credential to the credential store\n     *    (padding field is ignored)\n     */\n\n    QByteArray blobB64 = LogParam::getEncryptedPasswords();\n    if ( blobB64.isEmpty() )\n    {\n        qWarning() << \"No encrypted passwords found\";\n        return false;\n    }\n\n    QByteArray json;\n    if ( !PasswordCipher::decrypt(passphrase, blobB64, json) )\n    {\n        qWarning() << \"Password decryption failed\";\n        return false;\n    }\n\n    QJsonParseError parseError;\n    QJsonDocument doc = QJsonDocument::fromJson(json, &parseError);\n    if ( parseError.error != QJsonParseError::NoError )\n    {\n        qWarning() << \"JSON parse error:\" << parseError.errorString();\n        return false;\n    }\n\n    QJsonObject root = doc.object();\n    QJsonArray credArray = root[\"credentials\"].toArray();\n\n    for (const QJsonValue &val : static_cast<const QJsonArray>(credArray))\n    {\n        QJsonObject entry = val.toObject();\n        QString storageKey = entry[\"storagekey\"].toString();\n        QString username = entry[\"username\"].toString();\n        QString password = entry[\"password\"].toString();\n\n        if ( !storageKey.isEmpty() && !username.isEmpty() && !password.isEmpty() )\n            savePassword(storageKey, username, password);\n    }\n\n    return true;\n}\n\nvoid CredentialStore::deleteAllPasswords()\n{\n    FCT_IDENTIFICATION;\n\n    const QList<CredentialDescriptor> list = CredentialRegistry::instance().allDescriptors();\n\n    for (const CredentialDescriptor &desc : list)\n    {\n        QString user = desc.usernameFn();\n        if ( !user.isEmpty() )\n            deletePassword(desc.storageKey, user);\n    }\n}\n\nvoid CredentialStore::saveImportPassphrase(const QString &passphrase)\n{\n    FCT_IDENTIFICATION;\n\n    // special one-time password when QLog import external DB\n    savePassword(QStringLiteral(\"ImportPassphrase\"),\n                 QStringLiteral(\"import\"),\n                 passphrase);\n}\n\nQString CredentialStore::getImportPassphrase()\n{\n    FCT_IDENTIFICATION;\n\n    // special one-time password when QLog import external DB\n    return getPassword(QStringLiteral(\"ImportPassphrase\"),\n                       QStringLiteral(\"import\"));\n}\n\nvoid CredentialStore::deleteImportPassphrase()\n{\n    FCT_IDENTIFICATION;\n\n    // special one-time password when QLog import external DB\n    deletePassword(QStringLiteral(\"ImportPassphrase\"),\n                   QStringLiteral(\"import\"));\n}\n"
  },
  {
    "path": "core/CredentialStore.h",
    "content": "#ifndef QLOG_CORE_CREDENTIALSTORE_H\n#define QLOG_CORE_CREDENTIALSTORE_H\n\n#include <QObject>\n#include <QString>\n\n// - Central registry of all services that use the CredentialStore.\n// - Each service registers its credential descriptor statically at load time\n//   using the DECLARE_SECURE_SERVICE macro.\n// why:\n// - QtKeychain does not allow listing all stored passwords.\n// - To migrate data or validate access, we must know which services exist.\n// - This registry provides that authoritative list.\n\nstruct CredentialDescriptor\n{\n    QString storageKey;                     // unique key (e.g. \"eQSL\", \"HRDLog\")\n    std::function<QString()> usernameFn;    // callback returning the username\n};\n\nclass CredentialRegistry\n{\nprivate:\n\n    QList<std::function<QList<CredentialDescriptor>()>> callbacks;\n\npublic:\n    static CredentialRegistry &instance();\n\n    // Register a service descriptor callback.\n    // Each service provides a lambda returning one or more CredentialDescriptors.\n    void add(const QString &serviceName,\n             const std::function<QList<CredentialDescriptor>()> &fn);\n\n    // Returns all known credential descriptors (collected from all services).\n    QList<CredentialDescriptor> allDescriptors() const;\n};\n\n// Macro used in each service to force the presence of registerCredentials()\n// and to auto-execute it during static initialization.\n// If the developer forgets to implement registerCredentials(),\n// linking will fail with \"undefined reference\".\n#define DECLARE_SECURE_SERVICE(cls) \\\n    static void registerCredentials(); \\\n    static int cls##ForceRegistration() { \\\n        cls::registerCredentials(); \\\n        return 0; \\\n    } \\\n    static int cls##RegistrationDummy;\n\n#define REGISTRATION_SECURE_SERVICE(cls) \\\n    int cls::cls##RegistrationDummy = cls::cls##ForceRegistration()\n\ntemplate <typename Derived>\nclass SecureServiceBase;  // forward declaration\n\n// - Provides a single point of access to platform credential storage (QtKeychain).\n// - Ensures that only registered services can access credentials.\n// - Protected API: only subclasses (service classes) can call get/save/delete.\n// - Validation layer: prevents ad-hoc access from unregistered services.\n\nclass CredentialStore : public QObject\n{\n    Q_OBJECT\n\n    template <typename Derived>\n    friend class SecureServiceBase;\n\npublic:\n\n    static CredentialStore* instance()\n    {\n        static CredentialStore instance;\n        return &instance;\n    };\n\n    bool exportPasswords(const QString &passphrase);\n    bool importPasswords(const QString &passphrase);\n    void deleteAllPasswords();\n\n    // Methods for storing import passphrase in SecureStore during application restart\n    void saveImportPassphrase(const QString &passphrase);\n    QString getImportPassphrase();\n    void deleteImportPassphrase();\n\nprivate:\n    explicit CredentialStore(QObject *parent = nullptr);\n\n    // Protected methods — accessible only from derived service classes.\n    // Direct use elsewhere is discouraged by design.\n    int savePassword(const QString &storage_key, const QString &user, const QString &pass);\n    QString getPassword(const QString &storage_key, const QString &user);\n    void deletePassword(const QString &storage_key, const QString &user);\n\nprivate:\n    // Verifies that the given service (storage_key) is registered.\n    // Prevents code from querying or saving passwords.\n    //bool isRegisteredService(const QString &storage_key) const;\n};\n\n\n// - Base class for all components that manage user credentials.\n// - Enforces per-service registration and provides a safe API wrapper\n//   for accessing the CredentialStore.\n// - Prevents ad-hoc direct usage of CredentialStore.\n//\n\ntemplate <typename Derived>\nclass SecureServiceBase {\n\npublic:\n    virtual ~SecureServiceBase() {};\n\nprotected:\n    static QString getPassword(const QString &storageKey, const QString &user)\n    {\n        return CredentialStore::instance()->getPassword(storageKey, user);\n    }\n\n    static void savePassword(const QString &storageKey, const QString &user, const QString &pass)\n    {\n        CredentialStore::instance()->savePassword(storageKey, user, pass);\n    }\n\n    static void deletePassword(const QString &storageKey, const QString &user)\n    {\n        CredentialStore::instance()->deletePassword(storageKey, user);\n    }\n\n    SecureServiceBase() {\n        // --- Compile-time enforcement of registerCredentials() existence ---\n        typedef void (*RegFn)();\n        static_assert(\n            std::is_same<RegFn, decltype(&Derived::registerCredentials)>::value,\n            \"Derived class must implement: DECLARE_SECURE_SERVICE macro;\"\n        );\n    }\n};\n\n#endif // QLOG_CORE_CREDENTIALSTORE_H\n"
  },
  {
    "path": "core/EmergencyFrequency.cpp",
    "content": "#include \"EmergencyFrequency.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.emergencyfrequency\");\n\ndouble EmergencyFrequency::TOLERANCE_MHZ = 0.001;\n\nconst QList<EmergencyFreqEntry> &EmergencyFrequency::list()\n{\n    FCT_IDENTIFICATION;\n\n    static const QList<EmergencyFreqEntry> freqs =\n    {\n        {   3.760, \"LSB\"},\n        {   7.110, \"LSB\"},\n        {  14.300, \"USB\"},\n        {  18.160, \"USB\"},\n        {  21.360, \"USB\"},\n        { 145.550, \"FM\"},\n        { 433.550, \"FM\"},\n    };\n    return freqs;\n}\n\nconst EmergencyFreqEntry *EmergencyFrequency::inBand(double startMHz, double endMHz)\n{\n    FCT_IDENTIFICATION;\n\n    for ( const EmergencyFreqEntry &entry : list() )\n        if ( entry.frequency >= startMHz && entry.frequency <= endMHz )\n            return &entry;\n\n    return nullptr;\n}\n\nconst EmergencyFreqEntry *EmergencyFrequency::findEmergency(double freqMHz)\n{\n    FCT_IDENTIFICATION;\n\n    const QList<EmergencyFreqEntry> &freqs = EmergencyFrequency::list();\n\n    for ( const EmergencyFreqEntry &entry : freqs )\n        if ( qAbs(freqMHz - entry.frequency) <= EmergencyFrequency::TOLERANCE_MHZ )\n            return &entry;\n\n    return nullptr;\n}\n"
  },
  {
    "path": "core/EmergencyFrequency.h",
    "content": "#ifndef QLOG_CORE_EMERGENCYFREQUENCY_H\n#define QLOG_CORE_EMERGENCYFREQUENCY_H\n\n#include <QString>\n\nstruct EmergencyFreqEntry\n{\n    double  frequency;    // MHz\n    QString mode;\n};\n\nclass EmergencyFrequency\n{\npublic:\n    static double TOLERANCE_MHZ;\n    static const QList<EmergencyFreqEntry> &list();\n    static const EmergencyFreqEntry *inBand(double startMHz, double endMHz);\n    static const EmergencyFreqEntry *findEmergency(double freqMHz);\n};\n\n#endif // QLOG_CORE_EMERGENCYFREQUENCY_H\n"
  },
  {
    "path": "core/FileCompressor.cpp",
    "content": "#include <QFile>\n#include <QFileInfo>\n#include <QProgressDialog>\n#include <QCoreApplication>\n#include <zlib.h>\n#include \"FileCompressor.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.filecompressor\");\n\nQByteArray FileCompressor::gzip(const QByteArray &in)\n{\n    FCT_IDENTIFICATION;\n\n    if ( in.isEmpty() )\n        return {};\n\n    z_stream strm{};\n\n    // 16 + MAX_WBITS = gzip format\n    if ( deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED,\n                      16 + MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK )\n        return {};\n\n    strm.next_in = reinterpret_cast<Bytef*>(const_cast<char*>(in.data()));\n    strm.avail_in = static_cast<uInt>(in.size());\n\n    QByteArray out;\n    char buf[8192];\n    int ret;\n\n    do\n    {\n        strm.next_out = reinterpret_cast<Bytef*>(buf);\n        strm.avail_out = sizeof(buf);\n\n        ret = deflate(&strm, Z_FINISH);\n\n        if ( ret == Z_OK || ret == Z_STREAM_END )\n            out.append(buf, static_cast<qsizetype>(sizeof(buf) - strm.avail_out));\n    }\n    while ( ret == Z_OK );\n\n    deflateEnd(&strm);\n\n    return (ret == Z_STREAM_END) ? out : QByteArray{};\n}\n\nQByteArray FileCompressor::gunzip(const QByteArray &in)\n{\n    FCT_IDENTIFICATION;\n\n    if ( in.isEmpty() )\n        return {};\n\n    z_stream strm{};\n\n    strm.next_in = reinterpret_cast<Bytef*>(const_cast<char*>(in.data()));\n    strm.avail_in = static_cast<uInt>(in.size());\n\n    // 16 + MAX_WBITS tells zlib to parse gzip header/footer\n    if ( inflateInit2(&strm, 16 + MAX_WBITS) != Z_OK )\n        return {};\n\n    QByteArray out;\n    char buf[8192];\n    int ret = Z_OK;\n\n    while ( ret == Z_OK )\n    {\n        strm.next_out = reinterpret_cast<Bytef*>(buf);\n        strm.avail_out = sizeof(buf);\n\n        ret = inflate(&strm, Z_NO_FLUSH);\n\n        if ( ret == Z_OK || ret == Z_STREAM_END )\n            out.append(buf, static_cast<qsizetype>(sizeof(buf) - strm.avail_out));\n    }\n\n    inflateEnd(&strm);\n\n    return out;\n}\n\nbool FileCompressor::gzipFile(const QString &sourceFile, const QString &destFile,\n                              const ProgressCallback &progress)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << sourceFile << \"->\" << destFile;\n\n    QFile source(sourceFile);\n    if ( !source.open(QIODevice::ReadOnly) )\n    {\n        qWarning() << \"Cannot open source file:\" << sourceFile;\n        return false;\n    }\n\n    QFile dest(destFile);\n    if ( !dest.open(QIODevice::WriteOnly) )\n    {\n        qWarning() << \"Cannot create dest file:\" << destFile;\n        return false;\n    }\n\n    const qint64 totalSize = source.size();\n\n    // Initialize zlib for gzip compression\n    z_stream strm{};\n\n    // 16 + MAX_WBITS = gzip format,\n    if ( deflateInit2(&strm, Z_BEST_SPEED, Z_DEFLATED,\n                      16 + MAX_WBITS, 8, Z_DEFAULT_STRATEGY) != Z_OK )\n    {\n        qWarning() << \"deflateInit2 failed\";\n        return false;\n    }\n\n    char inBuffer[65536];\n    char outBuffer[65536];\n    qint64 bytesProcessed = 0;\n    bool success = true;\n    int ret;\n\n    while ( success )\n    {\n        qint64 bytesRead = source.read(inBuffer, sizeof(inBuffer));\n        if ( bytesRead < 0 )\n        {\n            qWarning() << \"Read error\";\n            success = false;\n            break;\n        }\n\n        strm.next_in = reinterpret_cast<Bytef*>(inBuffer);\n        strm.avail_in = static_cast<uInt>(bytesRead);\n\n        int flush = source.atEnd() ? Z_FINISH : Z_NO_FLUSH;\n\n        do\n        {\n            strm.next_out = reinterpret_cast<Bytef*>(outBuffer);\n            strm.avail_out = sizeof(outBuffer);\n\n            ret = deflate(&strm, flush);\n            if ( ret == Z_STREAM_ERROR )\n            {\n                qWarning() << \"deflate error\";\n                success = false;\n                break;\n            }\n\n            qint64 have = sizeof(outBuffer) - strm.avail_out;\n            if ( dest.write(outBuffer, have) != have )\n            {\n                qWarning() << \"Write error\";\n                success = false;\n                break;\n            }\n        } while ( strm.avail_out == 0 && success );\n\n        bytesProcessed += bytesRead;\n\n        if ( progress && !progress(bytesProcessed, totalSize) )\n        {\n            qCDebug(runtime) << \"Compression cancelled by user\";\n            success = false;\n            break;\n        }\n\n        if ( source.atEnd() )\n            break;\n    }\n\n    deflateEnd(&strm);\n\n    if ( !success || ret != Z_STREAM_END )\n    {\n        dest.close();\n        QFile::remove(destFile);\n        return false;\n    }\n\n    qCDebug(runtime) << \"File compressed successfully\";\n    return true;\n}\n\nbool FileCompressor::gunzipFile(const QString &sourceFile, const QString &destFile,\n                                const ProgressCallback &progress)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << sourceFile << \"->\" << destFile;\n\n    QFile source(sourceFile);\n    if ( !source.open(QIODevice::ReadOnly) )\n    {\n        qWarning() << \"Cannot open source file:\" << sourceFile;\n        return false;\n    }\n\n    QFile dest(destFile);\n    if ( !dest.open(QIODevice::WriteOnly) )\n    {\n        qWarning() << \"Cannot create dest file:\" << destFile;\n        return false;\n    }\n\n    const qint64 totalSize = source.size();\n\n    // Initialize zlib for gzip decompression\n    z_stream strm{};\n\n    // 16 + MAX_WBITS tells zlib to parse gzip header/footer\n    if ( inflateInit2(&strm, 16 + MAX_WBITS) != Z_OK )\n    {\n        qWarning() << \"inflateInit2 failed\";\n        return false;\n    }\n\n    char inBuffer[65536];\n    char outBuffer[65536];\n    qint64 bytesProcessed = 0;\n    bool success = true;\n    int ret = Z_OK;\n\n    while ( ret != Z_STREAM_END && success )\n    {\n        qint64 bytesRead = source.read(inBuffer, sizeof(inBuffer));\n        if ( bytesRead < 0 )\n        {\n            qWarning() << \"Read error\";\n            success = false;\n            break;\n        }\n\n        if ( bytesRead == 0 )\n            break;\n\n        strm.next_in = reinterpret_cast<Bytef*>(inBuffer);\n        strm.avail_in = static_cast<uInt>(bytesRead);\n\n        do\n        {\n            strm.next_out = reinterpret_cast<Bytef*>(outBuffer);\n            strm.avail_out = sizeof(outBuffer);\n\n            ret = inflate(&strm, Z_NO_FLUSH);\n            if ( ret == Z_STREAM_ERROR || ret == Z_NEED_DICT ||\n                 ret == Z_DATA_ERROR || ret == Z_MEM_ERROR )\n            {\n                qWarning() << \"inflate error:\" << ret;\n                success = false;\n                break;\n            }\n\n            qint64 have = sizeof(outBuffer) - strm.avail_out;\n            if ( dest.write(outBuffer, have) != have )\n            {\n                qWarning() << \"Write error\";\n                success = false;\n                break;\n            }\n        } while ( strm.avail_out == 0 && success );\n\n        bytesProcessed += bytesRead;\n\n        if ( progress && !progress(bytesProcessed, totalSize) )\n        {\n            qCDebug(runtime) << \"Decompression cancelled by user\";\n            success = false;\n            break;\n        }\n    }\n\n    inflateEnd(&strm);\n\n    if ( !success )\n    {\n        dest.close();\n        QFile::remove(destFile);\n        return false;\n    }\n\n    qCDebug(runtime) << \"File decompressed successfully\";\n    return true;\n}\n\nbool FileCompressor::gzipFileWithProgress(const QString &sourceFile, const QString &destFile,\n                                          QWidget *parent, const QString &title)\n{\n    FCT_IDENTIFICATION;\n\n    QProgressDialog progressDialog(title, QString(), 0, 100, parent);\n    progressDialog.setWindowModality(Qt::WindowModal);\n    progressDialog.setMinimumDuration(500);  // Show after 500ms\n    progressDialog.setValue(0);\n\n    FileCompressor::ProgressCallback progressCallback = [&progressDialog](qint64 processed, qint64 total)\n    {\n        if ( total > 0 )\n            progressDialog.setValue(static_cast<int>(processed * 100 / total));\n        QCoreApplication::processEvents();\n        return !progressDialog.wasCanceled();\n    };\n\n    bool result = gzipFile(sourceFile, destFile, progressCallback);\n\n    progressDialog.setValue(100);\n\n    return result;\n}\n\nbool FileCompressor::gunzipFileWithProgress(const QString &sourceFile, const QString &destFile,\n                                            QWidget *parent, const QString &title)\n{\n    FCT_IDENTIFICATION;\n\n    QProgressDialog progressDialog(title, QString(), 0, 100, parent);\n    progressDialog.setWindowModality(Qt::WindowModal);\n    progressDialog.setMinimumDuration(500);  // Show after 500ms\n    progressDialog.setValue(0);\n\n    FileCompressor::ProgressCallback progressCallback = [&progressDialog](qint64 processed, qint64 total)\n    {\n        if ( total > 0 )\n            progressDialog.setValue(static_cast<int>(processed * 100 / total));\n        QCoreApplication::processEvents();\n        return !progressDialog.wasCanceled();\n    };\n\n    bool result = gunzipFile(sourceFile, destFile, progressCallback);\n\n    progressDialog.setValue(100);\n\n    return result;\n}\n"
  },
  {
    "path": "core/FileCompressor.h",
    "content": "#ifndef QLOG_CORE_FILECOMPRESSOR_H\n#define QLOG_CORE_FILECOMPRESSOR_H\n\n#include <QString>\n#include <QByteArray>\n#include <functional>\n\nclass QWidget;\n\nclass FileCompressor\n{\npublic:\n    // Progress callback: (bytesProcessed, totalBytes); return false to cancel\n    using ProgressCallback = std::function<bool(qint64, qint64)>;\n\n    // Compress data using gzip (in-memory)\n    static QByteArray gzip(const QByteArray &in);\n\n    // Decompress gzip data (in-memory)\n    static QByteArray gunzip(const QByteArray &in);\n\n    // Compress file using gzip (streaming)\n    static bool gzipFile(const QString &sourceFile, const QString &destFile,\n                         const ProgressCallback &progress = nullptr);\n\n    // Decompress gzip file (streaming)\n    static bool gunzipFile(const QString &sourceFile, const QString &destFile,\n                           const ProgressCallback &progress = nullptr);\n\n    // File compression/decompression with progress dialog\n    static bool gzipFileWithProgress(const QString &sourceFile, const QString &destFile,\n                                     QWidget *parent, const QString &title);\n    static bool gunzipFileWithProgress(const QString &sourceFile, const QString &destFile,\n                                       QWidget *parent, const QString &title);\n};\n\n#endif // QLOG_CORE_FILECOMPRESSOR_H\n"
  },
  {
    "path": "core/FldigiTCPServer.cpp",
    "content": "#include <QTcpSocket>\n#include <QtXml>\n#include <QtDebug>\n#include <QSqlTableModel>\n#include <QSqlRecord>\n\n#include \"FldigiTCPServer.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.fldigi\");\n\nFldigiTCPServer::FldigiTCPServer(QObject *parent) :\n    QTcpServer(parent)\n{\n    FCT_IDENTIFICATION;\n\n    listen(QHostAddress::Any, 8421);\n}\n\nvoid FldigiTCPServer::incomingConnection(qintptr socket)\n{\n    FCT_IDENTIFICATION;\n\n    QTcpSocket* sock = new QTcpSocket(this);\n    connect(sock, &QTcpSocket::readyRead, this, &FldigiTCPServer::readClient);\n    connect(sock, &QTcpSocket::disconnected, this, &FldigiTCPServer::discardClient);\n    sock->setSocketDescriptor(socket);\n}\n\nvoid FldigiTCPServer::readClient() {\n    FCT_IDENTIFICATION;\n\n    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());\n\n    if ( !socket )\n    {\n        qCWarning(runtime) << \"socket is null\";\n        return;\n    }\n\n    QString data = QString(socket->readAll());\n    qCDebug(runtime) << data;\n\n    int split = data.indexOf(\"\\r\\n\\r\\n\", 0);\n    data.remove(0, split+4);\n\n    /* WORKAROUND - FLDIGI has probably an issue. It seems that XML\n     * that is generated by FLDIGI contains Processing Instruction (clientid)\n     * without mandatory space */\n    data.replace(\"<?clientid=\", \"<?clientid =\");\n\n    QXmlStreamReader xml(data);\n    processMethodCall(socket, xml);\n\n    socket->close();\n    if (socket->state() == QTcpSocket::UnconnectedState) socket->deleteLater();\n}\n\nvoid FldigiTCPServer::discardClient() {\n    FCT_IDENTIFICATION;\n\n    QTcpSocket* socket = qobject_cast<QTcpSocket*>(sender());\n    if ( socket ) socket->deleteLater();\n}\n\nvoid FldigiTCPServer::processMethodCall(QTcpSocket* sock, QXmlStreamReader& xml) {\n    FCT_IDENTIFICATION;\n\n    QByteArray response;\n\n    while (!xml.atEnd() && !xml.hasError()) {\n        xml.readNextStartElement();\n        if (xml.name() == QString(\"methodCall\"))\n        {\n            qCDebug(runtime) << \"method call\";\n        }\n\n        if (xml.name() == QString(\"methodName\"))\n        {\n            qCDebug(runtime) << \"methodName\";\n            QString method = xml.readElementText();\n\n            if (method == \"log.add_record\") {\n                qCDebug(runtime) << \"log.add_record\";\n                QString param = parseParam(xml);\n                if (!param.isEmpty()) {\n                    response = addRecord(param);\n                }\n            }\n            else if (method == \"system.listMethods\") {\n                qCDebug(runtime) << \"system.listMethods\";\n                response = listMethods();\n            }\n        }\n    }\n\n    qCDebug(runtime) << response;\n\n    QTextStream out(sock);\n\n    if (!response.isEmpty()) {\n        out << \"HTTP/1.1 200 OK\\r\\n\";\n        out << \"Content-Type: text/xml; charset=utf-8\\r\\n\";\n        out << \"Content-Length: \" << response.length() << \"\\r\\n\";\n        out << \"\\r\\n\";\n        out << response;\n    }\n    else {\n        out << \"HTTP/1.1 400 Internal Error\\r\\n\";\n    }\n}\n\nQString FldigiTCPServer::parseParam(QXmlStreamReader& xml) {\n    FCT_IDENTIFICATION;\n\n    while (!xml.atEnd() && !xml.hasError()) {\n        xml.readNextStartElement();\n        if (xml.name() == QString(\"value\"))\n        {\n            return xml.readElementText();\n        }\n    }\n\n    return QString();\n}\n\nQByteArray FldigiTCPServer::listMethods() {\n    FCT_IDENTIFICATION;\n\n    QByteArray out;\n\n    QXmlStreamWriter xml(&out);\n    xml.writeStartDocument();\n    xml.writeStartElement(\"methodResponse\");\n    xml.writeStartElement(\"params\");\n    xml.writeStartElement(\"param\");\n    xml.writeStartElement(\"value\");\n    xml.writeStartElement(\"array\");\n    xml.writeStartElement(\"data\");\n\n    xml.writeTextElement(\"value\", \"log.add_record\");\n    xml.writeTextElement(\"value\", \"system.listMethods\");\n\n    xml.writeEndDocument();\n\n    return out;\n}\n\nQByteArray FldigiTCPServer::addRecord(QString data) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << data;\n\n    QByteArray out;\n\n    QXmlStreamWriter xml(&out);\n    xml.writeStartDocument();\n    xml.writeStartElement(\"methodResponse\");\n    xml.writeStartElement(\"params\");\n    xml.writeStartElement(\"param\");\n    xml.writeStartElement(\"value\");\n    xml.writeEndDocument();\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    model.removeColumn(model.fieldIndex(\"id\"));\n\n    QSqlRecord record = model.record(0);\n\n    QTextStream in(&data);\n    AdiFormat adif(in);\n\n    adif.importNext(record);\n\n    emit addContact(record);\n\n    return out;\n}\n"
  },
  {
    "path": "core/FldigiTCPServer.h",
    "content": "#ifndef QLOG_CORE_FLDIGI_H\n#define QLOG_CORE_FLDIGI_H\n\n#include <QTcpServer>\n#include <QSqlRecord>\n\nclass QXmlStreamReader;\n\nclass FldigiTCPServer : public QTcpServer {\n    Q_OBJECT\n\npublic:\n    explicit FldigiTCPServer(QObject *parent = nullptr);\n\nsignals:\n    void addContact(QSqlRecord);\n\npublic slots:\n    void readClient();\n    void discardClient();\n\nprivate:\n    void processMethodCall(QTcpSocket* sock, QXmlStreamReader& xml);\n    QString parseParam(QXmlStreamReader& xml);\n    QByteArray listMethods();\n    QByteArray addRecord(QString data);\n\n    void incomingConnection(qintptr socket) override;\n};\n\n#endif // QLOG_CORE_FLDIGI_H\n"
  },
  {
    "path": "core/LOVDownloader.cpp",
    "content": "#include <QStandardPaths>\n#include <QDir>\n#include <QSqlQuery>\n#include <QTimer>\n#include <QNetworkReply>\n#include <QSqlError>\n#include <QSqlTableModel>\n#include <QSqlRecord>\n#include <QApplication>\n#include <QRegularExpression>\n#include <QJsonDocument>\n#include <QJsonArray>\n#include <QJsonValue>\n#include <QJsonObject>\n#include <QXmlStreamReader>\n#include <QSqlQuery>\n#include <QSqlError>\n#include \"LogParam.h\"\n#include \"LOVDownloader.h\"\n#include \"FileCompressor.h\"\n#include \"debug.h\"\n#include \"data/Data.h\"\n#include \"core/csv.hpp\"\n#include \"core/FileCompressor.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.lovdownloader\");\n\nLOVDownloader::LOVDownloader(QObject *parent) :\n    QObject(parent),\n    currentReply(nullptr),\n    abortRequested(false),\n    CTYPrefixSeperatorRe(\"[\\\\s;]\"),\n    CTYPrefixFormatRe(\"(=?)([A-Z0-9/]+)(?:\\\\((\\\\d+)\\\\))?(?:\\\\[(\\\\d+)\\\\])?$\")\n{\n    FCT_IDENTIFICATION;\n\n    nam = new QNetworkAccessManager(this);\n    connect(nam, &QNetworkAccessManager::finished,\n            this, &LOVDownloader::processReply);\n}\n\nLOVDownloader::~LOVDownloader()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid LOVDownloader::update(const SourceType & sourceType, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    abortRequested = false;\n\n    const SourceDefinition &sourceDef = sourceMapping[sourceType];\n\n    Q_ASSERT(sourceDef.type == sourceType);\n\n    QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    const QDate &last_update = LogParam::getLOVaParam(sourceDef.lastTimeConfigName);\n\n    if ( !force\n         && dir.exists(sourceDef.fileName)\n         && last_update.isValid()\n         && last_update.daysTo(QDate::currentDate()) < sourceDef.ageTime )\n    {\n        if ( isTableFilled(sourceDef.tableName) )\n        {\n            // nothing to do.\n            qCDebug(runtime) << \"Not needed to update \" << sourceDef.fileName;\n            emit noUpdate();\n            return;\n        }\n\n        qCDebug(runtime) << \"using cached \" << sourceDef.fileName << \" at\" << dir.path();\n        QTimer::singleShot(0, this, [this, sourceDef]() {loadData(sourceDef);});\n    }\n    else\n    {\n        qCDebug(runtime) << sourceDef.fileName << \" is too old or not exist - downloading\";\n        download(sourceDef);\n    }\n}\n\nvoid LOVDownloader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply = nullptr;\n    }\n    abortRequested = true;\n}\n\nvoid LOVDownloader::loadData(const LOVDownloader::SourceDefinition &sourceDef)\n{\n    FCT_IDENTIFICATION;\n\n    const QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    QFile file(dir.filePath(sourceDef.fileName));\n    if ( ! file.open(QIODevice::ReadOnly) )\n    {\n        qWarning() << \"Cannot open\" << dir.filePath(sourceDef.fileName);\n        return;\n    }\n\n    QByteArray data = file.readAll();\n    file.close();\n\n    if (sourceDef.fileName.endsWith(\".gz\", Qt::CaseInsensitive))\n        data = FileCompressor::gunzip(data);\n\n    emit processingSize(data.size());\n\n    QTextStream stream(data);\n    parseData(sourceDef, stream);\n    emit finished(true);\n}\n\nbool LOVDownloader::isTableFilled(const QString &tableName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << tableName;\n\n    QSqlQuery query(QString(\"select exists( select 1 from %1)\").arg(tableName));\n    int i = query.first() ? query.value(0).toInt() : 0;\n\n    qCDebug(runtime) << i;\n    return i==1;\n}\n\nbool LOVDownloader::deleteTable(const QString &tableName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << tableName;\n\n    QSqlQuery query;\n    QString queryStatement(\"delete from %1\");\n\n    if ( ! query.exec(queryStatement.arg(tableName)) )\n    {\n        qWarning() << \"Cannot delete \" << tableName  << query.lastError();\n        return false;\n    }\n\n    return true;\n}\n\nvoid LOVDownloader::download(const LOVDownloader::SourceDefinition &sourceDef)\n{\n    FCT_IDENTIFICATION;\n\n    QUrl url(sourceDef.URL);\n    QNetworkRequest request(url);\n\n    QString rheader = QString(\"QLog/%1\").arg(VERSION);\n    request.setRawHeader(\"User-Agent\", rheader.toUtf8());\n\n    if ( currentReply )\n    {\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n    }\n\n    currentReply = nam->get(request);\n    currentReply->setProperty(\"sourceType\", sourceDef.type);\n\n    qCDebug(runtime) << \"Downloading \" << sourceDef.fileName << \"from \" << url.toString();\n}\n\nvoid LOVDownloader::parseData(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Parsing file \" << sourceDef.fileName;\n\n    switch ( sourceDef.type )\n    {\n    case CTY:\n        parseCTY(sourceDef, data);\n        break;\n    case SATLIST:\n        parseSATLIST(sourceDef, data);\n        break;\n    case SOTASUMMITS:\n        parseSOTASummits(sourceDef, data);\n        break;\n    case WWFFDIRECTORY:\n        parseWWFFDirectory(sourceDef, data);\n        break;\n    case IOTALIST:\n        parseIOTA(sourceDef, data);\n        break;\n    case POTADIRECTORY:\n        parsePOTA(sourceDef, data);\n        break;\n    case MEMBERSHIPCONTENTLIST:\n        parseMembershipContent(sourceDef, data);\n        break;\n    case CLUBLOGCTY:\n        parseClubLogCTY(sourceDef, data);\n        break;\n    default:\n        qWarning() << \"Unssorted type to download\" << sourceDef.type << sourceDef.fileName;\n    }\n}\n\nvoid LOVDownloader::parseCTY(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    QRegularExpressionMatch matchExp;\n\n    QSqlDatabase::database().transaction();\n\n    if ( ! deleteTable(\"dxcc_prefixes_ad1c\") )\n    {\n        qCWarning(runtime) << \"dxcc_prefixes_ad1c delete failed - rollback\";\n        QSqlDatabase::database().rollback();\n        return;\n    }\n\n    if ( ! deleteTable(sourceDef.tableName) )\n    {\n        qCWarning(runtime) << sourceDef.tableName << \" delete failed - rollback\";\n        QSqlDatabase::database().rollback();\n        return;\n    }\n\n    QSqlQuery insertEntityQuery;\n\n    if ( ! insertEntityQuery.prepare(\"INSERT INTO dxcc_entities_ad1c (id,\"\n                               \"                        name,\"\n                               \"                        prefix,\"\n                               \"                        cont,\"\n                               \"                        cqz,\"\n                               \"                        ituz,\"\n                               \"                        lat,\"\n                               \"                        lon,\"\n                               \"                        tz) \"\n                               \" VALUES (               :id,\"\n                               \"                        :name,\"\n                               \"                        :prefix,\"\n                               \"                        :cont,\"\n                               \"                        :cqz,\"\n                               \"                        :ituz,\"\n                               \"                        :lat,\"\n                               \"                        :lon,\"\n                               \"                        :tz)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement - Entity\";\n        abortRequested = true;\n    }\n\n    QSqlQuery insertPrefixesQuery;\n\n    if ( ! insertPrefixesQuery.prepare(\"INSERT INTO dxcc_prefixes_ad1c (\"\n                               \"                        prefix,\"\n                               \"                        exact,\"\n                               \"                        dxcc,\"\n                               \"                        cqz,\"\n                               \"                        ituz) \"\n                               \" VALUES (               :prefix,\"\n                               \"                        :exact,\"\n                               \"                        :dxcc,\"\n                               \"                        :cqz,\"\n                               \"                        :ituz)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement - Prefixes\";\n        abortRequested = true;\n    }\n\n    unsigned int count = 0;\n\n    while ( !data.atEnd() && !abortRequested )\n    {\n        const QString &line = data.readLine();\n        const QStringList &fields = line.split(',');\n\n        if ( fields.count() != 10 )\n        {\n            qCDebug(runtime) << \"Invalid line in the input file \" << line;\n            continue;\n        }\n        else if ( fields.at(0).startsWith(\"*\") )\n            continue;\n\n        qCDebug(runtime) << fields;\n\n        int dxcc_id = fields.at(2).toInt();\n\n        insertEntityQuery.bindValue(\":id\", dxcc_id);\n        insertEntityQuery.bindValue(\":prefix\", fields.at(0));\n        insertEntityQuery.bindValue(\":name\", fields.at(1));\n        insertEntityQuery.bindValue(\":cont\", fields.at(3));\n        insertEntityQuery.bindValue(\":cqz\", fields.at(4));\n        insertEntityQuery.bindValue(\":ituz\", fields.at(5));\n        insertEntityQuery.bindValue(\":lat\", fields.at(6).toFloat());\n        insertEntityQuery.bindValue(\":lon\", -fields.at(7).toFloat());\n        insertEntityQuery.bindValue(\":tz\", fields.at(8).toFloat());\n\n        if ( ! insertEntityQuery.exec() )\n        {\n            qWarning() << \"DXCC Entity insert error \"\n                       << insertEntityQuery.lastError().text()\n                       << insertEntityQuery.lastQuery();\n            qCDebug(runtime) << fields;\n            abortRequested = true;\n            continue;\n        }\n        else\n            count++;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n        const QStringList &prefixList = fields.at(9).split(CTYPrefixSeperatorRe, Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n        const QStringList &prefixList = fields.at(9).split(CTYPrefixSeperatorRe, QString::SkipEmptyParts);\n#endif\n        qCDebug(runtime) << prefixList;\n\n        QStringList dup;\n\n        for ( auto &prefix : prefixList )\n        {\n            matchExp = CTYPrefixFormatRe.match(prefix);\n            if ( matchExp.hasMatch() )\n            {\n                // removing duplicities in CTY file.\n                const QString &pfx = matchExp.captured(2);\n\n                if ( !dup.contains(pfx) )\n                {\n                    dup << pfx;\n                    insertPrefixesQuery.bindValue(\":prefix\", pfx);\n                    insertPrefixesQuery.bindValue(\":exact\", !matchExp.captured(1).isEmpty());\n                    insertPrefixesQuery.bindValue(\":dxcc\", dxcc_id);\n                    insertPrefixesQuery.bindValue(\":cqz\", matchExp.captured(3).toInt());\n                    insertPrefixesQuery.bindValue(\":ituz\", matchExp.captured(4).toInt());\n\n                    if ( ! insertPrefixesQuery.exec() )\n                    {\n                        qWarning() << \"DXCC Prefix insert error \"\n                                   << insertPrefixesQuery.lastError().text()\n                                   << insertPrefixesQuery.lastQuery();\n                        qCDebug(runtime) << prefix << prefixList;\n                        abortRequested = true;\n                    }\n                }\n                else\n                    qCDebug(runtime) << \"Removing non-unique prefix\" << pfx;\n            }\n            else\n                qCDebug(runtime) << \"Failed to match \" << prefix;\n        }\n\n        if ( count% 20 == 0 )\n        {\n            emit progress(data.pos());\n            QCoreApplication::processEvents();\n        }\n\n        emit progress(data.pos());\n        QCoreApplication::processEvents();\n    }\n\n    if ( !abortRequested )\n    {\n        qCDebug(runtime) << \"DXCC update finished:\" << count << \"entities loaded.\";\n        QSqlDatabase::database().commit();\n    }\n    else\n    {\n        //can be a result of abort\n        qCWarning(runtime) << \"DXCC update failed - rollback\";\n        QSqlDatabase::database().rollback();\n    }\n}\n\nvoid LOVDownloader::parseSATLIST(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlDatabase::database().transaction();\n\n    if ( ! deleteTable(sourceDef.tableName) )\n    {\n        qCWarning(runtime) << \"Satlist delete failed - rollback\";\n        QSqlDatabase::database().rollback();\n        return;\n    }\n\n    QSqlTableModel entityTableModel;\n    entityTableModel.setTable(sourceDef.tableName);\n    entityTableModel.setEditStrategy(QSqlTableModel::OnManualSubmit);\n    QSqlRecord entityRecord = entityTableModel.record();\n\n    int count = 0;\n\n    while ( !data.atEnd() && !abortRequested )\n    {\n        QString line = data.readLine();\n        QStringList fields = line.split(';');\n\n        if ( fields.count() != 8 )\n        {\n            qCDebug(runtime) << \"Invalid line in the input file \" << line;\n            continue;\n        }\n\n        qCDebug(runtime) << fields;\n\n        entityRecord.clearValues();\n        entityRecord.setValue(\"name\", fields.at(0));\n        entityRecord.setValue(\"number\", fields.at(1));\n        entityRecord.setValue(\"uplink\", fields.at(2));\n        entityRecord.setValue(\"downlink\", fields.at(3));\n        entityRecord.setValue(\"beacon\", fields.at(4));\n        entityRecord.setValue(\"mode\", fields.at(5));\n        entityRecord.setValue(\"callsign\", fields.at(6));\n        entityRecord.setValue(\"status\", fields.at(7));\n\n        if ( !entityTableModel.insertRecord(-1, entityRecord) )\n        {\n            qWarning() << \"Cannot insert a record to SATList Table - \" << entityTableModel.lastError();\n            qCDebug(runtime) << entityRecord;\n        }\n        else\n        {\n            count++;\n        }\n        emit progress(data.pos());\n        QCoreApplication::processEvents();\n    }\n\n    if ( entityTableModel.submitAll()\n         && !abortRequested )\n    {\n        QSqlDatabase::database().commit();\n        qCDebug(runtime) << \"Satlist update finished:\" << count << \"entities loaded.\";\n    }\n    else\n    {\n        //can be a result of abort\n        qCWarning(runtime) << \"Satlist update failed - rollback\" << entityTableModel.lastError();\n        QSqlDatabase::database().rollback();\n    }\n}\n\nbool LOVDownloader::parseCSVGeneric(const SourceDefinition &sourceDef,\n                                    QTextStream &data,\n                                    const QString &insertSQL,\n                                    const QStringList &csvColumns,\n                                    csv::CSVFormat format,\n                                    const QString &preValidateContains)\n{\n    FCT_IDENTIFICATION;\n\n    const std::string csvData = data.readAll().toStdString();\n    const qint64 totalBytes = static_cast<qint64>(csvData.size());\n    const int totalRows = qMax(1, static_cast<int>(\n                                      std::count(csvData.begin(), csvData.end(), '\\n')));\n\n    if ( !preValidateContains.isEmpty()\n        && csvData.find(preValidateContains.toStdString()) == std::string::npos )\n    {\n        qWarning() << \"Unexpected file header for\" << sourceDef.tableName;\n        return false;\n    }\n\n    QSqlDatabase::database().transaction();\n\n    if ( !deleteTable(sourceDef.tableName) )\n    {\n        qCWarning(runtime) << \"Delete failed - rollback:\" << sourceDef.tableName;\n        QSqlDatabase::database().rollback();\n        return false;\n    }\n\n    QSqlQuery insertQuery;\n    if ( !insertQuery.prepare(insertSQL) )\n    {\n        qWarning() << \"Cannot prepare insert statement for\" << sourceDef.tableName;\n        QSqlDatabase::database().rollback();\n        return false;\n    }\n\n    csv::CSVReader reader = csv::parse(csvData, format);\n\n    const std::vector<std::string> colNames = reader.get_col_names();\n    for ( const QString &col : csvColumns )\n    {\n        if ( std::find(colNames.begin(), colNames.end(), col.toStdString()) == colNames.end() )\n        {\n            qWarning() << \"Missing column:\" << col << \"in\" << sourceDef.tableName;\n            QSqlDatabase::database().rollback();\n            return false;\n        }\n    }\n\n    const int CHUNK = 5000;\n    const int colCount = csvColumns.size();\n\n    std::vector<std::string> stdCols;\n    stdCols.reserve(colCount);\n    for ( const QString &col : csvColumns )\n        stdCols.push_back(col.toStdString());\n\n    QVector<QVariantList> columns(colCount);\n\n    auto reserveAll = [&]()\n    {\n        for ( auto &col : columns )\n            col.reserve(CHUNK);\n    };\n\n    auto flushChunk = [&]() -> bool\n    {\n        for ( const QVariantList &col : columns )\n            insertQuery.addBindValue(col);\n\n        if ( !insertQuery.execBatch() )\n        {\n            qWarning() << \"Insert error for\" << sourceDef.tableName\n                       << \":\" << insertQuery.lastError().text();\n            return false;\n        }\n\n        for ( QVariantList &col : columns )\n            col.clear();\n\n        reserveAll();\n        return true;\n    };\n\n    reserveAll();\n    int count = 0;\n\n    for ( csv::CSVRow &row : reader )\n    {\n        if ( abortRequested )\n            break;\n\n        for ( int i = 0; i < colCount; ++i )\n            columns[i] << QString::fromStdString(row[stdCols[i]].get<std::string>());\n\n        ++count;\n\n        if ( count % CHUNK == 0 )\n        {\n            if ( !flushChunk() )\n            {\n                abortRequested = true;\n                break;\n            }\n            emit progress(static_cast<qint64>(count) * totalBytes / totalRows);\n            QCoreApplication::processEvents();\n        }\n    }\n\n    if ( !abortRequested && !columns[0].isEmpty() )\n    {\n        if ( !flushChunk() )\n            abortRequested = true;\n    }\n\n    if ( !abortRequested )\n    {\n        QSqlDatabase::database().commit();\n        qCDebug(runtime) << sourceDef.tableName << \"update finished:\" << count << \"entities loaded.\";\n        return true;\n    }\n\n    qCWarning(runtime) << sourceDef.tableName << \"update failed - rollback\";\n    QSqlDatabase::database().rollback();\n    return false;\n}\n\nvoid LOVDownloader::parseSOTASummits(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    csv::CSVFormat format;\n    format.delimiter(',').quote('\"').header_row(1);\n\n    parseCSVGeneric(sourceDef, data,\n                    \"INSERT INTO sota_summits(summit_code, association_name, region_name, summit_name,\"\n                    \"  altm, altft, gridref1, gridref2, longitude, latitude, points, bonus_points,\"\n                    \"  valid_from, valid_to) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)\",\n                    {\"SummitCode\", \"AssociationName\", \"RegionName\", \"SummitName\",\n                     \"AltM\", \"AltFt\", \"GridRef1\", \"GridRef2\",\n                     \"Longitude\", \"Latitude\", \"Points\", \"BonusPoints\",\n                     \"ValidFrom\", \"ValidTo\"},\n                    format,\n                    \"SOTA Summits List\");   // preValidateContains\n}\n\nvoid LOVDownloader::parseWWFFDirectory(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    csv::CSVFormat format;\n    format.delimiter(',').quote('\"').trim({' '});\n\n    parseCSVGeneric(sourceDef, data,\n                    \"INSERT INTO wwff_directory(reference, status, name, program, dxcc, state,\"\n                    \"  county, continent, iota, iaruLocator, latitude, longitude, iucncat,\"\n                    \"  valid_from, valid_to) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)\",\n                    {\"reference\", \"status\", \"name\", \"program\", \"dxcc\", \"state\",\n                     \"county\", \"continent\", \"iota\", \"iaruLocator\", \"latitude\", \"longitude\",\n                     \"IUCNcat\", \"validFrom\", \"validTo\"},\n                    format);\n}\n\n\nvoid LOVDownloader::parseIOTA(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery insertQuery;\n    if ( ! insertQuery.prepare(\"INSERT INTO IOTA(iotaid,\"\n                             \"                 islandname)\"\n                             \" VALUES (?, ?)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        abortRequested = true;\n        return;\n    }\n\n    QSqlDatabase::database().transaction();\n\n    if ( ! deleteTable(sourceDef.tableName) )\n    {\n        qCWarning(runtime) << \"IOTA List delete failed - rollback\";\n        abortRequested = true;\n        QSqlDatabase::database().rollback();\n        return;\n    }\n\n    unsigned int count = 0;\n\n    QJsonDocument jsonDoc = QJsonDocument::fromJson(data.readAll().toUtf8());\n\n    if ( !jsonDoc.isArray() )\n    {\n        qCDebug(runtime) << jsonDoc;\n        qWarning() << \"Unexpected IOTA JSON - aborting\";\n        abortRequested = true;\n    }\n    else\n    {\n        QVariantList iota_id;\n        QVariantList iota_islandname;\n\n        const QJsonArray &jsonArray = jsonDoc.array();\n\n        for ( const QJsonValue &value : jsonArray )\n        {\n            if ( !value.isObject() ) continue;\n\n            const QJsonObject &obj = value.toObject();\n            const QJsonValue &refno = obj.value(\"refno\");\n            const QJsonValue &name = obj.value(\"name\");\n\n            qCDebug(runtime) << \"IOTA Record\" << refno << name;\n\n            iota_id << refno;\n            iota_islandname << name;\n\n            if ( count%500 == 0 )\n            {\n                emit progress(data.pos());\n                QCoreApplication::processEvents();\n            }\n            count++;\n        }\n\n        insertQuery.addBindValue(iota_id);\n        insertQuery.addBindValue(iota_islandname);\n\n        if ( ! insertQuery.execBatch() )\n        {\n            qInfo() << \"IOTA Directory insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            abortRequested = true;\n        }\n    }\n\n    if ( !abortRequested )\n    {\n        QSqlDatabase::database().commit();\n        qCDebug(runtime) << \"IOTA update finished:\" << count << \"entities loaded.\";\n    }\n    else\n    {\n        qCWarning(runtime) << \"IOTA update failed - rollback\";\n        QSqlDatabase::database().rollback();\n    }\n}\n\nvoid LOVDownloader::parsePOTA(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    csv::CSVFormat format;\n    format.delimiter(',').quote('\"');\n\n    parseCSVGeneric(sourceDef, data,\n                    \"INSERT INTO POTA_DIRECTORY(reference, name, active, entityID,\"\n                    \"  locationDesc, latitude, longitude, grid) VALUES (?,?,?,?,?,?,?,?)\",\n                    {\"reference\", \"name\", \"active\", \"entityId\",\n                     \"locationDesc\", \"latitude\", \"longitude\", \"grid\"},\n                    format);\n}\n\nvoid LOVDownloader::parseMembershipContent(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlDatabase::database().transaction();\n\n    if ( ! deleteTable(sourceDef.tableName) )\n    {\n        qCWarning(runtime) << \"Membership Directory delete failed - rollback\";\n        QSqlDatabase::database().rollback();\n        return;\n    }\n\n    QSqlTableModel entityTableModel;\n    entityTableModel.setTable(sourceDef.tableName);\n    entityTableModel.setEditStrategy(QSqlTableModel::OnManualSubmit);\n    QSqlRecord entityRecord = entityTableModel.record();\n\n    int count = 0;\n\n    while ( !data.atEnd() && !abortRequested )\n    {\n        QString line = data.readLine();\n        QStringList fields = line.split(',');\n\n        if ( fields.count() != 5 )\n        {\n            qCDebug(runtime) << \"Invalid line in the input file \" << line;\n            continue;\n        }\n\n        qCDebug(runtime) << fields;\n\n        entityRecord.clearValues();\n        entityRecord.setValue(\"short_desc\", fields.at(0));\n        entityRecord.setValue(\"long_desc\", fields.at(1));\n        entityRecord.setValue(\"filename\", fields.at(2));\n        entityRecord.setValue(\"last_update\", fields.at(3));\n        entityRecord.setValue(\"num_records\", fields.at(4));\n\n        if ( !entityTableModel.insertRecord(-1, entityRecord) )\n        {\n            qWarning() << \"Cannot insert a record to Membership Directory Table - \" << entityTableModel.lastError();\n            qCDebug(runtime) << entityRecord;\n        }\n        else\n        {\n            count++;\n        }\n        emit progress(data.pos());\n        QCoreApplication::processEvents();\n    }\n\n    if ( entityTableModel.submitAll()\n         && !abortRequested )\n    {\n        QSqlDatabase::database().commit();\n        qCDebug(runtime) << \"Membership Directory update finished:\" << count << \"entities loaded.\";\n    }\n    else\n    {\n        //can be a result of abort\n        qCWarning(runtime) << \"Membership Directory update failed - rollback\" << entityTableModel.lastError();\n        QSqlDatabase::database().rollback();\n    }\n\n}\n\nvoid LOVDownloader::parseClubLogCTY(const SourceDefinition &sourceDef, QTextStream &data)\n{\n    FCT_IDENTIFICATION;\n\n    if (sourceDef.type != CLUBLOGCTY) return;\n\n    // Read whole text (it’s XML); QXmlStreamReader can also take QIODevice, but we\n    // already have a QTextStream here.\n    QXmlStreamReader xml(data.readAll());\n\n    // Clean all five tables inside one transaction\n    QSqlDatabase::database().transaction();\n    auto rollback = [&]()\n    {\n        qCWarning(runtime) << \"ClubLog CTY import failed - rollback\";\n        QSqlDatabase::database().rollback();\n    };\n\n    if ( !deleteTable(\"dxcc_zone_exceptions_clublog\")\n        || !deleteTable(\"dxcc_prefixes_clublog\")\n        || !deleteTable(\"dxcc_entities_clublog\"))\n    {\n        rollback();\n        return;\n    }\n\n    QSqlQuery insEntity, insPrefix,insZone;\n\n    // prepared statements\n    if (!insEntity.prepare(\n                \"INSERT INTO dxcc_entities_clublog(id, name, prefix, deleted, cqz, ituz, cont, lon, lat, start, \\\"end\\\")\"\n                \"VALUES(:id, :name, :prefix, :deleted, :cqz, :ituz, :cont, :lon, :lat, :start, :end)\"))\n    {\n        qWarning() << insEntity.lastError(); rollback(); return;\n    }\n\n    if (!insPrefix.prepare(\n                \"INSERT INTO dxcc_prefixes_clublog(prefix, exact, dxcc, cqz, cont, lon, lat, start, \\\"end\\\")\"\n                \"VALUES(:prefix, :exact, :dxcc, :cqz, :cont, :lon, :lat, :start, :end)\"))\n    {\n        qWarning() << insPrefix.lastError(); rollback(); return;\n    }\n\n    if (!insZone.prepare(\n                \"INSERT INTO dxcc_zone_exceptions_clublog(record, call, cqz, start, \\\"end\\\")\"\n                \"VALUES(:record, :call, :cqz, :start, :end)\"))\n    {\n        qWarning() << insZone.lastError(); rollback(); return;\n    }\n\n    auto readText = [&](QXmlStreamReader &x)->QString { return x.readElementText().trimmed(); };\n    auto readDate = [&](const QString &s)->QString { return s; }; // store ISO8601 text as-is\n\n    // Cursor down to <clublog>\n    while (!xml.atEnd() && !(xml.isStartElement() && xml.name() == QStringLiteral(\"clublog\"))) xml.readNext();\n\n    if (xml.atEnd())\n    {\n        qWarning() << \"ClubLog: <clublog> not found\";\n        rollback(); return;\n    }\n\n    quint32 readOp = 0;\n\n    auto updateReadProgress = [&]()\n    {\n        readOp++;\n        if ( readOp % 200 == 0 )\n        {\n            emit progress(xml.characterOffset());\n            QCoreApplication::processEvents();\n        }\n    };\n\n    // Iterate children of <clublog>\n    while (!xml.atEnd())\n    {\n        xml.readNext();\n\n        if ( !xml.isStartElement() ) continue;\n\n        const QString &top = xml.name().toString();\n\n        if ( top == \"entities\" )\n        {\n            // <entities><entity>...</entity>...</entities>\n            while (!(xml.isEndElement() && xml.name() == QStringLiteral(\"entities\")))\n            {\n                xml.readNext();\n\n                updateReadProgress();\n\n                if ( xml.isStartElement() && xml.name() == QStringLiteral(\"entity\") )\n                {\n                    // parse one entity\n                    int adif = 0; QString name, prefix, cont; bool deleted=false;\n                    int cqz = 0; QString start, end;\n                    double lon=0.0, lat=0.0;\n\n                    while ( !(xml.isEndElement() && xml.name() == QStringLiteral(\"entity\")))\n                    {\n                        xml.readNext();\n\n                        updateReadProgress();\n\n                        if ( !xml.isStartElement() ) continue;\n\n                        const QString &tag = xml.name().toString();\n\n                        if ( tag==\"adif\" ) adif = readText(xml).toInt();\n                        else if ( tag==\"name\" ) name = readText(xml);\n                        else if ( tag==\"prefix\" ) prefix = readText(xml);\n                        else if ( tag==\"deleted\" ) deleted = (readText(xml).compare(\"true\", Qt::CaseInsensitive) == 0);\n                        else if ( tag==\"cqz\" ) cqz = readText(xml).toInt();\n                        else if ( tag==\"cont\" ) cont = readText(xml);\n                        else if ( tag==\"long\" ) lon = readText(xml).toDouble();\n                        else if ( tag==\"lat\" )  lat = readText(xml).toDouble();\n                        else if ( tag==\"start\" ) start = readDate(readText(xml));\n                        else if ( tag==\"end\" )   end   = readDate(readText(xml));\n                        else xml.skipCurrentElement();\n                    }\n\n                    insEntity.bindValue(\":id\", adif);\n\n                    const QString &nameModified = Data::instance()->dxccName(adif);\n\n                    insEntity.bindValue(\":name\", nameModified.isEmpty() ? name : nameModified);\n                    insEntity.bindValue(\":prefix\", prefix);\n                    insEntity.bindValue(\":deleted\", deleted ? 1 : 0);\n                    insEntity.bindValue(\":cqz\", cqz ? cqz : 0);\n                    insEntity.bindValue(\":ituz\", Data::instance()->dxccITUZ(adif));\n                    insEntity.bindValue(\":cont\", cont.isEmpty()? QVariant(): cont);\n                    insEntity.bindValue(\":lon\",  lon);\n                    insEntity.bindValue(\":lat\",  lat);\n                    insEntity.bindValue(\":start\", start.isEmpty()? QVariant() : start);\n                    insEntity.bindValue(\":end\",   end.isEmpty()?   QVariant() : end);\n\n                    if (!insEntity.exec()) { qWarning() << insEntity.lastError(); rollback(); return; }\n                }\n            }\n        }\n        else if (top == \"prefixes\" || top == \"exceptions\")\n        {\n            // these two share the same internal structure: <prefix|exception record='...'>...</...>\n            bool isPrefix = (top==\"prefixes\");\n\n            while (!(xml.isEndElement() && xml.name() == top))\n            {\n                xml.readNext();\n\n                updateReadProgress();\n\n                if ( xml.isStartElement() && (xml.name() == QStringLiteral(\"prefix\")\n                                              || xml.name()==QStringLiteral(\"exception\")))\n                {\n                    QString call, cont, start, end;\n                    int adif=0, cqz=0; double lon=0.0, lat=0.0;\n\n                    while ( !(xml.isEndElement() && (xml.name()==QStringLiteral(\"prefix\")\n                                                     || xml.name()==QStringLiteral(\"exception\"))))\n                    {\n                        xml.readNext();\n\n                        updateReadProgress();\n\n                        if ( !xml.isStartElement() ) continue;\n\n                        const QString tag = xml.name().toString();\n\n                        if ( tag==\"call\" ) call = readText(xml);\n                        else if ( tag==\"adif\" ) adif = readText(xml).toInt();\n                        else if ( tag==\"cqz\" ) cqz = readText(xml).toInt();\n                        else if ( tag==\"cont\" ) cont = readText(xml);\n                        else if ( tag==\"long\" ) lon = readText(xml).toDouble();\n                        else if ( tag==\"lat\" )  lat = readText(xml).toDouble();\n                        else if ( tag==\"start\" ) start = readDate(readText(xml));\n                        else if ( tag==\"end\" )   end = readDate(readText(xml));\n                        else xml.skipCurrentElement();\n                    }\n\n                    insPrefix.bindValue(\":prefix\", call);\n                    insPrefix.bindValue(\":exact\", !isPrefix);\n                    insPrefix.bindValue(\":dxcc\", adif);\n                    insPrefix.bindValue(\":cqz\", cqz ? cqz : 0);\n                    insPrefix.bindValue(\":ituz\", 0);\n                    insPrefix.bindValue(\":cont\", cont.isEmpty()? QVariant() : cont);\n                    insPrefix.bindValue(\":lon\", lon);\n                    insPrefix.bindValue(\":lat\", lat);\n                    insPrefix.bindValue(\":start\", start.isEmpty()? QVariant() : start);\n                    insPrefix.bindValue(\":end\",   end.isEmpty()?   QVariant() : end);\n\n                    if (!insPrefix.exec())\n                    {\n                        qWarning() << insPrefix.lastError();\n                        rollback();\n                        return;\n                    }\n                }\n            }\n        }\n        else if ( top == \"zone_exceptions\" )\n        {\n            while ( !(xml.isEndElement() && xml.name() == QStringLiteral(\"zone_exceptions\")) )\n            {\n                xml.readNext();\n\n                updateReadProgress();\n\n                if ( xml.isStartElement() && xml.name()==QStringLiteral(\"zone_exception\") )\n                {\n                    bool ok=false; quint32 rec = xml.attributes().value(\"record\").toUInt(&ok);\n                    QString call, start, end; int zone=0;\n\n                    while ( !(xml.isEndElement() && xml.name()==QStringLiteral(\"zone_exception\")) )\n                    {\n                        xml.readNext();\n\n                        updateReadProgress();\n\n                        if (!xml.isStartElement()) continue;\n\n                        const QString &tag = xml.name().toString();\n                        if ( tag==\"call\" ) call = readText(xml);\n                        else if ( tag==\"zone\" ) zone = readText(xml).toInt();\n                        else if ( tag==\"start\" ) start = readDate(readText(xml));\n                        else if ( tag==\"end\" )   end   = readDate(readText(xml));\n                        else xml.skipCurrentElement();\n                    }\n                    insZone.bindValue(\":record\", rec);\n                    insZone.bindValue(\":call\", call);\n                    insZone.bindValue(\":cqz\", zone);\n                    insZone.bindValue(\":start\", start);\n                    insZone.bindValue(\":end\",   end);\n                    if (!insZone.exec())\n                    {\n                        qWarning() << insZone.lastError();\n                        rollback();\n                        return;\n                    }\n                }\n            }\n        }\n        else\n            xml.skipCurrentElement();\n\n        updateReadProgress();\n    }\n\n    if ( xml.hasError() )\n    {\n        qWarning() << \"ClubLog XML error:\" << xml.errorString();\n        rollback();\n        return;\n    }\n\n    QSqlDatabase::database().commit();\n    qCDebug(runtime) << \"ClubLog CTY import finished.\";\n}\n\nvoid LOVDownloader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    currentReply = nullptr;\n\n    QByteArray data = reply->readAll();\n    uint sourceTypeNum = reply->property(\"sourceType\").toUInt();\n\n    qCDebug(runtime) << \"Received Source type \" << sourceTypeNum;\n\n    SourceType sourceType = static_cast<SourceType>(sourceTypeNum);\n    SourceDefinition sourceDef = sourceMapping[sourceType];\n\n    Q_ASSERT(sourceDef.type == sourceType);\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->isFinished()\n         && reply->error() == QNetworkReply::NoError\n         && replyStatusCode >= 200 && replyStatusCode < 300)\n    {\n        qCDebug(runtime) << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute);\n        qCDebug(runtime) << reply->header(QNetworkRequest::KnownHeaders::LocationHeader);\n\n        QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n\n        QFile file(dir.filePath(sourceDef.fileName));\n        file.open(QIODevice::WriteOnly);\n        if (sourceType == CLUBLOGCTY)\n        {\n            QByteArray maybeXml = FileCompressor::gunzip(data);\n            if ( !maybeXml.isEmpty() )\n                data = maybeXml;\n        }\n        file.write(data);\n        file.flush();\n        file.close();\n        reply->deleteLater();\n\n        LogParam::setLOVParam(sourceDef.lastTimeConfigName, QDateTime::currentDateTimeUtc().date());\n        loadData(sourceDef);\n    }\n    else\n    {\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        qCDebug(runtime) << \"Failed to download \" << sourceDef.fileName;\n\n        reply->deleteLater();\n        emit finished(false);\n    }\n}\n"
  },
  {
    "path": "core/LOVDownloader.h",
    "content": "#ifndef QLOG_CORE_LOVDOWNLOADER_H\n#define QLOG_CORE_LOVDOWNLOADER_H\n\n#include <QObject>\n#include <QNetworkAccessManager>\n#include <QRegularExpression>\n#include \"service/clublog/ClubLog.h\"\n\nnamespace csv\n{\nclass CSVFormat;\n}\n\nclass LOVDownloader : public QObject\n{\n    Q_OBJECT\n\npublic:\n    enum SourceType\n    {\n        CTY = 0,\n        SATLIST = 1,\n        SOTASUMMITS = 2,\n        WWFFDIRECTORY = 3,\n        IOTALIST = 4,\n        POTADIRECTORY = 5,\n        MEMBERSHIPCONTENTLIST = 6,\n        CLUBLOGCTY = 7,\n        UNDEF = 8\n    };\n\npublic:\n    LOVDownloader(QObject *parent = nullptr);\n    ~LOVDownloader();\n    void update(const SourceType &, bool force = false);\n\npublic slots:\n    void abortRequest();\n\nsignals:\n    void processingSize(qint64);\n    void progress(qint64 count);\n    void finished(bool result);\n    void noUpdate();\n\nprivate:\n    class SourceDefinition\n    {\n    public:\n        SourceDefinition(const SourceType type,\n                         const QString &URL,\n                         const QString &fileName,\n                         const QString &lastTimeConfigName,\n                         const QString &tableName,\n                         int ageTime) : type(type),\n                                        URL(URL),\n                                        fileName(fileName),\n                                        lastTimeConfigName(lastTimeConfigName),\n                                        tableName(tableName),\n                                        ageTime(ageTime) {};\n        SourceDefinition() : type(LOVDownloader::UNDEF),\n                                  ageTime(0){};\n        SourceType type;\n        QString URL;\n        QString fileName;\n        QString lastTimeConfigName;\n        QString tableName;\n        int ageTime;\n    };\n\n    QMap<SourceType, SourceDefinition> sourceMapping = {\n        {CTY, SourceDefinition(CTY,\n                               \"https://www.country-files.com/bigcty/cty.csv\",\n                               \"cty.csv\",\n                               \"LOV/last_cty_update\",\n                               \"dxcc_entities_ad1c\",\n                               7)},\n        {CLUBLOGCTY, SourceDefinition(CLUBLOGCTY,\n                               ClubLogBase::getCTYUrl(),\n                               \"clublog_cty.xml\",\n                               \"LOV/last_clublogcty_update\",\n                               \"dxcc_entities_clublog\",\n                               7)},\n        {SATLIST, SourceDefinition(SATLIST,\n                                   \"https://raw.githubusercontent.com/foldynl/hamradio-value-lists/main/lists/satellites/satslist.csv\",\n                                   \"satslist.csv\",\n                                   \"LOV/last_sat_update\",\n                                   \"sat_info\",\n                                   10)},\n        {SOTASUMMITS, SourceDefinition(SOTASUMMITS,\n                                   \"https://raw.githubusercontent.com/foldynl/hamradio-value-lists/main/lists/SOTA/summitslist.csv.gz\",\n                                   \"summitslist.csv.gz\",\n                                   \"LOV/last_sotasummits_update\",\n                                   \"sota_summits\",\n                                   30)},\n        {WWFFDIRECTORY, SourceDefinition(WWFFDIRECTORY,\n                                   \"https://raw.githubusercontent.com/foldynl/hamradio-value-lists/main/lists/WWFF/wwff_directory.csv.gz\",\n                                   \"wwff_directory.csv.gz\",\n                                   \"LOV/last_wwffdirectory_update\",\n                                   \"wwff_directory\",\n                                   21)},\n        {IOTALIST, SourceDefinition(IOTALIST,\n                                   \"https://www.iota-world.org/islands-on-the-air/downloads/download-file.html?path=groups.json\",\n                                   \"groups.json\",\n                                   \"LOV/last_iota_update\",\n                                   \"iota\",\n                                   30)},\n        {POTADIRECTORY, SourceDefinition(POTADIRECTORY,\n                                   \"https://raw.githubusercontent.com/foldynl/hamradio-value-lists/main/lists/POTA/all_parks_ext.csv.gz\",\n                                   \"all_parks_ext.csv.gz\",\n                                   \"LOV/last_pota_update\",\n                                   \"pota_directory\",\n                                   30)},\n        {MEMBERSHIPCONTENTLIST, SourceDefinition(MEMBERSHIPCONTENTLIST,\n                                   \"https://raw.githubusercontent.com/foldynl/hamradio-membeship-lists/main/lists/content.csv\",\n                                   \"content.csv\",\n                                   \"LOV/last_membershipcontent_update\",\n                                   \"membership_directory\",\n                                   7)}\n    };\n\n\n    QNetworkAccessManager* nam;\n    QNetworkReply *currentReply;\n    bool abortRequested;\n    QRegularExpression CTYPrefixSeperatorRe;\n    QRegularExpression CTYPrefixFormatRe;\n\nprivate:\n    bool isTableFilled(const QString &);\n    bool deleteTable(const QString &);\n    void download(const SourceDefinition &);\n    void parseData(const LOVDownloader::SourceDefinition &,\n                   QTextStream &);\n    void parseCTY(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseSATLIST(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseSOTASummits(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseWWFFDirectory(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseIOTA(const SourceDefinition &sourceDef, QTextStream& data);\n    void parsePOTA(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseMembershipContent(const SourceDefinition &sourceDef, QTextStream& data);\n    void parseClubLogCTY(const SourceDefinition &sourceDef, QTextStream &data);\n    bool parseCSVGeneric(const SourceDefinition &sourceDef,\n                         QTextStream &data,\n                         const QString &insertSQL,\n                         const QStringList &csvColumns,\n                         csv::CSVFormat format,\n                         const QString &preValidateContains = QString());\nprivate slots:\n    void processReply(QNetworkReply*);\n    void loadData(const LOVDownloader::SourceDefinition &);\n\n};\n\n#endif // QLOG_CORE_LOVDOWNLOADER_H\n"
  },
  {
    "path": "core/LogDatabase.cpp",
    "content": "#include <QSqlDatabase>\n#include <QSqlDriver>\n#include <sqlite3.h>\n#include <QSqlError>\n#include <QSqlQuery>\n#include <QCoreApplication>\n#include <QUuid>\n\n#include <QStandardPaths>\n#include <QFile>\n#include <QFileInfo>\n\n#include \"LogDatabase.h\"\n#include \"core/debug.h\"\n#include \"core/Migration.h\"\n#include \"core/LogParam.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/PlatformParameterManager.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.logdatabase\");\n\nQString LogDatabase::PLATFORM_WINDOWS = \"Windows\";\nQString LogDatabase::PLATFORM_MACOS = \"MacOS\";\nQString LogDatabase::PLATFORM_LINUX = \"Linux\";\nQString LogDatabase::PLATFORM_LINUXFLATPAK = \"LinuxFlatpak\";\n\nQDir LogDatabase::dbDirectory()\n{\n    return QDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n}\n\nQString LogDatabase::dbFilename()\n{\n    return dbDirectory().filePath(\"qlog.db\");\n}\n\nQString LogDatabase::currentPlatformId()\n{\n#if defined(Q_OS_WIN)\n    return LogDatabase::PLATFORM_WINDOWS;\n#elif defined(Q_OS_MACOS)\n    return LogDatabase::PLATFORM_MACOS;\n#elif defined(QLOG_FLATPAK)\n    return LogDatabase::PLATFORM_LINUXFLATPAK;\n#else\n    return LogDatabase::PLATFORM_LINUX;\n#endif\n}\n\nLogDatabase::LogDatabase()\n{\n    FCT_IDENTIFICATION;\n}\n\nbool LogDatabase::hadPasswordImportWarning() const\n{\n    return passwordImportWarning;\n}\n\nbool LogDatabase::createSQLFunctions()\n{\n    FCT_IDENTIFICATION;\n\n    QVariant v = QSqlDatabase::database().driver()->handle();\n\n    if ( !v.isValid()\n         || qstrcmp(v.typeName(), \"sqlite3*\") != 0 )\n    {\n        qCritical() << \"Cannot get SQLite driver handle\";\n        return false;\n    }\n\n    sqlite3 *db_handle = *static_cast<sqlite3 **>(v.data());\n    if ( db_handle == 0 )\n    {\n        qCritical() << \"Cannot define new SQLite functions\";\n        return false;\n    }\n\n    sqlite3_initialize();\n    sqlite3_create_function(db_handle,\n                            \"translate_to_locale\",\n                            1,\n                            SQLITE_UTF8 | SQLITE_DETERMINISTIC,\n                            nullptr,\n                            [](sqlite3_context *ctx, int argc, sqlite3_value **argv) {\n                                if ( argc != 1 )\n                                {\n                                    sqlite3_result_error(ctx, \"Invalid arguments\", -1);\n                                    return;\n                                }\n\n                                switch ( sqlite3_value_type(argv[0]) )\n                                {\n                                case SQLITE_TEXT:\n                                {\n                                    const char *text = reinterpret_cast<const char*>(sqlite3_value_text(argv[0]));\n                                    const QString &translatedText = QCoreApplication::translate(\"DBStrings\", text);\n                                    sqlite3_result_text(ctx, translatedText.toUtf8().constData(), -1, SQLITE_TRANSIENT);\n                                }\n                                    break;\n                                case SQLITE_NULL:\n                                    sqlite3_result_null(ctx);\n                                    break;\n                                case SQLITE_INTEGER:\n                                    sqlite3_result_int(ctx, sqlite3_value_int(argv[0]));\n                                    break;\n                                case SQLITE_FLOAT:\n                                    sqlite3_result_double(ctx, sqlite3_value_double(argv[0]));\n                                    break;\n                                default:\n                                    sqlite3_result_error(ctx, \"Invalid arguments\", -1);\n                                }\n                            }, nullptr, nullptr);\n    sqlite3_create_collation(db_handle,\n                             \"LOCALEAWARE\",\n                             SQLITE_UTF16,\n                             nullptr,\n                             [](void *, int ll, const void * l, int rl, const void * r) {\n                                const QString &left = QString::fromUtf16(reinterpret_cast<const char16_t *>(l), ll/2);\n                                const QString &right = QString::fromUtf16(reinterpret_cast<const char16_t *>(r), rl/2);\n                                return QString::localeAwareCompare(left, right); // controlled by LC_COLLATE\n                             });\n\n    return true;\n}\n\nbool LogDatabase::atomicCopy(const QString &filename)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlDatabase db = QSqlDatabase::database();\n\n    if ( !db.isOpen() )\n    {\n        qWarning() << \"Database is not opened\";\n        return false;\n    }\n\n    // Validate filename — must be a plain filename, no path separators\n    if ( filename.isEmpty() )\n    {\n        qWarning() << \"Invalid filename:\" << filename;\n        return false;\n    }\n\n    QVariant v = db.driver()->handle();\n    if ( !v.isValid() || qstrcmp(v.typeName(), \"sqlite3*\") != 0)\n    {\n        qWarning() << \"Cannot get Database Driver Handler\";\n        return false;\n    }\n\n    sqlite3 *srcHandle = *static_cast<sqlite3 **>(v.data());\n    sqlite3 *dstHandle = nullptr;\n    sqlite3_backup *backup = nullptr;\n    bool ok = false;\n    int stepSize = 5000;\n\n    const QString newDBFilename = dbDirectory().filePath(filename);\n\n    if (sqlite3_open_v2(newDBFilename.toUtf8().constData(), &dstHandle,\n                        SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nullptr) != SQLITE_OK)\n    {\n        qWarning() << \"Cannot open a new database file:\" << sqlite3_errmsg(dstHandle);\n        goto cleanup;\n    }\n\n    backup = sqlite3_backup_init(dstHandle, \"main\", srcHandle, \"main\");\n    if ( !backup )\n    {\n        qWarning() << \"Cannot Init a backup\" << sqlite3_errmsg(dstHandle);\n        goto cleanup;\n    }\n\n    while (true)\n    {\n        int rc = sqlite3_backup_step(backup, stepSize);\n\n        int total = sqlite3_backup_pagecount(backup);\n        int remaining = sqlite3_backup_remaining(backup);\n\n        int done = total - remaining;\n        int percent = total > 0 ? (done * 100 / total) : 0;\n\n        qCDebug(runtime) << percent;\n\n        if (rc == SQLITE_DONE)\n        {\n            ok = true;\n            break;\n        }\n        else if (rc == SQLITE_BUSY || rc == SQLITE_LOCKED)\n        {\n            sqlite3_sleep(50);\n            continue;\n        }\n        else if (rc == SQLITE_OK)\n        {\n            continue;\n        }\n        else\n        {\n            qWarning() << \"Backup Error\" << sqlite3_errmsg(dstHandle);\n            break;\n        }\n    }\n\n    // sqlite3_backup_finish always releases the backup handle,\n    // even on error — never call it twice\n    if ( sqlite3_backup_finish(backup) != SQLITE_OK )\n    {\n        qWarning() << \"Cannot finalize the database copy\" << sqlite3_errmsg(dstHandle);\n        ok = false;\n    }\n    backup = nullptr;\n\ncleanup:\n    if ( backup )\n        sqlite3_backup_finish(backup);\n\n    if ( dstHandle )\n        sqlite3_close(dstHandle);\n\n    if ( !ok )\n        QFile::remove(newDBFilename);\n\n    return ok;\n}\n\nbool LogDatabase::openDatabase()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\");\n    db.setDatabaseName(dbFilename());\n    db.setConnectOptions(\"QSQLITE_ENABLE_REGEXP\");\n\n    if ( !db.open() )\n    {\n        qCritical() << db.lastError();\n        return false;\n    }\n\n    QSqlQuery query;\n    if ( !query.exec(\"PRAGMA foreign_keys = ON\") )\n    {\n        qCritical() << \"Cannot set PRAGMA foreign_keys\";\n        return false;\n    }\n\n    if ( !query.exec(\"PRAGMA journal_mode = WAL\") )\n    {\n        qCritical() << \"Cannot set PRAGMA journal_mode\";\n        return false;\n    }\n\n    while ( query.next() )\n    {\n        QString pragma = query.value(0).toString();\n        qCDebug(runtime) << \"Pragma result:\" << pragma;\n    }\n\n    return createSQLFunctions();\n}\n\nbool LogDatabase::schemaVersionUpgrade(bool force)\n{\n    FCT_IDENTIFICATION;\n\n    DBSchemaMigration m;\n    return m.run(force);\n}\n\nDatabaseInfo LogDatabase::inspectDatabase(const QString &filename)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filename;\n\n    DatabaseInfo info;\n    const QString connectionName = QStringLiteral(\"InspectDB\");\n\n    // Use do-while(false) pattern to ensure removeDatabase is called after db/query are out of scope\n    do {\n        QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\", connectionName);\n        db.setDatabaseName(filename);\n\n        if ( !db.open() )\n        {\n            info.errorMessage = db.lastError().text();\n            qWarning() << \"Cannot open database for inspection:\" << info.errorMessage;\n            break;\n        }\n\n        // Check if it's a valid QLog database by looking for schema_versions table\n        QSqlQuery query(db);\n        if ( !query.exec(\"SELECT version FROM schema_versions ORDER BY version DESC LIMIT 1\") )\n        {\n            info.errorMessage = QObject::tr(\"Not a valid QLog database\");\n            db.close();\n            break;\n        }\n\n        info.schemaVersion = ( query.first() ) ? query.value(0).toInt() : 0;\n\n        // Check if schema version is too new\n        if ( info.schemaVersion > DBSchemaMigration::latestVersion )\n        {\n            info.errorMessage = QObject::tr(\"Database version too new (requires newer QLog version)\");\n            db.close();\n            break;\n        }\n\n        // Read source platform and encrypted passwords from log_param\n        if ( query.exec(\"SELECT value FROM log_param WHERE name = 'sourceplatform'\") )\n        {\n            if ( query.first() )\n                info.sourcePlatform = query.value(0).toString();\n\n            if ( info.sourcePlatform.isEmpty() )\n            {\n                info.errorMessage = QObject::tr(\"Database is not QLog Export file\");\n                db.close();\n                break;\n            }\n        }\n\n        if ( query.exec(\"SELECT value FROM log_param WHERE name = 'security/encryptedpasswords'\") )\n        {\n            if ( query.first() && !query.value(0).toString().isEmpty() )\n                info.hasEncryptedPasswords = true;\n        }\n\n        info.valid = true;\n        db.close();\n    } while (false);\n\n    QSqlDatabase::removeDatabase(connectionName);\n\n    qCDebug(runtime) << \"Database info - valid:\" << info.valid\n                     << \"version:\" << info.schemaVersion\n                     << \"platform:\" << info.sourcePlatform\n                     << \"hasPasswords:\" << info.hasEncryptedPasswords;\n\n    return info;\n}\n\nQString LogDatabase::pendingImportPath()\n{\n    return dbDirectory().filePath(\"qlog.db.pending\");\n}\n\nbool LogDatabase::hasPendingImport()\n{\n    FCT_IDENTIFICATION;\n\n    bool exists = QFile::exists(pendingImportPath());\n    qCDebug(runtime) << \"Pending import exists:\" << exists;\n    return exists;\n}\n\nbool LogDatabase::processPendingImport()\n{\n    FCT_IDENTIFICATION;\n\n    const QString pendingPath = pendingImportPath();\n\n    if ( !QFile::exists(pendingPath) )\n    {\n        qCDebug(runtime) << \"No pending import\";\n        return true;\n    }\n\n    qCDebug(runtime) << \"Processing pending database import\";\n\n    const QString currentDbPath = dbFilename();\n    const QString walPath = currentDbPath + \"-wal\"; // remove also support files\n    const QString shmPath = currentDbPath + \"-shm\"; // remove also support files\n\n    if ( QFile::exists(currentDbPath) )\n    {\n        if ( !QFile::remove(currentDbPath) )\n        {\n            qWarning() << \"Cannot remove current database:\" << currentDbPath;\n            return false;\n        }\n    }\n\n    if ( QFile::exists(walPath) )\n        QFile::remove(walPath);\n\n    if ( QFile::exists(shmPath) )\n        QFile::remove(shmPath);\n\n    // Rename pending to current\n    if ( !QFile::rename(pendingPath, currentDbPath) )\n    {\n        qWarning() << \"Cannot rename pending database to current\";\n        return false;\n    }\n\n    qCDebug(runtime) << \"Pending database moved to current\";\n\n    if ( !openDatabase() )\n    {\n        qCritical() << \"Cannot open imported database\";\n        return false;\n    }\n\n    if ( !schemaVersionUpgrade() )\n    {\n        qCritical() << \"Schema migration failed\";\n        return false;\n    }\n\n    const QString passphrase = CredentialStore::instance()->getImportPassphrase();\n    if ( !passphrase.isEmpty() )\n    {\n        qCDebug(runtime) << \"Importing passwords from encrypted store\";\n\n        CredentialStore::instance()->deleteAllPasswords();\n\n        if ( !CredentialStore::instance()->importPasswords(passphrase) )\n        {\n            qCWarning(runtime) << \"Password import failed\";\n            passwordImportWarning = true;\n        }\n\n        CredentialStore::instance()->deleteImportPassphrase();\n    }\n\n    const QString paramsPath = PlatformParameterManager::pendingParametersPath();\n    if ( QFile::exists(paramsPath) )\n    {\n        qCDebug(runtime) << \"Applying platform-specific parameters\";\n\n        QList<PlatformParameter> params = PlatformParameterManager::loadParametersFromFile(paramsPath);\n        PlatformParameterManager::applyParameters(params);\n\n        QList<ProfileParameter> profileParams = PlatformParameterManager::loadProfileParametersFromFile(paramsPath);\n        PlatformParameterManager::applyProfileParameters(profileParams);\n\n        QFile::remove(paramsPath);\n    }\n\n    // For Flatpak target: apply fixed paths (TQSL, rigctld_path)\n    // This overrides any imported values with Flatpak-specific paths\n    PlatformParameterManager::applyFlatpakFixedPaths();\n\n    LogParam::removeEncryptedPasswords();\n    LogParam::removeSourcePlatform();\n\n    // Generate new LogID because we want to uniquie identified every log\n    QString newLogId = QUuid::createUuid().toString(QUuid::WithoutBraces);\n    LogParam::setLogID(newLogId);\n    qCDebug(runtime) << \"New LogID generated:\" << newLogId;\n\n    qCDebug(runtime) << \"Database import completed successfully\";\n\n    return true;\n}\n\n"
  },
  {
    "path": "core/LogDatabase.h",
    "content": "#ifndef QLOG_CORE_LOGDATABASE_H\n#define QLOG_CORE_LOGDATABASE_H\n\n#include <QString>\n#include <QDir>\n\nstruct DatabaseInfo\n{\n    bool valid = false;\n    int schemaVersion = 0;\n    QString sourcePlatform;\n    bool hasEncryptedPasswords = false;\n    QString errorMessage;\n};\n\nclass LogDatabase\n{\npublic:\n\n    static LogDatabase* instance()\n    {\n        static LogDatabase instance;\n        return &instance;\n    };\n\n    static QString PLATFORM_WINDOWS;\n    static QString PLATFORM_MACOS;\n    static QString PLATFORM_LINUX;\n    static QString PLATFORM_LINUXFLATPAK;\n\n    static QDir dbDirectory();\n    static QString dbFilename();\n    static QString currentPlatformId();\n\n    // Inspect a database file without opening it as main connection\n    // Returns information about the database (schema version, platform, etc.)\n    static DatabaseInfo inspectDatabase(const QString &filename);\n\n    // Path where pending import database is stored\n    static QString pendingImportPath();\n\n    // Check if there is a pending import to process\n    static bool hasPendingImport();\n\n    // Process pending import (called at startup)\n    // Returns true if import was successful or no import was pending\n    bool processPendingImport();\n\n    // Returns true if the last processPendingImport() failed to import passwords\n    // (passwords were deleted but could not be restored from the encrypted store)\n    bool hadPasswordImportWarning() const;\n\n    bool atomicCopy(const QString &filename);\n    bool openDatabase();\n    bool schemaVersionUpgrade(bool force = false);\n    bool createSQLFunctions();\n\nprivate:\n    LogDatabase();\n    bool passwordImportWarning = false;\n};\n\n#endif // QLOG_CORE_LOGDATABASE_H\n"
  },
  {
    "path": "core/LogLocale.cpp",
    "content": "#include \"LogLocale.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.loglocale\");\n\nLogLocale::LogLocale() :\n    regexp(QRegularExpression(R\"(, tttt|\\(t\\)|\\(tttt\\)|\\[tttt\\]|\\btttt\\b|\\btt\\b|\\bt\\b)\")),\n    is24hUsed(!timeFormat(QLocale::ShortFormat).contains(\"ap\", Qt::CaseInsensitive)),\n    isMetricUnitUsed(measurementSystem() == QLocale::MetricSystem)\n{\n    FCT_IDENTIFICATION;\n\n    systemDateFormat = dateFormat(QLocale::ShortFormat);\n    qCDebug(runtime) << systemDateFormat;\n\n    if ( systemDateFormat.contains(\"yy\") && !systemDateFormat.contains(\"yyyy\") )\n        systemDateFormat.replace(\"yy\", \"yyyy\");\n}\n\nvoid LogLocale::changeTime12_24Format(QString &formatString) const\n{\n    if ( getSettingUse24hformat() )\n        formatString.remove(\"ap\", Qt::CaseInsensitive).remove(\"a\", Qt::CaseInsensitive);\n    else if ( is24hUsed )\n    {\n        formatString += \" AP\";\n        formatString = formatString.toLower();\n    }\n}\n\nconst QString LogLocale::formatTimeLongWithoutTZ() const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << timeFormat(QLocale::LongFormat);\n\n    QString ret = timeFormat(QLocale::LongFormat).remove(regexp).trimmed();\n\n    changeTime12_24Format(ret);\n    qCDebug(runtime) << \"format:\" << ret;\n    return ret;\n}\n\nconst QString LogLocale::formatTimeShort() const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << timeFormat(QLocale::ShortFormat);\n\n    QString ret = timeFormat(QLocale::ShortFormat);\n\n    changeTime12_24Format(ret);\n    qCDebug(runtime) << \"format:\" << ret;\n    return ret;\n}\n\nconst QString LogLocale::formatTimeLong() const\n{\n    FCT_IDENTIFICATION;\n\n    QString ret = formatTimeLongWithoutTZ();\n    ret\n#if (QT_VERSION < QT_VERSION_CHECK(6, 5, 0))\n                                           .append(\" t\");\n#else\n                                           .append(\" ttt\");\n#endif\n\n    qCDebug(runtime) << \"format:\" << ret;\n    return ret;\n}\n\nconst QString LogLocale::formatDateShortWithYYYY() const\n{\n    FCT_IDENTIFICATION;\n\n    QString ret = (getSettingUseSystemDateFormat()) ? systemDateFormat : getSettingDateFormat();\n    qCDebug(runtime) << \"format:\" << ret;\n    return ret;\n}\n\nconst QString LogLocale::formatDateTimeShortWithYYYY() const\n{\n    FCT_IDENTIFICATION;\n\n    QString ret = formatDateShortWithYYYY() + \" \" + formatTimeShort();\n\n    qCDebug(runtime) << \"format:\" << ret;\n    return ret;\n}\n\nbool LogLocale::getSettingUse24hformat() const\n{\n    return settings.value(\"use24hformat\", is24hUsed).toBool();\n}\n\nvoid LogLocale::setSettingUse24hformat(bool value)\n{\n    settings.setValue(\"use24hformat\", value);\n}\n\nbool LogLocale::getSettingUseMetric() const\n{\n    return settings.value(\"usemetricformat\", isMetricUnitUsed).toBool();\n}\n\nvoid LogLocale::setSettingUseMetric(bool value)\n{\n    settings.setValue(\"usemetricformat\", value);\n}\n\nbool LogLocale::getSettingUseSystemDateFormat() const\n{\n    return settings.value(\"usesystemdateformat\", true).toBool();\n}\n\nvoid LogLocale::setSettingUseSystemDateFormat(bool value)\n{\n    settings.setValue(\"usesystemdateformat\", value);\n}\n\nconst QString LogLocale::getSettingDateFormat() const\n{\n    return settings.value(\"customdateformatstring\", systemDateFormat).toString();\n}\n\nvoid LogLocale::setSettingDateFormat(const QString &value)\n{\n    settings.setValue(\"customdateformatstring\", value);\n}\n\n"
  },
  {
    "path": "core/LogLocale.h",
    "content": "#ifndef QLOG_CORE_LOGLOCALE_H\n#define QLOG_CORE_LOGLOCALE_H\n\n#include <QSettings>\n#include <QLocale>\n#include <QRegularExpression>\n\nclass LogLocale : public QLocale\n{\npublic:\n    LogLocale();\n\n    const QString formatTimeLongWithoutTZ() const;\n    const QString formatTimeShort() const;\n    const QString formatTimeLong() const;\n    const QString formatDateShortWithYYYY() const;\n    const QString formatDateTimeShortWithYYYY() const;\n    bool getSettingUse24hformat() const;\n    void setSettingUse24hformat(bool value);\n\n    bool getSettingUseSystemDateFormat() const;\n    void setSettingUseSystemDateFormat(bool value);\n    const QString getSettingDateFormat() const;\n    void setSettingDateFormat(const QString &value);\n\n    bool getSettingUseMetric() const;\n    void setSettingUseMetric(bool value);\n\nprivate:\n    const QRegularExpression regexp;\n    bool is24hUsed;\n    bool isMetricUnitUsed;\n    QSettings settings;\n    QString systemDateFormat;\n\n    void changeTime12_24Format(QString &formatString) const;\n};\n\n#endif // QLOG_CORE_LOGLOCALE_H\n"
  },
  {
    "path": "core/LogParam.cpp",
    "content": "#include <QSqlQuery>\n#include <QCache>\n#include <QSqlError>\n\n#include \"LogParam.h\"\n#include \"debug.h\"\n#include \"data/Data.h\"\n#include \"models/LogbookModel.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.logparam\");\n\n#define PARAMMUTEXLOCKER     qCDebug(runtime) << \"Waiting for mutex\"; \\\n                             QMutexLocker locker(&cacheMutex); \\\n                             qCDebug(runtime) << \"Using logparam\"\n\nLogParam::LogParam(QObject *parent) :\n    QObject(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\nbool LogParam::setLOVParam(const QString &LOVName, const QVariant &value)\n{\n    return setParam(LOVName, value);\n}\n\nQDate LogParam::getLOVaParam(const QString &LOVName)\n{\n    return getParam(LOVName).toDate();\n}\n\nbool LogParam::setLastBackupDate(const QDate date)\n{\n    return setParam(\"last_backup\", date);\n}\n\nQDate LogParam::getLastBackupDate()\n{\n    return getParam(\"last_backup\").toDate();\n}\n\nbool LogParam::setLogID(const QString &id)\n{\n    return setParam(\"logid\", id);\n}\n\nQString LogParam::getLogID()\n{\n    return getParam(\"logid\").toString();\n}\n\nbool LogParam::setContestSeqnoType(const QVariant &data)\n{\n    return setParam(\"contest/seqnotype\", data);\n}\n\nint LogParam::getContestSeqnoType()\n{\n    return getParam(\"contest/seqnotype\", Data::SeqType::SINGLE).toInt();\n}\n\nbool LogParam::setContestManuDupeType(const QVariant &data)\n{\n    return setParam(\"contest/dupetype\", data);\n}\n\nint LogParam::getContestDupeType()\n{\n    return getParam(\"contest/dupetype\", Data::DupeType::ALL_BANDS).toInt();\n}\n\nbool LogParam::setContestLinkExchange(const QVariant &data)\n{\n    return setParam(\"contest/linkexchangetype\", data);\n}\n\nint LogParam::getContestLinkExchange()\n{\n    return getParam(\"contest/linkexchangetype\", LogbookModel::COLUMN_INVALID).toInt();\n}\n\nbool LogParam::setContestFilter(const QString &filterName)\n{\n    return setParam(\"contest/filter\", filterName);\n}\n\nQString LogParam::getContestFilter()\n{\n    return getParam(\"contest/filter\").toString();\n}\n\nbool LogParam::setContestID(const QString &contestID)\n{\n    return setParam(\"contest/contestid\", contestID);\n}\n\nQString LogParam::getContestID()\n{\n    return getParam(\"contest/contestid\", QString()).toString();\n}\n\nbool LogParam::setContestDupeDate(const QDateTime date)\n{\n    return setParam(\"contest/dupeDate\", date);\n}\n\nQDateTime LogParam::getContestDupeDate()\n{\n    return getParam(\"contest/dupeDate\").toDateTime();\n}\n\nvoid LogParam::removeConetstDupeDate()\n{\n    removeParamGroup(\"contest/dupeDate\");\n}\n\nbool LogParam::getDxccConfirmedByLotwState()\n{\n    return getParam(\"others/dxccconfirmedbylotw\", true).toBool();\n}\n\nbool LogParam::setDxccConfirmedByLotwState(bool state)\n{\n    return setParam(\"others/dxccconfirmedbylotw\", state);\n}\n\nbool LogParam::setDxccConfirmedByPaperState(bool state)\n{\n    return setParam(\"others/dxccconfirmedbypaper\", state);\n}\n\nbool LogParam::getDxccConfirmedByPaperState()\n{\n    return getParam(\"others/dxccconfirmedbypaper\", true).toBool();\n}\n\nbool LogParam::setDxccConfirmedByEqslState(bool state)\n{\n    return setParam(\"others/dxccconfirmedbyeqsl\", state);\n}\n\nbool LogParam::getDxccConfirmedByEqslState()\n{\n    return getParam(\"others/dxccconfirmedbyeqsl\", false).toBool();\n}\n\nint LogParam::getContestSeqno(const QString &band)\n{\n    return getParam(( band.isEmpty() ) ? \"contest/seqnos/single\"\n                                       : QString(\"contest/seqnos/%1\").arg(band), 1).toInt();\n}\n\nbool LogParam::setContestSeqno(int value, const QString &band)\n{\n    return setParam(( band.isEmpty() ) ? \"contest/seqnos/single\"\n                                       : QString(\"contest/seqnos/%1\").arg(band), value);\n}\n\nvoid LogParam::removeContestSeqno()\n{\n    removeParamGroup(\"contest/seqnos/\");\n}\n\nbool LogParam::setDXCTrendContinent(const QString &cont)\n{\n    return setParam(\"dxc/trendContinent\", cont);\n}\n\nQString LogParam::getDXCTrendContinent(const QString &def)\n{\n    return getParam(\"dxc/trendContinent\", def).toString();\n}\n\nvoid LogParam::removeDXCTrendContinent()\n{\n    removeParamGroup(\"dxc/trendContinent\");\n}\n\nQStringList LogParam::bandmapsWidgets()\n{\n    return getKeys(\"bandmap/\");\n}\n\nvoid LogParam::removeBandmapWidgetGroup(const QString &group)\n{\n    removeParamGroup(\"bandmap/\" + group);\n}\n\ndouble LogParam::getBandmapScrollFreq(const QString &widgetID, const QString &bandName)\n{\n    return getParam(\"bandmap/\" + widgetID + \"/\" + bandName + \"/scrollfreq\" , 0.0).toDouble();\n}\n\nbool LogParam::setBandmapScrollFreq(const QString &widgetID, const QString &bandName, double scroll)\n{\n    return setParam(\"bandmap/\" + widgetID + \"/\" + bandName + \"/scrollfreq\", scroll);\n}\n\nQVariant LogParam::getBandmapZoom(const QString &widgetID, const QString &bandName, const QVariant &defaultValue)\n{\n    return getParam(\"bandmap/\" + widgetID + \"/\" + bandName + \"/zoom\", defaultValue);\n}\n\nbool LogParam::setBandmapZoom(const QString &widgetID, const QString &bandName, const QVariant &zoom)\n{\n    return setParam(\"bandmap/\" + widgetID + \"/\" + bandName + \"/zoom\", zoom);\n}\n\nbool LogParam::setBandmapAging(const QString &widgetID, int aging)\n{\n    return setParam(\"bandmap/\" + widgetID + \"/spotaging\", aging);\n}\n\nint LogParam::getBandmapAging(const QString &widgetID)\n{\n    return getParam(\"bandmap/\" + widgetID + \"/spotaging\", 0).toInt();\n}\n\nbool LogParam::setBandmapCenterRX(const QString &widgetID, bool centerRX)\n{\n    return setParam(\"bandmap/\" + widgetID + \"/centerrx\", centerRX);\n}\n\nbool LogParam::getBandmapCenterRX(const QString &widgetID)\n{\n    return getParam(\"bandmap/\" + widgetID + \"/centerrx\", true).toBool();\n}\n\nbool LogParam::setBandmapShowEmergency(const QString &widgetID, bool show)\n{\n    return setParam(\"bandmap/\" + widgetID + \"/showemergency\", show);\n}\n\nbool LogParam::getBandmapShowEmergency(const QString &widgetID)\n{\n    return getParam(\"bandmap/\" + widgetID + \"/showemergency\", true).toBool();\n}\n\nQString LogParam::getUploadQSOLastCall()\n{\n    return getParam(\"uploadqso/lastcall\").toString();\n}\n\nvoid LogParam::setUploadQSOLastCall(const QString &call)\n{\n    setParam(\"uploadqso/lastcall\", call);\n}\n\nbool LogParam::getUploadeqslQSLComment()\n{\n    return getParam(\"uploadqso/eqsl/last_checkcomment\", false).toBool();\n}\n\nvoid LogParam::setUploadeqslQSLComment(const bool state)\n{\n    setParam(\"uploadqso/eqsl/last_checkcomment\", state);\n}\n\nbool LogParam::getUploadeqslQSLMessage()\n{\n    return getParam(\"uploadqso/eqsl/last_checkqslsmsg\", false).toBool();\n}\n\nQString LogParam::getUploadeqslQTHProfile()\n{\n    return getParam(\"uploadqso/eqsl/last_QTHProfile\").toString();\n}\n\nvoid LogParam::setUploadeqslQTHProfile(const QString &qthProfile)\n{\n    setParam(\"uploadqso/eqsl/last_QTHProfile\", qthProfile);\n}\n\nvoid LogParam::setUploadeqslQSLMessage(const bool state)\n{\n    setParam(\"uploadqso/eqsl/last_checkqslsmsg\", state);\n}\n\nbool LogParam::getUploadServiceState(const QString &name)\n{\n    return getParam(\"uploadqso/\" + name + \"/enabled\", false).toBool();\n}\n\nvoid LogParam::setUploadServiceState(const QString &name, bool state)\n{\n    setParam(\"uploadqso/\" + name + \"/enabled\", state);\n}\n\nint LogParam::getUploadQSOFilterType()\n{\n    return getParam(\"uploadqso/filtertype\").toInt();\n}\n\nvoid LogParam::setUploadQSOFilterType(int filterID)\n{\n    setParam(\"uploadqso/filtertype\", filterID);\n}\n\nQString LogParam::getUploadLoTWLocation()\n{\n    return getParam(\"uploadqso/lotw/last_location\").toString();\n}\n\nvoid LogParam::setUploadLoTWLocation(const QString &location)\n{\n    setParam(\"uploadqso/lotw/last_location\", location);\n}\n\nbool LogParam::getDownloadQSLServiceState(const QString &name)\n{\n    return getParam(\"downloadqsl/\" + name + \"/enabled\", false).toBool();\n}\n\nvoid LogParam::setDownloadQSLServiceState(const QString &name, bool state)\n{\n    setParam(\"downloadqsl/\" + name + \"/enabled\", state);\n}\n\nQDate LogParam::getDownloadQSLServiceLastDate(const QString &name)\n{\n    return getParam(\"downloadqsl/\" + name + \"/lastdate\", QDate(1900, 1, 1)).toDate();\n}\n\nvoid LogParam::setDownloadQSLServiceLastDate(const QString &name, const QDate &date)\n{\n    setParam(\"downloadqsl/\" + name + \"/lastdate\", date);\n}\n\nbool LogParam::getDownloadQSLServiceLastQSOQSL(const QString &name)\n{\n    return getParam(\"downloadqsl/\" + name + \"/qsoqsl\", true).toBool();\n}\n\nvoid LogParam::setDownloadQSLServiceLastQSOQSL(const QString &name, bool state)\n{\n    setParam(\"downloadqsl/\" + name + \"/qsoqsl\", state);\n}\n\nQString LogParam::getDownloadQSLLoTWLastCall()\n{\n    return getParam(\"downloadqsl/lotw/lastmycallsign\").toString();\n}\n\nvoid LogParam::setDownloadQSLLoTWLastCall(const QString &call)\n{\n    setParam(\"downloadqsl/lotw/lastmycallsign\", call);\n}\n\nQString LogParam::getDownloadQSLeQSLLastProfile()\n{\n    return getParam(\"downloadqsl/eqsl/lastqthprofile\").toString();\n}\n\nvoid LogParam::setDownloadQSLeQSLLastProfile(const QString &profile)\n{\n    setParam(\"downloadqsl/eqsl/lastqthprofile\", profile);\n}\n\nQString LogParam::getQRZCOMCallbookUsername()\n{\n    return getParam(\"services/qrzcom/callbook/username\").toString().trimmed();\n}\n\nvoid LogParam::setQRZCOMCallbookUsername(const QString &username)\n{\n    setParam(\"services/qrzcom/callbook/username\", username);\n}\n\nQStringList LogParam::getQRZCOMAPICallsignsList()\n{\n    return getParamStringList(\"services/qrzcom/logbook/apicallsigns\");\n}\n\nvoid LogParam::setQRZCOMAPICallsignsList(const QStringList &list)\n{\n    setParam(\"services/qrzcom/logbook/apicallsigns\", list);\n}\n\nQString LogParam::getCloudlogAPIEndpoint()\n{\n    return getParam(\"services/cloudlog/logbook/endpoint\", \"http://localhost\").toString();\n}\n\nvoid LogParam::setCloudlogAPIEndpoint(const QString &endpoint)\n{\n    setParam(\"services/cloudlog/logbook/endpoint\", endpoint);\n}\n\nuint LogParam::getCloudlogStationID()\n{\n    return getParam(\"services/cloudlog/logbook/stationid\").toUInt();\n}\n\nvoid LogParam::setCloudlogStationID(uint stationID)\n{\n    setParam(\"services/cloudlog/logbook/stationid\", stationID);\n}\n\nQString LogParam::getClublogLogbookReqEmail()\n{\n    return getParam(\"services/clublog/logbook/regemail\").toString().trimmed();\n}\n\nvoid LogParam::setClublogLogbookReqEmail(const QString &email)\n{\n    setParam(\"services/clublog/logbook/regemail\", email);\n}\n\nbool LogParam::getClublogUploadImmediatelyEnabled()\n{\n    return getParam(\"services/clublog/logbook/uploadimmediately\", false).toBool();\n}\n\nvoid LogParam::setClublogUploadImmediatelyEnabled(bool state)\n{\n    setParam(\"services/clublog/logbook/uploadimmediately\", state);\n}\n\nQString LogParam::getEQSLLogbookUsername()\n{\n    return getParam(\"services/eqsl/logbook/username\").toString().trimmed();\n}\n\nvoid LogParam::setEQSLLogbookUsername(const QString &username)\n{\n    setParam(\"services/eqsl/logbook/username\", username);\n}\n\nQString LogParam::getHamQTHCallbookUsername()\n{\n    return getParam(\"services/hamqth/callbook/username\").toString().trimmed();\n}\n\nvoid LogParam::setHamQTHCallbookUsername(const QString &username)\n{\n    setParam(\"services/hamqth/callbook/username\", username);\n}\n\nQString LogParam::getHRDLogLogbookReqCallsign()\n{\n    return getParam(\"services/hrdlog/logbook/regcallsign\").toString().trimmed();\n}\n\nvoid LogParam::setHRDLogLogbookReqCallsign(const QString &callsign)\n{\n    setParam(\"services/hrdlog/logbook/regcallsign\", callsign);\n}\n\nbool LogParam::getHRDLogOnAir()\n{\n    return getParam(\"services/hrdlog/logbook/onair\", false).toBool();\n}\n\nvoid LogParam::setHRDLogOnAir(bool state)\n{\n    setParam(\"services/hrdlog/logbook/onair\", state);\n}\n\nQString LogParam::getKSTChatUsername()\n{\n    return getParam(\"services/kst/chat/username\").toString().trimmed();\n}\n\nvoid LogParam::setKSTChatUsername(const QString &username)\n{\n    setParam(\"services/kst/chat/username\", username);\n}\n\nQString LogParam::getLoTWCallbookUsername()\n{\n    return getParam(\"services/lotw/callbook/username\").toString().trimmed();\n}\n\nvoid LogParam::setLoTWCallbookUsername(const QString &username)\n{\n    setParam(\"services/lotw/callbook/username\", username);\n}\n\nQString LogParam::getLoTWTQSLPath(const QString &defaultPath)\n{\n    return getParam(\"services/lotw/callbook/tqsl\", defaultPath).toString().trimmed();\n}\n\nvoid LogParam::setLoTWTQSLPath(const QString &path)\n{\n    setParam(\"services/lotw/callbook/tqsl\", path);\n}\n\nbool LogParam::isLoTWTQSLPathKey(const QString &key)\n{\n    return key.compare(\"services/lotw/callbook/tqsl\", Qt::CaseInsensitive) == 0;\n}\n\nQString LogParam::getPrimaryCallbook(const QString &defaultValue)\n{\n    return getParam(\"callbook/primary\", defaultValue).toString();\n}\n\nvoid LogParam::setPrimaryCallbook(const QString &callbookName)\n{\n    setParam(\"callbook/primary\", callbookName);\n}\n\nQString LogParam::getSecondaryCallbook(const QString &defaultValue)\n{\n    return getParam(\"callbook/secondary\", defaultValue).toString();\n}\n\nvoid LogParam::setSecondaryCallbook(const QString &callbookName)\n{\n    setParam(\"callbook/secondary\", callbookName);\n}\n\nQString LogParam::getCallbookWebLookupURL(const QString &defaultURL)\n{\n    return getParam(\"callbook/weblookupurl\", defaultURL).toString();\n}\n\nvoid LogParam::setCallbookWebLookupURL(const QString &url)\n{\n    setParam(\"callbook/weblookupurl\", url);\n}\n\nQString LogParam::getNetworkNotifLogQSOAddrs()\n{\n    return getParam(\"network/notif/log/qso/addrs\").toString();\n}\n\nvoid LogParam::setNetworkNotifLogQSOAddrs(const QString &addrs)\n{\n    setParam(\"network/notif/log/qso/addrs\", addrs);\n}\n\nQString LogParam::getNetworkNotifDXCSpotAddrs()\n{\n    return getParam(\"network/notif/dxc/spot/addrs\").toString();\n}\n\nvoid LogParam::setNetworkNotifDXCSpotAddrs(const QString &addrs)\n{\n    setParam(\"network/notif/dxc/spot/addrs\", addrs);\n}\n\nQString LogParam::getNetworkNotifWSJTXCQSpotAddrs()\n{\n    return getParam(\"network/notif/wsjtx/cqspot/addrs\").toString();\n}\n\nvoid LogParam::setNetworkNotifWSJTXCQSpotAddrs(const QString &addrs)\n{\n    setParam(\"network/notif/wsjtx/cqspot/addrs\", addrs);\n}\n\nQString LogParam::getNetworkNotifAlertsSpotAddrs()\n{\n    return getParam(\"network/notif/alerts/spot/addrs\").toString();\n}\n\nvoid LogParam::setNetworkNotifAlertsSpotAddrs(const QString &addrs)\n{\n    setParam(\"network/notif/alerts/spot/addrs\", addrs);\n}\n\nQString LogParam::getNetworkNotifRigStateAddrs()\n{\n    return getParam(\"network/notif/rig/state/addrs\").toString();\n}\n\nvoid LogParam::setNetworkNotifRigStateAddrs(const QString &addrs)\n{\n    setParam(\"network/notif/rig/state/addrs\", addrs);\n}\n\nint LogParam::getNetworkWsjtxListenerPort(int defaultPort)\n{\n    return getParam(\"network/listener/wsjtx/port\", defaultPort).toInt();\n}\n\nvoid LogParam::setNetworkNotifRigStateAddrs(int port)\n{\n    setParam(\"network/listener/wsjtx/port\", port);\n}\n\nQString LogParam::getNetworkWsjtxForwardAddrs()\n{\n    return getParam(\"network/forwarder/wsjtx/addrs\").toString();\n}\n\nvoid LogParam::setNetworkWsjtxForwardAddrs(const QString &addrs)\n{\n    setParam(\"network/forwarder/wsjtx/addrs\", addrs);\n}\n\nbool LogParam::getNetworkWsjtxListenerJoinMulticast()\n{\n    return getParam(\"network/listener/wsjtx/multicast/join\", false).toBool();\n}\n\nvoid LogParam::setNetworkWsjtxListenerJoinMulticast(bool state)\n{\n    setParam(\"network/listener/wsjtx/multicast/join\", state);\n}\n\nQString LogParam::getNetworkWsjtxListenerMulticastAddr()\n{\n    return getParam(\"network/listener/wsjtx/multicast/addr\").toString();\n}\n\nvoid LogParam::setNetworkWsjtxListenerMulticastAddr(const QString &addr)\n{\n    setParam(\"network/listener/wsjtx/multicast/addr\", addr);\n}\n\nint LogParam::getNetworkWsjtxListenerMulticastTTL()\n{\n    return getParam(\"network/listener/wsjtx/multicast/ttl\").toInt();\n}\n\nvoid LogParam::setNetworkWsjtxListenerMulticastTTL(int ttl)\n{\n    setParam(\"network/listener/wsjtx/multicast/ttl\", ttl);\n}\n\nQStringList LogParam::getEnabledMemberlists()\n{\n    return getParamStringList(\"memberlist/enabledlists\");\n}\n\nvoid LogParam::setEnabledMemberlists(const QStringList &list)\n{\n    setParam(\"memberlist/enabledlists\", list);\n}\n\nint LogParam::getAlertAging()\n{\n    return getParam(\"alert/aging\").toInt();\n}\n\nvoid LogParam::setAlertAging(int aging)\n{\n    setParam(\"alert/aging\", aging);\n}\n\nQByteArray LogParam::getAlertWidgetState()\n{\n    return QByteArray::fromBase64(getParam(\"alert/widgetstate\").toByteArray());\n}\n\nvoid LogParam::setAlertWidgetState(const QByteArray &state)\n{\n    setParam(\"alert/widgetstate\", state.toBase64());\n}\n\nbool LogParam::getCWConsoleSendWord()\n{\n    return getParam(\"cwconsole/sendword\", false).toBool();\n}\n\nvoid LogParam::setCWConsoleSendWord(bool state)\n{\n    setParam(\"cwconsole/sendword\", state);\n}\n\nbool LogParam::getChatSelectedRoom()\n{\n    return getParam(\"chat/selectedroom\", 0).toInt();\n}\n\nvoid LogParam::setChatSelectedRoom(int room)\n{\n    setParam(\"chat/selectedroom\", room);\n}\n\ndouble LogParam::getNewContactFreq()\n{\n    return getParam(\"newcontact/freq\", 3.5).toDouble();\n}\n\nvoid LogParam::setNewContactFreq(double freq)\n{\n    setParam(\"newcontact/freq\", freq);\n}\n\nQString LogParam::getNewContactMode()\n{\n    return getParam(\"newcontact/mode\", \"CW\").toString();\n}\n\nvoid LogParam::setNewContactMode(const QString &mode)\n{\n    setParam(\"newcontact/mode\", mode);\n}\n\nQString LogParam::getNewContactSubMode()\n{\n    return getParam(\"newcontact/submode\").toString();\n}\n\nvoid LogParam::setNewContactSubMode(const QString &submode)\n{\n    setParam(\"newcontact/submode\", submode);\n}\n\ndouble LogParam::getNewContactPower()\n{\n    return getParam(\"newcontact/power\", 100).toDouble();\n}\n\nvoid LogParam::setNewContactPower(double power)\n{\n    setParam(\"newcontact/power\", power);\n}\n\nint LogParam::getNewContactTabIndex()\n{\n    return getParam(\"newcontact/tabindex\", 0).toInt();\n}\n\nvoid LogParam::setNewContactTabIndex(int index)\n{\n    setParam(\"newcontact/tabindex\", index);\n}\n\nQString LogParam::getNewContactQSLSent()\n{\n    return getParam(\"newcontact/sqlsent\", \"Q\").toString();\n}\n\nvoid LogParam::setNewContactQSLSent(const QString &qslsent)\n{\n    setParam(\"newcontact/sqlsent\", qslsent);\n}\n\nQString LogParam::getNewContactLoTWQSLSent()\n{\n    return getParam(\"newcontact/lotwsqlsent\", \"Q\").toString();\n}\n\nvoid LogParam::setNewContactLoTWQSLSent(const QString &qslsent)\n{\n    setParam(\"newcontact/lotwsqlsent\", qslsent);\n}\n\nQString LogParam::getNewContactEQSLWQSLSent()\n{\n    return getParam(\"newcontact/eqslsqlsent\", \"Q\").toString();\n}\n\nvoid LogParam::setNewContactEQSLQSLSent(const QString &qslsent)\n{\n    setParam(\"newcontact/eqslsqlsent\", qslsent);\n}\n\nQString LogParam::getNewContactQSLVia()\n{\n    return getParam(\"newcontact/qslvia\").toString();\n}\n\nvoid LogParam::setNewContactQSLVia(const QString &qslvia)\n{\n    setParam(\"newcontact/qslvia\", qslvia);\n}\n\nQString LogParam::getNewContactPropMode()\n{\n    return getParam(\"newcontact/propmode\").toString();\n}\n\nvoid LogParam::setNewContactPropMode(const QString &propmode)\n{\n    setParam(\"newcontact/propmode\", propmode);\n}\n\nbool LogParam::getNewContactTabsExpanded()\n{\n    return getParam(\"newcontact/tabsexpand\", true).toBool();\n}\n\nvoid LogParam::setNewContactTabsExpanded(bool state)\n{\n    setParam(\"newcontact/tabsexpand\", state);\n}\n\nQString LogParam::getNewContactSatName()\n{\n    return getParam(\"newcontact/satname\").toString();\n}\n\nvoid LogParam::setNewContactSatName(const QString &name)\n{\n    setParam(\"newcontact/satname\", name);\n}\n\nQStringList LogParam::getMapLayerStates(const QString &widgetID)\n{\n    return getKeys(widgetID + \"/layerstate/\");\n}\n\nbool LogParam::getMapLayerState(const QString &widgetID, const QString &layerName)\n{\n    return getParam(widgetID + \"/layerstate/\" + layerName).toBool();\n}\n\nvoid LogParam::setMapLayerState(const QString &widgetID, const QString &layerName, bool state)\n{\n    setParam(widgetID + \"/layerstate/\" + layerName, state);\n}\n\nuint LogParam::getWsjtxFilterDxccStatus()\n{\n    return getParam(\"wsjtx/filter/dxccstatus\", (DxccStatus::NewEntity | DxccStatus::NewBand |\n                                                DxccStatus::NewMode   | DxccStatus::NewSlot |\n                                                DxccStatus::Worked    | DxccStatus::Confirmed)).toUInt();\n}\n\nvoid LogParam::setWsjtxFilterDxccStatus(uint mask)\n{\n    setParam(\"wsjtx/filter/dxccstatus\", mask);\n}\n\nQString LogParam::getWsjtxFilterContRE()\n{\n    return getParam(\"wsjtx/filter/contregexp\", \"NOTHING|AF|AN|AS|EU|NA|OC|SA\").toString();\n}\n\nvoid LogParam::setWsjtxFilterContRE(const QString &re)\n{\n    setParam(\"wsjtx/filter/contregexp\", re);\n}\n\nint LogParam::getWsjtxFilterDistance()\n{\n    return getParam(\"wsjtx/filter/distance\", 0).toInt();\n}\n\nvoid LogParam::setWsjtxFilterDistance(int dist)\n{\n    setParam(\"wsjtx/filter/distance\", dist);\n}\n\nint LogParam::getWsjtxFilterSNR()\n{\n    return getParam(\"wsjtx/filter/snr\", -41).toInt();\n}\n\nvoid LogParam::setWsjtxFilterSNR(int snr)\n{\n    setParam(\"wsjtx/filter/snr\", snr);\n}\n\nQStringList LogParam::getWsjtxMemberlists()\n{\n    return getParamStringList(\"wsjtx/filter/memberlists\");\n}\n\nvoid LogParam::setWsjtxMemberlists(const QStringList &list)\n{\n    setParam(\"wsjtx/filter/memberlists\", list);\n}\n\nQByteArray LogParam::getWsjtxWidgetState()\n{\n    return QByteArray::fromBase64(getParam(\"wsjtx/widgetstate\").toByteArray());\n}\n\nvoid LogParam::setWsjtxWidgetState(const QByteArray &state)\n{\n    setParam(\"wsjtx/widgetstate\", state.toBase64());\n}\n\nbool LogParam::getWsjtxOutputColorCQSpot()\n{\n    return getParam(\"wsjtx/output/colorcqspot\", false).toBool();\n}\n\nvoid LogParam::setWsjtxOutputColorCQSpot(bool state)\n{\n    setParam(\"wsjtx/output/colorcqspot\", state);\n}\n\nuint LogParam::getDXCFilterDxccStatus()\n{\n    return getParam(\"dxc/filter/dx/dxccstatus\", (DxccStatus::NewEntity | DxccStatus::NewBand |\n                                                 DxccStatus::NewMode   | DxccStatus::NewSlot |\n                                                 DxccStatus::Worked    | DxccStatus::Confirmed)).toUInt();\n}\n\nvoid LogParam::setDXCFilterDxccStatus(uint mask)\n{\n    setParam(\"dxc/filter/dx/dxccstatus\", mask);\n}\n\nQString LogParam::getDXCFilterContRE()\n{\n    return getParam(\"dxc/filter/dx/contregexp\", \"NOTHING|AF|AN|AS|EU|NA|OC|SA\").toString();\n}\n\nvoid LogParam::setDXCFilterContRE(const QString &re)\n{\n    setParam(\"dxc/filter/dx/contregexp\", re);\n}\n\nQString LogParam::getDXCFilterSpotterContRE()\n{\n    return getParam(\"dxc/filter/spotter/contregexp\", \"NOTHING|AF|AN|AS|EU|NA|OC|SA\").toString();\n}\n\nvoid LogParam::setDXCFilterSpotterContRE(const QString &re)\n{\n    setParam(\"dxc/filter/spotter/contregexp\", re);\n}\n\nbool LogParam::getDXCFilterDedup()\n{\n    return getParam(\"dxc/filter/dedup\", false).toBool();\n}\n\nvoid LogParam::setDXCFilterDedup(bool state)\n{\n    setParam(\"dxc/filter/dedup\", state);\n}\n\nint LogParam::getDXCFilterDedupTime(int defaultValue)\n{\n    return getParam(\"dxc/filter/deduptime\", defaultValue).toInt();\n}\n\nvoid LogParam::setDXCFilterDedupTime(int value)\n{\n    setParam(\"dxc/filter/deduptime\", value);\n}\n\nint LogParam::getDXCFilterDedupFreq(int defaultValue)\n{\n    return getParam(\"dxc/filter/dedupfreq\", defaultValue).toInt();\n}\n\nvoid LogParam::setDXCFilterDedupFreq(int value)\n{\n    setParam(\"dxc/filter/dedupfreq\", value);\n}\n\nQStringList LogParam::getDXCFilterMemberlists()\n{\n    return getParamStringList(\"dxc/filter/dx/memberlists\");\n}\n\nvoid LogParam::setDXCFilterMemberlists(const QStringList &list)\n{\n    setParam(\"dxc/filter/dx/memberlists\", list);\n}\n\nbool LogParam::getDXCAutoconnectServer()\n{\n    return getParam(\"dxc/autoconnect\", false).toBool();\n}\n\nvoid LogParam::setDXCAutoconnectServer(bool state)\n{\n    setParam(\"dxc/autoconnect\", state);\n}\n\nbool LogParam::getDXCKeepQSOs()\n{\n    return getParam(\"dxc/keepqsos\", false).toBool();\n}\n\nvoid LogParam::setDXCKeepQSOs(bool state)\n{\n    setParam(\"dxc/keepqsos\", state);\n}\n\nQByteArray LogParam::getDXCDXTableState()\n{\n    return QByteArray::fromBase64(getParam(\"dxc/dxtablestate\").toByteArray());\n}\n\nvoid LogParam::setDXCDXTableState(const QByteArray &state)\n{\n    setParam(\"dxc/dxtablestate\", state.toBase64());\n}\n\nQByteArray LogParam::getDXCWCYTableState()\n{\n    return QByteArray::fromBase64(getParam(\"dxc/wcytablestate\").toByteArray());\n}\n\nvoid LogParam::setDXCWCYTableState(const QByteArray &state)\n{\n    setParam(\"dxc/wcytablestate\", state.toBase64());\n}\n\nQByteArray LogParam::getDXCWWVTableState()\n{\n    return QByteArray::fromBase64(getParam(\"dxc/wwvtablestate\").toByteArray());\n}\n\nvoid LogParam::setDXCWWVTableState(const QByteArray &state)\n{\n    setParam(\"dxc/wwvtablestate\", state.toBase64());\n}\n\nQByteArray LogParam::getDXCTOALLTableState()\n{\n    return QByteArray::fromBase64(getParam(\"dxc/toalltablestate\").toByteArray());\n}\n\nvoid LogParam::setDXCTOALLTableState(const QByteArray &state)\n{\n    setParam(\"dxc/toalltablestate\", state.toBase64());\n}\n\nint LogParam::getDXCConsoleFontSize()\n{\n    return getParam(\"dxc/console/fontsize\", -1).toInt();\n}\n\nvoid LogParam::setDXCConsoleFontSize(int value)\n{\n    setParam(\"dxc/console/fontsize\", value);\n}\n\nQStringList LogParam::getDXCServerlist()\n{\n    return getParamStringList(\"dxc/serverlist\", {\"hamqth.com:7300\"});\n}\n\nvoid LogParam::setDXCServerlist(const QStringList &list)\n{\n    setParam(\"dxc/serverlist\", list);\n}\n\nQString LogParam::getDXCLastServer()\n{\n    return getParam(\"dxc/lastserver\").toString();\n}\n\nvoid LogParam::setDXCLastServer(const QString &server)\n{\n    setParam(\"dxc/lastserver\", server);\n}\n\nQString LogParam::getDXCFilterModeRE()\n{\n    QString defaultValue = \"NOTHING|\"\n            + BandPlan::MODE_GROUP_STRING_PHONE + \"|\"\n            + BandPlan::MODE_GROUP_STRING_CW + \"|\"\n            + BandPlan::MODE_GROUP_STRING_FTx + \"|\"\n            + BandPlan::MODE_GROUP_STRING_DIGITAL;\n    return getParam(\"dxc/filter/dx/moderegexp\", defaultValue).toString();\n}\n\nvoid LogParam::setDXCFilterModeRE(const QString &re)\n{\n    setParam(\"dxc/filter/dx/moderegexp\", re);\n}\n\nQStringList LogParam::getDXCExcludedBands()\n{\n    return getParamStringList(\"dxc/filter/excludedbands\");\n}\n\nvoid LogParam::setDXCExcludedBands(const QStringList &excluded)\n{\n    setParam(\"dxc/filter/excludedbands\", excluded);\n}\n\nQSet<int> LogParam::getExportColumnSet(const QString &paramName, const QSet<int> &defaultValue)\n{\n    QSet<int> set;\n    QStringList defaultValueList;\n\n    for (int val : defaultValue)\n        defaultValueList << QString::number(val);\n\n    const QStringList sourceList = getParamStringList(\"exportadi/\" + paramName, defaultValueList);\n\n    for (const QString &s : sourceList)\n        set.insert(s.toInt());\n\n    return set;\n}\n\nvoid LogParam::setExportColumnSet(const QString &paramName, const QSet<int> &set)\n{\n    QStringList valueList;\n\n    for (int val : set)\n        valueList << QString::number(val);\n\n    setParam(\"exportadi/\" + paramName, valueList);\n}\n\nQByteArray LogParam::getLogbookState()\n{\n    return QByteArray::fromBase64(getParam(\"logbook/maintablestate\").toByteArray());\n}\n\nvoid LogParam::setLogbookState(const QByteArray &state)\n{\n    setParam(\"logbook/maintablestate\", state.toBase64());\n}\n\nint LogParam::getLogbookFilterSearchType(int defaultValue)\n{\n    return getParam(\"logbook/filter/searchtype\", defaultValue).toInt();\n}\n\nvoid LogParam::setLogbookFilterSearchType(int type)\n{\n    setParam(\"logbook/filter/searchtype\", type);\n}\n\nQString LogParam::getLogbookFilterBand()\n{\n    return getParam(\"logbook/filter/band\").toString();\n}\n\nvoid LogParam::setLogbookFilterBand(const QString &name)\n{\n    setParam(\"logbook/filter/band\", name);\n}\n\nQString LogParam::getLogbookFilterMode()\n{\n    return getParam(\"logbook/filter/mode\").toString();\n}\n\nvoid LogParam::setLogbookFilterMode(const QString &name)\n{\n    setParam(\"logbook/filter/mode\", name);\n}\n\nQString LogParam::getLogbookFilterCountry()\n{\n    return getParam(\"logbook/filter/country\").toString();\n}\n\nvoid LogParam::setLogbookFilterCountry(const QString &name)\n{\n    setParam(\"logbook/filter/country\", name);\n}\n\nQString LogParam::getLogbookFilterUserFilter()\n{\n    return getParam(\"logbook/filter/userfilter\").toString();\n}\n\nvoid LogParam::setLogbookFilterUserFilter(const QString &name)\n{\n    setParam(\"logbook/filter/userfilter\", name);\n}\n\nQString LogParam::getLogbookFilterClub()\n{\n    return getParam(\"logbook/filter/club\").toString();\n}\n\nvoid LogParam::setLogbookFilterClub(const QString &name)\n{\n    setParam(\"logbook/filter/club\", name);\n}\n\nQByteArray LogParam::getEncryptedPasswords()\n{\n    return QByteArray::fromBase64(getParam(\"security/encryptedpasswords\").toByteArray());\n}\n\nvoid LogParam::setEncryptedPasswords(const QByteArray &data)\n{\n    setParam(\"security/encryptedpasswords\", data.toBase64());\n}\n\nvoid LogParam::removeEncryptedPasswords()\n{\n    removeParamGroup(\"security/encryptedpasswords\");\n}\n\nQString LogParam::getSourcePlatform()\n{\n    return getParam(\"sourceplatform\").toString();\n}\n\nvoid LogParam::setSourcePlatform(const QString &platform)\n{\n    setParam(\"sourceplatform\", platform);\n}\n\nvoid LogParam::removeSourcePlatform()\n{\n    removeParamGroup(\"sourceplatform\");\n}\n\nbool LogParam::getMainWindowAlertBeep()\n{\n    return getParam(\"mainwindow/alertbeep\", false).toBool();\n}\n\nvoid LogParam::setMainWindowAlertBeep(bool state)\n{\n    setParam(\"mainwindow/alertbeep\", state);\n}\n\nint LogParam::getMainWindowDarkMode()\n{\n    return getParam(\"mainwindow/darkmode\", 0).toInt();\n}\n\nvoid LogParam::setMainWindowDarkMode(int state)\n{\n    setParam(\"mainwindow/darkmode\", state);\n}\n\nQByteArray LogParam::getMainWindowGeometry()\n{\n    return QByteArray::fromBase64(getParam(\"mainwindow/geometry\").toByteArray());\n}\n\nvoid LogParam::setMainWindowGeometry(const QByteArray &state)\n{\n    setParam(\"mainwindow/geometry\", state.toBase64());\n}\n\nQByteArray LogParam::getMainWindowState()\n{\n    return QByteArray::fromBase64(getParam(\"mainwindow/state\").toByteArray());\n}\n\nvoid LogParam::setMainWindowState(const QByteArray &state)\n{\n    setParam(\"mainwindow/state\", state.toBase64());\n}\n\nQString LogParam::getMainWindowBandmapWidgets()\n{\n    return getParam(\"mainwindow/bandmapwidgets\").toString();\n}\n\nvoid LogParam::setMainWindowBandmapWidgets(const QString &value)\n{\n    setParam(\"mainwindow/bandmapwidgets\", value);\n}\n\nvoid LogParam::removeMainWindowBandmapWidgets()\n{\n    removeParamGroup(\"mainwindow/bandmapwidgets\");\n}\n\nint LogParam::getQslLabelTemplate()\n{\n    return getParam(\"qsllabel/template\", 0).toInt();\n}\n\nvoid LogParam::setQslLabelTemplate(int index)\n{\n    setParam(\"qsllabel/template\", index);\n}\n\nQString LogParam::getQslLabelFooterLeft()\n{\n    return getParam(\"qsllabel/footerleft\", \"\").toString();\n}\n\nvoid LogParam::setQslLabelFooterLeft(const QString &text)\n{\n    setParam(\"qsllabel/footerleft\", text);\n}\n\nQString LogParam::getQslLabelFooterRight()\n{\n    return getParam(\"qsllabel/footerright\", \"TNX & 73\").toString();\n}\n\nvoid LogParam::setQslLabelFooterRight(const QString &text)\n{\n    setParam(\"qsllabel/footerright\", text);\n}\n\nint LogParam::getQslLabelSkip()\n{\n    return getParam(\"qsllabel/skip\", 0).toInt();\n}\n\nvoid LogParam::setQslLabelSkip(int count)\n{\n    setParam(\"qsllabel/skip\", count);\n}\n\nint LogParam::getQslLabelZoom()\n{\n    return getParam(\"qsllabel/zoom\", 100).toInt();\n}\n\nvoid LogParam::setQslLabelZoom(int zoom)\n{\n    setParam(\"qsllabel/zoom\", zoom);\n}\n\nint LogParam::getQslLabelCustomPageSize()\n{\n    return getParam(\"qsllabel/custom_pagesize\", 0).toInt();\n}\n\nvoid LogParam::setQslLabelCustomPageSize(int pageSizeIndex)\n{\n    setParam(\"qsllabel/custom_pagesize\", pageSizeIndex);\n}\n\nint LogParam::getQslLabelCustomCols()\n{\n    return getParam(\"qsllabel/custom_cols\", 3).toInt();\n}\n\nvoid LogParam::setQslLabelCustomCols(int cols)\n{\n    setParam(\"qsllabel/custom_cols\", cols);\n}\n\nint LogParam::getQslLabelCustomRows()\n{\n    return getParam(\"qsllabel/custom_rows\", 8).toInt();\n}\n\nvoid LogParam::setQslLabelCustomRows(int rows)\n{\n    setParam(\"qsllabel/custom_rows\", rows);\n}\n\ndouble LogParam::getQslLabelCustomLabelWidth()\n{\n    return getParam(\"qsllabel/custom_labelwidth\", 70.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomLabelWidth(double width)\n{\n    setParam(\"qsllabel/custom_labelwidth\", width);\n}\n\ndouble LogParam::getQslLabelCustomLabelHeight()\n{\n    return getParam(\"qsllabel/custom_labelheight\", 35.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomLabelHeight(double height)\n{\n    setParam(\"qsllabel/custom_labelheight\", height);\n}\n\ndouble LogParam::getQslLabelCustomLeftMargin()\n{\n    return getParam(\"qsllabel/custom_leftmargin\", 0.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomLeftMargin(double margin)\n{\n    setParam(\"qsllabel/custom_leftmargin\", margin);\n}\n\ndouble LogParam::getQslLabelCustomTopMargin()\n{\n    return getParam(\"qsllabel/custom_topmargin\", 0.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomTopMargin(double margin)\n{\n    setParam(\"qsllabel/custom_topmargin\", margin);\n}\n\ndouble LogParam::getQslLabelCustomHSpacing()\n{\n    return getParam(\"qsllabel/custom_hspacing\", 0.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomHSpacing(double spacing)\n{\n    setParam(\"qsllabel/custom_hspacing\", spacing);\n}\n\ndouble LogParam::getQslLabelCustomVSpacing()\n{\n    return getParam(\"qsllabel/custom_vspacing\", 0.0).toDouble();\n}\n\nvoid LogParam::setQslLabelCustomVSpacing(double spacing)\n{\n    setParam(\"qsllabel/custom_vspacing\", spacing);\n}\n\nbool LogParam::getQslLabelPrintBorders()\n{\n    return getParam(\"qsllabel/print_borders\", false).toBool();\n}\n\nvoid LogParam::setQslLabelPrintBorders(bool enabled)\n{\n    setParam(\"qsllabel/print_borders\", enabled);\n}\n\nQString LogParam::getQslLabelDateFormat()\n{\n    return getParam(\"qsllabel/date_format\", \"yyyy-MM-dd\").toString();\n}\n\nvoid LogParam::setQslLabelDateFormat(const QString &format)\n{\n    setParam(\"qsllabel/date_format\", format);\n}\n\nQString LogParam::getQslLabelSansFont()\n{\n    return getParam(\"qsllabel/sans_font\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelSansFont(const QString &family)\n{\n    setParam(\"qsllabel/sans_font\", family);\n}\n\nQString LogParam::getQslLabelMonoFont()\n{\n    return getParam(\"qsllabel/mono_font\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelMonoFont(const QString &family)\n{\n    setParam(\"qsllabel/mono_font\", family);\n}\n\nQString LogParam::getQslLabelExtraColumn()\n{\n    return getParam(\"qsllabel/extra_column\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelExtraColumn(const QString &column)\n{\n    setParam(\"qsllabel/extra_column\", column);\n}\n\nQString LogParam::getQslLabelExtraColumnHeader()\n{\n    return getParam(\"qsllabel/extra_column_header\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelExtraColumnHeader(const QString &header)\n{\n    setParam(\"qsllabel/extra_column_header\", header);\n}\n\nQString LogParam::getQslLabelToRadioText()\n{\n    return getParam(\"qsllabel/to_radio_text\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelToRadioText(const QString &text)\n{\n    setParam(\"qsllabel/to_radio_text\", text);\n}\n\nQString LogParam::getQslLabelHdrDate()\n{\n    return getParam(\"qsllabel/hdr_date\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelHdrDate(const QString &text)\n{\n    setParam(\"qsllabel/hdr_date\", text);\n}\n\nQString LogParam::getQslLabelHdrTime()\n{\n    return getParam(\"qsllabel/hdr_time\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelHdrTime(const QString &text)\n{\n    setParam(\"qsllabel/hdr_time\", text);\n}\n\nQString LogParam::getQslLabelHdrBand()\n{\n    return getParam(\"qsllabel/hdr_band\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelHdrBand(const QString &text)\n{\n    setParam(\"qsllabel/hdr_band\", text);\n}\n\nQString LogParam::getQslLabelHdrMode()\n{\n    return getParam(\"qsllabel/hdr_mode\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelHdrMode(const QString &text)\n{\n    setParam(\"qsllabel/hdr_mode\", text);\n}\n\nQString LogParam::getQslLabelHdrQsl()\n{\n    return getParam(\"qsllabel/hdr_qsl\", QString()).toString();\n}\n\nvoid LogParam::setQslLabelHdrQsl(const QString &text)\n{\n    setParam(\"qsllabel/hdr_qsl\", text);\n}\n\nint LogParam::getQslLabelMaxRows()\n{\n    return getParam(\"qsllabel/max_rows\", 4).toInt();\n}\n\nvoid LogParam::setQslLabelMaxRows(int rows)\n{\n    setParam(\"qsllabel/max_rows\", rows);\n}\n\ndouble LogParam::getQslLabelFontSizeToRadio()\n{\n    return getParam(\"qsllabel/font_size_to_radio\", 7.5).toDouble();\n}\n\nvoid LogParam::setQslLabelFontSizeToRadio(double size)\n{\n    setParam(\"qsllabel/font_size_to_radio\", size);\n}\n\ndouble LogParam::getQslLabelFontSizeCallsign()\n{\n    return getParam(\"qsllabel/font_size_callsign\", 14.0).toDouble();\n}\n\nvoid LogParam::setQslLabelFontSizeCallsign(double size)\n{\n    setParam(\"qsllabel/font_size_callsign\", size);\n}\n\ndouble LogParam::getQslLabelFontSizeHeader()\n{\n    return getParam(\"qsllabel/font_size_header\", 7.0).toDouble();\n}\n\nvoid LogParam::setQslLabelFontSizeHeader(double size)\n{\n    setParam(\"qsllabel/font_size_header\", size);\n}\n\ndouble LogParam::getQslLabelFontSizeData()\n{\n    return getParam(\"qsllabel/font_size_data\", 8.0).toDouble();\n}\n\nvoid LogParam::setQslLabelFontSizeData(double size)\n{\n    setParam(\"qsllabel/font_size_data\", size);\n}\n\nbool LogParam::setParam(const QString &name, const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << name << value;\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"INSERT OR REPLACE INTO log_param (name, value) \"\n                         \"VALUES (:nam, :val)\") )\n    {\n        qWarning()<< \"Cannot prepare insert parameter statement for parameter\" << name;\n        return false;\n    }\n\n    query.bindValue(\":nam\", name);\n    query.bindValue(\":val\", value);\n\n    PARAMMUTEXLOCKER;\n\n    if ( !query.exec() )\n    {\n        qWarning() << \"SET - Cannot exec an insert parameter statement for\" << name;\n        return false;\n    }\n\n    localCache.remove(name);\n\n    qCDebug(runtime) << \"SET:\" << name << \"value\" << value;\n    return true;\n}\n\nQVariant LogParam::getParam(const QString &name, const QVariant &defaultValue)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << name;\n\n    PARAMMUTEXLOCKER;\n\n    const QVariant *valueCached = localCache.object(name);\n\n    if ( valueCached )\n    {\n        qCDebug(runtime) << \"GET:\" << name << \"Cached value: \" << *valueCached;\n        return *valueCached;\n    }\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT value FROM log_param WHERE name = :nam\") )\n    {\n        qWarning()<< \"GET - Cannot prepare select parameter statement for\" << name;\n        return defaultValue;\n    }\n\n    query.bindValue(\":nam\", name);\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"GET - Cannot execute GetParam Select for\" << name << \"using default\" << defaultValue;\n        return defaultValue;\n    }\n\n    if ( query.first() )\n    {\n        if ( !query.isNull(0) )\n        {\n            QVariant dbValue = query.value(0);\n            localCache.insert(name, new QVariant(dbValue));\n            qCDebug(runtime) << \"GET:\" << name << \"DB value: \" << dbValue;\n            return dbValue;\n        }\n        qCDebug(runtime) << \"GET:\" << name << \"NULL value in DB - using default \" << defaultValue;\n    }\n    else\n        qCDebug(runtime) << \"GET:\" << name << \"Key not found in DB - using default \" << defaultValue;\n\n    //localCache.insert(name, new QVariant(defaultValue)); // Do not insert default value here because\n                                                           // in some use cases — for example, DXC and station_profile\n                                                           // the profile is not yet accessible during the first call,\n                                                           // and an empty value is incorrectly inserted into the cache.\n\n    return defaultValue;\n}\n\nbool LogParam::setParam(const QString &name, const QStringList &value)\n{\n    FCT_IDENTIFICATION;\n\n    return setParam(name, serializeStringList(value));\n}\n\nQStringList LogParam::getParamStringList(const QString &name, const QStringList &defaultValue)\n{\n    FCT_IDENTIFICATION;\n\n    return deserializeStringList(getParam(name, serializeStringList(defaultValue)).toString());\n}\n\nvoid LogParam::removeParamGroup(const QString &paramGroup)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << paramGroup;\n\n    PARAMMUTEXLOCKER;\n\n    const QStringList &keys = localCache.keys();\n\n    for ( const QString& key : keys )\n        if (key.startsWith(paramGroup)) localCache.remove(key);\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"DELETE FROM log_param WHERE name LIKE :group \") )\n    {\n        qWarning()<< \"Cannot prepare delete parameter statement for\" << paramGroup;\n        return;\n    }\n\n    query.bindValue(\":group\", paramGroup + \"%\");\n\n    if ( ! query.exec() )\n        qWarning() << \"Cannot execute removeParamGroup statement for\" << paramGroup;\n\n    return;\n}\n\nQStringList LogParam::getKeys(const QString &group)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << group;\n\n    PARAMMUTEXLOCKER;\n\n    QSet<QString> keys; // unique values;\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT name FROM log_param WHERE name LIKE :group \") )\n    {\n        qWarning()<< \"Cannot prepare select parameter statement for\" << group << query.lastError().text();\n        return QStringList();\n    }\n\n    query.bindValue(\":group\", group + \"%\");\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute removeParamGroup statement for\" << group;\n        return QStringList();\n    }\n\n    while ( query.next() )\n    {\n        const QString &param = query.value(0).toString();\n        const QString &subKey = param.mid(group.length()).section(\"/\", 0, 0);\n        if ( !subKey.isEmpty() ) keys.insert(subKey);\n    }\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n    return QStringList(keys.begin(), keys.end());\n#else\n    return keys.toList();\n#endif\n}\n\nQString LogParam::escapeString(const QString &input, QChar escapeChar, QChar delimiter)\n{\n    QString result;\n    for (QChar ch : input)\n    {\n        if (ch == escapeChar || ch == delimiter) result += escapeChar;\n        result += ch;\n    }\n    return result;\n}\n\nQString LogParam::unescapeString(const QString &input, QChar escapeChar)\n{\n    QString result;\n    bool escaping = false;\n    for ( QChar ch : input )\n    {\n        if ( escaping )\n        {\n            result += ch;\n            escaping = false;\n        }\n        else if ( ch == escapeChar )\n            escaping = true;\n        else\n            result += ch;\n    }\n    return result;\n}\n\nQString LogParam::serializeStringList(const QStringList &list, QChar delimiter, QChar escapeChar)\n{\n    QStringList escapedList;\n    for ( const QString &item : list )\n        escapedList << escapeString(item, escapeChar, delimiter);\n    return escapedList.join(delimiter);\n}\n\nQStringList LogParam::deserializeStringList(const QString &input, QChar delimiter, QChar escapeChar)\n{\n    QStringList result;\n\n    if ( !input.isEmpty() )\n    {\n        QString current;\n        bool escaping = false;\n\n        for ( QChar ch : input )\n        {\n            if ( escaping )\n            {\n                current += ch;\n                escaping = false;\n            }\n            else if ( ch == escapeChar )\n                escaping = true;\n            else if ( ch == delimiter )\n            {\n                result << current;\n                current.clear();\n            }\n            else\n                current += ch;\n        }\n        result << current;\n    }\n    return result;\n}\n\nQCache<QString, QVariant> LogParam::localCache(300);\n\nQMutex LogParam::cacheMutex;\n\n#undef PARAMMUTEXLOCKER\n"
  },
  {
    "path": "core/LogParam.h",
    "content": "#ifndef QLOG_CORE_LOGPARAM_H\n#define QLOG_CORE_LOGPARAM_H\n\n#include <QObject>\n#include <QDate>\n#include <QVariant>\n#include <QMutex>\n\nclass LogParam : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit LogParam(QObject *parent = nullptr);\n\n    /*********\n     * LOV\n     ********/\n    static bool setLOVParam(const QString &LOVName, const QVariant &value);\n    static QDate getLOVaParam(const QString &LOVName);\n\n    /*********\n     * Backup\n     ********/\n    static bool setLastBackupDate(const QDate date);\n    static QDate getLastBackupDate();\n\n    /*********\n     * LogID\n     ********/\n    static bool setLogID(const QString &id);\n    static QString getLogID();\n\n    /*********\n     * Contest\n     ********/\n    static bool setContestSeqnoType(const QVariant &data);\n    static int getContestSeqnoType();\n    static bool setContestManuDupeType(const QVariant &data);\n    static int getContestDupeType();\n    static bool setContestLinkExchange(const QVariant &data);\n    static int getContestLinkExchange();\n    static bool setContestFilter(const QString &filterName);\n    static QString getContestFilter();\n    static bool setContestID(const QString &contestID);\n    static QString getContestID();\n    static bool setContestDupeDate(const QDateTime date);\n    static QDateTime getContestDupeDate();\n    static void removeConetstDupeDate();\n\n    /********************\n     * DXCC Confirmation\n     ********************/\n    static bool getDxccConfirmedByLotwState();\n    static bool setDxccConfirmedByLotwState(bool state);\n    static bool setDxccConfirmedByPaperState(bool state);\n    static bool getDxccConfirmedByPaperState();\n    static bool setDxccConfirmedByEqslState(bool state);\n    static bool getDxccConfirmedByEqslState();\n    static int getContestSeqno(const QString &band = QString());\n    static bool setContestSeqno(int value, const QString &band = QString());\n    static void removeContestSeqno();\n\n    /*********\n     * Bandmap\n     *********/\n    static QStringList bandmapsWidgets();\n    static void removeBandmapWidgetGroup(const QString &group);\n    static double getBandmapScrollFreq(const QString& widgetID, const QString &bandName);\n    static bool setBandmapScrollFreq(const QString& widgetID, const QString &bandName, double scroll);\n    static QVariant getBandmapZoom(const QString& widgetID, const QString &bandName, const QVariant &defaultValue);\n    static bool setBandmapZoom(const QString& widgetID, const QString &bandName, const QVariant &zoom);\n    static bool setBandmapAging(const QString& widgetID, int aging);\n    static int getBandmapAging(const QString& widgetID);\n    static bool setBandmapCenterRX(const QString& widgetID, bool centerRX);\n    static bool getBandmapCenterRX(const QString& widgetID);\n    static bool setBandmapShowEmergency(const QString& widgetID, bool show);\n    static bool getBandmapShowEmergency(const QString& widgetID);\n\n    /*******************\n     * UploadQSO Dialog\n     *******************/\n    static QString getUploadQSOLastCall();\n    static void setUploadQSOLastCall(const QString &call);\n    static bool getUploadeqslQSLComment();\n    static void setUploadeqslQSLComment(const bool state);\n    static bool getUploadeqslQSLMessage();\n    static QString getUploadeqslQTHProfile();\n    static void setUploadeqslQTHProfile(const QString &qthProfile);\n    static void setUploadeqslQSLMessage(const bool state);\n    static bool getUploadServiceState(const QString& name);\n    static void setUploadServiceState(const QString& name, bool state);\n    static int getUploadQSOFilterType();\n    static void setUploadQSOFilterType(int filterID);\n    static QString getUploadLoTWLocation();\n    static void setUploadLoTWLocation(const QString &location);\n\n    /*********************\n     * DownloadQSL Dialog\n     *********************/\n    static bool getDownloadQSLServiceState(const QString& name);\n    static void setDownloadQSLServiceState(const QString& name, bool state);\n    static QDate getDownloadQSLServiceLastDate(const QString& name);\n    static void setDownloadQSLServiceLastDate(const QString& name, const QDate &date);\n    static bool getDownloadQSLServiceLastQSOQSL(const QString& name);\n    static void setDownloadQSLServiceLastQSOQSL(const QString& name, bool state);\n    static QString getDownloadQSLLoTWLastCall();\n    static void setDownloadQSLLoTWLastCall(const QString &call);\n    static QString getDownloadQSLeQSLLastProfile();\n    static void setDownloadQSLeQSLLastProfile(const QString &profile);\n\n    /*********\n     * QRZ\n     ********/\n    static QString getQRZCOMCallbookUsername();\n    static void setQRZCOMCallbookUsername(const QString& username);\n    static QStringList getQRZCOMAPICallsignsList();\n    static void setQRZCOMAPICallsignsList(const QStringList &list);\n\n    /**********\n     * Cloudlog\n     **********/\n    static QString getCloudlogAPIEndpoint();\n    static void setCloudlogAPIEndpoint(const QString &endpoint);\n    static uint getCloudlogStationID();\n    static void setCloudlogStationID(uint stationID);\n\n    /*********\n     * Clublog\n     ********/\n    static QString getClublogLogbookReqEmail();\n    static void setClublogLogbookReqEmail(const QString& email);\n    static bool getClublogUploadImmediatelyEnabled();\n    static void setClublogUploadImmediatelyEnabled(bool state);\n\n    /*********\n     * eQSL\n     ********/\n    static QString getEQSLLogbookUsername();\n    static void setEQSLLogbookUsername(const QString& username);\n\n    /*********\n     * HamQTH\n     ********/\n    static QString getHamQTHCallbookUsername();\n    static void setHamQTHCallbookUsername(const QString& username);\n\n    /*********\n     * HRDLog\n     ********/\n    static QString getHRDLogLogbookReqCallsign();\n    static void setHRDLogLogbookReqCallsign(const QString& callsign);\n    static bool getHRDLogOnAir();\n    static void setHRDLogOnAir(bool state);\n\n    /*********\n     * KSTChat\n     ********/\n    static QString getKSTChatUsername();\n    static void setKSTChatUsername(const QString& username);\n\n    /*********\n     * LoTW\n     ********/\n    static QString getLoTWCallbookUsername();\n    static void setLoTWCallbookUsername(const QString& username);\n    static QString getLoTWTQSLPath(const QString &defaultPath);\n    static void setLoTWTQSLPath(const QString& path);\n    static bool isLoTWTQSLPathKey(const QString &key);\n\n    /*******************\n     * Callbook setting\n     *******************/\n    static QString getPrimaryCallbook(const QString &defaultValue);\n    static void setPrimaryCallbook(const QString& callbookName);\n    static QString getSecondaryCallbook(const QString &defaultValue);\n    static void setSecondaryCallbook(const QString& callbookName);\n    static QString getCallbookWebLookupURL(const QString &defaultURL);\n    static void setCallbookWebLookupURL(const QString& url);\n\n    /************************\n     * Network Notifications\n     ************************/\n    static QString getNetworkNotifLogQSOAddrs();\n    static void setNetworkNotifLogQSOAddrs(const QString &addrs);\n    static QString getNetworkNotifDXCSpotAddrs();\n    static void setNetworkNotifDXCSpotAddrs(const QString &addrs);\n    static QString getNetworkNotifWSJTXCQSpotAddrs();\n    static void setNetworkNotifWSJTXCQSpotAddrs(const QString &addrs);\n    static QString getNetworkNotifAlertsSpotAddrs();\n    static void setNetworkNotifAlertsSpotAddrs(const QString &addrs);\n    static QString getNetworkNotifRigStateAddrs();\n    static void setNetworkNotifRigStateAddrs(const QString &addrs);\n    static int getNetworkWsjtxListenerPort(int defaultPort);\n    static void setNetworkNotifRigStateAddrs(int port);\n    static QString getNetworkWsjtxForwardAddrs();\n    static void setNetworkWsjtxForwardAddrs(const QString &addrs);\n    static bool getNetworkWsjtxListenerJoinMulticast();\n    static void setNetworkWsjtxListenerJoinMulticast(bool state);\n    static QString getNetworkWsjtxListenerMulticastAddr();\n    static void setNetworkWsjtxListenerMulticastAddr(const QString &addr);\n    static int getNetworkWsjtxListenerMulticastTTL();\n    static void setNetworkWsjtxListenerMulticastTTL(int ttl);\n\n    /********************\n     * Club Member Lists\n     ********************/\n    static QStringList getEnabledMemberlists();\n    static void setEnabledMemberlists(const QStringList &list);\n    static int getAlertAging();\n    static void setAlertAging(int aging);\n    static QByteArray getAlertWidgetState();\n\n    /***************\n     * Alert Dialog\n     ***************/\n    static void setAlertWidgetState(const QByteArray &state);\n\n    /*************\n     * CW Console\n     *************/\n    static bool getCWConsoleSendWord();\n    static void setCWConsoleSendWord(bool state);\n\n    /*********\n     * Chat\n     ********/\n    static bool getChatSelectedRoom();\n    static void setChatSelectedRoom(int room);\n\n    /*************\n     * NewContact\n     *************/\n    static double getNewContactFreq();\n    static void setNewContactFreq(double freq);\n    static QString getNewContactMode();\n    static void setNewContactMode(const QString &mode);\n    static QString getNewContactSubMode();\n    static void setNewContactSubMode(const QString &submode);\n    static double getNewContactPower();\n    static void setNewContactPower(double power);\n    static int getNewContactTabIndex();\n    static void setNewContactTabIndex(int index);\n    static QString getNewContactQSLSent();\n    static void setNewContactQSLSent(const QString &qslsent);\n    static QString getNewContactLoTWQSLSent();\n    static void setNewContactLoTWQSLSent(const QString &qslsent);\n    static QString getNewContactEQSLWQSLSent();\n    static void setNewContactEQSLQSLSent(const QString &qslsent);\n    static QString getNewContactQSLVia();\n    static void setNewContactQSLVia(const QString &qslvia);\n    static QString getNewContactPropMode();\n    static void setNewContactPropMode(const QString &propmode);\n    static bool getNewContactTabsExpanded();\n    static void setNewContactTabsExpanded(bool state);\n    static QString getNewContactSatName();\n    static void setNewContactSatName(const QString &name);\n\n    /*************\n     * Online Map\n     *************/\n    static QStringList getMapLayerStates(const QString &widgetID);\n    static bool getMapLayerState(const QString &widgetID, const QString &layerName);\n    static void setMapLayerState(const QString &widgetID, const QString &layerName, bool state);\n\n    /***************\n     * WSJTX Dialog\n     ***************/\n    static uint getWsjtxFilterDxccStatus();\n    static void setWsjtxFilterDxccStatus(uint mask);\n    static QString getWsjtxFilterContRE();\n    static void setWsjtxFilterContRE(const QString &re);\n    static int getWsjtxFilterDistance();\n    static void setWsjtxFilterDistance(int dist);\n    static int getWsjtxFilterSNR();\n    static void setWsjtxFilterSNR(int snr);\n    static QStringList getWsjtxMemberlists();\n    static void setWsjtxMemberlists(const QStringList &list);\n    static QByteArray getWsjtxWidgetState();\n    static void setWsjtxWidgetState(const QByteArray &state);\n    static bool getWsjtxOutputColorCQSpot();\n    static void setWsjtxOutputColorCQSpot(bool state);\n\n    /******************\n     * DXCluster Dialog\n     ******************/\n    static uint getDXCFilterDxccStatus();\n    static void setDXCFilterDxccStatus(uint mask);\n    static QString getDXCFilterContRE();\n    static void setDXCFilterContRE(const QString &re);\n    static QString getDXCFilterSpotterContRE();\n    static void setDXCFilterSpotterContRE(const QString &re);\n    static bool getDXCFilterDedup();\n    static void setDXCFilterDedup(bool state);\n    static int getDXCFilterDedupTime(int defaultValue);\n    static void setDXCFilterDedupTime(int value);\n    static int getDXCFilterDedupFreq(int defaultValue);\n    static void setDXCFilterDedupFreq(int value);\n    static QStringList getDXCFilterMemberlists();\n    static void setDXCFilterMemberlists(const QStringList &list);\n    static bool getDXCAutoconnectServer();\n    static void setDXCAutoconnectServer(bool state);\n    static bool getDXCKeepQSOs();\n    static void setDXCKeepQSOs(bool state);\n    static QByteArray getDXCDXTableState();\n    static void setDXCDXTableState(const QByteArray &state);\n    static QByteArray getDXCWCYTableState();\n    static void setDXCWCYTableState(const QByteArray &state);\n    static QByteArray getDXCWWVTableState();\n    static void setDXCWWVTableState(const QByteArray &state);\n    static QByteArray getDXCTOALLTableState();\n    static void setDXCTOALLTableState(const QByteArray &state);\n    static int getDXCConsoleFontSize();\n    static void setDXCConsoleFontSize(int value);\n    static QStringList getDXCServerlist();\n    static void setDXCServerlist(const QStringList &list);\n    static QString getDXCLastServer();\n    static void setDXCLastServer(const QString &server);\n    static QString getDXCFilterModeRE();\n    static void setDXCFilterModeRE(const QString &re);\n    static QStringList getDXCExcludedBands();\n    static void setDXCExcludedBands(const QStringList &excluded);\n    static bool setDXCTrendContinent(const QString &cont);\n    static QString getDXCTrendContinent(const QString &def);\n    static void removeDXCTrendContinent();\n\n    /**************\n     * Export ADIF\n     **************/\n    static QSet<int> getExportColumnSet(const QString &paramName, const QSet<int> &defaultValue);\n    static void setExportColumnSet(const QString &paramName, const QSet<int> &set);\n\n    /*****************\n     * Logbook dialog\n     *****************/\n    static QByteArray getLogbookState();\n    static void setLogbookState(const QByteArray &state);\n    static int getLogbookFilterSearchType(int defaultValue);\n    static void setLogbookFilterSearchType(int type);\n    static QString getLogbookFilterBand();\n    static void setLogbookFilterBand(const QString &name);\n    static QString getLogbookFilterMode();\n    static void setLogbookFilterMode(const QString &name);\n    static QString getLogbookFilterCountry();\n    static void setLogbookFilterCountry(const QString &name);\n    static QString getLogbookFilterUserFilter();\n    static void setLogbookFilterUserFilter(const QString &name);\n    static QString getLogbookFilterClub();\n    static void setLogbookFilterClub(const QString &name);\n\n    /************************\n     * Encrypted Passwords\n     ************************/\n    static QByteArray getEncryptedPasswords();\n    static void setEncryptedPasswords(const QByteArray &data);\n    static void removeEncryptedPasswords();\n    static QString getSourcePlatform();\n    static void setSourcePlatform(const QString &platform);\n    static void removeSourcePlatform();\n\n    /**************\n     * Main Window\n     *************/\n    static bool getMainWindowAlertBeep();\n    static void setMainWindowAlertBeep(bool state);\n    static int getMainWindowDarkMode();\n    static void setMainWindowDarkMode(int state);\n    static QByteArray getMainWindowGeometry();\n    static void setMainWindowGeometry(const QByteArray &state);\n    static QByteArray getMainWindowState();\n    static void setMainWindowState(const QByteArray &state);\n    static QString getMainWindowBandmapWidgets();\n    static void setMainWindowBandmapWidgets(const QString &value);\n    static void removeMainWindowBandmapWidgets();\n\n    /*********************\n     * QSL Print Labels\n     *********************/\n    static int getQslLabelTemplate();\n    static void setQslLabelTemplate(int index);\n    static QString getQslLabelFooterLeft();\n    static void setQslLabelFooterLeft(const QString &text);\n    static QString getQslLabelFooterRight();\n    static void setQslLabelFooterRight(const QString &text);\n    static int getQslLabelSkip();\n    static void setQslLabelSkip(int count);\n    static int getQslLabelZoom();\n    static void setQslLabelZoom(int zoom);\n    static int getQslLabelCustomPageSize();\n    static void setQslLabelCustomPageSize(int pageSizeIndex);\n    static int getQslLabelCustomCols();\n    static void setQslLabelCustomCols(int cols);\n    static int getQslLabelCustomRows();\n    static void setQslLabelCustomRows(int rows);\n    static double getQslLabelCustomLabelWidth();\n    static void setQslLabelCustomLabelWidth(double width);\n    static double getQslLabelCustomLabelHeight();\n    static void setQslLabelCustomLabelHeight(double height);\n    static double getQslLabelCustomLeftMargin();\n    static void setQslLabelCustomLeftMargin(double margin);\n    static double getQslLabelCustomTopMargin();\n    static void setQslLabelCustomTopMargin(double margin);\n    static double getQslLabelCustomHSpacing();\n    static void setQslLabelCustomHSpacing(double spacing);\n    static double getQslLabelCustomVSpacing();\n    static void setQslLabelCustomVSpacing(double spacing);\n    static bool getQslLabelPrintBorders();\n    static void setQslLabelPrintBorders(bool enabled);\n    static QString getQslLabelDateFormat();\n    static void setQslLabelDateFormat(const QString &format);\n    static QString getQslLabelSansFont();\n    static void setQslLabelSansFont(const QString &family);\n    static QString getQslLabelMonoFont();\n    static void setQslLabelMonoFont(const QString &family);\n    static QString getQslLabelExtraColumn();\n    static void setQslLabelExtraColumn(const QString &column);\n    static QString getQslLabelExtraColumnHeader();\n    static void setQslLabelExtraColumnHeader(const QString &header);\n    static QString getQslLabelToRadioText();\n    static void setQslLabelToRadioText(const QString &text);\n    static QString getQslLabelHdrDate();\n    static void setQslLabelHdrDate(const QString &text);\n    static QString getQslLabelHdrTime();\n    static void setQslLabelHdrTime(const QString &text);\n    static QString getQslLabelHdrBand();\n    static void setQslLabelHdrBand(const QString &text);\n    static QString getQslLabelHdrMode();\n    static void setQslLabelHdrMode(const QString &text);\n    static QString getQslLabelHdrQsl();\n    static void setQslLabelHdrQsl(const QString &text);\n    static int getQslLabelMaxRows();\n    static void setQslLabelMaxRows(int rows);\n    static double getQslLabelFontSizeToRadio();\n    static void setQslLabelFontSizeToRadio(double size);\n    static double getQslLabelFontSizeCallsign();\n    static void setQslLabelFontSizeCallsign(double size);\n    static double getQslLabelFontSizeHeader();\n    static void setQslLabelFontSizeHeader(double size);\n    static double getQslLabelFontSizeData();\n    static void setQslLabelFontSizeData(double size);\n\nprivate:\n    static QCache<QString, QVariant> localCache;\n    static QMutex cacheMutex;\n\n    static bool setParam(const QString&, const QVariant &);\n    static bool setParam(const QString&, const QStringList &);\n    static QVariant getParam(const QString&, const QVariant &defaultValue = QVariant());\n    static QStringList getParamStringList(const QString&, const QStringList &defaultValue = QStringList());\n    static void removeParamGroup(const QString&);\n    static QStringList getKeys(const QString &);\n    static QString escapeString(const QString &input, QChar escapeChar = '\\\\', QChar delimiter = ',');\n    static QString unescapeString(const QString &input, QChar escapeChar = '\\\\');\n    static QString serializeStringList(const QStringList &list, QChar delimiter = ',', QChar escapeChar = '\\\\');\n    static QStringList deserializeStringList(const QString &input, QChar delimiter = ',', QChar escapeChar = '\\\\');\n};\n\n#endif // QLOG_CORE_LOGPARAM_H\n"
  },
  {
    "path": "core/MembershipQE.cpp",
    "content": "#include <QSqlDatabase>\n#include <QDir>\n#include <QStandardPaths>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QMutexLocker>\n#include <QSqlDriver>\n#include <QMessageBox>\n#include <QCoreApplication>\n\n#include \"MembershipQE.h\"\n#include \"core/debug.h\"\n#include \"core/LogDatabase.h\"\n#include \"data/Callsign.h\"\n#include \"LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.membershipqe\");\n\n#define MEMBERLIST_BASE_URL \"https://raw.githubusercontent.com/foldynl/hamradio-membeship-lists/main/lists\"\n\nClubInfo::ClubInfo(const QString &callsign,\n               const QString &ID,\n               const QDate &validFrom,\n               const QDate &validTo,\n               const QString &club):\n   callsign(callsign),\n   id(ID),\n   validFrom(validFrom),\n   validTo(validTo),\n   club(club)\n{\n    FCT_IDENTIFICATION;\n}\n\nconst QString& ClubInfo::getCallsign() const\n{\n    return callsign;\n}\n\nconst QString& ClubInfo::getID() const\n{\n    return id;\n}\n\nconst QDate& ClubInfo::getValidFrom() const\n{\n    return validFrom;\n}\n\nconst QDate& ClubInfo::getValidTo() const\n{\n    return validTo;\n}\n\nconst QString& ClubInfo::getClubInfo() const\n{\n    return club;\n}\n\nMembershipQE::MembershipQE(QObject *parent)\n    : QObject{parent},\n      idClubQueryValid(false),\n      nam(new QNetworkAccessManager(this))\n{\n    FCT_IDENTIFICATION;\n\n    // this thead will help to obtain club status\n    statusQuery.moveToThread(&statusQueryThread);\n    statusQueryThread.start();\n\n    connect(&statusQuery, &ClubStatusQuery::status, this, &MembershipQE::statusQueryFinished);\n    connect(nam.data(), &QNetworkAccessManager::finished, this, &MembershipQE::onFinishedListDownload);\n\n    // prepare SQL query to increase Club query function performance\n    idClubQueryValid = clubQuery.prepare(\"SELECT DISTINCT callsign, member_id, valid_from, valid_to, clubid FROM membership WHERE callsign = :callsign ORDER BY clubid\");\n}\n\nMembershipQE::~MembershipQE()\n{\n    FCT_IDENTIFICATION;\n\n    statusQueryThread.quit();\n    statusQueryThread.wait();\n}\n\n// this function is called when async club status returns a result\nvoid MembershipQE::statusQueryFinished(const QString &callsign,\n                                       QMap<QString, ClubStatusQuery::ClubInfo> statuses)\n{\n    FCT_IDENTIFICATION;\n\n    emit clubStatusResult(callsign, statuses);\n}\n\nvoid MembershipQE::saveEnabledClubLists(const QStringList &enabledLists)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setEnabledMemberlists(enabledLists);\n}\n\nQStringList MembershipQE::getEnabledClubLists()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getEnabledMemberlists();\n}\n\nvoid MembershipQE::removeClubsFromEnabledClubLists(const QList<QPair<QString, QString>> &toRemove)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << toRemove;\n    QStringList current = getEnabledClubLists();\n\n    for ( const QPair<QString, QString>& toRemoveClub : toRemove )\n    {\n        current.removeAll(toRemoveClub.first);\n    }\n\n    saveEnabledClubLists(current);\n}\n\n// it is a sync in-thread function to obtain all clubs for an input callsign\n// it must be as fast as possible\nQList<ClubInfo> MembershipQE::query(const QString &in_callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_callsign;\n\n    QList<ClubInfo> ret;\n\n    if ( !idClubQueryValid )\n    {\n        qCDebug(runtime) << \"Query is not prepared\";\n        return ret;\n    }\n\n    Callsign qCall(in_callsign);\n\n    clubQuery.bindValue(\":callsign\",( qCall.isValid() ) ? qCall.getBase() : in_callsign.toUpper());\n\n    if ( ! clubQuery.exec() )\n    {\n        qCDebug(runtime) << \"Cannot query callsign clubs \"<< clubQuery.lastError().text();\n        return ret;\n    }\n\n    while ( clubQuery.next() )\n    {\n        QString callsign = clubQuery.value(0).toString();\n        QString memberid = clubQuery.value(1).toString();\n        QDate validFrom = QDate::fromString(clubQuery.value(2).toString(), \"yyyyMMdd\");\n        QDate validTo = QDate::fromString(clubQuery.value(3).toString(), \"yyyyMMdd\");\n        QString clubid = clubQuery.value(4).toString();\n\n        qCDebug(runtime) << \"Found membership record\" << callsign << memberid << validFrom << validTo << clubid;\n\n        ret << ClubInfo(in_callsign, memberid, validTo, validTo, clubid);\n    }\n\n    qCDebug(runtime) << \"Done\";\n\n    return ret;\n}\n// it is a async query function to obtain club statuses for an input callsign.\n// the result is returned via signal MembershipStatusQuery::status\n// it can take some time to obtain a result therefore it is solved in an isolated thread\nvoid MembershipQE::asyncQueryDetails(const QString &callsign,\n                                     const QString &band,\n                                     const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign << band << mode;\n\n    QMetaObject::invokeMethod(&statusQuery, \"getClubStatus\",\n                              Qt::QueuedConnection,\n                              Q_ARG(QString, callsign.toUpper()),\n                              Q_ARG(QString, band),\n                              Q_ARG(QString, mode),\n                              Q_ARG(bool, LogParam::getDxccConfirmedByLotwState()),\n                              Q_ARG(bool, LogParam::getDxccConfirmedByPaperState()),\n                              Q_ARG(bool, LogParam::getDxccConfirmedByEqslState())\n                              );\n}\n\nvoid MembershipQE::updateLists()\n{\n    FCT_IDENTIFICATION;\n\n    if ( updatePlan.size() > 0 )\n    {\n        qWarning() << \"Member Club lists are still downloaded. Aborting this update request.\";\n    }\n\n    QStringList enabledLists = getEnabledClubLists();\n\n    if ( !removeDisabled(enabledLists) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Club List Update failed. Cannot remove old records\"));\n        return;\n    }\n\n    if ( !planDownloads(enabledLists) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Club List Update failed. Cannot plan new downloads\"));\n        return;\n    }\n\n    startPlannedDownload();\n}\n\nbool MembershipQE::removeDisabled(const QStringList &enabledLists)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( ! query.exec(QString(\"DELETE FROM membership WHERE clubid NOT IN ('%1');\").arg(enabledLists.join(\"','\"))))\n    {\n        qWarning() << \"Cannot delete records \"<< query.lastError().text();\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    if ( ! query.exec(QString(\"DELETE FROM membership_versions WHERE clubid NOT IN (SELECT DISTINCT clubid FROM membership);\")))\n    {\n        qWarning() << \"Cannot delete records from versioning\"<< query.lastError().text();\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    qCDebug(runtime) << \"DONE\";\n\n    Q_UNUSED(QSqlDatabase::database().commit());\n\n    return true;\n}\n\nbool MembershipQE::planDownloads(const QStringList &enabledLists)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( ! query.exec(QString(\"WITH split(word, csv) AS ( SELECT '', '%1'||',' \"\n                              \"                           UNION ALL \"\n                              \"                           SELECT substr(csv, 0, instr(csv, ',')), substr(csv, instr(csv, ',') + 1) \"\n                              \"                           FROM split \"\n                              \"                           WHERE csv != '' ) \"\n                              \"SELECT clubid, filename \"\n                              \"FROM membership_directory d, \"\n                              \"    (SELECT word clubid FROM split \"\n                              \"     WHERE word!='' \"\n                              \"     EXCEPT \"\n                              \"     SELECT clubid  \"\n                              \"     FROM membership_versions l , \"\n                              \"          membership_directory m \"\n                              \"     WHERE (l.clubid = m.short_desc) \"\n                              \"     AND (version >= m.last_update or m.last_update IS NULL)) a \"\n                              \"WHERE a.clubid = d.short_desc;\").arg(enabledLists.join(\",\"))))\n    {\n       qCWarning(runtime) << \"Cannot plan download\" << query.lastError().text();\n       return false;\n    }\n\n    while ( query.next() )\n    {\n        updatePlan << QPair<QString, QString>(query.value(0).toString(),QString(MEMBERLIST_BASE_URL) + \"/\" + query.value(1).toString());\n    }\n\n    qCDebug(runtime)  << \"DONE\";\n\n    return true;\n}\n\nvoid MembershipQE::startPlannedDownload()\n{\n    FCT_IDENTIFICATION;\n\n    if ( updatePlan.size() == 0 )\n        return;\n\n    qCDebug(runtime) << \"Remaining downloads\" << updatePlan.size() << updatePlan;\n\n    // to prevent network overload, qlog will donwload files one-by-one\n    QPair<QString, QString> nextDownload = updatePlan.at(0);\n\n    QNetworkRequest request(nextDownload.second);\n    QString rheader = QString(\"QLog/%1\").arg(VERSION);\n    request.setRawHeader(\"User-Agent\", rheader.toUtf8());\n    QNetworkReply *reply = nam->get(request);\n    reply->setProperty(\"clubid\", nextDownload.first);\n}\n\nvoid MembershipQE::onFinishedListDownload(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    QString clubid = reply->property(\"clubid\").toString();\n\n    qCDebug(runtime) << \"Received data for Club ID\" << clubid\n                     << \"from\" << reply->url().toString();\n\n    if ( updatePlan.size() == 0 )\n    {\n        // Update plan was canceled\n        qCDebug(runtime) << \"Download finished for already canceled download - ignore it\";\n        return;\n    }\n    if ( updatePlan.at(0).first != clubid)\n    {\n        qCDebug(runtime) << \"Received\" << clubid << \"but expected\" << updatePlan.at(0).first;\n        qCDebug(runtime) << \"Canceling all downloads\";\n        removeClubsFromEnabledClubLists(updatePlan);\n        updatePlan.clear();\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Critical\"),\n                             QMessageBox::tr(\"Unexpected Club List download. Canceling next downloads\"));\n\n    }\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n    bool error = false;\n\n    if ( reply->isFinished()\n         && reply->error() == QNetworkReply::NoError\n         && replyStatusCode >= 200 && replyStatusCode < 300)\n    {\n        QByteArray data = reply->readAll();        \n        if ( ! importData(clubid, data) )\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"Unexpected Club List content for\") + \" \" + clubid);\n            error = true;\n        }\n    }\n    else\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Network error. Cannot download Club List for\") + \" \" + clubid);\n        qCDebug(runtime) << \"Network Error for club\" << clubid << replyStatusCode << reply->error();\n        error = true;\n    }\n\n    if ( error )\n    {\n        QList<QPair<QString, QString>> tmp;\n        tmp << QPair<QString, QString>(clubid, \"\");\n        removeClubsFromEnabledClubLists(tmp);\n    }\n\n    if ( updatePlan.size() > 0 ) updatePlan.removeFirst();\n\n    reply->deleteLater();\n\n    startPlannedDownload();\n}\n\nbool MembershipQE::importData(const QString &clubid, const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << clubid;\n\n    QTextStream stream(data);\n\n    Q_UNUSED(QSqlDatabase::database().transaction());\n\n    QSqlQuery query;\n    QSqlQuery versionQuery;\n\n    qCDebug(runtime) << \"Delete Records for a club\" << clubid;\n\n    if ( ! query.exec(QString(\"DELETE FROM membership WHERE clubid = '%1';\").arg(clubid)))\n    {\n        qWarning() << \"Cannot delete records for \" << clubid << query.lastError().text();\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    QCoreApplication::processEvents();\n\n    qCDebug(runtime) << \"Insert data into\" << clubid;\n\n    if ( ! query.prepare(QString(\"INSERT INTO membership(callsign,\"\n                                 \"                       member_id,\"\n                                 \"                       valid_from,\"\n                                 \"                       valid_to,\"\n                                 \"                       clubid\"\n                                 \")\"\n                                 \" VALUES (:callsign,\"\n                                 \"         :member_id,\"\n                                 \"         :valid_from,\"\n                                 \"         :valid_to,\"\n                                 \"         '%1'\"\n                                 \")\").arg(clubid)) )\n    {\n        qWarning() << \"Cannot prepare Insert statement for membership table\" << query.lastError().text();\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    if ( ! versionQuery.prepare(QString(\"REPLACE INTO membership_versions(clubid, version) \"\n                                 \" VALUES (:clubid, :version)\") ) )\n    {\n        qWarning() << \"Cannot prepare Insert statement for membership_version table\" << versionQuery.lastError().text();\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    QCoreApplication::processEvents();\n\n    QString line = stream.readLine();\n    QStringList fields = line.split(\" \");\n    int version;\n\n    if ( fields.size() == 2\n         && fields.at(0).at(0) == QChar('#')\n         && (version = fields.at(1).toInt()) != 0)\n    {\n        versionQuery.bindValue(\":clubid\", clubid);\n        versionQuery.bindValue(\":version\", version);\n\n        if ( ! versionQuery.exec() )\n        {\n            qWarning() << \"Membership version insert error \" << versionQuery.lastError().text();\n            Q_UNUSED(QSqlDatabase::database().rollback());\n            return false;\n        }\n\n    }\n    else\n    {\n        qCDebug(runtime) << \"Unexpected header\" << line;\n        Q_UNUSED(QSqlDatabase::database().rollback());\n        return false;\n    }\n\n    // skip CSV header\n    stream.readLine();\n\n    while ( !stream.atEnd() )\n    {\n        line = stream.readLine();\n        fields = line.split(',');\n\n        if ( fields.count() < 4 )\n        {\n            qInfo(runtime) << \"Invalid line in the input file \" << line << clubid;\n            continue;\n        }\n\n        query.bindValue(\":callsign\", fields.at(0).toUpper().simplified());\n        query.bindValue(\":member_id\", fields.at(1).simplified());\n        query.bindValue(\":valid_from\", fields.at(2));\n        query.bindValue(\":valid_to\", fields.at(3));\n\n        if ( ! query.exec() )\n        {\n            qWarning() << \"membership insert error \" << query.lastError().text();\n            continue;\n        }\n\n    }\n\n    qCDebug(runtime) << \"DONE\";\n    Q_UNUSED(QSqlDatabase::database().commit());\n\n    return true;\n}\n\nClubStatusQuery::ClubStatusQuery(QObject *parent) :\n    QObject(parent),\n    dbConnectionName(\"queryThread\"),\n    dbConnected(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nClubStatusQuery::~ClubStatusQuery()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid ClubStatusQuery::getClubStatus(const QString &in_callsign,\n                                    const QString &in_band,\n                                    const QString &in_mode,\n                                    bool lowtConfirmed,\n                                    bool paperConfirmed,\n                                    bool eqslConfirmed)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << in_callsign << in_band << in_mode;\n    qCDebug(runtime) << \"Waiting for lock\";\n\n    QMutexLocker locker(&dbLock);\n\n    qCDebug(runtime)  << \"Processing getClubStatus\";\n\n    if ( !dbConnected )\n    {\n        qCDebug(runtime)  << \"Opening connection to DB\";\n        QSqlDatabase db1 = QSqlDatabase::addDatabase(\"QSQLITE\", dbConnectionName);\n        db1.setDatabaseName(LogDatabase::dbFilename());\n        dbConnected = db1.open();\n        if ( ! dbConnected)\n        {\n            qWarning() << \"Cannot open DB Connection for Update\";\n            emit status(in_callsign, QMap<QString, ClubInfo>());\n            return;\n        }\n    }\n\n    QSqlDatabase db1 = QSqlDatabase::database(dbConnectionName);\n    QSqlQuery query(db1);\n    const Callsign qCall(in_callsign);\n    const QString &callModified = ( qCall.isValid() ) ? qCall.getBase() : in_callsign;\n\n    QStringList dxccConfirmedByCond(QLatin1String(\"0=1\")); // if no option is selected then always false\n\n    if ( lowtConfirmed )\n        dxccConfirmedByCond << QLatin1String(\"c.lotw_qsl_rcvd = 'Y'\");\n\n    if ( paperConfirmed )\n        dxccConfirmedByCond << QLatin1String(\"c.qsl_rcvd = 'Y'\");\n\n    if ( eqslConfirmed )\n        dxccConfirmedByCond << QLatin1String(\"c.eqsl_qsl_rcvd = 'Y'\");\n\n    if ( ! query.exec(QString(\"SELECT DISTINCT clubid, NULL band, NULL mode, \"\n                              \"        NULL confirmed, NULL current_mode, member_id \"\n                              \"FROM membership  WHERE callsign = '%1' \"\n                              \"UNION ALL \"\n                              \"SELECT DISTINCT clubid, c.band, o.dxcc mode, \"\n                              \"                CASE WHEN (%2) THEN 1 ELSE 0 END confirmed, \"\n                              \"               (SELECT modes.dxcc FROM modes WHERE modes.name = '%3' LIMIT 1) current_mode, \"\n                              \"               NULL member_id \"\n                              \"FROM contacts c, \"\n                              \"    contact_clubs_view con2club, \"\n                              \"    modes o \"\n                              \"WHERE con2club.contactid = c.id \"\n                              \"AND o.name = c.mode \"\n                              \"AND con2club.clubid in (SELECT clubid FROM membership a WHERE a.callsign = '%4') order by 1, 3, 2, 4\").arg(callModified,\n                                                                                                                                          dxccConfirmedByCond.join(\" OR \"),\n                                                                                                                                          in_mode,\n                                                                                                                                          callModified)))\n    {\n       qCWarning(runtime) << \"Cannot Get club status\" << query.lastError().text();\n       emit status(in_callsign, QMap<QString, ClubInfo>());\n       return;\n    }\n\n    QMap<QString, ClubInfo> retMap;\n    QString currentProcessedClub;\n    QString currentMemberID;\n    bool bandMatched = false;\n    bool bandModeMatched = false;\n    bool bandModeConfirmedMatched = false;\n    bool modeMatched = false;\n    unsigned long records = 0L;\n\n    while ( ++records && query.next() )\n    {\n        const QString &clubid = query.value(0).toString();\n        const QString &band = query.value(1).toString();\n        const QString &mode = query.value(2).toString();\n        const QVariant &confirmed = query.value(3);\n        const QString &current_mode = query.value(4).toString();\n        const QString &memberID = query.value(5).toString();\n\n        qCDebug(runtime) << \"Processing\" << currentProcessedClub\n                         << clubid\n                         << band.isEmpty() << band\n                         << mode.isEmpty() << mode\n                         << confirmed.toString().isEmpty() << confirmed\n                         << current_mode.isEmpty();\n\n        // the select generates starting line for a new club\n        // Changing the club\n        if ( currentProcessedClub != clubid\n             && band.isEmpty()\n             && mode.isEmpty()\n             && confirmed.toString().isEmpty()\n             && current_mode.isEmpty()  )\n        {\n            if ( !currentProcessedClub.isEmpty() )\n            {\n                retMap[currentProcessedClub] = ClubInfo(determineClubStatus(bandMatched,\n                                                                            bandModeMatched,\n                                                                            bandModeConfirmedMatched,\n                                                                            modeMatched,\n                                                                            records),\n                                                        currentMemberID);\n\n            }\n            currentProcessedClub = clubid;\n            currentMemberID = memberID;\n            bandMatched = bandModeMatched = bandModeConfirmedMatched = modeMatched = false;\n            records = 0L;\n            continue;\n        }\n\n        if ( currentProcessedClub == clubid )\n        {\n            if ( band == in_band )\n            {\n                bandMatched = true;\n                if ( mode == current_mode )\n                {\n                    bandModeMatched = true;\n\n                    if ( confirmed.toInt() == 1 )\n                    {\n                        bandModeConfirmedMatched = true;\n                    }\n                }\n            }\n\n            if ( mode == current_mode )\n            {\n                modeMatched = true;\n            }\n        }\n        else\n        {\n            qCWarning(runtime) << \"Unexpected branch\" << currentProcessedClub << clubid;\n        }\n    }\n\n    if ( !currentProcessedClub.isEmpty() )\n    {\n        qCDebug(runtime) << \"Last Club processing\" << currentProcessedClub;\n        retMap[currentProcessedClub] = ClubInfo(determineClubStatus(bandMatched,\n                                                                    bandModeMatched,\n                                                                    bandModeConfirmedMatched,\n                                                                    modeMatched, records),\n                                                currentMemberID);\n    }\n\n    qCDebug(runtime) << \"DONE\";\n\n    emit status(in_callsign, retMap);\n    return;\n}\n\nClubStatusQuery::ClubStatus ClubStatusQuery::determineClubStatus(bool bandMatched, bool bandModeMatched,\n                                                      bool bandModeConfirmedMatched, bool modeMatched,\n                                                      unsigned long records)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << bandMatched << bandModeMatched << bandModeConfirmedMatched << modeMatched << records;\n\n    if ( !bandMatched && !bandModeMatched\n         && !bandModeConfirmedMatched && !modeMatched && records == 1) // records == 1 means that there is only technical row in table\n    {\n        qCDebug(runtime) << \"NewClub\";\n        return ClubStatus::NewClub;\n    }\n\n    if ( !bandMatched )\n    {\n        if ( !bandModeMatched )\n        {\n            qCDebug(runtime) << \"NewBandModeClub\";\n            return ClubStatus::NewBandModeClub;\n        }\n        else\n        {\n            qCDebug(runtime) << \"NewBandClub\";\n            return ClubStatus::NewBandClub;\n        }\n    }\n\n    if ( !modeMatched )\n    {\n        qCDebug(runtime) << \"NewModeClub\";\n        return ClubStatus::NewModeClub;\n    }\n\n    if ( ! bandModeMatched )\n    {\n        qCDebug(runtime) << \"NewSlotClub\";\n        return ClubStatus::NewSlotClub;\n    }\n\n    if ( ! bandModeConfirmedMatched )\n    {\n        qCDebug(runtime) << \"WorkedClub\";\n        return ClubStatus::WorkedClub;\n    }\n    else\n    {\n        qCDebug(runtime) << \"ConfirmedClub\";\n        return ClubStatus::ConfirmedClub;\n    }\n\n    qCWarning(runtime) << \"!!!!!!!! Unknown Status - never !!!!!!!!!!\";\n    return ClubStatus::UnknownStatusClub;\n}\n"
  },
  {
    "path": "core/MembershipQE.h",
    "content": "#ifndef QLOG_CORE_MEMBERSHIPQE_H\n#define QLOG_CORE_MEMBERSHIPQE_H\n\n#include <QObject>\n#include <QDate>\n#include <QThread>\n#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QMutex>\n#include <QSqlQuery>\n\nclass ClubInfo\n{\npublic:\n    explicit ClubInfo(const QString &callsign,\n                    const QString &ID,\n                    const QDate &validFrom,\n                    const QDate &validTo,\n                    const QString &club);\n    const QString& getCallsign() const;\n    const QString& getID() const;\n    const QDate& getValidFrom() const;\n    const QDate& getValidTo() const;\n    const QString& getClubInfo() const;\n\nprivate:\n    QString callsign;\n    QString id;\n    QDate validFrom;\n    QDate validTo;\n    QString club;\n};\n\nclass ClubStatusQuery : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit ClubStatusQuery(QObject *parent = nullptr);\n    ~ClubStatusQuery();\n\n    enum ClubStatus\n    {\n        NewClub           = 0b1,\n        NewBandClub       = 0b10,\n        NewModeClub       = 0b100,\n        NewBandModeClub   = 0b110,\n        NewSlotClub       = 0b1000,\n        WorkedClub        = 0b10000,\n        ConfirmedClub     = 0b100000,\n        UnknownStatusClub = 0b1000000,\n        AllClub           = 0b1111111\n    };\n\n    Q_ENUM(ClubStatus);\n\n    struct ClubInfo\n    {\n        ClubInfo(){status = UnknownStatusClub;};\n        ClubInfo(const ClubStatus status, const QString &memberID) :\n            status(status), membershipID(memberID) {};\n\n        ClubStatus status;\n        QString membershipID;\n    };\n\npublic slots:\n    void getClubStatus(const QString &in_callsign,\n                       const QString &in_band,\n                       const QString &in_mode,\n                       bool lowtConfirmed,\n                       bool paperConfirmed,\n                       bool eqslConfirmed);\n\nsignals:\n    void status(QString, QMap<QString, ClubStatusQuery::ClubInfo>);\n\nprivate:\n    const QString dbConnectionName;\n    bool dbConnected;\n    QMutex dbLock;\n\n    ClubStatus determineClubStatus(bool, bool, bool, bool, unsigned long);\n};\n\nQ_DECLARE_METATYPE(ClubStatusQuery::ClubInfo)\n\nclass MembershipQE : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static MembershipQE *instance()\n    {\n        static MembershipQE instance;\n        return &instance;\n    };\n    static void saveEnabledClubLists(const QStringList &enabledLists);\n    static QStringList getEnabledClubLists();\n\n    // return only list of clubs where callsign is a member.\n    QList<ClubInfo> query(const QString &in_callsign);\n\n    // return Status for each club\n    // Membership status details can take a long time (depend on the number of records in the log and membership lists)\n    // therefore qlog runs this query in an isolated thread (do not block the main thread). The result is returned via clubStatusResult signal - if exists\n    void asyncQueryDetails(const QString &callsign, const QString &band, const QString &mode);\n\n    void updateLists();\n\nsignals:\n    void clubStatusResult(QString, QMap<QString, ClubStatusQuery::ClubInfo>);\n\nprivate:\n    MembershipQE(QObject *parent = nullptr);\n    ~MembershipQE();\n\nprivate slots:\n    void statusQueryFinished(const QString &,\n                             QMap<QString, ClubStatusQuery::ClubInfo>);\n    void onFinishedListDownload(QNetworkReply *);\n\nprivate:\n    ClubStatusQuery statusQuery;\n    QThread statusQueryThread;\n\n    bool removeDisabled(const QStringList &enabledLists);\n    bool planDownloads(const QStringList &enabledLists);\n    void startPlannedDownload();\n    bool importData(const QString &clubid, const QByteArray &data);\n    void removeClubsFromEnabledClubLists(const QList<QPair<QString, QString>> &toRemove);\n\n    QSqlQuery clubQuery;\n    bool idClubQueryValid;\n    QList<QPair<QString, QString>> updatePlan;\n    QScopedPointer<QNetworkAccessManager> nam;\n};\n\n#endif // QLOG_CORE_MEMBERSHIPQE_H\n"
  },
  {
    "path": "core/Migration.cpp",
    "content": "#include <QProgressDialog>\n#include <QMessageBox>\n#include <QtSql>\n#include <QDebug>\n#include <QUuid>\n#include \"core/Migration.h\"\n#include \"debug.h\"\n#include \"data/Data.h\"\n#include \"LogParam.h\"\n#include \"LOVDownloader.h\"\n#include \"service/clublog/ClubLog.h\"\n#include \"service/hrdlog/HRDLog.h\"\n#include \"logformat/AdxFormat.h\"\n#include \"ui/DxWidget.h\"\n#include \"core/LogDatabase.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.migration\");\n\n/**\n * Migrate the database to the latest schema version.\n * Returns true on success.\n */\nbool DBSchemaMigration::run(bool force)\n{\n    FCT_IDENTIFICATION;\n\n    int currentVersion = getVersion();\n\n    if (currentVersion == latestVersion) {\n        qCDebug(runtime) << \"Database schema already up to date\";\n        updateExternalResource(force);\n        // temporarily added to create a trigger without calling db migration\n        //refreshUploadStatusTrigger();\n        return true;\n    }\n    else if ( currentVersion > latestVersion )\n    {\n        qCritical() << \"Database from the future\" << currentVersion;\n        return false;\n    }\n\n    qCDebug(runtime) << \"Backup before migration\";\n    backupAllQSOsToADX(true);\n\n    qCDebug(runtime) << \"Starting database migration\";\n\n    QProgressDialog progress(\"Migrating the database...\", nullptr, currentVersion, latestVersion);\n    progress.show();\n\n    while ((currentVersion = getVersion()) < latestVersion)\n    {\n        bool res = migrate(currentVersion+1);\n        if ( !res || getVersion() == currentVersion )\n        {\n            progress.close();\n            return false;\n        }\n        // sometimes (especially when DROP INDEX is called), it is needed to\n        // reopen database. (issue occurs between DB versions 15 and 16)\n        QSqlDatabase::database().close();\n\n        if ( !QSqlDatabase::database().open() )\n        {\n            progress.close();\n            qCritical() << QSqlDatabase::database().lastError();\n            return false;\n        }\n        // Re-register custom SQL functions after connection reopen\n        // (sqlite3_create_function bindings are lost on close/open)\n        LogDatabase::instance()->createSQLFunctions();\n        progress.setValue(currentVersion);\n    }\n\n    if ( !refreshUploadStatusTrigger() )\n    {\n        qCritical() << \"Cannot refresh Upload Status Trigger\";\n        progress.close();\n        return false;\n    }\n\n    progress.close();\n\n    updateExternalResource(force);\n\n    qCDebug(runtime) << \"Database migration successful\";\n\n    return true;\n}\n\nbool DBSchemaMigration::backupAllQSOsToADX(bool force)\n{\n    FCT_IDENTIFICATION;\n\n    const int backupCount = 10;\n    const int backupIntervalDays = 7;\n\n    const QDate &lastBackupDate = LogParam::getLastBackupDate();\n    const QDate &now = QDate::currentDate();\n\n    qCDebug(runtime) << \"The last backup date\" << lastBackupDate\n                     << \"Force\" << force;\n\n    if ( !force\n         && lastBackupDate.isValid()\n         && lastBackupDate.addDays(backupIntervalDays) > now )\n    {\n        qCDebug(runtime) << \"Backup skipped\";\n        return true;\n    }\n\n    const QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    const QString todayBackupName = \"qlog_backup_\" + QDateTime::currentDateTime().toString(\"yyyyMMdd\") + \".adx\";\n    const QString todayBackupPath = dir.filePath(todayBackupName);\n\n    // old backup file had a timestamp YYYYMMDDHHmmSS\n    // new backup file has only YYYYMMDD\n    // to be able to clean new and old backup files, following regexp is needed\n    const QRegularExpression regex(\"^qlog_backup_\\\\d{8}(\\\\d{6})?\\\\.adx$\");\n\n    const QFileInfoList &fileList = dir.entryInfoList(QDir::Files | QDir::NoDotAndDotDot);\n    QFileInfoList filteredList;\n\n    for ( const QFileInfo &fileInfo : fileList )\n    {\n        if ( regex.match(fileInfo.fileName()).hasMatch() ) // clazy:exclude=use-static-qregularexpression\n        {\n            filteredList.append(fileInfo);\n        }\n    }\n\n    qCDebug(runtime) << filteredList;\n\n    // does today backup exists ?\n    if ( !force )\n    {\n        for ( const QFileInfo &fileInfo : filteredList )\n        {\n            if ( fileInfo.fileName() == todayBackupName )\n            {\n                qCDebug(runtime) << \"Backup for today already exists: \" << todayBackupName;\n                return true;\n            }\n        }\n    }\n\n    /* Keep the minimum number of backups */\n    /* If a number of backups is greater than backupCount, remove oldest files */\n    if ( filteredList.size() >= backupCount )\n    {\n        std::sort(filteredList.begin(), filteredList.end(), [](const QFileInfo &a, const QFileInfo &b) {\n            return a.fileName() < b.fileName();\n        });\n\n        // remove old files\n        while ( filteredList.size() > backupCount )\n        {\n            QFileInfo oldestFile = filteredList.takeFirst();\n            const QString &filepath = oldestFile.absoluteFilePath();\n            if ( QFile::remove(filepath) )\n                qCDebug(runtime) << \"Removing old backup file: \" << filepath;\n            else\n                qWarning() << \"Failed to remove old backup file: \" << filepath;\n        }\n    }\n\n    /* Make a backup file */\n    QFile backupFile(todayBackupPath);\n\n    if ( !backupFile.open(QFile::ReadWrite | QIODevice::Text) )\n    {\n        qWarning() << \"Cannot open backup file \" << todayBackupPath << \" for writing\";\n        return false;\n    }\n\n    qCDebug(runtime) << \"Exporting a Database backup to \" << todayBackupPath;\n\n    QTextStream stream(&backupFile);\n    AdxFormat adx(stream);\n\n    adx.runExport();\n    stream.flush();\n    backupFile.close();\n\n    LogParam::setLastBackupDate(now);\n\n    qCDebug(runtime) << \"Database backup finished\";\n    return true;\n}\n\n/**\n * Returns the current user_version of the database.\n */\nint DBSchemaMigration::getVersion()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query(\"SELECT version FROM schema_versions \"\n                    \"ORDER BY version DESC LIMIT 1\");\n\n    int i = query.first() ? query.value(0).toInt() : 0;\n    qCDebug(runtime) << i;\n    return i;\n}\n\n/**\n * Changes the user_version of the database to version.\n * Returns true of the operation was successful.\n */\nbool DBSchemaMigration::setVersion(int version)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << version;\n\n    QSqlQuery query;\n    if ( ! query.prepare(\"INSERT INTO schema_versions (version, updated) \"\n                  \"VALUES (:version, datetime('now'))\") )\n    {\n        qWarning() << \"Cannot prepare Insert statement\";\n    }\n\n    query.bindValue(\":version\", version);\n\n    if (!query.exec()) {\n        qWarning() << \"setting schema version failed\" << query.lastError();\n        return false;\n    }\n    else {\n        return true;\n    }\n}\n\n/**\n * Migrate the database to the given version.\n * Returns true if the operation was successful.\n */\nbool DBSchemaMigration::migrate(int toVersion)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"migrate to\" << toVersion;\n\n    QSqlDatabase db = QSqlDatabase::database();\n    if (!db.transaction()) {\n        qCritical() << \"transaction failed\";\n        return false;\n    }\n\n    QString migration_file = QString(\":/res/sql/migration_%1.sql\").arg(toVersion, 3, 10, QChar('0'));\n    bool result = runSqlFile(migration_file);\n\n    result = result && functionMigration(toVersion);\n\n    if (result && setVersion(toVersion) && db.commit()) {\n        return true;\n    }\n    else {\n        if (!db.rollback()) {\n            qCritical() << \"rollback failed\";\n        }\n        return false;\n    }\n}\n\nbool DBSchemaMigration::runSqlFile(QString filename)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filename;\n\n    QFile sqlFile(filename);\n    sqlFile.open(QIODevice::ReadOnly | QIODevice::Text);\n\n    const QStringList &sqlQueries = QTextStream(&sqlFile).readAll().split('\\n').join(\" \").split(';');\n    qCDebug(runtime) << sqlQueries;\n\n    for (const QString &sqlQuery : sqlQueries)\n    {\n        if (sqlQuery.trimmed().isEmpty()) continue;\n\n        qCDebug(runtime) << sqlQuery;\n\n        QSqlQuery query;\n        if (!query.exec(sqlQuery))\n        {\n            qCDebug(runtime) << query.lastError();\n            return false;\n        }\n        query.finish();\n    }\n\n    return true;\n}\n\nbool DBSchemaMigration::functionMigration(int version)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = false;\n    switch ( version )\n    {\n    case 4:\n        ret = fixIntlFields();\n        break;\n    case 6:\n        ret = insertUUID();\n        break;\n    case 15:\n        ret = fillMyDXCC();\n        break;\n    case 17:\n        ret = createTriggers();\n        break;\n    case 23:\n        ret = importQSLCards2DB();\n        break;\n    case 26:\n        ret = fillCQITUZStationProfiles();\n        break;\n    case 28:\n        ret = resetConfigs();\n        break;\n    case 29:\n        ret = profiles2DB();\n        break;\n    case 34:\n        ret = settings2DB();\n        break;\n    case 35:\n        ret = removeSettings2DB();\n        break;\n    default:\n        ret = true;\n    }\n\n    return ret;\n}\n\nint DBSchemaMigration::tableRows(const QString &name)\n{\n    FCT_IDENTIFICATION;\n\n    int i = 0;\n    QSqlQuery query(QString(\"SELECT count(*) FROM %1\").arg(name));\n    i = query.first() ? query.value(0).toInt() : 0;\n    qCDebug(runtime) << i;\n    return i;\n}\n\nbool DBSchemaMigration::updateExternalResource(bool force)\n{\n    FCT_IDENTIFICATION;\n\n    LOVDownloader downloader;\n\n    QProgressDialog progress;\n\n    connect(&downloader, &LOVDownloader::processingSize,\n            &progress, &QProgressDialog::setMaximum);\n    connect(&downloader, &LOVDownloader::progress,\n            &progress, &QProgressDialog::setValue);\n    connect(&downloader, &LOVDownloader::finished,\n            &progress, &QProgressDialog::done);\n    connect(&downloader, &LOVDownloader::noUpdate,\n            &progress, &QProgressDialog::cancel);\n    connect(&progress, &QProgressDialog::canceled,\n            &downloader, &LOVDownloader::abortRequest);\n\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::CTY, \"(1/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::CLUBLOGCTY, \"2/8\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::SATLIST, \"(3/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::SOTASUMMITS, \"(4/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::WWFFDIRECTORY, \"(5/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::IOTALIST, \"(6/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::POTADIRECTORY, \"(7/8)\", force);\n    updateExternalResourceProgress(progress, downloader, LOVDownloader::MEMBERSHIPCONTENTLIST, \"(8/8)\", force);\n\n    return true;\n}\n\nvoid DBSchemaMigration::updateExternalResourceProgress(QProgressDialog& progress,\n                                               LOVDownloader& downloader,\n                                               const LOVDownloader::SourceType & sourceType,\n                                               const QString &counter,\n                                               bool force)\n{\n    FCT_IDENTIFICATION;\n\n    QString stringInfo;\n\n    progress.reset();\n    switch ( sourceType )\n    {\n    case LOVDownloader::SourceType::CTY:\n        stringInfo = tr(\"DXCC Entities\");\n        break;\n    case LOVDownloader::SourceType::SATLIST:\n        stringInfo = tr(\"Sats Info\");\n        break;\n    case LOVDownloader::SourceType::SOTASUMMITS:\n        stringInfo = tr(\"SOTA Summits\");\n        break;\n    case LOVDownloader::SourceType::WWFFDIRECTORY:\n        stringInfo = tr(\"WWFF Records\");\n        break;\n    case LOVDownloader::SourceType::IOTALIST:\n        stringInfo = tr(\"IOTA Records\");\n        break;\n    case LOVDownloader::SourceType::POTADIRECTORY:\n        stringInfo = tr(\"POTA Records\");\n        break;\n    case LOVDownloader::SourceType::MEMBERSHIPCONTENTLIST:\n        stringInfo = tr(\"Membership Directory Records\");\n        break;\n    case LOVDownloader::SourceType::CLUBLOGCTY:\n        stringInfo = tr(\"Clublog CTY.XML\");\n        break;\n    default:\n        stringInfo = tr(\"List of Values\");\n    }\n\n    progress.setWindowFlags(Qt::Dialog | Qt::WindowStaysOnTopHint);\n    progress.setLabelText(tr(\"Updating \") + stringInfo + \" \" + counter +\" ...\");\n    progress.setMinimum(0);\n    progress.setModal(true);\n    progress.show();\n\n    downloader.update(sourceType, force);\n\n    if ( progress.wasCanceled() )\n        qCDebug(runtime) << \"Update was canceled\";\n    else\n    {\n        if ( !progress.exec() )\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 stringInfo + tr(\" Update Failed\"));\n    }\n}\n\n/* Fixing error when QLog stored UTF characters to non-Intl field of ADIF (contact) table */\n/* The fix has two steps\n * 1) Update contact to move all non-intl to intl fields\n * 2) transform intl field to non-intl field by calloni removeAccents\n */\nbool DBSchemaMigration::fixIntlFields()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n    QSqlQuery update;\n\n    if ( !query.prepare( \"SELECT id, name, name_intl, \"\n                         \"           qth, qth_intl, \"\n                         \"           comment, comment_intl, \"\n                         \"           my_antenna, my_antenna_intl,\"\n                         \"           my_city, my_city_intl,\"\n                         \"           my_rig, my_rig_intl,\"\n                         \"           my_sig, my_sig_intl,\"\n                         \"           my_sig_info, my_sig_info_intl,\"\n                         \"           sig, sig_intl,\"\n                         \"           sig_info, sig_info_intl \"\n                         \" FROM contacts\" ) )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fixIntlField 1\";\n        return false;\n    }\n\n    if( !query.exec() )\n    {\n        qWarning()<< \"Cannot exec a migration script - fixIntlFields 1\";\n        return false;\n    }\n\n    if ( !update.prepare(\"UPDATE contacts SET name    = :name,\"\n                         \"                    qth     = :qth, \"\n                         \"                    comment = :comment,\"\n                         \"                    my_antenna = :my_antenna,\"\n                         \"                    my_city = :my_city,\"\n                         \"                    my_rig = :my_rig,\"\n                         \"                    my_sig = :my_sig,\"\n                         \"                    my_sig_info = :my_sig_info,\"\n                         \"                    sig = :sig,\"\n                         \"                    sig_info = :sig_info \"\n                         \"WHERE id = :id\") )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fixIntlField 2\";\n        return false;\n    }\n\n    while( query.next() )\n    {\n        update.bindValue(\":id\", query.value(\"id\").toInt());\n        update.bindValue(\":name\",       fixIntlField(query, \"name\", \"name_intl\"));\n        update.bindValue(\":qth\",        fixIntlField(query, \"qth\", \"qth_intl\"));\n        update.bindValue(\":comment\",    fixIntlField(query, \"comment\", \"comment_intl\"));\n        update.bindValue(\":my_antenna\", fixIntlField(query, \"my_antenna\", \"my_antenna_intl\"));\n        update.bindValue(\":my_city\",    fixIntlField(query, \"my_city\", \"my_city_intl\"));\n        update.bindValue(\":my_rig\",     fixIntlField(query, \"my_rig\", \"my_rig_intl\"));\n        update.bindValue(\":my_sig\",     fixIntlField(query, \"my_sig\", \"my_sig_intl\"));\n        update.bindValue(\":my_sig_info\",fixIntlField(query, \"my_sig_info\", \"my_sig_info_intl\"));\n        update.bindValue(\":sig\",        fixIntlField(query, \"sig\", \"sig_intl\"));\n        update.bindValue(\":sig_info\",   fixIntlField(query, \"sig_info\", \"sig_info_intl\"));\n\n        if ( !update.exec())\n        {\n            qWarning() << \"Cannot exec a migration script - fixIntlFields 2\";\n            return false;\n        }\n    }\n\n    return true;\n}\n\nbool DBSchemaMigration::insertUUID()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::setLogID(QUuid::createUuid().toString());\n}\n\nbool DBSchemaMigration::fillMyDXCC()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n    QSqlQuery update;\n\n    if ( !query.prepare( \"SELECT DISTINCT station_callsign FROM contacts\" ) )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fillMyDXCC 1\" << query.lastError();\n        return false;\n    }\n\n    if( !query.exec() )\n    {\n        qWarning()<< \"Cannot exec a migration script - fillMyDXCC 1\" << query.lastError();\n        return false;\n    }\n\n    if ( !update.prepare(\"UPDATE contacts \"\n                         \"SET my_dxcc = CASE WHEN my_dxcc IS NULL THEN :my_dxcc ELSE my_dxcc END, \"\n                         \"    my_itu_zone = CASE WHEN my_itu_zone IS NULL THEN :my_itu_zone ELSE my_itu_zone END, \"\n                         \"    my_cq_zone = CASE WHEN my_cq_zone IS NULL THEN :my_cq_zone ELSE my_cq_zone END, \"\n                         \"    my_country = CASE WHEN my_country IS NULL THEN :my_country ELSE my_country END, \"\n                         \"    my_country_intl = CASE WHEN my_country_intl IS NULL THEN :my_country_intl ELSE my_country_intl END \"\n                         \"WHERE station_callsign = :station_callsign\") )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fillMyDXCC 2\" << update.lastError();\n        return false;\n    }\n\n    // it is a hack because the migration is running before migration (start/stop database).\n    // It caused that SQL prepared in contructor are incorrectly created.\n    // Therefore, Data are create temporary here\n    Data tmp;\n\n    while( query.next() )\n    {\n        QString myCallsign = query.value(\"station_callsign\").toString();\n        DxccEntity dxccEntity = tmp.lookupDxcc(myCallsign);\n\n        if ( dxccEntity.dxcc )\n        {\n            update.bindValue(\":my_dxcc\",          dxccEntity.dxcc);\n            update.bindValue(\":my_itu_zone\",      dxccEntity.ituz);\n            update.bindValue(\":my_cq_zone\",       dxccEntity.cqz);\n            update.bindValue(\":my_country_intl\",  dxccEntity.country);\n            update.bindValue(\":my_country\",       Data::removeAccents(dxccEntity.country));\n            update.bindValue(\":station_callsign\", myCallsign);\n\n            if ( !update.exec())\n            {\n                qWarning() << \"Cannot exec a migration script - fillMyDXCC 2\" << update.lastError();\n                return false;\n            }\n        }\n    }\n\n    return true;\n}\n\nbool DBSchemaMigration::createTriggers()\n{\n    FCT_IDENTIFICATION;\n\n    // Migration procedure does not support to execute SQL code with Triggers.\n    // It will be safer to create triggers here than to fix the migration procedure\n\n    QSqlQuery query;\n\n    if ( ! query.exec(QString(\"CREATE TRIGGER update_callsign_contacts_autovalue \"\n                              \"AFTER UPDATE ON contacts \"\n                              \"FOR EACH ROW \"\n                              \"WHEN OLD.callsign <> NEW.callsign \"\n                              \"BEGIN \"\n                              \"  INSERT OR REPLACE INTO contacts_autovalue (contactid, base_callsign) \"\n                              \"  VALUES (NEW.id, (WITH tokenizedCallsign(word, csv) AS ( SELECT '', NEW.callsign||'/' \"\n                              \"                                                     UNION ALL \"\n                              \"                                                     SELECT substr(csv, 0, instr(csv, '/')), substr(csv, instr(csv, '/') + 1) \"\n                              \"                                                     FROM tokenizedCallsign \"\n                              \"                                                     WHERE csv != '' ) \"\n                              \"                   SELECT word FROM tokenizedCallsign \"\n                              \"                   WHERE word != '' AND word REGEXP '^([A-Z][0-9]|[A-Z]{1,2}|[0-9][A-Z])([0-9]|[0-9]+)([A-Z]+)$' LIMIT 1));\"\n                              \"END;\")))\n    {\n        qWarning() << \"Cannot create trigger update_callsign_contacts_autovalue \" << query.lastError().text();\n        return false;\n    }\n\n    if ( ! query.exec(QString(\"CREATE TRIGGER insert_contacts_autovalue \"\n                              \"AFTER INSERT ON contacts \"\n                              \"FOR EACH ROW \"\n                              \"BEGIN \"\n                              \"  INSERT OR REPLACE INTO contacts_autovalue (contactid, base_callsign) \"\n                              \"  VALUES (NEW.id, (WITH tokenizedCallsign(word, csv) AS ( SELECT '', NEW.callsign||'/' \"\n                              \"                                                UNION ALL \"\n                              \"                                                SELECT substr(csv, 0, instr(csv, '/')), substr(csv, instr(csv, '/') + 1) \"\n                              \"                                                FROM tokenizedCallsign \"\n                              \"                                                WHERE csv != '' ) \"\n                              \"                   SELECT word FROM tokenizedCallsign \"\n                              \"                   WHERE word != '' and word REGEXP '^([A-Z][0-9]|[A-Z]{1,2}|[0-9][A-Z])([0-9]|[0-9]+)([A-Z]+)$' LIMIT 1)); \"\n                              \"END;\")))\n    {\n        qWarning() << \"Cannot create trigger update_callsign_contacts_autovalue \" << query.lastError().text();\n        return false;\n    }\n\n    return true;\n}\n\nbool DBSchemaMigration::importQSLCards2DB()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n    QSqlQuery insert;\n\n    // don't migrate eqsl imagge because it is only a local cache. If the image is missing then\n    // QLog will download it again\n    static QRegularExpression re(\"^[0-9]{8}_([0-9]+)_.*_qsl_(.*)\", QRegularExpression::CaseInsensitiveOption);\n\n    QString qslFolder = settings.value(\"paperqsl/qslfolder\", QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation)).toString();\n    QDir dir(qslFolder);\n    const QFileInfoList &file_list = dir.entryInfoList(QStringList(\"????????_*_*_qsl_*.*\"),\n                                                QDir::Files,\n                                                QDir::Name);\n    if ( !insert.prepare(\"INSERT INTO contacts_qsl_cards (contactid, source, name, data) \"\n                         \" VALUES (:contactid, 0, :name, :data)\" ) )\n    {\n        qWarning()<< \" Cannot prepare a migration script - importQSLCards2DB 2\" << insert.lastError();\n        return false;\n    }\n\n    for ( auto &file : file_list )\n    {\n        qCDebug(runtime) << \"Processing file\" << file.fileName();\n        QRegularExpressionMatch match = re.match(file.fileName());\n\n        if ( match.hasMatch() )\n        {\n            qCDebug(runtime) << \"File matched - importing\";\n            QFile f(file.absoluteFilePath());\n            if ( !f.open(QFile::ReadOnly))\n            {\n                qWarning() << \"Cannot open file\" << file.fileName();\n                continue;\n            }\n            QByteArray blob = f.readAll();\n            f.close();\n            //do not remove the file - the file may be used by another application\n            //do not use PaperQSL Class here for saving.\n            // this is a migration sequence for filesystem to DB migration with specific properties\n            insert.bindValue(\":contactid\", match.captured(1));\n            insert.bindValue(\":name\", match.captured(2));\n            insert.bindValue(\":data\", blob.toBase64());\n\n            if ( !insert.exec() )\n            {\n                qWarning() << \"Cannot import QSL file\" << file.absoluteFilePath();\n                continue;\n            }\n            qCDebug(runtime) << \"File matched - imported\";\n        }\n    }\n\n    settings.remove(\"paperqsl/qslfolder\");\n    settings.remove(\"eqsl/qslfolder\");\n    return true;\n}\n\nbool DBSchemaMigration::fillCQITUZStationProfiles()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n    QSqlQuery update;\n\n    if ( !query.prepare( \"SELECT DISTINCT callsign FROM station_profiles\" ) )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fillCQITUZStationProfiles 1\" << query.lastError();\n        return false;\n    }\n\n    if( !query.exec() )\n    {\n        qWarning()<< \"Cannot exec a migration script - fillCQITUZStationProfiles 1\" << query.lastError();\n        return false;\n    }\n\n    if ( !update.prepare(\"UPDATE station_profiles \"\n                         \"SET ituz = :ituz, cqz = :cqz, dxcc = :dxcc, country = :country \"\n                         \"WHERE upper(callsign) = :callsign\") )\n    {\n        qWarning()<< \" Cannot prepare a migration script - fillCQITUZStationProfiles 2\" << update.lastError();\n        return false;\n    }\n\n    // it is a hack because the migration is running before migration (start/stop database).\n    // It caused that SQL prepared in contructor are incorrectly created.\n    // Therefore, Data are create temporary here\n    Data tmp;\n\n    while( query.next() )\n    {\n        const QString &myCallsign = query.value(\"callsign\").toString().toUpper();\n        const DxccEntity &dxccEntity = tmp.lookupDxcc(myCallsign);\n\n        if ( dxccEntity.dxcc )\n        {\n            update.bindValue(\":ituz\",  dxccEntity.ituz);\n            update.bindValue(\":cqz\",   dxccEntity.cqz);\n            update.bindValue(\":dxcc\",  dxccEntity.dxcc);\n            update.bindValue(\":country\",  dxccEntity.country);\n            update.bindValue(\":callsign\", myCallsign);\n\n            if ( !update.exec())\n            {\n                qWarning() << \"Cannot exec a migration script - fillCQITUZStationProfiles 2\" << update.lastError();\n                return false;\n            }\n        }\n    }\n\n    return true;\n}\n\nbool DBSchemaMigration::resetConfigs()\n{\n    FCT_IDENTIFICATION;\n\n    // to force redownload CTY file\n    QSettings settings;\n    settings.remove(\"last_cty_update\");\n\n    // it changes to sortable view.\n    // I don't know why, but when the layout is saved, the sort indicator\n    // is not displayed when the sortable view is turned on. So I rather remove the view state\n    settings.remove(\"wsjtx/state\");\n    return true;\n}\n\nbool DBSchemaMigration::profiles2DB()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n\n    setSelectedProfile(\"ant_profiles\", settings.value(\"equipment/ant/profile1\", QString()).toString());\n    settings.remove(\"equipment/ant/profile1\");\n    setSelectedProfile(\"cwkey_profiles\", settings.value(\"equipment/cwkey/profile1\", QString()).toString());\n    settings.remove(\"equipment/cwkey/profile1\");\n    setSelectedProfile(\"cwshortcut_profiles\", settings.value(\"equipment/cwshortcut/profile1\", QString()).toString());\n    settings.remove(\"equipment/cwshortcut/profile1\");\n    setSelectedProfile(\"rig_profiles\", settings.value(\"equipment/rig/profile1\", QString()).toString());\n    settings.remove(\"equipment/rig/profile1\");\n    setSelectedProfile(\"rot_profiles\", settings.value(\"equipment/rot/profile1\", QString()).toString());\n    settings.remove(\"equipment/rot/profile1\");\n    setSelectedProfile(\"rot_user_buttons_profiles\", settings.value(\"equipment/rotusrbuttons/profile1\", QString()).toString());\n    settings.remove(\"equipment/rotusrbuttons/profile1\");\n    setSelectedProfile(\"station_profiles\", settings.value(\"station/profile1\", QString()).toString());\n    settings.remove(\"station/profile1\");\n    setSelectedProfile(\"main_layout_profiles\", settings.value(\"newcontact/layoutprofile/profile1\", QString()).toString());\n    settings.remove(\"newcontact/layoutprofile/profile1\");\n\n    // LOVs to DB\n    settings.remove(\"last_cty_update\");\n    settings.remove(\"last_sat_update\");\n    settings.remove(\"last_sotasummits_update\");\n    settings.remove(\"last_wwffdirectory_update\");\n    settings.remove(\"last_iota_update\");\n    settings.remove(\"last_pota_update\");\n    settings.remove(\"last_membershipcontent_update\");\n\n    settings.remove(\"dxcc/start\");\n\n    return true;\n}\n\nbool DBSchemaMigration::removeSettings2DB()\n{\n    // all platform-independent settings are already in the DB,\n    // no unusual errors occur. It's time to delete old values\n    // ​​from the config.\n    // Only platform-dependent settings remain in the config now.\n\n    QSettings settings;\n\n    settings.remove(\"qrzcom/username\");\n    settings.remove(\"qrzcom/usernameapi\");\n    settings.remove(\"clublog/email\");\n    settings.remove(\"clublog/callsign\");\n    settings.remove(\"clublog/upload_immediately\");\n    settings.remove(\"eqsl/username\");\n    settings.remove(\"eqsl/last_update\");\n    settings.remove(\"eqsl/last_qsoqsl\");\n    settings.remove(\"eqsl/last_QTHProfile\");\n    settings.remove(\"hamqth/username\");\n    settings.remove(\"hrdlog/callsign\");\n    settings.remove(\"hrdlog/onair\");\n    settings.remove(\"kst/username\");\n    settings.remove(\"lotw/username\");\n    settings.remove(\"lotw/tqsl\");\n    settings.remove(\"lotw/last_update\");\n    settings.remove(\"lotw/last_qsoqsl\");\n    settings.remove(\"callbook/primary\");\n    settings.remove(\"callbook/secondary\");\n    settings.remove(\"callbook/weblookupurl\");\n    settings.remove(\"network/notification/qso/adi_addrs\");\n    settings.remove(\"network/notification/dxspot/addrs\");\n    settings.remove(\"network/notification/wsjtx/cqspot/addrs\");\n    settings.remove(\"network/notification/alerts/spot/addrs\");\n    settings.remove(\"network/notification/rig/state/addrs\");\n    settings.remove(\"network/wsjtx_port\");\n    settings.remove(\"network/wsjtx_forward\");\n    settings.remove(\"network/wsjtx_multicast\");\n    settings.remove(\"network/wsjtx_multicast_addr\");\n    settings.remove(\"network/wsjtx_multicast_ttl\");\n    settings.remove(\"memberlists/enabled\");\n    settings.remove(\"alert/alert_aging\");\n    settings.remove(\"alert/state\");\n    settings.remove(\"cwconsole/sendWord\");\n    settings.remove(\"chat/last_selected_room\");\n    settings.remove(\"newcontact/frequency\");\n    settings.remove(\"newcontact/mode\");\n    settings.remove(\"newcontact/submode\");\n    settings.remove(\"newcontact/power\");\n    settings.remove(\"newcontact/tabindex\");\n    settings.remove(\"newcontact/qslsent\");\n    settings.remove(\"newcontact/lotwqslsent\");\n    settings.remove(\"newcontact/eqslqslsent\");\n    settings.remove(\"newcontact/qslsentvia\");\n    settings.remove(\"newcontact/propmode\");\n    settings.remove(\"newcontact/tabsexpanded\");\n    settings.remove(\"newcontact/satname\");\n    settings.beginGroup(\"onlinemap\");\n    settings.remove(\"\");\n    settings.endGroup();\n    settings.beginGroup(\"qsodetail\");\n    settings.remove(\"\");\n    settings.endGroup();\n    settings.remove(\"wsjtx/filter_dxcc_status\");\n    settings.remove(\"wsjtx/filter_cont_regexp\");\n    settings.remove(\"wsjtx/filter_distance\");\n    settings.remove(\"wsjtx/filter_snr\");\n    settings.remove(\"wsjtx/filter_dx_member_list\");\n    settings.remove(\"wsjtx/state\");\n    settings.remove(\"dxc/filter_dxcc_status\");\n    settings.remove(\"dxc/filter_cont_regexp\");\n    settings.remove(\"dxc/filter_spotter_cont_regexp\");\n    settings.remove(\"dxc/filter_deduplication\");\n    settings.remove(\"dxc/filter_duplicationtime\");\n    settings.remove(\"dxc/filter_deduplicationfreq\");\n    settings.remove(\"dxc/filter_dx_member_list\");\n    settings.remove(\"dxc/autoconnect\");\n    settings.remove(\"dxc/keepqsos\");\n    settings.remove(\"dxc/dxtablestate\");\n    settings.remove(\"dxc/wcytablestate\");\n    settings.remove(\"dxc/wwvtablestate\");\n    settings.remove(\"dxc/toalltablestate\");\n    settings.remove(\"dxc/consolefontsize\");\n    settings.remove(\"dxc/servers\");\n    settings.remove(\"dxc/last_server\");\n    settings.remove(\"dxc/filter_mode_cw\");\n    settings.remove(\"dxc/filter_mode_phone\");\n    settings.remove(\"dxc/filter_mode_digital\");\n    settings.remove(\"dxc/filter_mode_ft8\");\n    settings.remove(\"equipment/rigconnected\");\n    settings.remove(\"equipment/rotconnected\");\n    settings.remove(\"equipment/cwkeyconnected\");\n    settings.remove(\"equipment/keepoptions\");\n    settings.remove(\"export/min\");\n    settings.remove(\"export/qsl\");\n    settings.remove(\"export/c1\");\n    settings.remove(\"export/c2\");\n    settings.remove(\"export/c3\");\n    settings.remove(\"logbook/state\");\n    settings.remove(\"logbook/filters/band\");\n    settings.remove(\"logbook/filters/mode\");\n    settings.remove(\"logbook/filters/country\");\n    settings.remove(\"logbook/filters/user\");\n    settings.remove(\"logbook/filters/member\");\n    settings.remove(\"alertbeep\");\n    settings.remove(\"darkmode\");\n    settings.remove(\"geometry\");\n    settings.remove(\"windowState\");\n    settings.remove(\"bandmapwidgets\");\n    return true;\n}\n\nbool DBSchemaMigration::settings2DB()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n\n    if (settings.contains(\"qrzcom/username\"))\n        LogParam::setQRZCOMCallbookUsername(settings.value(\"qrzcom/username\").toString().trimmed());\n\n    if (settings.contains(\"clublog/email\"))\n        LogParam::setClublogLogbookReqEmail(settings.value(\"clublog/email\").toString().trimmed());\n\n    if (settings.contains(\"clublog/upload_immediately\"))\n        LogParam::setClublogUploadImmediatelyEnabled(settings.value(\"clublog/upload_immediately\").toBool());\n\n    if (settings.contains(\"eqsl/username\"))\n        LogParam::setEQSLLogbookUsername(settings.value(\"eqsl/username\").toString());\n    if (settings.contains(\"eqsl/last_update\"))\n        LogParam::setDownloadQSLServiceLastDate(\"eqsl\", settings.value(\"eqsl/last_update\").toDate());\n    if (settings.contains(\"eqsl/last_qsoqsl\"))\n        LogParam::setDownloadQSLServiceLastQSOQSL(\"eqsl\", settings.value(\"eqsl/last_qsoqsl\").toBool());\n    if (settings.contains(\"eqsl/last_QTHProfile\"))\n    {\n        LogParam::setDownloadQSLeQSLLastProfile(settings.value(\"eqsl/last_QTHProfile\").toString());\n        LogParam::setUploadeqslQTHProfile(settings.value(\"eqsl/last_QTHProfile\").toString());\n    }\n\n    if (settings.contains(\"hamqth/username\"))\n        LogParam::setHamQTHCallbookUsername(settings.value(\"hamqth/username\").toString());\n\n    if (settings.contains(\"hrdlog/callsign\"))\n        LogParam::setHRDLogLogbookReqCallsign(settings.value(\"hrdlog/callsign\").toString());\n    if (settings.contains(\"hrdlog/onair\"))\n        LogParam::setHRDLogOnAir(settings.value(\"hrdlog/onair\").toBool());\n\n    if (settings.contains(\"kst/username\"))\n        LogParam::setKSTChatUsername(settings.value(\"kst/username\").toString());\n\n    if (settings.contains(\"lotw/username\"))\n        LogParam::setLoTWCallbookUsername(settings.value(\"lotw/username\").toString());\n    if (settings.contains(\"lotw/tqsl\"))\n        LogParam::setLoTWTQSLPath(settings.value(\"lotw/tqsl\").toString());\n    if (settings.contains(\"lotw/last_update\"))\n        LogParam::setDownloadQSLServiceLastDate(\"lotw\", settings.value(\"lotw/last_update\").toDate());\n    if (settings.contains(\"lotw/last_qsoqsl\"))\n        LogParam::setDownloadQSLServiceLastQSOQSL(\"lotw\", settings.value(\"lotw/last_qsoqsl\").toBool());\n\n    if (settings.contains(\"callbook/primary\"))\n        LogParam::setPrimaryCallbook(settings.value(\"callbook/primary\").toString());\n    if (settings.contains(\"callbook/secondary\"))\n        LogParam::setSecondaryCallbook(settings.value(\"callbook/secondary\").toString());\n    if (settings.contains(\"callbook/weblookupurl\"))\n        LogParam::setCallbookWebLookupURL(settings.value(\"callbook/weblookupurl\").toString());\n\n    if (settings.contains(\"network/notification/qso/adi_addrs\"))\n        LogParam::setNetworkNotifLogQSOAddrs(settings.value(\"network/notification/qso/adi_addrs\").toString());\n    if (settings.contains(\"network/notification/dxspot/addrs\"))\n        LogParam::setNetworkNotifDXCSpotAddrs(settings.value(\"network/notification/dxspot/addrs\").toString());\n    if (settings.contains(\"network/notification/wsjtx/cqspot/addrs\"))\n        LogParam::setNetworkNotifWSJTXCQSpotAddrs(settings.value(\"network/notification/wsjtx/cqspot/addrs\").toString());\n    if (settings.contains(\"network/notification/alerts/spot/addrs\"))\n        LogParam::setNetworkNotifAlertsSpotAddrs(settings.value(\"network/notification/alerts/spot/addrs\").toString());\n    if (settings.contains(\"network/notification/rig/state/addrs\"))\n        LogParam::setNetworkNotifRigStateAddrs(settings.value(\"network/notification/rig/state/addrs\").toString());\n\n    if (settings.contains(\"network/wsjtx_port\"))\n        LogParam::setNetworkNotifRigStateAddrs(settings.value(\"network/wsjtx_port\").toInt());\n    if (settings.contains(\"network/wsjtx_forward\"))\n        LogParam::setNetworkWsjtxForwardAddrs(settings.value(\"network/wsjtx_forward\").toString());\n    if (settings.contains(\"network/wsjtx_multicast\"))\n        LogParam::setNetworkWsjtxListenerJoinMulticast(settings.value(\"network/wsjtx_multicast\").toBool());\n    if (settings.contains(\"network/wsjtx_multicast_addr\"))\n        LogParam::setNetworkWsjtxListenerMulticastAddr(settings.value(\"network/wsjtx_multicast_addr\").toString());\n    if (settings.contains(\"network/wsjtx_multicast_ttl\"))\n        LogParam::setNetworkWsjtxListenerMulticastTTL(settings.value(\"network/wsjtx_multicast_ttl\").toInt());\n\n    if (settings.contains(\"memberlists/enabled\"))\n        LogParam::setEnabledMemberlists(settings.value(\"memberlists/enabled\").toStringList());\n\n    if (settings.contains(\"alert/alert_aging\"))\n        LogParam::setAlertAging(settings.value(\"alert/alert_aging\").toInt());\n    if (settings.contains(\"alert/state\"))\n        LogParam::setAlertWidgetState(settings.value(\"alert/state\").toByteArray());\n\n    if (settings.contains(\"cwconsole/sendWord\"))\n        LogParam::setCWConsoleSendWord(settings.value(\"cwconsole/sendWord\", false).toBool());\n\n    if (settings.contains(\"chat/last_selected_room\"))\n        LogParam::setChatSelectedRoom(settings.value(\"chat/last_selected_room\", 0).toInt());\n\n    if (settings.contains(\"newcontact/frequency\"))\n        LogParam::setNewContactFreq(settings.value(\"newcontact/frequency\").toDouble());\n    if (settings.contains(\"newcontact/mode\"))\n        LogParam::setNewContactMode(settings.value(\"newcontact/mode\").toString());\n    if (settings.contains(\"newcontact/submode\"))\n        LogParam::setNewContactSubMode(settings.value(\"newcontact/submode\").toString());\n    if (settings.contains(\"newcontact/power\"))\n        LogParam::setNewContactPower(settings.value(\"newcontact/power\").toDouble());\n    if (settings.contains(\"newcontact/tabindex\"))\n        LogParam::setNewContactTabIndex(settings.value(\"newcontact/tabindex\", 0).toInt());\n    if (settings.contains(\"newcontact/qslsent\"))\n        LogParam::setNewContactQSLSent(settings.value(\"newcontact/qslsent\").toString());\n    if (settings.contains(\"newcontact/lotwqslsent\"))\n        LogParam::setNewContactLoTWQSLSent(settings.value(\"newcontact/lotwqslsent\").toString());\n    if (settings.contains(\"newcontact/eqslqslsent\"))\n        LogParam::setNewContactEQSLQSLSent(settings.value(\"newcontact/eqslqslsent\").toString());\n    if (settings.contains(\"newcontact/qslsentvia\"))\n        LogParam::setNewContactQSLVia(settings.value(\"newcontact/qslsentvia\").toString());\n    if (settings.contains(\"newcontact/propmode\"))\n        LogParam::setNewContactPropMode(settings.value(\"newcontact/propmode\").toString());\n    if (settings.contains(\"newcontact/tabsexpanded\"))\n        LogParam::setNewContactTabsExpanded(settings.value(\"newcontact/tabsexpanded\").toBool());\n    if (settings.contains(\"newcontact/satname\"))\n        LogParam::setNewContactSatName(settings.value(\"newcontact/satname\").toString());\n\n    settings.beginGroup(\"onlinemap/layerstate\");\n    const QStringList &onlineLayerKeys = settings.allKeys();\n    for ( const QString &key : onlineLayerKeys)\n        LogParam::setMapLayerState(\"onlinemap\", key, settings.value(key).toBool());\n    settings.endGroup();\n\n    settings.beginGroup(\"qsodetail/layerstate\");\n    const QStringList &qsoDetailLayerKeys = settings.allKeys();\n    for ( const QString &key : qsoDetailLayerKeys)\n        LogParam::setMapLayerState(\"qsodetail\", key, settings.value(key).toBool());\n    settings.endGroup();\n\n    if (settings.contains(\"wsjtx/filter_dxcc_status\"))\n        LogParam::setWsjtxFilterDxccStatus(settings.value(\"wsjtx/filter_dxcc_status\").toUInt());\n    if (settings.contains(\"wsjtx/filter_cont_regexp\"))\n        LogParam::setWsjtxFilterContRE(settings.value(\"wsjtx/filter_cont_regexp\").toString());\n    if (settings.contains(\"wsjtx/filter_distance\"))\n        LogParam::setWsjtxFilterDistance(settings.value(\"wsjtx/filter_distance\").toInt());\n    if (settings.contains(\"wsjtx/filter_snr\"))\n        LogParam::setWsjtxFilterDistance(settings.value(\"wsjtx/filter_snr\").toInt());\n    if (settings.contains(\"wsjtx/filter_dx_member_list\"))\n        LogParam::setWsjtxMemberlists(settings.value(\"wsjtx/filter_dx_member_list\").toStringList());\n    if (settings.contains(\"wsjtx/state\"))\n        LogParam::setWsjtxWidgetState(settings.value(\"wsjtx/state\").toByteArray());\n\n    if (settings.contains(\"dxc/filter_dxcc_status\"))\n        LogParam::setDXCFilterDxccStatus(settings.value(\"dxc/filter_dxcc_status\").toUInt());\n    if (settings.contains(\"dxc/filter_cont_regexp\"))\n        LogParam::setDXCFilterContRE(settings.value(\"dxc/filter_cont_regexp\").toString());\n    if (settings.contains(\"dxc/filter_spotter_cont_regexp\"))\n        LogParam::setDXCFilterSpotterContRE(settings.value(\"dxc/filter_spotter_cont_regexp\").toString());\n    if (settings.contains(\"dxc/filter_deduplication\"))\n        LogParam::setDXCFilterDedup(settings.value(\"dxc/filter_deduplication\").toBool());\n    if (settings.contains(\"dxc/filter_duplicationtime\"))\n        LogParam::setDXCFilterDedupTime(settings.value(\"dxc/filter_duplicationtime\").toInt());\n    if (settings.contains(\"dxc/filter_deduplicationfreq\"))\n        LogParam::setDXCFilterDedupFreq(settings.value(\"dxc/filter_deduplicationfreq\", DEDUPLICATION_FREQ_TOLERANCE).toInt());\n    if (settings.contains(\"dxc/filter_dx_member_list\"))\n        LogParam::setDXCFilterMemberlists(settings.value(\"dxc/filter_dx_member_list\").toStringList());\n    if (settings.contains(\"dxc/autoconnect\"))\n        LogParam::setDXCAutoconnectServer(settings.value(\"dxc/autoconnect\").toBool());\n    if (settings.contains(\"dxc/keepqsos\"))\n        LogParam::setDXCKeepQSOs(settings.value(\"dxc/keepqsos\").toBool());\n    if (settings.contains(\"dxc/dxtablestate\"))\n        LogParam::setDXCDXTableState(settings.value(\"dxc/dxtablestate\").toByteArray());\n    if (settings.contains(\"dxc/wcytablestate\"))\n        LogParam::setDXCWCYTableState(settings.value(\"dxc/wcytablestate\").toByteArray());\n    if (settings.contains(\"dxc/wwvtablestate\"))\n        LogParam::setDXCWWVTableState(settings.value(\"dxc/wwvtablestate\").toByteArray());\n    if (settings.contains(\"dxc/toalltablestate\"))\n        LogParam::setDXCTOALLTableState(settings.value(\"dxc/toalltablestate\").toByteArray());\n    if (settings.contains(\"dxc/consolefontsize\"))\n        LogParam::setDXCConsoleFontSize(settings.value(\"dxc/consolefontsize\").toInt());\n    if (settings.contains(\"dxc/servers\"))\n        LogParam::setDXCServerlist(settings.value(\"dxc/servers\").toStringList());\n    if (settings.contains(\"dxc/last_server\"))\n        LogParam::setDXCLastServer(settings.value(\"dxc/last_server\").toString());\n\n    if (settings.contains(\"dxc/filter_mode_cw\")\n        || settings.contains(\"dxc/filter_mode_phone\")\n        || settings.contains(\"dxc/filter_mode_digital\")\n        || settings.contains(\"dxc/filter_mode_ft8\") )\n    {\n        QString value(\"NOTHING\");\n        if ( settings.value(\"dxc/filter_mode_cw\",true).toBool() ) value.append(\"|\" + BandPlan::MODE_GROUP_STRING_CW);\n        if ( settings.value(\"dxc/filter_mode_phone\",true).toBool() ) value.append(\"|\" + BandPlan::MODE_GROUP_STRING_PHONE);\n        if ( settings.value(\"dxc/filter_mode_digital\",true).toBool() ) value.append(\"|\" + BandPlan::MODE_GROUP_STRING_DIGITAL);\n        if ( settings.value(\"dxc/filter_mode_ft8\",true).toBool() ) value.append(\"|\" + BandPlan::MODE_GROUP_STRING_FTx);\n        LogParam::setDXCFilterModeRE(value);\n    }\n\n    const QList<Band> &bands = BandPlan::bandsList(false, true);\n    QStringList excludedBandFilter;\n    for ( const Band &band : bands )\n    {\n        if ( !settings.value(\"dxc/filter_band_\" + band.name,true).toBool())\n            excludedBandFilter << band.name;\n    }\n    if ( !excludedBandFilter.isEmpty() )\n        LogParam::setDXCExcludedBands(excludedBandFilter);\n\n    if (settings.contains(\"export/min\"))\n        LogParam::setExportColumnSet(\"min\", settings.value(\"export/min\").value<QSet<int>>());\n    if (settings.contains(\"export/sql\"))\n        LogParam::setExportColumnSet(\"sql\", settings.value(\"export/sql\").value<QSet<int>>());\n    if (settings.contains(\"export/c1\"))\n        LogParam::setExportColumnSet(\"c1\", settings.value(\"export/c1\").value<QSet<int>>());\n    if (settings.contains(\"export/c2\"))\n        LogParam::setExportColumnSet(\"c2\", settings.value(\"export/c2\").value<QSet<int>>());\n    if (settings.contains(\"export/c3\"))\n        LogParam::setExportColumnSet(\"c3\", settings.value(\"export/c3\").value<QSet<int>>());\n\n    if (settings.contains(\"logbook/state\"))\n        LogParam::setLogbookState(settings.value(\"logbook/state\").toByteArray());\n    if (settings.contains(\"logbook/filters/band\"))\n        LogParam::setLogbookFilterBand(settings.value(\"logbook/filters/band\").toString());\n    if (settings.contains(\"logbook/filters/mode\"))\n        LogParam::setLogbookFilterMode(settings.value(\"logbook/filters/mode\").toString());\n    if (settings.contains(\"logbook/filters/country\"))\n        LogParam::setLogbookFilterCountry(settings.value(\"logbook/filters/country\").toString());\n    if (settings.contains(\"logbook/filters/user\"))\n        LogParam::setLogbookFilterUserFilter(settings.value(\"logbook/filters/user\").toString());\n    if (settings.contains(\"logbook/filters/member\"))\n        LogParam::setLogbookFilterClub(settings.value(\"logbook/filters/member\").toString());\n\n    if (settings.contains(\"alertbeep\"))\n        LogParam::setMainWindowAlertBeep(settings.value(\"alertbeep\").toBool());\n    if (settings.contains(\"darkmode\"))\n        LogParam::setMainWindowDarkMode(settings.value(\"darkmode\").toBool());\n    if (settings.contains(\"geometry\"))\n        LogParam::setMainWindowGeometry(settings.value(\"geometry\").toByteArray());\n    if (settings.contains(\"windowState\"))\n        LogParam::setMainWindowState(settings.value(\"windowState\").toByteArray());\n    if (settings.contains(\"bandmapwidgets\"))\n        LogParam::setMainWindowBandmapWidgets(settings.value(\"bandmapwidgets\").toString());\n\n    return true;\n}\n\nbool DBSchemaMigration::setSelectedProfile(const QString &tablename, const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(QString(\"UPDATE %1 \"\n                                      \"SET selected = CASE \"\n                                      \"               WHEN profile_name = :profileName THEN 1 \"\n                                      \"               ELSE NULL \"\n                                      \"               END \"\n                                      \"WHERE selected = 1 OR profile_name = :profileName2\").arg(tablename)) )\n    {\n        qWarning() << \"Cannot prepare Update statement for\" << tablename;\n        return false;\n    }\n\n    query.bindValue(\":profileName\", profileName);\n    query.bindValue(\":profileName2\", profileName);\n\n    if( !query.exec() )\n    {\n        qWarning()<< \"Cannot update the profile\" << tablename << profileName << query.lastError();\n        return false;\n    }\n    return true;\n}\n\nQString DBSchemaMigration::fixIntlField(const QSqlQuery &query, const QString &columName, const QString &columnNameIntl)\n{\n    FCT_IDENTIFICATION;\n\n    QString retValue;\n\n    QString fieldValue = query.value(columName).toString();\n\n    if ( !fieldValue.isEmpty() )\n    {\n        retValue = Data::removeAccents(fieldValue);\n    }\n    else\n    {\n        retValue = Data::removeAccents(query.value(columnNameIntl).toString());\n    }\n\n    return retValue;\n}\n\nbool DBSchemaMigration::refreshUploadStatusTrigger()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query(\"SELECT name \"\n                    \"FROM PRAGMA_TABLE_INFO('contacts') c \"\n                    \"WHERE c.name NOT IN ('clublog_qso_upload_date', \"\n                    \"                     'clublog_qso_upload_status', \"\n                    \"                     'hrdlog_qso_upload_date', \"\n                    \"                     'hrdlog_qso_upload_status', \"\n                    \"                     'qrzcom_qso_upload_date', \"\n                    \"                     'qrzcom_qso_upload_status', \"\n                    \"                     'hamlogeu_qso_upload_date', \"\n                    \"                     'hamlogeu_qso_upload_status', \"\n                    \"                     'hamqth_qso_upload_date', \"\n                    \"                     'hamqth_qso_upload_status')\");\n\n    if ( !query.exec() )\n    {\n        qWarning() << \"Cannot get Contacts columns\";\n        return false;\n    }\n\n    QStringList whenClause;\n    QStringList afterUpdateClause;\n\n    while ( query.next() )\n    {\n        const QString &columnName = query.value(0).toString();\n        afterUpdateClause << QString(\"\\\"\" + columnName + \"\\\"\");\n        whenClause << QString(\"old.\\\"%1\\\" != new.\\\"%2\\\"\").arg(columnName, columnName);\n    }\n\n    QSqlQuery stmt;\n\n    if ( !stmt.exec(\"DROP TRIGGER IF EXISTS update_contacts_upload_status\") )\n    {\n        qWarning() << \"Cannot drop all Update Contacts Upload Trigger\";\n        return false;\n    }\n\n    auto generateListSpecificConditions = [](const QStringList &columns)\n    {\n        QStringList result;\n        for (const QString &col : columns)\n            result << QString(\"old.\\\"%1\\\" != new.\\\"%2\\\"\").arg(col, col);\n        return result.join(\" OR \");\n    };\n\n    if ( !stmt.exec(QString(\"CREATE TRIGGER update_contacts_upload_status \"\n                            \"AFTER UPDATE OF %1 \"\n                            \"ON contacts \"\n                            \"WHEN (%2) \"\n                            \"BEGIN \"\n                            \"   UPDATE contacts \"\n                            \"   SET hrdlog_qso_upload_status =   CASE WHEN old.hrdlog_qso_upload_status = 'Y' AND (%3) THEN 'M' ELSE old.hrdlog_qso_upload_status END, \"\n                            \"       qrzcom_qso_upload_status =   CASE WHEN old.qrzcom_qso_upload_status = 'Y' THEN 'M' ELSE old.qrzcom_qso_upload_status END , \"\n                            \"       hamlogeu_qso_upload_status = CASE WHEN old.hamlogeu_qso_upload_status = 'Y' THEN 'M' ELSE old.hamlogeu_qso_upload_status END ,  \"\n                            \"       hamqth_qso_upload_status =   CASE WHEN old.hamqth_qso_upload_status = 'Y' THEN 'M' ELSE old.hamqth_qso_upload_status END ,  \"\n                            \"       clublog_qso_upload_status =  CASE WHEN old.clublog_qso_upload_status = 'Y' AND (%4) THEN 'M' ELSE old.clublog_qso_upload_status END \"\n                            \"   WHERE id = new.id;\"\n                            \"   UPDATE contacts_autovalue \"\n                            \"   SET wavelog_qso_upload_status = 'M' \"\n                            \"   WHERE contactid = new.id AND wavelog_qso_upload_status = 'Y'; \"\n                            \"END\").arg(afterUpdateClause.join(\",\"),\n                                       whenClause.join(\" OR \"),\n                                       generateListSpecificConditions(HRDLogUploader::uploadedFields),\n                                       generateListSpecificConditions(ClubLogUploader::uploadedFields))) )\n    {\n        qWarning().noquote() << \"Cannot create Update Contacts Upload Trigger\" << stmt.lastQuery();\n        return false;\n    }\n    return true;\n}\n"
  },
  {
    "path": "core/Migration.h",
    "content": "#ifndef QLOG_CORE_MIGRATION_H\n#define QLOG_CORE_MIGRATION_H\n\n#include \"core/LOVDownloader.h\"\n\nclass QProgressDialog;\n\nclass DBSchemaMigration : public QObject\n{\n    Q_OBJECT\n\npublic:\n    DBSchemaMigration(QObject *parent = nullptr) : QObject(parent) {}\n    bool run(bool force = false);\n    static bool backupAllQSOsToADX(bool force = false);\n\n    static constexpr int latestVersion = 38;\n\nprivate:\n    bool functionMigration(int version);\n    bool migrate(int toVersion);\n    int getVersion();\n    bool setVersion(int version);\n    bool runSqlFile(QString filename);\n    int tableRows(const QString &name);\n    bool updateExternalResource(bool force = false);\n    void updateExternalResourceProgress(QProgressDialog&,\n                                        LOVDownloader&,\n                                        const LOVDownloader::SourceType & sourceType,\n                                        const QString &counter,\n                                        bool force = false);\n    bool fixIntlFields();\n    bool insertUUID();\n    bool fillMyDXCC();\n    bool createTriggers();\n    bool importQSLCards2DB();\n    bool fillCQITUZStationProfiles();\n    bool resetConfigs();\n    bool profiles2DB();\n    bool settings2DB();\n    bool removeSettings2DB();\n    bool setSelectedProfile(const QString &tablename, const QString &profileName);\n    QString fixIntlField(const QSqlQuery &query, const QString &columName, const QString &columnNameIntl);\n    bool refreshUploadStatusTrigger();\n\n    friend class MigrationSqlTest_FriendAccessor;\n};\n\n#endif // QLOG_CORE_MIGRATION_H\n"
  },
  {
    "path": "core/NetworkNotification.cpp",
    "content": "#include <QUuid>\n\n#include \"NetworkNotification.h\"\n#include \"debug.h\"\n#include \"LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.networknotification\");\n\nNetworkNotification::NetworkNotification(QObject *parent)\n    : QObject(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\nQString NetworkNotification::getNotifQSOAdiAddrs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkNotifLogQSOAddrs();\n}\n\nvoid NetworkNotification::saveNotifQSOAdiAddrs(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkNotifLogQSOAddrs(addresses);\n}\n\nQString NetworkNotification::getNotifDXSpotAddrs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkNotifDXCSpotAddrs();\n}\n\nvoid NetworkNotification::saveNotifDXSpotAddrs(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkNotifDXCSpotAddrs(addresses);\n}\n\nQString NetworkNotification::getNotifWSJTXCQSpotAddrs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkNotifWSJTXCQSpotAddrs();\n}\n\nvoid NetworkNotification::saveNotifWSJTXCQSpotAddrs(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkNotifWSJTXCQSpotAddrs(addresses);\n}\n\nQString NetworkNotification::getNotifSpotAlertAddrs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkNotifAlertsSpotAddrs();\n}\n\nvoid NetworkNotification::saveNotifSpotAlertAddrs(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkNotifAlertsSpotAddrs(addresses);\n}\n\nQString NetworkNotification::getNotifRigStateAddrs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkNotifRigStateAddrs();\n}\n\nvoid NetworkNotification::saveNotifRigStateAddrs(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n     LogParam::setNetworkNotifRigStateAddrs(addresses);\n}\n\nvoid NetworkNotification::QSOInserted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Inserted: \" << record;\n\n    HostsPortString destList(getNotifQSOAdiAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        QSONotificationMsg qsoMsg(record, QSONotificationMsg::QSO_INSERT);\n        send(qsoMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::QSOUpdated(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << \"Updated: \" << record;\n\n    HostsPortString destList(getNotifQSOAdiAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        QSONotificationMsg qsoMsg(record, QSONotificationMsg::QSO_UPDATE);\n        send(qsoMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::QSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << \"Deleted: \" << record;\n\n    HostsPortString destList(getNotifQSOAdiAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        QSONotificationMsg qsoMsg(record, QSONotificationMsg::QSO_DELETE);\n        send(qsoMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::dxSpot(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"DX Spot\";\n\n    HostsPortString destList(getNotifDXSpotAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        DXSpotNotificationMsg dxSpotMsg(spot);\n        send(dxSpotMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::wcySpot(const WCYSpot &spot)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << \"WCY Spot\";\n\n    HostsPortString destList(getNotifDXSpotAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        WCYSpotNotificationMsg WCYSpotMsg(spot);\n        send(WCYSpotMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::wwvSpot(const WWVSpot &spot)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << \"WWV Spot\";\n\n    HostsPortString destList(getNotifDXSpotAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        WWVSpotNotificationMsg WWVSpotMsg(spot);\n        send(WWVSpotMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::toAllSpot(const ToAllSpot &spot)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << \"ToALL Spot\";\n\n    HostsPortString destList(getNotifDXSpotAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        ToAllSpotNotificationMsg ToAllSpotMsg(spot);\n        send(ToAllSpotMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::WSJTXCQSpot(const WsjtxEntry &spot)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"WSJTX CQ Spot\";\n\n    HostsPortString destList(getNotifWSJTXCQSpotAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        WSJTXCQSpotNotificationMsg dxSpotMsg(spot);\n        send(dxSpotMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::spotAlert(const SpotAlert &spot)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Usert Alert\";\n\n    HostsPortString destList(getNotifSpotAlertAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        SpotAlertNotificationMsg spotAlertMsg(spot);\n        send(spotAlertMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::rigStatus(const Rig::Status &status)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig Status\";\n\n    HostsPortString destList(getNotifRigStateAddrs());\n\n    if ( destList.getAddrList().size() > 0 )\n    {\n        RigStatusNotificationMsg rigStatusMsg(status);\n        send(rigStatusMsg.getJson(), destList);\n    }\n}\n\nvoid NetworkNotification::send(const QByteArray &data, const HostsPortString &dests)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << QString(data);\n\n    if ( data.isEmpty() )\n        return;\n\n    const QList<HostPortAddress> &addrList = dests.getAddrList();\n\n    for ( const HostPortAddress &addr : addrList )\n    {\n        qCDebug(runtime) << \"Sending to \" << addr;\n        udpSocket.writeDatagram(data, addr, addr.getPort());\n    }\n}\n\nGenericNotificationMsg::GenericNotificationMsg(QObject *parent) :\n    QObject(parent)\n{\n    FCT_IDENTIFICATION;\n\n    msg[\"appid\"] = \"QLog\";\n    msg[\"logid\"] = LogParam::getLogID();\n    msg[\"time\"] = QDateTime::currentMSecsSinceEpoch();\n}\n\n/* QSO Notification Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"operation\":\"insert\",\n      \"rowid\":355,\n      \"type\":\"adif\",\n      \"value\":\"<call:7>OK1TEST<qso_date:8:D>20220320<time_on:6:T>183536<qso_date_off:8:D>20220320<time_off:6:T>183557<rst_rcvd:3>599<rst_sent:3>599<name:12>Testing Name<qth:6>Prague<gridsquare:6>JO70GB<cqz:2>15<ituz:2>28<freq:8:N>10.12649<band:3>30m<mode:2>CW<cont:2>EU<dxcc:3>503<country:14>Czech Republic<qsl_rcvd:1>N<qsl_sent:1>N<lotw_qsl_rcvd:1>N<lotw_qsl_sent:1>N<a_index:1>5<band_rx:3>30m<distance:17>9.266243887046823<eqsl_qsl_rcvd:1>N<eqsl_qsl_sent:1>N<freq_rx:8>10.12649<hrdlog_qso_upload_status:1>N<k_index:4>1.33<my_city:5>PRAHA<my_gridsquare:6>JO70GD<my_rig:9>moje_nove<operator:5>LADAS<sfi:2>94<station_callsign:6>OK1MLG<eor>\"\n   },\n   \"logid\":\"{2046e323-b340-4634-8d52-4e70a4231978}\",\n   \"msgtype\":\"qso\",\n   \"time\":1647801358067\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nQSONotificationMsg::QSONotificationMsg(const QSqlRecord &record,\n                                       const QSOOperation operation,\n                                       QObject *parent) :\n    GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QString data;\n    QTextStream stream(&data, QIODevice::ReadWrite);\n\n    /* currently only ADIF is supported */\n    /* ADX and JSON do not support export single record */\n    LogFormat* format = LogFormat::open(LogFormat::ADI, stream);\n\n    if (!format) {\n        qWarning() << \"cannot created ADIF Export Formatter\";\n        return;\n    }\n\n    //format->exportStart();\n    format->exportContact(record);\n    stream.flush();\n    //format->exportEnd();\n\n    QJsonObject qsoData;\n    qsoData[\"operation\"] = QSOOperation2String.value(operation,\"unknown\");\n    qsoData[\"type\"] = \"adif\";\n    qsoData[\"rowid\"] = record.value(record.indexOf(\"id\")).toInt();\n    qsoData[\"value\"] = data.replace(\"\\n\", \"\");\n\n    msg[\"msgtype\"] = \"qso\";\n    msg[\"data\"] = qsoData;\n\n    delete format;\n}\n\n/* DXC Spot Message\n * Example\n *\n{\n    \"appid\": \"QLog\",\n    \"data\": {\n        \"band\": \"40m\",\n        \"comment\": \"tnx qso\",\n        \"dx\": {\n            \"call\": \"YB0AR\",\n            \"cont\": \"OC\",\n            \"country\": \"Indonesia\",\n            \"cqz\": 28,\n            \"dxcc\": 327,\n            \"ituz\": 54,\n            \"member\": [\"LoTW\", \"eQSLAG\"]\n            \"pfx\": \"YB\",\n            \"utcoffset\": -7\n        },\n        \"freq\": \"7.1880\",\n        \"mode\": \"PHONE\",\n        \"rcvtime\": \"20220316 20:04:30\",\n        \"spotter\": {\n            \"call\": \"G0DEF\",\n            \"cont\": \"EU\",\n            \"country\": \"England\",\n            \"cqz\": 14,\n            \"dxcc\": 223,\n            \"ituz\": 27,\n            \"pfx\": \"G\",\n            \"utcoffset\": 0\n        },\n        \"status\": \"newentity\"\n    },\n    \"logid\":\"{2046e323-b340-4634-8d52-4e70a4231978}\",\n    \"msgtype\": \"dxspot\",\n    \"time\": 1647461070837\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nDXSpotNotificationMsg::DXSpotNotificationMsg(const DxSpot &spot, QObject *parent) :\n    GenericSpotNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = spot.dateTime.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"freq\"] = qRound(spot.freq * 10000.0) / 10000.0;\n    spotData[\"band\"] = spot.band;\n    spotData[\"mode\"] = spot.modeGroupString; \n    spotData[\"comment\"] = spot.comment;\n    spotData[\"status\"] = DxccStatus2String.value(spot.status, \"unknown\");\n\n    QJsonObject dxInfo;\n    dxInfo[\"call\"] = spot.callsign;\n    dxInfo[\"country\"] = spot.dxcc.country;\n    dxInfo[\"pfx\"] = spot.dxcc.prefix;\n    dxInfo[\"dxcc\"] = spot.dxcc.dxcc;\n    dxInfo[\"cont\"] = spot.dxcc.cont;\n    dxInfo[\"cqz\"] = spot.dxcc.cqz;\n    dxInfo[\"ituz\"] = spot.dxcc.ituz;\n    dxInfo[\"utcoffset\"] = spot.dxcc.tz;\n    dxInfo[\"member\"] = QJsonArray::fromStringList(spot.memberList2StringList());\n\n    QJsonObject spotterInfo;\n    spotterInfo[\"call\"] = spot.spotter;\n    spotterInfo[\"country\"] = spot.dxcc_spotter.country;\n    spotterInfo[\"pfx\"] = spot.dxcc_spotter.prefix;\n    spotterInfo[\"dxcc\"] = spot.dxcc_spotter.dxcc;\n    spotterInfo[\"cont\"] = spot.dxcc_spotter.cont;\n    spotterInfo[\"cqz\"] = spot.dxcc_spotter.cqz;\n    spotterInfo[\"ituz\"] = spot.dxcc_spotter.ituz;\n    spotterInfo[\"utcoffset\"] = spot.dxcc_spotter.tz;\n\n    spotData[\"spotter\"] = spotterInfo;\n    spotData[\"dx\"] = dxInfo;\n\n    msg[\"msgtype\"] = \"dxspot\";\n    msg[\"data\"] = spotData;\n}\n\n/* WSJTX Spot Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"band\":\"80m\",\n      \"comment\":\"CQ OK1MLG JO70\",\n      \"dx\":{\n         \"call\":\"OK1MLG\",\n         \"cont\":\"EU\",\n         \"country\":\"Europe\",\n         \"cqz\":15,\n         \"dxcc\":503,\n         \"grid\":\"JO70\",\n         \"ituz\":28,\n         \"member\":[\"LOTW\", \"eQSLAG\"]\n         \"pfx\":\"OK\",\n         \"utcoffset\":-2\n      },\n      \"freq\":\"3.5730\",\n      \"mode\":\"FT8\",\n      \"rcvtime\":\"20220318 17:04:29\",\n      \"status\":\"newband\"\n   },\n   \"logid\":\"{2046e323-b340-4634-8d52-4e70a4231978}\",\n   \"msgtype\":\"wsjtxcqspot\",\n   \"time\":1647623069705\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nWSJTXCQSpotNotificationMsg::WSJTXCQSpotNotificationMsg(const WsjtxEntry &spot, QObject *parent) :\n    GenericSpotNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = spot.receivedTime.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"freq\"] = qRound(spot.freq * 10000.0) / 10000.0;\n    spotData[\"band\"] = spot.band;\n    spotData[\"mode\"] = spot.decodedMode;\n    spotData[\"comment\"] = spot.decode.message;\n    spotData[\"status\"] = DxccStatus2String.value(spot.status, \"unknown\");\n\n    QJsonObject dxInfo;\n    dxInfo[\"call\"] = spot.callsign;\n    dxInfo[\"country\"] = spot.dxcc.country;\n    dxInfo[\"pfx\"] = spot.dxcc.prefix;\n    dxInfo[\"dxcc\"] = spot.dxcc.dxcc;\n    dxInfo[\"cont\"] = spot.dxcc.cont;\n    dxInfo[\"cqz\"] = spot.dxcc.cqz;\n    dxInfo[\"ituz\"] = spot.dxcc.ituz;\n    dxInfo[\"utcoffset\"] = spot.dxcc.tz;\n    dxInfo[\"grid\"] = spot.grid;\n    dxInfo[\"member\"] = QJsonArray::fromStringList(spot.memberList2StringList());\n\n    spotData[\"dx\"] = dxInfo;\n\n    msg[\"msgtype\"] = \"wsjtxcqspot\";\n    msg[\"data\"] = spotData;\n}\n\nGenericSpotNotificationMsg::GenericSpotNotificationMsg(QObject *parent)\n    : GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\n/* Spot Alert Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"band\":\"17m\",\n      \"comment\":\"CW     7 dB  25 WPM  CQ     \",\n      \"dx\":{\n         \"call\":\"ZL3CW\",\n         \"cont\":\"OC\",\n         \"country\":\"New Zealand\",\n         \"cqz\":32,\n         \"dxcc\":170,\n         \"ituz\":60,\n         \"member\": [\"LOTW\", \"eQSLAG\"]\n         \"pfx\":\"ZL\",\n         \"utcoffset\":-12\n      },\n      \"freq\":18.073,\n      \"mode\":\"CW\",\n      \"rcvtime\":\"20220510 08:42:34\",\n      \"rules\":[\n         \"rule1\",\n         \"rule2\"\n      ],\n      \"spotter\":{\n         \"call\":\"SM6FMB\",\n         \"cont\":\"EU\",\n         \"country\":\"Sweden\",\n         \"cqz\":14,\n         \"dxcc\":284,\n         \"ituz\":18,\n         \"pfx\":\"SM\",\n         \"utcoffset\":-1\n      },\n      \"status\":\"newentity\"\n   },\n   \"logid\":\"{2046e323-b340-4634-8d52-4e70a4231978}\",\n   \"msgtype\":\"spotalert\",\n   \"time\":1652172154472\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nSpotAlertNotificationMsg::SpotAlertNotificationMsg(const SpotAlert &alert, QObject *parent) :\n    GenericSpotNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = alert.spot.dateTime.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"freq\"] = qRound(alert.spot.freq * 10000.0) / 10000.0;\n    spotData[\"band\"] = alert.spot.band;\n    spotData[\"mode\"] = alert.spot.modeGroupString;\n    spotData[\"comment\"] = alert.spot.comment;\n    spotData[\"status\"] = DxccStatus2String.value(alert.spot.status, \"unknown\");\n    spotData[\"rules\"] = QJsonArray::fromStringList(alert.ruleNameList);\n\n    QJsonObject dxInfo;\n    dxInfo[\"call\"] = alert.spot.callsign;\n    dxInfo[\"country\"] = alert.spot.dxcc.country;\n    dxInfo[\"pfx\"] = alert.spot.dxcc.prefix;\n    dxInfo[\"dxcc\"] = alert.spot.dxcc.dxcc;\n    dxInfo[\"cont\"] = alert.spot.dxcc.cont;\n    dxInfo[\"cqz\"] = alert.spot.dxcc.cqz;\n    dxInfo[\"ituz\"] = alert.spot.dxcc.ituz;\n    dxInfo[\"utcoffset\"] = alert.spot.dxcc.tz;\n    dxInfo[\"member\"] = QJsonArray::fromStringList(alert.spot.memberList2StringList());\n\n    QJsonObject spotterInfo;\n    spotterInfo[\"call\"] = alert.spot.spotter;\n    spotterInfo[\"country\"] = alert.spot.dxcc_spotter.country;\n    spotterInfo[\"pfx\"] = alert.spot.dxcc_spotter.prefix;\n    spotterInfo[\"dxcc\"] = alert.spot.dxcc_spotter.dxcc;\n    spotterInfo[\"cont\"] = alert.spot.dxcc_spotter.cont;\n    spotterInfo[\"cqz\"] = alert.spot.dxcc_spotter.cqz;\n    spotterInfo[\"ituz\"] = alert.spot.dxcc_spotter.ituz;\n    spotterInfo[\"utcoffset\"] = alert.spot.dxcc_spotter.tz;\n\n    spotData[\"spotter\"] = spotterInfo;\n    spotData[\"dx\"] = dxInfo;\n\n    msg[\"msgtype\"] = \"spotalert\";\n    msg[\"data\"] = spotData;\n\n}\n\n/* WCY Spot Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"A\":13,\n      \"Au\":\"no\",\n      \"GMF\":\"act\",\n      \"K\":3,\n      \"R\":0,\n      \"SA\":\"qui\",\n      \"SFI\":68,\n      \"expK\":3,\n      \"rcvtime\":\"20220923 11:29:16\"\n   },\n   \"logid\":\"{c804ab21-c1bf-4b7f-90a6-8927bdb10dd0}\",\n   \"msgtype\":\"wcyspot\",\n   \"time\":1663932556260\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nWCYSpotNotificationMsg::WCYSpotNotificationMsg(const WCYSpot &spot, QObject *parent) :\n    GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = spot.time.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"K\"] = spot.KIndex;\n    spotData[\"expK\"] = spot.expK;\n    spotData[\"A\"] = spot.AIndex;\n    spotData[\"R\"] = spot.RIndex;\n    spotData[\"SFI\"] = spot.SFI;\n    spotData[\"SA\"] = spot.SA;\n    spotData[\"GMF\"] = spot.GMF;\n    spotData[\"Au\"] = spot.Au;\n\n    msg[\"msgtype\"] = \"wcyspot\";\n    msg[\"data\"] = spotData;\n}\n\n/* WWVSpot Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"A\":12,\n      \"Info1\":\"No Storms\",\n      \"Info2\":\"No Storms\",\n      \"K\":2,\n      \"SFI\":68,\n      \"rcvtime\":\"20220923 11:29:16\"\n   },\n   \"logid\":\"{c804ab21-c1bf-4b7f-90a6-8927bdb10dd0}\",\n   \"msgtype\":\"wwvspot\",\n   \"time\":1663932556294\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nWWVSpotNotificationMsg::WWVSpotNotificationMsg(const WWVSpot &spot, QObject *parent) :\n    GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = spot.time.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"SFI\"] = spot.SFI;\n    spotData[\"A\"] = spot.AIndex;\n    spotData[\"K\"] = spot.KIndex;\n    spotData[\"Info1\"] = spot.info1;\n    spotData[\"Info2\"] = spot.info2;\n\n    msg[\"msgtype\"] = \"wwvspot\";\n    msg[\"data\"] = spotData;\n}\n\n/* ToAllSpot Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"data\":{\n      \"message\":\"GB7RDX New Users Welcome. cluster.g3ldi.co.uk Port 7000\",\n      \"rcvtime\":\"20220923 11:29:16\",\n      \"spotter\":{\n         \"call\":\"G3LDI\",\n         \"cont\":\"EU\",\n         \"country\":\"England\",\n         \"cqz\":14,\n         \"dxcc\":223,\n         \"ituz\":27,\n         \"pfx\":\"G\",\n         \"utcoffset\":0\n      }\n   },\n   \"logid\":\"{c804ab21-c1bf-4b7f-90a6-8927bdb10dd0}\",\n   \"msgtype\":\"toallspot\",\n   \"time\":1663932556327\n}\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n  */\nToAllSpotNotificationMsg::ToAllSpotNotificationMsg(const ToAllSpot &spot, QObject *parent) :\n    GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject spotData;\n    spotData[\"rcvtime\"] = spot.time.toString(\"yyyyMMdd hh:mm:ss\");\n    spotData[\"message\"] = spot.message;\n\n    QJsonObject spotterInfo;\n    spotterInfo[\"call\"] = spot.spotter;\n    spotterInfo[\"country\"] = spot.dxcc_spotter.country;\n    spotterInfo[\"pfx\"] = spot.dxcc_spotter.prefix;\n    spotterInfo[\"dxcc\"] = spot.dxcc_spotter.dxcc;\n    spotterInfo[\"cont\"] = spot.dxcc_spotter.cont;\n    spotterInfo[\"cqz\"] = spot.dxcc_spotter.cqz;\n    spotterInfo[\"ituz\"] = spot.dxcc_spotter.ituz;\n    spotterInfo[\"utcoffset\"] = spot.dxcc_spotter.tz;\n\n    spotData[\"spotter\"] = spotterInfo;\n\n    msg[\"msgtype\"] = \"toallspot\";\n    msg[\"data\"] = spotData;\n}\n\n/* Rig Status Message\n * Example\n *\n{\n   \"appid\":\"QLog\",\n   \"msgtype\":\"rigstatus\",\n   \"time\":1647197319251,\n   \"data\":{\n             \"profile\" : \"IC7300\",\n             \"connected\" : true,\n             \"txvfo\" : \"CURR\",\n             \"rxvfo\" : \"CURR\",                -- TX/RX VFOs have the same value - split is not supported\n             \"txpower\" : 0.01                 <in W>\n             \"keyspeed\" : 23\n             \"vfostates\" :\n              [\n                  {\n                     \"vfo\" : \"CURR\",\n                     \"freq\" : \"7.18800\"       <in MHz always 5 dec. places>\n                     \"mode\" : \"FM\",\n                     \"rawmode\" : \"FM\",        <raw mode from Rig>\n                     \"ptt\" : false,\n                     \"rit\" : 0.1              <in MHz>\n                     \"xit\" : 0.0              <in MHz>\n                     \"bandwidth\" : 2400       <in Hz>\n                  },\n                  {\n                     ....                     -- currently, the second VFO is not present\n                  }\n              ]\n          },\n   \"logid\":\"{2046e323-b340-4634-8d52-4e70a4231978}\"\n}\n  * Empty/Zero fields are not sent. Sent is everything that is known at the given moment of event.\n  * More info https://github.com/foldynl/QLog/wiki/Notifications\n*/\nRigStatusNotificationMsg::RigStatusNotificationMsg(const Rig::Status &status, QObject *parent) :\n    GenericNotificationMsg(parent)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject vfoState;\n\n    auto addIfNoEmpty = [&](const QString &key,\n                            const QString &value,\n                            bool addCond = true)\n    {\n        if ( !value.isEmpty() && addCond)\n            vfoState[key] = value;\n    };\n\n    auto addBoolIfNoEmpty = [&](const QString &key,\n                            const qint8 &value,\n                            bool addCond = true)\n    {\n        if ( addCond )\n            vfoState[key] = ( value != 0 );\n    };\n\n    auto addDoubleIfNoEmpty = [&](const QString &key,\n                                const double &value,\n                                bool addCond = true)\n    {\n        if ( value != 0.0 && addCond )\n            vfoState[key] = value;\n    };\n\n    addIfNoEmpty(\"vfo\", status.vfo);\n    addIfNoEmpty(\"freq\",  QString::number(status.freq, 'f', 5), status.freq != 0.0);\n    addIfNoEmpty(\"mode\", status.mode);\n    addIfNoEmpty(\"submode\", status.submode);\n    addIfNoEmpty(\"rawmode\", status.rawmode);\n    addBoolIfNoEmpty(\"ptt\", status.ptt, status.ptt != -1);\n    addDoubleIfNoEmpty(\"rit\", status.rit);\n    addDoubleIfNoEmpty(\"xit\", status.xit);\n    addDoubleIfNoEmpty(\"bandwidth\", status.bandwidth);\n\n    QJsonArray vfoStates;\n    vfoStates.append(vfoState);\n\n    QJsonObject rigData;\n    rigData[\"profile\"] = status.profile;\n    rigData[\"connected\"] = status.isConnected;\n\n    if ( !status.vfo.isEmpty() )\n    {\n        rigData[\"txvfo\"] = status.vfo;\n        rigData[\"rxvfo\"] = status.vfo;\n    }\n\n    rigData[\"split\"] = status.splitEnabled;\n\n    if ( status.splitEnabled && status.txFreq > 0.0 )\n        rigData[\"txfreq\"] = status.txFreq;\n\n    if ( status.power > 0.0 )\n        rigData[\"txpower\"] = status.power;\n\n    if ( vfoState.size() > 0 )\n        rigData[\"vfostates\"] = vfoStates;\n\n    if ( status.keySpeed > 0 )\n        rigData[\"keyspeed\"] = status.keySpeed;\n\n    msg[\"msgtype\"] = \"rigstatus\";\n    msg[\"data\"] = rigData;\n}\n"
  },
  {
    "path": "core/NetworkNotification.h",
    "content": "#ifndef QLOG_CORE_NETWORKNOTIFICATION_H\n#define QLOG_CORE_NETWORKNOTIFICATION_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include <QJsonObject>\n#include <QJsonDocument>\n#include <QUdpSocket>\n\n#include \"data/HostsPortString.h\"\n#include \"logformat/LogFormat.h\"\n#include \"data/DxSpot.h\"\n#include \"data/WsjtxEntry.h\"\n#include \"data/SpotAlert.h\"\n#include \"data/WCYSpot.h\"\n#include \"data/WWVSpot.h\"\n#include \"data/ToAllSpot.h\"\n#include \"rig/Rig.h\"\n\nclass GenericNotificationMsg : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit GenericNotificationMsg(QObject *parent = nullptr);\n    QByteArray getJson() const  { return QJsonDocument(msg).toJson(QJsonDocument::Compact); };\n\nprotected:\n    QJsonObject msg;\n};\n\nclass QSONotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    enum QSOOperation\n    {\n        QSO_INSERT = 0,\n        QSO_UPDATE = 1,\n        QSO_DELETE = 2\n    };\n\n    explicit QSONotificationMsg(const QSqlRecord&,\n                                const QSOOperation,\n                                QObject *parent = nullptr);\n\nprivate:\n    QMap<int, QString> QSOOperation2String = {\n        {QSOOperation::QSO_INSERT, \"insert\"},\n        {QSOOperation::QSO_UPDATE, \"update\"},\n        {QSOOperation::QSO_DELETE, \"delete\"},\n    };\n};\n\nclass GenericSpotNotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    explicit GenericSpotNotificationMsg(QObject *parent = nullptr);\n\nprotected:\n    QMap<int, QString> DxccStatus2String = {\n        {DxccStatus::NewEntity, \"newentity\"},\n        {DxccStatus::NewBandMode, \"newbandmode\"},\n        {DxccStatus::NewBand, \"newband\"},\n        {DxccStatus::NewMode, \"newmode\"},\n        {DxccStatus::NewSlot, \"newslot\"},\n        {DxccStatus::Worked, \"worked\"},\n        {DxccStatus::Confirmed, \"confirmed\"},\n        {DxccStatus::UnknownStatus, \"unknown\"},\n    };\n};\n\nclass DXSpotNotificationMsg : public GenericSpotNotificationMsg\n{\n\npublic:\n    explicit DXSpotNotificationMsg(const DxSpot&, QObject *parent = nullptr);\n};\n\nclass WSJTXCQSpotNotificationMsg : public GenericSpotNotificationMsg\n{\n\npublic:\n    explicit WSJTXCQSpotNotificationMsg(const WsjtxEntry&, QObject *parent = nullptr);\n\n};\n\nclass SpotAlertNotificationMsg : public GenericSpotNotificationMsg\n{\n\npublic:\n    explicit SpotAlertNotificationMsg(const SpotAlert&alert, QObject *parent = nullptr);\n\n};\n\nclass WCYSpotNotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    explicit WCYSpotNotificationMsg(const WCYSpot&, QObject *parent = nullptr);\n\n};\n\nclass WWVSpotNotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    explicit WWVSpotNotificationMsg(const WWVSpot&, QObject *parent = nullptr);\n\n};\n\nclass ToAllSpotNotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    explicit ToAllSpotNotificationMsg(const ToAllSpot&, QObject *parent = nullptr);\n\n};\n\nclass RigStatusNotificationMsg : public GenericNotificationMsg\n{\n\npublic:\n    explicit RigStatusNotificationMsg(const Rig::Status&, QObject *parent = nullptr);\n\n};\n\nclass NetworkNotification : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit NetworkNotification(QObject *parent = nullptr);\n\n    static QString getNotifQSOAdiAddrs();\n    static void saveNotifQSOAdiAddrs(const QString &);\n    static QString getNotifDXSpotAddrs();\n    static void saveNotifDXSpotAddrs(const QString &);\n    static QString getNotifWSJTXCQSpotAddrs();\n    static void saveNotifWSJTXCQSpotAddrs(const QString &);\n    static QString getNotifSpotAlertAddrs();\n    static void saveNotifSpotAlertAddrs(const QString &);\n    static QString getNotifRigStateAddrs();\n    static void saveNotifRigStateAddrs(const QString &);\n\npublic slots:\n    void QSOInserted(const QSqlRecord &);\n    void QSOUpdated(const QSqlRecord &);\n    void QSODeleted(const QSqlRecord &);\n    void dxSpot(const DxSpot&);\n    void wcySpot(const WCYSpot&);\n    void wwvSpot(const WWVSpot&);\n    void toAllSpot(const ToAllSpot&);\n    void WSJTXCQSpot(const WsjtxEntry&);\n    void spotAlert(const SpotAlert&);\n    void rigStatus(const Rig::Status&);\n\nprivate:\n\n    QUdpSocket udpSocket;\n\n    void send(const QByteArray &, const HostsPortString &);\n};\n\n#endif // QLOG_CORE_NETWORKNOTIFICATION_H\n"
  },
  {
    "path": "core/PasswordCipher.cpp",
    "content": "#include <QDataStream>\n#include <QIODevice>\n#include <QLoggingCategory>\n\n#include <openssl/evp.h>\n#include <openssl/rand.h>\n#include <openssl/err.h>\n\n#include \"PasswordCipher.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.passwordcipher\");\n\nnamespace {\n  const char kMagic[4] = {'P','M','G','R'};\n  const quint8 kVersion = 1;\n  const quint8 kKdfPBKDF2 = 1;\n  const quint8 kAeadAES256GCM = 1;\n\n  inline QByteArray toUtf8Norm(const QString& s)\n  {\n    return s.toUtf8();\n  }\n\n  inline bool randFill(QByteArray& out)\n  {\n    return RAND_bytes(reinterpret_cast<unsigned char*>(out.data()), out.size()) == 1;\n  }\n\n  inline void logOpensslError(const char* where)\n  {\n    unsigned long ec = ERR_get_error();\n    if (ec != 0)\n    {\n      char buf[256] = {0};\n      ERR_error_string_n(ec, buf, sizeof(buf));\n      qCDebug(runtime) << where << \"openssl:\" << buf;\n    }\n    else\n    {\n      qCDebug(runtime) << where << \"failed\";\n    }\n  }\n}\n\nvoid PasswordCipher::cleanse(QByteArray& buf)\n{\n    FCT_IDENTIFICATION;\n    if (!buf.isEmpty()) OPENSSL_cleanse(buf.data(), static_cast<size_t>(buf.size()));\n}\n\nbool PasswordCipher::kdf_pbkdf2_sha256(const QByteArray& passUtf8,\n                                       const QByteArray& salt,\n                                       int iters,\n                                       QByteArray& outKey32)\n{\n    FCT_IDENTIFICATION;\n\n    outKey32.resize(kKeyLen);\n    int ok = PKCS5_PBKDF2_HMAC(passUtf8.constData(), passUtf8.size(),\n                               reinterpret_cast<const unsigned char*>(salt.constData()), salt.size(),\n                               iters, EVP_sha256(),\n                               outKey32.size(),\n                               reinterpret_cast<unsigned char*>(outKey32.data()));\n    if (ok != 1)\n    {\n        logOpensslError(\"PKCS5_PBKDF2_HMAC\");\n        outKey32.clear();\n        return false;\n    }\n    return true;\n}\n\nbool PasswordCipher::aes_gcm_encrypt(const QByteArray& key,\n                                     const QByteArray& iv,\n                                     const QByteArray& pt,\n                                     QByteArray& ct,\n                                     QByteArray& tag)\n{\n    FCT_IDENTIFICATION;\n\n    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();\n    if ( !ctx )\n    {\n        logOpensslError(\"EVP_CIPHER_CTX_new\");\n        return false;\n    }\n\n    bool ok = false;\n    do\n    {\n        if (EVP_EncryptInit_ex(ctx, EVP_aes_256_gcm(), nullptr, nullptr, nullptr) != 1)\n        {\n            logOpensslError(\"EncryptInit\");\n            break;\n        }\n\n        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv.size(), nullptr) != 1)\n        {\n            logOpensslError(\"SET_IVLEN\");\n            break;\n        }\n\n        if (EVP_EncryptInit_ex(ctx, nullptr, nullptr,\n                               reinterpret_cast<const unsigned char*>(key.constData()),\n                               reinterpret_cast<const unsigned char*>(iv.constData())) != 1)\n        {\n            logOpensslError(\"EncryptInit key/iv\");\n            break;\n        }\n\n        ct.resize(pt.size());\n        int outl = 0, total = 0;\n        if (EVP_EncryptUpdate(ctx,\n                              reinterpret_cast<unsigned char*>(ct.data()), &outl,\n                              reinterpret_cast<const unsigned char*>(pt.constData()), pt.size()) != 1)\n        {\n            logOpensslError(\"EncryptUpdate\");\n            break;\n        }\n\n        total += outl;\n\n        if (EVP_EncryptFinal_ex(ctx,\n                                reinterpret_cast<unsigned char*>(ct.data()) + total, &outl) != 1)\n        {\n            logOpensslError(\"EncryptFinal\");\n            break;\n        }\n\n        total += outl; ct.resize(total);\n\n        tag.resize(kTagLen);\n        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tag.size(), tag.data()) != 1)\n        {\n            logOpensslError(\"GET_TAG\");\n            break;\n        }\n\n        ok = true;\n    } while(false);\n\n    if (!ok)\n    {\n        cleanse(ct);\n        cleanse(tag);\n    }\n\n    EVP_CIPHER_CTX_free(ctx);\n    return ok;\n}\n\nbool PasswordCipher::aes_gcm_decrypt(const QByteArray& key,\n                                     const QByteArray& iv,\n                                     const QByteArray& ct,\n                                     const QByteArray& tag,\n                                     QByteArray& pt)\n{\n    FCT_IDENTIFICATION;\n\n    EVP_CIPHER_CTX* ctx = EVP_CIPHER_CTX_new();\n    if ( !ctx )\n    {\n        logOpensslError(\"EVP_CIPHER_CTX_new\");\n        return false;\n    }\n\n    bool ok = false;\n    do {\n        if (EVP_DecryptInit_ex(ctx, EVP_aes_256_gcm(), nullptr, nullptr, nullptr) != 1)\n        {\n            logOpensslError(\"DecryptInit\");\n            break;\n        }\n\n        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv.size(), nullptr) != 1)\n        {\n            logOpensslError(\"SET_IVLEN\");\n            break;\n        }\n\n        if (EVP_DecryptInit_ex(ctx, nullptr, nullptr,\n                               reinterpret_cast<const unsigned char*>(key.constData()),\n                               reinterpret_cast<const unsigned char*>(iv.constData())) != 1)\n        {\n            logOpensslError(\"DecryptInit key/iv\");\n            break;\n        }\n\n        pt.resize(ct.size());\n        int outl = 0, total = 0;\n        if (EVP_DecryptUpdate(ctx,\n                              reinterpret_cast<unsigned char*>(pt.data()), &outl,\n                              reinterpret_cast<const unsigned char*>(ct.constData()), ct.size()) != 1)\n        {\n            logOpensslError(\"DecryptUpdate\");\n            break;\n        }\n\n        total += outl;\n\n        if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag.size(), const_cast<char*>(tag.constData())) != 1)\n        {\n            logOpensslError(\"SET_TAG\");\n            break;\n        }\n\n        int finok = EVP_DecryptFinal_ex(ctx,\n                                        reinterpret_cast<unsigned char*>(pt.data()) + total, &outl);\n        if (finok != 1)\n        {\n            // Auth failed or wrong key/passphrase/iv/tag\n            pt.clear();\n            logOpensslError(\"DecryptFinal (auth fail)\");\n            break;\n        }\n        total += outl; pt.resize(total);\n        ok = true;\n    } while(false);\n\n    EVP_CIPHER_CTX_free(ctx);\n    return ok;\n}\n\nbool PasswordCipher::encrypt(const QString& passphrase,\n                             const QByteArray& plaintext,\n                             QByteArray& outBase64)\n{\n    FCT_IDENTIFICATION;\n\n    outBase64.clear();\n\n    if ( plaintext.isEmpty() ) return false;\n\n    QByteArray pass = toUtf8Norm(passphrase);\n    QByteArray salt(kSaltLen, 0);\n\n    if (!randFill(salt))\n    {\n        logOpensslError(\"RAND salt\");\n        return false;\n    }\n\n    QByteArray key;\n\n    if ( !kdf_pbkdf2_sha256(pass, salt, kPBKDF2Iters, key))\n    {\n        cleanse(pass);\n        return false;\n    }\n\n    QByteArray iv(kIVLen, 0);\n\n    if (!randFill(iv))\n    {\n        logOpensslError(\"RAND iv\");\n        cleanse(key);\n        cleanse(pass);\n        return false;\n    }\n\n    QByteArray ct, tag;\n\n    if (!aes_gcm_encrypt(key, iv, plaintext, ct, tag))\n    {\n        cleanse(key);\n        cleanse(pass);\n        return false;\n    }\n\n    cleanse(pass);\n\n    // Build blob\n    QByteArray blob;\n    blob.reserve(4+1+1+1+1+1+1+1+4 + salt.size() + iv.size() + ct.size() + tag.size());\n    QDataStream ds(&blob, QIODevice::WriteOnly);\n    ds.setByteOrder(QDataStream::BigEndian);\n\n    ds.writeRawData(kMagic, 4);\n    ds << kVersion;\n    ds << kKdfPBKDF2;\n    ds << kAeadAES256GCM;\n    ds << static_cast<quint8>(salt.size());\n    ds << static_cast<quint8>(iv.size());\n    ds << static_cast<quint8>(tag.size());\n    ds << static_cast<quint8>(0); // reserved\n    ds << static_cast<quint32>(kPBKDF2Iters);\n    ds.writeRawData(salt.constData(), salt.size());\n    ds.writeRawData(iv.constData(), iv.size());\n    ds.writeRawData(ct.constData(), ct.size());\n    ds.writeRawData(tag.constData(), tag.size());\n\n    outBase64 = blob.toBase64();\n\n    cleanse(key);\n    return true;\n}\n\nbool PasswordCipher::decrypt(const QString& passphrase,\n                             const QByteArray& inBase64,\n                             QByteArray& plaintext)\n{\n    FCT_IDENTIFICATION;\n\n    plaintext.clear();\n    QByteArray blob = QByteArray::fromBase64(inBase64);\n    if (blob.size() < (int)(4+1+1+1+1+1+1+1+4)) return false;\n\n    QDataStream ds(blob);\n    ds.setByteOrder(QDataStream::BigEndian);\n\n    char mg[4];\n    if (ds.readRawData(mg, 4) != 4) return false;\n    if (memcmp(mg, kMagic, 4) != 0) return false;\n\n    quint8 ver=0, kdf=0, aead=0, slen=0, ivlen=0, tlen=0, rsvd=0;\n    quint32 iters=0;\n    ds >> ver >> kdf >> aead >> slen >> ivlen >> tlen >> rsvd >> iters;\n\n    if (ds.status()!=QDataStream::Ok) return false;\n    if (ver != kVersion || kdf != kKdfPBKDF2 || aead != kAeadAES256GCM) return false;\n    if (slen==0 || ivlen==0 || tlen==0) return false;\n    if (iters < 10000) return false; // sanity\n\n    QByteArray salt(slen, 0), iv(ivlen, 0);\n    if (ds.readRawData(salt.data(), slen) != slen) return false;\n    if (ds.readRawData(iv.data(), ivlen) != ivlen) return false;\n\n    // Remaining = ct + tag\n    int remain = blob.size() - (4+1+1+1+1+1+1+1+4 + slen + ivlen);\n    if (remain <= tlen) return false;\n    int ctlen = remain - tlen;\n\n    QByteArray ct(ctlen, 0), tag(tlen, 0);\n    if (ds.readRawData(ct.data(), ctlen) != ctlen) return false;\n    if (ds.readRawData(tag.data(), tlen) != tlen) return false;\n\n    QByteArray pass = toUtf8Norm(passphrase);\n    QByteArray key;\n    if (!kdf_pbkdf2_sha256(pass, salt, static_cast<int>(iters), key)) { cleanse(pass); return false; }\n\n    bool ok = aes_gcm_decrypt(key, iv, ct, tag, plaintext);\n\n    cleanse(key);\n    cleanse(pass);\n    if (!ok) plaintext.clear();\n    return ok;\n}\n"
  },
  {
    "path": "core/PasswordCipher.h",
    "content": "#ifndef PASSWORDCIPHER_H\n#define PASSWORDCIPHER_H\n\n#include <QtCore/QByteArray>\n#include <QtCore/QString>\n\n/*\n  Blob layout (all big-endian where applicable):\n    magic:  \"PMGR\"        (4 bytes)\n    ver:    0x01          (1)\n    kdf:    0x01          (1)  // 1=PBKDF2-SHA256\n    aead:   0x01          (1)  // 1=AES-256-GCM\n    slen:   0x10          (1)  // salt len (16)\n    ivlen:  0x0C          (1)  // iv len  (12)\n    tlen:   0x10          (1)  // tag len (16)\n    rsvd:   0x00          (1)\n    iters:  uint32_be     (4)  // PBKDF2 iterations\n    salt:   slen bytes\n    iv:     ivlen bytes\n    ct:     N bytes\n    tag:    tlen bytes\n*/\n\nclass PasswordCipher\n{\npublic:\n\n  static const int kSaltLen  = 16;\n  static const int kIVLen    = 12;  // GCM standard\n  static const int kTagLen   = 16;\n  static const int kKeyLen   = 32;  // AES-256\n  static const int kPBKDF2Iters = 300000;\n\n  static bool encrypt(const QString& passphrase,\n                      const QByteArray& plaintext,\n                      QByteArray& outBase64);\n\n  static bool decrypt(const QString& passphrase,\n                      const QByteArray& inBase64,\n                      QByteArray& plaintext);\n\nprivate:\n  static bool kdf_pbkdf2_sha256(const QByteArray& passUtf8,\n                                const QByteArray& salt,\n                                int iters,\n                                QByteArray& outKey32);\n\n  static bool aes_gcm_encrypt(const QByteArray& key,\n                              const QByteArray& iv,\n                              const QByteArray& pt,\n                              QByteArray& ct,\n                              QByteArray& tag);\n\n  static bool aes_gcm_decrypt(const QByteArray& key,\n                              const QByteArray& iv,\n                              const QByteArray& ct,\n                              const QByteArray& tag,\n                              QByteArray& pt);\n\n  static void cleanse(QByteArray& buf);\n};\n\n#endif // PASSWORDCIPHER_H\n"
  },
  {
    "path": "core/PlatformParameterManager.cpp",
    "content": "#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QJsonDocument>\n#include <QJsonArray>\n#include <QJsonObject>\n#include <QFile>\n\n#include \"PlatformParameterManager.h\"\n#include \"core/LogParam.h\"\n#include \"core/LogDatabase.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.platformparametermanager\");\n\nQList<PlatformParameterManager::KnownParamDef> PlatformParameterManager::knownParameters()\n{\n    FCT_IDENTIFICATION;\n\n    // List of known platform-dependent parameters.\n    // These are the parameters that are stored by LogParam class\n\n    return\n    {\n        { \"services/lotw/callbook/tqsl\", QObject::tr(\"TQSL Path\"), true }\n    };\n}\n\nQList<PlatformParameter> PlatformParameterManager::getParameters(const QString &importDbPath,\n                                                                 const QString &sourcePlatform)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << importDbPath << sourcePlatform;\n\n    QList<PlatformParameter> result;\n\n    const QString currentPlatform = LogDatabase::currentPlatformId();\n    const bool platformDiffers = (sourcePlatform != currentPlatform);\n    const bool targetIsFlatpak = (currentPlatform == LogDatabase::PLATFORM_LINUXFLATPAK);\n    const bool sourceIsFlatpak = (sourcePlatform == LogDatabase::PLATFORM_LINUXFLATPAK);\n\n    qCDebug(runtime) << \"Source platform:\" << sourcePlatform\n                     << \"Current platform:\" << currentPlatform\n                     << \"Differs:\" << platformDiffers;\n\n    // Open the imported database\n    const QString connectionName = QStringLiteral(\"PlatformParamImport\");\n\n    {\n        QSqlDatabase importDb = QSqlDatabase::addDatabase(\"QSQLITE\", connectionName);\n        importDb.setDatabaseName(importDbPath);\n\n        if ( !importDb.open() )\n        {\n            qWarning() << \"Cannot open import database:\" << importDb.lastError().text();\n            QSqlDatabase::removeDatabase(connectionName);\n            return result;\n        }\n\n        // params defined in LogParam\n        const QList<PlatformParameterManager::KnownParamDef> known = knownParameters();\n\n        for ( const PlatformParameterManager::KnownParamDef &param : known )\n        {\n            // - If target is Flatpak: skip (path is fixed, e.g. /app/bin/tqsl)\n            if ( param.isExecutablePath && targetIsFlatpak )\n            {\n                qCDebug(runtime) << \"Skipping\" << param.key << \"- target is Flatpak (fixed path)\";\n                continue;\n            }\n\n            PlatformParameter p;\n            p.key = param.key;\n            p.displayName = param.displayName;\n            p.requiresChange = platformDiffers;\n            p.newValue = QString();\n\n            // Read the value from the imported database\n            // do not use LogParam function here because the class gets value from the main DB.\n            QSqlQuery query(importDb);\n            if ( query.prepare(\"SELECT value FROM log_param WHERE name = :name\") )\n            {\n                query.bindValue(\":name\", p.key);\n                if ( query.exec() && query.first() )\n                {\n                    // For executable paths from Flatpak source: path is not useful\n                    if ( param.isExecutablePath && sourceIsFlatpak )\n                        p.currentValue = QObject::tr(\"(Flatpak internal path)\");\n                    else\n                        p.currentValue = query.value(0).toString();\n                }\n            }\n\n            result.append(p);\n        }\n\n        importDb.close();\n    }\n\n    QSqlDatabase::removeDatabase(connectionName);\n\n    return result;\n}\n\nvoid PlatformParameterManager::applyParameters(const QList<PlatformParameter> &params)\n{\n    FCT_IDENTIFICATION;\n\n    for ( const PlatformParameter &p : params )\n    {\n        // Only apply if user provided a new value\n        if ( !p.newValue.isEmpty() )\n        {\n            qCDebug(runtime) << \"Applying parameter:\" << p.key << \"=\" << p.newValue;\n\n            // Use LogParam to set the value in the current database\n            // This method is called when the imported DB becomes the default DB.\n            // Therefore, we can use the LogParam class.\n            if ( LogParam::isLoTWTQSLPathKey(p.key) ) LogParam::setLoTWTQSLPath(p.newValue);\n            // Add more parameter handlers here as needed\n        }\n    }\n}\n\nvoid PlatformParameterManager::applyFlatpakFixedPaths()\n{\n    FCT_IDENTIFICATION;\n\n    const QString currentPlatform = LogDatabase::currentPlatformId();\n\n    if ( currentPlatform != LogDatabase::PLATFORM_LINUXFLATPAK )\n    {\n        qCDebug(runtime) << \"Not Flatpak target, skipping fixed paths\";\n        return;\n    }\n\n    qCDebug(runtime) << \"Applying Flatpak fixed paths\";\n\n    // Set TQSL path to fixed Flatpak location - empty is OK because flatpak has built-in value.\n    LogParam::setLoTWTQSLPath(\"\");\n\n    // Clear rigctld_path in all rig profiles (empty = autodetect will find /app/bin/rigctld)\n    QSqlQuery query;\n    if ( query.exec(\"UPDATE rig_profiles SET rigctld_path = NULL\") )\n        qCDebug(runtime) << \"Cleared rigctld_path in all rig profiles\";\n    else\n        qWarning() << \"Failed to clear rigctld_path:\" << query.lastError().text();\n}\n\nQString PlatformParameterManager::pendingParametersPath()\n{\n    return LogDatabase::dbDirectory().filePath(\"qlog.db.pending.params\");\n}\n\nQList<ProfileParameter> PlatformParameterManager::getProfileParameters(const QString &importDbPath,\n                                                                       const QString &sourcePlatform)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << importDbPath << sourcePlatform;\n\n    QList<ProfileParameter> result;\n\n    const QString currentPlatform = LogDatabase::currentPlatformId();\n    const bool targetIsFlatpak = (currentPlatform == LogDatabase::PLATFORM_LINUXFLATPAK);\n    const bool sourceIsFlatpak = (sourcePlatform == LogDatabase::PLATFORM_LINUXFLATPAK);\n    const QString connectionName = QStringLiteral(\"ProfilePortParamImport\");\n\n    {\n        QSqlDatabase importDb = QSqlDatabase::addDatabase(\"QSQLITE\", connectionName);\n        importDb.setDatabaseName(importDbPath);\n\n        if ( !importDb.open() )\n        {\n            qWarning() << \"Cannot open import database:\" << importDb.lastError().text();\n            QSqlDatabase::removeDatabase(connectionName);\n            return result;\n        }\n\n        // Define profile tables and their port columns\n        struct ProfileDef\n        {\n            QString tableName;\n            QString columnName;\n            QString displayPrefix;\n            bool isExecutablePath;  // true for paths to executables (like rigctld_path)\n        };\n\n        QList<ProfileDef> profileDefs =\n        {\n            { \"rig_profiles\",   \"port_pathname\",     QObject::tr(\"Rig\"),         false },\n            { \"rig_profiles\",   \"ptt_port_pathname\", QObject::tr(\"Rig PTT\"),     false },\n            { \"rig_profiles\",   \"rigctld_path\",      QObject::tr(\"Rig rigctld\"), true },\n            { \"rot_profiles\",   \"port_pathname\",     QObject::tr(\"Rotator\"),     false },\n            { \"cwkey_profiles\", \"port_pathname\",     QObject::tr(\"CW Keyer\"),    false }\n        };\n\n        for ( const ProfileDef &def : profileDefs )\n        {\n            if ( def.isExecutablePath && targetIsFlatpak )\n            {\n                qCDebug(runtime) << \"Skipping\" << def.columnName << \"- target is Flatpak (fixed path)\";\n                continue;\n            }\n\n            QSqlQuery query(importDb);\n            QString sql = QString(\"SELECT profile_name, %1 FROM %2 WHERE %1 IS NOT NULL AND %1 != ''\")\n                              .arg(def.columnName, def.tableName);\n\n            if ( !query.exec(sql) )\n            {\n                qCDebug(runtime) << \"Query failed for\" << def.tableName << \":\" << query.lastError().text();\n                continue;\n            }\n\n            while ( query.next() )\n            {\n                ProfileParameter p;\n                p.tableName = def.tableName;\n                p.profileName = query.value(0).toString();\n                p.columnName = def.columnName;\n                p.displayName = QString(\"%1: %2\").arg(def.displayPrefix, p.profileName);\n                p.newValue = QString();\n                p.isExecutablePath = def.isExecutablePath;\n\n                if ( def.isExecutablePath && sourceIsFlatpak )\n                    p.currentValue = QObject::tr(\"(Flatpak internal path)\");\n                else\n                    p.currentValue = query.value(1).toString();\n\n                result.append(p);\n            }\n        }\n\n        importDb.close();\n    }\n\n    QSqlDatabase::removeDatabase(connectionName);\n\n    qCDebug(runtime) << \"Found\" << result.size() << \"profile port parameters\";\n    return result;\n}\n\nvoid PlatformParameterManager::applyProfileParameters(const QList<ProfileParameter> &params)\n{\n    FCT_IDENTIFICATION;\n\n    for ( const ProfileParameter &p : params )\n    {\n        if ( p.newValue.isEmpty() )\n            continue;\n\n        qCDebug(runtime) << \"Applying profile port parameter:\" << p.tableName\n                         << p.profileName << p.columnName << \"=\" << p.newValue;\n\n        QSqlQuery query;\n        QString sql = QString(\"UPDATE %1 SET %2 = :value WHERE profile_name = :profile\")\n                          .arg(p.tableName, p.columnName);\n\n        if ( !query.prepare(sql) )\n        {\n            qWarning() << \"Cannot prepare update query:\" << query.lastError().text();\n            continue;\n        }\n\n        query.bindValue(\":value\", p.newValue);\n        query.bindValue(\":profile\", p.profileName);\n\n        if ( !query.exec() )\n            qWarning() << \"Cannot update profile port:\" << query.lastError().text();\n    }\n}\n\nbool PlatformParameterManager::saveParametersToFile(const QList<PlatformParameter> &params,\n                                                     const QList<ProfileParameter> &profileParams,\n                                                     const QString &filePath)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filePath;\n\n    QJsonObject root;\n\n    // Save log_param parameters\n    QJsonArray paramArray;\n    for ( const PlatformParameter &p : params )\n    {\n        if ( !p.newValue.isEmpty() )\n        {\n            QJsonObject obj;\n            obj[\"key\"] = p.key;\n            obj[\"newValue\"] = p.newValue;\n            paramArray.append(obj);\n        }\n    }\n    root[\"parameters\"] = paramArray;\n\n    // Save profile port parameters\n    QJsonArray profileArray;\n    for ( const ProfileParameter &p : profileParams )\n    {\n        if ( !p.newValue.isEmpty() )\n        {\n            QJsonObject obj;\n            obj[\"tableName\"] = p.tableName;\n            obj[\"profileName\"] = p.profileName;\n            obj[\"columnName\"] = p.columnName;\n            obj[\"newValue\"] = p.newValue;\n            obj[\"isExec\"] = p.isExecutablePath;\n            profileArray.append(obj);\n        }\n    }\n    root[\"profilePorts\"] = profileArray;\n\n    if ( paramArray.isEmpty() && profileArray.isEmpty() )\n    {\n        qCDebug(runtime) << \"No parameters to save\";\n        return true;\n    }\n\n    QJsonDocument doc(root);\n    QFile file(filePath);\n\n    if ( !file.open(QIODevice::WriteOnly) )\n    {\n        qWarning() << \"Cannot open file for writing:\" << filePath;\n        return false;\n    }\n\n    file.write(doc.toJson(QJsonDocument::Compact));\n    file.close();\n\n    qCDebug(runtime) << \"Saved\" << paramArray.size() << \"params and\"\n                     << profileArray.size() << \"profile ports to\" << filePath;\n    return true;\n}\n\nQList<PlatformParameter> PlatformParameterManager::loadParametersFromFile(const QString &filePath)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filePath;\n\n    QList<PlatformParameter> result;\n\n    QFile file(filePath);\n    if ( !file.exists() )\n    {\n        qCDebug(runtime) << \"No parameters file found\";\n        return result;\n    }\n\n    if ( !file.open(QIODevice::ReadOnly) )\n    {\n        qWarning() << \"Cannot open parameters file:\" << filePath;\n        return result;\n    }\n\n    QByteArray data = file.readAll();\n    file.close();\n\n    QJsonParseError error;\n    const QJsonDocument doc = QJsonDocument::fromJson(data, &error);\n\n    if ( error.error != QJsonParseError::NoError )\n    {\n        qWarning() << \"JSON parse error:\" << error.errorString();\n        return result;\n    }\n\n    const QJsonObject root = doc.object();\n    const QJsonArray array = root[\"parameters\"].toArray();\n\n    for ( const QJsonValue &val : array )\n    {\n        QJsonObject obj = val.toObject();\n        PlatformParameter p;\n        p.key = obj[\"key\"].toString();\n        p.newValue = obj[\"newValue\"].toString();\n        p.requiresChange = false;\n        result.append(p);\n    }\n\n    qCDebug(runtime) << \"Loaded\" << result.size() << \"parameters from\" << filePath;\n    return result;\n}\n\nQList<ProfileParameter> PlatformParameterManager::loadProfileParametersFromFile(const QString &filePath)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filePath;\n\n    QList<ProfileParameter> result;\n\n    QFile file(filePath);\n    if ( !file.exists() )\n    {\n        qCDebug(runtime) << \"No parameters file found\";\n        return result;\n    }\n\n    if ( !file.open(QIODevice::ReadOnly) )\n    {\n        qWarning() << \"Cannot open parameters file:\" << filePath;\n        return result;\n    }\n\n    QByteArray data = file.readAll();\n    file.close();\n\n    QJsonParseError error;\n    const QJsonDocument doc = QJsonDocument::fromJson(data, &error);\n\n    if ( error.error != QJsonParseError::NoError )\n    {\n        qWarning() << \"JSON parse error:\" << error.errorString();\n        return result;\n    }\n\n    const QJsonObject root = doc.object();\n    const QJsonArray array = root[\"profilePorts\"].toArray();\n\n    for ( const QJsonValue &val : array )\n    {\n        QJsonObject obj = val.toObject();\n        ProfileParameter p;\n        p.tableName = obj[\"tableName\"].toString();\n        p.profileName = obj[\"profileName\"].toString();\n        p.columnName = obj[\"columnName\"].toString();\n        p.newValue = obj[\"newValue\"].toString();\n        p.isExecutablePath = obj[\"isExec\"].toBool();\n        result.append(p);\n    }\n\n    qCDebug(runtime) << \"Loaded\" << result.size() << \"profile port parameters from\" << filePath;\n    return result;\n}\n"
  },
  {
    "path": "core/PlatformParameterManager.h",
    "content": "#ifndef QLOG_CORE_PLATFORMPARAMETERMANAGER_H\n#define QLOG_CORE_PLATFORMPARAMETERMANAGER_H\n\n#include <QString>\n#include <QList>\n#include <QPair>\n\nstruct PlatformParameter\n{\n    QString key;           // LogParam key (e.g. \"services/lotw/callbook/tqsl\")\n    QString displayName;   // Human-readable name (e.g. \"TQSL Path\")\n    QString currentValue;  // Value from imported DB\n    QString newValue;      // User-provided value for current platform\n    bool requiresChange;   // true if platform differs\n};\n\n// Structure for profile-based port paths (rig, rotator, cwkey)\nstruct ProfileParameter\n{\n    QString tableName;     // e.g. \"rig_profiles\"\n    QString profileName;   // e.g. \"My Rig\"\n    QString columnName;    // e.g. \"port_pathname\"\n    QString displayName;   // e.g. \"Rig: My Rig - Serial Port\"\n    QString currentValue;  // Value from imported DB\n    QString newValue;      // User-provided value for current platform\n    bool isExecutablePath; // is exec - browse should be displayer\n};\n\nclass PlatformParameterManager\n{\npublic:\n    // Get list of platform-dependent parameters from imported DB\n    // importDbPath: path to the imported database file\n    // sourcePlatform: platform from which the DB was exported\n    // Returns list of parameters that may need adjustment\n    static QList<PlatformParameter> getParameters(const QString &importDbPath,\n                                                  const QString &sourcePlatform);\n\n    // Apply user-provided values to the current database\n    // params: list of parameters with newValue set by user\n    static void applyParameters(const QList<PlatformParameter> &params);\n\n    // Apply fixed paths for Flatpak target (called during import)\n    // Sets TQSL path to /app/bin/tqsl and clears rigctld_path in all profiles\n    static void applyFlatpakFixedPaths();\n\n    // Get list of profile port parameters from imported DB\n    // sourcePlatform: platform from which the DB was exported\n    static QList<ProfileParameter> getProfileParameters(const QString &importDbPath,\n                                                                 const QString &sourcePlatform);\n\n    // Apply profile port parameters to the current database\n    static void applyProfileParameters(const QList<ProfileParameter> &params);\n\n    // Save parameters to a JSON file for later application after restart\n    static bool saveParametersToFile(const QList<PlatformParameter> &params,\n                                     const QList<ProfileParameter> &profileParams,\n                                     const QString &filePath);\n\n    // Load parameters from JSON file\n    static QList<PlatformParameter> loadParametersFromFile(const QString &filePath);\n\n    // Load profile port parameters from JSON file\n    static QList<ProfileParameter> loadProfileParametersFromFile(const QString &filePath);\n\n    // Get path to pending parameters file\n    static QString pendingParametersPath();\n\nprivate:\n    // Structure for known platform-dependent parameters\n    struct KnownParamDef\n    {\n        QString key;            // LogParam key\n        QString displayName;    // Human-readable name\n        bool isExecutablePath;  // true for paths to executables\n    };\n\n    // Template list of known platform-dependent parameters\n    static QList<KnownParamDef> knownParameters();\n};\n\n#endif // QLOG_CORE_PLATFORMPARAMETERMANAGER_H\n"
  },
  {
    "path": "core/PotaQE.cpp",
    "content": "#include <QJsonParseError>\n#include <QJsonArray>\n#include <QtNumeric>\n\n#include \"core/debug.h\"\n#include \"PotaQE.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.potaqe\");\n\nPotaQE::PotaQE(QObject *parent)\n    : QObject{parent}\n{\n    FCT_IDENTIFICATION;\n\n    refreshTimer.setInterval(REFRESHPERIOD);\n\n    spotUpdater.moveToThread(&spotUpdaterThread);\n\n    connect(&spotUpdaterThread, &QThread::started, &spotUpdater, &PotaAppActivatorDownloader::updateActivators);\n    connect(&spotUpdaterThread, &QThread::started, &refreshTimer, QOverload<>::of(&QTimer::start));\n    connect(&spotUpdaterThread, &QThread::finished, &spotUpdater, &QObject::deleteLater);\n\n    connect(&spotUpdater, &PotaAppActivatorDownloader::activatorsUpdated, this, &PotaQE::updateSpot);\n\n    connect(&refreshTimer, &QTimer::timeout, &spotUpdater, &PotaAppActivatorDownloader::updateActivators);\n\n    spotUpdaterThread.start();\n}\n\nPotaQE::~PotaQE()\n{\n    FCT_IDENTIFICATION;\n\n    if ( spotUpdaterThread.isRunning() )\n    {\n        spotUpdaterThread.quit();\n        spotUpdaterThread.wait();\n    }\n}\n\n// find park reference by callsign + freq +-5 kHz + mode.\n// Matching:\n//    callsign ignores prefixes and suffixes (/P,/M,/QRP,...) (Based Callsign is used)\n//    freq +- 5KHz\nconst POTASpot PotaQE::findReferenceId(const Callsign &callsign, double freq)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &baseCallsign = callsign.getBase();\n\n    if ( !callsign.isValid() || baseCallsign.isEmpty() ) return POTASpot();\n\n    QMutexLocker locker(&activatorLock);\n\n    auto i = activatorSpots.constFind(baseCallsign);\n\n    while ( i != activatorSpots.cend() && i.key() == baseCallsign )\n    {\n        const POTASpot &spot = i.value();\n        if ( qAbs(spot.frequency - freq) <= FREQTOL ) return spot;\n        i++;\n    }\n\n    return POTASpot();\n}\n\nvoid PotaQE::updateSpot()\n{\n    FCT_IDENTIFICATION;\n\n    QMutexLocker locker(&activatorLock);\n    spotUpdater.swapActivators(activatorSpots);\n}\n"
  },
  {
    "path": "core/PotaQE.h",
    "content": "#ifndef QLOG_CORE_POTAQE_H\n#define QLOG_CORE_POTAQE_H\n\n#include <QObject>\n#include <QTimer>\n#include <QThread>\n\n#include \"data/Callsign.h\"\n#include \"service/potaapp/PotaApp.h\"\n\nclass PotaQE : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static PotaQE *instance()\n    {\n        static PotaQE instance;\n        return &instance;\n    };\n\n    const POTASpot findReferenceId(const Callsign &callsign, double freq);\n\nprivate slots:\n    void updateSpot();\n\nprivate:\n    QThread spotUpdaterThread;\n    PotaAppActivatorDownloader spotUpdater;\n    QTimer refreshTimer;\n    QMutex activatorLock;\n\n    const double FREQTOL = 0.005; // in MHz\n    const int REFRESHPERIOD = 60 * 1000;\n    PotaAppActivatorDownloader::ActivatorStorage activatorSpots;\n\n    explicit PotaQE(QObject *parent = nullptr);\n    ~PotaQE();\n};\n\n#endif // QLOG_CORE_POTAQE_H\n"
  },
  {
    "path": "core/PropConditions.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QTimer>\n#include <QStandardPaths>\n#include <QDir>\n#include <QJsonDocument>\n#include <QJsonObject>\n#include <QJsonArray>\n#include <QDomDocument>\n#include \"PropConditions.h\"\n#include \"debug.h\"\n#include \"data/Data.h\"\n\n//#define FLUX_URL \"https://services.swpc.noaa.gov/products/summary/10cm-flux.json\"\n#define K_INDEX_URL \"https://www.hamqsl.com/solarxml.php\"\n#define SOLAR_SUMMARY_IMG \"https://www.hamqsl.com/solar101vhf.php\"\n#define AURORA_MAP \"https://services.swpc.noaa.gov/json/ovation_aurora_latest.json\"\n#define MUF_POINTS \"https://prop.kc2g.com/api/stations.json?maxage=2700\"\n#define DXC_TRENDS \"https://api.ure.es/v2/heatmap\"\n\n// the resend mechanism was implemented only because of a issue with prop.kc2g.com\n// This site has IPv4 and IPv6 DNS record, and if the notebook is IPv4 only, QT uses an IPv6\n// address for the first attempt and an IPv4 address for the second attempt.\n// This resulted in a long interval before information was obtained from this server.\n// Resend mechanism accelerates all this.\n#define RESEND_ATTEMPTS 3\n//intervals are defined in seconds\n#define RESEND_BASE_INTERVAL 5\n#define BASE_UPDATE_INTERVAL (15 * 60)\n\n// in seconds\n#define DXTRENDS_UPDATE_INTERVAL (5 * 60)\n// in seconds\n#define DXTRENDS_TIMEOUT 60\n\nMODULE_IDENTIFICATION(\"qlog.core.conditions\");\n\nPropConditions::PropConditions(QObject *parent) : QObject(parent),\n    agentString(QString(\"QLog/%1\").arg(VERSION).toUtf8())\n{\n    FCT_IDENTIFICATION;\n\n    nam = new QNetworkAccessManager(this);\n    connect(nam, &QNetworkAccessManager::finished, this, &PropConditions::processReply);\n\n    QTimer *timer = new QTimer(this);\n    connect(timer, &QTimer::timeout, this, &PropConditions::update);\n    update();\n    timer->start(BASE_UPDATE_INTERVAL * 1000);\n\n    QTimer *timerTrends = new QTimer(this);\n    connect(timerTrends, &QTimer::timeout, this, &PropConditions::updateDxTrends);\n    updateDxTrends();\n    timerTrends->start(DXTRENDS_UPDATE_INTERVAL * 1000);\n\n    connect(&dxTrendTimeoutTimer, &QTimer::timeout, this, &PropConditions::dxTrendTimeout);\n\n}\n\nvoid PropConditions::update()\n{\n    FCT_IDENTIFICATION;\n\n    nam->get(prepareRequest(QUrl(SOLAR_SUMMARY_IMG)));\n    nam->get(prepareRequest(QUrl(K_INDEX_URL)));\n    nam->get(prepareRequest(QUrl(AURORA_MAP)));\n    nam->get(prepareRequest(QUrl(MUF_POINTS)));\n}\n\nvoid PropConditions::updateDxTrends()\n{\n    FCT_IDENTIFICATION;\n\n    dxTrendResult.clear();\n    dxTrendTimeoutTimer.stop();\n    dxTrendPendingConnections.clear(); // pending connections will be ignored.\n\n    for ( const QString& continent : Data::getContinentList() )\n        dxTrendPendingConnections << nam->get(prepareRequest(QUrl(DXC_TRENDS + QString(\"/%0/15\").arg(continent))));\n\n    dxTrendTimeoutTimer.start(DXTRENDS_TIMEOUT * 1000);\n}\n\nvoid PropConditions::processReply(QNetworkReply* reply)\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray data = reply->readAll();\n\n    qCDebug(runtime) << data;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    qCDebug(runtime) << reply->error()\n                     << reply->attribute(QNetworkRequest::HttpStatusCodeAttribute)\n                     << reply->url();\n\n    if ( reply->error() == QNetworkReply::NoError\n         && replyStatusCode >= 200 && replyStatusCode < 300 )\n    {\n        failedRequests[reply->url()] = 0;\n\n        const QUrl &replyURL = reply->url();\n        if (replyURL == QUrl(SOLAR_SUMMARY_IMG))\n        {\n            QFile file(solarSummaryFile());\n\n            if ( file.open(QIODevice::WriteOnly))\n            {\n                file.write(data);\n                file.flush();\n                file.close();\n            }\n        }\n        else if (replyURL == QUrl(K_INDEX_URL))\n        {\n            QDomDocument doc;\n\n            if ( !doc.setContent(data) )\n            {\n                qWarning() << \"Cannot parse response from \" << K_INDEX_URL;\n                return;\n            }\n\n            QDomNodeList solarData = doc.elementsByTagName(\"solardata\");\n            QDomNode n = solarData.item(0);\n\n            if ( n.isNull() )\n            {\n                qWarning() << \"Cannot find solardata in \" << K_INDEX_URL;\n                return;\n            }\n\n            QDomElement aindex = n.firstChildElement(\"aindex\");\n            QDomElement kindex = n.firstChildElement(\"kindex\");\n            QDomElement solarflux = n.firstChildElement(\"solarflux\");\n\n            if ( !aindex.isNull() )\n            {\n                a_index = aindex.text().toInt();\n                qCDebug(runtime) << \"A-Index: \" << a_index;\n                a_index_last_update = QDateTime::currentDateTime();\n                emit AIndexUpdated();\n            }\n\n            if ( !kindex.isNull() )\n            {\n                k_index = kindex.text().toDouble();\n                qCDebug(runtime) << \"K-Index: \" << k_index;\n                k_index_last_update = QDateTime::currentDateTime();\n                emit KIndexUpdated();\n            }\n\n            if ( !solarflux.isNull() )\n            {\n                flux = solarflux.text().toInt();\n                qCDebug(runtime) << \"Flux: \" << flux;\n                flux_last_update = QDateTime::currentDateTime();\n                emit fluxUpdated();\n            }\n        }\n        else if (replyURL == QUrl(AURORA_MAP))\n        {\n            auroraMap.clear();\n\n            QJsonDocument doc = QJsonDocument::fromJson(data);\n            if ( ! doc.isNull() )\n            {\n                double skipElement = 0.0;\n\n                qCDebug(runtime) << \"Aurora forecast Time:\" << doc[\"Forecast Time\"].toString();\n                const QJsonArray &jsonArray = doc[\"coordinates\"].toArray();\n                for (const QJsonValue &value : jsonArray)\n                {\n                    QJsonArray obj = value.toArray();\n                    if ( obj.size() == 3 )\n                    {\n                        double longitute = obj[0].toDouble();\n                        double latitude = obj[1].toDouble();\n                        double prob = obj[2].toDouble();\n                        auroraMap.addPoint(longitute, latitude, prob, &skipElement);\n                    }\n                }\n                auroraMap_last_update = QDateTime::currentDateTime();\n                emit auroraMapUpdated();\n            }\n        }\n        else if (replyURL == QUrl(MUF_POINTS))\n        {\n            mufMap.clear();\n\n            QJsonDocument doc = QJsonDocument::fromJson(data);\n\n            if ( ! doc.isNull() )\n            {\n                double skipElement = 0.0;\n\n                const QJsonArray &jsonArray = doc.array();\n                for (const QJsonValue &value : jsonArray)\n                {\n                    QJsonObject obj = value.toObject();\n                    QJsonObject station = obj[\"station\"].toObject();\n                    double longitute = station[\"longitude\"].toString().toDouble();\n                    double latitude = station[\"latitude\"].toString().toDouble();\n                    double muf = obj[\"mufd\"].toDouble();\n                    mufMap.addPoint(longitute, latitude, muf, &skipElement);\n                }\n                mufMap_last_update = QDateTime::currentDateTime();\n                emit mufMapUpdated();\n            }\n        }\n        else if ( dxTrendPendingConnections.contains(reply) )\n        {\n            dxTrendPendingConnections.remove(reply);\n\n            QJsonDocument doc = QJsonDocument::fromJson(data);\n            const QString &requestContinent = replyURL.path().section('/', -2, -2);\n\n            if ( ! doc.isNull() )\n            {\n                QJsonObject jsonObject = doc.object();\n                for ( auto continentIt = jsonObject.begin(); continentIt != jsonObject.end(); ++continentIt )\n                {\n                    const QString &toContinent = continentIt.key();  // \"AF\", \"AS\", \"EU\"....\n                    const QJsonObject &values = continentIt->toObject();\n\n                    for ( auto valueIt = values.begin(); valueIt != values.end(); ++valueIt )\n                    {\n                        const QString &band = valueIt.key() + \"m\";  // \"10\", \"12\", \"15\" ...\n                        int spotCount = valueIt->toString().toInt();  // Number of Spots\n                        dxTrendResult[requestContinent][toContinent][band] = spotCount;\n                    }\n                }\n            }\n\n            if ( dxTrendPendingConnections.isEmpty() )\n            {\n                dxTrendTimeoutTimer.stop();\n                qCDebug(runtime) << \"DXTrend finalized\";\n                emit dxTrendFinalized(dxTrendResult);\n            }\n        }\n\n        reply->deleteLater();\n        emit conditionsUpdated();\n    }\n    else\n    {\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        dxTrendPendingConnections.remove(reply);\n        repeateRequest(reply->url());\n        reply->deleteLater();\n    }\n}\n\nvoid PropConditions::repeateRequest(const QUrl &url)\n{\n    FCT_IDENTIFICATION;\n\n    failedRequests[url]++;\n\n    if ( failedRequests[url] <= RESEND_ATTEMPTS )\n    {\n        int resendInterval = RESEND_BASE_INTERVAL * failedRequests[url];\n        qCDebug(runtime) << \"Scheduled URL request resend\" << resendInterval << \"; URL:\" << url.toString();\n\n        QTimer::singleShot(1000 * RESEND_BASE_INTERVAL * failedRequests[url], this, [this, url]()\n        {\n            qCDebug(runtime) << \"Resending request\" << url.toString();\n            QNetworkReply *req = nam->get(prepareRequest(url));\n            if ( url.toString().contains(DXC_TRENDS))\n                dxTrendPendingConnections << req;\n\n        });\n    }\n    else\n    {\n        qCDebug(runtime) << \"Propagation - detected consecutive errors from\" << url.toString();\n    }\n}\n\nQNetworkRequest PropConditions::prepareRequest(const QUrl &url)\n{\n    FCT_IDENTIFICATION;\n\n    QNetworkRequest req(url);\n    req.setRawHeader(\"User-Agent\", agentString);\n    return req;\n}\n\nvoid PropConditions::dxTrendTimeout()\n{\n    FCT_IDENTIFICATION;\n\n    dxTrendTimeoutTimer.stop();\n\n    for ( auto it = dxTrendPendingConnections.begin(); it != dxTrendPendingConnections.end(); )\n    {\n        QNetworkReply* reply = *it;\n        it = dxTrendPendingConnections.erase(it);\n        if ( reply )\n        {\n            reply->abort();\n            reply->deleteLater();\n        }\n    }\n\n    dxTrendPendingConnections.clear();\n    dxTrendResult.clear();\n    emit dxTrendFinalized(dxTrendResult); // emit empty result\n}\n\nPropConditions::~PropConditions()\n{\n    dxTrendTimeout();\n    nam->deleteLater();\n}\n\nbool PropConditions::isFluxValid()\n{\n    FCT_IDENTIFICATION;\n    bool ret = false;\n\n    qCDebug(runtime)<<\"Date valid: \" << flux_last_update.isValid() << \" last_update: \" << flux_last_update;\n\n    ret = (flux_last_update.isValid()\n           && flux_last_update.secsTo(QDateTime::currentDateTime()) < 20 * 60);\n\n    qCDebug(runtime)<< \"Result: \" << ret;\n    return ret;\n}\n\nbool PropConditions::isKIndexValid()\n{\n    FCT_IDENTIFICATION;\n    bool ret = false;\n\n    qCDebug(runtime)<<\"Date valid: \" << k_index_last_update.isValid() << \" last_update: \" << k_index_last_update;\n\n    ret = (k_index_last_update.isValid()\n           && k_index_last_update.secsTo(QDateTime::currentDateTime()) < 20 * 60);\n\n    qCDebug(runtime)<< \"Result: \" << ret;\n\n    return ret;\n}\n\nbool PropConditions::isAIndexValid()\n{\n    FCT_IDENTIFICATION;\n    bool ret = false;\n\n    qCDebug(runtime)<<\"Date valid: \" << a_index_last_update.isValid() << \" last_update: \" << a_index_last_update;\n\n    ret = (a_index_last_update.isValid()\n           && a_index_last_update.secsTo(QDateTime::currentDateTime()) < 20 * 60);\n\n    qCDebug(runtime)<< \"Result: \" << ret;\n\n    return ret;\n}\n\nbool PropConditions::isAuroraMapValid()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime)<<\"Date valid: \" << auroraMap_last_update.isValid()\n                    << \" last_update: \" << auroraMap_last_update\n                    << \" aurora count: \" << auroraMap.count();\n\n    bool ret = (auroraMap_last_update.isValid()\n           && auroraMap_last_update.secsTo(QDateTime::currentDateTime()) < 20 * 60\n           && auroraMap.count() > 0);\n\n    qCDebug(runtime)<< \"Result: \" << ret;\n\n    return ret;\n}\n\nbool PropConditions::isMufMapValid()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime)<<\"Date valid: \" << mufMap_last_update.isValid()\n                    << \" last_update: \" << mufMap_last_update\n                    << \" aurora count: \" << mufMap.count();\n\n    bool ret = (mufMap_last_update.isValid()\n           && mufMap_last_update.secsTo(QDateTime::currentDateTime()) < 20 * 60\n           && mufMap.count() > 0);\n\n    qCDebug(runtime)<< \"Result: \" << ret;\n\n    return ret;\n}\n\nint PropConditions::getFlux()\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime)<<\"Current Flux: \" << flux << \" last_update: \" << flux_last_update;\n    return flux;\n\n}\n\nint PropConditions::getAIndex()\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime)<<\"Current A-Index: \" << a_index << \" last_update: \" << a_index_last_update;\n    return a_index;\n}\n\ndouble PropConditions::getKIndex()\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime)<<\"Current K-Index: \" << k_index << \" last_update: \" << k_index_last_update;\n    return k_index;\n}\n\nQList<GenericValueMap<double>::MapPoint> PropConditions::getAuroraPoints() const\n{\n    FCT_IDENTIFICATION;\n\n    return auroraMap.getMap();\n}\n\nQList<GenericValueMap<double>::MapPoint> PropConditions::getMUFPoints() const\n{\n    return mufMap.getMap();\n}\n\nQString PropConditions::solarSummaryFile()\n{\n    FCT_IDENTIFICATION;\n\n    QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    return dir.filePath(\"solar101vhf.gif\");\n}\n"
  },
  {
    "path": "core/PropConditions.h",
    "content": "#ifndef QLOG_CORE_PROPCONDITIONS_H\n#define QLOG_CORE_PROPCONDITIONS_H\n\n#include <QObject>\n#include <QDateTime>\n#include <QSet>\n#include <QTimer>\n\nclass QNetworkAccessManager;\nclass QNetworkReply;\nclass QNetworkRequest;\n\ntemplate<class T>\nclass GenericValueMap\n{\npublic:\n    explicit GenericValueMap() {}\n    ~GenericValueMap(){};\n\n    struct MapPoint\n    {\n        double longitude;\n        double latitude;\n        T value;\n    };\n\n    virtual void addPoint(double longitude,\n                          double latitude,\n                          const T &value,\n                          const T *skipValue = nullptr)\n    {\n        if ( skipValue && value == *skipValue )\n            return;\n\n        GenericValueMap::MapPoint point;\n        point.longitude = longitude;\n        point.latitude = latitude;\n        point.value = value;\n\n        map.append(point);\n    };\n\n    QList<GenericValueMap::MapPoint> getMap() const\n    {\n        return map;\n    };\n\n    void clear()\n    {\n        map.clear();\n    };\n\n    int count() const\n    {\n        return map.size();\n    };\n\nprivate:\n    QList<GenericValueMap::MapPoint> map;\n};\n\nclass PropConditions : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit PropConditions(QObject *parent = nullptr);\n    ~PropConditions();\n    bool isFluxValid();\n    bool isKIndexValid();\n    bool isAIndexValid();\n    bool isAuroraMapValid();\n    bool isMufMapValid();\n    int getFlux();\n    int getAIndex();\n    double getKIndex();\n    QList<GenericValueMap<double>::MapPoint> getAuroraPoints() const;\n    QList<GenericValueMap<double>::MapPoint> getMUFPoints() const;\n\n    static QString solarSummaryFile();\n\nsignals:\n    void conditionsUpdated();\n    void fluxUpdated();\n    void KIndexUpdated();\n    void AIndexUpdated();\n    void auroraMapUpdated();\n    void mufMapUpdated();\n    void dxTrendFinalized(QHash<QString, QHash<QString, QHash<QString, int>>>);\n\npublic slots:\n    void update();\n    void updateDxTrends();\n    void processReply(QNetworkReply* reply);\n\nprivate:\n    QDateTime flux_last_update;\n    QDateTime k_index_last_update;\n    QDateTime a_index_last_update;\n    QDateTime auroraMap_last_update;\n    QDateTime mufMap_last_update;\n    int flux;\n    int a_index;\n    double k_index;\n    GenericValueMap<double> auroraMap;\n    GenericValueMap<double> mufMap;\n    QHash<QUrl, int> failedRequests;\n    QSet<QNetworkReply *> dxTrendPendingConnections;\n    QTimer dxTrendTimeoutTimer;\n    QHash<QString, QHash<QString, QHash<QString, int>>> dxTrendResult;\n    QByteArray agentString;\n    void repeateRequest(const QUrl &);\n    QNetworkRequest prepareRequest(const QUrl &);\n\nprivate slots:\n    void dxTrendTimeout();\n\nprivate:\n    QNetworkAccessManager* nam;\n};\n\n#endif // QLOG_CORE_PROPCONDITIONS_H\n"
  },
  {
    "path": "core/QSLPrintLabelRenderer.cpp",
    "content": "#include <QPainter>\n#include <QPrinter>\n#include <QFontDatabase>\n#include <QFontMetricsF>\n#include <QPageSize>\n\n#include \"QSLPrintLabelRenderer.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.qslprintlabelrenderer\");\n\nQSLPrintLabelRenderer::QSLPrintLabelRenderer()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid QSLPrintLabelRenderer::setTemplate(const LabelTemplate &tmpl)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << tmpl.name;\n\n    labelTemplate = tmpl;\n}\n\nvoid QSLPrintLabelRenderer::setLabels(const QList<QSLLabelData> &inLabels)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << labels.size();\n\n    labels = inLabels;\n}\n\nvoid QSLPrintLabelRenderer::setFooterLeft(const QString &text)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << text;\n\n    footerLeft = text;\n}\n\nvoid QSLPrintLabelRenderer::setFooterRight(const QString &text)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << text;\n\n    footerRight = text;\n}\n\nvoid QSLPrintLabelRenderer::setSkipLabels(int count)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << count;\n\n    skipLabels = qMax(0, count);\n}\n\nvoid QSLPrintLabelRenderer::setPrintBorders(bool enabled)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << enabled;\n\n    printBorders = enabled;\n}\n\nvoid QSLPrintLabelRenderer::setStyleOptions(const LabelStyleOptions &opts)\n{\n    FCT_IDENTIFICATION;\n\n    styleOptions = opts;\n}\n\nint QSLPrintLabelRenderer::labelsPerPage() const\n{\n    FCT_IDENTIFICATION;\n\n    return labelTemplate.cols * labelTemplate.rows;\n}\n\nint QSLPrintLabelRenderer::labelCount() const\n{\n    FCT_IDENTIFICATION;\n\n    return labels.size();\n}\n\nint QSLPrintLabelRenderer::pageCount() const\n{\n    FCT_IDENTIFICATION;\n\n    int totalSlots = labels.size() + skipLabels;\n    int perPage = labelsPerPage();\n\n    return ( perPage > 0 ) ? (totalSlots + perPage - 1) / perPage : 0;\n}\n\nqreal QSLPrintLabelRenderer::mmToUnits(const qreal mm,\n                                       const QPaintDevice *device,\n                                       bool yAxis) const\n{\n    FCT_IDENTIFICATION;\n\n    return mm * (yAxis ? device->logicalDpiY() : device->logicalDpiX()) / 25.4; // to inch - DPI (px/inch)\n}\n\nvoid QSLPrintLabelRenderer::drawLabel(QPainter *painter,\n                                      const QRectF &labelRect,\n                                      const QSLLabelData &label)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !painter )\n        return;\n\n    const QPaintDevice *device = painter->device();\n\n    if ( !device )\n        return;\n\n    if ( printBorders )\n    {\n        painter->save();\n        painter->setPen(QPen(Qt::black, 0.5));\n        painter->setBrush(Qt::NoBrush);\n        painter->drawRect(labelRect);\n        painter->restore();\n    }\n\n    qreal padH = mmToUnits(2.0, device);\n    qreal padV = mmToUnits(1.5, device, true);\n\n    QRectF contentRect = labelRect.adjusted(padH, padV, -padH, -padV);\n\n    if ( contentRect.width() <= 0 || contentRect.height() <= 0 )\n        return;\n\n    // Fonts from style options\n    QFont fontToRadio(styleOptions.sansFontFamily);\n    fontToRadio.setPointSizeF(styleOptions.toRadioFontSize);\n\n    QFont fontCallsign(styleOptions.sansFontFamily);\n    fontCallsign.setPointSizeF(styleOptions.callsignFontSize);\n    fontCallsign.setBold(true);\n\n    QFont fontHeader(styleOptions.sansFontFamily);\n    fontHeader.setPointSizeF(styleOptions.headerFontSize);\n    fontHeader.setBold(true);\n\n    QFont fontData(styleOptions.monoFontFamily.isEmpty()\n                   ? QFontDatabase::systemFont(QFontDatabase::FixedFont)\n                   : QFont(styleOptions.monoFontFamily));\n    fontData.setPointSizeF(styleOptions.dataFontSize);\n\n    QFont fontFooter(styleOptions.sansFontFamily);\n    fontFooter.setPointSizeF(styleOptions.headerFontSize);\n\n    // Metrics\n    QFontMetricsF fmToRadio(fontToRadio, device);\n    QFontMetricsF fmCallsign(fontCallsign, device);\n    QFontMetricsF fmHeader(fontHeader, device);\n    QFontMetricsF fmData(fontData, device);\n    QFontMetricsF fmFooter(fontFooter, device);\n\n    // Vertical layout calculation\n    const qreal lineToRadio = fmToRadio.height();\n    const qreal lineCallsign = fmCallsign.height();\n    const qreal lineHeader = fmHeader.height();\n    const qreal lineData = fmData.height();\n    const qreal lineFooter = fmFooter.height();\n\n    // Line 1: \"To Radio\" + callsign share the same vertical line\n    // \"To Radio\" left-aligned, callsign centered\n    const qreal line1Height = qMax(lineToRadio, lineCallsign);\n    qreal currentY = contentRect.top();\n\n    // --- Line 1: \"To Radio\" + Callsign ---\n    painter->setFont(fontToRadio);\n    painter->setPen(Qt::black);\n    const QRectF toRadioRect(contentRect.left(), currentY,\n                             contentRect.width(), line1Height);\n    const QString toRadioText = styleOptions.toRadioText.isEmpty() ? \"To Radio\" : styleOptions.toRadioText;\n    painter->drawText(toRadioRect, Qt::AlignLeft | Qt::AlignVCenter, toRadioText);\n\n    painter->setFont(fontCallsign);\n    painter->drawText(toRadioRect, Qt::AlignHCenter | Qt::AlignVCenter, label.callsign);\n\n    currentY += line1Height;\n\n    // --- Compute dynamic column widths ---\n    // Column headers (from style options, with non-empty guard)\n    const QString hdrDate = styleOptions.hdrDate.isEmpty() ? \"Date\" : styleOptions.hdrDate;\n    const QString hdrTime = styleOptions.hdrTime.isEmpty() ? \"Time\" : styleOptions.hdrTime;\n    const QString hdrBand = styleOptions.hdrBand.isEmpty() ? \"Band\" : styleOptions.hdrBand;\n    const QString hdrMode = styleOptions.hdrMode.isEmpty() ? \"Mode\" : styleOptions.hdrMode;\n    const QString hdrQsl  = styleOptions.hdrQsl.isEmpty()  ? \"QSL\"  : styleOptions.hdrQsl;\n\n    // Measure column widths using worst-case representative strings\n    // to ensure consistent layout across all labels\n    qreal colWidthDate = qMax(fmHeader.horizontalAdvance(hdrDate),\n                              fmData.horizontalAdvance(\"2025-07-26\"));\n    qreal colWidthTime = qMax(fmHeader.horizontalAdvance(hdrTime),\n                              fmData.horizontalAdvance(\"00:00\"));\n    qreal colWidthBand = qMax(fmHeader.horizontalAdvance(hdrBand),\n                              fmData.horizontalAdvance(\"160M\"));\n    qreal colWidthMode = qMax(fmHeader.horizontalAdvance(hdrMode),\n                              fmData.horizontalAdvance(\"SSB\"));\n    qreal colWidthQsl = qMax(fmHeader.horizontalAdvance(hdrQsl),\n                             fmData.horizontalAdvance(\"TNX\"));\n\n    const bool hasExtra = !styleOptions.extraColumnHeader.isEmpty();\n    qreal colWidthExtra = 0.0;\n    if ( hasExtra )\n        colWidthExtra = qMax(fmHeader.horizontalAdvance(styleOptions.extraColumnHeader),\n                             fmData.horizontalAdvance(\"XXXXXXXXXX\"));\n\n    // Add inter-column spacing (1.5mm fixed gap)\n    qreal colGap = mmToUnits(1.5, device);\n    const qreal totalWidth = colWidthDate + colWidthTime + colWidthBand\n                             + colWidthMode + colWidthQsl\n                             + (hasExtra ? colWidthExtra : 0.0)\n                             + (hasExtra ? 5.0 : 4.0) * colGap;\n\n    // Scale columns proportionally if total exceeds content width\n    const qreal availWidth = contentRect.width();\n    if ( totalWidth > availWidth && totalWidth > 0 )\n    {\n        qreal scale = availWidth / totalWidth;\n        colWidthDate *= scale;\n        colWidthTime *= scale;\n        colWidthBand *= scale;\n        colWidthMode *= scale;\n        colWidthQsl *= scale;\n        colWidthExtra *= scale;\n        colGap *= scale;\n    }\n\n    // --- Line 2: Column headers ---\n    const qreal headerRowHeight = lineHeader + mmToUnits(0.5, device, true);\n    painter->setFont(fontHeader);\n    qreal colX = contentRect.left();\n\n    painter->drawText(QRectF(colX, currentY, colWidthDate, headerRowHeight),\n                      Qt::AlignLeft | Qt::AlignVCenter, hdrDate);\n    colX += colWidthDate + colGap;\n\n    painter->drawText(QRectF(colX, currentY, colWidthTime, headerRowHeight),\n                      Qt::AlignLeft | Qt::AlignVCenter, hdrTime);\n    colX += colWidthTime + colGap;\n\n    painter->drawText(QRectF(colX, currentY, colWidthBand, headerRowHeight),\n                      Qt::AlignLeft | Qt::AlignVCenter, hdrBand);\n    colX += colWidthBand + colGap;\n\n    painter->drawText(QRectF(colX, currentY, colWidthMode, headerRowHeight),\n                      Qt::AlignLeft | Qt::AlignVCenter, hdrMode);\n    colX += colWidthMode + colGap;\n\n    painter->drawText(QRectF(colX, currentY, colWidthQsl, headerRowHeight),\n                      Qt::AlignLeft | Qt::AlignVCenter, hdrQsl);\n\n    if ( hasExtra )\n    {\n        colX += colWidthQsl + colGap;\n        painter->drawText(QRectF(colX, currentY, colWidthExtra, headerRowHeight),\n                          Qt::AlignLeft | Qt::AlignVCenter, styleOptions.extraColumnHeader);\n    }\n\n    currentY += headerRowHeight;\n\n    // --- QSO data rows (up to maxQsoRows) ---\n    const qreal dataRowHeight = lineData + mmToUnits(0.3, device, true);\n    painter->setFont(fontData);\n    const int maxRows = qMin(label.qsos.size(), styleOptions.maxQsoRows);\n\n    for ( int i = 0; i < styleOptions.maxQsoRows; ++i )\n    {\n        if ( i < maxRows )\n        {\n            const QSLLabelData::QsoRow &row = label.qsos.at(i);\n            colX = contentRect.left();\n\n            painter->drawText(QRectF(colX, currentY, colWidthDate, dataRowHeight),\n                              Qt::AlignLeft | Qt::AlignVCenter, row.date);\n            colX += colWidthDate + colGap;\n\n            painter->drawText(QRectF(colX, currentY, colWidthTime, dataRowHeight),\n                              Qt::AlignLeft | Qt::AlignVCenter, row.time);\n            colX += colWidthTime + colGap;\n\n            painter->drawText(QRectF(colX, currentY, colWidthBand, dataRowHeight),\n                              Qt::AlignLeft | Qt::AlignVCenter, row.band);\n            colX += colWidthBand + colGap;\n\n            painter->drawText(QRectF(colX, currentY, colWidthMode, dataRowHeight),\n                              Qt::AlignLeft | Qt::AlignVCenter, row.mode);\n            colX += colWidthMode + colGap;\n\n            painter->drawText(QRectF(colX, currentY, colWidthQsl, dataRowHeight),\n                              Qt::AlignLeft | Qt::AlignVCenter, row.qsl);\n\n            if ( hasExtra )\n            {\n                colX += colWidthQsl + colGap;\n                painter->drawText(QRectF(colX, currentY, colWidthExtra, dataRowHeight),\n                                  Qt::AlignLeft | Qt::AlignVCenter, row.extra);\n            }\n        }\n        currentY += dataRowHeight;\n    }\n\n    // --- Footer line ---\n    const QRectF footerRect(contentRect.left(), contentRect.bottom() - lineFooter,\n                            contentRect.width(), lineFooter);\n\n    painter->setFont(fontFooter);\n\n    if ( !footerLeft.isEmpty() )\n        painter->drawText(footerRect, Qt::AlignLeft | Qt::AlignVCenter, footerLeft);\n\n    if ( !footerRight.isEmpty() )\n        painter->drawText(footerRect, Qt::AlignRight | Qt::AlignVCenter, footerRight);\n}\n\nvoid QSLPrintLabelRenderer::drawPage(QPainter *painter, int pageIndex)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << pageIndex;\n\n    if ( !painter )\n        return;\n\n    QPaintDevice *device = painter->device();\n\n    if ( !device )\n        return;\n\n    const int perPage = labelsPerPage();\n\n    if ( perPage <= 0 )\n        return;\n\n    const int slotStart = pageIndex * perPage;\n\n    for ( int row = 0; row < labelTemplate.rows; ++row )\n    {\n        for ( int col = 0; col < labelTemplate.cols; ++col )\n        {\n            const int slotIndex = slotStart + row * labelTemplate.cols + col;\n            const int labelIndex = slotIndex - skipLabels;\n\n            // Skip blank positions (for skip labels on first page)\n            if ( labelIndex < 0 )\n                continue;\n\n            // Past all labels\n            if ( labelIndex >= labels.size() )\n                return;\n\n            const qreal xMm = labelTemplate.leftMarginMm\n                              + col * (labelTemplate.labelWidthMm + labelTemplate.hSpacingMm);\n            const qreal yMm = labelTemplate.topMarginMm\n                         + row * (labelTemplate.labelHeightMm + labelTemplate.vSpacingMm);\n\n            const qreal x = mmToUnits(xMm, device);\n            const qreal y = mmToUnits(yMm, device, true);\n            const qreal w = mmToUnits(labelTemplate.labelWidthMm, device);\n            const qreal h = mmToUnits(labelTemplate.labelHeightMm, device, true);\n\n            const QRectF labelRect(x, y, w, h);\n            drawLabel(painter, labelRect, labels.at(labelIndex));\n        }\n    }\n}\n\nQImage QSLPrintLabelRenderer::renderPage(int pageIndex, int dpi)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << pageIndex << dpi;\n\n    if ( dpi <= 0 )\n    {\n        qCWarning(runtime) << \"Invalid DPI\" << dpi;\n        return QImage();\n    }\n\n    if ( pageIndex < 0 || pageIndex >= pageCount() )\n    {\n        qCWarning(runtime) << \"Invalid page index\" << pageIndex;\n        return QImage();\n    }\n\n    QSizeF pageSizeMm = QPageSize(labelTemplate.pageSize).size(QPageSize::Millimeter);\n\n    if ( labelTemplate.orientation == QPageLayout::Landscape )\n        pageSizeMm.transpose();\n\n    const int widthPx = qRound(pageSizeMm.width() * dpi / 25.4);\n    const int heightPx = qRound(pageSizeMm.height() * dpi / 25.4);\n\n    QImage image(widthPx, heightPx, QImage::Format_ARGB32_Premultiplied);\n    image.setDotsPerMeterX(qRound(dpi / 25.4 * 1000.0));\n    image.setDotsPerMeterY(qRound(dpi / 25.4 * 1000.0));\n    image.fill(Qt::white);\n\n    QPainter painter(&image);\n    painter.setRenderHint(QPainter::Antialiasing, true);\n    painter.setRenderHint(QPainter::TextAntialiasing, true);\n\n    drawPage(&painter, pageIndex);\n\n    painter.end();\n    return image;\n}\n\nvoid QSLPrintLabelRenderer::printAll(QPrinter *printer)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !printer )\n    {\n        qCWarning(runtime) << \"Null printer\";\n        return;\n    }\n\n    const int pages = pageCount();\n\n    if ( pages <= 0 )\n    {\n        qCWarning(runtime) << \"No pages to print\";\n        return;\n    }\n\n    printer->setResolution(PRINTER_RESOLUTION);\n\n    const QPageLayout layout(QPageSize(labelTemplate.pageSize),\n                             labelTemplate.orientation,\n                             QMarginsF(0, 0, 0, 0),\n                             QPageLayout::Millimeter);\n    printer->setPageLayout(layout);\n\n    QPainter painter(printer);\n\n    if ( !painter.isActive() )\n    {\n        qCWarning(runtime) << \"Cannot begin painting on printer\";\n        return;\n    }\n\n    for ( int i = 0; i < pages; ++i )\n    {\n        if ( i > 0 )\n            printer->newPage();\n\n        drawPage(&painter, i);\n    }\n\n    painter.end();\n}\n\nQList<LabelTemplate> QSLPrintLabelRenderer::predefinedTemplates()\n{\n    FCT_IDENTIFICATION;\n\n    static const QList<LabelTemplate> templates =\n    {\n        {\"Avery 3664\", QPageLayout::Portrait, QPageSize::A4,\n         3, 8, 70.0, 33.8, 4.3, 0.0, 0.0, 0.0},\n        {\"Avery 3422\", QPageLayout::Portrait, QPageSize::A4,\n         3, 8, 70.0, 35.0, 8.5, 0.0, 0.0, 0.0},\n        {\"Avery 3474\", QPageLayout::Portrait, QPageSize::A4,\n         2, 12, 105.0, 24.0, 4.5, 0.0, 0.0, 0.0},\n        {\"Avery 5160 / 8160\", QPageLayout::Portrait, QPageSize::Letter,\n         3, 10, 66.7, 25.4, 12.7, 4.8, 3.2, 0.0},\n        {\"Avery 5163 / 8163\", QPageLayout::Portrait, QPageSize::Letter,\n         2, 5, 101.6, 50.8, 12.70, 4.762, 3.175, 0.0},\n        {\"Avery L7160\", QPageLayout::Portrait, QPageSize::A4,\n         3, 7, 63.5, 38.1, 15.15, 7.25, 2.54, 0.0},\n        {\"Avery L7161\", QPageLayout::Portrait, QPageSize::A4,\n         3, 5, 63.5, 46.6, 15.15, 7.25, 2.54, 0.0},\n        {\"Avery 5164\", QPageLayout::Portrait, QPageSize::Letter,\n         2, 3, 101.6, 84.67, 12.70, 4.762, 3.175, 0.0},\n    };\n    return templates;\n}\n"
  },
  {
    "path": "core/QSLPrintLabelRenderer.h",
    "content": "#ifndef QLOG_CORE_QSLPRINTLABELRENDERER_H\n#define QLOG_CORE_QSLPRINTLABELRENDERER_H\n\n#include <QString>\n#include <QList>\n#include <QRectF>\n#include <QImage>\n#include <QPageLayout>\n#include <QPageSize>\n\nclass QPainter;\nclass QPrinter;\nclass QPaintDevice;\n\nstruct LabelTemplate\n{\n    QString name;\n    QPageLayout::Orientation orientation;\n    QPageSize::PageSizeId pageSize;\n    int cols;\n    int rows;\n    double labelWidthMm;\n    double labelHeightMm;\n    double topMarginMm;\n    double leftMarginMm;\n    double hSpacingMm;\n    double vSpacingMm;\n};\n\nstruct LabelStyleOptions\n{\n    QString sansFontFamily;          // empty = system default\n    QString monoFontFamily;          // empty = system fixed font\n    qreal toRadioFontSize = 7.5;\n    qreal callsignFontSize = 14.0;\n    qreal headerFontSize = 7.0;\n    qreal dataFontSize = 8.0;\n    QString extraColumnHeader;       // empty = no extra column\n    int maxQsoRows = 4;              // 1-4 QSO data rows per label\n    QString toRadioText = \"To Radio\";\n    QString hdrDate = \"Date\";\n    QString hdrTime = \"Time\";\n    QString hdrBand = \"Band\";\n    QString hdrMode = \"Mode\";\n    QString hdrQsl  = \"QSL\";\n};\n\nstruct QSLLabelData\n{\n    QString callsign;\n\n    struct QsoRow\n    {\n        QString date;   // formatted by dialog according to user date format\n        QString time;   // \"09:38\"\n        QString band;   // \"20M\"\n        QString mode;   // \"SSB\"\n        QString qsl;    // \"PSE\" or \"TNX\"\n        QString extra;  // raw DB value for extra column, empty if unused\n    };\n\n    QList<QsoRow> qsos;\n};\n\nclass QSLPrintLabelRenderer\n{\npublic:\n    QSLPrintLabelRenderer();\n\n    void setTemplate(const LabelTemplate &tmpl);\n    void setLabels(const QList<QSLLabelData> &inLabels);\n    void setFooterLeft(const QString &text);\n    void setFooterRight(const QString &text);\n    void setSkipLabels(int count);\n    void setPrintBorders(bool enabled);\n    void setStyleOptions(const LabelStyleOptions &opts);\n\n    int pageCount() const;\n    int labelCount() const;\n    QImage renderPage(int pageIndex, int dpi = 150);\n    void printAll(QPrinter *printer);\n\n    static QList<LabelTemplate> predefinedTemplates();\n\nprivate:\n    void drawLabel(QPainter *painter, const QRectF &labelRect,\n                   const QSLLabelData &label);\n    void drawPage(QPainter *painter, int pageIndex);\n    qreal mmToUnits(const qreal mm, const QPaintDevice *device, bool yAxis = false) const;\n    int labelsPerPage() const;\n\n    LabelTemplate labelTemplate;\n    QList<QSLLabelData> labels;\n    QString footerLeft;\n    QString footerRight;\n    int skipLabels = 0;\n    bool printBorders = false;\n    LabelStyleOptions styleOptions;\n\n    const int PRINTER_RESOLUTION = 300;\n};\n\n#endif // QLOG_CORE_QSLPRINTLABELRENDERER_H\n"
  },
  {
    "path": "core/QSLStorage.cpp",
    "content": "#include <algorithm>\n#include <QDir>\n#include <QSet>\n#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"QSLStorage.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.qslstorage\");\n\nQSLStorage::QSLStorage(QObject *parent) : QObject(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\nbool QSLStorage::add(const QSLObject &qslObject)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << qslObject.getQSOID()\n                                 << qslObject.getSource()\n                                 << qslObject.getQSLName();\n    QSqlQuery insert;\n\n    if ( !insert.prepare(\"REPLACE INTO contacts_qsl_cards (contactid, source, name, data) \"\n                         \" VALUES (:contactid, :source, :name, :data)\" ) )\n    {\n        qCDebug(runtime) << \" Cannot prepare INSERT for PaperQSL \" << insert.lastError();\n        return false;\n    }\n\n    insert.bindValue(\":contactid\", qslObject.getQSOID());\n    insert.bindValue(\":source\", qslObject.getSource());\n    insert.bindValue(\":name\", qslObject.getQSLName());\n    insert.bindValue(\":data\", qslObject.getBLOB(QSLObject::BASE64FORM));\n\n    if ( !insert.exec() )\n    {\n        qCDebug(runtime) << \"Cannot import QSL\" << insert.lastError();\n        return false;\n    }\n    return true;\n}\n\nbool QSLStorage::remove(const QSqlRecord &qso,\n                        const QSLObject::SourceType source,\n                        const QString &qslName)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"DELETE FROM contacts_qsl_cards \"\n                        \"WHERE source = :source \"\n                        \"AND contactid = :contactid \"\n                        \"AND name = :qsl_name\"))\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\";\n        return false;\n    }\n\n    query.bindValue(\":source\", source);\n    query.bindValue(\":contactid\", qso.value(\"id\"));\n    query.bindValue(\":qsl_name\", qslName);\n\n    if ( !query.exec() )\n    {\n        qCDebug(runtime) << \"Cannot delete QSL file\" << qslName;\n        return false;\n    }\n\n    return true;\n}\n\nQStringList QSLStorage::getAvailableQSLNames(const QSqlRecord &qso,\n                                             const QSLObject::SourceType sourceFilter) const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT name FROM contacts_qsl_cards \"\n                        \"WHERE source = :source \"\n                        \"AND contactid = :contactid \"\n                        \"ORDER BY name\"))\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\";\n        return ret;\n    }\n\n    query.bindValue(\":source\", sourceFilter);\n    query.bindValue(\":contactid\", qso.value(\"id\"));\n\n    if ( query.exec() )\n    {\n        while(query.next())\n        {\n            ret << query.value(0).toString();\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Error\" << query.lastError();\n    }\n    return ret;\n}\n\nQSLObject QSLStorage::getQSL(const QSqlRecord &qso,\n                             const QSLObject::SourceType source,\n                             const QString &qslName) const\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT data FROM contacts_qsl_cards \"\n                        \"WHERE source = :source \"\n                        \"AND contactid = :contactid \"\n                        \"AND name = :qsl_name \"\n                        \"ORDER BY name LIMIT 1\"))\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\";\n    }\n    else\n    {\n        query.bindValue(\":source\", source);\n        query.bindValue(\":contactid\", qso.value(\"id\"));\n        query.bindValue(\":qsl_name\", qslName);\n\n        if ( query.exec() && query.next() )\n            return QSLObject(qso, source, qslName, query.value(0).toByteArray(), QSLObject::BASE64FORM);\n    }\n\n    return QSLObject (qso, source, qslName, QByteArray(), QSLObject::RAWBYTES);\n}\n\nQSLStorage::FilterValues QSLStorage::getDistinctFilterValues() const\n{\n    FCT_IDENTIFICATION;\n\n    FilterValues ret;\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT DISTINCT translate_to_locale(c.country), strftime('%Y', c.start_time), \"\n                        \"strftime('%m', c.start_time), c.band, c.mode, c.cont, c.dxcc \"\n                        \"FROM contacts_qsl_cards q \"\n                        \"JOIN contacts c ON q.contactid = c.id\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return ret;\n    }\n\n    QSet<QString> bands, modes, continents;\n    QMap<QString, QSet<QString>> yearMonthSets;\n\n    if ( query.exec() )\n    {\n        while ( query.next() )\n        {\n            const QString country = query.value(0).toString();\n            const QString year = query.value(1).toString();\n            const QString month = query.value(2).toString();\n            const QString band = query.value(3).toString();\n            const QString mode = query.value(4).toString();\n            const QString cont = query.value(5).toString();\n            const int dxcc = query.value(6).toInt();\n\n            if ( !country.isEmpty() && dxcc > 0 )\n                ret.countries.insert(country, dxcc);\n            if ( !year.isEmpty() )    yearMonthSets[year].insert(month.isEmpty() ? \"00\" : month);\n            if ( !band.isEmpty() )    bands.insert(band);\n            if ( !mode.isEmpty() )    modes.insert(mode);\n            if ( !cont.isEmpty() )    continents.insert(cont);\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Error\" << query.lastError();\n    }\n\n    ret.bands = bands.values();\n    ret.modes = modes.values();\n    ret.continents = continents.values();\n\n    // Build sorted yearMonths map\n    for ( QMap<QString, QSet<QString>>::const_iterator it = yearMonthSets.constBegin(); it != yearMonthSets.constEnd(); ++it )\n    {\n        QStringList months = it.value().values();\n        std::sort(months.begin(), months.end());\n        ret.yearMonths.insert(it.key(), months);\n    }\n\n    std::sort(ret.bands.begin(), ret.bands.end());\n    std::sort(ret.modes.begin(), ret.modes.end());\n    std::sort(ret.continents.begin(), ret.continents.end());\n\n    return ret;\n}\n\nstatic QList<QSLGalleryItem> executeGalleryQuery(QSqlQuery &query)\n{\n    QList<QSLGalleryItem> ret;\n\n    if ( query.exec() )\n    {\n        while ( query.next() )\n        {\n            QSLGalleryItem item;\n            item.contactId = query.value(0).toULongLong();\n            item.source = static_cast<QSLObject::SourceType>(query.value(1).toInt());\n            item.name = query.value(2).toString();\n            item.callsign = query.value(3).toString();\n            item.startTime = query.value(4).toDateTime();\n            item.country = query.value(5).toString();\n            item.favorite = query.value(6).toBool();\n            ret << item;\n        }\n    }\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItems() const\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items found or error\" << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByDxcc(int dxcc) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxcc;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE c.dxcc = :dxcc ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":dxcc\", dxcc);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for dxcc\" << dxcc << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByYear(const QString &year) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << year;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE strftime('%Y', c.start_time) = :year ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":year\", year);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for year\" << year << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByYearMonth(const QString &year, const QString &month) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << year << month;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE strftime('%Y', c.start_time) = :year \"\n                        \"AND strftime('%m', c.start_time) = :month ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":year\", year);\n    query.bindValue(\":month\", month);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for\" << year << month << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByBand(const QString &band) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << band;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE c.band = :band ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":band\", band);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for band\" << band << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByMode(const QString &mode) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE c.mode = :mode ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":mode\", mode);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for mode\" << mode << query.lastError();\n\n    return ret;\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsByContinent(const QString &continent) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << continent;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE c.cont = :cont ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    query.bindValue(\":cont\", continent);\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No gallery items for continent\" << continent << query.lastError();\n\n    return ret;\n}\n\nQByteArray QSLStorage::getQSLData(qulonglong contactId, int source, const QString &name) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << contactId << source << name;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT data FROM contacts_qsl_cards \"\n                        \"WHERE contactid = :contactid AND source = :source AND name = :name \"\n                        \"LIMIT 1\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QByteArray();\n    }\n\n    query.bindValue(\":contactid\", static_cast<quint64>(contactId));\n    query.bindValue(\":source\", source);\n    query.bindValue(\":name\", name);\n\n    if ( query.exec() && query.next() )\n        return QByteArray::fromBase64(query.value(0).toByteArray());\n\n    qCDebug(runtime) << \"QSL data not found\" << query.lastError();\n    return QByteArray();\n}\n\nQList<QSLGalleryItem> QSLStorage::getGalleryItemsFavorite() const\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(galleryBaseSQL + \"WHERE q.favorite = 1 ORDER BY c.start_time DESC\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return QList<QSLGalleryItem>();\n    }\n\n    QList<QSLGalleryItem> ret = executeGalleryQuery(query);\n\n    if ( ret.isEmpty() )\n        qCDebug(runtime) << \"No favorite gallery items found or error\" << query.lastError();\n\n    return ret;\n}\n\nbool QSLStorage::setFavorite(qulonglong contactId, QSLObject::SourceType source, const QString &name, bool favorite)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << contactId << source << name << favorite;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"UPDATE contacts_qsl_cards SET favorite = :fav \"\n                        \"WHERE contactid = :contactid AND source = :source AND name = :name\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return false;\n    }\n\n    query.bindValue(\":fav\", favorite ? 1 : 0);\n    query.bindValue(\":contactid\", static_cast<quint64>(contactId));\n    query.bindValue(\":source\", static_cast<int>(source));\n    query.bindValue(\":name\", name);\n\n    if ( !query.exec() )\n    {\n        qCDebug(runtime) << \"Cannot update favorite\" << query.lastError();\n        return false;\n    }\n\n    return true;\n}\n\nbool QSLStorage::isFavorite(qulonglong contactId, QSLObject::SourceType source, const QString &name) const\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT favorite FROM contacts_qsl_cards \"\n                        \"WHERE contactid = :contactid AND source = :source AND name = :name \"\n                        \"LIMIT 1\") )\n    {\n        qCDebug(runtime) << \"Cannot prepare SQL Statement\" << query.lastError();\n        return false;\n    }\n\n    query.bindValue(\":contactid\", static_cast<quint64>(contactId));\n    query.bindValue(\":source\", static_cast<int>(source));\n    query.bindValue(\":name\", name);\n\n    if ( query.exec() && query.next() )\n        return query.value(0).toBool();\n\n    return false;\n}\n"
  },
  {
    "path": "core/QSLStorage.h",
    "content": "#ifndef QLOG_CORE_QSLSTORAGE_H\n#define QLOG_CORE_QSLSTORAGE_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include <QVariant>\n#include <QList>\n#include <QMap>\n#include <QDateTime>\n\nclass QSLObject\n{\npublic:\n    enum SourceType\n    {\n        QSLFILE = 0,\n        EQSL = 1,\n    };\n\n    enum BLOBFormat\n    {\n        BASE64FORM,\n        RAWBYTES\n    };\n\n    explicit QSLObject( const qulonglong &qsoID,\n                        const SourceType source,\n                        const QString &qslName,\n                        const QByteArray &inBlob,\n                        const BLOBFormat format) :\n        qsoID(qsoID),\n        source(source),\n        qslName(qslName),\n        blob((format == RAWBYTES) ? inBlob : QByteArray::fromBase64(inBlob))\n        {};\n\n    explicit QSLObject( const QSqlRecord &qso,\n                        const SourceType source,\n                        const QString &qslName,\n                        const QByteArray &inBlob,\n                        const BLOBFormat format) :\n        QSLObject(qso.value(\"id\").toULongLong(),\n                  source, qslName, inBlob, format)\n    {}\n\n    qulonglong getQSOID() const {return qsoID;};\n    QSLObject::SourceType getSource() const {return source;};\n    QString getQSLName() const {return qslName;};\n    QByteArray getBLOB(BLOBFormat format = RAWBYTES) const {return (format == BASE64FORM) ? blob.toBase64() : blob;};\n\nprivate:\n    qulonglong qsoID;\n    SourceType source;\n    QString qslName;\n    QByteArray blob;\n};\n\nstruct QSLGalleryItem\n{\n    qulonglong contactId;\n    QSLObject::SourceType source;\n    QString name;\n    QString callsign;\n    QDateTime startTime;\n    QString country;\n    bool favorite = false;\n};\n\nclass QSLStorage : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit QSLStorage(QObject *parent = nullptr);\n\n    bool add(const QSLObject &);\n    bool remove(const QSqlRecord &qso,\n                const QSLObject::SourceType source,\n                const QString &qslName);\n    QStringList getAvailableQSLNames(const QSqlRecord &qso,\n                                     const QSLObject::SourceType sourceFilter) const;\n    QSLObject getQSL(const QSqlRecord &qso,\n                     const QSLObject::SourceType source,\n                     const QString &qslName) const;\n\n    struct FilterValues\n    {\n        QMap<QString, int> countries; // localizedName -> dxcc_id\n        QMap<QString, QStringList> yearMonths; // year -> sorted list of months (\"01\"..\"12\")\n        QStringList bands;\n        QStringList modes;\n        QStringList continents;\n    };\n\n    FilterValues getDistinctFilterValues() const;\n\n    QList<QSLGalleryItem> getGalleryItems() const;\n    QList<QSLGalleryItem> getGalleryItemsByDxcc(int dxcc) const;\n    QList<QSLGalleryItem> getGalleryItemsByYear(const QString &year) const;\n    QList<QSLGalleryItem> getGalleryItemsByYearMonth(const QString &year, const QString &month) const;\n    QList<QSLGalleryItem> getGalleryItemsFavorite() const;\n    QList<QSLGalleryItem> getGalleryItemsByBand(const QString &band) const;\n    QList<QSLGalleryItem> getGalleryItemsByMode(const QString &mode) const;\n    QList<QSLGalleryItem> getGalleryItemsByContinent(const QString &continent) const;\n\n    QByteArray getQSLData(qulonglong contactId, int source, const QString &name) const;\n\n    bool setFavorite(qulonglong contactId, QSLObject::SourceType source, const QString &name, bool favorite);\n    bool isFavorite(qulonglong contactId, QSLObject::SourceType source, const QString &name) const;\n\nprivate:\n    const QString galleryBaseSQL=\n        \"SELECT q.contactid, q.source, q.name, c.callsign, c.start_time, translate_to_locale(c.country), q.favorite \"\n        \"FROM contacts_qsl_cards q \"\n        \"JOIN contacts c ON q.contactid = c.id \";\n\n};\n\n#endif // QLOG_CORE_QSLSTORAGE_H\n"
  },
  {
    "path": "core/QSOFilterManager.cpp",
    "content": "#include <QSqlError>\n#include <QSqlRecord>\n#include \"QSOFilterManager.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.qsofiltermanager\");\n\nQSOFilterManager::QSOFilterManager(QObject *parent)\n    : QObject(parent),\n    stmtsReady(true)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !insertRuleStmt.prepare(QLatin1String(\"INSERT INTO qso_filter_rules(filter_name, table_field_index, operator_id, value) \"\n                                              \"VALUES (:filterName, :tableFieldIndex, :operatorID, :valueString)\")  ) )\n    {\n        qWarning() << \"cannot preapre insert insertRuleStmt\";\n        stmtsReady = false;\n    }\n\n    if ( !insertFilterStmt.prepare(QLatin1String(\"INSERT INTO qso_filters (filter_name, matching_type) VALUES (:filterName, :matchingType) \"\n                                                \"ON CONFLICT(filter_name) DO UPDATE SET matching_type = :matchingType WHERE filter_name = :filterName\") ) )\n    {\n        qWarning() << \"cannot preapre insert insertFilterStmt\";\n        stmtsReady = false;\n    }\n\n    if ( !deleteFilterStmt.prepare(QLatin1String(\"DELETE FROM qso_filter_rules WHERE filter_name = :filterName\") ) )\n    {\n        qWarning() << \"cannot preapre insert deleteFilterStmt\";\n        stmtsReady = false;\n    }\n}\n\nbool QSOFilterManager::deleteFilterRules(const QString &filterName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName;\n\n    deleteFilterStmt.bindValue(\":filterName\", filterName);\n    bool ret = deleteFilterStmt.exec();\n    if ( !ret )\n        qCDebug(runtime) << \"SQL Error\"\n                         << deleteFilterStmt.lastError().text();\n    return ret;\n}\n\nbool QSOFilterManager::replaceFilter(const QString &filterName, const int matchingType)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName << matchingType;\n\n    insertFilterStmt.bindValue(\":filterName\", filterName);\n    insertFilterStmt.bindValue(\":matchingType\", matchingType);\n\n    bool ret = insertFilterStmt.exec();\n    if ( !ret )\n        qCDebug(runtime) << \"SQL Error\"\n                         << insertFilterStmt.lastError().text();\n    return ret;\n}\n\nbool QSOFilterManager::insertFilterRule(const QString & filterName,\n                                        const QSOFilterRule &rule)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName\n                                 << rule.tableFieldIndex\n                                 << rule.operatorID\n                                 << rule.value;\n\n    insertRuleStmt.bindValue(\":filterName\", filterName);\n    insertRuleStmt.bindValue(\":tableFieldIndex\", rule.tableFieldIndex);\n    insertRuleStmt.bindValue(\":operatorID\", rule.operatorID);\n    insertRuleStmt.bindValue(\":valueString\", (rule.value.isEmpty()) ? QVariant()\n                                                                    : rule.value);\n    bool ret = insertRuleStmt.exec();\n    if ( !ret )\n        qCDebug(runtime) << \"SQL Error\"\n                         << insertRuleStmt.lastError().text();\n    return ret;\n}\n\nbool QSOFilterManager::save(const QSOFilter &filter)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filter.filterName\n                                 << filter.machingType;\n\n    if ( !stmtsReady )\n        return false;\n\n    QSqlDatabase::database().transaction();\n\n    if ( !replaceFilter(filter.filterName, filter.machingType) )\n    {\n        QSqlDatabase::database().rollback();\n        return false;\n    }\n\n    if ( !deleteFilterRules(filter.filterName) )\n    {\n        QSqlDatabase::database().rollback();\n        return false;\n    }\n\n    for ( const QSOFilterRule &rule : filter.rules )\n    {\n        if ( !insertFilterRule(filter.filterName, rule) )\n        {\n            QSqlDatabase::database().rollback();\n            return false;\n        }\n    }\n\n    QSqlDatabase::database().commit();\n    return true;\n}\n\nbool QSOFilterManager::remove(const QString &filterName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName;\n\n    QSqlQuery filterStmt;\n    if ( ! filterStmt.prepare(QLatin1String(\"DELETE FROM qso_filters \"\n                                            \"WHERE filter_name = :filterName;\")) )\n    {\n        qWarning() << \"Cannot prepare delete statement\";\n        return false;\n    }\n\n    filterStmt.bindValue(\":filterName\", filterName);\n\n    if ( ! filterStmt.exec() )\n    {\n        qInfo()<< \"Cannot get filters names from DB\" << filterStmt.lastError();\n        return false;\n    }\n\n    return true;\n}\n\nQStringList QSOFilterManager::getFilterList() const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    QSqlQuery filterStmt;\n    if ( ! filterStmt.prepare(QLatin1String(\"SELECT filter_name \"\n                                            \"FROM qso_filters \"\n                                            \"ORDER BY filter_name\")) )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return ret;\n    }\n\n    if ( filterStmt.exec() )\n    {\n        while ( filterStmt.next() )\n            ret << filterStmt.value(0).toString();\n    }\n    else\n        qInfo()<< \"Cannot get filters names from DB\" << filterStmt.lastError();;\n\n    return ret;\n}\n\nQSOFilter QSOFilterManager::getFilter(const QString &filterName) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName;\n\n    QSOFilter ret;\n    QSqlQuery query;\n    if ( ! query.prepare(QLatin1String(\"SELECT matching_type, table_field_index, operator_id, value \"\n                                       \"FROM qso_filter_rules r, qso_filters f \"\n                                       \"WHERE f.filter_name = :filter \"\n                                       \"      AND f.filter_name = r.filter_name\")) )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return ret;\n    }\n\n    query.bindValue(\":filter\", filterName);\n\n    if ( query.exec() )\n    {\n        ret.filterName = filterName;\n        while ( query.next() )\n        {\n            QSOFilterRule rule;\n            const QSqlRecord &record = query.record();\n\n            ret.machingType = record.value(\"matching_type\").toInt();\n            rule.tableFieldIndex = record.value(\"table_field_index\").toInt();\n            rule.operatorID = record.value(\"operator_id\").toInt();\n            rule.value = record.value(\"value\").toString();\n            ret.addRule(rule);\n        }\n    }\n    else\n        qCDebug(runtime) << \"SQL execution error: \" << query.lastError().text();\n\n    return ret;\n}\n\nQString QSOFilterManager::getWhereClause(const QString &filterName, const QString &columnPrefix)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery userFilterQuery;\n    QString ret;\n    QString finalColumnPfx = columnPrefix;\n    finalColumnPfx += finalColumnPfx.isEmpty() ? \"\" : \".\";\n\n    if ( ! userFilterQuery.prepare(\n                  QString(       \"SELECT \"\n                                 \"'(' || GROUP_CONCAT( ' ' || '\" + finalColumnPfx + \"' || c.name || ' ' || CASE WHEN r.value IS NULL AND o.sql_operator IN ('=', 'like') THEN 'IS' \"\n                                 \"                                                  WHEN r.value IS NULL and r.operator_id NOT IN ('=', 'like') THEN 'IS NOT' \"\n                                 \"                                                  WHEN o.sql_operator = ('starts with') THEN 'like' \"\n                                 \"                                                  ELSE o.sql_operator END || \"\n                                 \"' (' || quote(CASE o.sql_operator WHEN 'like' THEN '%' || r.value || '%' \"\n                                 \"                                  WHEN 'not like' THEN '%' || r.value || '%' \"\n                                 \"                                  WHEN 'starts with' THEN r.value || '%' \"\n                                 \"                                  ELSE r.value END)  || ') ', m.sql_operator) || ')' \"\n                                 \"FROM qso_filters f, qso_filter_rules r, \"\n                                 \"qso_filter_operators o, qso_filter_matching_types m, \"\n                                 \"PRAGMA_TABLE_INFO('contacts') c \"\n                                 \"WHERE f.filter_name = :filterName \"\n                                 \"      AND f.filter_name = r.filter_name \"\n                                 \"      AND o.operator_id = r.operator_id \"\n                                 \"      AND m.matching_id = f.matching_type \"\n                                 \"      AND c.cid = r.table_field_index\")) )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return ret;\n    }\n\n    userFilterQuery.bindValue(\":filterName\", filterName);\n\n    qCDebug(runtime) << \"User filter SQL: \" << userFilterQuery.lastQuery();\n\n    if ( userFilterQuery.exec() )\n    {\n        userFilterQuery.next();\n        ret = QString(\"( %1 )\").arg(userFilterQuery.value(0).toString());\n    }\n    else\n        qCDebug(runtime) << \"User filter error - \" << userFilterQuery.lastError().text();\n\n    // This filter, when used with fields that contain time, only works by luck.\n    // These fields are Timeon/Timeoff. They are stored by QSO Filter Dialog as values in the format\n    // YYYY-MM-DDThh:mm:ss without a timezone. This is fine, since all times in QLog\n    // are internally in UTC. The problem arises because this WHERE clause is later\n    // used in a SELECT in the logbook. SQL does not compare the values as datetime,\n    // but as strings — otherwise both sides would need to be proper datetime types.\n    // Fortunately, both sides are strings in the same format, except that Timeon/Timeoff\n    // includes a timezone at the end. Therefore, string comparison of the dates still works.\n    return ret;\n}\n\nSqlListModel *QSOFilterManager::QSOFilterModel(const QString &firstValue, QObject *parent)\n{\n    FCT_IDENTIFICATION;\n\n    return new SqlListModel(\"SELECT filter_name \"\n                            \"FROM qso_filters \"\n                            \"ORDER BY filter_name COLLATE LOCALEAWARE ASC\",\n                            firstValue,\n                            parent);\n}\n\n"
  },
  {
    "path": "core/QSOFilterManager.h",
    "content": "#ifndef QSOFILTERMANAGER_H\n#define QSOFILTERMANAGER_H\n\n#include <QObject>\n#include <QSqlQuery>\n#include <QDateTime>\n\n#include \"models/LogbookModel.h\"\n#include \"models/SqlListModel.h\"\n\nstruct QSOFilterRule\n{\n    QSOFilterRule() {};\n    QSOFilterRule(int in_idx, int in_operatorID, const QString &in_value)\n        : tableFieldIndex(in_idx),\n        operatorID(in_operatorID),\n        value(in_value){ };\n    int tableFieldIndex;\n    int operatorID;\n    QString value;\n};\n\nclass QSOFilter\n{\npublic:\n    QString filterName;\n    int machingType;\n    QList<QSOFilterRule> rules;\n\n    QSOFilter() : machingType(0){};\n\n    void addRule(const QSOFilterRule &rule)\n    {\n        rules.append(rule);\n    }\n\n    static QSOFilterRule createFromDateRule(const QDateTime &date)\n    {\n        return QSOFilterRule(LogbookModel::COLUMN_TIME_ON, 4, date.toString(\"yyyy-MM-ddTHH:mm:ss\"));  // 4 - should be enum - later '4' >\n    }\n\n    static QSOFilterRule createNonEmptyContestRule(const QString &contestID)\n    {\n        return QSOFilterRule(LogbookModel::COLUMN_CONTEST_ID, 2, contestID);// '2' is like\n    }\n\n    static QSOFilterRule createToDateRule(const QDateTime &date)\n    {\n        return QSOFilterRule(LogbookModel::COLUMN_TIME_ON, 5, date.toString(\"yyyy-MM-ddTHH:mm:ss\"));  // 5 - should be enum - later '5' <\n                                                  // ON of OFF???\n    }\n\n    static QSOFilter createFromDateContestFilter(const QString &contestID, const QDateTime &date)\n    {\n        QSOFilter ret;\n\n        ret.filterName = QString(\"%1-%2\").arg(contestID, date.toString(\"yyyy/MM/dd hh:mm\"));\n        ret.machingType = 0; // should be enum - later\n        ret.addRule(createFromDateRule(date));\n        ret.addRule(createNonEmptyContestRule(contestID));\n        return ret;\n    }\n};\n\nclass QSOFilterManager : public QObject\n{\n    Q_OBJECT\npublic:\n\n    static QSOFilterManager * instance()\n    {\n        static QSOFilterManager instance;\n        return &instance;\n    }\n\n    static QString getWhereClause(const QString &filterName, const QString &columnPrefix = {});\n    static SqlListModel* QSOFilterModel(const QString &firstValue, QObject *parent = nullptr);\n    bool save(const QSOFilter &filter);\n    bool remove(const QString &filterName);\n    QStringList getFilterList() const;\n    QSOFilter getFilter(const QString &filterName) const;\n\nprivate:\n    QSOFilterManager(QObject *parent = nullptr);\n\n    bool replaceFilter(const QString &filterName, const int matchingType);\n    bool insertFilterRule(const QString &filterName, const QSOFilterRule &rule);\n    bool deleteFilterRules(const QString &filterName);\n\n    bool stmtsReady;\n    QSqlQuery insertRuleStmt;\n    QSqlQuery insertFilterStmt;\n    QSqlQuery deleteFilterStmt;\n};\n\n#endif // QSOFILTERMANAGER_H\n"
  },
  {
    "path": "core/QuadKeyCache.h",
    "content": "#ifndef QLOG_CORE_QUADKEYCACHE_H\n#define QLOG_CORE_QUADKEYCACHE_H\n\n#include <QCache>\n#include <QString>\n#include <QPair>\n#include <QList>\n\ntemplate<typename Value>\nclass QuadKeyCache : public QCache<QPair<QPair<int, int>, QPair<QString, QString>>, Value>\n{\npublic:\n    using Key = QPair<QPair<int, int>, QPair<QString, QString>>;\n\n    void insert(const int keyA, const int keyB, const QString& keyC, const QString& keyD, Value* value)\n    {\n        Key key = qMakePair(qMakePair(keyA, keyB), qMakePair(keyC, keyD));\n        QCache<Key, Value>::insert(key, value);\n    }\n\n    Value* value(const int keyA, const int keyB, const QString& keyC, const QString& keyD) const\n    {\n        Key key = qMakePair(qMakePair(keyA, keyB), qMakePair(keyC, keyD));\n        return QCache<Key, Value>::object(key);\n    }\n\n    bool contains(const int keyA, const int keyB, const QString& keyC, const QString& keyD) const\n    {\n        Key key = qMakePair(qMakePair(keyA, keyB), qMakePair(keyC, keyD));\n        return QCache<Key, Value>::contains(key);\n    }\n\n    int size() const\n    {\n        return QCache<Key, Value>::size();\n    }\n\n    void invalidate(const int keyA, const int keyB)\n    {\n        QList<Key> keysToRemove;\n\n        for( const Key& key : QCache<Key, Value>::keys() )\n        {\n            if (key.first.first == keyA && key.first.second == keyB)\n                keysToRemove.append(key);\n        }\n\n        for( const Key& key : keysToRemove )\n            QCache<Key, Value>::remove(key);\n    }\n};\n\n\n#endif // QLOG_CORE_QUADKEYCACHE_H\n"
  },
  {
    "path": "core/WsjtxUDPReceiver.cpp",
    "content": "#include <QUdpSocket>\n#include <QNetworkDatagram>\n#include <QDataStream>\n#include <QSqlTableModel>\n#include <QSqlRecord>\n#include <QSqlError>\n#include <QDateTime>\n#include <QHostAddress>\n#include <QNetworkInterface>\n#include <QSqlField>\n\n#include \"WsjtxUDPReceiver.h\"\n#include \"data/Data.h\"\n#include \"debug.h\"\n#include \"data/HostsPortString.h\"\n#include \"rig/macros.h\"\n#include \"data/BandPlan.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.wsjtx\");\n\n// https://github.com/saitohirga/WSJT-X/blob/master/Network/NetworkMessage.hpp\n\nWsjtxUDPReceiver::WsjtxUDPReceiver(QObject *parent) :\n    QObject(parent),\n    socket(new QUdpSocket(this)),\n    isOutputColorCQSpotEnabled(false)\n{\n    FCT_IDENTIFICATION;\n\n    reloadSetting();\n\n    connect(socket, &QUdpSocket::readyRead, this, &WsjtxUDPReceiver::readPendingDatagrams);\n    connect(&wsjtSQLRecord, &UpdatableSQLRecord::recordReady, this, &WsjtxUDPReceiver::contactReady);\n}\n\nvoid WsjtxUDPReceiver::openPort()\n{\n    FCT_IDENTIFICATION;\n\n\n    if ( ! socket )\n    {\n        return;\n    }\n\n    if( socket->state() == QAbstractSocket::BoundState)\n    {\n        socket->close();\n    }\n\n    int newPort = getConfigPort();\n\n    qCDebug(runtime) << \"Listen port\"<< newPort;\n\n    bool multicastEnabled = getConfigMulticastJoin();\n\n    qCDebug(runtime) << (( multicastEnabled ) ? \"Multicast\" : \"Unicast\") << \"enabled\";\n\n    if ( multicastEnabled )\n    {\n        if ( ! socket->bind(QHostAddress::AnyIPv4, newPort, QUdpSocket::ShareAddress|QUdpSocket::ReuseAddressHint) )\n        {\n            qWarning() << \"Cannot bind the Port for WSJTX\";\n        }\n        else\n        {\n            QHostAddress multicastAddress = QHostAddress(getConfigMulticastAddress());\n\n            const QList<QNetworkInterface> listNetworkIF = QNetworkInterface::allInterfaces();\n\n            /* Join Multicast Group on all Multicast-capable interfaces */\n            for ( const auto &networkIF : listNetworkIF )\n            {\n                auto flags = QNetworkInterface::IsUp | QNetworkInterface::CanMulticast;\n                if ( networkIF.isValid()\n                     && (networkIF.flags() & flags) )\n                {\n                    if ( ! socket->joinMulticastGroup(multicastAddress, networkIF) )\n                    {\n                        qWarning() << \"Cannot join the Multicast address\" << networkIF.humanReadableName() << \"; Address\" << multicastAddress;;\n                    }\n                    else\n                    {\n                        qCDebug(runtime) << \"Joined interface: \" << networkIF.humanReadableName() << \"; Address\" << multicastAddress;\n                    }\n                }\n            }\n\n            socket->setSocketOption(QAbstractSocket::MulticastTtlOption, getConfigMulticastTTL());\n        }\n    }\n    else\n    {\n        if ( ! socket->bind(QHostAddress::Any, newPort) )\n        {\n            qWarning() << \"Cannot bind the Port for WSJTX\";\n        }\n        else\n        {\n            qCDebug(runtime) << \"Listening on all interfaces\";\n        }\n    }\n}\n\nvoid WsjtxUDPReceiver::forwardDatagram(const QNetworkDatagram &datagram)\n{\n    FCT_IDENTIFICATION;\n\n    HostsPortString forwardAddresses(getConfigForwardAddresses());\n\n    const QList<HostPortAddress> &addrList = forwardAddresses.getAddrList();\n\n    for ( const HostPortAddress &addr : addrList )\n    {\n        QUdpSocket udpSocket;\n\n        qCDebug(runtime) << \"Sending to \" << addr;\n        udpSocket.writeDatagram(datagram.data(), addr, addr.getPort());\n    }\n}\n\nfloat WsjtxUDPReceiver::modePeriodLength(const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    float ret = 60;\n\n    qCDebug(function_parameters) << mode;\n\n    if ( mode == \"FST4\"\n         || mode == \"FT8\"\n         || mode == \"MSK144\" )\n    {\n        ret = 15;\n    }\n    else if ( mode == \"FT4\" )\n    {\n        ret = 7.5;\n    }\n    else if ( mode == \"FT2\" )\n    {\n        ret = 3.8;\n    }\n    else if ( mode == \"JT4\"\n              || mode == \"JT9\"\n              || mode.contains(\"JT65\")\n              || mode == \"QRA64\"\n              || mode == \"ISCAT\" )\n    {\n        ret = 60;\n    }\n    else if ( mode == \"FST4W\"\n              || mode == \"WSPR\" )\n    {\n        ret = 120;\n    }\n\n    qCDebug(runtime) << \"Period: \" << ret;\n\n    return ret;\n}\n\nquint16 WsjtxUDPReceiver::getConfigPort()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkWsjtxListenerPort(WsjtxUDPReceiver::DEFAULT_PORT);\n}\n\nvoid WsjtxUDPReceiver::saveConfigPort(quint16 port)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkNotifRigStateAddrs(port);\n}\n\nQString WsjtxUDPReceiver::getConfigForwardAddresses()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkWsjtxForwardAddrs();\n}\n\nvoid WsjtxUDPReceiver::saveConfigForwardAddresses(const QString &addresses)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkWsjtxForwardAddrs(addresses);\n}\n\nvoid WsjtxUDPReceiver::saveConfigMulticastJoin(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkWsjtxListenerJoinMulticast(state);\n}\n\nbool WsjtxUDPReceiver::getConfigMulticastJoin()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkWsjtxListenerJoinMulticast();\n}\n\nvoid WsjtxUDPReceiver::saveConfigMulticastAddress(const QString &addr)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkWsjtxListenerMulticastAddr(addr);\n}\n\nQString WsjtxUDPReceiver::getConfigMulticastAddress()\n{\n    FCT_IDENTIFICATION;    \n\n    return LogParam::getNetworkWsjtxListenerMulticastAddr();\n}\n\nvoid WsjtxUDPReceiver::saveConfigMulticastTTL(int ttl)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNetworkWsjtxListenerMulticastTTL(ttl);\n}\n\nint WsjtxUDPReceiver::getConfigMulticastTTL()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getNetworkWsjtxListenerMulticastTTL();\n}\n\nbool WsjtxUDPReceiver::getConfigOutputColorCQSpot()\n{\n    return LogParam::getWsjtxOutputColorCQSpot();\n}\n\nvoid WsjtxUDPReceiver::saveConfigOutputColorCQSpot(bool status)\n{\n    LogParam::setWsjtxOutputColorCQSpot(status);\n}\n\nvoid WsjtxUDPReceiver::readPendingDatagrams()\n{\n    FCT_IDENTIFICATION;\n\n    while (socket->hasPendingDatagrams()) {\n        QNetworkDatagram datagram = socket->receiveDatagram();\n\n        /* remember WSJT receiving address becuase WSJT does not listen multicast address\n         * but only UDP address. Therefore the command must be sent via UDP unicast */\n        wsjtxAddress = datagram.senderAddress();\n        wsjtxPort = datagram.senderPort();\n\n        qCDebug(runtime) << \"Received from\" << wsjtxAddress;\n\n        QDataStream stream(datagram.data());\n\n        quint32 magic, schema, mtype;\n        stream >> magic;\n        stream >> schema;\n        stream >> mtype;\n\n        if (magic != 0xadbccbda) {\n            qCDebug(runtime) << \"Invalid wsjtx magic\";\n            continue;\n        }\n\n        qCDebug(runtime) << \"WSJT mtype << \"<< mtype << \" schema \" << schema;\n\n        forwardDatagram(datagram);\n\n        switch (mtype) {\n        /* WSJTX Status message */\n        case 1: {\n            QByteArray id, mode, tx_mode, sub_mode, report, dx_call, dx_grid, de_call, de_grid, conf_name, tx_message;\n            WsjtxStatus status;\n\n\n            stream >> id >> status.dial_freq >> mode >> dx_call >> report >> tx_mode;\n            stream >> status.tx_enabled >> status.transmitting >> status.decoding;\n            stream >> status.rx_df >> status.tx_df >> de_call >> de_grid >> dx_grid;\n            stream >> status.tx_watchdog >> sub_mode >> status.fast_mode >> status.special_op_mode >> status.freq_tolerance;\n            stream >> status.tr_period >> conf_name >> tx_message;\n\n            status.id = QString(id);\n            status.mode = QString(mode);\n            status.tx_mode = QString(mode);\n            status.sub_mode = QString(sub_mode);\n            status.report = QString(report);\n            status.dx_call = QString(dx_call);\n            status.dx_grid = QString(dx_grid);\n            status.de_call = QString(de_call);\n            status.de_grid = QString(de_grid);\n            status.conf_name = QString(conf_name);\n            status.tx_message = QString(tx_message);\n\n            qCDebug(runtime)<<status;\n\n            emit statusReceived(status);\n            break;\n        }\n        /* WSJTX Decode message */\n        case 2: {\n            QByteArray id, mode, message;\n            WsjtxDecode decode;\n\n            stream >> id >> decode.is_new >> decode.time >> decode.snr >> decode.dt >> decode.df;\n            stream >> mode >> message >> decode.low_confidence >> decode.off_air;\n\n            decode.id = QString(id);\n            decode.mode = QString(mode);\n            decode.message = QString(message);\n\n#if 0\n            if ( isJTDXId(decode.id) )\n            {\n                /* It's a workaround for JTDX only.\n                 * JTDX sends the time without a time zone. Which is\n                 * interpreted by QLog as time in the local zone and\n                 * it is therefore recalculated, incorrectly, to UTC.\n                 * Therefore it is needed to add timezone to date information\n                 * received from JTDX\n                 */\n                // it is not needed to convert it here?\n            }\n#endif\n            qCDebug(runtime) << decode;\n\n            emit decodeReceived(decode);\n            break;\n        }\n        /* WSJTX Log message */\n        case 5: {\n            QByteArray id, dx_call, dx_grid, mode, rprt_sent, rprt_rcvd, tx_pwr, comments;\n            QByteArray name, op_call, my_call, my_grid, exch_sent, exch_rcvd, prop_mode;\n            WsjtxLog log;\n\n            stream >> id >> log.time_off >> dx_call >> dx_grid >> log.tx_freq >> mode >> rprt_sent;\n            stream >> rprt_rcvd >> tx_pwr >> comments >> name >> log.time_on >> op_call;\n            stream >> my_call >> my_grid >> exch_sent >> exch_rcvd >> prop_mode;\n\n            log.id = QString(id);\n            log.dx_call = QString(dx_call).toUpper();\n            log.dx_grid = QString(dx_grid).toUpper();\n            log.mode = QString(mode);\n            log.rprt_sent = QString(rprt_sent);\n            log.rprt_rcvd = QString(rprt_rcvd);\n            log.tx_pwr = QString(tx_pwr);\n            log.comments = QString(comments);\n            log.name = QString(name);\n            log.op_call = QString(op_call).toUpper();\n            log.my_call = QString(my_call).toUpper();\n            log.my_grid = QString(my_grid).toUpper();\n            log.exch_sent = QString(exch_sent);\n            log.exch_rcvd = QString(exch_rcvd);\n            log.prop_mode = QString(prop_mode);\n\n            if ( isJTDXId(log.id) )\n            {\n                /* It's a workaround for JTDX only.\n                 * JTDX sends the time without a time zone. Which is\n                 * interpreted by QLog as time in the local zone and\n                 * it is therefore recalculated, incorrectly, to UTC.\n                 * Therefore it is needed to add timezone to date information\n                 * received from JTDX\n                 */\n                qCDebug(runtime) << \"JTDX detected - adding Timezone information\";\n                log.time_on.setTimeZone(QTimeZone::utc());\n                log.time_off.setTimeZone(QTimeZone::utc());\n            }\n            qCDebug(runtime) << log;\n\n            insertContact(log);\n            break;\n        }\n        /* WSJTX LogADIF message */\n        case 12: {\n            QByteArray id, adif_text;\n            WsjtxLogADIF log;\n\n            const QString data = datagram.data();\n\n            if ( isCSNSat(data) )\n            {\n                id = \"CSN Sat\";\n                int index = data.indexOf(\"<adif_ver:\");\n                if ( index != -1 )\n                    adif_text = data.mid(index).toUtf8();\n                else\n                    adif_text.clear();\n            }\n            else\n                stream >> id >> adif_text;\n\n            log.id = QString(id);\n            log.log_adif = QString(adif_text);\n\n            insertContact(log);\n            break;\n        }\n        }\n    }\n}\n\nvoid WsjtxUDPReceiver::insertContact(WsjtxLog log)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << log;\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    model.removeColumn(model.fieldIndex(\"id\"));\n\n    QSqlRecord record = model.record(0);\n\n    double freq = Hz2MHz(static_cast<double>(log.tx_freq));\n\n    record.setValue(\"freq\", freq);\n    record.setValue(\"band\", BandPlan::freq2Band(freq).name);\n\n    /* if field is empty then do not initialize it, leave it NULL\n     * for database */\n    if ( !log.dx_call.isEmpty() )\n    {\n        record.setValue(\"callsign\", log.dx_call);\n    }\n\n    if ( !log.rprt_rcvd.isEmpty() )\n    {\n        record.setValue(\"rst_rcvd\", log.rprt_rcvd);\n    }\n\n    if ( !log.rprt_sent.isEmpty() )\n    {\n        record.setValue(\"rst_sent\", log.rprt_sent);\n    }\n\n    if ( !log.name.isEmpty() )\n    {\n        record.setValue(\"name\", Data::removeAccents(log.name));\n        record.setValue(\"name_intl\", log.name);\n    }\n\n    if ( !log.dx_grid.isEmpty() )\n    {\n        record.setValue(\"gridsquare\", log.dx_grid);\n    }\n\n    if ( !log.mode.isEmpty() )\n    {\n        QString mode = log.mode.toUpper();\n        QString submode;\n\n        QPair<QString, QString> legacy = Data::instance()->legacyMode(mode);\n\n        if ( !legacy.first.isEmpty() )\n        {\n            mode = legacy.first;\n            submode = legacy.second;\n        }\n\n        record.setValue(\"mode\", mode);\n        record.setValue(\"submode\", submode);\n    }\n\n    if ( log.time_on.isValid() )\n    {\n        record.setValue(\"start_time\", log.time_on);\n    }\n\n    if ( log.time_off.isValid() )\n    {\n        record.setValue(\"end_time\", log.time_off);\n    }\n\n    if ( !log.comments.isEmpty() )\n    {\n        record.setValue(\"comment\", Data::removeAccents(log.comments));\n        record.setValue(\"comment_intl\", log.comments);\n    }\n\n    if ( !log.exch_sent.isEmpty() )\n    {\n        record.setValue(\"stx_string\", log.exch_sent);\n    }\n\n    if ( !log.exch_rcvd.isEmpty() )\n    {\n        record.setValue(\"srx_string\", log.exch_rcvd);\n    }\n\n    if ( !log.prop_mode.isEmpty() )\n    {\n        record.setValue(\"prop_mode\", log.prop_mode);\n    }\n\n    if ( !log.tx_pwr.isEmpty() )\n    {\n        record.setValue(\"tx_pwr\", log.tx_pwr);\n    }\n\n    if ( !log.op_call.isEmpty() )\n    {\n        record.setValue(\"operator\", Data::removeAccents(log.op_call));\n    }\n\n    if ( !log.my_grid.isEmpty() )\n    {\n        record.setValue(\"my_gridsquare\", log.my_grid);\n    }\n\n    if ( !log.my_call.isEmpty() )\n    {\n        record.setValue(\"station_callsign\", log.my_call);\n    }\n\n    // The QSO record can be received in two formats from WSJTX (raw and ADIF).\n    // Therefore, it is necessary to save the first record and possibly update it\n    // with the second record and then emit the result.\n    // For this we create an updatable SQLRecord\n    wsjtSQLRecord.updateRecord(record);\n    //emit addContact(record);\n}\n\nvoid WsjtxUDPReceiver::contactReady(QSqlRecord record)\n{\n    FCT_IDENTIFICATION;\n\n    emit addContact(record);\n}\n\nvoid WsjtxUDPReceiver::insertContact(WsjtxLogADIF log)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << log;\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    model.removeColumn(model.fieldIndex(\"id\"));\n\n    QSqlRecord record = model.record(0);\n\n    QTextStream in(&log.log_adif);\n    AdiFormat adif(in);\n\n    adif.importNext(record);\n\n    // the values ​​listed below have default values ​​defined in ADIF.\n    // These are set to N. However, WSJTX and other apps do not send\n    // these fields, which means that all records would be set to N - do not send.\n    // It is unacceptable. So this piece of code deletes these defaults so that\n    // in NewContact these values ​​are set from the values ​​in the GUI.\n    // There is a risk that some clone will start sending these values ​​as well.\n    // In this case, it will have to be handled differently. Currently it is OK\n    record.remove(record.indexOf(\"qsl_sent\"));\n    record.remove(record.indexOf(\"lotw_qsl_sent\"));\n    record.remove(record.indexOf(\"eqsl_qsl_sent\"));\n\n    // The QSO record can be received in two formats from WSJTX (raw and ADIF).\n    // Therefore, it is necessary to save the first record and possibly update it\n    // with the second record and then emit the result.\n    // For this we create an updatable SQLRecord\n    wsjtSQLRecord.updateRecord(record);\n    //emit addContact(record);\n}\n\nvoid WsjtxUDPReceiver::sendReply(const WsjtxEntry &entry)\n{\n    FCT_IDENTIFICATION;\n\n    const WsjtxDecode &decode = entry.decode;\n    qCDebug(function_parameters) << decode;\n\n    if (!socket) return;\n\n    /* sending to WSJT to UDP address, not multicast address because\n     * WSJTX does not listen multicast address */\n    qCDebug(runtime) << \"Sending to\" << wsjtxAddress;\n\n    QByteArray data;\n    QDataStream stream(&data, QIODevice::ReadWrite);\n    stream.setVersion(QDataStream::Qt_5_4); // UDP_DEFAULT_SCHEMA_VERSION 3\n\n    stream << UDP_MAGIC_NUMBER;\n    stream << UDP_DEFAULT_SCHEMA_VERSION;\n\n    /*\n     * from WSJTX: Network/NetworkMessage.hpp\n     * Reply         In        4                      quint32\n     *                         Id (target unique key) utf8\n     *                         Time                   QTime\n     *                         snr                    qint32\n     *                         Delta time (S)         float (serialized as double)\n     *                         Delta frequency (Hz)   quint32\n     *                         Mode                   utf8\n     *                         Message                utf8\n     *                         Low confidence         bool\n     *                         Modifiers              quint8\n     *\n     *  In order for a server  to provide a useful cooperative service\n     *  to WSJT-X it  is possible for it to initiate  a QSO by sending\n     *  this message to a client. WSJT-X filters this message and only\n     *  acts upon it  if the message exactly describes  a prior decode\n     *  and that decode  is a CQ or QRZ message.   The action taken is\n     *  exactly equivalent to the user  double clicking the message in\n     *  the \"Band activity\" window. The  intent of this message is for\n     *  servers to be able to provide an advanced look up of potential\n     *  QSO partners, for example determining if they have been worked\n     *  before  or if  working them  may advance  some objective  like\n     *  award progress.  The  intention is not to  provide a secondary\n     *  user  interface for  WSJT-X,  it is  expected  that after  QSO\n     *  initiation the rest  of the QSO is carried  out manually using\n     *  the normal WSJT-X user interface.\n     *\n     *  The  Modifiers   field  allows  the  equivalent   of  keyboard\n     *  modifiers to be sent \"as if\" those modifier keys where pressed\n     *  while  double-clicking  the  specified  decoded  message.  The\n     *  modifier values (hexadecimal) are as follows:\n     *\n     *          no modifier     0x00\n     *          SHIFT           0x02\n     *          CTRL            0x04  CMD on Mac\n     *          ALT             0x08\n     *          META            0x10  Windows key on MS Windows\n     *          KEYPAD          0x20  Keypad or arrows\n     *          Group switch    0x40  X11 only\n     */\n\n    stream << UDP_COMMANDS::REPLY_CMD;\n    stream << decode.id.toUtf8();\n    stream << decode.time;\n    stream << decode.snr;\n    stream << decode.dt;\n    stream << decode.df;\n    stream << decode.mode.toUtf8();\n    stream << decode.message.toUtf8();\n    stream << decode.low_confidence;\n    stream << quint8(0);\n\n    socket->writeDatagram(data, wsjtxAddress, wsjtxPort);\n}\n\nvoid WsjtxUDPReceiver::sendHighlightCallsign(const WsjtxEntry &entry)\n{\n    FCT_IDENTIFICATION;\n\n    // QColor() means that WSJTX clears the color\n    sendHighlightCallsignColor(entry, Qt::black, Data::statusToColor(entry.status, false, QColor()));\n}\n\nvoid WsjtxUDPReceiver::sendClearHighlightCallsign(const WsjtxEntry &entry)\n{\n    FCT_IDENTIFICATION;\n\n    // QColor() means that WSJTX clears the color\n    sendHighlightCallsignColor(entry, QColor(), QColor());\n}\n\nvoid WsjtxUDPReceiver::sendClearAllHighlightCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    WsjtxEntry tmp;\n    tmp.callsign = \"CLEARALL!\";\n    sendHighlightCallsignColor(tmp, QColor(), QColor(), false);\n}\n\nvoid WsjtxUDPReceiver::sendHighlightCallsignColor(const WsjtxEntry &entry,\n                                                  const QColor &fgColor,\n                                                  const QColor &bgColor,\n                                                  bool highlightLast)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !socket ) return;\n\n    if ( !isOutputColorCQSpotEnabled )\n    {\n        qCDebug(runtime) << \"HighlightCallsign is disabled\";\n        return;\n    }\n\n    const WsjtxDecode &decode = entry.decode;\n\n    qCDebug(function_parameters) << decode << fgColor << bgColor << highlightLast;\n\n    /* sending to WSJT to UDP address, not multicast address because\n     * WSJTX does not listen multicast address */\n    qCDebug(runtime) << \"Sending to\" << wsjtxAddress;\n\n    QByteArray data;\n    QDataStream out(&data, QIODevice::WriteOnly);\n    out.setVersion(QDataStream::Qt_5_4); // UDP_DEFAULT_SCHEMA_VERSION 3\n\n    out << UDP_MAGIC_NUMBER;\n    out << UDP_DEFAULT_SCHEMA_VERSION;\n    /*\n     * from WSJTX: Network/NetworkMessage.hpp\n     * Highlight Callsign In  13                     quint32\n     *                        Id (unique key)        utf8\n     *                        Callsign               utf8\n     *                        Background Color       QColor\n     *                        Foreground Color       QColor\n     *                        Highlight last         bool\n     *\n     *  The server  may send  this message at  any time.   The message\n     *  specifies  the background  and foreground  color that  will be\n     *  used  to  highlight  the  specified callsign  in  the  decoded\n     *  messages  printed  in the  Band  Activity  panel.  The  WSJT-X\n     *  clients maintain a list of such instructions and apply them to\n     *  all decoded  messages in the  band activity window.   To clear\n     *  and  cancel  highlighting send  an  invalid  QColor value  for\n     *  either or both  of the background and  foreground fields. When\n     *  using  this mode  the  total number  of callsign  highlighting\n     *  requests should be limited otherwise the performance of WSJT-X\n     *  decoding may be  impacted. A rough rule of thumb  might be too\n     *  limit the  number of active  highlighting requests to  no more\n     *  than 100.\n     *\n     *  Using a callsign of \"CLEARALL!\" and anything for the\n     *  color values will clear the internal highlighting data. It will\n     *  NOT remove the highlighting on the screen, however. The exclamation\n     *  symbol is used to avoid accidental clearing of all highlighting\n     *  data via a decoded callsign, since an exclamation symbol is not\n     *  a valid character in a callsign.\n     *\n     *  The \"Highlight last\"  field allows the sender  to request that\n     *  all instances of  \"Callsign\" in the last  period only, instead\n     *  of all instances in all periods, be highlighted.\n     */\n\n    out << UDP_COMMANDS::HIGHLIGHT_CALLSIGN_CMD;\n    out << decode.id.toUtf8();\n    out << entry.callsign.toUtf8();\n    out << bgColor; // Background Color\n    out << fgColor; // Foreground Color\n    out << true;    // Highlight last\n\n    socket->writeDatagram(data, wsjtxAddress, wsjtxPort);\n}\n\n\nvoid WsjtxUDPReceiver::reloadSetting()\n{\n    FCT_IDENTIFICATION;\n    openPort();\n    isOutputColorCQSpotEnabled = getConfigOutputColorCQSpot();\n}\n"
  },
  {
    "path": "core/WsjtxUDPReceiver.h",
    "content": "#ifndef QLOG_CORE_WSJTXUDPRECEIVER_H\n#define QLOG_CORE_WSJTXUDPRECEIVER_H\n\n#include <QObject>\n#include <QDateTime>\n#include <QHostAddress>\n#include <QSqlRecord>\n#include <QNetworkDatagram>\n\n#include \"data/UpdatableSQLRecord.h\"\n#include \"data/WsjtxStatus.h\"\n#include \"data/WsjtxDecode.h\"\n#include \"data/WsjtxLog.h\"\n#include \"data/WsjtxLogADIF.h\"\n#include \"data/WsjtxEntry.h\"\n\nclass Data;\nclass QUdpSocket;\n\nclass WsjtxUDPReceiver : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit WsjtxUDPReceiver(QObject *parent = nullptr);\n    static float modePeriodLength(const QString &);\n\n    static quint16 getConfigPort();\n    static void saveConfigPort(quint16);\n    static QString getConfigForwardAddresses();\n    static void saveConfigForwardAddresses(const QString &);\n    static void saveConfigMulticastJoin(bool);\n    static bool getConfigMulticastJoin();\n    static void saveConfigMulticastAddress(const QString &);\n    static QString getConfigMulticastAddress();\n    static void saveConfigMulticastTTL(int);\n    static int getConfigMulticastTTL();\n    static bool getConfigOutputColorCQSpot();\n    static void saveConfigOutputColorCQSpot(bool);\n\n    // identification of different variants of the WSJTX protocol based on packet ID\n    static bool isJTDXId(const QString &id)\n    {\n        return id.contains(\"JTDX\");\n    }\n    static bool isWriteLogId(const QString &id)\n    {\n        return id.contains(\"WRITELOG\");\n    }\n    static bool isCSNSat(const QString &data)\n    {\n        return data.contains(\"<programid:6>CSN Sat\");\n    }\n\nsignals:\n    void statusReceived(WsjtxStatus);\n    void decodeReceived(WsjtxDecode);\n    void addContact(QSqlRecord);\n\npublic slots:\n    void sendReply(const WsjtxEntry&);\n    void sendHighlightCallsign(const WsjtxEntry&);\n    void sendClearHighlightCallsign(const WsjtxEntry&);\n    void sendClearAllHighlightCallsign();\n    void reloadSetting();\n\nprivate slots:\n    void readPendingDatagrams();\n    void insertContact(WsjtxLog log);\n    void contactReady(QSqlRecord record);\n    void insertContact(WsjtxLogADIF log);\n\nprivate:\n    QUdpSocket* socket;\n    QHostAddress wsjtxAddress;\n    quint16 wsjtxPort;\n    bool isOutputColorCQSpotEnabled;\n    UpdatableSQLRecord wsjtSQLRecord;\n\n    static const int DEFAULT_PORT = 2237;\n    const quint32 UDP_MAGIC_NUMBER = 0xadbccbda;\n    const quint32 UDP_DEFAULT_SCHEMA_VERSION = 3;\n    enum UDP_COMMANDS\n    {\n        REPLY_CMD = quint32(4),\n        HIGHLIGHT_CALLSIGN_CMD = quint32(13),\n    };\n\n    void openPort();\n    void forwardDatagram(const QNetworkDatagram &);\n    void sendHighlightCallsignColor(const WsjtxEntry &entry,\n                                    const QColor &fgColor,\n                                    const QColor &bgColor,\n                                    bool highlightLast = true);\n};\n\n#endif // QLOG_CORE_WSJTXUDPRECEIVER_H\n"
  },
  {
    "path": "core/csv.hpp",
    "content": "#pragma once\n/*\nCSV for C++, version 3.4.0\nhttps://github.com/vincentlaucsb/csv-parser\n\nMIT License\n\nCopyright (c) 2017-2026 Vincent La\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n*/\n\n#ifndef CSV_HPP\n#define CSV_HPP\n\n\n#include <algorithm>\n#include <functional>\n#include <iterator>\n#include <memory>\n#include <stdexcept>\n#include <string>\n#include <type_traits>\n#include <unordered_map>\n#include <utility>\n#include <vector>\n\n/** @file\n *  @brief Defines functionality needed for basic CSV parsing\n */\n\n\n#include <algorithm>\n#include <deque>\n#include <exception>\n#include <fstream>\n#include <iterator>\n#include <memory>\n#include <sstream>\n#include <string>\n#include <vector>\n\n#if !defined(CSV_ENABLE_THREADS) || CSV_ENABLE_THREADS\n#include <mutex>\n#include <thread>\n#endif\n\n/** @file\n *  @brief Contains the main CSV parsing algorithm and various utility functions\n */\n\n#include <algorithm>\n#include <array>\n#include <fstream>\n#include <memory>\n#include <unordered_map>\n#include <unordered_set>\n#include <vector>\n\n#if !defined(__EMSCRIPTEN__)\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n /* csv-parser local note:\n  *\n  * This vendored mio.hpp includes a minimal Windows-specific narrowing fix in\n  * int64_high/int64_low to avoid -Wconversion failures under strict MinGW builds.\n  * Keep this patch small and easy to rebase if/when upstream is updated.\n  * \n  * - Vincent La 3/31/2026\n  */\n\n#ifndef MIO_MMAP_HEADER\n#define MIO_MMAP_HEADER\n\n// #include \"mio/page.hpp\"\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef MIO_PAGE_HEADER\n#define MIO_PAGE_HEADER\n\n#ifdef _WIN32\n# include <windows.h>\n#else\n# include <unistd.h>\n#endif\n\nnamespace mio {\n\n/**\n * This is used by `basic_mmap` to determine whether to create a read-only or\n * a read-write memory mapping.\n */\nenum class access_mode\n{\n    read,\n    write\n};\n\n/**\n * Determines the operating system's page allocation granularity.\n *\n * On the first call to this function, it invokes the operating system specific syscall\n * to determine the page size, caches the value, and returns it. Any subsequent call to\n * this function serves the cached value, so no further syscalls are made.\n */\ninline size_t page_size()\n{\n    static const size_t page_size = []\n    {\n#ifdef _WIN32\n        SYSTEM_INFO SystemInfo;\n        GetSystemInfo(&SystemInfo);\n        return SystemInfo.dwAllocationGranularity;\n#else\n        return sysconf(_SC_PAGE_SIZE);\n#endif\n    }();\n    return page_size;\n}\n\n/**\n * Alligns `offset` to the operating's system page size such that it subtracts the\n * difference until the nearest page boundary before `offset`, or does nothing if\n * `offset` is already page aligned.\n */\ninline size_t make_offset_page_aligned(size_t offset) noexcept\n{\n    const size_t page_size_ = page_size();\n    // Use integer division to round down to the nearest page alignment.\n    return offset / page_size_ * page_size_;\n}\n\n} // namespace mio\n\n#endif // MIO_PAGE_HEADER\n\n\n#include <iterator>\n#include <string>\n#include <system_error>\n#include <cstdint>\n\n#ifdef _WIN32\n# ifndef WIN32_LEAN_AND_MEAN\n#  define WIN32_LEAN_AND_MEAN\n# endif // WIN32_LEAN_AND_MEAN\n# include <windows.h>\n#else // ifdef _WIN32\n# define INVALID_HANDLE_VALUE -1\n#endif // ifdef _WIN32\n\nnamespace mio {\n\n// This value may be provided as the `length` parameter to the constructor or\n// `map`, in which case a memory mapping of the entire file is created.\nenum { map_entire_file = 0 };\n\n#ifdef _WIN32\nusing file_handle_type = HANDLE;\n#else\nusing file_handle_type = int;\n#endif\n\n// This value represents an invalid file handle type. This can be used to\n// determine whether `basic_mmap::file_handle` is valid, for example.\nconst static file_handle_type invalid_handle = INVALID_HANDLE_VALUE;\n\ntemplate<access_mode AccessMode, typename ByteT>\nstruct basic_mmap\n{\n    using value_type = ByteT;\n    using size_type = size_t;\n    using reference = value_type&;\n    using const_reference = const value_type&;\n    using pointer = value_type*;\n    using const_pointer = const value_type*;\n    using difference_type = std::ptrdiff_t;\n    using iterator = pointer;\n    using const_iterator = const_pointer;\n    using reverse_iterator = std::reverse_iterator<iterator>;\n    using const_reverse_iterator = std::reverse_iterator<const_iterator>;\n    using iterator_category = std::random_access_iterator_tag;\n    using handle_type = file_handle_type;\n\n    static_assert(sizeof(ByteT) == sizeof(char), \"ByteT must be the same size as char.\");\n\nprivate:\n    // Points to the first requested byte, and not to the actual start of the mapping.\n    pointer data_ = nullptr;\n\n    // Length--in bytes--requested by user (which may not be the length of the\n    // full mapping) and the length of the full mapping.\n    size_type length_ = 0;\n    size_type mapped_length_ = 0;\n\n    // Letting user map a file using both an existing file handle and a path\n    // introcudes some complexity (see `is_handle_internal_`).\n    // On POSIX, we only need a file handle to create a mapping, while on\n    // Windows systems the file handle is necessary to retrieve a file mapping\n    // handle, but any subsequent operations on the mapped region must be done\n    // through the latter.\n    handle_type file_handle_ = INVALID_HANDLE_VALUE;\n#ifdef _WIN32\n    handle_type file_mapping_handle_ = INVALID_HANDLE_VALUE;\n#endif\n\n    // Letting user map a file using both an existing file handle and a path\n    // introcudes some complexity in that we must not close the file handle if\n    // user provided it, but we must close it if we obtained it using the\n    // provided path. For this reason, this flag is used to determine when to\n    // close `file_handle_`.\n    bool is_handle_internal_;\n\npublic:\n    /**\n     * The default constructed mmap object is in a non-mapped state, that is,\n     * any operation that attempts to access nonexistent underlying data will\n     * result in undefined behaviour/segmentation faults.\n     */\n    basic_mmap() = default;\n\n#ifdef __cpp_exceptions\n    /**\n     * The same as invoking the `map` function, except any error that may occur\n     * while establishing the mapping is wrapped in a `std::system_error` and is\n     * thrown.\n     */\n    template<typename String>\n    basic_mmap(const String& path, const size_type offset = 0, const size_type length = map_entire_file)\n    {\n        std::error_code error;\n        map(path, offset, length, error);\n        if(error) { throw std::system_error(error); }\n    }\n\n    /**\n     * The same as invoking the `map` function, except any error that may occur\n     * while establishing the mapping is wrapped in a `std::system_error` and is\n     * thrown.\n     */\n    basic_mmap(const handle_type handle, const size_type offset = 0, const size_type length = map_entire_file)\n    {\n        std::error_code error;\n        map(handle, offset, length, error);\n        if(error) { throw std::system_error(error); }\n    }\n#endif // __cpp_exceptions\n\n    /**\n     * `basic_mmap` has single-ownership semantics, so transferring ownership\n     * may only be accomplished by moving the object.\n     */\n    basic_mmap(const basic_mmap&) = delete;\n    basic_mmap(basic_mmap&&);\n    basic_mmap& operator=(const basic_mmap&) = delete;\n    basic_mmap& operator=(basic_mmap&&);\n\n    /**\n     * If this is a read-write mapping, the destructor invokes sync. Regardless\n     * of the access mode, unmap is invoked as a final step.\n     */\n    ~basic_mmap();\n\n    /**\n     * On UNIX systems 'file_handle' and 'mapping_handle' are the same. On Windows,\n     * however, a mapped region of a file gets its own handle, which is returned by\n     * 'mapping_handle'.\n     */\n    handle_type file_handle() const noexcept { return file_handle_; }\n    handle_type mapping_handle() const noexcept;\n\n    /** Returns whether a valid memory mapping has been created. */\n    bool is_open() const noexcept { return file_handle_ != invalid_handle; }\n\n    /**\n     * Returns true if no mapping was established, that is, conceptually the\n     * same as though the length that was mapped was 0. This function is\n     * provided so that this class has Container semantics.\n     */\n    bool empty() const noexcept { return length() == 0; }\n\n    /** Returns true if a mapping was established. */\n    bool is_mapped() const noexcept;\n\n    /**\n     * `size` and `length` both return the logical length, i.e. the number of bytes\n     * user requested to be mapped, while `mapped_length` returns the actual number of\n     * bytes that were mapped which is a multiple of the underlying operating system's\n     * page allocation granularity.\n     */\n    size_type size() const noexcept { return length(); }\n    size_type length() const noexcept { return length_; }\n    size_type mapped_length() const noexcept { return mapped_length_; }\n\n    /** Returns the offset relative to the start of the mapping. */\n    size_type mapping_offset() const noexcept\n    {\n        return mapped_length_ - length_;\n    }\n\n    /**\n     * Returns a pointer to the first requested byte, or `nullptr` if no memory mapping\n     * exists.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > pointer data() noexcept { return data_; }\n    const_pointer data() const noexcept { return data_; }\n\n    /**\n     * Returns an iterator to the first requested byte, if a valid memory mapping\n     * exists, otherwise this function call is undefined behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > iterator begin() noexcept { return data(); }\n    const_iterator begin() const noexcept { return data(); }\n    const_iterator cbegin() const noexcept { return data(); }\n\n    /**\n     * Returns an iterator one past the last requested byte, if a valid memory mapping\n     * exists, otherwise this function call is undefined behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > iterator end() noexcept { return data() + length(); }\n    const_iterator end() const noexcept { return data() + length(); }\n    const_iterator cend() const noexcept { return data() + length(); }\n\n    /**\n     * Returns a reverse iterator to the last memory mapped byte, if a valid\n     * memory mapping exists, otherwise this function call is undefined\n     * behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > reverse_iterator rbegin() noexcept { return reverse_iterator(end()); }\n    const_reverse_iterator rbegin() const noexcept\n    { return const_reverse_iterator(end()); }\n    const_reverse_iterator crbegin() const noexcept\n    { return const_reverse_iterator(end()); }\n\n    /**\n     * Returns a reverse iterator past the first mapped byte, if a valid memory\n     * mapping exists, otherwise this function call is undefined behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > reverse_iterator rend() noexcept { return reverse_iterator(begin()); }\n    const_reverse_iterator rend() const noexcept\n    { return const_reverse_iterator(begin()); }\n    const_reverse_iterator crend() const noexcept\n    { return const_reverse_iterator(begin()); }\n\n    /**\n     * Returns a reference to the `i`th byte from the first requested byte (as returned\n     * by `data`). If this is invoked when no valid memory mapping has been created\n     * prior to this call, undefined behaviour ensues.\n     */\n    reference operator[](const size_type i) noexcept { return data_[i]; }\n    const_reference operator[](const size_type i) const noexcept { return data_[i]; }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `path`, which must be a path to an existing file, is used to retrieve a file\n     * handle (which is closed when the object destructs or `unmap` is called), which is\n     * then used to memory map the requested region. Upon failure, `error` is set to\n     * indicate the reason and the object remains in an unmapped state.\n     *\n     * `offset` is the number of bytes, relative to the start of the file, where the\n     * mapping should begin. When specifying it, there is no need to worry about\n     * providing a value that is aligned with the operating system's page allocation\n     * granularity. This is adjusted by the implementation such that the first requested\n     * byte (as returned by `data` or `begin`), so long as `offset` is valid, will be at\n     * `offset` from the start of the file.\n     *\n     * `length` is the number of bytes to map. It may be `map_entire_file`, in which\n     * case a mapping of the entire file is created.\n     */\n    template<typename String>\n    void map(const String& path, const size_type offset,\n            const size_type length, std::error_code& error);\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `path`, which must be a path to an existing file, is used to retrieve a file\n     * handle (which is closed when the object destructs or `unmap` is called), which is\n     * then used to memory map the requested region. Upon failure, `error` is set to\n     * indicate the reason and the object remains in an unmapped state.\n     * \n     * The entire file is mapped.\n     */\n    template<typename String>\n    void map(const String& path, std::error_code& error)\n    {\n        map(path, 0, map_entire_file, error);\n    }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is\n     * unsuccesful, the reason is reported via `error` and the object remains in\n     * a state as if this function hadn't been called.\n     *\n     * `handle`, which must be a valid file handle, which is used to memory map the\n     * requested region. Upon failure, `error` is set to indicate the reason and the\n     * object remains in an unmapped state.\n     *\n     * `offset` is the number of bytes, relative to the start of the file, where the\n     * mapping should begin. When specifying it, there is no need to worry about\n     * providing a value that is aligned with the operating system's page allocation\n     * granularity. This is adjusted by the implementation such that the first requested\n     * byte (as returned by `data` or `begin`), so long as `offset` is valid, will be at\n     * `offset` from the start of the file.\n     *\n     * `length` is the number of bytes to map. It may be `map_entire_file`, in which\n     * case a mapping of the entire file is created.\n     */\n    void map(const handle_type handle, const size_type offset,\n            const size_type length, std::error_code& error);\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is\n     * unsuccesful, the reason is reported via `error` and the object remains in\n     * a state as if this function hadn't been called.\n     *\n     * `handle`, which must be a valid file handle, which is used to memory map the\n     * requested region. Upon failure, `error` is set to indicate the reason and the\n     * object remains in an unmapped state.\n     * \n     * The entire file is mapped.\n     */\n    void map(const handle_type handle, std::error_code& error)\n    {\n        map(handle, 0, map_entire_file, error);\n    }\n\n    /**\n     * If a valid memory mapping has been created prior to this call, this call\n     * instructs the kernel to unmap the memory region and disassociate this object\n     * from the file.\n     *\n     * The file handle associated with the file that is mapped is only closed if the\n     * mapping was created using a file path. If, on the other hand, an existing\n     * file handle was used to create the mapping, the file handle is not closed.\n     */\n    void unmap();\n\n    void swap(basic_mmap& other);\n\n    /** Flushes the memory mapped page to disk. Errors are reported via `error`. */\n    template<access_mode A = AccessMode>\n    typename std::enable_if<A == access_mode::write, void>::type\n    sync(std::error_code& error);\n\n    /**\n     * All operators compare the address of the first byte and size of the two mapped\n     * regions.\n     */\n\nprivate:\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > pointer get_mapping_start() noexcept\n    {\n        return !data() ? nullptr : data() - mapping_offset();\n    }\n\n    const_pointer get_mapping_start() const noexcept\n    {\n        return !data() ? nullptr : data() - mapping_offset();\n    }\n\n    /**\n     * The destructor syncs changes to disk if `AccessMode` is `write`, but not\n     * if it's `read`, but since the destructor cannot be templated, we need to\n     * do SFINAE in a dedicated function, where one syncs and the other is a noop.\n     */\n    template<access_mode A = AccessMode>\n    typename std::enable_if<A == access_mode::write, void>::type\n    conditional_sync();\n    template<access_mode A = AccessMode>\n    typename std::enable_if<A == access_mode::read, void>::type conditional_sync();\n};\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator==(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator!=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator<(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator<=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator>(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator>=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b);\n\n/**\n * This is the basis for all read-only mmap objects and should be preferred over\n * directly using `basic_mmap`.\n */\ntemplate<typename ByteT>\nusing basic_mmap_source = basic_mmap<access_mode::read, ByteT>;\n\n/**\n * This is the basis for all read-write mmap objects and should be preferred over\n * directly using `basic_mmap`.\n */\ntemplate<typename ByteT>\nusing basic_mmap_sink = basic_mmap<access_mode::write, ByteT>;\n\n/**\n * These aliases cover the most common use cases, both representing a raw byte stream\n * (either with a char or an unsigned char/uint8_t).\n */\nusing mmap_source = basic_mmap_source<char>;\nusing ummap_source = basic_mmap_source<unsigned char>;\n\nusing mmap_sink = basic_mmap_sink<char>;\nusing ummap_sink = basic_mmap_sink<unsigned char>;\n\n/**\n * Convenience factory method that constructs a mapping for any `basic_mmap` or\n * `basic_mmap` type.\n */\ntemplate<\n    typename MMap,\n    typename MappingToken\n> MMap make_mmap(const MappingToken& token,\n        int64_t offset, int64_t length, std::error_code& error)\n{\n    MMap mmap;\n    mmap.map(token, offset, length, error);\n    return mmap;\n}\n\n/**\n * Convenience factory method.\n *\n * MappingToken may be a String (`std::string`, `std::string_view`, `const char*`,\n * `std::filesystem::path`, `std::vector<char>`, or similar), or a\n * `mmap_source::handle_type`.\n */\ntemplate<typename MappingToken>\nmmap_source make_mmap_source(const MappingToken& token, mmap_source::size_type offset,\n        mmap_source::size_type length, std::error_code& error)\n{\n    return make_mmap<mmap_source>(token, offset, length, error);\n}\n\ntemplate<typename MappingToken>\nmmap_source make_mmap_source(const MappingToken& token, std::error_code& error)\n{\n    return make_mmap_source(token, 0, map_entire_file, error);\n}\n\n/**\n * Convenience factory method.\n *\n * MappingToken may be a String (`std::string`, `std::string_view`, `const char*`,\n * `std::filesystem::path`, `std::vector<char>`, or similar), or a\n * `mmap_sink::handle_type`.\n */\ntemplate<typename MappingToken>\nmmap_sink make_mmap_sink(const MappingToken& token, mmap_sink::size_type offset,\n        mmap_sink::size_type length, std::error_code& error)\n{\n    return make_mmap<mmap_sink>(token, offset, length, error);\n}\n\ntemplate<typename MappingToken>\nmmap_sink make_mmap_sink(const MappingToken& token, std::error_code& error)\n{\n    return make_mmap_sink(token, 0, map_entire_file, error);\n}\n\n} // namespace mio\n\n// #include \"detail/mmap.ipp\"\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef MIO_BASIC_MMAP_IMPL\n#define MIO_BASIC_MMAP_IMPL\n\n// #include \"mio/mmap.hpp\"\n\n// #include \"mio/page.hpp\"\n\n// #include \"mio/detail/string_util.hpp\"\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef MIO_STRING_UTIL_HEADER\n#define MIO_STRING_UTIL_HEADER\n\n#include <type_traits>\n\nnamespace mio {\nnamespace detail {\n\ntemplate<\n    typename S,\n    typename C = typename std::decay<S>::type,\n    typename = decltype(std::declval<C>().data()),\n    typename = typename std::enable_if<\n        std::is_same<typename C::value_type, char>::value\n#ifdef _WIN32\n        || std::is_same<typename C::value_type, wchar_t>::value\n#endif\n    >::type\n> struct char_type_helper {\n    using type = typename C::value_type;\n};\n\ntemplate<class T>\nstruct char_type {\n    using type = typename char_type_helper<T>::type;\n};\n\n// TODO: can we avoid this brute force approach?\ntemplate<>\nstruct char_type<char*> {\n    using type = char;\n};\n\ntemplate<>\nstruct char_type<const char*> {\n    using type = char;\n};\n\ntemplate<size_t N>\nstruct char_type<char[N]> {\n    using type = char;\n};\n\ntemplate<size_t N>\nstruct char_type<const char[N]> {\n    using type = char;\n};\n\n#ifdef _WIN32\ntemplate<>\nstruct char_type<wchar_t*> {\n    using type = wchar_t;\n};\n\ntemplate<>\nstruct char_type<const wchar_t*> {\n    using type = wchar_t;\n};\n\ntemplate<size_t N>\nstruct char_type<wchar_t[N]> {\n    using type = wchar_t;\n};\n\ntemplate<size_t N>\nstruct char_type<const wchar_t[N]> {\n    using type = wchar_t;\n};\n#endif // _WIN32\n\ntemplate<typename CharT, typename S>\nstruct is_c_str_helper\n{\n    static constexpr bool value = std::is_same<\n        CharT*,\n        // TODO: I'm so sorry for this... Can this be made cleaner?\n        typename std::add_pointer<\n            typename std::remove_cv<\n                typename std::remove_pointer<\n                    typename std::decay<\n                        S\n                    >::type\n                >::type\n            >::type\n        >::type\n    >::value;\n};\n\ntemplate<typename S>\nstruct is_c_str\n{\n    static constexpr bool value = is_c_str_helper<char, S>::value;\n};\n\n#ifdef _WIN32\ntemplate<typename S>\nstruct is_c_wstr\n{\n    static constexpr bool value = is_c_str_helper<wchar_t, S>::value;\n};\n#endif // _WIN32\n\ntemplate<typename S>\nstruct is_c_str_or_c_wstr\n{\n    static constexpr bool value = is_c_str<S>::value\n#ifdef _WIN32\n        || is_c_wstr<S>::value\n#endif\n        ;\n};\n\ntemplate<\n    typename String,\n    typename = decltype(std::declval<String>().data()),\n    typename = typename std::enable_if<!is_c_str_or_c_wstr<String>::value>::type\n> const typename char_type<String>::type* c_str(const String& path)\n{\n    return path.data();\n}\n\ntemplate<\n    typename String,\n    typename = decltype(std::declval<String>().empty()),\n    typename = typename std::enable_if<!is_c_str_or_c_wstr<String>::value>::type\n> bool empty(const String& path)\n{\n    return path.empty();\n}\n\ntemplate<\n    typename String,\n    typename = typename std::enable_if<is_c_str_or_c_wstr<String>::value>::type\n> const typename char_type<String>::type* c_str(String path)\n{\n    return path;\n}\n\ntemplate<\n    typename String,\n    typename = typename std::enable_if<is_c_str_or_c_wstr<String>::value>::type\n> bool empty(String path)\n{\n    return !path || (*path == 0);\n}\n\n} // namespace detail\n} // namespace mio\n\n#endif // MIO_STRING_UTIL_HEADER\n\n\n#include <algorithm>\n\n#ifndef _WIN32\n# include <unistd.h>\n# include <fcntl.h>\n# include <sys/mman.h>\n# include <sys/stat.h>\n#endif\n\nnamespace mio {\nnamespace detail {\n\n#ifdef _WIN32\nnamespace win {\n\n/** Returns the 4 upper bytes of an 8-byte integer. */\ninline DWORD int64_high(int64_t n) noexcept\n{\n    return static_cast<DWORD>(static_cast<uint64_t>(n) >> 32);\n}\n\n/** Returns the 4 lower bytes of an 8-byte integer. */\ninline DWORD int64_low(int64_t n) noexcept\n{\n    return static_cast<DWORD>(static_cast<uint64_t>(n) & 0xffffffffULL);\n}\n\ntemplate<\n    typename String,\n    typename = typename std::enable_if<\n        std::is_same<typename char_type<String>::type, char>::value\n    >::type\n> file_handle_type open_file_helper(const String& path, const access_mode mode)\n{\n    return ::CreateFileA(c_str(path),\n            mode == access_mode::read ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,\n            FILE_SHARE_READ | FILE_SHARE_WRITE,\n            0,\n            OPEN_EXISTING,\n            FILE_ATTRIBUTE_NORMAL,\n            0);\n}\n\ntemplate<typename String>\ntypename std::enable_if<\n    std::is_same<typename char_type<String>::type, wchar_t>::value,\n    file_handle_type\n>::type open_file_helper(const String& path, const access_mode mode)\n{\n    return ::CreateFileW(c_str(path),\n            mode == access_mode::read ? GENERIC_READ : GENERIC_READ | GENERIC_WRITE,\n            FILE_SHARE_READ | FILE_SHARE_WRITE,\n            0,\n            OPEN_EXISTING,\n            FILE_ATTRIBUTE_NORMAL,\n            0);\n}\n\n} // win\n#endif // _WIN32\n\n/**\n * Returns the last platform specific system error (errno on POSIX and\n * GetLastError on Win) as a `std::error_code`.\n */\ninline std::error_code last_error() noexcept\n{\n    std::error_code error;\n#ifdef _WIN32\n    error.assign(GetLastError(), std::system_category());\n#else\n    error.assign(errno, std::system_category());\n#endif\n    return error;\n}\n\ntemplate<typename String>\nfile_handle_type open_file(const String& path, const access_mode mode,\n        std::error_code& error)\n{\n    error.clear();\n    if(detail::empty(path))\n    {\n        error = std::make_error_code(std::errc::invalid_argument);\n        return invalid_handle;\n    }\n#ifdef _WIN32\n    const auto handle = win::open_file_helper(path, mode);\n#else // POSIX\n    const auto handle = ::open(c_str(path),\n            mode == access_mode::read ? O_RDONLY : O_RDWR);\n#endif\n    if(handle == invalid_handle)\n    {\n        error = detail::last_error();\n    }\n    return handle;\n}\n\ninline size_t query_file_size(file_handle_type handle, std::error_code& error)\n{\n    error.clear();\n#ifdef _WIN32\n    LARGE_INTEGER file_size;\n    if(::GetFileSizeEx(handle, &file_size) == 0)\n    {\n        error = detail::last_error();\n        return 0;\n    }\n\treturn static_cast<int64_t>(file_size.QuadPart);\n#else // POSIX\n    struct stat sbuf;\n    if(::fstat(handle, &sbuf) == -1)\n    {\n        error = detail::last_error();\n        return 0;\n    }\n    return sbuf.st_size;\n#endif\n}\n\nstruct mmap_context\n{\n    char* data;\n    int64_t length;\n    int64_t mapped_length;\n#ifdef _WIN32\n    file_handle_type file_mapping_handle;\n#endif\n};\n\ninline mmap_context memory_map(const file_handle_type file_handle, const int64_t offset,\n    const int64_t length, const access_mode mode, std::error_code& error)\n{\n    const int64_t aligned_offset = make_offset_page_aligned(offset);\n    const int64_t length_to_map = offset - aligned_offset + length;\n#ifdef _WIN32\n    const int64_t max_file_size = offset + length;\n    const auto file_mapping_handle = ::CreateFileMapping(\n            file_handle,\n            0,\n            mode == access_mode::read ? PAGE_READONLY : PAGE_READWRITE,\n            win::int64_high(max_file_size),\n            win::int64_low(max_file_size),\n            0);\n    if(file_mapping_handle == invalid_handle)\n    {\n        error = detail::last_error();\n        return {};\n    }\n    char* mapping_start = static_cast<char*>(::MapViewOfFile(\n            file_mapping_handle,\n            mode == access_mode::read ? FILE_MAP_READ : FILE_MAP_WRITE,\n            win::int64_high(aligned_offset),\n            win::int64_low(aligned_offset),\n            length_to_map));\n    if(mapping_start == nullptr)\n    {\n        // Close file handle if mapping it failed.\n        ::CloseHandle(file_mapping_handle);\n        error = detail::last_error();\n        return {};\n    }\n#else // POSIX\n    char* mapping_start = static_cast<char*>(::mmap(\n            0, // Don't give hint as to where to map.\n            length_to_map,\n            mode == access_mode::read ? PROT_READ : PROT_WRITE,\n            MAP_SHARED,\n            file_handle,\n            aligned_offset));\n    if(mapping_start == MAP_FAILED)\n    {\n        error = detail::last_error();\n        return {};\n    }\n#endif\n    mmap_context ctx;\n    ctx.data = mapping_start + offset - aligned_offset;\n    ctx.length = length;\n    ctx.mapped_length = length_to_map;\n#ifdef _WIN32\n    ctx.file_mapping_handle = file_mapping_handle;\n#endif\n    return ctx;\n}\n\n} // namespace detail\n\n// -- basic_mmap --\n\ntemplate<access_mode AccessMode, typename ByteT>\nbasic_mmap<AccessMode, ByteT>::~basic_mmap()\n{\n    conditional_sync();\n    unmap();\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbasic_mmap<AccessMode, ByteT>::basic_mmap(basic_mmap&& other)\n    : data_(std::move(other.data_))\n    , length_(std::move(other.length_))\n    , mapped_length_(std::move(other.mapped_length_))\n    , file_handle_(std::move(other.file_handle_))\n#ifdef _WIN32\n    , file_mapping_handle_(std::move(other.file_mapping_handle_))\n#endif\n    , is_handle_internal_(std::move(other.is_handle_internal_))\n{\n    other.data_ = nullptr;\n    other.length_ = other.mapped_length_ = 0;\n    other.file_handle_ = invalid_handle;\n#ifdef _WIN32\n    other.file_mapping_handle_ = invalid_handle;\n#endif\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbasic_mmap<AccessMode, ByteT>&\nbasic_mmap<AccessMode, ByteT>::operator=(basic_mmap&& other)\n{\n    if(this != &other)\n    {\n        // First the existing mapping needs to be removed.\n        unmap();\n        data_ = std::move(other.data_);\n        length_ = std::move(other.length_);\n        mapped_length_ = std::move(other.mapped_length_);\n        file_handle_ = std::move(other.file_handle_);\n#ifdef _WIN32\n        file_mapping_handle_ = std::move(other.file_mapping_handle_);\n#endif\n        is_handle_internal_ = std::move(other.is_handle_internal_);\n\n        // The moved from basic_mmap's fields need to be reset, because\n        // otherwise other's destructor will unmap the same mapping that was\n        // just moved into this.\n        other.data_ = nullptr;\n        other.length_ = other.mapped_length_ = 0;\n        other.file_handle_ = invalid_handle;\n#ifdef _WIN32\n        other.file_mapping_handle_ = invalid_handle;\n#endif\n        other.is_handle_internal_ = false;\n    }\n    return *this;\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\ntypename basic_mmap<AccessMode, ByteT>::handle_type\nbasic_mmap<AccessMode, ByteT>::mapping_handle() const noexcept\n{\n#ifdef _WIN32\n    return file_mapping_handle_;\n#else\n    return file_handle_;\n#endif\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\ntemplate<typename String>\nvoid basic_mmap<AccessMode, ByteT>::map(const String& path, const size_type offset,\n        const size_type length, std::error_code& error)\n{\n    error.clear();\n    if(detail::empty(path))\n    {\n        error = std::make_error_code(std::errc::invalid_argument);\n        return;\n    }\n    const auto handle = detail::open_file(path, AccessMode, error);\n    if(error)\n    {\n        return;\n    }\n\n    map(handle, offset, length, error);\n    // This MUST be after the call to map, as that sets this to true.\n    if(!error)\n    {\n        is_handle_internal_ = true;\n    }\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nvoid basic_mmap<AccessMode, ByteT>::map(const handle_type handle,\n        const size_type offset, const size_type length, std::error_code& error)\n{\n    error.clear();\n    if(handle == invalid_handle)\n    {\n        error = std::make_error_code(std::errc::bad_file_descriptor);\n        return;\n    }\n\n    const auto file_size = detail::query_file_size(handle, error);\n    if(error)\n    {\n        return;\n    }\n\n    if(offset + length > file_size)\n    {\n        error = std::make_error_code(std::errc::invalid_argument);\n        return;\n    }\n\n    const auto ctx = detail::memory_map(handle, offset,\n            length == map_entire_file ? (file_size - offset) : length,\n            AccessMode, error);\n    if(!error)\n    {\n        // We must unmap the previous mapping that may have existed prior to this call.\n        // Note that this must only be invoked after a new mapping has been created in\n        // order to provide the strong guarantee that, should the new mapping fail, the\n        // `map` function leaves this instance in a state as though the function had\n        // never been invoked.\n        unmap();\n        file_handle_ = handle;\n        is_handle_internal_ = false;\n        data_ = reinterpret_cast<pointer>(ctx.data);\n        length_ = ctx.length;\n        mapped_length_ = ctx.mapped_length;\n#ifdef _WIN32\n        file_mapping_handle_ = ctx.file_mapping_handle;\n#endif\n    }\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\ntemplate<access_mode A>\ntypename std::enable_if<A == access_mode::write, void>::type\nbasic_mmap<AccessMode, ByteT>::sync(std::error_code& error)\n{\n    error.clear();\n    if(!is_open())\n    {\n        error = std::make_error_code(std::errc::bad_file_descriptor);\n        return;\n    }\n\n    if(data())\n    {\n#ifdef _WIN32\n        if(::FlushViewOfFile(get_mapping_start(), mapped_length_) == 0\n           || ::FlushFileBuffers(file_handle_) == 0)\n#else // POSIX\n        if(::msync(get_mapping_start(), mapped_length_, MS_SYNC) != 0)\n#endif\n        {\n            error = detail::last_error();\n            return;\n        }\n    }\n#ifdef _WIN32\n    if(::FlushFileBuffers(file_handle_) == 0)\n    {\n        error = detail::last_error();\n    }\n#endif\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nvoid basic_mmap<AccessMode, ByteT>::unmap()\n{\n    if(!is_open()) { return; }\n    // TODO do we care about errors here?\n#ifdef _WIN32\n    if(is_mapped())\n    {\n        ::UnmapViewOfFile(get_mapping_start());\n        ::CloseHandle(file_mapping_handle_);\n    }\n#else // POSIX\n    if(data_) { ::munmap(const_cast<pointer>(get_mapping_start()), mapped_length_); }\n#endif\n\n    // If `file_handle_` was obtained by our opening it (when map is called with\n    // a path, rather than an existing file handle), we need to close it,\n    // otherwise it must not be closed as it may still be used outside this\n    // instance.\n    if(is_handle_internal_)\n    {\n#ifdef _WIN32\n        ::CloseHandle(file_handle_);\n#else // POSIX\n        ::close(file_handle_);\n#endif\n    }\n\n    // Reset fields to their default values.\n    data_ = nullptr;\n    length_ = mapped_length_ = 0;\n    file_handle_ = invalid_handle;\n#ifdef _WIN32\n    file_mapping_handle_ = invalid_handle;\n#endif\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool basic_mmap<AccessMode, ByteT>::is_mapped() const noexcept\n{\n#ifdef _WIN32\n    return file_mapping_handle_ != invalid_handle;\n#else // POSIX\n    return is_open();\n#endif\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nvoid basic_mmap<AccessMode, ByteT>::swap(basic_mmap& other)\n{\n    if(this != &other)\n    {\n        using std::swap;\n        swap(data_, other.data_);\n        swap(file_handle_, other.file_handle_);\n#ifdef _WIN32\n        swap(file_mapping_handle_, other.file_mapping_handle_);\n#endif\n        swap(length_, other.length_);\n        swap(mapped_length_, other.mapped_length_);\n        swap(is_handle_internal_, other.is_handle_internal_);\n    }\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\ntemplate<access_mode A>\ntypename std::enable_if<A == access_mode::write, void>::type\nbasic_mmap<AccessMode, ByteT>::conditional_sync()\n{\n    // This is invoked from the destructor, so not much we can do about\n    // failures here.\n    std::error_code ec;\n    sync(ec);\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\ntemplate<access_mode A>\ntypename std::enable_if<A == access_mode::read, void>::type\nbasic_mmap<AccessMode, ByteT>::conditional_sync()\n{\n    // noop\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator==(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    return a.data() == b.data()\n        && a.size() == b.size();\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator!=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    return !(a == b);\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator<(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    if(a.data() == b.data()) { return a.size() < b.size(); }\n    return a.data() < b.data();\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator<=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    return !(a > b);\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator>(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    if(a.data() == b.data()) { return a.size() > b.size(); }\n    return a.data() > b.data();\n}\n\ntemplate<access_mode AccessMode, typename ByteT>\nbool operator>=(const basic_mmap<AccessMode, ByteT>& a,\n        const basic_mmap<AccessMode, ByteT>& b)\n{\n    return !(a < b);\n}\n\n} // namespace mio\n\n#endif // MIO_BASIC_MMAP_IMPL\n\n\n#endif // MIO_MMAP_HEADER\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef MIO_PAGE_HEADER\n#define MIO_PAGE_HEADER\n\n#ifdef _WIN32\n# include <windows.h>\n#else\n# include <unistd.h>\n#endif\n\nnamespace mio {\n\n/**\n * This is used by `basic_mmap` to determine whether to create a read-only or\n * a read-write memory mapping.\n */\nenum class access_mode\n{\n    read,\n    write\n};\n\n/**\n * Determines the operating system's page allocation granularity.\n *\n * On the first call to this function, it invokes the operating system specific syscall\n * to determine the page size, caches the value, and returns it. Any subsequent call to\n * this function serves the cached value, so no further syscalls are made.\n */\ninline size_t page_size()\n{\n    static const size_t page_size = []\n    {\n#ifdef _WIN32\n        SYSTEM_INFO SystemInfo;\n        GetSystemInfo(&SystemInfo);\n        return SystemInfo.dwAllocationGranularity;\n#else\n        return sysconf(_SC_PAGE_SIZE);\n#endif\n    }();\n    return page_size;\n}\n\n/**\n * Alligns `offset` to the operating's system page size such that it subtracts the\n * difference until the nearest page boundary before `offset`, or does nothing if\n * `offset` is already page aligned.\n */\ninline size_t make_offset_page_aligned(size_t offset) noexcept\n{\n    const size_t page_size_ = page_size();\n    // Use integer division to round down to the nearest page alignment.\n    return offset / page_size_ * page_size_;\n}\n\n} // namespace mio\n\n#endif // MIO_PAGE_HEADER\n/* Copyright 2017 https://github.com/mandreyel\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of this\n * software and associated documentation files (the \"Software\"), to deal in the Software\n * without restriction, including without limitation the rights to use, copy, modify,\n * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to\n * permit persons to whom the Software is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice shall be included in all copies\n * or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,\n * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT\n * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF\n * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE\n * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n */\n\n#ifndef MIO_SHARED_MMAP_HEADER\n#define MIO_SHARED_MMAP_HEADER\n\n// #include \"mio/mmap.hpp\"\n\n\n#include <system_error> // std::error_code\n#include <memory> // std::shared_ptr\n\nnamespace mio {\n\n/**\n * Exposes (nearly) the same interface as `basic_mmap`, but endowes it with\n * `std::shared_ptr` semantics.\n *\n * This is not the default behaviour of `basic_mmap` to avoid allocating on the heap if\n * shared semantics are not required.\n */\ntemplate<\n    access_mode AccessMode,\n    typename ByteT\n> class basic_shared_mmap\n{\n    using impl_type = basic_mmap<AccessMode, ByteT>;\n    std::shared_ptr<impl_type> pimpl_;\n\npublic:\n    using value_type = typename impl_type::value_type;\n    using size_type = typename impl_type::size_type;\n    using reference = typename impl_type::reference;\n    using const_reference = typename impl_type::const_reference;\n    using pointer = typename impl_type::pointer;\n    using const_pointer = typename impl_type::const_pointer;\n    using difference_type = typename impl_type::difference_type;\n    using iterator = typename impl_type::iterator;\n    using const_iterator = typename impl_type::const_iterator;\n    using reverse_iterator = typename impl_type::reverse_iterator;\n    using const_reverse_iterator = typename impl_type::const_reverse_iterator;\n    using iterator_category = typename impl_type::iterator_category;\n    using handle_type = typename impl_type::handle_type;\n    using mmap_type = impl_type;\n\n    basic_shared_mmap() = default;\n    basic_shared_mmap(const basic_shared_mmap&) = default;\n    basic_shared_mmap& operator=(const basic_shared_mmap&) = default;\n    basic_shared_mmap(basic_shared_mmap&&) = default;\n    basic_shared_mmap& operator=(basic_shared_mmap&&) = default;\n\n    /** Takes ownership of an existing mmap object. */\n    basic_shared_mmap(mmap_type&& mmap)\n        : pimpl_(std::make_shared<mmap_type>(std::move(mmap)))\n    {}\n\n    /** Takes ownership of an existing mmap object. */\n    basic_shared_mmap& operator=(mmap_type&& mmap)\n    {\n        pimpl_ = std::make_shared<mmap_type>(std::move(mmap));\n        return *this;\n    }\n\n    /** Initializes this object with an already established shared mmap. */\n    basic_shared_mmap(std::shared_ptr<mmap_type> mmap) : pimpl_(std::move(mmap)) {}\n\n    /** Initializes this object with an already established shared mmap. */\n    basic_shared_mmap& operator=(std::shared_ptr<mmap_type> mmap)\n    {\n        pimpl_ = std::move(mmap);\n        return *this;\n    }\n\n#ifdef __cpp_exceptions\n    /**\n     * The same as invoking the `map` function, except any error that may occur\n     * while establishing the mapping is wrapped in a `std::system_error` and is\n     * thrown.\n     */\n    template<typename String>\n    basic_shared_mmap(const String& path, const size_type offset = 0, const size_type length = map_entire_file)\n    {\n        std::error_code error;\n        map(path, offset, length, error);\n        if(error) { throw std::system_error(error); }\n    }\n\n    /**\n     * The same as invoking the `map` function, except any error that may occur\n     * while establishing the mapping is wrapped in a `std::system_error` and is\n     * thrown.\n     */\n    basic_shared_mmap(const handle_type handle, const size_type offset = 0, const size_type length = map_entire_file)\n    {\n        std::error_code error;\n        map(handle, offset, length, error);\n        if(error) { throw std::system_error(error); }\n    }\n#endif // __cpp_exceptions\n\n    /**\n     * If this is a read-write mapping and the last reference to the mapping,\n     * the destructor invokes sync. Regardless of the access mode, unmap is\n     * invoked as a final step.\n     */\n    ~basic_shared_mmap() = default;\n\n    /** Returns the underlying `std::shared_ptr` instance that holds the mmap. */\n    std::shared_ptr<mmap_type> get_shared_ptr() { return pimpl_; }\n\n    /**\n     * On UNIX systems 'file_handle' and 'mapping_handle' are the same. On Windows,\n     * however, a mapped region of a file gets its own handle, which is returned by\n     * 'mapping_handle'.\n     */\n    handle_type file_handle() const noexcept\n    {\n        return pimpl_ ? pimpl_->file_handle() : invalid_handle;\n    }\n\n    handle_type mapping_handle() const noexcept\n    {\n        return pimpl_ ? pimpl_->mapping_handle() : invalid_handle;\n    }\n\n    /** Returns whether a valid memory mapping has been created. */\n    bool is_open() const noexcept { return pimpl_ && pimpl_->is_open(); }\n\n    /**\n     * Returns true if no mapping was established, that is, conceptually the\n     * same as though the length that was mapped was 0. This function is\n     * provided so that this class has Container semantics.\n     */\n    bool empty() const noexcept { return !pimpl_ || pimpl_->empty(); }\n\n    /**\n     * `size` and `length` both return the logical length, i.e. the number of bytes\n     * user requested to be mapped, while `mapped_length` returns the actual number of\n     * bytes that were mapped which is a multiple of the underlying operating system's\n     * page allocation granularity.\n     */\n    size_type size() const noexcept { return pimpl_ ? pimpl_->length() : 0; }\n    size_type length() const noexcept { return pimpl_ ? pimpl_->length() : 0; }\n    size_type mapped_length() const noexcept\n    {\n        return pimpl_ ? pimpl_->mapped_length() : 0;\n    }\n\n    /**\n     * Returns a pointer to the first requested byte, or `nullptr` if no memory mapping\n     * exists.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > pointer data() noexcept { return pimpl_->data(); }\n    const_pointer data() const noexcept { return pimpl_ ? pimpl_->data() : nullptr; }\n\n    /**\n     * Returns an iterator to the first requested byte, if a valid memory mapping\n     * exists, otherwise this function call is undefined behaviour.\n     */\n    iterator begin() noexcept { return pimpl_->begin(); }\n    const_iterator begin() const noexcept { return pimpl_->begin(); }\n    const_iterator cbegin() const noexcept { return pimpl_->cbegin(); }\n\n    /**\n     * Returns an iterator one past the last requested byte, if a valid memory mapping\n     * exists, otherwise this function call is undefined behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > iterator end() noexcept { return pimpl_->end(); }\n    const_iterator end() const noexcept { return pimpl_->end(); }\n    const_iterator cend() const noexcept { return pimpl_->cend(); }\n\n    /**\n     * Returns a reverse iterator to the last memory mapped byte, if a valid\n     * memory mapping exists, otherwise this function call is undefined\n     * behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > reverse_iterator rbegin() noexcept { return pimpl_->rbegin(); }\n    const_reverse_iterator rbegin() const noexcept { return pimpl_->rbegin(); }\n    const_reverse_iterator crbegin() const noexcept { return pimpl_->crbegin(); }\n\n    /**\n     * Returns a reverse iterator past the first mapped byte, if a valid memory\n     * mapping exists, otherwise this function call is undefined behaviour.\n     */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > reverse_iterator rend() noexcept { return pimpl_->rend(); }\n    const_reverse_iterator rend() const noexcept { return pimpl_->rend(); }\n    const_reverse_iterator crend() const noexcept { return pimpl_->crend(); }\n\n    /**\n     * Returns a reference to the `i`th byte from the first requested byte (as returned\n     * by `data`). If this is invoked when no valid memory mapping has been created\n     * prior to this call, undefined behaviour ensues.\n     */\n    reference operator[](const size_type i) noexcept { return (*pimpl_)[i]; }\n    const_reference operator[](const size_type i) const noexcept { return (*pimpl_)[i]; }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `path`, which must be a path to an existing file, is used to retrieve a file\n     * handle (which is closed when the object destructs or `unmap` is called), which is\n     * then used to memory map the requested region. Upon failure, `error` is set to\n     * indicate the reason and the object remains in an unmapped state.\n     *\n     * `offset` is the number of bytes, relative to the start of the file, where the\n     * mapping should begin. When specifying it, there is no need to worry about\n     * providing a value that is aligned with the operating system's page allocation\n     * granularity. This is adjusted by the implementation such that the first requested\n     * byte (as returned by `data` or `begin`), so long as `offset` is valid, will be at\n     * `offset` from the start of the file.\n     *\n     * `length` is the number of bytes to map. It may be `map_entire_file`, in which\n     * case a mapping of the entire file is created.\n     */\n    template<typename String>\n    void map(const String& path, const size_type offset,\n        const size_type length, std::error_code& error)\n    {\n        map_impl(path, offset, length, error);\n    }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `path`, which must be a path to an existing file, is used to retrieve a file\n     * handle (which is closed when the object destructs or `unmap` is called), which is\n     * then used to memory map the requested region. Upon failure, `error` is set to\n     * indicate the reason and the object remains in an unmapped state.\n     *\n     * The entire file is mapped.\n     */\n    template<typename String>\n    void map(const String& path, std::error_code& error)\n    {\n        map_impl(path, 0, map_entire_file, error);\n    }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `handle`, which must be a valid file handle, which is used to memory map the\n     * requested region. Upon failure, `error` is set to indicate the reason and the\n     * object remains in an unmapped state.\n     *\n     * `offset` is the number of bytes, relative to the start of the file, where the\n     * mapping should begin. When specifying it, there is no need to worry about\n     * providing a value that is aligned with the operating system's page allocation\n     * granularity. This is adjusted by the implementation such that the first requested\n     * byte (as returned by `data` or `begin`), so long as `offset` is valid, will be at\n     * `offset` from the start of the file.\n     *\n     * `length` is the number of bytes to map. It may be `map_entire_file`, in which\n     * case a mapping of the entire file is created.\n     */\n    void map(const handle_type handle, const size_type offset,\n        const size_type length, std::error_code& error)\n    {\n        map_impl(handle, offset, length, error);\n    }\n\n    /**\n     * Establishes a memory mapping with AccessMode. If the mapping is unsuccesful, the\n     * reason is reported via `error` and the object remains in a state as if this\n     * function hadn't been called.\n     *\n     * `handle`, which must be a valid file handle, which is used to memory map the\n     * requested region. Upon failure, `error` is set to indicate the reason and the\n     * object remains in an unmapped state.\n     *\n     * The entire file is mapped.\n     */\n    void map(const handle_type handle, std::error_code& error)\n    {\n        map_impl(handle, 0, map_entire_file, error);\n    }\n\n    /**\n     * If a valid memory mapping has been created prior to this call, this call\n     * instructs the kernel to unmap the memory region and disassociate this object\n     * from the file.\n     *\n     * The file handle associated with the file that is mapped is only closed if the\n     * mapping was created using a file path. If, on the other hand, an existing\n     * file handle was used to create the mapping, the file handle is not closed.\n     */\n    void unmap() { if(pimpl_) pimpl_->unmap(); }\n\n    void swap(basic_shared_mmap& other) { pimpl_.swap(other.pimpl_); }\n\n    /** Flushes the memory mapped page to disk. Errors are reported via `error`. */\n    template<\n        access_mode A = AccessMode,\n        typename = typename std::enable_if<A == access_mode::write>::type\n    > void sync(std::error_code& error) { if(pimpl_) pimpl_->sync(error); }\n\n    /** All operators compare the underlying `basic_mmap`'s addresses. */\n\n    friend bool operator==(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return a.pimpl_ == b.pimpl_;\n    }\n\n    friend bool operator!=(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return !(a == b);\n    }\n\n    friend bool operator<(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return a.pimpl_ < b.pimpl_;\n    }\n\n    friend bool operator<=(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return a.pimpl_ <= b.pimpl_;\n    }\n\n    friend bool operator>(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return a.pimpl_ > b.pimpl_;\n    }\n\n    friend bool operator>=(const basic_shared_mmap& a, const basic_shared_mmap& b)\n    {\n        return a.pimpl_ >= b.pimpl_;\n    }\n\nprivate:\n    template<typename MappingToken>\n    void map_impl(const MappingToken& token, const size_type offset,\n        const size_type length, std::error_code& error)\n    {\n        if(!pimpl_)\n        {\n            mmap_type mmap = make_mmap<mmap_type>(token, offset, length, error);\n            if(error) { return; }\n            pimpl_ = std::make_shared<mmap_type>(std::move(mmap));\n        }\n        else\n        {\n            pimpl_->map(token, offset, length, error);\n        }\n    }\n};\n\n/**\n * This is the basis for all read-only mmap objects and should be preferred over\n * directly using basic_shared_mmap.\n */\ntemplate<typename ByteT>\nusing basic_shared_mmap_source = basic_shared_mmap<access_mode::read, ByteT>;\n\n/**\n * This is the basis for all read-write mmap objects and should be preferred over\n * directly using basic_shared_mmap.\n */\ntemplate<typename ByteT>\nusing basic_shared_mmap_sink = basic_shared_mmap<access_mode::write, ByteT>;\n\n/**\n * These aliases cover the most common use cases, both representing a raw byte stream\n * (either with a char or an unsigned char/uint8_t).\n */\nusing shared_mmap_source = basic_shared_mmap_source<char>;\nusing shared_ummap_source = basic_shared_mmap_source<unsigned char>;\n\nusing shared_mmap_sink = basic_shared_mmap_sink<char>;\nusing shared_ummap_sink = basic_shared_mmap_sink<unsigned char>;\n\n} // namespace mio\n\n#endif // MIO_SHARED_MMAP_HEADER\n\n#endif\n/** @file\n *  @brief SIMD-accelerated skip for runs of non-special CSV bytes.\n *\n *  Conservative design: any byte that could be the delimiter, quote character,\n *  \\n, or \\r causes an early return.\n *\n *  Uses 4x cmpeq rather than a lookup-table shuffle because CSV has only four\n *  sentinel characters. vpshufb (shuffle) truncates index bytes to their low\n *  nibble, causing aliasing across 16-byte boundaries and silently skipping\n *  real delimiters. The cmpeq approach is alias-free and equally fast for\n *  small sentinel sets.\n *\n *  UTF-8 safe: all CSV structural bytes are single-byte ASCII; multi-byte\n *  sequences (values > 0x7F) are never misidentified as special.\n */\n/** @file\n *  A standalone header file containing shared code\n */\n\n#include <algorithm>\n#include <array>\n#include <cmath>\n#include <cstdlib>\n#include <deque>\n\n#if defined(_WIN32)\n# ifndef WIN32_LEAN_AND_MEAN\n#  define WIN32_LEAN_AND_MEAN\n# endif\n# include <windows.h>\n# undef max\n# undef min\n#elif defined(__linux__)\n# include <unistd.h>\n#endif\n\n /** Helper macro which should be #defined as \"inline\"\n  *  in the single header version\n  */\n#define CSV_INLINE inline\n#include <type_traits>\n\n#if defined(__EMSCRIPTEN__)\n#undef CSV_ENABLE_THREADS\n#define CSV_ENABLE_THREADS 0\n#elif !defined(CSV_ENABLE_THREADS)\n#define CSV_ENABLE_THREADS 1\n#endif\n\n// Minimal portability macros (Hedley subset) with CSV_ prefix.\n#if defined(__clang__) || defined(__GNUC__)\n    #define CSV_CONST __attribute__((__const__))\n    #define CSV_PURE __attribute__((__pure__))\n    #if defined(_WIN32)\n        #define CSV_PRIVATE\n    #else\n        #define CSV_PRIVATE __attribute__((__visibility__(\"hidden\")))\n    #endif\n    #define CSV_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__)))\n#elif defined(_MSC_VER)\n    #define CSV_CONST\n    #define CSV_PURE\n    #define CSV_PRIVATE\n    #define CSV_NON_NULL(...)\n#else\n    #define CSV_CONST\n    #define CSV_PURE\n    #define CSV_PRIVATE\n    #define CSV_NON_NULL(...)\n#endif\n\n// This library uses C++ exceptions for error reporting in public APIs.\n#if defined(__cpp_exceptions) || defined(_CPPUNWIND) || defined(__EXCEPTIONS)\n    #define CSV_EXCEPTIONS_ENABLED 1\n#else\n    #define CSV_EXCEPTIONS_ENABLED 0\n#endif\n\n#if !CSV_EXCEPTIONS_ENABLED\n    #error \"csv-parser requires C++ exceptions. Enable exception handling (for example, remove -fno-exceptions or use /EHsc).\"\n#endif\n\n// Detect C++ standard version BEFORE namespace to properly include string_view\n// MSVC: __cplusplus == 199711L unless /Zc:__cplusplus is set; use _MSVC_LANG instead.\n#if defined(_MSVC_LANG) && _MSVC_LANG > __cplusplus\n#  define CSV_CPLUSPLUS _MSVC_LANG\n#else\n#  define CSV_CPLUSPLUS __cplusplus\n#endif\n\n#if CSV_CPLUSPLUS >= 202002L\n#define CSV_HAS_CXX20\n#endif\n\n#if CSV_CPLUSPLUS >= 201703L\n#define CSV_HAS_CXX17\n#endif\n\n#if CSV_CPLUSPLUS >= 201402L\n#define CSV_HAS_CXX14\n#endif\n\n// Include string_view BEFORE csv namespace to avoid namespace pollution issues\n#ifdef CSV_HAS_CXX17\n#include <string_view>\n#else\n// Copyright 2017-2019 by Martin Moene\n//\n// string-view lite, a C++17-like string_view for C++98 and later.\n// For more information see https://github.com/martinmoene/string-view-lite\n//\n// Distributed under the Boost Software License, Version 1.0.\n// (See accompanying file LICENSE.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n\n\n#ifndef NONSTD_SV_LITE_H_INCLUDED\n#define NONSTD_SV_LITE_H_INCLUDED\n\n#define string_view_lite_MAJOR  1\n#define string_view_lite_MINOR  1\n#define string_view_lite_PATCH  0\n\n#define string_view_lite_VERSION  nssv_STRINGIFY(string_view_lite_MAJOR) \".\" nssv_STRINGIFY(string_view_lite_MINOR) \".\" nssv_STRINGIFY(string_view_lite_PATCH)\n\n#define nssv_STRINGIFY(  x )  nssv_STRINGIFY_( x )\n#define nssv_STRINGIFY_( x )  #x\n\n// string-view lite configuration:\n\n#define nssv_STRING_VIEW_DEFAULT  0\n#define nssv_STRING_VIEW_NONSTD   1\n#define nssv_STRING_VIEW_STD      2\n\n#if !defined( nssv_CONFIG_SELECT_STRING_VIEW )\n# define nssv_CONFIG_SELECT_STRING_VIEW  ( nssv_HAVE_STD_STRING_VIEW ? nssv_STRING_VIEW_STD : nssv_STRING_VIEW_NONSTD )\n#endif\n\n#if defined( nssv_CONFIG_SELECT_STD_STRING_VIEW ) || defined( nssv_CONFIG_SELECT_NONSTD_STRING_VIEW )\n# error nssv_CONFIG_SELECT_STD_STRING_VIEW and nssv_CONFIG_SELECT_NONSTD_STRING_VIEW are deprecated and removed, please use nssv_CONFIG_SELECT_STRING_VIEW=nssv_STRING_VIEW_...\n#endif\n\n#ifndef  nssv_CONFIG_STD_SV_OPERATOR\n# define nssv_CONFIG_STD_SV_OPERATOR  0\n#endif\n\n#ifndef  nssv_CONFIG_USR_SV_OPERATOR\n# define nssv_CONFIG_USR_SV_OPERATOR  1\n#endif\n\n#ifdef   nssv_CONFIG_CONVERSION_STD_STRING\n# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS   nssv_CONFIG_CONVERSION_STD_STRING\n# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  nssv_CONFIG_CONVERSION_STD_STRING\n#endif\n\n#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS\n# define nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS  1\n#endif\n\n#ifndef  nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\n# define nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS  1\n#endif\n\n// Control presence of exception handling (try and auto discover):\n\n#ifndef nssv_CONFIG_NO_EXCEPTIONS\n# if defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)\n#  define nssv_CONFIG_NO_EXCEPTIONS  0\n# else\n#  define nssv_CONFIG_NO_EXCEPTIONS  1\n# endif\n#endif\n\n// C++ language version detection (C++20 is speculative):\n// Note: VC14.0/1900 (VS2015) lacks too much from C++14.\n\n#ifndef   nssv_CPLUSPLUS\n# if defined(_MSVC_LANG ) && !defined(__clang__)\n#  define nssv_CPLUSPLUS  (_MSC_VER == 1900 ? 201103L : _MSVC_LANG )\n# else\n#  define nssv_CPLUSPLUS  __cplusplus\n# endif\n#endif\n\n#define nssv_CPP98_OR_GREATER  ( nssv_CPLUSPLUS >= 199711L )\n#define nssv_CPP11_OR_GREATER  ( nssv_CPLUSPLUS >= 201103L )\n#define nssv_CPP11_OR_GREATER_ ( nssv_CPLUSPLUS >= 201103L )\n#define nssv_CPP14_OR_GREATER  ( nssv_CPLUSPLUS >= 201402L )\n#define nssv_CPP17_OR_GREATER  ( nssv_CPLUSPLUS >= 201703L )\n#define nssv_CPP20_OR_GREATER  ( nssv_CPLUSPLUS >= 202000L )\n\n// use C++17 std::string_view if available and requested:\n\n#if nssv_CPP17_OR_GREATER && defined(__has_include )\n# if __has_include( <string_view> )\n#  define nssv_HAVE_STD_STRING_VIEW  1\n# else\n#  define nssv_HAVE_STD_STRING_VIEW  0\n# endif\n#else\n# define  nssv_HAVE_STD_STRING_VIEW  0\n#endif\n\n#define  nssv_USES_STD_STRING_VIEW  ( (nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_STD) || ((nssv_CONFIG_SELECT_STRING_VIEW == nssv_STRING_VIEW_DEFAULT) && nssv_HAVE_STD_STRING_VIEW) )\n\n#define nssv_HAVE_STARTS_WITH ( nssv_CPP20_OR_GREATER || !nssv_USES_STD_STRING_VIEW )\n#define nssv_HAVE_ENDS_WITH     nssv_HAVE_STARTS_WITH\n\n//\n// Use C++17 std::string_view:\n//\n\n#if nssv_USES_STD_STRING_VIEW\n\n#include <string_view>\n\n// Extensions for std::string:\n\n#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\n\nnamespace nonstd {\n\ntemplate< class CharT, class Traits, class Allocator = std::allocator<CharT> >\nstd::basic_string<CharT, Traits, Allocator>\nto_string( std::basic_string_view<CharT, Traits> v, Allocator const & a = Allocator() )\n{\n    return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );\n}\n\ntemplate< class CharT, class Traits, class Allocator >\nstd::basic_string_view<CharT, Traits>\nto_string_view( std::basic_string<CharT, Traits, Allocator> const & s )\n{\n    return std::basic_string_view<CharT, Traits>( s.data(), s.size() );\n}\n\n// Literal operators sv and _sv:\n\n#if nssv_CONFIG_STD_SV_OPERATOR\n\nusing namespace std::literals::string_view_literals;\n\n#endif\n\n#if nssv_CONFIG_USR_SV_OPERATOR\n\ninline namespace literals {\ninline namespace string_view_literals {\n\n\nconstexpr std::string_view operator \"\"_sv( const char* str, size_t len ) noexcept  // (1)\n{\n    return std::string_view{ str, len };\n}\n\nconstexpr std::u16string_view operator \"\"_sv( const char16_t* str, size_t len ) noexcept  // (2)\n{\n    return std::u16string_view{ str, len };\n}\n\nconstexpr std::u32string_view operator \"\"_sv( const char32_t* str, size_t len ) noexcept  // (3)\n{\n    return std::u32string_view{ str, len };\n}\n\nconstexpr std::wstring_view operator \"\"_sv( const wchar_t* str, size_t len ) noexcept  // (4)\n{\n    return std::wstring_view{ str, len };\n}\n\n}} // namespace literals::string_view_literals\n\n#endif // nssv_CONFIG_USR_SV_OPERATOR\n\n} // namespace nonstd\n\n#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\n\nnamespace nonstd {\n\nusing std::string_view;\nusing std::wstring_view;\nusing std::u16string_view;\nusing std::u32string_view;\nusing std::basic_string_view;\n\n// literal \"sv\" and \"_sv\", see above\n\nusing std::operator==;\nusing std::operator!=;\nusing std::operator<;\nusing std::operator<=;\nusing std::operator>;\nusing std::operator>=;\n\nusing std::operator<<;\n\n} // namespace nonstd\n\n#else // nssv_HAVE_STD_STRING_VIEW\n\n//\n// Before C++17: use string_view lite:\n//\n\n// Compiler versions:\n//\n// MSVC++ 6.0  _MSC_VER == 1200 (Visual Studio 6.0)\n// MSVC++ 7.0  _MSC_VER == 1300 (Visual Studio .NET 2002)\n// MSVC++ 7.1  _MSC_VER == 1310 (Visual Studio .NET 2003)\n// MSVC++ 8.0  _MSC_VER == 1400 (Visual Studio 2005)\n// MSVC++ 9.0  _MSC_VER == 1500 (Visual Studio 2008)\n// MSVC++ 10.0 _MSC_VER == 1600 (Visual Studio 2010)\n// MSVC++ 11.0 _MSC_VER == 1700 (Visual Studio 2012)\n// MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)\n// MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)\n// MSVC++ 14.1 _MSC_VER >= 1910 (Visual Studio 2017)\n\n#if defined(_MSC_VER ) && !defined(__clang__)\n# define nssv_COMPILER_MSVC_VER      (_MSC_VER )\n# define nssv_COMPILER_MSVC_VERSION  (_MSC_VER / 10 - 10 * ( 5 + (_MSC_VER < 1900 ) ) )\n#else\n# define nssv_COMPILER_MSVC_VER      0\n# define nssv_COMPILER_MSVC_VERSION  0\n#endif\n\n#define nssv_COMPILER_VERSION( major, minor, patch )  (10 * ( 10 * major + minor) + patch)\n\n#if defined(__clang__)\n# define nssv_COMPILER_CLANG_VERSION  nssv_COMPILER_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)\n#else\n# define nssv_COMPILER_CLANG_VERSION    0\n#endif\n\n#if defined(__GNUC__) && !defined(__clang__)\n# define nssv_COMPILER_GNUC_VERSION  nssv_COMPILER_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)\n#else\n# define nssv_COMPILER_GNUC_VERSION    0\n#endif\n\n// half-open range [lo..hi):\n#define nssv_BETWEEN( v, lo, hi ) ( (lo) <= (v) && (v) < (hi) )\n\n// Presence of language and library features:\n\n#ifdef _HAS_CPP0X\n# define nssv_HAS_CPP0X  _HAS_CPP0X\n#else\n# define nssv_HAS_CPP0X  0\n#endif\n\n// Unless defined otherwise below, consider VC14 as C++11 for variant-lite:\n\n#if nssv_COMPILER_MSVC_VER >= 1900\n# undef  nssv_CPP11_OR_GREATER\n# define nssv_CPP11_OR_GREATER  1\n#endif\n\n#define nssv_CPP11_90   (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1500)\n#define nssv_CPP11_100  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1600)\n#define nssv_CPP11_110  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1700)\n#define nssv_CPP11_120  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1800)\n#define nssv_CPP11_140  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1900)\n#define nssv_CPP11_141  (nssv_CPP11_OR_GREATER_ || nssv_COMPILER_MSVC_VER >= 1910)\n\n#define nssv_CPP14_000  (nssv_CPP14_OR_GREATER)\n#define nssv_CPP17_000  (nssv_CPP17_OR_GREATER)\n\n// Presence of C++11 language features:\n\n#define nssv_HAVE_CONSTEXPR_11          nssv_CPP11_140\n#define nssv_HAVE_EXPLICIT_CONVERSION   nssv_CPP11_140\n#define nssv_HAVE_INLINE_NAMESPACE      nssv_CPP11_140\n#define nssv_HAVE_NOEXCEPT              nssv_CPP11_140\n#define nssv_HAVE_NULLPTR               nssv_CPP11_100\n#define nssv_HAVE_REF_QUALIFIER         nssv_CPP11_140\n#define nssv_HAVE_UNICODE_LITERALS      nssv_CPP11_140\n#define nssv_HAVE_USER_DEFINED_LITERALS nssv_CPP11_140\n#define nssv_HAVE_WCHAR16_T             nssv_CPP11_100\n#define nssv_HAVE_WCHAR32_T             nssv_CPP11_100\n\n#if ! ( ( nssv_CPP11 && nssv_COMPILER_CLANG_VERSION ) || nssv_BETWEEN( nssv_COMPILER_CLANG_VERSION, 300, 400 ) )\n# define nssv_HAVE_STD_DEFINED_LITERALS  nssv_CPP11_140\n#endif\n\n// Presence of C++14 language features:\n\n#define nssv_HAVE_CONSTEXPR_14          nssv_CPP14_000\n\n// Presence of C++17 language features:\n\n#define nssv_HAVE_NODISCARD             nssv_CPP17_000\n\n// Presence of C++ library features:\n\n#define nssv_HAVE_STD_HASH              nssv_CPP11_120\n\n// C++ feature usage:\n\n#if nssv_HAVE_CONSTEXPR_11\n# define nssv_constexpr  constexpr\n#else\n# define nssv_constexpr  /*constexpr*/\n#endif\n\n#if  nssv_HAVE_CONSTEXPR_14\n# define nssv_constexpr14  constexpr\n#else\n# define nssv_constexpr14  /*constexpr*/\n#endif\n\n#if nssv_HAVE_EXPLICIT_CONVERSION\n# define nssv_explicit  explicit\n#else\n# define nssv_explicit  /*explicit*/\n#endif\n\n#if nssv_HAVE_INLINE_NAMESPACE\n# define nssv_inline_ns  inline\n#else\n# define nssv_inline_ns  /*inline*/\n#endif\n\n#if nssv_HAVE_NOEXCEPT\n# define nssv_noexcept  noexcept\n#else\n# define nssv_noexcept  /*noexcept*/\n#endif\n\n//#if nssv_HAVE_REF_QUALIFIER\n//# define nssv_ref_qual  &\n//# define nssv_refref_qual  &&\n//#else\n//# define nssv_ref_qual  /*&*/\n//# define nssv_refref_qual  /*&&*/\n//#endif\n\n#if nssv_HAVE_NULLPTR\n# define nssv_nullptr  nullptr\n#else\n# define nssv_nullptr  NULL\n#endif\n\n#if nssv_HAVE_NODISCARD\n# define nssv_nodiscard  [[nodiscard]]\n#else\n# define nssv_nodiscard  /*[[nodiscard]]*/\n#endif\n\n// Additional includes:\n\n#include <algorithm>\n#include <cassert>\n#include <iterator>\n#include <limits>\n#include <ostream>\n#include <string>   // std::char_traits<>\n\n#if ! nssv_CONFIG_NO_EXCEPTIONS\n# include <stdexcept>\n#endif\n\n#if nssv_CPP11_OR_GREATER\n# include <type_traits>\n#endif\n\n// Clang, GNUC, MSVC warning suppression macros:\n\n#if defined(__clang__)\n# pragma clang diagnostic ignored \"-Wreserved-user-defined-literal\"\n# pragma clang diagnostic push\n# pragma clang diagnostic ignored \"-Wuser-defined-literals\"\n#elif defined(__GNUC__)\n# pragma  GCC  diagnostic push\n# pragma  GCC  diagnostic ignored \"-Wliteral-suffix\"\n#endif // __clang__\n\n#if nssv_COMPILER_MSVC_VERSION >= 140\n# define nssv_SUPPRESS_MSGSL_WARNING(expr)        [[gsl::suppress(expr)]]\n# define nssv_SUPPRESS_MSVC_WARNING(code, descr)  __pragma(warning(suppress: code) )\n# define nssv_DISABLE_MSVC_WARNINGS(codes)        __pragma(warning(push))  __pragma(warning(disable: codes))\n#else\n# define nssv_SUPPRESS_MSGSL_WARNING(expr)\n# define nssv_SUPPRESS_MSVC_WARNING(code, descr)\n# define nssv_DISABLE_MSVC_WARNINGS(codes)\n#endif\n\n#if defined(__clang__)\n# define nssv_RESTORE_WARNINGS()  _Pragma(\"clang diagnostic pop\")\n#elif defined(__GNUC__)\n# define nssv_RESTORE_WARNINGS()  _Pragma(\"GCC diagnostic pop\")\n#elif nssv_COMPILER_MSVC_VERSION >= 140\n# define nssv_RESTORE_WARNINGS()  __pragma(warning(pop ))\n#else\n# define nssv_RESTORE_WARNINGS()\n#endif\n\n// Suppress the following MSVC (GSL) warnings:\n// - C4455, non-gsl   : 'operator \"\"sv': literal suffix identifiers that do not\n//                      start with an underscore are reserved\n// - C26472, gsl::t.1 : don't use a static_cast for arithmetic conversions;\n//                      use brace initialization, gsl::narrow_cast or gsl::narow\n// - C26481: gsl::b.1 : don't use pointer arithmetic. Use span instead\n\nnssv_DISABLE_MSVC_WARNINGS( 4455 26481 26472 )\n//nssv_DISABLE_CLANG_WARNINGS( \"-Wuser-defined-literals\" )\n//nssv_DISABLE_GNUC_WARNINGS( -Wliteral-suffix )\n\nnamespace nonstd { namespace sv_lite {\n\ntemplate\n<\n    class CharT,\n    class Traits = std::char_traits<CharT>\n>\nclass basic_string_view;\n\n//\n// basic_string_view:\n//\n\ntemplate\n<\n    class CharT,\n    class Traits /* = std::char_traits<CharT> */\n>\nclass basic_string_view\n{\npublic:\n    // Member types:\n\n    typedef Traits traits_type;\n    typedef CharT  value_type;\n\n    typedef CharT       * pointer;\n    typedef CharT const * const_pointer;\n    typedef CharT       & reference;\n    typedef CharT const & const_reference;\n\n    typedef const_pointer iterator;\n    typedef const_pointer const_iterator;\n    typedef std::reverse_iterator< const_iterator > reverse_iterator;\n    typedef\tstd::reverse_iterator< const_iterator > const_reverse_iterator;\n\n    typedef std::size_t     size_type;\n    typedef std::ptrdiff_t  difference_type;\n\n    // 24.4.2.1 Construction and assignment:\n\n    nssv_constexpr basic_string_view() nssv_noexcept\n        : data_( nssv_nullptr )\n        , size_( 0 )\n    {}\n\n#if nssv_CPP11_OR_GREATER\n    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept = default;\n#else\n    nssv_constexpr basic_string_view( basic_string_view const & other ) nssv_noexcept\n        : data_( other.data_)\n        , size_( other.size_)\n    {}\n#endif\n\n    nssv_constexpr basic_string_view( CharT const * s, size_type count )\n        : data_( s )\n        , size_( count )\n    {}\n\n    nssv_constexpr basic_string_view( CharT const * s)\n        : data_( s )\n        , size_( Traits::length(s) )\n    {}\n\n    // Assignment:\n\n#if nssv_CPP11_OR_GREATER\n    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept = default;\n#else\n    nssv_constexpr14 basic_string_view & operator=( basic_string_view const & other ) nssv_noexcept\n    {\n        data_ = other.data_;\n        size_ = other.size_;\n        return *this;\n    }\n#endif\n\n    // 24.4.2.2 Iterator support:\n\n    nssv_constexpr const_iterator begin()  const nssv_noexcept { return data_;         }\n    nssv_constexpr const_iterator end()    const nssv_noexcept { return data_ + size_; }\n\n    nssv_constexpr const_iterator cbegin() const nssv_noexcept { return begin(); }\n    nssv_constexpr const_iterator cend()   const nssv_noexcept { return end();   }\n\n    nssv_constexpr const_reverse_iterator rbegin()  const nssv_noexcept { return const_reverse_iterator( end() );   }\n    nssv_constexpr const_reverse_iterator rend()    const nssv_noexcept { return const_reverse_iterator( begin() ); }\n\n    nssv_constexpr const_reverse_iterator crbegin() const nssv_noexcept { return rbegin(); }\n    nssv_constexpr const_reverse_iterator crend()   const nssv_noexcept { return rend();   }\n\n    // 24.4.2.3 Capacity:\n\n    nssv_constexpr size_type size()     const nssv_noexcept { return size_; }\n    nssv_constexpr size_type length()   const nssv_noexcept { return size_; }\n    nssv_constexpr size_type max_size() const nssv_noexcept { return (std::numeric_limits< size_type >::max)(); }\n\n    // since C++20\n    nssv_nodiscard nssv_constexpr bool empty() const nssv_noexcept\n    {\n        return 0 == size_;\n    }\n\n    // 24.4.2.4 Element access:\n\n    nssv_constexpr const_reference operator[]( size_type pos ) const\n    {\n        return data_at( pos );\n    }\n\n    nssv_constexpr14 const_reference at( size_type pos ) const\n    {\n#if nssv_CONFIG_NO_EXCEPTIONS\n        assert( pos < size() );\n#else\n        if ( pos >= size() )\n        {\n            throw std::out_of_range(\"nonst::string_view::at()\");\n        }\n#endif\n        return data_at( pos );\n    }\n\n    nssv_constexpr const_reference front() const { return data_at( 0 );          }\n    nssv_constexpr const_reference back()  const { return data_at( size() - 1 ); }\n\n    nssv_constexpr const_pointer   data()  const nssv_noexcept { return data_; }\n\n    // 24.4.2.5 Modifiers:\n\n    nssv_constexpr14 void remove_prefix( size_type n )\n    {\n        assert( n <= size() );\n        data_ += n;\n        size_ -= n;\n    }\n\n    nssv_constexpr14 void remove_suffix( size_type n )\n    {\n        assert( n <= size() );\n        size_ -= n;\n    }\n\n    nssv_constexpr14 void swap( basic_string_view & other ) nssv_noexcept\n    {\n        using std::swap;\n        swap( data_, other.data_ );\n        swap( size_, other.size_ );\n    }\n\n    // 24.4.2.6 String operations:\n\n    size_type copy( CharT * dest, size_type n, size_type pos = 0 ) const\n    {\n#if nssv_CONFIG_NO_EXCEPTIONS\n        assert( pos <= size() );\n#else\n        if ( pos > size() )\n        {\n            throw std::out_of_range(\"nonst::string_view::copy()\");\n        }\n#endif\n        const size_type rlen = (std::min)( n, size() - pos );\n\n        (void) Traits::copy( dest, data() + pos, rlen );\n\n        return rlen;\n    }\n\n    nssv_constexpr14 basic_string_view substr( size_type pos = 0, size_type n = npos ) const\n    {\n#if nssv_CONFIG_NO_EXCEPTIONS\n        assert( pos <= size() );\n#else\n        if ( pos > size() )\n        {\n            throw std::out_of_range(\"nonst::string_view::substr()\");\n        }\n#endif\n        return basic_string_view( data() + pos, (std::min)( n, size() - pos ) );\n    }\n\n    // compare(), 6x:\n\n    nssv_constexpr14 int compare( basic_string_view other ) const nssv_noexcept // (1)\n    {\n        if ( const int result = Traits::compare( data(), other.data(), (std::min)( size(), other.size() ) ) )\n            return result;\n\n        return size() == other.size() ? 0 : size() < other.size() ? -1 : 1;\n    }\n\n    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other ) const // (2)\n    {\n        return substr( pos1, n1 ).compare( other );\n    }\n\n    nssv_constexpr int compare( size_type pos1, size_type n1, basic_string_view other, size_type pos2, size_type n2 ) const // (3)\n    {\n        return substr( pos1, n1 ).compare( other.substr( pos2, n2 ) );\n    }\n\n    nssv_constexpr int compare( CharT const * s ) const // (4)\n    {\n        return compare( basic_string_view( s ) );\n    }\n\n    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s ) const // (5)\n    {\n        return substr( pos1, n1 ).compare( basic_string_view( s ) );\n    }\n\n    nssv_constexpr int compare( size_type pos1, size_type n1, CharT const * s, size_type n2 ) const // (6)\n    {\n        return substr( pos1, n1 ).compare( basic_string_view( s, n2 ) );\n    }\n\n    // 24.4.2.7 Searching:\n\n    // starts_with(), 3x, since C++20:\n\n    nssv_constexpr bool starts_with( basic_string_view v ) const nssv_noexcept  // (1)\n    {\n        return size() >= v.size() && compare( 0, v.size(), v ) == 0;\n    }\n\n    nssv_constexpr bool starts_with( CharT c ) const nssv_noexcept  // (2)\n    {\n        return starts_with( basic_string_view( &c, 1 ) );\n    }\n\n    nssv_constexpr bool starts_with( CharT const * s ) const  // (3)\n    {\n        return starts_with( basic_string_view( s ) );\n    }\n\n    // ends_with(), 3x, since C++20:\n\n    nssv_constexpr bool ends_with( basic_string_view v ) const nssv_noexcept  // (1)\n    {\n        return size() >= v.size() && compare( size() - v.size(), npos, v ) == 0;\n    }\n\n    nssv_constexpr bool ends_with( CharT c ) const nssv_noexcept  // (2)\n    {\n        return ends_with( basic_string_view( &c, 1 ) );\n    }\n\n    nssv_constexpr bool ends_with( CharT const * s ) const  // (3)\n    {\n        return ends_with( basic_string_view( s ) );\n    }\n\n    // find(), 4x:\n\n    nssv_constexpr14 size_type find( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)\n    {\n        return assert( v.size() == 0 || v.data() != nssv_nullptr )\n            , pos >= size()\n            ? npos\n            : to_pos( std::search( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );\n    }\n\n    nssv_constexpr14 size_type find( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)\n    {\n        return find( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr14 size_type find( CharT const * s, size_type pos, size_type n ) const  // (3)\n    {\n        return find( basic_string_view( s, n ), pos );\n    }\n\n    nssv_constexpr14 size_type find( CharT const * s, size_type pos = 0 ) const  // (4)\n    {\n        return find( basic_string_view( s ), pos );\n    }\n\n    // rfind(), 4x:\n\n    nssv_constexpr14 size_type rfind( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)\n    {\n        if ( size() < v.size() )\n            return npos;\n\n        if ( v.empty() )\n            return (std::min)( size(), pos );\n\n        const_iterator last   = cbegin() + (std::min)( size() - v.size(), pos ) + v.size();\n        const_iterator result = std::find_end( cbegin(), last, v.cbegin(), v.cend(), Traits::eq );\n\n        return result != last ? size_type( result - cbegin() ) : npos;\n    }\n\n    nssv_constexpr14 size_type rfind( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)\n    {\n        return rfind( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos, size_type n ) const  // (3)\n    {\n        return rfind( basic_string_view( s, n ), pos );\n    }\n\n    nssv_constexpr14 size_type rfind( CharT const * s, size_type pos = npos ) const  // (4)\n    {\n        return rfind( basic_string_view( s ), pos );\n    }\n\n    // find_first_of(), 4x:\n\n    nssv_constexpr size_type find_first_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)\n    {\n        return pos >= size()\n            ? npos\n            : to_pos( std::find_first_of( cbegin() + pos, cend(), v.cbegin(), v.cend(), Traits::eq ) );\n    }\n\n    nssv_constexpr size_type find_first_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)\n    {\n        return find_first_of( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr size_type find_first_of( CharT const * s, size_type pos, size_type n ) const  // (3)\n    {\n        return find_first_of( basic_string_view( s, n ), pos );\n    }\n\n    nssv_constexpr size_type find_first_of(  CharT const * s, size_type pos = 0 ) const  // (4)\n    {\n        return find_first_of( basic_string_view( s ), pos );\n    }\n\n    // find_last_of(), 4x:\n\n    nssv_constexpr size_type find_last_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)\n    {\n        return empty()\n            ? npos\n            : pos >= size()\n            ? find_last_of( v, size() - 1 )\n            : to_pos( std::find_first_of( const_reverse_iterator( cbegin() + pos + 1 ), crend(), v.cbegin(), v.cend(), Traits::eq ) );\n    }\n\n    nssv_constexpr size_type find_last_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)\n    {\n        return find_last_of( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos, size_type count ) const  // (3)\n    {\n        return find_last_of( basic_string_view( s, count ), pos );\n    }\n\n    nssv_constexpr size_type find_last_of( CharT const * s, size_type pos = npos ) const  // (4)\n    {\n        return find_last_of( basic_string_view( s ), pos );\n    }\n\n    // find_first_not_of(), 4x:\n\n    nssv_constexpr size_type find_first_not_of( basic_string_view v, size_type pos = 0 ) const nssv_noexcept  // (1)\n    {\n        return pos >= size()\n            ? npos\n            : to_pos( std::find_if( cbegin() + pos, cend(), not_in_view( v ) ) );\n    }\n\n    nssv_constexpr size_type find_first_not_of( CharT c, size_type pos = 0 ) const nssv_noexcept  // (2)\n    {\n        return find_first_not_of( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)\n    {\n        return find_first_not_of( basic_string_view( s, count ), pos );\n    }\n\n    nssv_constexpr size_type find_first_not_of( CharT const * s, size_type pos = 0 ) const  // (4)\n    {\n        return find_first_not_of( basic_string_view( s ), pos );\n    }\n\n    // find_last_not_of(), 4x:\n\n    nssv_constexpr size_type find_last_not_of( basic_string_view v, size_type pos = npos ) const nssv_noexcept  // (1)\n    {\n        return empty()\n            ? npos\n            : pos >= size()\n            ? find_last_not_of( v, size() - 1 )\n            : to_pos( std::find_if( const_reverse_iterator( cbegin() + pos + 1 ), crend(), not_in_view( v ) ) );\n    }\n\n    nssv_constexpr size_type find_last_not_of( CharT c, size_type pos = npos ) const nssv_noexcept  // (2)\n    {\n        return find_last_not_of( basic_string_view( &c, 1 ), pos );\n    }\n\n    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos, size_type count ) const  // (3)\n    {\n        return find_last_not_of( basic_string_view( s, count ), pos );\n    }\n\n    nssv_constexpr size_type find_last_not_of( CharT const * s, size_type pos = npos ) const  // (4)\n    {\n        return find_last_not_of( basic_string_view( s ), pos );\n    }\n\n    // Constants:\n\n#if nssv_CPP17_OR_GREATER\n    static nssv_constexpr size_type npos = size_type(-1);\n#elif nssv_CPP11_OR_GREATER\n    enum : size_type { npos = size_type(-1) };\n#else\n    enum { npos = size_type(-1) };\n#endif\n\nprivate:\n    struct not_in_view\n    {\n        const basic_string_view v;\n\n        nssv_constexpr not_in_view( basic_string_view v ) : v( v ) {}\n\n        nssv_constexpr bool operator()( CharT c ) const\n        {\n            return npos == v.find_first_of( c );\n        }\n    };\n\n    nssv_constexpr size_type to_pos( const_iterator it ) const\n    {\n        return it == cend() ? npos : size_type( it - cbegin() );\n    }\n\n    nssv_constexpr size_type to_pos( const_reverse_iterator it ) const\n    {\n        return it == crend() ? npos : size_type( crend() - it - 1 );\n    }\n\n    nssv_constexpr const_reference data_at( size_type pos ) const\n    {\n#if nssv_BETWEEN( nssv_COMPILER_GNUC_VERSION, 1, 500 )\n        return data_[pos];\n#else\n        return assert( pos < size() ), data_[pos];\n#endif\n    }\n\nprivate:\n    const_pointer data_;\n    size_type     size_;\n\npublic:\n#if nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS\n\n    template< class Allocator >\n    basic_string_view( std::basic_string<CharT, Traits, Allocator> const & s ) nssv_noexcept\n        : data_( s.data() )\n        , size_( s.size() )\n    {}\n\n#if nssv_HAVE_EXPLICIT_CONVERSION\n\n    template< class Allocator >\n    explicit operator std::basic_string<CharT, Traits, Allocator>() const\n    {\n        return to_string( Allocator() );\n    }\n\n#endif // nssv_HAVE_EXPLICIT_CONVERSION\n\n#if nssv_CPP11_OR_GREATER\n\n    template< class Allocator = std::allocator<CharT> >\n    std::basic_string<CharT, Traits, Allocator>\n    to_string( Allocator const & a = Allocator() ) const\n    {\n        return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );\n    }\n\n#else\n\n    std::basic_string<CharT, Traits>\n    to_string() const\n    {\n        return std::basic_string<CharT, Traits>( begin(), end() );\n    }\n\n    template< class Allocator >\n    std::basic_string<CharT, Traits, Allocator>\n    to_string( Allocator const & a ) const\n    {\n        return std::basic_string<CharT, Traits, Allocator>( begin(), end(), a );\n    }\n\n#endif // nssv_CPP11_OR_GREATER\n\n#endif // nssv_CONFIG_CONVERSION_STD_STRING_CLASS_METHODS\n};\n\n//\n// Non-member functions:\n//\n\n// 24.4.3 Non-member comparison functions:\n// lexicographically compare two string views (function template):\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator== (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) == 0 ; }\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator!= (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) != 0 ; }\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator< (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) < 0 ; }\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator<= (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) <= 0 ; }\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator> (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) > 0 ; }\n\ntemplate< class CharT, class Traits >\nnssv_constexpr bool operator>= (\n    basic_string_view <CharT, Traits> lhs,\n    basic_string_view <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) >= 0 ; }\n\n// Let S be basic_string_view<CharT, Traits>, and sv be an instance of S.\n// Implementations shall provide sufficient additional overloads marked\n// constexpr and noexcept so that an object t with an implicit conversion\n// to S can be compared according to Table 67.\n\n#if nssv_CPP11_OR_GREATER && ! nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 100, 141 )\n\n#define nssv_BASIC_STRING_VIEW_I(T,U)  typename std::decay< basic_string_view<T,U> >::type\n\n#if nssv_BETWEEN( nssv_COMPILER_MSVC_VERSION, 140, 150 )\n# define nssv_MSVC_ORDER(x)  , int=x\n#else\n# define nssv_MSVC_ORDER(x)  /*, int=x*/\n#endif\n\n// ==\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator==(\n         basic_string_view  <CharT, Traits> lhs,\n    nssv_BASIC_STRING_VIEW_I(CharT, Traits) rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) == 0; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator==(\n    nssv_BASIC_STRING_VIEW_I(CharT, Traits) lhs,\n         basic_string_view  <CharT, Traits> rhs ) nssv_noexcept\n{ return lhs.size() == rhs.size() && lhs.compare( rhs ) == 0; }\n\n// !=\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator!= (\n         basic_string_view  < CharT, Traits > lhs,\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept\n{ return lhs.size() != rhs.size() || lhs.compare( rhs ) != 0 ; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator!= (\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,\n         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) != 0 ; }\n\n// <\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator< (\n         basic_string_view  < CharT, Traits > lhs,\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) < 0 ; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator< (\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,\n         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) < 0 ; }\n\n// <=\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator<= (\n         basic_string_view  < CharT, Traits > lhs,\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) <= 0 ; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator<= (\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,\n         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) <= 0 ; }\n\n// >\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator> (\n         basic_string_view  < CharT, Traits > lhs,\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) > 0 ; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator> (\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,\n         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) > 0 ; }\n\n// >=\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(1) >\nnssv_constexpr bool operator>= (\n         basic_string_view  < CharT, Traits > lhs,\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) >= 0 ; }\n\ntemplate< class CharT, class Traits  nssv_MSVC_ORDER(2) >\nnssv_constexpr bool operator>= (\n    nssv_BASIC_STRING_VIEW_I( CharT, Traits ) lhs,\n         basic_string_view  < CharT, Traits > rhs ) nssv_noexcept\n{ return lhs.compare( rhs ) >= 0 ; }\n\n#undef nssv_MSVC_ORDER\n#undef nssv_BASIC_STRING_VIEW_I\n\n#endif // nssv_CPP11_OR_GREATER\n\n// 24.4.4 Inserters and extractors:\n\nnamespace detail {\n\ntemplate< class Stream >\nvoid write_padding( Stream & os, std::streamsize n )\n{\n    for ( std::streamsize i = 0; i < n; ++i )\n        os.rdbuf()->sputc( os.fill() );\n}\n\ntemplate< class Stream, class View >\nStream & write_to_stream( Stream & os, View const & sv )\n{\n    typename Stream::sentry sentry( os );\n\n    if ( !os )\n        return os;\n\n    const std::streamsize length = static_cast<std::streamsize>( sv.length() );\n\n    // Whether, and how, to pad:\n    const bool      pad = ( length < os.width() );\n    const bool left_pad = pad && ( os.flags() & std::ios_base::adjustfield ) == std::ios_base::right;\n\n    if ( left_pad )\n        write_padding( os, os.width() - length );\n\n    // Write span characters:\n    os.rdbuf()->sputn( sv.begin(), length );\n\n    if ( pad && !left_pad )\n        write_padding( os, os.width() - length );\n\n    // Reset output stream width:\n    os.width( 0 );\n\n    return os;\n}\n\n} // namespace detail\n\ntemplate< class CharT, class Traits >\nstd::basic_ostream<CharT, Traits> &\noperator<<(\n    std::basic_ostream<CharT, Traits>& os,\n    basic_string_view <CharT, Traits> sv )\n{\n    return detail::write_to_stream( os, sv );\n}\n\n// Several typedefs for common character types are provided:\n\ntypedef basic_string_view<char>      string_view;\ntypedef basic_string_view<wchar_t>   wstring_view;\n#if nssv_HAVE_WCHAR16_T\ntypedef basic_string_view<char16_t>  u16string_view;\ntypedef basic_string_view<char32_t>  u32string_view;\n#endif\n\n}} // namespace nonstd::sv_lite\n\n//\n// 24.4.6 Suffix for basic_string_view literals:\n//\n\n#if nssv_HAVE_USER_DEFINED_LITERALS\n\nnamespace nonstd {\nnssv_inline_ns namespace literals {\nnssv_inline_ns namespace string_view_literals {\n\n#if nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS\n\nnssv_constexpr nonstd::sv_lite::string_view operator \"\" sv( const char* str, size_t len ) nssv_noexcept  // (1)\n{\n    return nonstd::sv_lite::string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::u16string_view operator \"\" sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)\n{\n    return nonstd::sv_lite::u16string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::u32string_view operator \"\" sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)\n{\n    return nonstd::sv_lite::u32string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::wstring_view operator \"\" sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)\n{\n    return nonstd::sv_lite::wstring_view{ str, len };\n}\n\n#endif // nssv_CONFIG_STD_SV_OPERATOR && nssv_HAVE_STD_DEFINED_LITERALS\n\n#if nssv_CONFIG_USR_SV_OPERATOR\n\nnssv_constexpr nonstd::sv_lite::string_view operator \"\" _sv( const char* str, size_t len ) nssv_noexcept  // (1)\n{\n    return nonstd::sv_lite::string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::u16string_view operator \"\" _sv( const char16_t* str, size_t len ) nssv_noexcept  // (2)\n{\n    return nonstd::sv_lite::u16string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::u32string_view operator \"\" _sv( const char32_t* str, size_t len ) nssv_noexcept  // (3)\n{\n    return nonstd::sv_lite::u32string_view{ str, len };\n}\n\nnssv_constexpr nonstd::sv_lite::wstring_view operator \"\" _sv( const wchar_t* str, size_t len ) nssv_noexcept  // (4)\n{\n    return nonstd::sv_lite::wstring_view{ str, len };\n}\n\n#endif // nssv_CONFIG_USR_SV_OPERATOR\n\n}}} // namespace nonstd::literals::string_view_literals\n\n#endif\n\n//\n// Extensions for std::string:\n//\n\n#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\n\nnamespace nonstd {\nnamespace sv_lite {\n\n// Exclude MSVC 14 (19.00): it yields ambiguous to_string():\n\n#if nssv_CPP11_OR_GREATER && nssv_COMPILER_MSVC_VERSION != 140\n\ntemplate< class CharT, class Traits, class Allocator = std::allocator<CharT> >\nstd::basic_string<CharT, Traits, Allocator>\nto_string( basic_string_view<CharT, Traits> v, Allocator const & a = Allocator() )\n{\n    return std::basic_string<CharT,Traits, Allocator>( v.begin(), v.end(), a );\n}\n\n#else\n\ntemplate< class CharT, class Traits >\nstd::basic_string<CharT, Traits>\nto_string( basic_string_view<CharT, Traits> v )\n{\n    return std::basic_string<CharT, Traits>( v.begin(), v.end() );\n}\n\ntemplate< class CharT, class Traits, class Allocator >\nstd::basic_string<CharT, Traits, Allocator>\nto_string( basic_string_view<CharT, Traits> v, Allocator const & a )\n{\n    return std::basic_string<CharT, Traits, Allocator>( v.begin(), v.end(), a );\n}\n\n#endif // nssv_CPP11_OR_GREATER\n\ntemplate< class CharT, class Traits, class Allocator >\nbasic_string_view<CharT, Traits>\nto_string_view( std::basic_string<CharT, Traits, Allocator> const & s )\n{\n    return basic_string_view<CharT, Traits>( s.data(), s.size() );\n}\n\n}} // namespace nonstd::sv_lite\n\n#endif // nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\n\n//\n// make types and algorithms available in namespace nonstd:\n//\n\nnamespace nonstd {\n\nusing sv_lite::basic_string_view;\nusing sv_lite::string_view;\nusing sv_lite::wstring_view;\n\n#if nssv_HAVE_WCHAR16_T\nusing sv_lite::u16string_view;\n#endif\n#if nssv_HAVE_WCHAR32_T\nusing sv_lite::u32string_view;\n#endif\n\n// literal \"sv\"\n\nusing sv_lite::operator==;\nusing sv_lite::operator!=;\nusing sv_lite::operator<;\nusing sv_lite::operator<=;\nusing sv_lite::operator>;\nusing sv_lite::operator>=;\n\nusing sv_lite::operator<<;\n\n#if nssv_CONFIG_CONVERSION_STD_STRING_FREE_FUNCTIONS\nusing sv_lite::to_string;\nusing sv_lite::to_string_view;\n#endif\n\n} // namespace nonstd\n\n// 24.4.5 Hash support (C++11):\n\n// Note: The hash value of a string view object is equal to the hash value of\n// the corresponding string object.\n\n#if nssv_HAVE_STD_HASH\n\n#include <functional>\n\nnamespace std {\n\ntemplate<>\nstruct hash< nonstd::string_view >\n{\npublic:\n    std::size_t operator()( nonstd::string_view v ) const nssv_noexcept\n    {\n        return std::hash<std::string>()( std::string( v.data(), v.size() ) );\n    }\n};\n\ntemplate<>\nstruct hash< nonstd::wstring_view >\n{\npublic:\n    std::size_t operator()( nonstd::wstring_view v ) const nssv_noexcept\n    {\n        return std::hash<std::wstring>()( std::wstring( v.data(), v.size() ) );\n    }\n};\n\ntemplate<>\nstruct hash< nonstd::u16string_view >\n{\npublic:\n    std::size_t operator()( nonstd::u16string_view v ) const nssv_noexcept\n    {\n        return std::hash<std::u16string>()( std::u16string( v.data(), v.size() ) );\n    }\n};\n\ntemplate<>\nstruct hash< nonstd::u32string_view >\n{\npublic:\n    std::size_t operator()( nonstd::u32string_view v ) const nssv_noexcept\n    {\n        return std::hash<std::u32string>()( std::u32string( v.data(), v.size() ) );\n    }\n};\n\n} // namespace std\n\n#endif // nssv_HAVE_STD_HASH\n\nnssv_RESTORE_WARNINGS()\n\n#endif // nssv_HAVE_STD_STRING_VIEW\n#endif // NONSTD_SV_LITE_H_INCLUDED\n\n#endif\n\nnamespace csv {\n#ifdef _MSC_VER\n#pragma region Compatibility Macros\n#endif\n    /**\n     *  @def IF_CONSTEXPR\n     *  Expands to `if constexpr` in C++17 and `if` otherwise\n     *\n     *  @def CONSTEXPR_VALUE\n     *  Expands to `constexpr` in C++17 and `const` otherwise.\n     *  Mainly used for global variables.\n     *\n     *  @def CONSTEXPR\n     *  Expands to `constexpr` in decent compilers and `inline` otherwise.\n     *  Intended for functions and methods.\n     */\n\n#define STATIC_ASSERT(x) static_assert(x, \"Assertion failed\")\n\n#ifdef CSV_HAS_CXX17\n     /** @typedef string_view\n      *  The string_view class used by this library.\n      */\n    using string_view = std::string_view;\n#else\n     /** @typedef string_view\n      *  The string_view class used by this library.\n      */\n    using string_view = nonstd::string_view;\n#endif\n\n#ifdef CSV_HAS_CXX17\n    #define IF_CONSTEXPR if constexpr\n    #define CONSTEXPR_VALUE constexpr\n\n    #define CONSTEXPR_17 constexpr\n#else\n    #define IF_CONSTEXPR if\n    #define CONSTEXPR_VALUE const\n\n    #define CONSTEXPR_17 inline\n#endif\n\n#ifdef CSV_HAS_CXX14\n    template<bool B, class T = void>\n    using enable_if_t = std::enable_if_t<B, T>;\n\n    #define CONSTEXPR_14 constexpr\n    #define CONSTEXPR_VALUE_14 constexpr\n#else\n    template<bool B, class T = void>\n    using enable_if_t = typename std::enable_if<B, T>::type;\n\n    #define CONSTEXPR_14 inline\n    #define CONSTEXPR_VALUE_14 const\n#endif\n\n#ifdef CSV_HAS_CXX17\n    template<typename F, typename... Args>\n    using invoke_result_t = typename std::invoke_result<F, Args...>::type;\n#else\n    template<typename F, typename... Args>\n    using invoke_result_t = typename std::result_of<F(Args...)>::type;\n#endif\n\n    // Resolves g++ bug with regard to constexpr methods.\n    // Keep this gated to C++17+, since C++11/14 pedantic mode rejects constexpr\n    // non-static members when the enclosing class is non-literal.\n    // See: https://stackoverflow.com/questions/36489369/constexpr-non-static-member-function-with-non-constexpr-constructor-gcc-clang-d\n#if defined(__GNUC__) && !defined(__clang__)\n    #if defined(CSV_HAS_CXX17) && (((__GNUC__ == 7) && (__GNUC_MINOR__ >= 2)) || (__GNUC__ >= 8))\n        #define CONSTEXPR constexpr\n    #endif\n#else\n    #ifdef CSV_HAS_CXX17\n        #define CONSTEXPR constexpr\n    #endif\n#endif\n\n#ifndef CONSTEXPR\n#define CONSTEXPR inline\n#endif\n\n#ifdef _MSC_VER\n#pragma endregion\n#endif\n\n    namespace internals {\n        // PAGE_SIZE macro could be already defined by the host system.\n#if defined(PAGE_SIZE)\n#undef PAGE_SIZE\n#endif\n\n// Get operating system specific details\n#if defined(_WIN32)\n        inline int getpagesize() {\n            _SYSTEM_INFO sys_info = {};\n            GetSystemInfo(&sys_info);\n            return std::max(sys_info.dwPageSize, sys_info.dwAllocationGranularity);\n        }\n\n        const int PAGE_SIZE = getpagesize();\n#elif defined(__linux__) \n        const int PAGE_SIZE = getpagesize();\n#else\n        /** Size of a memory page in bytes. Used by\n         *  csv::internals::CSVFieldArray when allocating blocks.\n         */\n        const int PAGE_SIZE = 4096;\n#endif\n\n        /** Chunk size for lazy-loading large CSV files\n         * \n         * The worker thread reads this many bytes at a time (10MB).\n         * \n         * CRITICAL INVARIANT: Field boundaries at chunk transitions must be preserved.\n         * Bug #280 was caused by fields spanning chunk boundaries being corrupted.\n         * \n         * @note Tests must write >10MB of data to cross chunk boundaries\n         * @see basic_csv_parser.cpp MmapParser::next() for chunk transition logic\n         */\n        constexpr size_t ITERATION_CHUNK_SIZE = 10000000; // 10MB\n\n        template<typename T>\n        inline bool is_equal(T a, T b, T epsilon = 0.001) {\n            /** Returns true if two floating point values are about the same */\n            static_assert(std::is_floating_point<T>::value, \"T must be a floating point type.\");\n            return std::abs(a - b) < epsilon;\n        }\n\n        /**  @typedef ParseFlags\n         *   An enum used for describing the significance of each character\n         *   with respect to CSV parsing\n         *\n         *   @see quote_escape_flag\n         */\n        enum class ParseFlags {\n            QUOTE_ESCAPE_QUOTE = 0, /**< A quote inside or terminating a quote_escaped field */\n            QUOTE = 2 | 1,          /**< Characters which may signify a quote escape */\n            NOT_SPECIAL = 4,        /**< Characters with no special meaning or escaped delimiters and newlines */\n            DELIMITER = 4 | 2,      /**< Characters which signify a new field */\n            NEWLINE = 4 | 2 | 1     /**< Characters which signify a new row */\n        };\n\n        /** Transform the ParseFlags given the context of whether or not the current\n         *  field is quote escaped */\n        constexpr ParseFlags quote_escape_flag(ParseFlags flag, bool quote_escape) noexcept {\n            return (ParseFlags)((int)flag & ~((int)ParseFlags::QUOTE * quote_escape));\n        }\n\n        // Assumed to be true by parsing functions: allows for testing\n        // if an item is DELIMITER or NEWLINE with a >= statement\n        STATIC_ASSERT(ParseFlags::DELIMITER < ParseFlags::NEWLINE);\n\n        /** Optimizations for reducing branching in parsing loop\n         *\n         *  Idea: The meaning of all non-quote characters changes depending\n         *  on whether or not the parser is in a quote-escaped mode (0 or 1)\n         */\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::NOT_SPECIAL, false) == ParseFlags::NOT_SPECIAL);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::QUOTE, false) == ParseFlags::QUOTE);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::DELIMITER, false) == ParseFlags::DELIMITER);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::NEWLINE, false) == ParseFlags::NEWLINE);\n\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::NOT_SPECIAL, true) == ParseFlags::NOT_SPECIAL);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::QUOTE, true) == ParseFlags::QUOTE_ESCAPE_QUOTE);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::DELIMITER, true) == ParseFlags::NOT_SPECIAL);\n        STATIC_ASSERT(quote_escape_flag(ParseFlags::NEWLINE, true) == ParseFlags::NOT_SPECIAL);\n\n        /** An array which maps ASCII chars to a parsing flag */\n        using ParseFlagMap = std::array<ParseFlags, 256>;\n\n        /** An array which maps ASCII chars to a flag indicating if it is whitespace */\n        using WhitespaceMap = std::array<bool, 256>;\n    }\n\n    /** Integer indicating a requested column wasn't found. */\n    constexpr int CSV_NOT_FOUND = -1;\n\n    /** Offset to convert char into array index. */\n    constexpr unsigned CHAR_OFFSET = std::numeric_limits<char>::is_signed ? 128 : 0;\n}\n\n\n#if (defined(__AVX2__) || defined(__SSE2__)) && !defined(CSV_NO_SIMD)\n#include <immintrin.h>\n// _tzcnt_u32 in GCC/Clang headers is __attribute__(__target__(\"bmi\")), which\n// requires -mbmi at the call site. __builtin_ctz has no such restriction and\n// emits BSF/TZCNT as the optimizer sees fit. MSVC's _tzcnt_u32 has no\n// equivalent restriction, so keep it there.\n#  ifdef _MSC_VER\n#    define CSV_TZCNT32(x) _tzcnt_u32(x)\n#  else\n#    define CSV_TZCNT32(x) static_cast<unsigned>(__builtin_ctz(x))\n#  endif\n#endif\n\nnamespace csv {\n    namespace internals {\n        // Precomputed SIMD broadcast vectors for the four CSV sentinel bytes.\n        // Constructed once per parser instance and passed by const-ref into\n        // find_next_non_special, amortizing broadcast cost across every field\n        // scan — meaningful for CSVs with many short fields.\n        //\n        // When no_quote mode is active, set quote_char = delimiter so that\n        // quote bytes are not mistakenly treated as sentinels (they are\n        // NOT_SPECIAL in that mode and must not cause SIMD to stop early).\n        struct SentinelVecs {\n            SentinelVecs() noexcept : SentinelVecs(',', '\"') {}\n\n            SentinelVecs(char delimiter, char quote_char) noexcept {\n#if defined(__AVX2__) && !defined(CSV_NO_SIMD)\n                v_delim = _mm256_set1_epi8(delimiter);\n                v_quote = _mm256_set1_epi8(quote_char);\n                v_lf    = _mm256_set1_epi8('\\n');\n                v_cr    = _mm256_set1_epi8('\\r');\n#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)\n                v_delim = _mm_set1_epi8(delimiter);\n                v_quote = _mm_set1_epi8(quote_char);\n                v_lf    = _mm_set1_epi8('\\n');\n                v_cr    = _mm_set1_epi8('\\r');\n#else\n                (void)delimiter; (void)quote_char;\n#endif\n            }\n\n#if defined(__AVX2__) && !defined(CSV_NO_SIMD)\n            __m256i v_delim, v_quote, v_lf, v_cr;\n#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)\n            __m128i v_delim, v_quote, v_lf, v_cr;\n#endif\n        };\n\n        // Free function — easy to unit test independently of IBasicCSVParser.\n        //\n        // SIMD-only fast-forward: skips pos forward past any bytes that are\n        // definitely not one of the four CSV sentinel characters. Stops as\n        // soon as a sentinel byte is found OR fewer bytes remain than one\n        // SIMD lane. The caller is responsible for the scalar tail loop using\n        // compound_parse_flag, which correctly handles quote_escape state.\n        //\n        // State-agnostic by design: stops conservatively at any sentinel byte\n        // regardless of quote_escape. Inside a quoted field, delimiter and\n        // newline bytes are NOT_SPECIAL under compound_parse_flag, so the\n        // outer DFA loop re-enters parse_field immediately at zero cost.\n        inline size_t find_next_non_special(\n            csv::string_view data,\n            size_t pos,\n            const SentinelVecs& sentinels\n        ) noexcept\n        {\n#if defined(__AVX2__) && !defined(CSV_NO_SIMD)\n            while (pos + 32 <= data.size()) {\n                __m256i bytes   = _mm256_loadu_si256(reinterpret_cast<const __m256i*>(data.data() + pos));\n                __m256i special = _mm256_cmpeq_epi8(bytes, sentinels.v_delim);\n                special         = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_quote));\n                special         = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_lf));\n                special         = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_cr));\n                int mask        = _mm256_movemask_epi8(special);\n\n                if (mask != 0)\n                    return pos + CSV_TZCNT32(static_cast<unsigned>(mask));\n                pos += 32;\n            }\n#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)\n            while (pos + 16 <= data.size()) {\n                __m128i bytes   = _mm_loadu_si128(reinterpret_cast<const __m128i*>(data.data() + pos));\n                __m128i special = _mm_cmpeq_epi8(bytes, sentinels.v_delim);\n                special         = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_quote));\n                special         = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_lf));\n                special         = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_cr));\n                int mask        = _mm_movemask_epi8(special);\n\n                if (mask != 0)\n                    return pos + CSV_TZCNT32(static_cast<unsigned>(mask));\n                pos += 16;\n            }\n#else\n            (void)data; (void)sentinels;\n#endif\n            return pos;\n        }\n    }\n}\n\n#include <memory>\n#include <stdexcept>\n#include <unordered_map>\n#include <string>\n#include <vector>\n\n/** @file\n *  Defines an object used to store CSV format settings\n */\n\n#include <iterator>\n#include <stdexcept>\n#include <string>\n#include <vector>\n\n\nnamespace csv {\n    namespace internals {\n        class IBasicCSVParser;\n    }\n\n    class CSVReader;\n\n    /** Determines how to handle rows that are shorter or longer than the majority */\n    enum class VariableColumnPolicy {\n        THROW = -1,\n        IGNORE_ROW = 0,\n        KEEP   = 1\n    };\n\n    /** Determines how column name lookups are performed */\n    enum class ColumnNamePolicy {\n        EXACT = 0,            /**< Case-sensitive match (default) */\n        CASE_INSENSITIVE = 1  /**< Case-insensitive match */\n    };\n\n    /** Stores the inferred format of a CSV file. */\n    struct CSVGuessResult {\n        char delim;\n        int header_row;\n    };\n\n    /** Stores information about how to parse a CSV file.\n     *  Can be used to construct a csv::CSVReader. \n     */\n    class CSVFormat {\n    public:\n        /** Settings for parsing a RFC 4180 CSV file */\n        CSVFormat() = default;\n\n        /** Sets the delimiter of the CSV file\n         *\n         *  @throws `std::runtime_error` thrown if trim, quote, or possible delimiting characters overlap\n         */\n        CSVFormat& delimiter(char delim);\n\n        /** Sets a list of potential delimiters\n         *  \n         *  @throws `std::runtime_error` thrown if trim, quote, or possible delimiting characters overlap\n         *  @param[in] delim An array of possible delimiters to try parsing the CSV with\n         */\n        CSVFormat& delimiter(const std::vector<char> & delim);\n\n        /** Sets the whitespace characters to be trimmed\n         *\n         *  @throws `std::runtime_error` thrown if trim, quote, or possible delimiting characters overlap\n         *  @param[in] ws An array of whitespace characters that should be trimmed\n         */\n        CSVFormat& trim(const std::vector<char> & ws);\n\n        /** Sets the quote character\n         *\n         *  @throws `std::runtime_error` thrown if trim, quote, or possible delimiting characters overlap\n         */\n        CSVFormat& quote(char quote);\n\n        /** Sets the column names.\n         *\n         *  @note Unsets any values set by header_row()\n         */\n        CSVFormat& column_names(const std::vector<std::string>& names);\n\n        /** Sets the header row\n         *\n         *  @note Unsets any values set by column_names()\n         */\n        CSVFormat& header_row(int row);\n\n        /** Tells the parser that this CSV has no header row\n         *\n         *  @note Equivalent to `header_row(-1)`\n         *\n         */\n        CSVFormat& no_header() {\n            this->header_row(-1);\n            return *this;\n        }\n\n        /** Turn quoting on or off */\n        CSVFormat& quote(bool use_quote) {\n            this->no_quote = !use_quote;\n            return *this;\n        }\n\n        /** Tells the parser how to handle columns of a different length than the others */\n        CONSTEXPR_14 CSVFormat& variable_columns(VariableColumnPolicy policy = VariableColumnPolicy::IGNORE_ROW) {\n            this->variable_column_policy = policy;\n            return *this;\n        }\n\n        /** Tells the parser how to handle columns of a different length than the others */\n        CONSTEXPR_14 CSVFormat& variable_columns(bool policy) {\n            this->variable_column_policy = (VariableColumnPolicy)policy;\n            return *this;\n        }\n\n        /** Sets the column name lookup policy.\n         *\n         *  @param[in] policy  Use ColumnNamePolicy::CASE_INSENSITIVE to allow\n         *                     case-insensitive column lookups via CSVRow::operator[]\n         *                     and CSVReader::index_of().\n         */\n        CONSTEXPR_14 CSVFormat& column_names_policy(ColumnNamePolicy policy) {\n            this->_column_name_policy = policy;\n            return *this;\n        }\n\n        /** Sets the chunk size used when reading the CSV\n         *\n         *  @param[in] size Chunk size in bytes (minimum: 10MB = ITERATION_CHUNK_SIZE)\n         *  @throws std::invalid_argument if size < ITERATION_CHUNK_SIZE\n         *\n         *  Use this when constructing a CSVReader from a filename and individual rows\n         *  may exceed the default 10MB chunk size. The value is passed to CSVReader at\n         *  construction time, before any data is read.\n         */\n        CSVFormat& chunk_size(size_t size);\n\n        #ifndef DOXYGEN_SHOULD_SKIP_THIS\n        char get_delim() const {\n            // This error should never be received by end users.\n            if (this->possible_delimiters.size() > 1) {\n                throw std::runtime_error(\"There is more than one possible delimiter.\");\n            }\n\n            return this->possible_delimiters.at(0);\n        }\n\n        CONSTEXPR bool is_quoting_enabled() const { return !this->no_quote; }\n        CONSTEXPR char get_quote_char() const { return this->quote_char; }\n        CONSTEXPR int get_header() const { return this->header; }\n        std::vector<char> get_possible_delims() const { return this->possible_delimiters; }\n        std::vector<char> get_trim_chars() const { return this->trim_chars; }\n        CONSTEXPR VariableColumnPolicy get_variable_column_policy() const { return this->variable_column_policy; }\n        CONSTEXPR ColumnNamePolicy get_column_name_policy() const { return this->_column_name_policy; }\n        CONSTEXPR size_t get_chunk_size() const { return this->_chunk_size; }\n        #endif\n        \n        /** CSVFormat for guessing the delimiter */\n        CSV_INLINE static CSVFormat guess_csv() {\n            CSVFormat format;\n            format.delimiter({ ',', '|', '\\t', ';', '^' })\n                .quote('\"')\n                .header_row(0);\n\n            return format;\n        }\n\n        bool guess_delim() {\n            return this->possible_delimiters.size() > 1;\n        }\n\n        friend CSVReader;\n        friend internals::IBasicCSVParser;\n        \n    private:\n        /**< Throws an error if delimiters and trim characters overlap */\n        void assert_no_char_overlap();\n\n        /**< Set of possible delimiters */\n        std::vector<char> possible_delimiters = { ',' };\n\n        /**< Set of whitespace characters to trim */\n        std::vector<char> trim_chars = {};\n\n        /**< Row number with columns (ignored if col_names is non-empty) */\n        int header = 0;\n\n        /**< Whether or not to use quoting */\n        bool no_quote = false;\n\n        /**< Quote character */\n        char quote_char = '\"';\n\n        /**< Should be left empty unless file doesn't include header */\n        std::vector<std::string> col_names = {};\n\n        /**< Allow variable length columns? */\n        VariableColumnPolicy variable_column_policy = VariableColumnPolicy::IGNORE_ROW;\n\n        /**< Column name lookup policy */\n        ColumnNamePolicy _column_name_policy = ColumnNamePolicy::EXACT;\n\n        /**< Chunk size for reading; passed to CSVReader at construction time */\n        size_t _chunk_size = internals::ITERATION_CHUNK_SIZE;\n    };\n}\n\nnamespace csv {\n    namespace internals {\n        struct ColNames;\n        using ColNamesPtr = std::shared_ptr<ColNames>;\n\n        /** @struct ColNames\n             *  A data structure for handling column name information.\n             *\n             *  These are created by CSVReader and passed (via smart pointer)\n             *  to CSVRow objects it creates, thus\n             *  allowing for indexing by column name.\n             */\n        struct ColNames {\n        public:\n            ColNames() = default;\n            ColNames(const std::vector<std::string>& names) {\n                set_col_names(names);\n            }\n\n            std::vector<std::string> get_col_names() const;\n            void set_col_names(const std::vector<std::string>&);\n            int index_of(csv::string_view) const;\n\n            /** Sets the column name lookup policy.\n             *  Must be called before set_col_names() for CI policy to take effect.\n             */\n            void set_policy(csv::ColumnNamePolicy policy);\n\n            bool empty() const noexcept { return this->col_names.empty(); }\n            size_t size() const noexcept;\n\n            /** Retrieve column name by index. Throws if index is out of bounds. */\n            const std::string& operator[](size_t i) const;\n\n        private:\n            std::vector<std::string> col_names;\n            std::unordered_map<std::string, size_t> col_pos;\n            csv::ColumnNamePolicy _policy = csv::ColumnNamePolicy::EXACT;\n        };\n    }\n}\n/** @file\n *  Defines the data type used for storing information about a CSV row\n */\n\n#include <cmath>\n#include <iterator>\n#include <memory> // For CSVField\n#include <limits> // For CSVField\n#if !defined(CSV_ENABLE_THREADS) || CSV_ENABLE_THREADS\n#include <mutex>\n#endif\n#include <unordered_set>\n#include <string>\n#include <sstream>\n#include <vector>\n\n#ifdef CSV_HAS_CXX20\n#include <ranges>\n#endif\n/** @file\n *  @brief Implements data type parsing functionality\n */\n\n#include <cmath>\n#include <cctype>\n#include <string>\n#include <cassert>\n\n\nnamespace csv {\n    /** Enumerates the different CSV field types that are\n     *  recognized by this library\n     *\n     *  @note Overflowing integers will be stored and classified as doubles.\n     *  @note Unlike previous releases, integer enums here are platform agnostic.\n     */\n    enum class DataType {\n        UNKNOWN = -1,\n        CSV_NULL,   /**< Empty string */\n        CSV_STRING, /**< Non-numeric string */\n        CSV_INT8,   /**< 8-bit integer */\n        CSV_INT16,  /**< 16-bit integer (short on MSVC/GCC) */\n        CSV_INT32,  /**< 32-bit integer (int on MSVC/GCC) */\n        CSV_INT64,  /**< 64-bit integer (long long on MSVC/GCC) */\n        CSV_BIGINT, /**< Value too big to fit in a 64-bit in */\n        CSV_DOUBLE  /**< Floating point value */\n    };\n\n    static_assert(DataType::CSV_STRING < DataType::CSV_INT8, \"String type should come before numeric types.\");\n    static_assert(DataType::CSV_INT8 < DataType::CSV_INT64, \"Smaller integer types should come before larger integer types.\");\n    static_assert(DataType::CSV_INT64 < DataType::CSV_DOUBLE, \"Integer types should come before floating point value types.\");\n\n    namespace internals {\n        /** Compute 10 to the power of n.\n         *  Only integral exponents are supported; fractional exponents\n         *  are never needed since CSV scientific notation exponents are\n         *  always integers (enforced by the CSV_INT8..CSV_INT64 guard\n         *  in _process_potential_exponential before calling this).\n         */\n        template<typename T>\n        CSV_CONST CONSTEXPR_14\n        long double pow10(const T& n) noexcept {\n            static_assert(std::is_integral<T>::value, \"pow10 only supports integral exponents\");\n            \n            long double multiplicand = n > 0 ? 10 : 0.1,\n                ret = 1;\n\n            // Make all numbers positive\n            T iterations = n > 0 ? n : -n;\n            \n            for (T i = 0; i < iterations; i++) {\n                ret *= multiplicand;\n            }\n\n            return ret;\n        }\n\n        /** Compute 10 to the power of n */\n        template<>\n        CSV_CONST CONSTEXPR_14\n        long double pow10(const unsigned& n) noexcept {\n            long double multiplicand = n > 0 ? 10 : 0.1,\n                ret = 1;\n\n            for (unsigned i = 0; i < n; i++) {\n                ret *= multiplicand;\n            }\n\n            return ret;\n        }\n\n#ifndef DOXYGEN_SHOULD_SKIP_THIS\n        /** Private site-indexed array mapping byte sizes to an integer size enum */\n        constexpr DataType int_type_arr[8] = {\n            DataType::CSV_INT8,  // 1\n            DataType::CSV_INT16, // 2\n            DataType::UNKNOWN,\n            DataType::CSV_INT32, // 4\n            DataType::UNKNOWN,\n            DataType::UNKNOWN,\n            DataType::UNKNOWN,\n            DataType::CSV_INT64  // 8\n        };\n\n        template<typename T>\n        inline DataType type_num() {\n            static_assert(std::is_integral<T>::value, \"T should be an integral type.\");\n            static_assert(sizeof(T) <= 8, \"Byte size must be no greater than 8.\");\n            return int_type_arr[sizeof(T) - 1];\n        }\n\n        template<> inline DataType type_num<float>() { return DataType::CSV_DOUBLE; }\n        template<> inline DataType type_num<double>() { return DataType::CSV_DOUBLE; }\n        template<> inline DataType type_num<long double>() { return DataType::CSV_DOUBLE; }\n        template<> inline DataType type_num<std::nullptr_t>() { return DataType::CSV_NULL; }\n        template<> inline DataType type_num<std::string>() { return DataType::CSV_STRING; }\n\n        CONSTEXPR_14 DataType data_type(csv::string_view in, long double* const out = nullptr, \n            const char decimalsymbol = '.');\n#endif\n\n        /** Given a byte size, return the largest number than can be stored in\n         *  an integer of that size\n         *\n         *  Note: Provides a platform-agnostic way of mapping names like \"long int\" to\n         *  byte sizes\n         */\n        template<size_t Bytes>\n        CONSTEXPR_14 long double get_int_max() {\n            static_assert(Bytes == 1 || Bytes == 2 || Bytes == 4 || Bytes == 8,\n                \"Bytes must be a power of 2 below 8.\");\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4127)\n#endif\n            IF_CONSTEXPR (sizeof(signed char) == Bytes) {\n                return (long double)std::numeric_limits<signed char>::max();\n            }\n            else IF_CONSTEXPR (sizeof(short) == Bytes) {\n                return (long double)std::numeric_limits<short>::max();\n            }\n            else IF_CONSTEXPR (sizeof(int) == Bytes) {\n                return (long double)std::numeric_limits<int>::max();\n            }\n            else IF_CONSTEXPR (sizeof(long int) == Bytes) {\n                return (long double)std::numeric_limits<long int>::max();\n            }\n            else {\n                return (long double)std::numeric_limits<long long int>::max();\n            }\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n        }\n\n        /** Given a byte size, return the largest number than can be stored in\n         *  an unsigned integer of that size\n         */\n        template<size_t Bytes>\n        CONSTEXPR_14 long double get_uint_max() {\n            static_assert(Bytes == 1 || Bytes == 2 || Bytes == 4 || Bytes == 8,\n                \"Bytes must be a power of 2 below 8.\");\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4127)\n#endif\n            IF_CONSTEXPR(sizeof(unsigned char) == Bytes) {\n                return (long double)std::numeric_limits<unsigned char>::max();\n            }\n            else IF_CONSTEXPR(sizeof(unsigned short) == Bytes) {\n                return (long double)std::numeric_limits<unsigned short>::max();\n            }\n            else IF_CONSTEXPR(sizeof(unsigned int) == Bytes) {\n                return (long double)std::numeric_limits<unsigned int>::max();\n            }\n            else IF_CONSTEXPR(sizeof(unsigned long int) == Bytes) {\n                return (long double)std::numeric_limits<unsigned long int>::max();\n            }\n            else {\n                return (long double)std::numeric_limits<unsigned long long int>::max();\n            }\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n        }\n\n        /** Largest number that can be stored in a 8-bit integer */\n        CONSTEXPR_VALUE_14 long double CSV_INT8_MAX = get_int_max<1>();\n\n        /** Largest number that can be stored in a 16-bit integer */\n        CONSTEXPR_VALUE_14 long double CSV_INT16_MAX = get_int_max<2>();\n\n        /** Largest number that can be stored in a 32-bit integer */\n        CONSTEXPR_VALUE_14 long double CSV_INT32_MAX = get_int_max<4>();\n\n        /** Largest number that can be stored in a 64-bit integer */\n        CONSTEXPR_VALUE_14 long double CSV_INT64_MAX = get_int_max<8>();\n\n        /** Largest number that can be stored in a 8-bit ungisned integer */\n        CONSTEXPR_VALUE_14 long double CSV_UINT8_MAX = get_uint_max<1>();\n\n        /** Largest number that can be stored in a 16-bit unsigned integer */\n        CONSTEXPR_VALUE_14 long double CSV_UINT16_MAX = get_uint_max<2>();\n\n        /** Largest number that can be stored in a 32-bit unsigned integer */\n        CONSTEXPR_VALUE_14 long double CSV_UINT32_MAX = get_uint_max<4>();\n\n        /** Largest number that can be stored in a 64-bit unsigned integer */\n        CONSTEXPR_VALUE_14 long double CSV_UINT64_MAX = get_uint_max<8>();\n\n        /** Given a pointer to the start of what is start of\n         *  the exponential part of a number written (possibly) in scientific notation\n         *  parse the exponent\n         */\n        CSV_PRIVATE CONSTEXPR_14\n        DataType _process_potential_exponential(\n            csv::string_view exponential_part,\n            const long double& coeff,\n            long double * const out) {\n            long double exponent = 0;\n            auto result = data_type(exponential_part, &exponent);\n\n            // Exponents in scientific notation should not be decimal numbers\n            if (result >= DataType::CSV_INT8 && result < DataType::CSV_DOUBLE) {\n                if (out) *out = coeff * pow10(static_cast<long long>(exponent));\n                return DataType::CSV_DOUBLE;\n            }\n\n            return DataType::CSV_STRING;\n        }\n\n        /** Given the absolute value of an integer, determine what numeric type\n         *  it fits in\n         */\n        CSV_PRIVATE CSV_PURE CONSTEXPR_14\n        DataType _determine_integral_type(const long double& number) noexcept {\n            // We can assume number is always non-negative\n            assert(number >= 0);\n\n            if (number <= internals::CSV_INT8_MAX)\n                return DataType::CSV_INT8;\n            else if (number <= internals::CSV_INT16_MAX)\n                return DataType::CSV_INT16;\n            else if (number <= internals::CSV_INT32_MAX)\n                return DataType::CSV_INT32;\n            else if (number <= internals::CSV_INT64_MAX)\n                return DataType::CSV_INT64;\n            else // Conversion to long long will cause an overflow\n                return DataType::CSV_BIGINT;\n        }\n\n        /** Distinguishes numeric from other text values. Used by various\n         *  type casting functions, like csv_parser::CSVReader::read_row()\n         *\n         *  #### Rules\n         *   - Leading and trailing whitespace (\"padding\") ignored\n         *   - A string of just whitespace is NULL\n         *\n         *  @param[in]  in  String value to be examined\n         *  @param[out] out Pointer to long double where results of numeric parsing\n         *                  get stored\n         *  @param[in]  decimalSymbol  the character separating integral and decimal part,\n         *                             defaults to '.' if omitted\n         */\n        CONSTEXPR_14\n        DataType data_type(csv::string_view in, long double* const out, const char decimalSymbol) {\n            // Empty string --> NULL\n            if (in.size() == 0)\n                return DataType::CSV_NULL;\n\n            bool ws_allowed = true,\n                dot_allowed = true,\n                digit_allowed = true,\n                is_negative = false,\n                has_digit = false,\n                prob_float = false;\n\n            unsigned places_after_decimal = 0;\n            long double integral_part = 0,\n                decimal_part = 0;\n\n            for (size_t i = 0, ilen = in.size(); i < ilen; i++) {\n                const char& current = in[i];\n\n                switch (current) {\n                case ' ':\n                    if (!ws_allowed) {\n                        if (isdigit(in[i - 1])) {\n                            digit_allowed = false;\n                            ws_allowed = true;\n                        }\n                        else {\n                            // Ex: '510 123 4567'\n                            return DataType::CSV_STRING;\n                        }\n                    }\n                    break;\n                case '+':\n                    if (!ws_allowed) {\n                        return DataType::CSV_STRING;\n                    }\n\n                    break;\n                case '-':\n                    if (!ws_allowed) {\n                        // Ex: '510-123-4567'\n                        return DataType::CSV_STRING;\n                    }\n\n                    is_negative = true;\n                    break;\n                // case decimalSymbol: not allowed because decimalSymbol is not a literal,\n                // it is handled in the default block\n                case 'e':\n                case 'E':\n                    // Process scientific notation\n                    if (prob_float || (i && i + 1 < ilen && isdigit(in[i - 1]))) {\n                        size_t exponent_start_idx = i + 1;\n                        prob_float = true;\n\n                        // Strip out plus sign\n                        if (in[i + 1] == '+') {\n                            exponent_start_idx++;\n                        }\n\n                        return _process_potential_exponential(\n                            in.substr(exponent_start_idx),\n                            is_negative ? -(integral_part + decimal_part) : integral_part + decimal_part,\n                            out\n                        );\n                    }\n\n                    return DataType::CSV_STRING;\n                    break;\n                default:\n                    short digit = static_cast<short>(current - '0');\n                    if (digit >= 0 && digit <= 9) {\n                        // Process digit\n                        has_digit = true;\n\n                        if (!digit_allowed)\n                            return DataType::CSV_STRING;\n                        else if (ws_allowed) // Ex: '510 456'\n                            ws_allowed = false;\n\n                        // Build current number\n                        if (prob_float)\n                            decimal_part += digit / pow10(++places_after_decimal);\n                        else\n                            integral_part = (integral_part * 10) + digit;\n                    }\n                    // case decimalSymbol: not allowed because decimalSymbol is not a literal. \n                    else if (dot_allowed && current == decimalSymbol) {\n                        dot_allowed = false;\n                        prob_float = true;\n                    }\n                    else {\n                        return DataType::CSV_STRING;\n                    }\n                }\n            }\n\n            // No non-numeric/non-whitespace characters found\n            if (has_digit) {\n                long double number = integral_part + decimal_part;\n                if (out) {\n                    *out = is_negative ? -number : number;\n                }\n\n                return prob_float ? DataType::CSV_DOUBLE : _determine_integral_type(number);\n            }\n\n            // Just whitespace\n            return DataType::CSV_NULL;\n        }\n    }\n}\n/** @file\n *  @brief Implements Functions related to hexadecimal parsing\n */\n\n#include <type_traits>\n#include <cmath>\n\n\nnamespace csv {\n    namespace internals {\n        template<typename T>\n        bool try_parse_hex(csv::string_view sv, T& parsedValue) {\n            static_assert(std::is_integral<T>::value, \n                \"try_parse_hex only works with integral types (int, long, long long, etc.)\");\n            \n            size_t start = 0, end = 0;\n\n            // Trim out whitespace chars\n            for (; start < sv.size() && sv[start] == ' '; start++);\n            for (end = start; end < sv.size() && sv[end] != ' '; end++);\n            \n            T value_ = 0;\n\n            size_t digits = (end - start);\n            size_t base16_exponent = digits - 1;\n\n            if (digits == 0) return false;\n\n            for (const auto& ch : sv.substr(start, digits)) {\n                int digit = 0;\n\n                switch (ch) {\n                    case '0':\n                    case '1':\n                    case '2':\n                    case '3':\n                    case '4':\n                    case '5':\n                    case '6':\n                    case '7':\n                    case '8':\n                    case '9':\n                        digit = static_cast<int>(ch - '0');\n                        break;\n                    case 'a':\n                    case 'A':\n                        digit = 10;\n                        break;\n                    case 'b':\n                    case 'B':\n                        digit = 11;\n                        break;\n                    case 'c':\n                    case 'C':\n                        digit = 12;\n                        break;\n                    case 'd':\n                    case 'D':\n                        digit = 13;\n                        break;\n                    case 'e':\n                    case 'E':\n                        digit = 14;\n                        break;\n                    case 'f':\n                    case 'F':\n                        digit = 15;\n                        break;\n                    default:\n                        return false;\n                }\n\n                value_ += digit * (T)pow(16, (double)base16_exponent);\n                base16_exponent--;\n            }\n\n            parsedValue = value_;\n            return true;\n        }\n    }\n}\n/** @file\n *  @brief Internal data structures for CSV parsing\n * \n *  This file contains the low-level structures used by the parser to store\n *  CSV data before it's exposed through the public CSVRow/CSVField API.\n * \n *  Data flow: Parser → RawCSVData → CSVRow → CSVField\n */\n\n#include <cassert>\n#include <memory>\n#if !defined(CSV_ENABLE_THREADS) || CSV_ENABLE_THREADS\n#include <mutex>\n#endif\n#include <unordered_map>\n#include <string>\n#include <vector>\n\n\nnamespace csv {\n    namespace internals {\n        /** A barebones class used for describing CSV fields */\n        struct RawCSVField {\n            RawCSVField() = default;\n            RawCSVField(size_t _start, size_t _length, bool _double_quote = false) noexcept {\n                start = _start;\n                length = _length;\n                has_double_quote = _double_quote;\n            }\n\n            /** The start of the field, relative to the beginning of the row */\n            size_t start;\n\n            /** The length of the row, ignoring quote escape characters */\n            size_t length; \n\n            /** Whether or not the field contains an escaped quote */\n            bool has_double_quote;\n        };\n\n        /** A class used for efficiently storing RawCSVField objects and expanding as necessary\n         *\n         *  @par Implementation\n         *  Stores fields in page-aligned chunks (~170 fields/chunk) via a vector of\n         *  unique_ptr<RawCSVField[]>:\n         *   - This design provides better cache locality when accessing sequential fields in a row\n         *     as well as much lower memory allocation overhead.\n         *   - The unique_ptr ensures STL container does not invalidate pointers to fields when resizing,\n         *     which is critical to ensure memory safety and correctness of the parser.\n         * \n         *  @par Thread Safety\n         *  Cross-thread visibility is provided by the records queue mutex in\n         *  ThreadSafeDeque: the writer enqueues a RawCSVData only after all fields are\n         *  written, and the reader dequeues it only after the mutex unlock/lock pair,\n         *  which is a full happens-before edge. No additional atomics are needed here.\n         *\n         *  @par Historical Bug (Issue #278, fixed Feb 2026)\n         *  Move constructor previously left _back pointing to moved-from buffer memory, causing\n         *  memory corruption on next emplace_back(). Fixed by recalculating _back from\n         *  _owned_blocks after move.\n         */\n        class RawCSVFieldList {\n        public:\n            /** Construct a RawCSVFieldList which allocates blocks of a certain size */\n            RawCSVFieldList(size_t single_buffer_capacity = (size_t)(internals::PAGE_SIZE / sizeof(RawCSVField))) :\n                _single_buffer_capacity(single_buffer_capacity) {\n                const size_t max_fields = internals::ITERATION_CHUNK_SIZE + 1;\n                const size_t block_capacity = (max_fields + _single_buffer_capacity - 1) / _single_buffer_capacity;\n                _owned_blocks.reserve(block_capacity);\n\n                this->allocate();\n            }\n\n            // No copy constructor\n            RawCSVFieldList(const RawCSVFieldList& other) = delete;\n\n            // CSVFieldArrays may be moved\n            RawCSVFieldList(RawCSVFieldList&& other) noexcept:\n                _single_buffer_capacity(other._single_buffer_capacity) {\n\n                this->_owned_blocks = std::move(other._owned_blocks);\n                _current_buffer_size = other._current_buffer_size;\n                _current_block = other._current_block;\n\n                // Recalculate _back pointer to point into OUR blocks, not the moved-from ones\n                if (!this->_owned_blocks.empty()) {\n                    _back = this->_owned_blocks[_current_block].get() + _current_buffer_size;\n                } else {\n                    _back = nullptr;\n                }\n\n                // Invalidate moved-from state to prevent use-after-move bugs\n                other._back = nullptr;\n                other._current_buffer_size = 0;\n                other._current_block = 0;\n            }\n\n            template <class... Args>\n            void emplace_back(Args&&... args) {\n                if (this->_current_buffer_size == this->_single_buffer_capacity) {\n                    this->allocate();\n                }\n\n                assert(_back != nullptr);\n                *(_back++) = RawCSVField(std::forward<Args>(args)...);\n                _current_buffer_size++;\n            }\n\n            size_t size() const noexcept {\n                return this->_current_buffer_size + (_current_block * this->_single_buffer_capacity);\n            }\n\n            /** Access a field by its index. This allows CSVRow objects to access fields\n             *  without knowing internal implementation details of RawCSVFieldList.\n             */\n            RawCSVField& operator[](size_t n) const;\n\n        private:\n            const size_t _single_buffer_capacity;\n\n            /** Owned field-storage blocks; pre-reserved to avoid reallocation. */\n            std::vector<std::unique_ptr<RawCSVField[]>> _owned_blocks = {};\n\n            /** Number of items in the current block */\n            size_t _current_buffer_size = 0;\n\n            /** Current block index */\n            size_t _current_block = 0;\n\n            /** Pointer to the next empty field slot in the current block */\n            RawCSVField* _back = nullptr;\n\n            /** Allocate a new page of memory */\n            void allocate();\n        };\n\n        /** A class for storing raw CSV data and associated metadata\n         * \n         *  This structure is the bridge between the parser thread and the main thread.\n         *  Parser populates fields, data, and parse_flags; main thread reads via CSVRow.\n         */\n        struct RawCSVData {\n            std::shared_ptr<void> _data = nullptr;\n            csv::string_view data = \"\";\n\n            internals::RawCSVFieldList fields;\n\n            /** Cached unescaped field values for fields with escaped quotes.\n             *  Thread-safe lazy initialization using double-check locking.\n             *  Lock is only held during rare concurrent initialization; reads are lock-free.\n             */\n            std::unordered_map<size_t, std::string> double_quote_fields = {};\n#if CSV_ENABLE_THREADS\n            mutable std::mutex double_quote_init_lock;  ///< Protects lazy initialization only\n#endif\n\n            internals::ColNamesPtr col_names = nullptr;\n            internals::ParseFlagMap parse_flags;\n            internals::WhitespaceMap ws_flags;\n\n            /** True when at least one whitespace trim character is configured.\n             *  Used by get_field_impl() to skip trim work in the common no-trim case.\n             */\n            bool has_ws_trimming = false;\n        };\n\n        using RawCSVDataPtr = std::shared_ptr<RawCSVData>;\n    }\n}\n\n\n#if CSV_ENABLE_THREADS\n#define CSV_INIT_WITH_OPTIONAL_DCL(data_ref, value_ref, ...) \\\n    do { \\\n        if ((value_ref).empty()) { \\\n            std::lock_guard<std::mutex> lock((data_ref).double_quote_init_lock); \\\n            if ((value_ref).empty()) { \\\n                __VA_ARGS__ \\\n            } \\\n        } \\\n    } while (0)\n#else\n#define CSV_INIT_WITH_OPTIONAL_DCL(data_ref, value_ref, ...) \\\n    do { \\\n        (void)(data_ref); \\\n        if ((value_ref).empty()) { \\\n            __VA_ARGS__ \\\n        } \\\n    } while (0)\n#endif\n\nnamespace csv {\n    namespace internals {\n        class IBasicCSVParser;\n\n        static const std::string ERROR_NAN = \"Not a number.\";\n        static const std::string ERROR_OVERFLOW = \"Overflow error.\";\n        static const std::string ERROR_FLOAT_TO_INT =\n            \"Attempted to convert a floating point value to an integral type.\";\n        static const std::string ERROR_NEG_TO_UNSIGNED = \"Negative numbers cannot be converted to unsigned types.\";\n    \n        std::string json_escape_string(csv::string_view s) noexcept;\n\n        // Inside CSVField::get() or wherever you materialize the value\n        csv::string_view get_trimmed(csv::string_view sv, const WhitespaceMap& ws_flags) noexcept;\n    }\n\n    /**\n    * @class CSVField\n    * @brief Data type representing individual CSV values.\n    *        CSVFields can be obtained by using CSVRow::operator[]\n    */\n    class CSVField {\n    public:\n        /** Constructs a CSVField from a string_view */\n        constexpr explicit CSVField(csv::string_view _sv) noexcept : sv(_sv) {}\n\n        operator std::string() const {\n            return std::string(this->sv);\n        }\n\n        /** Returns the value casted to the requested type, performing type checking before.\n        *\n        *  \\par Valid options for T\n        *   - std::string or csv::string_view\n        *   - signed integral types (signed char, short, int, long int, long long int)\n        *   - floating point types (float, double, long double)\n        *   - unsigned integers are not supported at this time, but may be in a later release\n        *\n        *  \\par Invalid conversions\n        *   - Converting non-numeric values to any numeric type\n        *   - Converting floating point values to integers\n        *   - Converting a large integer to a smaller type that will not hold it\n        *\n        *  @note    This method is capable of parsing scientific E-notation.\n        *           See [this page](md_docs_source_scientific_notation.html)\n        *           for more details.\n        *\n        *  @throws  std::runtime_error Thrown if an invalid conversion is performed.\n        *\n        *  @warning Currently, conversions to floating point types are not\n        *           checked for loss of precision\n        *\n        *  @warning Any string_views returned are only guaranteed to be valid\n        *           if the parent CSVRow is still alive. If you are concerned\n        *           about object lifetimes, then grab a std::string or a\n        *           numeric value.\n        *\n        */\n        template<typename T = std::string> T get() {\n            IF_CONSTEXPR(std::is_arithmetic<T>::value) {\n                // Note: this->type() also converts the CSV value to float\n                if (this->type() <= DataType::CSV_STRING) {\n                    throw std::runtime_error(internals::ERROR_NAN);\n                }\n            }\n\n            IF_CONSTEXPR(std::is_integral<T>::value) {\n                // Note: this->is_float() also converts the CSV value to float\n                if (this->is_float()) {\n                    throw std::runtime_error(internals::ERROR_FLOAT_TO_INT);\n                }\n\n                IF_CONSTEXPR(std::is_unsigned<T>::value) {\n                    if (this->value < 0) {\n                        throw std::runtime_error(internals::ERROR_NEG_TO_UNSIGNED);\n                    }\n                }\n            }\n\n            // Allow fallthrough from previous if branch\n            IF_CONSTEXPR(!std::is_floating_point<T>::value) {\n                IF_CONSTEXPR(std::is_unsigned<T>::value) {\n                    // Quick hack to perform correct unsigned integer boundary checks\n                    if (this->value > internals::get_uint_max<sizeof(T)>()) {\n                        throw std::runtime_error(internals::ERROR_OVERFLOW);\n                    }\n                }\n                else if (internals::type_num<T>() < this->_type) {\n                    throw std::runtime_error(internals::ERROR_OVERFLOW);\n                }\n            }\n\n            return static_cast<T>(this->value);\n        }\n\n        /** Attempts to retrieve the value as the requested type without throwing exceptions.\n         *\n         *  @param[out] out Output parameter that receives the converted value if successful\n         *  @return true if conversion succeeded, false otherwise\n         *\n         *  \\par Valid options for T\n         *   - std::string or csv::string_view\n         *   - signed integral types (signed char, short, int, long int, long long int)\n         *   - floating point types (float, double, long double)\n         *   - unsigned integers are not supported at this time, but may be in a later release\n         *\n         *  \\par When conversion fails (returns false)\n         *   - Converting non-numeric values to any numeric type\n         *   - Converting floating point values to integers\n         *   - Converting a large integer to a smaller type that will not hold it\n         *   - Converting negative values to unsigned types\n         *\n         *  @note This method is capable of parsing scientific E-notation.\n         *\n         *  @warning Currently, conversions to floating point types are not\n         *           checked for loss of precision\n         *\n         *  @warning Any string_views returned are only guaranteed to be valid\n         *           if the parent CSVRow is still alive.\n         *\n         *  Example:\n         *  @code\n         *  int value;\n         *  if (field.try_get(value)) {\n         *      // Use value safely\n         *  } else {\n         *      // Handle conversion failure\n         *  }\n         *  @endcode\n         */\n        template<typename T = std::string>\n        bool try_get(T& out) noexcept {\n            IF_CONSTEXPR(std::is_arithmetic<T>::value) {\n                // Check if value is numeric\n                if (this->type() <= DataType::CSV_STRING) {\n                    return false;\n                }\n            }\n\n            IF_CONSTEXPR(std::is_integral<T>::value) {\n                // Check for float-to-int conversion\n                if (this->is_float()) {\n                    return false;\n                }\n\n                IF_CONSTEXPR(std::is_unsigned<T>::value) {\n                    if (this->value < 0) {\n                        return false;\n                    }\n                }\n            }\n\n            // Check for overflow\n            IF_CONSTEXPR(!std::is_floating_point<T>::value) {\n                IF_CONSTEXPR(std::is_unsigned<T>::value) {\n                    if (this->value > internals::get_uint_max<sizeof(T)>()) {\n                        return false;\n                    }\n                }\n                else if (internals::type_num<T>() < this->_type) {\n                    return false;\n                }\n            }\n\n            out = static_cast<T>(this->value);\n            return true;\n        }\n\n        /** Parse a hexadecimal value, returning false if the value is not hex.\n         *  @tparam T An integral type (int, long, long long, etc.)\n         */\n        template<typename T = long long>\n        bool try_parse_hex(T& parsedValue) {\n            static_assert(std::is_integral<T>::value,\n                \"try_parse_hex only works with integral types (int, long, long long, etc.)\");\n            return internals::try_parse_hex(this->sv, parsedValue);\n        }\n\n        /** Attempts to parse a decimal (or integer) value using the given symbol,\n         *  returning `true` if the value is numeric.\n         *\n         *  @note This method also updates this field's type\n         *\n         */\n        bool try_parse_decimal(long double& dVal, const char decimalSymbol = '.');\n\n        /** Compares the contents of this field to a numeric value. If this\n         *  field does not contain a numeric value, then all comparisons return\n         *  false.\n         *\n         *  @note    Floating point values are considered equal if they are within\n         *           `0.000001` of each other.\n         *\n         *  @warning Multiple numeric comparisons involving the same field can\n         *           be done more efficiently by calling the CSVField::get<>() method.\n         *\n         *  @sa      csv::CSVField::operator==(const char * other)\n         *  @sa      csv::CSVField::operator==(csv::string_view other)\n         */\n        template<typename T>\n        CONSTEXPR_14 bool operator==(T other) const noexcept\n        {\n            static_assert(std::is_arithmetic<T>::value,\n                \"T should be a numeric value.\");\n\n            if (this->_type != DataType::UNKNOWN) {\n                if (this->_type == DataType::CSV_STRING) {\n                    return false;\n                }\n\n                return internals::is_equal(value, static_cast<long double>(other), 0.000001L);\n            }\n\n            long double out = 0;\n            if (internals::data_type(this->sv, &out) == DataType::CSV_STRING) {\n                return false;\n            }\n\n            return internals::is_equal(out, static_cast<long double>(other), 0.000001L);\n        }\n\n        /** Return a string view over the field's contents */\n        CONSTEXPR csv::string_view get_sv() const noexcept { return this->sv; }\n\n        /** Returns true if field is an empty string or string of whitespace characters */\n        CONSTEXPR_14 bool is_null() noexcept { return type() == DataType::CSV_NULL; }\n\n        /** Returns true if field is a non-numeric, non-empty string */\n        CONSTEXPR_14 bool is_str() noexcept { return type() == DataType::CSV_STRING; }\n\n        /** Returns true if field is an integer or float */\n        CONSTEXPR_14 bool is_num() noexcept { return type() >= DataType::CSV_INT8; }\n\n        /** Returns true if field is an integer */\n        CONSTEXPR_14 bool is_int() noexcept {\n            return (type() >= DataType::CSV_INT8) && (type() <= DataType::CSV_INT64);\n        }\n\n        /** Returns true if field is a floating point value */\n        CONSTEXPR_14 bool is_float() noexcept { return type() == DataType::CSV_DOUBLE; }\n\n        /** Return the type of the underlying CSV data */\n        CONSTEXPR_14 DataType type() noexcept {\n            this->get_value();\n            return _type;\n        }\n\n    private:\n        long double value = 0;    /**< Cached numeric value */\n        csv::string_view sv = \"\"; /**< A pointer to this field's text */\n        DataType _type = DataType::UNKNOWN; /**< Cached data type value */\n        CONSTEXPR_14 void get_value() noexcept {\n            /* Check to see if value has been cached previously, if not\n             * evaluate it\n             */\n            if ((int)_type < 0) {\n                this->_type = internals::data_type(this->sv, &this->value);\n            }\n        }\n    };\n\n    /** Data structure for representing CSV rows */\n    class CSVRow {\n    public:\n        friend internals::IBasicCSVParser;\n\n        CSVRow() = default;\n        \n        /** Construct a CSVRow from a RawCSVDataPtr */\n        CSVRow(internals::RawCSVDataPtr _data) : data(_data) {}\n        CSVRow(internals::RawCSVDataPtr _data, size_t _data_start, size_t _field_bounds)\n            : data(_data), data_start(_data_start), fields_start(_field_bounds) {}\n        CSVRow(internals::RawCSVDataPtr _data, size_t _data_start, size_t _field_bounds, size_t _row_length)\n            : data(_data), data_start(_data_start), fields_start(_field_bounds), row_length(_row_length) {}\n\n        /** Indicates whether row is empty or not */\n        CONSTEXPR bool empty() const noexcept { return this->size() == 0; }\n\n        /** Return the number of fields in this row */\n        CONSTEXPR size_t size() const noexcept { return row_length; }\n\n        /** @name Value Retrieval */\n        ///@{\n        CSVField operator[](size_t n) const;\n        CSVField operator[](const std::string&) const;\n        std::string to_json(const std::vector<std::string>& subset = {}) const;\n        std::string to_json_array(const std::vector<std::string>& subset = {}) const;\n\n        /** Retrieve this row's associated column names */\n        std::vector<std::string> get_col_names() const {\n            return this->data->col_names->get_col_names();\n        }\n\n        /** Convert this CSVRow into an unordered map.\n         *  The keys are the column names and the values are the corresponding field values.\n         */\n        std::unordered_map<std::string, std::string> to_unordered_map() const;\n\n        /** Convert this CSVRow into an unordered map.\n         *  The keys are the column names and the values are the corresponding field values.\n         * \n         * @param[in] subset Vector of column names to include in the map.\n         */\n        std::unordered_map<std::string, std::string> to_unordered_map(\n            const std::vector<std::string>& subset\n        ) const;\n\n        #ifdef CSV_HAS_CXX20\n        /** Convert this CSVRow into a std::ranges::input_range of string_views. */\n        auto to_sv_range() const {\n            return std::views::iota(size_t{0}, this->size())\n                | std::views::transform([this](size_t i) { return this->get_field(i); });\n        }\n        #endif\n\n        /** Convert this row into a `std::vector<std::string>`.\n         *\n         * This conversion is primarily intended for write-side workflows, such as\n         * reordering or selecting columns before forwarding the row to `CSVWriter`.\n         *\n         * @note This is less efficient than indexed access via `operator[]` because\n         *       it materializes all fields as owning strings.\n         */\n        operator std::vector<std::string>() const;\n        ///@}\n\n        /** A random access iterator over the contents of a CSV row.\n         *  Each iterator points to a CSVField.\n         */\n        class iterator {\n        public:\n#ifndef DOXYGEN_SHOULD_SKIP_THIS\n            using value_type = CSVField;\n            using difference_type = int;\n            using pointer = std::shared_ptr<CSVField>;\n            using reference = CSVField & ;\n            using iterator_category = std::random_access_iterator_tag;\n#endif\n            iterator(const CSVRow*, int i);\n\n            reference operator*() const;\n            pointer operator->() const;\n\n            iterator operator++(int);\n            iterator& operator++();\n            iterator operator--(int);\n            iterator& operator--();\n            iterator operator+(difference_type n) const;\n            iterator operator-(difference_type n) const;\n\n            /** Two iterators are equal if they point to the same field */\n            CONSTEXPR bool operator==(const iterator& other) const noexcept {\n                return this->i == other.i;\n            };\n\n            CONSTEXPR bool operator!=(const iterator& other) const noexcept { return !operator==(other); }\n\n#ifndef NDEBUG\n            friend CSVRow;\n#endif\n\n        private:\n            const CSVRow * daddy = nullptr;                      // Pointer to parent\n            internals::RawCSVDataPtr data = nullptr;             // Keep data alive for lifetime of iterator\n            std::shared_ptr<CSVField> field = nullptr;           // Current field pointed at\n            int i = 0;                                           // Index of current field\n        };\n\n        /** A reverse iterator over the contents of a CSVRow. */\n        using reverse_iterator = std::reverse_iterator<iterator>;\n\n        /** @name Iterators\n         *  @brief Each iterator points to a CSVField object.\n         */\n         ///@{\n        iterator begin() const;\n        iterator end() const noexcept;\n        reverse_iterator rbegin() const noexcept;\n        reverse_iterator rend() const;\n        ///@}\n\n    private:\n        /** Shared implementation for field access (handles quoting and caching). */\n        inline csv::string_view get_field_impl(size_t index, const internals::RawCSVDataPtr& _data) const {\n            using internals::ParseFlags;\n\n            if (index >= this->size())\n                throw std::runtime_error(\"Index out of bounds.\");\n\n            const size_t field_index = this->fields_start + index;\n            auto field = _data->fields[field_index];\n            auto field_str = csv::string_view(_data->data).substr(this->data_start + field.start, field.length);\n\n            if (field.has_double_quote) {\n                auto& value = _data->double_quote_fields[field_index];\n                CSV_INIT_WITH_OPTIONAL_DCL((*_data), value,\n                    bool prev_ch_quote = false;\n                    for (size_t i = 0; i < field.length; i++) {\n                        if (_data->parse_flags[field_str[i] + CHAR_OFFSET] == ParseFlags::QUOTE) {\n                            if (prev_ch_quote) {\n                                prev_ch_quote = false;\n                                continue;\n                            }\n                            else {\n                                prev_ch_quote = true;\n                            }\n                        }\n\n                        value += field_str[i];\n                    }\n                );\n\n                if (_data->has_ws_trimming)\n                    return internals::get_trimmed(csv::string_view(value), _data->ws_flags);\n                return value;\n            }\n            else if (_data->has_ws_trimming) {\n                field_str = internals::get_trimmed(field_str, _data->ws_flags);\n            }\n\n            return field_str;\n        }\n\n        /** Retrieve a string view corresponding to the specified index */\n        csv::string_view get_field(size_t index) const;\n\n        /** Iterator-safe field access using explicit data pointer \n         *  (prevents accessing freed data when CSVRow is reassigned)\n         */\n        csv::string_view get_field_safe(size_t index, internals::RawCSVDataPtr _data) const;\n\n        internals::RawCSVDataPtr data;\n\n        /** Where in RawCSVData.data we start */\n        size_t data_start = 0;\n\n        /** Where in the RawCSVDataPtr.fields array we start */\n        size_t fields_start = 0;\n\n        /** How many columns this row spans */\n        size_t row_length = 0;\n    };\n\n#ifdef _MSC_VER\n#pragma region CSVField::get Specializations\n#endif\n    /** Retrieve this field's original string */\n    template<>\n    inline std::string CSVField::get<std::string>() {\n        return std::string(this->sv);\n    }\n\n    /** Retrieve a view over this field's string\n     *\n     *  @warning This string_view is only guaranteed to be valid as long as this\n     *           CSVRow is still alive.\n     */\n    template<>\n    CONSTEXPR_14 csv::string_view CSVField::get<csv::string_view>() {\n        return this->sv;\n    }\n\n    /** Retrieve this field's value as a long double */\n    template<>\n    CONSTEXPR_14 long double CSVField::get<long double>() {\n        if (!is_num())\n            throw std::runtime_error(internals::ERROR_NAN);\n\n        return this->value;\n    }\n\n    /** Non-throwing retrieval of field as std::string */\n    template<>\n    inline bool CSVField::try_get<std::string>(std::string& out) noexcept {\n        out = std::string(this->sv);\n        return true;\n    }\n\n    /** Non-throwing retrieval of field as csv::string_view */\n    template<>\n    CONSTEXPR_14 bool CSVField::try_get<csv::string_view>(csv::string_view& out) noexcept {\n        out = this->sv;\n        return true;\n    }\n\n    /** Non-throwing retrieval of field as long double */\n    template<>\n    CONSTEXPR_14 bool CSVField::try_get<long double>(long double& out) noexcept {\n        if (!is_num())\n            return false;\n\n        out = this->value;\n        return true;\n    }\n#ifdef _MSC_VER\n#pragma endregion CSVField::get Specializations\n#endif\n\n    /** Compares the contents of this field to a string */\n    template<>\n    CONSTEXPR bool CSVField::operator==(const char * other) const noexcept\n    {\n        return this->sv == other;\n    }\n\n    /** Compares the contents of this field to a string */\n    template<>\n    CONSTEXPR bool CSVField::operator==(csv::string_view other) const noexcept\n    {\n        return this->sv == other;\n    }\n}\n\n#undef CSV_INIT_WITH_OPTIONAL_DCL\n\n/** @file\n *  @brief Shared contracts for row deque implementations\n */\n\n\n\n#if CSV_ENABLE_THREADS\n/** @file\n *  @brief Thread-safe deque for producer-consumer patterns\n * \n *  Generic container used for cross-thread communication in the CSV parser.\n *  Parser thread pushes rows, main thread pops them.\n *\n *  Design notes: see THREADSAFE_DEQUE_DESIGN.md for protocol details,\n *  invariants, and producer/consumer timing diagrams.\n */\n\n\n#include <atomic>\n#include <condition_variable>\n#include <deque>\n#include <mutex>\n\nnamespace csv {\n    namespace internals {\n        /** A std::deque wrapper which allows multiple read and write threads to concurrently\n         *  access it along with providing read threads the ability to wait for the deque\n         *  to become populated.\n         *\n         *  Concurrency strategy: writer-side mutations (push_back/pop_front) are locked;\n         *  hot-path flags (empty/is_waitable) are atomic; operator[] and iterators are\n         *  not synchronized and must not run concurrently with writers.\n         */\n        template<typename T>\n        class ThreadSafeDeque {\n        public:\n            ThreadSafeDeque(size_t notify_size = 100) : _notify_size(notify_size) {}\n\n            ThreadSafeDeque(const ThreadSafeDeque& other) {\n                this->data = other.data;\n                this->_notify_size = other._notify_size;\n                this->_is_empty.store(other._is_empty.load(std::memory_order_acquire), std::memory_order_release);\n            }\n\n            ThreadSafeDeque(const std::deque<T>& source) : ThreadSafeDeque() {\n                this->data = source;\n                this->_is_empty.store(source.empty(), std::memory_order_release);\n            }\n\n            bool empty() const noexcept {\n                return this->_is_empty.load(std::memory_order_acquire);\n            }\n\n            T& front() noexcept {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                return this->data.front();\n            }\n\n            /** NOTE: operator[] is not synchronized.\n             *  Only call when no concurrent push_back/pop_front can occur.\n             *  std::deque can reallocate its internal map on push_back, which\n             *  makes concurrent operator[] access undefined behavior.\n             */\n            T& operator[](size_t n) {\n                return this->data[n];\n            }\n\n            void push_back(T&& item) {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                this->data.push_back(std::move(item));\n                this->_is_empty.store(false, std::memory_order_release);\n\n                if (this->data.size() >= _notify_size) {\n                    this->_cond.notify_all();\n                }\n            }\n\n            T pop_front() noexcept {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                T item = std::move(data.front());\n                data.pop_front();\n\n                if (this->data.empty()) {\n                    this->_is_empty.store(true, std::memory_order_release);\n                }\n\n                return item;\n            }\n\n            /** Returns true if a thread is actively pushing items to this deque */\n            bool is_waitable() const noexcept {\n                return this->_is_waitable.load(std::memory_order_acquire);\n            }\n\n            void wait() {\n                if (!is_waitable()) {\n                    return;\n                }\n\n                std::unique_lock<std::mutex> lock{ this->_lock };\n                this->_cond.wait(lock, [this] { return this->data.size() >= _notify_size || !this->is_waitable(); });\n                lock.unlock();\n            }\n\n            size_t size() const noexcept {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                return this->data.size();\n            }\n\n            typename std::deque<T>::iterator begin() noexcept {\n                return this->data.begin();\n            }\n\n            typename std::deque<T>::iterator end() noexcept {\n                return this->data.end();\n            }\n\n            /** Tell listeners that this deque is actively being pushed to */\n            void notify_all() {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                this->_is_waitable.store(true, std::memory_order_release);\n                this->_cond.notify_all();\n            }\n\n            void kill_all() {\n                std::lock_guard<std::mutex> lock{ this->_lock };\n                this->_is_waitable.store(false, std::memory_order_release);\n                this->_cond.notify_all();\n            }\n\n        private:\n            std::atomic<bool> _is_empty{ true };      // Lock-free empty() check\n            std::atomic<bool> _is_waitable{ false };  // Lock-free is_waitable() check\n            size_t _notify_size;\n            mutable std::mutex _lock;\n            std::condition_variable _cond;\n            std::deque<T> data;\n        };\n    }\n}\n\n#else\n/** @file\n *  @brief Single-threaded row deque implementation\n */\n\n\n#include <deque>\n#include <utility>\n\nnamespace csv {\n    namespace internals {\n        template<typename T>\n        class SingleThreadDeque {\n        public:\n            SingleThreadDeque(size_t notify_size = 100) : _notify_size(notify_size) {}\n\n            SingleThreadDeque(const SingleThreadDeque& other) {\n                this->data = other.data;\n                this->_notify_size = other._notify_size;\n                this->_is_empty = other._is_empty;\n                this->_is_waitable = other._is_waitable;\n            }\n\n            SingleThreadDeque(const std::deque<T>& source) : SingleThreadDeque() {\n                this->data = source;\n                this->_is_empty = source.empty();\n            }\n\n            bool empty() const noexcept {\n                return this->_is_empty;\n            }\n\n            T& front() noexcept {\n                return this->data.front();\n            }\n\n            T& operator[](size_t n) {\n                return this->data[n];\n            }\n\n            void push_back(T&& item) {\n                this->data.push_back(std::move(item));\n                this->_is_empty = false;\n            }\n\n            T pop_front() noexcept {\n                T item = std::move(data.front());\n                data.pop_front();\n\n                if (this->data.empty()) {\n                    this->_is_empty = true;\n                }\n\n                return item;\n            }\n\n            bool is_waitable() const noexcept {\n                return this->_is_waitable;\n            }\n\n            void wait() {\n                // No-op in single-thread mode.\n            }\n\n            size_t size() const noexcept {\n                return this->data.size();\n            }\n\n            typename std::deque<T>::iterator begin() noexcept {\n                return this->data.begin();\n            }\n\n            typename std::deque<T>::iterator end() noexcept {\n                return this->data.end();\n            }\n\n            void notify_all() {\n                this->_is_waitable = true;\n            }\n\n            void kill_all() {\n                this->_is_waitable = false;\n            }\n\n        private:\n            bool _is_empty = true;\n            bool _is_waitable = false;\n            size_t _notify_size;\n            std::deque<T> data;\n        };\n    }\n}\n\n#endif\n\n#include <cstddef>\n#include <type_traits>\n#include <utility>\n\n#ifdef CSV_HAS_CXX20\n#include <concepts>\n#endif\n\nnamespace csv {\n    namespace internals {\n#if !CSV_ENABLE_THREADS\n    template<typename T>\n    using ThreadSafeDeque = SingleThreadDeque<T>;\n#endif\n\n#ifdef CSV_HAS_CXX20\n        template<typename Q, typename T>\n        concept RowDequeLike = requires(Q q, const Q cq, T item, size_t n) {\n            { Q(100) };\n            { q.push_back(std::move(item)) } -> std::same_as<void>;\n            { q.pop_front() } -> std::same_as<T>;\n            { cq.empty() } -> std::same_as<bool>;\n            { cq.is_waitable() } -> std::same_as<bool>;\n            { q.wait() } -> std::same_as<void>;\n            { q.notify_all() } -> std::same_as<void>;\n            { q.kill_all() } -> std::same_as<void>;\n            { q.front() } -> std::same_as<T&>;\n            { q[n] } -> std::same_as<T&>;\n            { cq.size() } -> std::same_as<size_t>;\n            { q.begin() };\n            { q.end() };\n        };\n\n        #if CSV_ENABLE_THREADS\n            static_assert(RowDequeLike<ThreadSafeDeque<int>, int>, \"ThreadSafeDeque must satisfy RowDequeLike contract\");\n        #else\n            static_assert(RowDequeLike<SingleThreadDeque<int>, int>, \"SingleThreadDeque must satisfy RowDequeLike contract\");\n            static_assert(RowDequeLike<ThreadSafeDeque<int>, int>, \"Selected ThreadSafeDeque alias must satisfy RowDequeLike contract\");\n        #endif\n#endif\n    }\n}\n\n\nnamespace csv {\n    namespace internals {\n        constexpr const int UNINITIALIZED_FIELD = -1;\n\n        /** Helper constexpr function to initialize an array with all the elements set to value\n         */\n        template<typename OutArray, typename T = typename OutArray::type>\n        CSV_CONST CONSTEXPR_17 OutArray arrayToDefault(T&& value)\n        {\n            OutArray a {};\n            for (auto& e : a)\n                 e = value;\n            return a;\n        }\n\n        /** Create a vector v where each index i corresponds to the\n         *  ASCII number for a character and, v[i + 128] labels it according to\n         *  the CSVReader::ParseFlags enum\n         */\n        CSV_CONST CONSTEXPR_17 ParseFlagMap make_parse_flags(char delimiter) {\n            auto ret = arrayToDefault<ParseFlagMap>(ParseFlags::NOT_SPECIAL);\n            ret[delimiter + CHAR_OFFSET] = ParseFlags::DELIMITER;\n            ret['\\r' + CHAR_OFFSET] = ParseFlags::NEWLINE;\n            ret['\\n' + CHAR_OFFSET] = ParseFlags::NEWLINE;\n            return ret;\n        }\n\n        /** Create a vector v where each index i corresponds to the\n         *  ASCII number for a character and, v[i + 128] labels it according to\n         *  the CSVReader::ParseFlags enum\n         */\n        CSV_CONST CONSTEXPR_17 ParseFlagMap make_parse_flags(char delimiter, char quote_char) {\n            std::array<ParseFlags, 256> ret = make_parse_flags(delimiter);\n            ret[quote_char + CHAR_OFFSET] = ParseFlags::QUOTE;\n            return ret;\n        }\n\n        inline char infer_delimiter(const ParseFlagMap& parse_flags) noexcept {\n            for (int i = 0; i < 256; ++i) {\n                char ch = static_cast<char>(i);\n                if (parse_flags[ch + CHAR_OFFSET] == ParseFlags::DELIMITER) {\n                    return ch;\n                }\n            }\n\n            return ',';\n        }\n\n        // fallback is returned when no QUOTE flag exists in parse_flags (e.g. no_quote mode).\n        // Pass the delimiter so SIMD stops there instead of on a byte that is NOT_SPECIAL.\n        inline char infer_quote_char(const ParseFlagMap& parse_flags, char fallback = '\"') noexcept {\n            for (int i = 0; i < 256; ++i) {\n                char ch = static_cast<char>(i);\n                if (parse_flags[ch + CHAR_OFFSET] == ParseFlags::QUOTE) {\n                    return ch;\n                }\n            }\n\n            return fallback;\n        }\n\n        /** Create a vector v where each index i corresponds to the\n         *  ASCII number for a character c and, v[i + 128] is true if\n         *  c is a whitespace character\n         */\n        CSV_CONST CONSTEXPR_17 WhitespaceMap make_ws_flags(const char* ws_chars, size_t n_chars) {\n            auto ret = arrayToDefault<WhitespaceMap>(false);\n            for (size_t j = 0; j < n_chars; j++) {\n                ret[ws_chars[j] + CHAR_OFFSET] = true;\n            }\n            return ret;\n        }\n\n        inline WhitespaceMap make_ws_flags(const std::vector<char>& flags) {\n            return make_ws_flags(flags.data(), flags.size());\n        }\n\n        CSV_INLINE size_t get_file_size(csv::string_view filename);\n\n        CSV_INLINE std::string get_csv_head(csv::string_view filename);\n    }\n\n    /** Standard type for storing collection of rows */\n    using RowCollection = internals::ThreadSafeDeque<CSVRow>;\n\n    namespace internals {\n        /** Abstract base class which provides CSV parsing logic.\n         *\n         *  Concrete implementations may customize this logic across\n         *  different input sources, such as memory mapped files, stringstreams,\n         *  etc...\n         */\n        class IBasicCSVParser {\n        public:\n            IBasicCSVParser() = default;\n            IBasicCSVParser(const CSVFormat&, const ColNamesPtr&);\n            IBasicCSVParser(\n                const ParseFlagMap& parse_flags,\n                const WhitespaceMap& ws_flags\n            ) : parse_flags_(parse_flags), ws_flags_(ws_flags) {\n                const char d = internals::infer_delimiter(parse_flags);\n                simd_sentinels_ = SentinelVecs(d, internals::infer_quote_char(parse_flags, d));\n                has_ws_trimming_ = std::any_of(ws_flags.begin(), ws_flags.end(), [](bool b) { return b; });\n            }\n\n            virtual ~IBasicCSVParser() {}\n\n            /** Whether or not we have reached the end of source */\n            bool eof() { return this->eof_; }\n\n            /** Parse the next block of data */\n            virtual void next(size_t bytes) = 0;\n\n            /** Indicate the last block of data has been parsed */\n            void end_feed();\n\n            CONSTEXPR_17 ParseFlags parse_flag(const char ch) const noexcept {\n                return parse_flags_.data()[ch + CHAR_OFFSET];\n            }\n\n            CONSTEXPR_17 ParseFlags compound_parse_flag(const char ch) const noexcept {\n                return quote_escape_flag(parse_flag(ch), this->quote_escape_);\n            }\n\n            /** Whether or not this CSV has a UTF-8 byte order mark */\n            CONSTEXPR bool utf8_bom() const { return this->utf8_bom_; }\n\n            void set_output(RowCollection& rows) { this->records_ = &rows; }\n\n        protected:\n            /** @name Current Parser State */\n            ///@{\n            CSVRow current_row_;\n            RawCSVDataPtr data_ptr_ = nullptr;\n            ColNamesPtr col_names_ = nullptr;\n            RawCSVFieldList* fields_ = nullptr;\n            int field_start_ = UNINITIALIZED_FIELD;\n            size_t field_length_ = 0;\n\n            /** Precomputed SIMD broadcast vectors for find_next_non_special */\n            SentinelVecs simd_sentinels_;\n\n            /** An array where the (i + 128)th slot gives the ParseFlags for ASCII character i */\n            ParseFlagMap parse_flags_;\n            ///@}\n\n            /** @name Current Stream/File State */\n            ///@{\n            bool eof_ = false;\n\n            /** The size of the incoming CSV */\n            size_t source_size_ = 0;\n            ///@}\n\n            /** Whether or not source needs to be read in chunks */\n            CONSTEXPR bool no_chunk() const { return this->source_size_ < ITERATION_CHUNK_SIZE; }\n\n            /** Parse the current chunk of data *\n             *\n             *  @returns How many character were read that are part of complete rows\n             */\n            size_t parse();\n\n            /** Create a new RawCSVDataPtr for a new chunk of data */\n            void reset_data_ptr();\n        private:\n            /** An array where the (i + 128)th slot determines whether ASCII character i should\n             *  be trimmed\n             */\n            WhitespaceMap ws_flags_;\n\n            /** True when at least one whitespace trim character is configured.\n             *  Used to skip trim loops entirely in the common no-trim case.\n             */\n            bool has_ws_trimming_ = false;\n            bool quote_escape_ = false;\n            bool field_has_double_quote_ = false;\n\n            /** Where we are in the current data block */\n            size_t data_pos_ = 0;\n\n            /** Whether or not an attempt to find Unicode BOM has been made */\n            bool unicode_bom_scan_ = false;\n            bool utf8_bom_ = false;\n\n            /** Where complete rows should be pushed to */\n            RowCollection* records_ = nullptr;\n\n            CONSTEXPR_17 bool ws_flag(const char ch) const noexcept {\n                return ws_flags_.data()[ch + CHAR_OFFSET];\n            }\n\n            size_t& current_row_start() {\n                return this->current_row_.data_start;\n            }\n\n            void parse_field() noexcept;\n\n            /** Finish parsing the current field */\n            void push_field();\n\n            /** Finish parsing the current row */\n            void push_row();\n\n            /** Handle possible Unicode byte order mark */\n            void trim_utf8_bom();\n        };\n\n        /** Read up to 500KB from a stream without rewinding.\n         *\n         *  Replaces the old get_csv_head(TStream&) which required seekg/tellg.\n         *  Works with any std::istream, including non-seekable sources such as\n         *  pipes and decompression filters.\n         */\n        template<typename TStream,\n            csv::enable_if_t<std::is_base_of<std::istream, TStream>::value, int>  = 0>\n        std::string read_head_buffer(TStream& source) {\n            const size_t limit = 500000;\n            std::string buf(limit, '\\0');\n            source.read(&buf[0], (std::streamsize)limit);\n            buf.resize(static_cast<size_t>(source.gcount()));\n            return buf;\n        }\n\n        /** Read the first 500KB of a CSV file */\n        CSV_INLINE std::string get_csv_head(csv::string_view filename, size_t file_size);\n\n        /** A class for parsing CSV data from any std::istream, including\n         *  non-seekable sources such as pipes and decompression filters.\n         *\n         *  @par Chunk boundary handling\n         *  parse() returns the byte offset of the start of the last incomplete\n         *  row in the current chunk (the \"remainder\"). Rather than seeking back\n         *  to re-read those bytes (which requires a seekable stream), they are\n         *  saved in `leftover_` and prepended to the next chunk. This is\n         *  semantically identical to the old seek-back approach but works on\n         *  any istream and avoids the syscall overhead of seekg().\n         *\n         *  @par Head buffer\n         *  init_from_stream() reads a head buffer for format guessing before\n         *  constructing this parser. That buffer is passed in as the initial\n         *  `leftover_`, so its bytes are fed into the first chunk as if they had\n         *  just been read from the stream.\n         */\n        template<typename TStream>\n        class StreamParser: public IBasicCSVParser {\n            using RowCollection = ThreadSafeDeque<CSVRow>;\n\n        public:\n            StreamParser(TStream& source,\n                const CSVFormat& format,\n                const ColNamesPtr& col_names = nullptr,\n                std::string head = {}\n            ) : IBasicCSVParser(format, col_names), leftover_(std::move(head)),\n                source_(source) {}\n\n            StreamParser(\n                TStream& source,\n                internals::ParseFlagMap parse_flags,\n                internals::WhitespaceMap ws_flags) :\n                IBasicCSVParser(parse_flags, ws_flags),\n                source_(source)\n            {}\n\n            ~StreamParser() {}\n\n            void next(size_t bytes = ITERATION_CHUNK_SIZE) override {\n                if (this->eof()) return;\n\n                // Reset parser state\n                this->field_start_ = UNINITIALIZED_FIELD;\n                this->field_length_ = 0;\n                this->reset_data_ptr();\n                this->data_ptr_->_data = std::make_shared<std::string>();\n\n                auto& chunk = *static_cast<std::string*>(this->data_ptr_->_data.get());\n\n                // Prepend leftover bytes from the previous chunk's incomplete\n                // trailing row, then read the next block from the stream.\n                // Uses a raw buffer to avoid std::string::resize() zero-fill\n                // on the full 10MB chunk size (critical for tiny inputs).\n                chunk = std::move(leftover_);\n                std::unique_ptr<char[]> buf(new char[bytes]);\n                source_.read(buf.get(), (std::streamsize)bytes);\n\n                const size_t n = static_cast<size_t>(source_.gcount());\n                \n                if (n > 0) chunk.append(buf.get(), n);\n\n                // Check for real I/O errors only (bad bit indicates unrecoverable error).\n                // failbit alone is not fatal - it's set on EOF or when requesting bytes\n                // beyond available data, which is normal behavior for stringstreams.\n                if (source_.bad()) {\n                    throw std::runtime_error(\"StreamParser read failure\");\n                }\n\n                // Create string_view\n                this->data_ptr_->data = chunk;\n\n                // Parse\n                this->current_row_ = CSVRow(this->data_ptr_);\n                size_t remainder = this->parse();\n\n                if (source_.eof() || chunk.empty()) {\n                    this->eof_ = true;\n                    this->end_feed();\n                }\n                else {\n                    // Save the tail bytes that begin an incomplete row so they\n                    // are prepended to the next chunk (see class-level comment).\n                    leftover_ = chunk.substr(remainder);\n                }\n            }\n\n        private:\n            // Bytes from the previous chunk that form the start of an incomplete\n            // row, plus the initial head buffer on the first call.\n            std::string leftover_;\n\n            TStream& source_;\n        };\n\n#if !defined(__EMSCRIPTEN__)\n        /** Parser for memory-mapped files\n         *\n         *  @par Implementation\n         *  This class constructs moving windows over a file to avoid\n         *  creating massive memory maps which may require more RAM\n         *  than the user has available. It contains logic to automatically\n         *  re-align each memory map to the beginning of a CSV row.\n         *\n         */\n        class MmapParser : public IBasicCSVParser {\n        public:\n            MmapParser(csv::string_view filename,\n                const CSVFormat& format,\n                const ColNamesPtr& col_names = nullptr\n            ) : IBasicCSVParser(format, col_names) {\n                this->_filename = filename.data();\n                this->source_size_ = get_file_size(filename);\n            };\n\n            ~MmapParser() {}\n\n            void next(size_t bytes) override;\n\n        private:\n            std::string _filename;\n            size_t mmap_pos = 0;\n        };\n#endif\n    }\n}\n\n\n/** The all encompassing namespace */\nnamespace csv {\n    /** Stuff that is generally not of interest to end-users */\n    namespace internals {\n        std::string format_row(const std::vector<std::string>& row, csv::string_view delim = \", \");\n\n        std::vector<std::string> _get_col_names( csv::string_view head, const CSVFormat format = CSVFormat::guess_csv());\n\n        struct GuessScore {\n            double score;\n            size_t header;\n        };\n\n        CSV_INLINE GuessScore calculate_score(csv::string_view head, const CSVFormat& format);\n\n        CSVGuessResult _guess_format(csv::string_view head, const std::vector<char>& delims = { ',', '|', '\\t', ';', '^', '~' });\n    }\n\n    std::vector<std::string> get_col_names(\n        csv::string_view filename,\n        const CSVFormat format = CSVFormat::guess_csv());\n\n    /** @brief Guess the delimiter and header row of a CSV file\n     *\n     *  @param[in] filename  Path to CSV file\n     *  @param[in] delims    Candidate delimiters to test\n     *  @return CSVGuessResult containing the detected delimiter and header row index\n     *\n     *  **Heuristic:** For each candidate delimiter, calculate a score based on\n     *  the most common row length (mode). The delimiter with the highest score wins.\n     *  \n     *  **Header Detection:**\n     *  - If the first row has >= columns than the mode, it's treated as the header\n     *  - Otherwise, the first row with the mode length is treated as the header\n     *  \n     *  This approach handles:\n     *  - Headers with trailing delimiters or optional columns (wider than data rows)\n     *  - Comment lines before the actual header (first row shorter than mode)\n     *  - Standard CSVs where first row is the header\n     *  \n     *  @note Score = (row_length × count_of_rows_with_that_length)\n     */\n    CSVGuessResult guess_format(csv::string_view filename,\n        const std::vector<char>& delims = { ',', '|', '\\t', ';', '^', '~' });\n\n    /** @class CSVReader\n     *  @brief Main class for parsing CSVs from files and in-memory sources\n     *\n     *  All rows are compared to the column names for length consistency\n     *  - By default, rows that are too short or too long are dropped\n     *  - Custom behavior can be defined by overriding bad_row_handler in a subclass\n     *\n     *  **Streaming semantics:** CSVReader is a single-pass streaming reader. Every read\n     *  operation — read_row(), the iterator interface — pulls rows permanently\n     *  from the internal queue. Rows consumed by one interface are not visible to another.\n     *  There is no rewind or seek.\n     *\n    *  **Ownership and sharing:** CSVReader is non-copyable and move-enabled. It manages\n    *  live parsing state (worker thread, internal queue, and optional owned stream), so\n    *  ownership transfer should be explicit. To share or transfer a reader, wrap it in a\n    *  `std::unique_ptr<CSVReader>`:\n     *  @code{.cpp}\n     *  auto reader = std::make_unique<csv::CSVReader>(\"data.csv\");\n     *  process(std::move(reader));   // transfer ownership\n     *  @endcode\n     */\n    class CSVReader {\n    public:\n        /**\n         * An input iterator capable of handling large files.\n         * @note Created by CSVReader::begin() and CSVReader::end().\n         *\n         * @par Iterating over a file\n         * @snippet tests/test_csv_iterator.cpp CSVReader Iterator 1\n         *\n         * @par Using with `<algorithm>` library\n         * @snippet tests/test_csv_iterator.cpp CSVReader Iterator 2\n         * \n         * @warning STREAMING CONSTRAINT - DO NOT ATTEMPT TO CACHE ALL DATA\n         * This iterator is intentionally std::input_iterator_tag (single-pass) to support\n         * streaming large CSV files that may exceed available RAM (e.g., 50+ GB files).\n         * \n         * @par CRITICAL DESIGN CONSTRAINT:\n         * - The underlying RawCSVData chunks are automatically freed as the iterator advances\n         * - Only the CURRENT row's data is kept alive (via CSVRow's RawCSVDataPtr member)\n         * - Previous chunks are freed to allow unlimited file sizes with bounded memory\n         * \n         * @par WHY FORWARD ITERATOR IS NOT POSSIBLE:\n         * - ForwardIterator requires multi-pass guarantees (can hold multiple valid positions)\n         * - Supporting this would require caching ALL RawCSVDataPtr chunks in the iterator\n         * - This defeats the streaming purpose: a 50 GB CSV would require 50+ GB of RAM\n         * - The entire library design depends on automatic chunk cleanup for memory efficiency\n         * \n         * @par IMPLICATIONS FOR ALGORITHM USE:\n         * - Algorithms requiring ForwardIterator (std::max_element, std::sort, etc.) may\n         *   appear to work in tests with small files, but will cause heap-use-after-free\n         *   when the algorithm tries to access iterators pointing to freed chunks\n         * - CORRECT approach: Copy rows to std::vector first, then use algorithms\n         * - Example: auto rows = std::vector<CSVRow>(reader.begin(), reader.end());\n         *            auto max_row = std::max_element(rows.begin(), rows.end(), ...);\n         * \n         * @par FOR AI AGENTS AND MAINTAINERS:\n         * If you encounter heap-use-after-free with ForwardIterator algorithms, the solution\n         * is NOT to cache all RawCSVDataPtr chunks - this violates the fundamental streaming\n         * architecture. Instead, document the limitation or provide vector-based workarounds.\n         */\n        class iterator {\n        public:\n            #ifndef DOXYGEN_SHOULD_SKIP_THIS\n            using value_type = CSVRow;\n            using difference_type = std::ptrdiff_t;\n            using pointer = CSVRow * ;\n            using reference = CSVRow & ;\n            using iterator_category = std::input_iterator_tag;\n            #endif\n\n            iterator() = default;\n            iterator(CSVReader* reader) : daddy(reader) {}\n            iterator(CSVReader*, CSVRow&&);\n\n            /** Access the CSVRow held by the iterator */\n            CONSTEXPR_14 reference operator*() { return this->row; }\n            CONSTEXPR_14 reference operator*() const { return const_cast<reference>(this->row); }\n\n            /** Return a pointer to the CSVRow the iterator has stopped at */\n            CONSTEXPR_14 pointer operator->() { return &(this->row); }\n            CONSTEXPR_14 pointer operator->() const { return const_cast<pointer>(&(this->row)); }\n\n            iterator& operator++();   /**< Pre-increment iterator */\n            iterator operator++(int); /**< Post-increment iterator */\n\n            /** Returns true if iterators were constructed from the same CSVReader\n             *  and point to the same row\n             */\n            CONSTEXPR bool operator==(const iterator& other) const noexcept {\n                return (this->daddy == other.daddy) && (this->i == other.i);\n            }\n\n            CONSTEXPR bool operator!=(const iterator& other) const noexcept { return !operator==(other); }\n        private:\n            CSVReader * daddy = nullptr;  // Pointer to parent\n            CSVRow row;                   // Current row\n            size_t i = 0;               // Index of current row\n        };\n\n        /** @name Constructors\n         *  Constructors for iterating over large files and parsing in-memory sources.\n         */\n         ///@{\n        /** @brief Construct CSVReader from filename.\n         * \n         * Native builds use CODE PATH 1 of 2: MmapParser with mio for maximum performance.\n         * Emscripten builds fall back to the stream-based implementation because mmap is unavailable.\n         * \n         * @note On native builds, bugs can exist in this path independently of the stream path\n         * @note When writing tests that validate I/O behavior, test both filename and stream constructors\n         * @see StreamParser for the stream-based alternative\n         */\n        CSVReader(csv::string_view filename, CSVFormat format = CSVFormat::guess_csv());\n\n        /** @brief Construct CSVReader from std::istream\n         * \n         * Uses StreamParser. On native builds this is CODE PATH 2 of 2 and remains independent\n         * from the filename-based mmap path. On Emscripten, the filename constructor also funnels\n         * through this implementation.\n         *\n         *  @tparam TStream An input stream deriving from `std::istream`\n         *  @note Delimiter/header guessing is still available by default via CSVFormat::guess_csv().\n         *        For deterministic parsing of known dialects, pass an explicit CSVFormat.\n         *  @note On native builds, tests that validate I/O behavior should cover both constructors\n         *  @see MmapParser for the memory-mapped alternative\n         */\n        template<typename TStream,\n            csv::enable_if_t<std::is_base_of<std::istream, TStream>::value, int> = 0>\n        CSVReader(TStream &source, CSVFormat format = CSVFormat::guess_csv()) : _format(format) {\n            this->init_from_stream(source, format);\n        }\n\n        /** @brief Construct CSVReader from an owned std::istream\n         *\n         *  This is an opt-in safety switch for stream lifetime management.\n         *  CSVReader takes ownership and guarantees the stream outlives parsing.\n         */\n        CSVReader(std::unique_ptr<std::istream> source,\n            const CSVFormat& format = CSVFormat::guess_csv()) : _format(format), owned_stream(std::move(source)) {\n            if (!this->owned_stream) {\n                throw std::invalid_argument(\"CSVReader requires a non-null stream\");\n            }\n\n            this->init_from_stream(*this->owned_stream, format);\n        }\n        ///@}\n\n        CSVReader(const CSVReader&) = delete;             ///< Not copyable\n        CSVReader& operator=(const CSVReader&) = delete;  ///< Not copyable\n\n        /** Move constructor.\n         *\n         * Required so C++11 builds can return CSVReader by value from helpers like\n         * csv::parse()/csv::parse_unsafe(), where copy elision is not guaranteed.\n         *\n         * Any active worker on the source is joined before moving parser state to\n         * avoid a thread continuing to run against the source object's address.\n         */\n        CSVReader(CSVReader&& other) noexcept :\n            _format(std::move(other._format)),\n            col_names(std::move(other.col_names)),\n            parser(std::move(other.parser)),\n            records(std::move(other.records)),\n            owned_stream(std::move(other.owned_stream)),\n            n_cols(other.n_cols),\n            _n_rows(other._n_rows),\n            header_trimmed(other.header_trimmed),\n            _chunk_size(other._chunk_size),\n            _read_requested(other._read_requested),\n            read_csv_exception(other.take_read_csv_exception()) {\n#if CSV_ENABLE_THREADS\n            if (other.read_csv_worker.joinable()) {\n                other.read_csv_worker.join();\n            }\n#endif\n\n            other.n_cols = 0;\n            other._n_rows = 0;\n            other.header_trimmed = false;\n            other._read_requested = false;\n            other._chunk_size = internals::ITERATION_CHUNK_SIZE;\n        }\n\n        /** Move assignment.\n         *\n         * Joins active workers on both sides before transferring parser state.\n         */\n        CSVReader& operator=(CSVReader&& other) noexcept {\n            if (this == &other) {\n                return *this;\n            }\n\n#if CSV_ENABLE_THREADS\n            if (this->read_csv_worker.joinable()) {\n                this->read_csv_worker.join();\n            }\n            if (other.read_csv_worker.joinable()) {\n                other.read_csv_worker.join();\n            }\n#endif\n\n            this->_format = std::move(other._format);\n            this->col_names = std::move(other.col_names);\n            this->parser = std::move(other.parser);\n            this->records = std::move(other.records);\n            this->owned_stream = std::move(other.owned_stream);\n            this->n_cols = other.n_cols;\n            this->_n_rows = other._n_rows;\n            this->header_trimmed = other.header_trimmed;\n            this->_chunk_size = other._chunk_size;\n            this->_read_requested = other._read_requested;\n            this->read_csv_exception = other.take_read_csv_exception();\n\n            other.n_cols = 0;\n            other._n_rows = 0;\n            other.header_trimmed = false;\n            other._read_requested = false;\n            other._chunk_size = internals::ITERATION_CHUNK_SIZE;\n\n            return *this;\n        }\n\n        ~CSVReader() {\n#if CSV_ENABLE_THREADS\n            if (this->read_csv_worker.joinable()) {\n                this->read_csv_worker.join();\n            }\n#endif\n        }\n\n        /** @name Retrieving CSV Rows */\n        ///@{\n        bool read_row(CSVRow &row);\n        iterator begin();\n        CSV_CONST iterator end() const noexcept;\n\n        /** Returns true if we have reached end of file */\n        bool eof() const noexcept { return this->parser->eof(); }\n        ///@}\n\n        /** @name CSV Metadata */\n        ///@{\n        CSVFormat get_format() const;\n        std::vector<std::string> get_col_names() const;\n        int index_of(csv::string_view col_name) const;\n        ///@}\n\n        /** @name CSV Metadata: Attributes */\n        ///@{\n        /** Whether or not the file or stream contains valid CSV rows,\n         *  not including the header.\n         *\n         *  @note Gives an accurate answer regardless of when it is called.\n         *\n         */\n        CONSTEXPR bool empty() const noexcept { return this->n_rows() == 0; }\n\n        /** Retrieves the number of rows that have been read so far */\n        CONSTEXPR size_t n_rows() const noexcept { return this->_n_rows; }\n\n        /** Whether or not CSV was prefixed with a UTF-8 bom */\n        bool utf8_bom() const noexcept { return this->parser->utf8_bom(); }\n        ///@}\n\n    protected:\n        /**\n         * \\defgroup csv_internal CSV Parser Internals\n         * @brief Internals of CSVReader. Only maintainers and those looking to\n         *        extend the parser should read this.\n         * @{\n         */\n\n        /** Sets this reader's column names and associated data */\n        void set_col_names(const std::vector<std::string>&);\n\n        /** @name CSV Settings **/\n        ///@{\n        CSVFormat _format;\n        ///@}\n\n        /** @name Parser State */\n        ///@{\n        /** Pointer to a object containing column information */\n        internals::ColNamesPtr col_names = std::make_shared<internals::ColNames>();\n\n        /** Helper class which actually does the parsing */\n        std::unique_ptr<internals::IBasicCSVParser> parser = nullptr;\n\n        /** Queue of parsed CSV rows */\n        std::unique_ptr<RowCollection> records{new RowCollection(100)};\n\n        /**\n         * Optional owned stream used by two paths:\n         *  1) Emscripten filename-constructor fallback to stream parsing\n         *  2) Opt-in ownership constructor taking std::unique_ptr<std::istream>\n         */\n        std::unique_ptr<std::istream> owned_stream = nullptr;\n\n        size_t n_cols = 0;  /**< The number of columns in this CSV */\n        size_t _n_rows = 0; /**< How many rows (minus header) have been read so far */\n\n        /** @name Multi-Threaded File Reading Functions */\n        ///@{\n        bool read_csv(size_t bytes = internals::ITERATION_CHUNK_SIZE);\n        ///@}\n\n        /**@}*/\n\n    private:\n        /** Whether or not rows before header were trimmed */\n        bool header_trimmed = false;\n        /** @name Multi-Threaded File Reading: Flags and State */\n        ///@{\n    #if CSV_ENABLE_THREADS\n        std::thread read_csv_worker; /**< Worker thread for read_csv() */\n    #endif\n        size_t _chunk_size = internals::ITERATION_CHUNK_SIZE; /**< Current chunk size in bytes */\n        bool _read_requested = false; /**< Flag to detect infinite read loops (Issue #218) */\n        ///@}\n\n        /** If the worker thread throws, store it here and rethrow on the consumer thread. */\n        std::exception_ptr read_csv_exception = nullptr;\n#if CSV_ENABLE_THREADS\n        std::mutex read_csv_exception_lock;\n#endif\n\n        void set_read_csv_exception(std::exception_ptr eptr) {\n#if CSV_ENABLE_THREADS\n            std::lock_guard<std::mutex> lock(this->read_csv_exception_lock);\n#endif\n            this->read_csv_exception = std::move(eptr);\n        }\n\n        std::exception_ptr take_read_csv_exception() {\n#if CSV_ENABLE_THREADS\n            std::lock_guard<std::mutex> lock(this->read_csv_exception_lock);\n#endif\n            auto eptr = this->read_csv_exception;\n            this->read_csv_exception = nullptr;\n            return eptr;\n        }\n\n        void rethrow_read_csv_exception_if_any() {\n            if (auto eptr = this->take_read_csv_exception()) {\n                std::rethrow_exception(eptr);\n            }\n        }\n\n        template<typename TStream,\n            csv::enable_if_t<std::is_base_of<std::istream, TStream>::value, int> = 0>\n        void init_from_stream(TStream& source, CSVFormat format) {\n            // Read a head buffer without rewinding. Works with non-seekable streams\n            // (pipes, decompression filters). The buffer is passed to StreamParser\n            // as its initial leftover_ so those bytes are parsed as the first chunk.\n            auto head = internals::read_head_buffer(source);\n            using Parser = internals::StreamParser<TStream>;\n\n            // Apply chunk size from format before any reading occurs\n            this->_chunk_size = format.get_chunk_size();\n\n            if (format.guess_delim()) {\n                auto guess_result = internals::_guess_format(head, format.possible_delimiters);\n                format.delimiter(guess_result.delim);\n                // Only override header if user hasn't explicitly called no_header()\n                // Note: column_names() also sets header=-1, but it populates col_names,\n                // so we can distinguish: no_header() means header=-1 && col_names.empty()\n                if (format.header != -1 || !format.col_names.empty()) {\n                    format.header = guess_result.header_row;\n                }\n                this->_format = format;\n            }\n\n            if (!format.col_names.empty()) {\n                this->set_col_names(format.col_names);\n            }\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4316)\n#endif\n            this->parser = std::unique_ptr<Parser>(\n                new Parser(source, format, col_names, std::move(head))); // For C++11\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n            this->initial_read();\n        }\n\n        /** Read initial chunk to get metadata */\n        void initial_read() {\n#if CSV_ENABLE_THREADS\n            this->read_csv_worker = std::thread(&CSVReader::read_csv, this, this->_chunk_size);\n            this->read_csv_worker.join();\n#else\n            this->read_csv(this->_chunk_size);\n#endif\n            this->rethrow_read_csv_exception_if_any();\n        }\n\n        void trim_header();\n    };\n}\n\n\nnamespace csv {\n    namespace internals {\n        template<typename T>\n        class is_hashable {\n        private:\n            template<typename U>\n            static auto test(int) -> decltype(\n                std::hash<U>{}(std::declval<const U&>()),\n                std::true_type{}\n            );\n\n            template<typename>\n            static std::false_type test(...);\n\n        public:\n            static constexpr bool value = decltype(test<T>(0))::value;\n        };\n\n        template<typename T>\n        class is_equality_comparable {\n        private:\n            template<typename U>\n            static auto test(int) -> decltype(\n                std::declval<const U&>() == std::declval<const U&>(),\n                std::true_type{}\n            );\n\n            template<typename>\n            static std::false_type test(...);\n\n        public:\n            static constexpr bool value = decltype(test<T>(0))::value;\n        };\n    }\n\n    /** Allows configuration of DataFrame behavior. */\n    class DataFrameOptions {\n    public:\n        DataFrameOptions() = default;\n\n        /** Policy for handling duplicate keys when creating a keyed DataFrame */\n        enum class DuplicateKeyPolicy {\n            THROW,      // Throw an error if a duplicate key is encountered\n            OVERWRITE,  // Overwrite the existing value with the new value\n            KEEP_FIRST  // Ignore the new value and keep the existing value\n        };\n\n        DataFrameOptions& set_duplicate_key_policy(DuplicateKeyPolicy value) {\n            this->duplicate_key_policy = value;\n            return *this;\n        }\n\n        DuplicateKeyPolicy get_duplicate_key_policy() const {\n            return this->duplicate_key_policy;\n        }\n\n        DataFrameOptions& set_key_column(const std::string& value) {\n            this->key_column = value;\n            return *this;\n        }\n\n        const std::string& get_key_column() const {\n            return this->key_column;\n        }\n\n        DataFrameOptions& set_throw_on_missing_key(bool value) {\n            this->throw_on_missing_key = value;\n            return *this;\n        }\n\n        bool get_throw_on_missing_key() const {\n            return this->throw_on_missing_key;\n        }\n\n    private:\n        std::string key_column;\n\n        DuplicateKeyPolicy duplicate_key_policy = DuplicateKeyPolicy::OVERWRITE;\n\n        /** Whether to throw an error if a key column value is missing when creating a keyed DataFrame */\n        bool throw_on_missing_key = true;\n    };\n\n    /**\n     * Proxy class that wraps a CSVRow and intercepts field access to check for edits.\n     * Provides transparent access to both original and edited cell values.\n     */\n    template<typename KeyType>\n    class DataFrameRow {\n    public:\n        /** Default constructor (creates an unbound proxy). */\n        DataFrameRow() : row(nullptr), row_edits(nullptr), key_ptr(nullptr) {}\n\n        /** Construct a DataFrameRow wrapper. */\n        DataFrameRow(\n            const CSVRow* _row,\n            const std::unordered_map<size_t, std::string>* _edits,\n            const KeyType* _key\n        ) : row(_row), row_edits(_edits), key_ptr(_key) {}\n\n        /**\n         * Access a field by column name, checking edits first.\n         * \n         * @param col Column name\n         * @return CSVField representing the field value (edited if present, otherwise original)\n         */\n        CSVField operator[](const std::string& col) const {\n            // Find column index by searching column names\n            auto col_names = row->get_col_names();\n            auto it = std::find(col_names.begin(), col_names.end(), col);\n            if (it == col_names.end()) {\n                // Column not found, let row handle the error\n                return (*row)[col];\n            }\n            \n            size_t col_index = std::distance(col_names.begin(), it);\n            \n            if (row_edits) {\n                auto edit_it = row_edits->find(col_index);\n                if (edit_it != row_edits->end()) {\n                    return CSVField(csv::string_view(edit_it->second));\n                }\n            }\n            return (*row)[col];\n        }\n\n        /** Access a field by position (positional access never checks edits). */\n        CSVField operator[](size_t n) const {\n            return (*row)[n];\n        }\n\n        /** Get the number of fields in the row. */\n        size_t size() const { return row->size(); }\n\n        /** Check if the row is empty. */\n        bool empty() const { return row->empty(); }\n\n        /** Get column names. */\n        std::vector<std::string> get_col_names() const { return row->get_col_names(); }\n\n        /** Get the underlying CSVRow for compatibility. */\n        const CSVRow& get_underlying_row() const { return *row; }\n\n        /** Get the key for this row (only valid for keyed DataFrames). */\n        const KeyType& get_key() const { return *key_ptr; }\n\n        /** Convert to vector of strings for CSVWriter compatibility. */\n        operator std::vector<std::string>() const {\n            std::vector<std::string> result;\n            result.reserve(row->size());\n            \n            for (size_t i = 0; i < row->size(); i++) {\n                // Check if this column has an edit\n                if (row_edits) {\n                    auto it = row_edits->find(i);\n                    if (it != row_edits->end()) {\n                        result.push_back(it->second);\n                        continue;\n                    }\n                }\n                // Use original value\n                result.push_back((*row)[i].get<std::string>());\n            }\n            return result;\n        }\n\n        /** Convert to JSON. */\n        std::string to_json(const std::vector<std::string>& subset = {}) const {\n            return row->to_json(subset);\n        }\n\n        /** Convert to JSON array. */\n        std::string to_json_array(const std::vector<std::string>& subset = {}) const {\n            return row->to_json_array(subset);\n        }\n\n        #ifdef CSV_HAS_CXX20\n        /** Convert this DataFrameRow into a std::ranges::input_range of string_views,\n         *  respecting the sparse overlay (edited values take precedence).\n         */\n        auto to_sv_range() const {\n            return std::views::iota(size_t{0}, this->size())\n                | std::views::transform([this](size_t i) {\n                    // Check if this column has an edit\n                    if (row_edits) {\n                        auto it = row_edits->find(i);\n                        if (it != row_edits->end()) {\n                            return csv::string_view(it->second);\n                        }\n                    }\n                    // Use original value\n                    return this->get_underlying_row().get_field(i);\n                });\n        }\n        #endif\n\n    private:\n        const CSVRow* row;\n        const std::unordered_map<size_t, std::string>* row_edits;\n        const KeyType* key_ptr;\n    };\n\n    template<typename KeyType = std::string>\n    class DataFrame {\n    public:\n        /** Type alias for internal row storage: pair of key and CSVRow. */\n        using row_entry = std::pair<KeyType, CSVRow>;\n\n        /** Row-wise iterator over DataFrameRow entries. Provides access to rows with edit support. */\n        class iterator {\n        public:\n            using value_type = DataFrameRow<KeyType>;\n            using difference_type = std::ptrdiff_t;\n            using pointer = const DataFrameRow<KeyType>*;\n            using reference = const DataFrameRow<KeyType>&;\n            using iterator_category = std::random_access_iterator_tag;\n\n            iterator() = default;\n            iterator(\n                typename std::vector<row_entry>::iterator it,\n                const std::unordered_map<KeyType, std::unordered_map<size_t, std::string>>* edits\n            ) : iter(it), edits_map(edits) {}\n\n            reference operator*() const {\n                const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n                if (edits_map) {\n                    auto it = edits_map->find(iter->first);\n                    if (it != edits_map->end()) {\n                        row_edits = &it->second;\n                    }\n                }\n                cached_row = DataFrameRow<KeyType>(&iter->second, row_edits, &iter->first);\n                return cached_row;\n            }\n\n            pointer operator->() const {\n                // Ensure cached_row is populated\n                operator*();\n                return &cached_row;\n            }\n\n            iterator& operator++() { ++iter; return *this; }\n            iterator operator++(int) { auto tmp = *this; ++iter; return tmp; }\n            iterator& operator--() { --iter; return *this; }\n            iterator operator--(int) { auto tmp = *this; --iter; return tmp; }\n\n            iterator operator+(difference_type n) const { return iterator(iter + n, edits_map); }\n            iterator operator-(difference_type n) const { return iterator(iter - n, edits_map); }\n            difference_type operator-(const iterator& other) const { return iter - other.iter; }\n\n            bool operator==(const iterator& other) const { return iter == other.iter; }\n            bool operator!=(const iterator& other) const { return iter != other.iter; }\n\n        private:\n            typename std::vector<row_entry>::iterator iter;\n            const std::unordered_map<KeyType, std::unordered_map<size_t, std::string>>* edits_map = nullptr;\n            mutable DataFrameRow<KeyType> cached_row;\n        };\n\n        /** Row-wise const iterator over DataFrameRow entries. Provides read-only access to rows with edit support. */\n        class const_iterator {\n        public:\n            using value_type = DataFrameRow<KeyType>;\n            using difference_type = std::ptrdiff_t;\n            using pointer = const DataFrameRow<KeyType>*;\n            using reference = const DataFrameRow<KeyType>&;\n            using iterator_category = std::random_access_iterator_tag;\n\n            const_iterator() = default;\n            const_iterator(\n                typename std::vector<row_entry>::const_iterator it,\n                const std::unordered_map<KeyType, std::unordered_map<size_t, std::string>>* edits\n            ) : iter(it), edits_map(edits) {}\n\n            reference operator*() const {\n                const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n                if (edits_map) {\n                    auto it = edits_map->find(iter->first);\n                    if (it != edits_map->end()) {\n                        row_edits = &it->second;\n                    }\n                }\n                cached_row = DataFrameRow<KeyType>(&iter->second, row_edits, &iter->first);\n                return cached_row;\n            }\n\n            pointer operator->() const {\n                // Ensure cached_row is populated\n                operator*();\n                return &cached_row;\n            }\n\n            const_iterator& operator++() { ++iter; return *this; }\n            const_iterator operator++(int) { auto tmp = *this; ++iter; return tmp; }\n            const_iterator& operator--() { --iter; return *this; }\n            const_iterator operator--(int) { auto tmp = *this; --iter; return tmp; }\n\n            const_iterator operator+(difference_type n) const { return const_iterator(iter + n, edits_map); }\n            const_iterator operator-(difference_type n) const { return const_iterator(iter - n, edits_map); }\n            difference_type operator-(const const_iterator& other) const { return iter - other.iter; }\n\n            bool operator==(const const_iterator& other) const { return iter == other.iter; }\n            bool operator!=(const const_iterator& other) const { return iter != other.iter; }\n\n        private:\n            typename std::vector<row_entry>::const_iterator iter;\n            const std::unordered_map<KeyType, std::unordered_map<size_t, std::string>>* edits_map = nullptr;\n            mutable DataFrameRow<KeyType> cached_row;\n        };\n\n        static_assert(\n            internals::is_hashable<KeyType>::value,\n            \"DataFrame<KeyType> requires KeyType to be hashable (std::hash<KeyType> specialization required).\"\n        );\n\n        static_assert(\n            internals::is_equality_comparable<KeyType>::value,\n            \"DataFrame<KeyType> requires KeyType to be equality comparable (operator== required).\"\n        );\n\n        static_assert(\n            std::is_default_constructible<KeyType>::value,\n            \"DataFrame<KeyType> requires KeyType to be default-constructible.\"\n        );\n\n        using DuplicateKeyPolicy = DataFrameOptions::DuplicateKeyPolicy;\n\n        /** Construct an empty DataFrame. */\n        DataFrame() = default;\n\n        /**\n         * Construct an unkeyed DataFrame from a CSV reader.\n         * Rows are accessible by position only.\n         */\n        explicit DataFrame(CSVReader& reader) {\n            this->init_unkeyed_from_reader(reader);\n        }\n\n        /**\n         * Construct a keyed DataFrame from a CSV reader with options.\n         * \n         * @param reader CSV reader to consume\n         * @param options Configuration including key column and duplicate policies\n         * @throws std::runtime_error if key column is empty or not found\n         */\n        explicit DataFrame(CSVReader& reader, const DataFrameOptions& options) {\n            this->init_from_reader(reader, options);\n        }\n\n        /**\n         * Construct a keyed DataFrame directly from a CSV file.\n         * \n         * @param filename Path to the CSV file\n         * @param options Configuration including key column and duplicate policies\n         * @param format CSV format specification (defaults to auto-detection)\n         * @throws std::runtime_error if key column is empty or not found\n         */\n        DataFrame(\n            csv::string_view filename,\n            const DataFrameOptions& options,\n            CSVFormat format = CSVFormat::guess_csv()\n        ) {\n            CSVReader reader(filename, format);\n            this->init_from_reader(reader, options);\n        }\n\n        /**\n         * Construct a keyed DataFrame using a column name as the key.\n         * \n         * @param reader CSV reader to consume\n         * @param _key_column Name of the column to use as the key\n         * @param policy How to handle duplicate keys (default: OVERWRITE)\n         * @param throw_on_missing_key Whether to throw if a key value cannot be parsed (default: true)\n         * @throws std::runtime_error if key column is empty or not found\n         */\n        DataFrame(\n            CSVReader& reader,\n            const std::string& _key_column,\n            DuplicateKeyPolicy policy = DuplicateKeyPolicy::OVERWRITE,\n            bool throw_on_missing_key = true\n        ) : DataFrame(\n            reader,\n            DataFrameOptions()\n                .set_key_column(_key_column)\n                .set_duplicate_key_policy(policy)\n                .set_throw_on_missing_key(throw_on_missing_key)\n        ) {}\n\n        /**\n         * Construct a keyed DataFrame using a custom key function.\n         * \n         * @param reader CSV reader to consume\n         * @param key_func Function that extracts a key from each row\n         * @param policy How to handle duplicate keys (default: OVERWRITE)\n         * @throws std::runtime_error if policy is THROW and duplicate keys are encountered\n         */\n        template<\n            typename KeyFunc,\n            typename ResultType = invoke_result_t<KeyFunc, const CSVRow&>,\n            csv::enable_if_t<std::is_convertible<ResultType, KeyType>::value, int> = 0\n        >\n        DataFrame(\n            CSVReader& reader,\n            KeyFunc key_func,\n            DuplicateKeyPolicy policy = DuplicateKeyPolicy::OVERWRITE\n        ) : col_names_(reader.get_col_names()) {\n            this->is_keyed = true;\n            this->build_from_key_function(reader, key_func, policy);\n        }\n\n        /**\n         * Construct a keyed DataFrame using a custom key function with options.\n         * \n         * @param reader CSV reader to consume\n         * @param key_func Function that extracts a key from each row\n         * @param options Configuration for duplicate key policy\n         */\n        template<\n            typename KeyFunc,\n            typename ResultType = invoke_result_t<KeyFunc, const CSVRow&>,\n            csv::enable_if_t<std::is_convertible<ResultType, KeyType>::value, int> = 0\n        >\n        DataFrame(\n            CSVReader& reader,\n            KeyFunc key_func,\n            const DataFrameOptions& options\n        ) : DataFrame(reader, key_func, options.get_duplicate_key_policy()) {}\n\n        /** Get the number of rows in the DataFrame. */\n        size_t size() const noexcept {\n            return rows.size();\n        }\n\n        /** Check if the DataFrame is empty (has no rows). */\n        bool empty() const noexcept {\n            return rows.empty();\n        }\n\n        /** Get the number of rows in the DataFrame. Alias for size(). */\n        size_t n_rows() const noexcept { return rows.size(); }\n        \n        /** Get the number of columns in the DataFrame. */\n        size_t n_cols() const noexcept { return col_names_.size(); }\n\n        /**\n         * Check if a column exists in the DataFrame.\n         * \n         * @param name Column name to check\n         * @return true if the column exists, false otherwise\n         */\n        bool has_column(const std::string& name) const {\n            return std::find(col_names_.begin(), col_names_.end(), name) != col_names_.end();\n        }\n\n        /**\n         * Get the index of a column by name.\n         * \n         * @param name Column name to find\n         * @return Column index (0-based) or CSV_NOT_FOUND if not found\n         */\n        int index_of(const std::string& name) const {\n            auto it = std::find(col_names_.begin(), col_names_.end(), name);\n            if (it == col_names_.end())\n                return CSV_NOT_FOUND;\n            return static_cast<int>(std::distance(col_names_.begin(), it));\n        }\n\n        /** Get the column names in order. */\n        const std::vector<std::string>& columns() const noexcept {\n            return col_names_;\n        }\n\n        /** Get the name of the key column (empty string if unkeyed). */\n        const std::string& key_name() const noexcept {\n            return key_column;\n        }\n\n        /**\n         * Access a row by position (unchecked).\n         *\n         * @note Disabled when KeyType is an integral type to prevent ambiguity with\n         *       operator[](const KeyType&). Use iloc() for positional access on\n         *       integer-keyed DataFrames.\n         *\n         * @param i Row index (0-based)\n         * @return DataFrameRow proxy with edit support\n         * @throws std::out_of_range if index is out of bounds (via std::vector::at)\n         */\n        template<typename K = KeyType,\n            csv::enable_if_t<!std::is_integral<K>::value, int> = 0>\n        DataFrameRow<KeyType> operator[](size_t i) {\n            static_assert(std::is_same<K, KeyType>::value,\n                \"Do not explicitly instantiate this template. Use iloc() for positional access.\");\n            return this->iloc(i);\n        }\n\n        /** Access a row by position (unchecked, const version).\n         *  Disabled when KeyType is an integral type — use iloc() instead. */\n        template<typename K = KeyType,\n            csv::enable_if_t<!std::is_integral<K>::value, int> = 0>\n        DataFrameRow<KeyType> operator[](size_t i) const {\n            static_assert(std::is_same<K, KeyType>::value,\n                \"Do not explicitly instantiate this template. Use iloc() for positional access.\");\n            return this->iloc(i);\n        }\n\n        /**\n         * Access a row by position with bounds checking.\n         * \n         * @param i Row index (0-based)\n         * @return DataFrameRow proxy with edit support\n         * @throws std::out_of_range if index is out of bounds\n         */\n        DataFrameRow<KeyType> at(size_t i) {\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows.at(i).first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            return DataFrameRow<KeyType>(&rows.at(i).second, row_edits, &rows.at(i).first);\n        }\n        \n        /** Access a row by position with bounds checking (const version). */\n        DataFrameRow<KeyType> at(size_t i) const {\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows.at(i).first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            return DataFrameRow<KeyType>(&rows.at(i).second, row_edits, &rows.at(i).first);\n        }\n\n        /**\n         * Access a row by its key.\n         * \n         * @param key The row key to look up\n         * @return DataFrameRow proxy with edit support\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if the key is not found\n         */\n        DataFrameRow<KeyType> operator[](const KeyType& key) {\n            this->require_keyed_frame();\n            auto position = this->position_of(key);\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto it = edits.find(key);\n            if (it != edits.end()) row_edits = &it->second;\n            return DataFrameRow<KeyType>(&rows[position].second, row_edits, &rows[position].first);\n        }\n\n        /** Access a row by its key (const version). */\n        DataFrameRow<KeyType> operator[](const KeyType& key) const {\n            this->require_keyed_frame();\n            auto position = this->position_of(key);\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto it = edits.find(key);\n            if (it != edits.end()) row_edits = &it->second;\n            return DataFrameRow<KeyType>(&rows[position].second, row_edits, &rows[position].first);\n        }\n\n        /**\n         * Access a row by position (iloc-style, pandas naming).\n         * \n         * @param i Row index (0-based)\n         * @return DataFrameRow proxy with edit support\n         * @throws std::out_of_range if index is out of bounds\n         */\n        DataFrameRow<KeyType> iloc(size_t i) {\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows.at(i).first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            return DataFrameRow<KeyType>(&rows.at(i).second, row_edits, &rows.at(i).first);\n        }\n\n        /** Access a row by position (const version). */\n        DataFrameRow<KeyType> iloc(size_t i) const {\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows.at(i).first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            return DataFrameRow<KeyType>(&rows.at(i).second, row_edits, &rows.at(i).first);\n        }\n\n        /**\n         * Attempt to access a row by position without throwing.\n         * \n         * @param i Row index (0-based)\n         * @param out Output parameter that receives the DataFrameRow if found\n         * @return true if the row exists, false otherwise\n         */\n        bool try_get(size_t i, DataFrameRow<KeyType>& out) {\n            if (i >= rows.size()) {\n                return false;\n            }\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows[i].first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            out = DataFrameRow<KeyType>(&rows[i].second, row_edits, &rows[i].first);\n            return true;\n        }\n\n        /** Attempt to access a row by position without throwing (const version). */\n        bool try_get(size_t i, DataFrameRow<KeyType>& out) const {\n            if (i >= rows.size()) {\n                return false;\n            }\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            if (is_keyed) {\n                auto it = edits.find(rows[i].first);\n                if (it != edits.end()) row_edits = &it->second;\n            }\n            out = DataFrameRow<KeyType>(&rows[i].second, row_edits, &rows[i].first);\n            return true;\n        }\n\n        /**\n         * Get the key for a row at a given position.\n         * \n         * @param i Row index (0-based)\n         * @return Reference to the key\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if index is out of bounds\n         */\n        const KeyType& key_at(size_t i) const {\n            this->require_keyed_frame();\n            return rows.at(i).first;\n        }\n\n        /**\n         * Check if a key exists in the DataFrame.\n         * \n         * @param key The key to check\n         * @return true if the key exists, false otherwise\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         */\n        bool contains(const KeyType& key) const {\n            this->require_keyed_frame();\n            this->ensure_key_index();\n            return key_index->find(key) != key_index->end();\n        }\n\n        /**\n         * Access a row by its key with bounds checking.\n         * \n         * @param key The row key to look up\n         * @return DataFrameRow proxy with edit support\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if the key is not found\n         */\n        DataFrameRow<KeyType> at(const KeyType& key) {\n            this->require_keyed_frame();\n            auto position = this->position_of(key);\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto it = edits.find(key);\n            if (it != edits.end()) row_edits = &it->second;\n            return DataFrameRow<KeyType>(&rows.at(position).second, row_edits, &rows.at(position).first);\n        }\n\n        /** Access a row by its key with bounds checking (const version). */\n        DataFrameRow<KeyType> at(const KeyType& key) const {\n            this->require_keyed_frame();\n            auto position = this->position_of(key);\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto it = edits.find(key);\n            if (it != edits.end()) row_edits = &it->second;\n            return DataFrameRow<KeyType>(&rows.at(position).second, row_edits, &rows.at(position).first);\n        }\n\n        /**\n         * Attempt to access a row by key without throwing.\n         * \n         * @param key The row key to look up\n         * @param out Output parameter that receives the DataFrameRow if found\n         * @return true if the key exists, false otherwise\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         */\n        bool try_get(const KeyType& key, DataFrameRow<KeyType>& out) {\n            this->require_keyed_frame();\n            this->ensure_key_index();\n            auto it = key_index->find(key);\n            if (it == key_index->end()) {\n                return false;\n            }\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto edit_it = edits.find(key);\n            if (edit_it != edits.end()) row_edits = &edit_it->second;\n            out = DataFrameRow<KeyType>(&rows[it->second].second, row_edits, &rows[it->second].first);\n            return true;\n        }\n\n        /** Attempt to access a row by key without throwing (const version). */\n        bool try_get(const KeyType& key, DataFrameRow<KeyType>& out) const {\n            this->require_keyed_frame();\n            this->ensure_key_index();\n            auto it = key_index->find(key);\n            if (it == key_index->end()) {\n                return false;\n            }\n            const std::unordered_map<size_t, std::string>* row_edits = nullptr;\n            auto edit_it = edits.find(key);\n            if (edit_it != edits.end()) row_edits = &edit_it->second;\n            out = DataFrameRow<KeyType>(&rows[it->second].second, row_edits, &rows[it->second].first);\n            return true;\n        }\n\n        /**\n         * Get a cell value as a string, accounting for edits.\n         * \n         * @param key The row key\n         * @param column The column name\n         * @return Cell value as a string (edited value if present, otherwise original)\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if the key is not found\n         */\n        std::string get(const KeyType& key, const std::string& column) const {\n            this->require_keyed_frame();\n\n            auto col_names = (*this)[key].get_col_names();\n            auto col_it = std::find(col_names.begin(), col_names.end(), column);\n            if (col_it == col_names.end()) {\n                throw std::out_of_range(\"Column '\" + column + \"' not found\");\n            }\n            size_t col_idx = std::distance(col_names.begin(), col_it);\n\n            auto row_edits = this->edits.find(key);\n            if (row_edits != this->edits.end()) {\n                auto value = row_edits->second.find(col_idx);\n                if (value != row_edits->second.end()) {\n                    return value->second;\n                }\n            }\n\n            return (*this)[key][column].template get<std::string>();\n        }\n\n        /**\n         * Set a cell value (stored in edit overlay).\n         * \n         * @param key The row key\n         * @param column The column name\n         * @param value The new value as a string\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if the key is not found\n         */\n        void set(const KeyType& key, const std::string& column, const std::string& value) {\n            this->require_keyed_frame();\n            size_t row_idx = this->position_of(key);\n            \n            // Find column index\n            auto col_names = rows[row_idx].second.get_col_names();\n            auto it = std::find(col_names.begin(), col_names.end(), column);\n            if (it == col_names.end()) {\n                throw std::out_of_range(\"Column '\" + column + \"' not found\");\n            }\n            size_t col_idx = std::distance(col_names.begin(), it);\n            \n            edits[key][col_idx] = value;\n        }\n\n        /**\n         * Remove a row by its key.\n         * \n         * @param key The row key to remove\n         * @return true if the row was removed, false if not found\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         */\n        bool erase_row(const KeyType& key) {\n            this->require_keyed_frame();\n            this->ensure_key_index();\n\n            auto it = key_index->find(key);\n            if (it == key_index->end()) {\n                return false;\n            }\n\n            rows.erase(rows.begin() + it->second);\n            edits.erase(key);\n            this->invalidate_key_index();\n            return true;\n        }\n\n        /**\n         * Remove a row by its position.\n         * \n         * @param i Row index (0-based)\n         * @return true if the row was removed, false if index out of bounds\n         */\n        bool erase_row_at(size_t i) {\n            if (i >= rows.size()) return false;\n            if (is_keyed) edits.erase(rows[i].first);\n\n            rows.erase(rows.begin() + i);\n            this->invalidate_key_index();\n            return true;\n        }\n\n        /**\n         * Set a cell value by position (stored in edit overlay).\n         * \n         * @param i Row index (0-based)\n         * @param column The column name\n         * @param value The new value as a string\n         * @throws std::runtime_error if the DataFrame was not created with a key column\n         * @throws std::out_of_range if index is out of bounds\n         */\n        void set_at(size_t i, const std::string& column, const std::string& value) {\n            if (!is_keyed) {\n                throw std::runtime_error(\"This DataFrame was created without a key column.\");\n            }\n            if (i >= rows.size()) {\n                throw std::out_of_range(\"Row index out of bounds.\");\n            }\n            \n            // Find column index\n            auto col_names = rows[i].second.get_col_names();\n            auto it = std::find(col_names.begin(), col_names.end(), column);\n            if (it == col_names.end()) {\n                throw std::out_of_range(\"Column '\" + column + \"' not found\");\n            }\n            size_t col_idx = std::distance(col_names.begin(), it);\n            \n            edits[rows[i].first][col_idx] = value;\n        }\n\n        /**\n         * Extract all values from a column with type conversion.\n         * Accounts for edited values in the overlay.\n         * \n         * @tparam T Target type for conversion (default: std::string)\n         * @param name Column name\n         * @return Vector of values converted to type T\n         * @throws std::runtime_error if column is not found\n         */\n        template<typename T = std::string>\n        std::vector<T> column(const std::string& name) const {\n            auto col_it = std::find(col_names_.begin(), col_names_.end(), name);\n            if (col_it == col_names_.end()) {\n                throw std::runtime_error(\"Column not found: \" + name);\n            }\n            size_t col_idx = std::distance(col_names_.begin(), col_it);\n\n            std::vector<T> values;\n            values.reserve(rows.size());\n\n            for (const auto& entry : rows) {\n                auto row_edits = this->edits.find(entry.first);\n                if (row_edits != this->edits.end()) {\n                    auto value = row_edits->second.find(col_idx);\n                    if (value != row_edits->second.end()) {\n                        // Reuse CSVField parsing/validation on edited string values.\n                        CSVField edited_field(csv::string_view(value->second));\n                        values.push_back(edited_field.template get<T>());\n                        continue;\n                    }\n                }\n\n                values.push_back(entry.second[name].template get<T>());\n            }\n\n            return values;\n        }\n\n        /**\n         * Group row positions using an arbitrary grouping function.\n         * \n         * @tparam GroupFunc Callable that takes a CSVRow and returns a hashable key\n         * @param group_func Function to extract group key from each row\n         * @return Map of group key -> vector of row indices belonging to that group\n         */\n        template<\n            typename GroupFunc,\n            typename GroupKey = invoke_result_t<GroupFunc, const CSVRow&>,\n            csv::enable_if_t<\n                internals::is_hashable<GroupKey>::value &&\n                internals::is_equality_comparable<GroupKey>::value,\n                int\n            > = 0\n        >\n        std::unordered_map<GroupKey, std::vector<size_t>> group_by(GroupFunc group_func) const {\n            std::unordered_map<GroupKey, std::vector<size_t>> grouped;\n\n            for (size_t i = 0; i < rows.size(); i++) {\n                GroupKey group_key = group_func(rows[i].second);\n                grouped[group_key].push_back(i);\n            }\n\n            return grouped;\n        }\n\n        /**\n         * Group row positions by the value of a column.\n         * \n         * @param name Column to group by\n         * @param use_edits If true, use edited values when present (default: true)\n         * @return Map of column value -> vector of row indices with that value\n         * @throws std::runtime_error if column is not found\n         */\n        std::unordered_map<std::string, std::vector<size_t>> group_by(\n            const std::string& name,\n            bool use_edits = true\n        ) const {\n            auto col_it = std::find(col_names_.begin(), col_names_.end(), name);\n            if (col_it == col_names_.end()) {\n                throw std::runtime_error(\"Column not found: \" + name);\n            }\n            size_t col_idx = std::distance(col_names_.begin(), col_it);\n\n            std::unordered_map<std::string, std::vector<size_t>> grouped;\n\n            for (size_t i = 0; i < rows.size(); i++) {\n                std::string group_key;\n                bool has_group_key = false;\n\n                if (use_edits) {\n                    auto row_edits = this->edits.find(rows[i].first);\n                    if (row_edits != this->edits.end()) {\n                        auto edited_value = row_edits->second.find(col_idx);\n                        if (edited_value != row_edits->second.end()) {\n                            group_key = edited_value->second;\n                            has_group_key = true;\n                        }\n                    }\n                }\n\n                if (!has_group_key) {\n                    group_key = rows[i].second[name].template get<std::string>();\n                }\n\n                grouped[group_key].push_back(i);\n            }\n\n            return grouped;\n        }\n\n        /** Get iterator to the first row. */\n        iterator begin() { return iterator(rows.begin(), is_keyed ? &edits : nullptr); }\n        \n        /** Get iterator past the last row. */\n        iterator end() { return iterator(rows.end(), is_keyed ? &edits : nullptr); }\n        \n        /** Get const iterator to the first row. */\n        const_iterator begin() const { return const_iterator(rows.begin(), is_keyed ? &edits : nullptr); }\n        \n        /** Get const iterator past the last row. */\n        const_iterator end() const { return const_iterator(rows.end(), is_keyed ? &edits : nullptr); }\n        \n        /** Get const iterator to the first row (explicit). */\n        const_iterator cbegin() const { return const_iterator(rows.begin(), is_keyed ? &edits : nullptr); }\n        \n        /** Get const iterator past the last row (explicit). */\n        const_iterator cend() const { return const_iterator(rows.end(), is_keyed ? &edits : nullptr); }\n\n    private:\n        /** Name of the key column (empty if unkeyed). */\n        std::string key_column;\n        \n        /** Whether this DataFrame was created with a key. */\n        bool is_keyed = false;\n        \n        /** Column names in order. */\n        std::vector<std::string> col_names_;\n        \n        /** Internal storage: vector of (key, row) pairs. */\n        std::vector<row_entry> rows;\n\n        /** Lazily-built index mapping keys to row positions (mutable for const methods). */\n        mutable std::unique_ptr<std::unordered_map<KeyType, size_t>> key_index;\n\n        /**\n         * Edit overlay: key -> column -> value.\n         * Sparse storage for cell modifications without mutating original row data.\n         */\n        std::unordered_map<KeyType, std::unordered_map<size_t, std::string>> edits;\n\n        /** Initialize an unkeyed DataFrame from a CSV reader. */\n        void init_unkeyed_from_reader(CSVReader& reader) {\n            this->col_names_ = reader.get_col_names();\n            for (auto& row : reader) {\n                rows.push_back(row_entry{KeyType(), row});\n            }\n        }\n\n        /** Initialize a keyed DataFrame from a CSV reader using column-based key extraction. */\n        void init_from_reader(CSVReader& reader, const DataFrameOptions& options) {\n            this->is_keyed = true;\n            this->key_column = options.get_key_column();\n            this->col_names_ = reader.get_col_names();\n\n            if (key_column.empty()) {\n                throw std::runtime_error(\"Key column cannot be empty.\");\n            }\n\n            if (std::find(col_names_.begin(), col_names_.end(), key_column) == col_names_.end()) {\n                throw std::runtime_error(\"Key column not found: \" + key_column);\n            }\n\n            const bool throw_on_missing_key = options.get_throw_on_missing_key();\n\n            this->build_from_key_function(\n                reader,\n                [this, throw_on_missing_key](const CSVRow& row) -> KeyType {\n                    try {\n                        return row[this->key_column].template get<KeyType>();\n                    }\n                    catch (const std::exception& e) {\n                        if (throw_on_missing_key) {\n                            throw std::runtime_error(\"Error retrieving key column value: \" + std::string(e.what()));\n                        }\n\n                        return KeyType();\n                    }\n                },\n                options.get_duplicate_key_policy()\n            );\n        }\n\n        /** Build keyed DataFrame using a custom key extraction function. */\n        template<typename KeyFunc>\n        void build_from_key_function(\n            CSVReader& reader,\n            KeyFunc key_func,\n            DuplicateKeyPolicy policy\n        ) {\n            std::unordered_map<KeyType, size_t> key_to_pos;\n\n            for (auto& row : reader) {\n                KeyType key = key_func(row);\n\n                auto existing = key_to_pos.find(key);\n                if (existing != key_to_pos.end()) {\n                    if (policy == DuplicateKeyPolicy::THROW) {\n                        throw std::runtime_error(\"Duplicate key encountered.\");\n                    }\n\n                    if (policy == DuplicateKeyPolicy::OVERWRITE) {\n                        rows[existing->second].second = row;\n                    }\n\n                    continue;\n                }\n\n                rows.push_back(row_entry{key, row});\n                key_to_pos[key] = rows.size() - 1;\n            }\n        }\n\n        /** Validate that this DataFrame was created with a key column. */\n        void require_keyed_frame() const {\n            if (!is_keyed) {\n                throw std::runtime_error(\"This DataFrame was created without a key column.\");\n            }\n        }\n\n        /** Invalidate the lazy key index after structural changes. */\n        void invalidate_key_index() {\n            key_index.reset();\n        }\n\n        /** Build the key index if it doesn't exist (lazy initialization). */\n        void ensure_key_index() const {\n            if (key_index) {\n                return;\n            }\n\n            key_index = std::unique_ptr<std::unordered_map<KeyType, size_t>>(\n                new std::unordered_map<KeyType, size_t>()\n            );\n\n            for (size_t i = 0; i < rows.size(); i++) {\n                (*key_index)[rows[i].first] = i;\n            }\n        }\n\n        /** Find the position of a key in the rows vector. */\n        size_t position_of(const KeyType& key) const {\n            this->ensure_key_index();\n            auto it = key_index->find(key);\n            if (it == key_index->end()) {\n                throw std::out_of_range(\"Key not found.\");\n            }\n\n            return it->second;\n        }\n    };\n}\n/** @file\n *  Calculates statistics from CSV files\n */\n\n#include <unordered_map>\n#include <sstream>\n#include <vector>\n\nnamespace csv {\n    /** Class for calculating statistics from CSV files and in-memory sources\n     *\n     *  **Example**\n     *  \\include programs/csv_stats.cpp\n     *\n     */\n    class CSVStat {\n    public:\n        using FreqCount = std::unordered_map<std::string, size_t>;\n        using TypeCount = std::unordered_map<DataType, size_t>;\n\n        std::vector<long double> get_mean() const;\n        std::vector<long double> get_variance() const;\n        std::vector<long double> get_mins() const;\n        std::vector<long double> get_maxes() const;\n        std::vector<FreqCount> get_counts() const;\n        std::vector<TypeCount> get_dtypes() const;\n\n        std::vector<std::string> get_col_names() const {\n            return this->reader.get_col_names();\n        }\n\n        CSVStat(csv::string_view filename, CSVFormat format = CSVFormat::guess_csv());\n        CSVStat(std::stringstream& source, CSVFormat format = CSVFormat());\n    private:\n        // An array of rolling averages\n        // Each index corresponds to the rolling mean for the column at said index\n        std::vector<long double> rolling_means;\n        std::vector<long double> rolling_vars;\n        std::vector<long double> mins;\n        std::vector<long double> maxes;\n        std::vector<FreqCount> counts;\n        std::vector<TypeCount> dtypes;\n        std::vector<long double> n;\n\n        // Statistic calculators\n        void variance(const long double&, const size_t&);\n        void count(CSVField&, const size_t&);\n        void min_max(const long double&, const size_t&);\n        void dtype(CSVField&, const size_t&);\n\n        void calc();\n        void calc_chunk();\n        void calc_worker(const size_t&);\n\n        CSVReader reader;\n        std::deque<CSVRow> records = {};\n    };\n}\n\n#include <algorithm>\n#include <cstring>\n#include <istream>\n\n\nnamespace csv {\n    namespace internals {\n        /**\n         * streambuf adapter over csv::string_view with no data copy.\n         *\n         * The underlying memory must remain valid and immutable for the entire\n         * lifetime of this stream object.\n         */\n        class StringViewStreamBuf : public std::streambuf {\n        public:\n            explicit StringViewStreamBuf(csv::string_view view) {\n                char* begin = const_cast<char*>(view.data());\n                char* end = begin + view.size();\n                this->setg(begin, begin, end);\n            }\n\n        protected:\n            std::streamsize xsgetn(char* s, std::streamsize count) override {\n                const std::streamsize avail = this->egptr() - this->gptr();\n                const std::streamsize n = std::min(avail, count);\n                if (n > 0) {\n                    std::memcpy(s, this->gptr(), static_cast<size_t>(n));\n                    this->gbump(static_cast<int>(n));\n                }\n                return n;\n            }\n\n            pos_type seekoff(off_type off, std::ios_base::seekdir dir,\n                std::ios_base::openmode which = std::ios_base::in) override {\n                if (!(which & std::ios_base::in)) {\n                    return pos_type(off_type(-1));\n                }\n\n                const auto begin = this->eback();\n                const auto curr = this->gptr();\n                const auto end = this->egptr();\n\n                off_type base = 0;\n                if (dir == std::ios_base::beg) {\n                    base = 0;\n                }\n                else if (dir == std::ios_base::cur) {\n                    base = static_cast<off_type>(curr - begin);\n                }\n                else if (dir == std::ios_base::end) {\n                    base = static_cast<off_type>(end - begin);\n                }\n                else {\n                    return pos_type(off_type(-1));\n                }\n\n                const off_type next = base + off;\n                const off_type size = static_cast<off_type>(end - begin);\n                if (next < 0 || next > size) {\n                    return pos_type(off_type(-1));\n                }\n\n                this->setg(begin, begin + next, end);\n                return pos_type(next);\n            }\n\n            pos_type seekpos(pos_type pos,\n                std::ios_base::openmode which = std::ios_base::in) override {\n                return this->seekoff(off_type(pos), std::ios_base::beg, which);\n            }\n        };\n\n        /**\n         * Lightweight istream over csv::string_view with zero copy.\n         *\n         * WARNING: The caller is responsible for ensuring the backing memory\n         * outlives this stream and any CSVReader parsing it.\n         */\n        class StringViewStream : public std::istream {\n        public:\n            explicit StringViewStream(csv::string_view view)\n                : std::istream(nullptr), _buf(view) {\n                this->rdbuf(&_buf);\n            }\n\n            StringViewStream(const StringViewStream&) = delete;\n            StringViewStream(StringViewStream&&) = delete;\n            StringViewStream& operator=(const StringViewStream&) = delete;\n            StringViewStream& operator=(StringViewStream&&) = delete;\n\n        private:\n            StringViewStreamBuf _buf;\n        };\n    }\n}\n\n\n#include <string>\n#include <type_traits>\n#include <unordered_map>\n\nnamespace csv {\n    /** Returned by get_file_info() */\n    struct CSVFileInfo {\n        std::string filename;               /**< Filename */\n        std::vector<std::string> col_names; /**< CSV column names */\n        char delim;                         /**< Delimiting character */\n        size_t n_rows;                      /**< Number of rows in a file */\n        size_t n_cols;                      /**< Number of columns in a CSV */\n    };\n\n    /** @name Shorthand Parsing Functions\n     *  @brief Convenience functions for parsing small strings\n     */\n     ///@{\n    CSVReader operator \"\"_csv(const char*, size_t);\n    CSVReader operator \"\"_csv_no_header(const char*, size_t);\n\n    /** Parse CSV from a string view, copying the input into an owned buffer.\n     *\n     *  Safe for any string_view regardless of the caller's ownership of the\n     *  underlying memory.\n     */\n    CSVReader parse(csv::string_view in, CSVFormat format = CSVFormat::guess_csv());\n\n    /** Parse CSV from an in-memory view with zero copy.\n     *\n     *  WARNING: Non-owning path. The caller must ensure `in`'s backing memory\n     *  remains valid and immutable while the reader may request additional rows\n     *  from the source stream.\n     *\n     *  Already materialized CSVRows remain safe because parsed chunk data is\n     *  owned by RawCSVData, so make sure you grab all the CSVRows you need\n     *  before the underlying string is destroyed.\n     */\n    CSVReader parse_unsafe(csv::string_view in, CSVFormat format = CSVFormat::guess_csv());\n\n    CSVReader parse_no_header(csv::string_view in);\n    ///@}\n\n    /** @name Utility Functions */\n    ///@{\n    std::unordered_map<std::string, DataType> csv_data_types(const std::string&);\n    CSVFileInfo get_file_info(const std::string& filename);\n    int get_col_pos(csv::string_view filename, csv::string_view col_name,\n        const CSVFormat& format = CSVFormat::guess_csv());\n    ///@}\n}\n/** @file\n  *  A standalone header file for writing delimiter-separated files\n  */\n\n#include <fstream>\n#include <iostream>\n#include <memory>\n#ifdef CSV_HAS_CXX20\n    #include <ranges>\n#endif\n#include <stdexcept>\n#include <string>\n#include <tuple>\n#include <type_traits>\n#include <vector>\n\n\nnamespace csv {\n    namespace internals {\n        static int DECIMAL_PLACES = 5;\n\n        /**\n         * Calculate the absolute value of a number\n         */\n        template<typename T = int>\n        inline T csv_abs(T x) {\n            return abs(x);\n        }\n\n        template<>\n        inline int csv_abs(int x) {\n            return abs(x);\n        }\n\n        template<>\n        inline long int csv_abs(long int x) {\n            return labs(x);\n        }\n\n        template<>\n        inline long long int csv_abs(long long int x) {\n            return llabs(x);\n        }\n\n        template<>\n        inline float csv_abs(float x) {\n            return fabsf(x);\n        }\n\n        template<>\n        inline double csv_abs(double x) {\n            return fabs(x);\n        }\n\n        template<>\n        inline long double csv_abs(long double x) {\n            return fabsl(x);\n        }\n\n        /** \n         * Calculate the number of digits in a number\n         */\n        template<\n            typename T,\n            csv::enable_if_t<std::is_arithmetic<T>::value, int> = 0\n        >\n        int num_digits(T x)\n        {\n            x = csv_abs(x);\n\n            int digits = 0;\n\n            while (x >= 1) {\n                x /= 10;\n                digits++;\n            }\n\n            return digits;\n        }\n\n        /** to_string() for unsigned integers */\n        template<typename T,\n            csv::enable_if_t<std::is_unsigned<T>::value, int> = 0>\n        inline std::string to_string(T value) {\n            std::string digits_reverse = \"\";\n\n            if (value == 0) return \"0\";\n\n            while (value > 0) {\n                digits_reverse += (char)('0' + (value % 10));\n                value /= 10;\n            }\n\n            return std::string(digits_reverse.rbegin(), digits_reverse.rend());\n        }\n\n        /** to_string() for signed integers */\n        template<\n            typename T,\n            csv::enable_if_t<std::is_integral<T>::value && std::is_signed<T>::value, int> = 0\n        >\n        inline std::string to_string(T value) {\n            if (value >= 0)\n                return to_string((size_t)value);\n\n            return \"-\" + to_string((size_t)(value * -1));\n        }\n\n        /** to_string() for floating point numbers */\n        template<\n            typename T,\n            csv::enable_if_t<std::is_floating_point<T>::value, int> = 0\n        >\n            inline std::string to_string(T value) {\n#ifdef __clang__\n            return std::to_string(value);\n#else\n            // TODO: Figure out why the below code doesn't work on clang\n                std::string result = \"\";\n\n                T integral_part;\n                T fractional_part = std::abs(std::modf(value, &integral_part));\n                integral_part = std::abs(integral_part);\n\n                // Integral part\n                if (value < 0) result = \"-\";\n\n                if (integral_part == 0) {\n                    result += \"0\";\n                }\n                else {\n                    for (int n_digits = num_digits(integral_part); n_digits > 0; n_digits --) {\n                        int digit = (int)(std::fmod(integral_part, pow10(n_digits)) / pow10(n_digits - 1));\n                        result += (char)('0' + digit);\n                    }\n                }\n\n                // Decimal part\n                result += \".\";\n\n                if (fractional_part > 0) {\n                    fractional_part *= (T)(pow10(DECIMAL_PLACES));\n                    for (int n_digits = DECIMAL_PLACES; n_digits > 0; n_digits--) {\n                        int digit = (int)(std::fmod(fractional_part, pow10(n_digits)) / pow10(n_digits - 1));\n                        result += (char)('0' + digit);\n                    }\n                }\n                else {\n                    result += \"0\";\n                }\n\n                return result;\n#endif\n        }\n    }\n\n    /** Sets how many places after the decimal will be written for floating point numbers\n     *\n     *  @param  precision   Number of decimal places\n     */\n#ifndef __clang__\n    inline static void set_decimal_places(int precision) {\n        internals::DECIMAL_PLACES = precision;\n    }\n#endif\n\n    namespace internals {\n        /** SFINAE trait: detects if a type is iterable (has std::begin/end). */\n        template<typename T, typename = void>\n        struct is_iterable : std::false_type {};\n\n        template<typename T>\n        struct is_iterable<T, typename std::enable_if<true>::type> {\n        private:\n            template<typename U>\n            static auto test(int) -> decltype(\n                std::begin(std::declval<const U&>()),\n                std::end(std::declval<const U&>()),\n                std::true_type{}\n            );\n            template<typename>\n            static std::false_type test(...);\n        public:\n            static constexpr bool value = decltype(test<T>(0))::value;\n        };\n\n        /** SFINAE trait: detects if a type is a std::tuple. */\n        template<typename T, typename = void>\n        struct is_tuple : std::false_type {};\n\n        template<typename T>\n        struct is_tuple<T, typename std::enable_if<true>::type> {\n        private:\n            template<typename U>\n            static auto test(int) -> decltype(std::tuple_size<U>::value, std::true_type{});\n            template<typename>\n            static std::false_type test(...);\n        public:\n            static constexpr bool value = decltype(test<T>(0))::value;\n        };\n    }\n\n    /** @name CSV Writing */\n    ///@{\n    /** \n     *  Class for writing delimiter separated values files\n     *\n     *  To write formatted strings, one should\n     *   -# Initialize a DelimWriter with respect to some output stream \n     *   -# Call write_row() on std::vector<std::string>s of unformatted text\n     *\n     *  @tparam OutputStream The output stream, e.g. `std::ofstream`, `std::stringstream`\n     *  @tparam Delim        The delimiter character\n     *  @tparam Quote        The quote character\n     *  @tparam Flush        True: flush after every writing function,\n     *                       false: you need to flush explicitly if needed.\n     *                       In both cases the destructor will flush.\n     *\n     *  @par Hint\n     *  Use the aliases csv::CSVWriter<OutputStream> to write CSV\n     *  formatted strings and csv::TSVWriter<OutputStream>\n     *  to write tab separated strings\n     *\n     *  @par Example w/ std::vector, std::deque, std::list\n     *  @snippet test_write_csv.cpp CSV Writer Example\n     *\n     *  @par Example w/ std::tuple\n     *  @snippet test_write_csv.cpp CSV Writer Tuple Example\n     */\n    template<class OutputStream, char Delim, char Quote, bool Flush>\n    class DelimWriter {\n    public:\n        /** Construct a DelimWriter over the specified output stream\n         *\n         *  @param  _out           Stream to write to\n         *  @param  _quote_minimal Limit field quoting to only when necessary\n        */\n\n        DelimWriter(OutputStream& _out, bool _quote_minimal = true)\n            : out(&_out), quote_minimal(_quote_minimal) {}\n\n        /** Construct a DelimWriter over the file\n         *\n         *  @param[out] filename  File to write to\n         */\n        template<typename T = OutputStream,\n            csv::enable_if_t<std::is_same<T, std::ofstream>::value, int> = 0>\n        DelimWriter(const std::string& filename, bool _quote_minimal = true)\n            : owned_out(new std::ofstream(filename, std::ios::out)),\n            out(owned_out.get()),\n            quote_minimal(_quote_minimal) {\n            if (!owned_out->is_open())\n                throw std::runtime_error(\"Failed to open file for writing: \" + filename);\n        }\n\n        DelimWriter(const DelimWriter&) = delete;\n        DelimWriter& operator=(const DelimWriter&) = delete;\n\n        DelimWriter(DelimWriter&& other) noexcept\n            : owned_out(std::move(other.owned_out)),\n            out(other.out),\n            quote_minimal(other.quote_minimal) {\n            if (owned_out) {\n                out = owned_out.get();\n            }\n            other.out = nullptr;\n            other.quote_minimal = true;\n        }\n\n        DelimWriter& operator=(DelimWriter&& other) noexcept {\n            if (this == &other) return *this;\n\n            owned_out = std::move(other.owned_out);\n            out = other.out;\n            quote_minimal = other.quote_minimal;\n\n            if (owned_out) {\n                out = owned_out.get();\n            }\n\n            other.out = nullptr;\n            other.quote_minimal = true;\n            return *this;\n        }\n\n        /** Destructor will flush remaining data\n         *\n         */\n        ~DelimWriter() {\n            if (out) out->flush();\n        }\n\n        /** Write a C-style array of strings as one delimited row.\n         *\n         *  @tparam T      Element type (typically std::string or csv::string_view)\n         *  @tparam N      Array size (deduced)\n         *  @param record  Array of strings\n         *  @return        The current DelimWriter instance\n         */\n        template<typename T, size_t N>\n        DelimWriter& operator<<(const T (&record)[N]) {\n            write_range_impl(record);\n            return *this;\n        }\n\n        /** Write a std::array of strings as one delimited row.\n         *\n         *  @tparam T      Element type (typically std::string or csv::string_view)\n         *  @tparam N      Array size (deduced)\n         *  @param record  std::array of strings\n         *  @return        The current DelimWriter instance\n         */\n        template<typename T, size_t N>\n        DelimWriter& operator<<(const std::array<T, N>& record) {\n            write_range_impl(record);\n            return *this;\n        }\n\n        #ifdef CSV_HAS_CXX20\n        /** Write a range of string-like fields as one delimited row.\n         *\n         *  Accepts any input_range whose elements are convertible to csv::string_view.\n         *  This includes std::vector<std::string>, std::vector<csv::string_view>,\n         *  std::array, C++20 views, etc.\n         */\n        template<std::ranges::input_range Range>\n        DelimWriter& operator<<(Range&& container)\n            requires std::ranges::input_range<Range>\n                && std::convertible_to<std::ranges::range_reference_t<Range>, csv::string_view> {\n            write_range_impl(container);\n            return *this;\n        }\n        #else\n        /** Write a range of string-like fields as one delimited row.\n         *\n         *  Accepts any input_range whose elements are convertible to csv::string_view.\n         *  This includes std::vector<std::string>, std::vector<csv::string_view>,\n         *  std::array, C++20 views, etc.\n         */\n        template<typename Range>\n        typename std::enable_if<\n            internals::is_iterable<Range>::value \n            && !internals::is_tuple<Range>::value\n            && !std::is_same<Range, std::string>::value\n            && !std::is_same<Range, csv::string_view>::value,\n            DelimWriter&\n        >::type operator<<(const Range& record) {\n            write_range_impl(record);\n            return *this;\n        }\n#endif\n\n        /** @copydoc operator<< */\n        template<typename... T>\n        DelimWriter& operator<<(const std::tuple<T...>& record) {\n            this->write_tuple<0, T...>(record);\n            return *this;\n        }\n\n        /** Flushes the written data\n         *\n         */\n        void flush() {\n            out->flush();\n        }\n\n    private:\n        /** Helper to write a range of values, handling first element undelimited,\n         *  rest prefixed with delimiter. Inlines aggressively across both C++20 and\n         *  C++11 operator<< entry points.\n         */\n        template<typename Range>\n        inline void write_range_impl(const Range& record) {\n            auto it = std::begin(record);\n            auto end = std::end(record);\n\n            if (it != end) {\n                (*out) << csv_escape(*it);\n                ++it;\n            }\n\n            for (; it != end; ++it) {\n                (*out) << Delim << csv_escape(*it);\n            }\n\n            end_out();\n        }\n\n        template<\n            typename T,\n            csv::enable_if_t<\n                !std::is_convertible<T, std::string>::value\n                && !std::is_convertible<T, csv::string_view>::value\n            , int> = 0\n        >\n        std::string csv_escape(T in) {\n            return internals::to_string(in);\n        }\n\n        template<\n            typename T,\n            csv::enable_if_t<\n                std::is_convertible<T, std::string>::value\n                || std::is_convertible<T, csv::string_view>::value\n            , int> = 0\n        >\n        std::string csv_escape(T in) {\n            IF_CONSTEXPR(std::is_convertible<T, csv::string_view>::value) {\n                return _csv_escape(in);\n            }\n            else {\n                return _csv_escape(std::string(in));\n            }\n        }\n\n        std::string _csv_escape(csv::string_view in) {\n            /** Format a string to be RFC 4180-compliant\n             *  @param[in]  in              String to be CSV-formatted\n             *  @param[out] quote_minimal   Only quote fields if necessary.\n             *                              If False, everything is quoted.\n             */\n\n            // Do we need a quote escape\n            bool quote_escape = false;\n\n            for (auto ch : in) {\n                if (ch == Quote || ch == Delim || ch == '\\r' || ch == '\\n') {\n                    quote_escape = true;\n                    break;\n                }\n            }\n\n            if (!quote_escape) {\n                if (quote_minimal) return std::string(in);\n                else {\n                    std::string ret(1, Quote);\n                    ret += in.data();\n                    ret += Quote;\n                    return ret;\n                }\n            }\n\n            // Start initial quote escape sequence\n            std::string ret(1, Quote);\n            for (auto ch: in) {\n                if (ch == Quote) ret += std::string(2, Quote);\n                else ret += ch;\n            }\n\n            // Finish off quote escape\n            ret += Quote;\n            return ret;\n        }\n\n        /** Recurisve template for writing std::tuples */\n        template<size_t Index = 0, typename... T>\n        typename std::enable_if<Index < sizeof...(T), void>::type write_tuple(const std::tuple<T...>& record) {\n            (*out) << csv_escape(std::get<Index>(record));\n\n#ifdef _MSC_VER\n#pragma warning(push)\n#pragma warning(disable:4127)\n#endif\n            IF_CONSTEXPR (Index + 1 < sizeof...(T)) (*out) << Delim;\n#ifdef _MSC_VER\n#pragma warning(pop)\n#endif\n\n            this->write_tuple<Index + 1>(record);\n        }\n\n        /** Base case for writing std::tuples */\n        template<size_t Index = 0, typename... T>\n        typename std::enable_if<Index == sizeof...(T), void>::type write_tuple(const std::tuple<T...>& record) {\n            (void)record;\n            end_out();\n        }\n\n        /** Ends a line in 'out' and flushes, if Flush is true.*/\n        void end_out() {\n            (*out) << '\\n';\n            IF_CONSTEXPR(Flush) out->flush();\n        }\n\n        /**\n         * An owned output stream, if the writer owns it.\n         * May be null if the writer does not own its output stream, i.e.\n         * if it was initialized with an output stream reference instead of a filename.\n         */\n        std::unique_ptr<OutputStream> owned_out;\n\n        /** Pointer to the output stream (which may or may not be owned by this writer). */\n        OutputStream* out;\n\n        bool quote_minimal;\n    };\n\n    /** An alias for csv::DelimWriter for writing standard CSV files\n     *\n     *  @sa csv::DelimWriter::operator<<()\n     *\n     *  @note Use `csv::make_csv_writer()` to in instatiate this class over\n     *        an actual output stream.\n     */\n    template<class OutputStream, bool Flush = true>\n    using CSVWriter = DelimWriter<OutputStream, ',', '\"', Flush>;\n\n    /** Class for writing tab-separated values files\n    *\n     *  @sa csv::DelimWriter::write_row()\n     *  @sa csv::DelimWriter::operator<<()\n     *\n     *  @note Use `csv::make_tsv_writer()` to in instatiate this class over\n     *        an actual output stream.\n     */\n    template<class OutputStream, bool Flush = true>\n    using TSVWriter = DelimWriter<OutputStream, '\\t', '\"', Flush>;\n\n    /** Return a csv::CSVWriter over the output stream */\n    template<class OutputStream>\n    inline CSVWriter<OutputStream> make_csv_writer(OutputStream& out, bool quote_minimal=true) {\n        return CSVWriter<OutputStream>(out, quote_minimal);\n    }\n\n    /** Return a buffered csv::CSVWriter over the output stream (does not auto flush) */\n    template<class OutputStream>\n    inline CSVWriter<OutputStream, false> make_csv_writer_buffered(OutputStream& out, bool quote_minimal=true) {\n        return CSVWriter<OutputStream, false>(out, quote_minimal);\n    }\n\n    /** Return a csv::TSVWriter over the output stream */\n    template<class OutputStream>\n    inline TSVWriter<OutputStream> make_tsv_writer(OutputStream& out, bool quote_minimal=true) {\n        return TSVWriter<OutputStream>(out, quote_minimal);\n    }\n\n    /** Return a buffered csv::TSVWriter over the output stream (does not auto flush) */\n    template<class OutputStream>\n    inline TSVWriter<OutputStream, false> make_tsv_writer_buffered(OutputStream& out, bool quote_minimal=true) {\n        return TSVWriter<OutputStream, false>(out, quote_minimal);\n    }\n    ///@}\n}\n/** @file\n *  Fast CSVWriter overloads for CSVRow and DataFrame.\n */\n\n\n#ifdef CSV_HAS_CXX20\nnamespace csv {\n    template<class OutputStream, char Delim, char Quote, bool Flush>\n    DelimWriter<OutputStream, Delim, Quote, Flush>& operator<< \n        (DelimWriter<OutputStream, Delim, Quote, Flush>& writer, const CSVRow& row) {\n        return writer << row.to_sv_range();\n    }\n\n    /** Overload for writing a DataFrameRow (respects sparse overlay edits). */\n    template<class OutputStream, char Delim, char Quote, bool Flush, typename KeyType>\n    DelimWriter<OutputStream, Delim, Quote, Flush>& operator<< \n        (DelimWriter<OutputStream, Delim, Quote, Flush>& writer, const DataFrameRow<KeyType>& row) {\n        return writer << row.to_sv_range();\n    }\n}\n#endif\n\n/** @file\n *  Defines an object used to store CSV format settings\n */\n\n#include <algorithm>\n#include <set>\n\n\nnamespace csv {\n    CSV_INLINE CSVFormat& CSVFormat::delimiter(char delim) {\n        this->possible_delimiters = { delim };\n        this->assert_no_char_overlap();\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::delimiter(const std::vector<char> & delim) {\n        this->possible_delimiters = delim;\n        this->assert_no_char_overlap();\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::quote(char quote) {\n        this->no_quote = false;\n        this->quote_char = quote;\n        this->assert_no_char_overlap();\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::trim(const std::vector<char> & chars) {\n        this->trim_chars = chars;\n        this->assert_no_char_overlap();\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::column_names(const std::vector<std::string>& names) {\n        this->col_names = names;\n        this->header = -1;\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::header_row(int row) {\n        if (row < 0) this->variable_column_policy = VariableColumnPolicy::KEEP;\n\n        this->header = row;\n        this->col_names = {};\n        return *this;\n    }\n\n    CSV_INLINE CSVFormat& CSVFormat::chunk_size(size_t size) {\n        if (size < internals::ITERATION_CHUNK_SIZE) {\n            throw std::invalid_argument(\n                \"Chunk size must be at least \" +\n                std::to_string(internals::ITERATION_CHUNK_SIZE) +\n                \" bytes (10MB). Provided: \" + std::to_string(size)\n            );\n        }\n        this->_chunk_size = size;\n        return *this;\n    }\n\n    CSV_INLINE void CSVFormat::assert_no_char_overlap()\n    {\n        auto delims = std::set<char>(\n            this->possible_delimiters.begin(), this->possible_delimiters.end()),\n            trims = std::set<char>(\n                this->trim_chars.begin(), this->trim_chars.end());\n\n        // Stores intersection of possible delimiters and trim characters\n        std::vector<char> intersection = {};\n\n        // Find which characters overlap, if any\n        std::set_intersection(\n            delims.begin(), delims.end(),\n            trims.begin(), trims.end(),\n            std::back_inserter(intersection));\n\n        // Make sure quote character is not contained in possible delimiters\n        // or whitespace characters\n        if (delims.find(this->quote_char) != delims.end() ||\n            trims.find(this->quote_char) != trims.end()) {\n            intersection.push_back(this->quote_char);\n        }\n\n        if (!intersection.empty()) {\n            std::string err_msg = \"There should be no overlap between the quote character, \"\n                \"the set of possible delimiters \"\n                \"and the set of whitespace characters. Offending characters: \";\n\n            // Create a pretty error message with the list of overlapping\n            // characters\n            for (size_t i = 0; i < intersection.size(); i++) {\n                err_msg += \"'\";\n                err_msg += intersection[i];\n                err_msg += \"'\";\n\n                if (i + 1 < intersection.size())\n                    err_msg += \", \";\n            }\n\n            throw std::runtime_error(err_msg + '.');\n        }\n    }\n}\n/** @file\n *  Defines an input iterator for csv::CSVReader\n */\n\n\nnamespace csv {\n    /** Return an iterator to the first row in the reader */\n    CSV_INLINE CSVReader::iterator CSVReader::begin() {\n        CSVRow row;\n        if (!this->read_row(row)) {\n            return this->end();\n        }\n        return CSVReader::iterator(this, std::move(row));\n    }\n\n    /** A placeholder for the imaginary past the end row in a CSV.\n     *  Attempting to deference this will lead to bad things.\n     */\n    CSV_INLINE CSV_CONST CSVReader::iterator CSVReader::end() const noexcept {\n        return CSVReader::iterator();\n    }\n\n    CSV_INLINE CSVReader::iterator::iterator(CSVReader* _daddy, CSVRow&& _row) :\n        daddy(_daddy) {\n        row = std::move(_row);\n    }\n\n    /** Advance the iterator by one row. If this CSVReader has an\n     *  associated file, then the iterator will lazily pull more data from\n     *  that file until the end of file is reached.\n     *\n     *  @note This iterator does **not** block the thread responsible for parsing CSV.\n     *\n     */\n    CSV_INLINE CSVReader::iterator& CSVReader::iterator::operator++() {\n        if (!daddy->read_row(this->row)) {\n            this->daddy = nullptr; // this == end()\n        }\n\n        return *this;\n    }\n\n    /** Post-increment iterator */\n    CSV_INLINE CSVReader::iterator CSVReader::iterator::operator++(int) {\n        auto temp = *this;\n        if (!daddy->read_row(this->row)) {\n            this->daddy = nullptr; // this == end()\n        }\n\n        return temp;\n    }\n}\n\n/** @file\n *  Implements JSON serialization abilities\n */\n\n\nnamespace csv {\n    /*\n    The implementations for json_extra_space() and json_escape_string()\n    were modified from source code for JSON for Modern C++.\n\n    The respective license is below:\n\n    The code is licensed under the [MIT\n    License](http://opensource.org/licenses/MIT):\n    \n    Copyright &copy; 2013-2015 Niels Lohmann.\n    \n    Permission is hereby granted, free of charge, to any person\n    obtaining a copy of this software and associated documentation files\n    (the \"Software\"), to deal in the Software without restriction,\n    including without limitation the rights to use, copy, modify, merge,\n    publish, distribute, sublicense, and/or sell copies of the Software,\n    and to permit persons to whom the Software is furnished to do so,\n    subject to the following conditions:\n    \n    The above copyright notice and this permission notice shall be\n    included in all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n    EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n    NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\n    BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n    ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n    CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n    SOFTWARE.\n    */\n\n    namespace internals {\n        /*!\n         @brief calculates the extra space to escape a JSON string\n\n         @param[in] s  the string to escape\n         @return the number of characters required to escape string @a s\n\n         @complexity Linear in the length of string @a s.\n        */\n        static std::size_t json_extra_space(csv::string_view& s) noexcept\n        {\n            std::size_t result = 0;\n\n\n            for (const auto& c : s)\n            {\n                switch (c)\n                {\n                case '\"':\n                case '\\\\':\n                case '\\b':\n                case '\\f':\n                case '\\n':\n                case '\\r':\n                case '\\t':\n                {\n                    // from c (1 byte) to \\x (2 bytes)\n                    result += 1;\n                    break;\n                }\n\n\n                default:\n                {\n                    if (c >= 0x00 && c <= 0x1f)\n                    {\n                        // from c (1 byte) to \\uxxxx (6 bytes)\n                        result += 5;\n                    }\n                    break;\n                }\n                }\n            }\n\n\n            return result;\n        }\n\n        CSV_INLINE std::string json_escape_string(csv::string_view s) noexcept\n        {\n            const auto space = json_extra_space(s);\n            if (space == 0)\n            {\n                return std::string(s);\n            }\n\n            // create a result string of necessary size\n            size_t result_size = s.size() + space;\n            std::string result(result_size, '\\\\');\n            std::size_t pos = 0;\n\n            for (const auto& c : s)\n            {\n                switch (c)\n                {\n                // quotation mark (0x22)\n                case '\"':\n                {\n                    result[pos + 1] = '\"';\n                    pos += 2;\n                    break;\n                }\n\n\n                // reverse solidus (0x5c)\n                case '\\\\':\n                {\n                    // nothing to change\n                    pos += 2;\n                    break;\n                }\n\n\n                // backspace (0x08)\n                case '\\b':\n                {\n                    result[pos + 1] = 'b';\n                    pos += 2;\n                    break;\n                }\n\n\n                // formfeed (0x0c)\n                case '\\f':\n                {\n                    result[pos + 1] = 'f';\n                    pos += 2;\n                    break;\n                }\n\n\n                // newline (0x0a)\n                case '\\n':\n                {\n                    result[pos + 1] = 'n';\n                    pos += 2;\n                    break;\n                }\n\n\n                // carriage return (0x0d)\n                case '\\r':\n                {\n                    result[pos + 1] = 'r';\n                    pos += 2;\n                    break;\n                }\n\n\n                // horizontal tab (0x09)\n                case '\\t':\n                {\n                    result[pos + 1] = 't';\n                    pos += 2;\n                    break;\n                }\n\n\n                default:\n                {\n                    if (c >= 0x00 && c <= 0x1f)\n                    {\n                        // print character c as \\uxxxx\n                        snprintf(&result[pos + 1], result_size - pos - 1, \"u%04x\", int(c));\n                        pos += 6;\n                        // overwrite trailing null character\n                        result[pos] = '\\\\';\n                    }\n                    else\n                    {\n                        // all other characters are added as-is\n                        result[pos++] = c;\n                    }\n                    break;\n                }\n                }\n            }\n\n            return result;\n        }\n    }\n\n    /** Convert a CSV row to a JSON object, i.e.\n     *  `{\"col1\":\"value1\",\"col2\":\"value2\"}`\n     *\n     *  @note All strings are properly escaped. Numeric values are not quoted.\n     *  @param[in] subset A subset of columns to contain in the JSON.\n     *                    Leave empty for original columns.\n     */\n    CSV_INLINE std::string CSVRow::to_json(const std::vector<std::string>& subset) const {\n        std::vector<std::string> col_names = subset;\n        if (subset.empty()) {\n            col_names = this->data ? this->get_col_names() : std::vector<std::string>({});\n        }\n\n        const size_t _n_cols = col_names.size();\n        std::string ret = \"{\";\n        \n        for (size_t i = 0; i < _n_cols; i++) {\n            auto& col = col_names[i];\n            auto field = this->operator[](col);\n\n            // TODO: Possible performance enhancements by caching escaped column names\n            ret += '\"' + internals::json_escape_string(col) + \"\\\":\";\n\n            // Add quotes around strings but not numbers\n            if (field.is_num())\n                 ret += internals::json_escape_string(field.get<csv::string_view>());\n            else\n                ret += '\"' + internals::json_escape_string(field.get<csv::string_view>()) + '\"';\n\n            // Do not add comma after last string\n            if (i + 1 < _n_cols)\n                ret += ',';\n        }\n\n        ret += '}';\n        return ret;\n    }\n\n    /** Convert a CSV row to a JSON array, i.e.\n     *  `[\"value1\",\"value2\",...]`\n     *\n     *  @note All strings are properly escaped. Numeric values are not quoted.\n     *  @param[in] subset A subset of columns to contain in the JSON.\n     *                    Leave empty for all columns.\n     */\n    CSV_INLINE std::string CSVRow::to_json_array(const std::vector<std::string>& subset) const {\n        std::vector<std::string> col_names = subset;\n        if (subset.empty())\n            col_names = this->data ? this->get_col_names() : std::vector<std::string>({});\n\n        const size_t _n_cols = col_names.size();\n        std::string ret = \"[\";\n\n        for (size_t i = 0; i < _n_cols; i++) {\n            auto field = this->operator[](col_names[i]);\n\n            // Add quotes around strings but not numbers\n            if (field.is_num())\n                ret += internals::json_escape_string(field.get<csv::string_view>());\n            else\n                ret += '\"' + internals::json_escape_string(field.get<csv::string_view>()) + '\"';\n\n            // Do not add comma after last string\n            if (i + 1 < _n_cols)\n                ret += ',';\n        }\n\n        ret += ']';\n        return ret;\n    }\n}\n\n#include <sstream>\n#include <vector>\n#include <memory>\n\n\nnamespace csv {\n    /** Shorthand function for parsing an in-memory CSV string.\n     *\n     *  Copies the input into an owned stringstream, so the caller's backing\n     *  memory may be freed immediately after this call returns.\n     *\n     *  @return A collection of CSVRow objects\n     *\n     *  @par Example\n     *  @snippet tests/test_read_csv.cpp Parse Example\n     */\n    CSV_INLINE CSVReader parse(csv::string_view in, CSVFormat format) {\n        std::unique_ptr<std::istream> ss(new std::stringstream(std::string(in)));\n        return CSVReader(std::move(ss), format);\n    }\n\n    /** Parse CSV from an in-memory view with zero copy.\n     *\n     *  Creates a non-owning stream adapter over the provided string_view.\n     *  The caller is responsible for keeping backing memory valid and immutable\n     *  while CSVReader may request additional rows.\n     *\n     *  Already materialized CSVRows remain safe because parsed chunk data is\n     *  owned by RawCSVData.\n     *\n     *  @return A collection of CSVRow objects\n     */\n    CSV_INLINE CSVReader parse_unsafe(csv::string_view in, CSVFormat format) {\n        std::unique_ptr<std::istream> stream(new internals::StringViewStream(in));\n        return CSVReader(std::move(stream), format);\n    }\n\n    /** Parses a CSV string with no headers\n     *\n     *  @return A collection of CSVRow objects\n     */\n    CSV_INLINE CSVReader parse_no_header(csv::string_view in) {\n        CSVFormat format;\n        format.header_row(-1);\n\n        return parse(in, format);\n    }\n\n    /** Parse a RFC 4180 CSV string, returning a collection\n     *  of CSVRow objects.\n     *\n     *  String literals have static storage duration, so the zero-copy path is\n     *  safe here.\n     *\n     *  @par Example\n     *  @snippet tests/test_read_csv.cpp Escaped Comma\n     *\n     */\n    CSV_INLINE CSVReader operator \"\"_csv(const char* in, size_t n) {\n        return parse_unsafe(csv::string_view(in, n));\n    }\n\n    /** A shorthand for csv::parse_no_header().\n     *\n     *  String literals have static storage duration, so the zero-copy path is\n     *  safe here.\n     */\n    CSV_INLINE CSVReader operator \"\"_csv_no_header(const char* in, size_t n) {\n        CSVFormat format;\n        format.header_row(-1);\n        return parse_unsafe(csv::string_view(in, n), format);\n    }\n\n    /**\n     *  Find the position of a column in a CSV file or CSV_NOT_FOUND otherwise\n     *\n     *  @param[in] filename  Path to CSV file\n     *  @param[in] col_name  Column whose position we should resolve\n     *  @param[in] format    Format of the CSV file\n     */\n    CSV_INLINE int get_col_pos(\n        csv::string_view filename,\n        csv::string_view col_name,\n        const CSVFormat& format) {\n        CSVReader reader(filename, format);\n        return reader.index_of(col_name);\n    }\n\n    /** Get basic information about a CSV file\n     *  @include programs/csv_info.cpp\n     */\n    CSV_INLINE CSVFileInfo get_file_info(const std::string& filename) {\n        CSVReader reader(filename);\n        CSVFormat format = reader.get_format();\n        for (auto it = reader.begin(); it != reader.end(); ++it);\n\n        CSVFileInfo info = {\n            filename,\n            reader.get_col_names(),\n            format.get_delim(),\n            reader.n_rows(),\n            reader.get_col_names().size()\n        };\n\n        return info;\n    }\n}\n/** @file\n *  @brief Defines functionality needed for basic CSV parsing\n */\n\n\nnamespace csv {\n    namespace internals {\n        CSV_INLINE std::string format_row(const std::vector<std::string>& row, csv::string_view delim) {\n            /** Print a CSV row */\n            std::stringstream ret;\n            for (size_t i = 0; i < row.size(); i++) {\n                ret << row[i];\n                if (i + 1 < row.size()) ret << delim;\n                else ret << '\\n';\n            }\n            ret.flush();\n\n            return ret.str();\n        }\n\n        /** Return a CSV's column names\n         *\n         *  @param[in] filename  Path to CSV file\n         *  @param[in] format    Format of the CSV file\n         *\n         */\n        CSV_INLINE std::vector<std::string> _get_col_names(csv::string_view head, CSVFormat format) {\n            // Parse the CSV\n            auto trim_chars = format.get_trim_chars();\n            std::stringstream source(head.data());\n            RowCollection rows;\n\n            StreamParser<std::stringstream> parser(source, format);\n            parser.set_output(rows);\n            parser.next();\n\n            return CSVRow(std::move(rows[format.get_header()]));\n        }\n\n        CSV_INLINE GuessScore calculate_score(csv::string_view head, const CSVFormat& format) {\n            // Frequency counter of row length\n            std::unordered_map<size_t, size_t> row_tally = { { 0, 0 } };\n\n            // Map row lengths to row num where they first occurred\n            std::unordered_map<size_t, size_t> row_when = { { 0, 0 } };\n\n            // Parse the CSV\n            std::stringstream source(head.data());\n            RowCollection rows;\n\n            StreamParser<std::stringstream> parser(source, format);\n            parser.set_output(rows);\n            parser.next();\n\n            for (size_t i = 0; i < rows.size(); i++) {\n                auto& row = rows[i];\n\n                // Ignore zero-length rows\n                if (row.size() > 0) {\n                    if (row_tally.find(row.size()) != row_tally.end()) {\n                        row_tally[row.size()]++;\n                    }\n                    else {\n                        row_tally[row.size()] = 1;\n                        row_when[row.size()] = i;\n                    }\n                }\n            }\n\n            double final_score = 0;\n            size_t header_row = 0;\n            size_t mode_row_length = 0;\n\n            // Final score is equal to the largest\n            // row size times rows of that size\n            for (auto& pair : row_tally) {\n                auto row_size = pair.first;\n                auto row_count = pair.second;\n                double score = (double)(row_size * row_count);\n                if (score > final_score) {\n                    final_score = score;\n                    mode_row_length = row_size;\n                    header_row = row_when[row_size];\n                }\n            }\n\n            // Heuristic: If first row has >= columns than mode, use it as header\n            // This handles headers with optional columns, trailing delimiters, etc.\n            // while still supporting CSVs with comment lines before the header\n            size_t first_row_length = rows.size() > 0 ? rows[0].size() : 0;\n            if (first_row_length >= mode_row_length && first_row_length > 0) {\n                header_row = 0;\n            }\n\n            return {\n                final_score,\n                header_row\n            };\n        }\n\n        /** Guess the delimiter used by a delimiter-separated values file */\n        CSV_INLINE CSVGuessResult _guess_format(csv::string_view head, const std::vector<char>& delims) {\n            /** For each delimiter, find out which row length was most common (mode).\n             *  The delimiter with the highest score (row_length × count) wins.\n             *  \n             *  Header detection: If first row has >= columns than mode, use row 0.\n             *  Otherwise use the first row with the mode length.\n             *  \n             *  See csv::guess_format() public API documentation for detailed heuristic explanation.\n             */\n\n            CSVFormat format;\n            size_t max_score = 0,\n                header = 0;\n            char current_delim = delims[0];\n\n            for (char cand_delim : delims) {\n                auto result = calculate_score(head, format.delimiter(cand_delim));\n\n                if ((size_t)result.score > max_score) {\n                    max_score = (size_t)result.score;\n                    current_delim = cand_delim;\n                    header = result.header;\n                }\n            }\n\n            return { current_delim, (int)header };\n        }\n    }\n\n    /** Return a CSV's column names\n     *\n     *  @param[in] filename  Path to CSV file\n     *  @param[in] format    Format of the CSV file\n     *\n     */\n    CSV_INLINE std::vector<std::string> get_col_names(csv::string_view filename, CSVFormat format) {\n        auto head = internals::get_csv_head(filename);\n\n        /** Guess delimiter and header row */\n        if (format.guess_delim()) {\n            auto guess_result = guess_format(filename, format.get_possible_delims());\n            format.delimiter(guess_result.delim).header_row(guess_result.header_row);\n        }\n\n        return internals::_get_col_names(head, format);\n    }\n\n    /** Guess the delimiter used by a delimiter-separated values file */\n    CSV_INLINE CSVGuessResult guess_format(csv::string_view filename, const std::vector<char>& delims) {\n        auto head = internals::get_csv_head(filename);\n        return internals::_guess_format(head, delims);\n    }\n\n    /** Reads an arbitrarily large CSV file using memory-mapped IO.\n     *\n     *  **Details:** Reads the first block of a CSV file synchronously to get information\n     *               such as column names and delimiting character.\n     *\n     *  @param[in] filename  Path to CSV file\n     *  @param[in] format    Format of the CSV file\n     *\n     *  \\snippet tests/test_read_csv.cpp CSVField Example\n     *\n     */\n\tCSV_INLINE CSVReader::CSVReader(csv::string_view filename, CSVFormat format) : _format(format) {\n#if defined(__EMSCRIPTEN__)\n    this->owned_stream = std::unique_ptr<std::istream>(\n        new std::ifstream(std::string(filename), std::ios::binary)\n    );\n\n    if (!(*this->owned_stream)) {\n        throw std::runtime_error(\"Cannot open file \" + std::string(filename));\n    }\n\n    this->init_from_stream(*this->owned_stream, format);\n#else\n    auto head = internals::get_csv_head(filename);\n        using Parser = internals::MmapParser;\n        // Apply chunk size from format before any reading occurs\n        this->_chunk_size = format.get_chunk_size();\n        /** Guess delimiter and header row */\n        if (format.guess_delim()) {\n            auto guess_result = internals::_guess_format(head, format.possible_delimiters);\n            format.delimiter(guess_result.delim);\n            // Only override header if user hasn't explicitly called no_header()\n            // Note: column_names() also sets header=-1, but it populates col_names,\n            // so we can distinguish: no_header() means header=-1 && col_names.empty()\n            if (format.header != -1 || !format.col_names.empty()) {\n                format.header = guess_result.header_row;\n            }\n            \n            this->_format = format;\n        }\n\n        if (!format.col_names.empty())\n            this->set_col_names(format.col_names);\n\n        this->parser = std::unique_ptr<Parser>(new Parser(filename, format, this->col_names)); // For C++11\n        this->initial_read();\n#endif\n    }\n\n    /** Return the format of the original raw CSV */\n    CSV_INLINE CSVFormat CSVReader::get_format() const {\n        CSVFormat new_format = this->_format;\n\n        // Since users are normally not allowed to set\n        // column names and header row simulatenously,\n        // we will set the backing variables directly here\n        new_format.col_names = this->col_names->get_col_names();\n        new_format.header = this->_format.header;\n\n        return new_format;\n    }\n\n    /** Return the CSV's column names as a vector of strings. */\n    CSV_INLINE std::vector<std::string> CSVReader::get_col_names() const {\n        if (this->col_names) {\n            return this->col_names->get_col_names();\n        }\n\n        return std::vector<std::string>();\n    }\n\n    /** Return the index of the column name if found or\n     *         csv::CSV_NOT_FOUND otherwise.\n     */\n    CSV_INLINE int CSVReader::index_of(csv::string_view col_name) const {\n        return this->col_names->index_of(col_name);\n    }\n\n    CSV_INLINE void CSVReader::trim_header() {\n        if (!this->header_trimmed) {\n            for (int i = 0; i <= this->_format.header && !this->records->empty(); i++) {\n                if (i == this->_format.header && this->col_names->empty()) {\n                    this->set_col_names(this->records->pop_front());\n                }\n                else {\n                    this->records->pop_front();\n                }\n            }\n\n            this->header_trimmed = true;\n        }\n    }\n\n    /**\n     *  @param[in] names Column names\n     */\n    CSV_INLINE void CSVReader::set_col_names(const std::vector<std::string>& names)\n    {\n        this->col_names->set_policy(this->_format.get_column_name_policy());\n        this->col_names->set_col_names(names);\n        this->n_cols = names.size();\n    }\n\n    /**\n     * Read a chunk of CSV data.\n     *\n     * @note This method is meant to be run on its own thread. Only one `read_csv()` thread\n     *       should be active at a time.\n     *\n     * @param[in] bytes Number of bytes to read.\n     *\n     * @see CSVReader::read_csv_worker\n     * @see CSVReader::read_row()\n     */\n    CSV_INLINE bool CSVReader::read_csv(size_t bytes) {\n        // WORKER THREAD FUNCTION: Runs asynchronously to read CSV chunks\n        //\n        // Threading model:\n        // 1. notify_all() - signals read_row() that worker is active\n        // 2. parser->next() - reads and parses bytes (10MB chunks)\n        // 3. kill_all() - signals read_row() that worker is done\n        //\n        // Exception handling: Exceptions thrown here MUST propagate to the calling\n        // thread via std::exception_ptr. Bug #282 fixed cases where exceptions were\n        // swallowed, causing std::terminate() instead of proper error handling.\n        \n        // Tell read_row() to listen for CSV rows\n        this->records->notify_all();\n\n        try {\n            this->parser->set_output(*this->records);\n            this->parser->next(bytes);\n\n            if (!this->header_trimmed) {\n                this->trim_header();\n            }\n        }\n        catch (...) {\n            // Never allow exceptions to escape the worker thread, or std::terminate will be invoked.\n            // Store the exception and rethrow from the consumer thread (read_row / iterator).\n            this->set_read_csv_exception(std::current_exception());\n        }\n\n        // Tell read_row() to stop waiting\n        this->records->kill_all();\n\n        return true;\n    }\n\n    /**\n     * Retrieve rows as CSVRow objects, returning true if more rows are available.\n     *\n     * @par Performance Notes\n     *  - Reads chunks of data that are csv::internals::ITERATION_CHUNK_SIZE bytes large at a time\n     *  - For performance details, read the documentation for CSVRow and CSVField.\n     *\n     * @param[out] row The variable where the parsed row will be stored\n     * @see CSVRow, CSVField\n     *\n     * **Example:**\n     * \\snippet tests/test_read_csv.cpp CSVField Example\n     *\n     */\n    CSV_INLINE bool CSVReader::read_row(CSVRow &row) {\n        while (true) {\n            if (this->records->empty()) {\n#if CSV_ENABLE_THREADS\n                if (this->records->is_waitable()) {\n                    // Reading thread is currently active => wait for it to populate records\n                    this->records->wait();\n                    continue;\n                }\n#endif\n\n                // Reading thread is not active\n#if CSV_ENABLE_THREADS\n                if (this->read_csv_worker.joinable())\n                    this->read_csv_worker.join();\n#endif\n\n                // If the worker thread failed, rethrow the error here\n                this->rethrow_read_csv_exception_if_any();\n\n                if (this->parser->eof())\n                    // End of file and no more records\n                    return false;\n\n                // Detect infinite loop: a previous read was requested but records are still empty.\n                // This fires when a single row spans more than 2 × _chunk_size bytes:\n                //   - chunk N   fills without finding '\\n'  → _read_requested set to true\n                //   - chunk N+1 also fills without '\\n'     → guard fires here\n                // Default _chunk_size is ITERATION_CHUNK_SIZE (10 MB), so the threshold is\n                // rows > 20 MB.  Use CSVFormat::chunk_size() to raise the limit.\n                if (this->_read_requested && this->records->empty()) {\n                    throw std::runtime_error(\n                        \"End of file not reached and no more records parsed. \"\n                        \"This likely indicates a CSV row larger than the chunk size of \" +\n                        std::to_string(this->_chunk_size) + \" bytes. \"\n                        \"Use CSVFormat::chunk_size() to increase the chunk size.\"\n                    );\n                }\n\n#if CSV_ENABLE_THREADS\n                // Start another reading thread.\n                // Mark as waitable before starting the thread to avoid a race where\n                // read_row() observes is_waitable()==false immediately after thread creation.\n                this->records->notify_all();\n                this->read_csv_worker = std::thread(&CSVReader::read_csv, this, this->_chunk_size);\n#else\n                // Single-threaded mode parses synchronously on the caller thread.\n                this->read_csv(this->_chunk_size);\n                this->rethrow_read_csv_exception_if_any();\n#endif\n                this->_read_requested = true;\n                continue;\n            }\n            else if (this->records->front().size() != this->n_cols &&\n                this->_format.variable_column_policy != VariableColumnPolicy::KEEP) {\n                auto errored_row = this->records->pop_front();\n\n                if (this->_format.variable_column_policy == VariableColumnPolicy::THROW) {\n                    if (errored_row.size() < this->n_cols)\n                        throw std::runtime_error(\"Line too short \" + internals::format_row(errored_row));\n\n                    throw std::runtime_error(\"Line too long \" + internals::format_row(errored_row));\n                }\n            }\n            else {\n                row = this->records->pop_front();\n                this->_n_rows++;\n                this->_read_requested = false;  // Reset flag on successful read\n                return true;\n            }\n        }\n\n        return false;\n    }\n}\n\n/** @file\n *  Calculates statistics from CSV files\n */\n\n#include <string>\n#if CSV_ENABLE_THREADS\n#include <thread>\n#endif\n\nnamespace csv {\n    /** Calculate statistics for an arbitrarily large file. When this constructor\n     *  is called, CSVStat will process the entire file iteratively. Once finished,\n     *  methods like get_mean(), get_counts(), etc... can be used to retrieve statistics.\n     */\n    CSV_INLINE CSVStat::CSVStat(csv::string_view filename, CSVFormat format) :\n        reader(filename, format) {\n        this->calc();\n    }\n\n    /** Calculate statistics for a CSV stored in a std::stringstream */\n    CSV_INLINE CSVStat::CSVStat(std::stringstream& stream, CSVFormat format) :\n        reader(stream, format) {\n        this->calc();\n    }\n\n    /** Return current means */\n    CSV_INLINE std::vector<long double> CSVStat::get_mean() const {\n        std::vector<long double> ret;        \n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->rolling_means[i]);\n        }\n        return ret;\n    }\n\n    /** Return current variances */\n    CSV_INLINE std::vector<long double> CSVStat::get_variance() const {\n        std::vector<long double> ret;        \n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->rolling_vars[i]/(this->n[i] - 1));\n        }\n        return ret;\n    }\n\n    /** Return current mins */\n    CSV_INLINE std::vector<long double> CSVStat::get_mins() const {\n        std::vector<long double> ret;        \n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->mins[i]);\n        }\n        return ret;\n    }\n\n    /** Return current maxes */\n    CSV_INLINE std::vector<long double> CSVStat::get_maxes() const {\n        std::vector<long double> ret;        \n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->maxes[i]);\n        }\n        return ret;\n    }\n\n    /** Get counts for each column */\n    CSV_INLINE std::vector<CSVStat::FreqCount> CSVStat::get_counts() const {\n        std::vector<FreqCount> ret;\n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->counts[i]);\n        }\n        return ret;\n    }\n\n    /** Get data type counts for each column */\n    CSV_INLINE std::vector<CSVStat::TypeCount> CSVStat::get_dtypes() const {\n        std::vector<TypeCount> ret;        \n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            ret.push_back(this->dtypes[i]);\n        }\n        return ret;\n    }\n\n    CSV_INLINE void CSVStat::calc_chunk() {\n        /** Only create stats counters the first time **/\n        if (dtypes.empty()) {\n            /** Go through all records and calculate specified statistics */\n            for (size_t i = 0; i < this->get_col_names().size(); i++) {\n                dtypes.push_back({});\n                counts.push_back({});\n                rolling_means.push_back(0);\n                rolling_vars.push_back(0);\n                mins.push_back(NAN);\n                maxes.push_back(NAN);\n                n.push_back(0);\n            }\n        }\n\n#if CSV_ENABLE_THREADS\n        // Start threads\n        std::vector<std::thread> pool;\n        for (size_t i = 0; i < this->get_col_names().size(); i++)\n            pool.push_back(std::thread(&CSVStat::calc_worker, this, i));\n\n        // Block until done\n        for (auto& th : pool)\n            th.join();\n#else\n        for (size_t i = 0; i < this->get_col_names().size(); i++) {\n            this->calc_worker(i);\n        }\n#endif\n\n        this->records.clear();\n    }\n\n    CSV_INLINE void CSVStat::calc() {\n        constexpr size_t CALC_CHUNK_SIZE = 5000;\n\n        for (auto& row : reader) {\n            this->records.push_back(std::move(row));\n\n            /** Chunk rows */\n            if (this->records.size() == CALC_CHUNK_SIZE) {\n                calc_chunk();\n            }\n        }\n\n        if (!this->records.empty()) {\n          calc_chunk();\n        }\n    }\n\n    CSV_INLINE void CSVStat::calc_worker(const size_t &i) {\n        /** Worker thread for CSVStat::calc() which calculates statistics for one column.\n         * \n         *  @param[in] i Column index\n         */\n\n        auto current_record = this->records.begin();\n\n        for (size_t processed = 0; current_record != this->records.end(); processed++) {\n            if (current_record->size() == this->get_col_names().size()) {\n                auto current_field = (*current_record)[i];\n\n                // Optimization: Don't count() if there's too many distinct values in the first 1000 rows\n                if (processed < 1000 || this->counts[i].size() <= 500)\n                    this->count(current_field, i);\n\n                this->dtype(current_field, i);\n\n                // Numeric Stuff\n                if (current_field.is_num()) {\n                    long double x_n = current_field.get<long double>();\n\n                    // This actually calculates mean AND variance\n                    this->variance(x_n, i);\n                    this->min_max(x_n, i);\n                }\n            }\n            else if (this->reader.get_format().get_variable_column_policy() == VariableColumnPolicy::THROW) {\n                throw std::runtime_error(\"Line has different length than the others \" + internals::format_row(*current_record));\n            }\n\n            ++current_record;\n        }\n    }\n\n    CSV_INLINE void CSVStat::dtype(CSVField& data, const size_t &i) {\n        /** Given a record update the type counter\n         *  @param[in]  record Data observation\n         *  @param[out] i      The column index that should be updated\n         */\n        \n        auto type = data.type();\n        if (this->dtypes[i].find(type) !=\n            this->dtypes[i].end()) {\n            // Increment count\n            this->dtypes[i][type]++;\n        } else {\n            // Initialize count\n            this->dtypes[i].insert(std::make_pair(type, 1));\n        }\n    }\n\n    CSV_INLINE void CSVStat::count(CSVField& data, const size_t &i) {\n        /** Given a record update the frequency counter\n         *  @param[in]  record Data observation\n         *  @param[out] i      The column index that should be updated\n         */\n\n        auto item = data.get<std::string>();\n\n        if (this->counts[i].find(item) !=\n            this->counts[i].end()) {\n            // Increment count\n            this->counts[i][item]++;\n        } else {\n            // Initialize count\n            this->counts[i].insert(std::make_pair(item, 1));\n        }\n    }\n\n    CSV_INLINE void CSVStat::min_max(const long double &x_n, const size_t &i) {\n        /** Update current minimum and maximum\n         *  @param[in]  x_n Data observation\n         *  @param[out] i   The column index that should be updated\n         */\n        if (std::isnan(this->mins[i]))\n            this->mins[i] = x_n;\n        if (std::isnan(this->maxes[i]))\n            this->maxes[i] = x_n;\n        \n        if (x_n < this->mins[i])\n            this->mins[i] = x_n;\n        else if (x_n > this->maxes[i])\n            this->maxes[i] = x_n;\n    }\n\n    CSV_INLINE void CSVStat::variance(const long double &x_n, const size_t &i) {\n        /** Given a record update rolling mean and variance for all columns\n         *  using Welford's Algorithm\n         *  @param[in]  x_n Data observation\n         *  @param[out] i   The column index that should be updated\n         */\n        long double& current_rolling_mean = this->rolling_means[i];\n        long double& current_rolling_var = this->rolling_vars[i];\n        long double& current_n = this->n[i];\n        long double delta;\n        long double delta2;\n\n        current_n++;\n        \n        if (current_n == 1) {\n            current_rolling_mean = x_n;\n        } else {\n            delta = x_n - current_rolling_mean;\n            current_rolling_mean += delta/current_n;\n            delta2 = x_n - current_rolling_mean;\n            current_rolling_var += delta*delta2;\n        }\n    }\n\n    /** Useful for uploading CSV files to SQL databases.\n     *\n     *  Return a data type for each column such that every value in a column can be\n     *  converted to the corresponding data type without data loss.\n     *  @param[in]  filename The CSV file\n     *\n     *  \\return A mapping of column names to csv::DataType enums\n     */\n    CSV_INLINE std::unordered_map<std::string, DataType> csv_data_types(const std::string& filename) {\n        CSVStat stat(filename);\n        std::unordered_map<std::string, DataType> csv_dtypes;\n\n        auto col_names = stat.get_col_names();\n        auto temp = stat.get_dtypes();\n\n        for (size_t i = 0; i < stat.get_col_names().size(); i++) {\n            auto& col = temp[i];\n            auto& col_name = col_names[i];\n\n            if (col[DataType::CSV_STRING])\n                csv_dtypes[col_name] = DataType::CSV_STRING;\n            else if (col[DataType::CSV_INT64])\n                csv_dtypes[col_name] = DataType::CSV_INT64;\n            else if (col[DataType::CSV_INT32])\n                csv_dtypes[col_name] = DataType::CSV_INT32;\n            else if (col[DataType::CSV_INT16])\n                csv_dtypes[col_name] = DataType::CSV_INT16;\n            else if (col[DataType::CSV_INT8])\n                csv_dtypes[col_name] = DataType::CSV_INT8;\n            else\n                csv_dtypes[col_name] = DataType::CSV_DOUBLE;\n        }\n\n        return csv_dtypes;\n    }\n}\n/** @file\n *  @brief Implementation of internal CSV data structures\n */\n\n\n#include <cassert>\n\nnamespace csv {\n    namespace internals {\n        CSV_INLINE RawCSVField& RawCSVFieldList::operator[](size_t n) const {\n            const size_t page_no = n / _single_buffer_capacity;\n            const size_t buffer_idx = n % _single_buffer_capacity;\n\n            return this->_owned_blocks[page_no].get()[buffer_idx];\n        }\n\n        CSV_INLINE void RawCSVFieldList::allocate() {\n            if (_back != nullptr) {\n                _current_block++;\n            }\n\n            this->_owned_blocks.push_back(std::unique_ptr<RawCSVField[]>(new RawCSVField[_single_buffer_capacity]));\n            _current_buffer_size = 0;\n            _back = this->_owned_blocks.back().get();\n        }\n    }\n}\n\n\n#include <system_error>\n\nnamespace csv {\n    namespace internals {\n        CSV_INLINE size_t get_file_size(csv::string_view filename) {\n            std::ifstream infile(std::string(filename), std::ios::binary);\n            if (!infile.is_open()) {\n                throw std::runtime_error(\"Cannot open file \" + std::string(filename));\n            }\n\n            const auto start = infile.tellg();\n            infile.seekg(0, std::ios::end);\n            const auto end = infile.tellg();\n\n            if (start < 0 || end < 0) {\n                throw std::runtime_error(\"Cannot determine file size for \" + std::string(filename));\n            }\n\n            return static_cast<size_t>(end - start);\n        }\n\n        CSV_INLINE std::string get_csv_head(csv::string_view filename) {\n            return get_csv_head(filename, get_file_size(filename));\n        }\n\n        CSV_INLINE std::string get_csv_head(csv::string_view filename, size_t file_size) {\n            const size_t bytes = 500000;\n\n#if defined(__EMSCRIPTEN__)\n            std::ifstream infile(std::string(filename), std::ios::binary);\n            if (!infile.is_open()) {\n                throw std::runtime_error(\"Cannot open file \" + std::string(filename));\n            }\n\n            const size_t length = std::min((size_t)file_size, bytes);\n            std::string head(length, '\\0');\n            infile.read(&head[0], (std::streamsize)length);\n            head.resize((size_t)infile.gcount());\n            return head;\n#else\n\n            std::error_code error;\n            size_t length = std::min((size_t)file_size, bytes);\n            auto mmap = mio::make_mmap_source(std::string(filename), 0, length, error);\n\n            if (error) {\n                throw std::runtime_error(\"Cannot open file \" + std::string(filename));\n            }\n\n            return std::string(mmap.begin(), mmap.end());\n#endif\n        }\n\n#ifdef _MSC_VER\n#pragma region IBasicCVParser\n#endif\n        CSV_INLINE IBasicCSVParser::IBasicCSVParser(\n            const CSVFormat& format,\n            const ColNamesPtr& col_names\n        ) : col_names_(col_names) {\n            if (format.no_quote) {\n                parse_flags_ = internals::make_parse_flags(format.get_delim());\n            }\n            else {\n                parse_flags_ = internals::make_parse_flags(format.get_delim(), format.quote_char);\n            }\n\n            // When no_quote, quote bytes are NOT_SPECIAL — use delimiter as safe dummy\n            // so SIMD does not stop early on quote bytes and cause an infinite loop.\n            const char eff_quote = format.no_quote ? format.get_delim() : format.quote_char;\n            simd_sentinels_ = SentinelVecs(format.get_delim(), eff_quote);\n            ws_flags_ = internals::make_ws_flags(\n                format.trim_chars.data(), format.trim_chars.size()\n            );\n            has_ws_trimming_ = !format.trim_chars.empty();\n        }\n\n        CSV_INLINE void IBasicCSVParser::end_feed() {\n            using internals::ParseFlags;\n\n            bool empty_last_field = this->data_ptr_\n                && this->data_ptr_->_data\n                && !this->data_ptr_->data.empty()\n                && (parse_flag(this->data_ptr_->data.back()) == ParseFlags::DELIMITER\n                    || parse_flag(this->data_ptr_->data.back()) == ParseFlags::QUOTE);\n\n            // Push field\n            if (this->field_length_ > 0 || empty_last_field) {\n                this->push_field();\n            }\n\n            // Push row\n            if (this->current_row_.size() > 0)\n                this->push_row();\n        }\n\n        CSV_INLINE void IBasicCSVParser::parse_field() noexcept {\n            using internals::ParseFlags;\n            auto& in = this->data_ptr_->data;\n\n            if (field_start_ == UNINITIALIZED_FIELD)\n                field_start_ = (int)(data_pos_ - current_row_start());\n\n            // Optimization: Since NOT_SPECIAL characters tend to occur in contiguous\n            // sequences, use SIMD to skip long runs of them quickly.\n            // find_next_non_special processes complete SIMD lanes and returns pos\n            // unchanged for any tail shorter than one lane width.\n#if !defined(CSV_NO_SIMD)\n            data_pos_ = find_next_non_special(in, data_pos_, this->simd_sentinels_);\n#endif\n\n            // Scalar tail: handles remaining bytes after SIMD falls through, and\n            // handles any byte that SIMD stopped at conservatively (e.g. a delimiter\n            // inside a quoted field, which compound_parse_flag treats as NOT_SPECIAL).\n            while (data_pos_ < in.size() && compound_parse_flag(in[data_pos_]) == ParseFlags::NOT_SPECIAL)\n                data_pos_++;\n\n            field_length_ = data_pos_ - (field_start_ + current_row_start());\n\n            // Whitespace trimming is deferred to get_field_impl() so callers that never\n            // read field values (e.g. row counting) pay no trimming cost.\n        }\n\n        CSV_INLINE void IBasicCSVParser::push_field()\n        {\n            // Update\n            fields_->emplace_back(\n                field_start_ == UNINITIALIZED_FIELD ? 0 : (unsigned int)field_start_,\n                field_length_,\n                field_has_double_quote_\n            );\n\n            current_row_.row_length++;\n\n            // Reset field state\n            field_has_double_quote_ = false;\n            field_start_ = UNINITIALIZED_FIELD;\n            field_length_ = 0;\n        }\n\n        /** @return The number of characters parsed that belong to complete rows */\n        CSV_INLINE size_t IBasicCSVParser::parse()\n        {\n            using internals::ParseFlags;\n\n            this->quote_escape_ = false;\n            this->data_pos_ = 0;\n            this->current_row_start() = 0;\n            this->trim_utf8_bom();\n\n            auto& in = this->data_ptr_->data;\n            while (this->data_pos_ < in.size()) {\n                switch (compound_parse_flag(in[this->data_pos_])) {\n                case ParseFlags::DELIMITER:\n                    this->push_field();\n                    this->data_pos_++;\n                    break;\n\n                case ParseFlags::NEWLINE:\n                    this->data_pos_++;\n\n                    // Catches CRLF (or LFLF, CRCRLF, or any other non-sensical combination of newlines)\n                    while (this->data_pos_ < in.size() && parse_flag(in[this->data_pos_]) == ParseFlags::NEWLINE)\n                        this->data_pos_++;\n\n                    // End of record -> Write record\n                    this->push_field();\n                    this->push_row();\n\n                    // Reset\n                    this->current_row_ = CSVRow(data_ptr_, this->data_pos_, fields_->size());\n                    break;\n\n                case ParseFlags::NOT_SPECIAL:\n                    this->parse_field();\n                    break;\n\n                case ParseFlags::QUOTE_ESCAPE_QUOTE:\n                    if (data_pos_ + 1 == in.size()) return this->current_row_start();\n                    else if (data_pos_ + 1 < in.size()) {\n                        auto next_ch = parse_flag(in[data_pos_ + 1]);\n                        if (next_ch >= ParseFlags::DELIMITER) {\n                            quote_escape_ = false;\n                            data_pos_++;\n                            break;\n                        }\n                        else if (next_ch == ParseFlags::QUOTE) {\n                            // Case: Escaped quote\n                            data_pos_ += 2;\n                            this->field_length_ += 2;\n                            this->field_has_double_quote_ = true;\n                            break;\n                        }\n                    }\n                    \n                    // Case: Unescaped single quote => not strictly valid but we'll keep it\n                    this->field_length_++;\n                    data_pos_++;\n\n                    break;\n\n                default: // Quote (currently not quote escaped)\n                    if (this->field_length_ == 0) {\n                        quote_escape_ = true;\n                        data_pos_++;\n                        if (field_start_ == UNINITIALIZED_FIELD && data_pos_ < in.size() && !ws_flag(in[data_pos_]))\n                            field_start_ = (int)(data_pos_ - current_row_start());\n                        break;\n                    }\n\n                    // Case: Unescaped quote\n                    this->field_length_++;\n                    data_pos_++;\n\n                    break;\n                }\n            }\n\n            return this->current_row_start();\n        }\n\n        CSV_INLINE void IBasicCSVParser::push_row() {\n            size_t row_len = fields_->size() - current_row_.fields_start;\n            // Set row_length before pushing (immutable once created)\n            current_row_.row_length = row_len;\n            this->records_->push_back(std::move(current_row_));\n        }\n\n        CSV_INLINE void IBasicCSVParser::reset_data_ptr() {\n            this->data_ptr_ = std::make_shared<RawCSVData>();\n            this->data_ptr_->parse_flags = this->parse_flags_;\n            this->data_ptr_->ws_flags = this->ws_flags_;\n            this->data_ptr_->has_ws_trimming = this->has_ws_trimming_;\n            this->data_ptr_->col_names = this->col_names_;\n            this->fields_ = &(this->data_ptr_->fields);\n        }\n\n        CSV_INLINE void IBasicCSVParser::trim_utf8_bom() {\n            auto& data = this->data_ptr_->data;\n\n            if (!this->unicode_bom_scan_ && data.size() >= 3) {\n                if (data[0] == '\\xEF' && data[1] == '\\xBB' && data[2] == '\\xBF') {\n                    this->data_pos_ += 3; // Remove BOM from input string\n                    this->utf8_bom_ = true;\n                }\n\n                this->unicode_bom_scan_ = true;\n            }\n        }\n#ifdef _MSC_VER\n#pragma endregion\n#endif\n\n#ifdef _MSC_VER\n#pragma region Specializations\n#endif\n#if !defined(__EMSCRIPTEN__)\n        CSV_INLINE void MmapParser::next(size_t bytes = ITERATION_CHUNK_SIZE) {\n            // CRITICAL SECTION: Chunk Transition Logic\n            // This function reads 10MB chunks and must correctly handle fields that span\n            // chunk boundaries. The 'remainder' calculation below ensures partial fields\n            // are preserved for the next chunk.\n            //\n            // Bug #280: Field corruption occurred here when chunk transitions incorrectly\n            // split multi-byte characters or field boundaries.\n            \n            // Reset parser state\n            this->field_start_ = UNINITIALIZED_FIELD;\n            this->field_length_ = 0;\n            this->reset_data_ptr();\n\n            // Create memory map\n            const size_t offset = this->mmap_pos;\n            const size_t remaining = (offset < this->source_size_)\n                ? (this->source_size_ - offset)\n                : 0;\n            const size_t length = std::min(remaining, bytes);\n            if (length == 0) {\n                // No more data to read; mark EOF and end feed\n                // (Prevent exception on empty mmap as reported by #267)\n                this->eof_ = true;\n                this->end_feed();\n                return;\n            }\n\n            std::error_code error;\n            auto mmap = mio::make_mmap_source(this->_filename, offset, length, error);\n            if (error) {\n                std::string msg = \"Memory mapping failed during CSV parsing: file='\" + this->_filename\n                    + \"' offset=\" + std::to_string(offset)\n                    + \" length=\" + std::to_string(length);\n                throw std::system_error(error, msg);\n            }\n            this->data_ptr_->_data = std::make_shared<mio::basic_mmap_source<char>>(std::move(mmap));\n            this->mmap_pos += length;\n\n            auto mmap_ptr = (mio::basic_mmap_source<char>*)(this->data_ptr_->_data.get());\n\n            // Create string view\n            this->data_ptr_->data = csv::string_view(mmap_ptr->data(), mmap_ptr->length());\n\n            // Parse\n            this->current_row_ = CSVRow(this->data_ptr_);\n            size_t remainder = this->parse();            \n\n            if (this->mmap_pos == this->source_size_ || no_chunk()) {\n                this->eof_ = true;\n                this->end_feed();\n            }\n\n            this->mmap_pos -= (length - remainder);\n        }\n#endif\n#ifdef _MSC_VER\n#pragma endregion\n#endif\n    }\n}\n\n/** @file\n *  Defines the data type used for storing information about a CSV row\n */\n\n#include <cassert>\n#include <functional>\n\nnamespace csv {\n    namespace internals {\n        CSV_INLINE csv::string_view get_trimmed(csv::string_view sv, const WhitespaceMap& ws_flags) noexcept\n        {\n            // Lazy trim only when requested\n            size_t start = 0;\n            while (start < sv.size() && ws_flags[sv[start] + CHAR_OFFSET]) {\n                ++start;\n            }\n\n            size_t end = sv.size();\n            while (end > start && ws_flags[sv[end - 1] + CHAR_OFFSET]) {\n                --end;\n            }\n\n            return sv.substr(start, end - start);\n        }\n    }\n\n    /** Return a CSVField object corrsponding to the nth value in the row.\n     *\n     *  @note This method performs bounds checking, and will throw an\n     *        `std::runtime_error` if n is invalid.\n     *\n     *  @complexity\n     *  Constant, by calling csv::CSVRow::get_csv::string_view()\n     *\n     */\n    CSV_INLINE CSVField CSVRow::operator[](size_t n) const {\n        return CSVField(this->get_field(n));\n    }\n\n    /** Retrieve a value by its associated column name. If the column\n     *  specified can't be round, a runtime error is thrown.\n     *\n     *  @complexity\n     *  Constant. This calls the other CSVRow::operator[]() after\n     *  converting column names into indices using a hash table.\n     *\n     *  @param[in] col_name The column to look for\n     */\n    CSV_INLINE CSVField CSVRow::operator[](const std::string& col_name) const {\n        auto & col_names = this->data->col_names;\n        auto col_pos = col_names->index_of(col_name);\n        if (col_pos > -1) {\n            return this->operator[](col_pos);\n        }\n\n        throw std::runtime_error(\"Can't find a column named \" + col_name);\n    }\n\n    CSV_INLINE CSVRow::operator std::vector<std::string>() const {\n        std::vector<std::string> ret;\n        for (size_t i = 0; i < size(); i++)\n            ret.push_back(std::string(this->get_field(i)));\n\n        return ret;\n    }\n\n    /** Build a map from column names to values for a given row. */\n    CSV_INLINE std::unordered_map<std::string, std::string> CSVRow::to_unordered_map() const {\n        std::unordered_map<std::string, std::string> row_map;\n        row_map.reserve(this->size());\n\n        for (size_t i = 0; i < this->size(); i++) {\n            auto col_name = (*this->data->col_names)[i];\n            row_map[col_name] = this->operator[](i).get<std::string>();\n        }\n\n        return row_map;\n    }\n\n    /**\n     * Build a map from column names to values for a given row.\n     * \n     * @param[in] subset Vector of column names to include in the map.\n     */\n    CSV_INLINE std::unordered_map<std::string, std::string> CSVRow::to_unordered_map(\n        const std::vector<std::string>& subset\n    ) const {\n        std::unordered_map<std::string, std::string> row_map;\n        row_map.reserve(subset.size());\n\n        for (const auto& col_name : subset)\n            row_map[col_name] = this->operator[](col_name).get<std::string>();\n\n        return row_map;\n    }\n\n    CSV_INLINE csv::string_view CSVRow::get_field(size_t index) const\n    {\n        return this->get_field_impl(index, this->data);\n    }\n\n    CSV_INLINE csv::string_view CSVRow::get_field_safe(size_t index, internals::RawCSVDataPtr _data) const\n    {\n        return this->get_field_impl(index, _data);\n    }\n\n    CSV_INLINE bool CSVField::try_parse_decimal(long double& dVal, const char decimalSymbol) {\n        // If field has already been parsed to empty, no need to do it aagin:\n        if (this->_type == DataType::CSV_NULL)\n                    return false;\n\n        // Not yet parsed or possibly parsed with other decimalSymbol\n        if (this->_type == DataType::UNKNOWN || this->_type == DataType::CSV_STRING || this->_type == DataType::CSV_DOUBLE)\n            this->_type = internals::data_type(this->sv, &this->value, decimalSymbol); // parse again\n\n        // Integral types are not affected by decimalSymbol and need not be parsed again\n\n        // Either we already had an integral type before, or we we just got any numeric type now.\n        if (this->_type >= DataType::CSV_INT8 && this->_type <= DataType::CSV_DOUBLE) {\n            dVal = this->value;\n            return true;\n        }\n\n        // CSV_NULL or CSV_STRING, not numeric\n        return false;\n    }\n\n#ifdef _MSC_VER\n#pragma region CSVRow Iterator\n#endif\n    /** Return an iterator pointing to the first field. */\n    CSV_INLINE CSVRow::iterator CSVRow::begin() const {\n        return CSVRow::iterator(this, 0);\n    }\n\n    /** Return an iterator pointing to just after the end of the CSVRow.\n     *\n     *  @warning Attempting to dereference the end iterator results\n     *           in dereferencing a null pointer.\n     */\n    CSV_INLINE CSVRow::iterator CSVRow::end() const noexcept {\n        return CSVRow::iterator(this, (int)this->size());\n    }\n\n    CSV_INLINE CSVRow::reverse_iterator CSVRow::rbegin() const noexcept {\n        return std::reverse_iterator<CSVRow::iterator>(this->end());\n    }\n\n    CSV_INLINE CSVRow::reverse_iterator CSVRow::rend() const {\n        return std::reverse_iterator<CSVRow::iterator>(this->begin());\n    }\n\n    CSV_INLINE CSV_NON_NULL(2)\n    CSVRow::iterator::iterator(const CSVRow* _reader, int _i)\n        : daddy(_reader), data(_reader->data), i(_i) {\n        if (_i < (int)this->daddy->size())\n            this->field = std::make_shared<CSVField>(\n                CSVField(this->daddy->get_field_safe(_i, this->data)));\n        else\n            this->field = nullptr;\n    }\n\n    CSV_INLINE CSVRow::iterator::reference CSVRow::iterator::operator*() const {\n        return *(this->field.get());\n    }\n\n    CSV_INLINE CSVRow::iterator::pointer CSVRow::iterator::operator->() const {\n        return this->field;\n    }\n\n    CSV_INLINE CSVRow::iterator& CSVRow::iterator::operator++() {\n        // Pre-increment operator\n        this->i++;\n        if (this->i < (int)this->daddy->size())\n            this->field = std::make_shared<CSVField>(\n                CSVField(this->daddy->get_field_safe(i, this->data)));\n        else // Reached the end of row\n            this->field = nullptr;\n        return *this;\n    }\n\n    CSV_INLINE CSVRow::iterator CSVRow::iterator::operator++(int) {\n        // Post-increment operator\n        auto temp = *this;\n        this->operator++();\n        return temp;\n    }\n\n    CSV_INLINE CSVRow::iterator& CSVRow::iterator::operator--() {\n        // Pre-decrement operator\n        this->i--;\n        this->field = std::make_shared<CSVField>(\n            CSVField(this->daddy->get_field_safe(this->i, this->data)));\n        return *this;\n    }\n\n    CSV_INLINE CSVRow::iterator CSVRow::iterator::operator--(int) {\n        // Post-decrement operator\n        auto temp = *this;\n        this->operator--();\n        return temp;\n    }\n    \n    CSV_INLINE CSVRow::iterator CSVRow::iterator::operator+(difference_type n) const {\n        // Allows for iterator arithmetic\n        return CSVRow::iterator(this->daddy, i + (int)n);\n    }\n\n    CSV_INLINE CSVRow::iterator CSVRow::iterator::operator-(difference_type n) const {\n        // Allows for iterator arithmetic\n        return CSVRow::iterator::operator+(-n);\n    }\n#ifdef _MSC_VER\n#pragma endregion CSVRow Iterator\n#endif\n}\n\n#include <algorithm>\n#include <cctype>\n\nnamespace csv {\n    namespace internals {\n        CSV_INLINE std::vector<std::string> ColNames::get_col_names() const {\n            return this->col_names;\n        }\n\n        CSV_INLINE void ColNames::set_col_names(const std::vector<std::string>& cnames) {\n            this->col_names = cnames;\n            this->col_pos.clear();\n\n            for (size_t i = 0; i < cnames.size(); i++) {\n                if (this->_policy == csv::ColumnNamePolicy::CASE_INSENSITIVE) {\n                    // For case-insensitive lookup, cache a lowercase version\n                    // of the column name in the map\n                    std::string lower(cnames[i]);\n                    std::transform(lower.begin(), lower.end(), lower.begin(),\n                        [](unsigned char c) { return static_cast<char>(std::tolower(c)); });\n                    this->col_pos[lower] = i;\n                } else {\n                    this->col_pos[cnames[i]] = i;\n                }\n            }\n        }\n\n        CSV_INLINE int ColNames::index_of(csv::string_view col_name) const {\n            if (this->_policy == csv::ColumnNamePolicy::CASE_INSENSITIVE) {\n                std::string lower(col_name);\n                std::transform(lower.begin(), lower.end(), lower.begin(),\n                    [](unsigned char c) { return static_cast<char>(std::tolower(c)); });\n                auto pos = this->col_pos.find(lower);\n                if (pos != this->col_pos.end())\n                    return (int)pos->second;\n                return CSV_NOT_FOUND;\n            }\n\n            auto pos = this->col_pos.find(col_name.data());\n            if (pos != this->col_pos.end())\n                return (int)pos->second;\n\n            return CSV_NOT_FOUND;\n        }\n\n        CSV_INLINE void ColNames::set_policy(csv::ColumnNamePolicy policy) {\n            this->_policy = policy;\n        }\n\n        CSV_INLINE size_t ColNames::size() const noexcept {\n            return this->col_names.size();\n        }\n\n        CSV_INLINE const std::string& ColNames::operator[](size_t i) const {\n            if (i >= this->col_names.size())\n                throw std::out_of_range(\"Column index out of bounds.\");\n\n            return this->col_names[i];\n        }\n    }\n}\n\n\n#endif\n"
  },
  {
    "path": "core/debug.cpp",
    "content": "#include \"debug.h\"\n\nstatic bool logToFile = false;\nstatic QString debugLogFilename;\n\nbool isLogToFileEnabled()\n{\n    return logToFile;\n}\n\nvoid setLogToFile(bool enabled)\n{\n    logToFile = enabled;\n}\n\nQString currentDebugLogFilename()\n{\n    return debugLogFilename;\n}\n\nvoid setCurrentDebugLogFilename(const QString &filename)\n{\n    debugLogFilename = filename;\n}\n\nvoid set_debug_level(DEBUG_LEVEL_TYPE type)\n{\n    switch ( type )\n    {\n    case LEVEL_DEBUG_MAX:\n        QLoggingCategory::setFilterRules(\"*.debug=true \\n\"\n                                         \"*.function.parameters=true \\n\"\n                                         \"*.function.entered=true\\n\");\n        break;\n    case LEVEL_DEBUG_FUNCTION_PARAMETERS:\n        QLoggingCategory::setFilterRules(\"*.function.parameters=true \\n\"\n                                         \"*.function.entered=true\\n\");\n        break;\n    case LEVEL_DEBUG_FUNCTION_CALLS:\n        QLoggingCategory::setFilterRules(\"*.function.parameters=false\\n\");\n        break;\n    case LEVEL_DEBUG_RUNTIME:\n        QLoggingCategory::setFilterRules(\"*.function.*=false\\n\");\n        break;\n    case LEVEL_PRODUCTION:\n    default:\n        QLoggingCategory::setFilterRules(\"*.debug=false\\n\");\n    }\n}\n\n"
  },
  {
    "path": "core/debug.h",
    "content": "#ifndef QLOG_CORE_DEBUG_LOG_H\n#define QLOG_CORE_DEBUG_LOG_H\n\n#include <QLoggingCategory>\n#include <QString>\n\nQ_DECLARE_LOGGING_CATEGORY(logGraphics)\nQ_DECLARE_LOGGING_CATEGORY(logPlugin)\n\n#define MODULE_IDENTIFICATION(m) static const char *mod_name = m; \\\n                                 static const QLoggingCategory function_parameters(m\".function.parameters\"); \\\n                                 static const QLoggingCategory runtime(m\".runtime\"); \\\n\n#define FCT_IDENTIFICATION QString logging_cat(mod_name); \\\n                           logging_cat.append(\".function.entered\"); \\\n                           QByteArray logging_cat_latin1 = logging_cat.toLatin1(); \\\n                           const char* category_name = logging_cat_latin1.isEmpty() ? \"default_category\" : logging_cat_latin1.constData(); \\\n                           QLoggingCategory log_category(category_name); \\\n                           qCDebug(log_category)<<\"***\"\n\ntypedef enum debug_level\n{\n    LEVEL_DEBUG_MAX,\n    LEVEL_DEBUG_FUNCTION_PARAMETERS,    LEVEL_DEBUG_FUNCTION_CALLS,\n    LEVEL_DEBUG_RUNTIME,\n    LEVEL_PRODUCTION\n} DEBUG_LEVEL_TYPE;\n\nvoid set_debug_level(DEBUG_LEVEL_TYPE);\n\nbool isLogToFileEnabled();\nvoid setLogToFile(bool enabled);\nvoid closeDebugLogFile();\nQString currentDebugLogFilename();\nvoid setCurrentDebugLogFilename(const QString &filename);\n\n#endif // QLOG_CORE_DEBUG_LOG_H\n"
  },
  {
    "path": "core/main.cpp",
    "content": "#include <QApplication>\n#include <QMessageBox>\n#include <QResource>\n#include <QDebug>\n#include <QTime>\n#include <QSystemSemaphore>\n#include <QSharedMemory>\n#include <QMessageBox>\n#include <QDebug>\n#include <QSplashScreen>\n#include <QTemporaryDir>\n#include <QStyleFactory>\n#include <QThread>\n\n#include \"debug.h\"\n#include \"Migration.h\"\n#include \"ui/MainWindow.h\"\n#include \"rig/Rig.h\"\n#include \"rotator/Rotator.h\"\n#include \"cwkey/CWKeyer.h\"\n#include \"AppGuard.h\"\n#include \"core/zonedetect.h\"\n#include \"ui/SplashScreen.h\"\n#include \"core/MembershipQE.h\"\n#include \"service/kstchat/KSTChat.h\"\n#include \"data/Data.h\"\n#include \"service/GenericCallbook.h\"\n#include \"core/LogDatabase.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.main\");\n\nstatic QMutex debug_mutex;\nstatic QFile debugLogFile;\nstatic QTextStream debugLogStream;\n\nQTemporaryDir tempDir\n#ifdef QLOG_FLATPAK\n// hack: I don't know how to openn image file\n// in sandbox via QDesktop::openurl\n// therefore QLog creates a temp directory in home directory (home is allowed for flatpak)\n(QDir::homePath() + \"/.qlogXXXXXX\");\n#else\n;\n#endif\n\nstatic void setupTranslator(QApplication* app,\n                            const QString &lang,\n                            const QString &translationFile)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << lang << translationFile;\n\n    QString localeLang = ( lang.isEmpty() ) ? QLocale::system().name()\n                                            : lang;\n\n    QTranslator* qtTranslator = new QTranslator(app);\n    if ( qtTranslator->load(\"qt_\" + localeLang,\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n                       QLibraryInfo::location(QLibraryInfo::TranslationsPath)) )\n#else\n                       QLibraryInfo::path(QLibraryInfo::TranslationsPath)) )\n#endif\n\n    {\n        app->installTranslator(qtTranslator);\n    }\n\n    // give translators the ability to dynamically load files.\n    // first, try to load file from input parameter (if exsist)\n    if ( !translationFile.isEmpty() )\n    {\n        qCDebug(runtime) << \"External translation file defined - trying to load it\";\n        QTranslator* translator = new QTranslator(app);\n        if ( translator->load(translationFile) )\n        {\n            qCDebug(runtime) << \"Loaded successfully\"\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                             << translator->filePath()\n#endif\n                             ;\n            app->installTranslator(translator);\n            return;\n        }\n        qWarning() << \"External translation file not found\";\n        translator->deleteLater();\n    }\n\n    // searching in the following directories\n    // Linux:\n    //    application_folder/i18n\n    //    \"~/.local/share/hamradio/QLog/i18n\",\n    //    \"/usr/local/share/hamradion/QLog/i18n\",\n    //    \"/usr/share/hamradio/QLog/i18n\"\n    //\n    // looking for filename\n    //     qlog.fr_ca.qm\n    //     qlog.fr_ca\n    //     qlog.fr.qm\n    //     qlog.fr\n    //     qlog.qm\n    //     qlog\n\n    QStringList translationFolders;\n\n    translationFolders  << qApp->applicationDirPath()\n                        << QStandardPaths::standardLocations(QStandardPaths::AppLocalDataLocation);\n\n    for ( const QString& folder : static_cast<const QStringList&>(translationFolders) )\n    {\n        qCDebug(runtime) << \"Looking for a translation in\" << folder << QString(\"i18n%1qlog_%2\").arg(QDir::separator(), localeLang);\n        QTranslator* translator = new QTranslator(app);\n        if ( translator->load(QStringLiteral(\"i18n%1qlog_%2\").arg(QDir::separator(), localeLang), folder) )\n        {\n            qCDebug(runtime) << \"Loaded successfully\"\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                             << translator->filePath()\n#endif\n                             ;\n            app->installTranslator(translator);\n            return;\n        }\n        translator->deleteLater();\n    }\n\n    // last attempt -  build-in resources/i18n.\n    qCDebug(runtime) << \"Looking for a translation in QLog's resources\";\n    QTranslator* translator = new QTranslator(app);\n    if ( translator->load(\":/i18n/qlog_\" + localeLang) )\n    {\n        qCDebug(runtime) << \"Loaded successfully\"\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                         << translator->filePath()\n#endif\n                         ;\n        app->installTranslator(translator);\n        return;\n    }\n\n    translator->deleteLater();\n\n    qCDebug(runtime) << \"Cannot find any translation file\";\n}\n\nstatic void createDataDirectory() {\n    FCT_IDENTIFICATION;\n\n    QDir dataDir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    qCDebug(runtime) << dataDir.path();\n\n    if (!dataDir.exists()) {\n        dataDir.mkpath(dataDir.path());\n    }\n}\n\nstatic void startRigThread() {\n    FCT_IDENTIFICATION;\n\n    QThread* rigThread = new QThread;\n    Rig* rig = Rig::instance();\n    rig->moveToThread(rigThread);\n    QObject::connect(rigThread, SIGNAL(started()), rig, SLOT(start()));\n    rigThread->start();\n}\n\nstatic void startRotThread() {\n    FCT_IDENTIFICATION;\n\n    QThread* rotThread = new QThread;\n    Rotator* rot = Rotator::instance();\n    rot->moveToThread(rotThread);\n    QObject::connect(rotThread, SIGNAL(started()), rot, SLOT(start()));\n    rotThread->start();\n}\n\nstatic void startCWKeyerThread()\n{\n    FCT_IDENTIFICATION;\n\n    QThread* cwKeyerThread = new QThread;\n    CWKeyer* cwKeyer = CWKeyer::instance();\n    cwKeyer->moveToThread(cwKeyerThread);\n    QObject::connect(cwKeyerThread, SIGNAL(started()), cwKeyer, SLOT(start()));\n    cwKeyerThread->start();\n}\n\nvoid closeDebugLogFile()\n{\n    QMutexLocker locker(&debug_mutex);\n\n    if ( debugLogFile.isOpen() )\n    {\n        debugLogStream.flush();\n        debugLogStream.setDevice(nullptr);\n        debugLogFile.close();\n    }\n}\n\nstatic void debugMessageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg)\n{\n    QMutexLocker locker(&debug_mutex);\n\n    if ( isLogToFileEnabled() && !debugLogFile.isOpen() )\n    {\n        const QString filename = Data::debugFilename();\n        debugLogFile.setFileName(filename);\n\n        if ( debugLogFile.open(QIODevice::WriteOnly | QIODevice::Text) )\n        {\n            setCurrentDebugLogFilename(filename);\n            debugLogStream.setDevice(&debugLogFile);\n            debugLogStream << \"App: \" << QCoreApplication::applicationVersion() << \"\\n\"\n#ifdef QLOG_FLATPAK\n                           << \"Flatpak\" << \"\\n\"\n#endif\n                           << \"QT: \" << qVersion() << \"\\n\"\n                           << \"OS: \" << QString(\"%1 %2 (%3)\").arg(QSysInfo::prettyProductName(), QSysInfo::currentCpuArchitecture(), QGuiApplication::platformName() ) << \"\\n\"\n                           << \"SSL: \" << QSslSocket::sslLibraryVersionString() << \"\\n\\n\";\n        }\n        else\n        {\n            qWarning() << \"Cannot open the file for log\";\n            setLogToFile(false);\n        }\n    }\n\n    const char *severity_string = nullptr;\n    switch ( type )\n    {\n    case QtDebugMsg:    severity_string = \"[DEBUG   ]\"; break;\n    case QtInfoMsg:     severity_string = \"[INFO    ]\"; break;\n    case QtWarningMsg:  severity_string = \"[WARNING ]\"; break;\n    case QtCriticalMsg: severity_string = \"[CRITICAL]\"; break;\n    case QtFatalMsg:    severity_string = \"[FATAL   ]\"; break;\n    default:            severity_string = \"[UNKNOWN ]\";\n    }\n\n    const QString &category = QString(\"[%1]\").arg(context.category).leftJustified(50, ' ');\n\n    const QString &logEntry = QString(\"%1 %2 [0x%3] %4 %5 [%6:%7:%8]\\n\")\n                           .arg(QTime::currentTime().toString(\"HH:mm:ss.zzz\"))\n                           .arg(severity_string)\n                           .arg(QString::number(reinterpret_cast<quintptr>(QThread::currentThreadId()), 16))\n                           .arg(category)\n                           .arg(msg)\n                           .arg(context.function ? context.function : \"unknown\")\n                           .arg(context.file ? context.file : \"unknown\")\n                           .arg(context.line);\n\n    if ( isLogToFileEnabled() && debugLogFile.isOpen() )\n    {\n        debugLogStream << logEntry;\n        debugLogStream.flush();\n    }\n\n    fprintf(stderr, \"%s\", logEntry.toUtf8().constData());\n\n    if ( type == QtFatalMsg )\n    {\n        if (debugLogFile.isOpen()) debugLogFile.close();\n        abort();\n    }\n}\n\n#ifdef Q_OS_LINUX\nvoid wayland_hacks()\n{\n    // due to QT's issue, Dock widget is not working (cannot be docked) under QT5, < ?6.7? on Linux\n    // Therefore it is necessary to force set XCB (X11)\n    const QByteArray &sessionType = qgetenv(\"XDG_SESSION_TYPE\").toLower();\n    const QByteArray &disableXCBFallback = qgetenv(\"QLOG_DISABLE_XCB\");\n    if ( sessionType.contains(\"wayland\")\n         && disableXCBFallback == QByteArray() )\n    {\n        qInfo() << \"Force XCB\";\n        qputenv(\"QT_QPA_PLATFORM\", \"xcb\");\n    }\n}\n#endif\n\nint main(int argc, char* argv[])\n{\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);\n    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);\n#endif\n\n#ifdef Q_OS_LINUX\n    wayland_hacks();\n#endif\n\n    bool stylePresent = false;\n\n    /* Style option is deleted in QApplication constructor.\n     * Therefore test for the parameter presence has to be performed here\n     */\n    for ( int i = 0; i < argc && !stylePresent; i++ )\n    {\n        stylePresent = QString(argv[i]).contains(\"-style\");\n    }\n\n    QApplication app(argc, argv);\n    app.setApplicationVersion(VERSION);\n\n    QCommandLineParser parser;\n    parser.setApplicationDescription(QCoreApplication::tr(\"QLog Help\"));\n    parser.addHelpOption();\n    parser.addVersionOption();\n\n    /* Undocumented param used for debugging. A developer can run QLog with\n     * a specific namespace. This helps in cases where it is possible\n     * to simultaneously run a test/develop and production versions of QLog.\n     *\n     * The parameter changes the Application name. It causes that all runtime\n     * files, settings, passwords and DB file are created in a different directory/namespace.\n     *\n     * however, it remains necessary only one instance of QLog to run at a time.\n     * More Notes below (AppGuard Comment).\n     *\n     * NOTE: This is not a preparation for the ability to run separate databases.\n     * It's just to make it easier for developers and testers.\n     */\n\n    QCommandLineOption environmentName(QStringList() << \"n\" << \"namespace\",\n                QCoreApplication::translate(\"main\", \"Run with the specific namespace.\"),\n                QCoreApplication::translate(\"main\", \"namespace\"));\n    QCommandLineOption translationFilename(QStringList() << \"t\" << \"translation\",\n                QCoreApplication::translate(\"main\", \"Translation file - absolute or relative path and QM file name.\"),\n                QCoreApplication::translate(\"main\", \"path/QM-filename\"));\n    QCommandLineOption forceLanguage(QStringList() << \"l\" << \"language\",\n                QCoreApplication::translate(\"main\", \"Set language. <code> example: 'en' or 'en_US'. Ignore environment setting.\"),\n                QCoreApplication::translate(\"main\", \"code\"));\n    QCommandLineOption debugFile(QStringList() << \"d\" << \"debug\",\n                QCoreApplication::translate(\"main\", \"Writes debug messages to the debug file\"));\n    QCommandLineOption importPending(\"import-pending\",\n                QCoreApplication::translate(\"main\", \"Process pending database import (internal use)\"));\n    QCommandLineOption forceLOVUpdate(QStringList() << \"f\" << \"force-update\",\n                QCoreApplication::translate(\"main\", \"Force update of all value lists (DXCC, SATs, etc.)\"));\n\n    parser.addOption(environmentName);\n    parser.addOption(translationFilename);\n    parser.addOption(forceLanguage);\n    parser.addOption(debugFile);\n    parser.addOption(importPending);\n    parser.addOption(forceLOVUpdate);\n\n    parser.process(app);\n    QString environment = parser.value(environmentName);\n    QString translation_file = parser.value(translationFilename);\n    QString lang = parser.value(forceLanguage);\n    setLogToFile(parser.isSet(debugFile));\n    bool isImportPending = parser.isSet(importPending);\n    bool isForceLOVUpdate = parser.isSet(forceLOVUpdate);\n\n    // If started with --import-pending, wait a bit for the previous instance to fully terminate\n    if ( isImportPending )\n    {\n        qCDebug(runtime) << \"Start postponed\";\n        QCoreApplication::processEvents();\n        QThread::msleep(1000);\n    }\n\n    app.setOrganizationName(\"hamradio\");\n    app.setApplicationName(\"QLog\" + ((environment.isEmpty()) ? \"\" : environment.prepend(\"-\")));\n\n    /* If the Style parameter is not present then use a default - Fusion style */\n    if ( !stylePresent )\n    {\n        app.setStyle(QStyleFactory::create(\"Fusion\"));\n    }\n\n    qInstallMessageHandler(debugMessageOutput);\n    qRegisterMetaType<VFOID>();\n    qRegisterMetaType<ClubStatusQuery::ClubInfo>();\n    qRegisterMetaType<QMap<QString, ClubStatusQuery::ClubInfo>>();\n    qRegisterMetaType<KSTChatMsg>();\n    qRegisterMetaType<KSTUsersInfo>();\n#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)\n    qRegisterMetaTypeStreamOperators<QSet<int>>(\"QSet<int>\");\n#endif\n    qRegisterMetaType<DxSpot>();\n    qRegisterMetaType<BandPlan::BandPlanMode>();\n    qRegisterMetaType<SpotAlert>();\n    qRegisterMetaType<Rig::Status>();\n    qRegisterMetaType<Band>();\n    qRegisterMetaType<CallbookResponseData>();\n\n    set_debug_level(LEVEL_PRODUCTION); // you can set more verbose rules via\n                                       // environment variable QT_LOGGING_RULES (project setting/debug)\n\n    setupTranslator(&app, lang, translation_file);\n\n    /* Application Singleton\n     *\n     * Only one instance of QLog application is allowed\n     *\n     * It is always necessary to run only one QLog on the\n     * system, because the FLDigi interface has a fixed port.\n     * Therefore, in the case of two or more instances,\n     * there is a port conflict.\n     */\n    AppGuard guard( \"QLog\" );\n    if ( !guard.tryToRun() )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"QLog is already running\"));\n        return 1;\n    }\n\n    QPixmap pixmap(\":/res/qlog.png\");\n    SplashScreen splash(pixmap);\n\n    splash.show();\n    splash.ensureFirstPaint();\n\n    createDataDirectory();\n\n    // Process pending database import if exists\n    if ( LogDatabase::hasPendingImport() )\n    {\n        splash.showMessage(QObject::tr(\"Importing Database\"), Qt::AlignBottom|Qt::AlignCenter);\n        QCoreApplication::processEvents();\n\n        if ( !LogDatabase::instance()->processPendingImport() )\n        {\n            QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                                  QMessageBox::tr(\"Failed to process pending database import.\"));\n            return 1;\n        }\n\n        if ( LogDatabase::instance()->hadPasswordImportWarning() )\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"The database was imported successfully, but the stored passwords \"\n                                                 \"could not be restored (decryption failed or the data is corrupted). \"\n                                                 \"All service passwords have been cleared and must be re-entered in Settings.\"));\n        }\n    }\n    else\n    {\n        splash.showMessage(QObject::tr(\"Opening Database\"), Qt::AlignBottom|Qt::AlignCenter);\n\n        QCoreApplication::processEvents();\n\n        if ( ! LogDatabase::instance()->openDatabase() )\n        {\n            QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                                  QMessageBox::tr(\"Could not connect to database.\"));\n            return 1;\n        }\n\n        splash.showMessage(QObject::tr(\"Backuping Database\"), Qt::AlignBottom|Qt::AlignCenter);\n\n        QCoreApplication::processEvents();\n\n        /* a migration can break a database therefore a backup is call before it */\n        if (!DBSchemaMigration::backupAllQSOsToADX())\n        {\n            QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                                  QMessageBox::tr(\"Could not export a QLog database to ADIF as a backup.<p>Try to export your log to ADIF manually\"));\n        }\n\n        splash.showMessage(QObject::tr(\"Migrating Database\"), Qt::AlignBottom|Qt::AlignCenter);\n\n        QCoreApplication::processEvents();\n\n        if ( ! LogDatabase::instance()->schemaVersionUpgrade(isForceLOVUpdate) )\n        {\n            QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                                  QMessageBox::tr(\"Database migration failed.\"));\n            return 1;\n        }\n    }\n\n    splash.showMessage(QObject::tr(\"Starting Application\"), Qt::AlignBottom|Qt::AlignCenter);\n\n    QCoreApplication::processEvents();\n\n    startRigThread();\n    startRotThread();\n    startCWKeyerThread();\n\n    MainWindow w;\n    QIcon icon(\":/res/qlog.png\");\n\n    w.setWindowIcon(icon);\n\n    splash.finish(&w);\n    w.show();\n\n    w.setLayoutGeometry();\n\n    // check version only for Windows and MacOS. Linux has own distribution points\n#if defined(Q_OS_WIN) || defined(Q_OS_MAC)\n    w.checkNewVersion();\n#endif\n    return app.exec();\n}\n"
  },
  {
    "path": "core/zonedetect.c",
    "content": "/*\n * Copyright (c) 2018, Bertold Van den Bergh (vandenbergh@bertold.org)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the author nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/* https://github.com/BertoldVdb/ZoneDetect/tree/master/library */\n\n#include <assert.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <math.h>\n#if defined(_MSC_VER) || defined(__MINGW32__)\n#include <windows.h>\n#elif defined(__APPLE__) || defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION)\n#include <errno.h>\n#include <sys/mman.h>\n#include <fcntl.h>\n#include <unistd.h>\n#endif\n\n#include \"zonedetect.h\"\n\nenum ZDInternalError {\n    ZD_OK,\n    ZD_E_DB_OPEN,\n    ZD_E_DB_SEEK,\n    ZD_E_DB_MMAP,\n#if defined(_MSC_VER) || defined(__MINGW32__)\n    ZD_E_DB_MMAP_MSVIEW,\n    ZD_E_DB_MAP_EXCEPTION,\n    ZD_E_DB_MUNMAP_MSVIEW,\n#endif\n    ZD_E_DB_MUNMAP,\n    ZD_E_DB_CLOSE,\n    ZD_E_PARSE_HEADER\n};\n\nstruct ZoneDetectOpaque {\n#if defined(_MSC_VER) || defined(__MINGW32__)\n    HANDLE fd;\n    HANDLE fdMap;\n    int32_t length;\n    int32_t padding;\n#elif defined(__APPLE__) || defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION)\n    int fd;\n    off_t length;\n#else\n    int length;\n#endif\n\n    uint8_t closeType;\n    uint8_t *mapping;\n\n    uint8_t tableType;\n    uint8_t version;\n    uint8_t precision;\n    uint8_t numFields;\n\n    char *notice;\n    char **fieldNames;\n\n    uint32_t bboxOffset;\n    uint32_t metadataOffset;\n    uint32_t dataOffset;\n};\n\nstatic void (*zdErrorHandler)(int, int);\nstatic void zdError(enum ZDInternalError errZD, int errNative)\n{\n    if (zdErrorHandler) zdErrorHandler((int)errZD, errNative);\n}\n\nstatic int32_t ZDFloatToFixedPoint(float input, float scale, unsigned int precision)\n{\n    const float inputScaled = input / scale;\n    return (int32_t)(inputScaled * (float)(1 << (precision - 1)));\n}\n\nstatic float ZDFixedPointToFloat(int32_t input, float scale, unsigned int precision)\n{\n    const float value = (float)input / (float)(1 << (precision - 1));\n    return value * scale;\n}\n\nstatic unsigned int ZDDecodeVariableLengthUnsigned(const ZoneDetect *library, uint32_t *index, uint64_t *result)\n{\n    if(*index >= (uint32_t)library->length) {\n        return 0;\n    }\n\n    uint64_t value = 0;\n    unsigned int i = 0;\n#if defined(_MSC_VER)\n    __try {\n#endif\n        uint8_t *const buffer = library->mapping + *index;\n        uint8_t *const bufferEnd = library->mapping + library->length - 1;\n\n        unsigned int shift = 0;\n        while(1) {\n            value |= ((((uint64_t)buffer[i]) & UINT8_C(0x7F)) << shift);\n            shift += 7u;\n\n            if(!(buffer[i] & UINT8_C(0x80))) {\n                break;\n            }\n\n            i++;\n            if(buffer + i > bufferEnd) {\n                return 0;\n            }\n        }\n#if defined(_MSC_VER)\n    } __except(GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR\n               ? EXCEPTION_EXECUTE_HANDLER\n               : EXCEPTION_CONTINUE_SEARCH) { /* file mapping SEH exception occurred */\n        zdError(ZD_E_DB_MAP_EXCEPTION, (int)GetLastError());\n        return 0;\n    }\n#endif\n\n    i++;\n    *result = value;\n    *index += i;\n    return i;\n}\n\nstatic unsigned int ZDDecodeVariableLengthUnsignedReverse(const ZoneDetect *library, uint32_t *index, uint64_t *result)\n{\n    uint32_t i = *index;\n\n    if(*index >= (uint32_t)library->length) {\n        return 0;\n    }\n\n#if defined(_MSC_VER)\n    __try {\n#endif\n\n        if(library->mapping[i] & UINT8_C(0x80)) {\n            return 0;\n        }\n\n        if(!i) {\n            return 0;\n        }\n        i--;\n\n        while(library->mapping[i] & UINT8_C(0x80)) {\n            if(!i) {\n                return 0;\n            }\n            i--;\n        }\n\n#if defined(_MSC_VER)\n    } __except(GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR\n               ? EXCEPTION_EXECUTE_HANDLER\n               : EXCEPTION_CONTINUE_SEARCH) { /* file mapping SEH exception occurred */\n        zdError(ZD_E_DB_MAP_EXCEPTION, (int)GetLastError());\n        return 0;\n    }\n#endif\n\n    *index = i;\n\n    i++;\n\n    uint32_t i2 = i;\n    return ZDDecodeVariableLengthUnsigned(library, &i2, result);\n}\n\nstatic int64_t ZDDecodeUnsignedToSigned(uint64_t value)\n{\n    return (value & 1) ? -(int64_t)(value / 2) : (int64_t)(value / 2);\n}\n\nstatic unsigned int ZDDecodeVariableLengthSigned(const ZoneDetect *library, uint32_t *index, int32_t *result)\n{\n    uint64_t value = 0;\n    const unsigned int retVal = ZDDecodeVariableLengthUnsigned(library, index, &value);\n    *result = (int32_t)ZDDecodeUnsignedToSigned(value);\n    return retVal;\n}\n\nstatic char *ZDParseString(const ZoneDetect *library, uint32_t *index)\n{\n    uint64_t strLength;\n    if(!ZDDecodeVariableLengthUnsigned(library, index, &strLength)) {\n        return NULL;\n    }\n\n    uint32_t strOffset = *index;\n    unsigned int remoteStr = 0;\n    if(strLength >= 256) {\n        strOffset = library->metadataOffset + (uint32_t)strLength - 256;\n        remoteStr = 1;\n\n        if(!ZDDecodeVariableLengthUnsigned(library, &strOffset, &strLength)) {\n            return NULL;\n        }\n\n        if(strLength > 256) {\n            return NULL;\n        }\n    }\n\n    char *const str = malloc((size_t)(strLength + 1));\n\n    if(str) {\n#if defined(_MSC_VER)\n        __try {\n#endif\n            size_t i;\n            for(i = 0; i < strLength; i++) {\n                str[i] = (char)(library->mapping[strOffset + i] ^ UINT8_C(0x80));\n            }\n#if defined(_MSC_VER)\n        } __except(GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR\n                   ? EXCEPTION_EXECUTE_HANDLER\n                   : EXCEPTION_CONTINUE_SEARCH) { /* file mapping SEH exception occurred */\n            zdError(ZD_E_DB_MAP_EXCEPTION, (int)GetLastError());\n            return 0;\n        }\n#endif\n        str[strLength] = 0;\n    }\n\n    if(!remoteStr) {\n        *index += (uint32_t)strLength;\n    }\n\n    return str;\n}\n\nstatic int ZDParseHeader(ZoneDetect *library)\n{\n    if(library->length < 7) {\n        return -1;\n    }\n\n#if defined(_MSC_VER)\n    __try {\n#endif\n        if(memcmp(library->mapping, \"PLB\", 3)) {\n            return -1;\n        }\n\n        library->tableType = library->mapping[3];\n        library->version   = library->mapping[4];\n        library->precision = library->mapping[5];\n        library->numFields = library->mapping[6];\n#if defined(_MSC_VER)\n    } __except(GetExceptionCode() == EXCEPTION_IN_PAGE_ERROR\n               ? EXCEPTION_EXECUTE_HANDLER\n               : EXCEPTION_CONTINUE_SEARCH) { /* file mapping SEH exception occurred */\n        zdError(ZD_E_DB_MAP_EXCEPTION, (int)GetLastError());\n        return 0;\n    }\n#endif\n\n    if(library->version >= 2) {\n        return -1;\n    }\n\n    uint32_t index = UINT32_C(7);\n\n    library->fieldNames = malloc(library->numFields * sizeof *library->fieldNames);\n    if (!library->fieldNames) {\n        return -1;\n    }\n\n    size_t i;\n    for(i = 0; i < library->numFields; i++) {\n        library->fieldNames[i] = ZDParseString(library, &index);\n    }\n\n    library->notice = ZDParseString(library, &index);\n    if(!library->notice) {\n        return -1;\n    }\n\n    uint64_t tmp;\n    /* Read section sizes */\n    /* By memset: library->bboxOffset = 0 */\n\n    if(!ZDDecodeVariableLengthUnsigned(library, &index, &tmp)) return -1;\n    library->metadataOffset = (uint32_t)tmp + library->bboxOffset;\n\n    if(!ZDDecodeVariableLengthUnsigned(library, &index, &tmp))return -1;\n    library->dataOffset = (uint32_t)tmp + library->metadataOffset;\n\n    if(!ZDDecodeVariableLengthUnsigned(library, &index, &tmp)) return -1;\n\n    /* Add header size to everything */\n    library->bboxOffset += index;\n    library->metadataOffset += index;\n    library->dataOffset += index;\n\n    /* Verify file length */\n    if(tmp + library->dataOffset != (uint32_t)library->length) {\n        return -2;\n    }\n\n    return 0;\n}\n\nstatic int ZDPointInBox(int32_t xl, int32_t x, int32_t xr, int32_t yl, int32_t y, int32_t yr)\n{\n    if((xl <= x && x <= xr) || (xr <= x && x <= xl)) {\n        if((yl <= y && y <= yr) || (yr <= y && y <= yl)) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\nstatic uint32_t ZDUnshuffle(uint64_t w)\n{\n    w &=                  0x5555555555555555llu;\n    w = (w | (w >> 1))  & 0x3333333333333333llu;\n    w = (w | (w >> 2))  & 0x0F0F0F0F0F0F0F0Fllu;\n    w = (w | (w >> 4))  & 0x00FF00FF00FF00FFllu;\n    w = (w | (w >> 8))  & 0x0000FFFF0000FFFFllu;\n    w = (w | (w >> 16)) & 0x00000000FFFFFFFFllu;\n    return (uint32_t)w;\n}\n\nstatic void ZDDecodePoint(uint64_t point, int32_t* lat, int32_t* lon)\n{\n    *lat = (int32_t)ZDDecodeUnsignedToSigned(ZDUnshuffle(point));\n    *lon = (int32_t)ZDDecodeUnsignedToSigned(ZDUnshuffle(point >> 1));\n}\n\nstruct Reader {\n    const ZoneDetect *library;\n    uint32_t polygonIndex;\n\n    uint64_t numVertices;\n\n    uint8_t done, first;\n    uint32_t referenceStart, referenceEnd;\n    int32_t referenceDirection;\n\n    int32_t pointLat, pointLon;\n    int32_t firstLat, firstLon;\n};\n\nstatic void ZDReaderInit(struct Reader *reader, const ZoneDetect *library, uint32_t polygonIndex)\n{\n    memset(reader, 0, sizeof(*reader));\n\n    reader->library = library;\n    reader->polygonIndex = polygonIndex;\n\n    reader->first = 1;\n}\n\nstatic int ZDReaderGetPoint(struct Reader *reader, int32_t *pointLat, int32_t *pointLon)\n{\n    int32_t diffLat = 0, diffLon = 0;\n\nreadNewPoint:\n    if(reader->done > 1) {\n        return 0;\n    }\n\n    if(reader->first && reader->library->version == 0) {\n        if(!ZDDecodeVariableLengthUnsigned(reader->library, &reader->polygonIndex, &reader->numVertices)) return -1;\n        if(!reader->numVertices) return -1;\n    }\n\n    uint8_t referenceDone = 0;\n\n    if(reader->library->version == 1) {\n        uint64_t point = 0;\n\n        if(!reader->referenceDirection) {\n            if(!ZDDecodeVariableLengthUnsigned(reader->library, &reader->polygonIndex, &point)) return -1;\n        } else {\n            if(reader->referenceDirection > 0) {\n                /* Read reference forward */\n                if(!ZDDecodeVariableLengthUnsigned(reader->library, &reader->referenceStart, &point)) return -1;\n                if(reader->referenceStart >= reader->referenceEnd) {\n                    referenceDone = 1;\n                }\n            } else if(reader->referenceDirection < 0) {\n                /* Read reference backwards */\n                if(!ZDDecodeVariableLengthUnsignedReverse(reader->library, &reader->referenceStart, &point)) return -1;\n                if(reader->referenceStart <= reader->referenceEnd) {\n                    referenceDone = 1;\n                }\n            }\n        }\n\n        if(!point) {\n            /* This is a special marker, it is not allowed in reference mode */\n            if(reader->referenceDirection) {\n                return -1;\n            }\n\n            uint64_t value;\n            if(!ZDDecodeVariableLengthUnsigned(reader->library, &reader->polygonIndex, &value)) return -1;\n\n            if(value == 0) {\n                reader->done = 2;\n            } else if(value == 1) {\n                int32_t diff;\n                int64_t start;\n                if(!ZDDecodeVariableLengthUnsigned(reader->library, &reader->polygonIndex, (uint64_t*)&start)) return -1;\n                if(!ZDDecodeVariableLengthSigned(reader->library, &reader->polygonIndex, &diff)) return -1;\n\n                reader->referenceStart = reader->library->dataOffset+(uint32_t)start;\n                reader->referenceEnd = reader->library->dataOffset+(uint32_t)(start + diff);\n                reader->referenceDirection = diff;\n                if(diff < 0) {\n                    reader->referenceStart--;\n                    reader->referenceEnd--;\n                }\n                goto readNewPoint;\n            }\n        } else {\n            ZDDecodePoint(point, &diffLat, &diffLon);\n            if(reader->referenceDirection < 0) {\n                diffLat = -diffLat;\n                diffLon = -diffLon;\n            }\n        }\n    }\n\n    if(reader->library->version == 0) {\n        if(!ZDDecodeVariableLengthSigned(reader->library, &reader->polygonIndex, &diffLat)) return -1;\n        if(!ZDDecodeVariableLengthSigned(reader->library, &reader->polygonIndex, &diffLon)) return -1;\n    }\n\n    if(!reader->done) {\n        reader->pointLat += diffLat;\n        reader->pointLon += diffLon;\n        if(reader->first) {\n            reader->firstLat = reader->pointLat;\n            reader->firstLon = reader->pointLon;\n        }\n    } else {\n        /* Close the polygon (the closing point is not encoded) */\n        reader->pointLat = reader->firstLat;\n        reader->pointLon = reader->firstLon;\n        reader->done = 2;\n    }\n\n    reader->first = 0;\n\n    if(reader->library->version == 0) {\n        reader->numVertices--;\n        if(!reader->numVertices) {\n            reader->done = 1;\n        }\n        if(!diffLat && !diffLon) {\n            goto readNewPoint;\n        }\n    }\n\n    if(referenceDone) {\n        reader->referenceDirection = 0;\n    }\n\n    if(pointLat) {\n        *pointLat = reader->pointLat;\n    }\n\n    if(pointLon) {\n        *pointLon = reader->pointLon;\n    }\n\n    return 1;\n}\n\nstatic int ZDFindPolygon(const ZoneDetect *library, uint32_t wantedId, uint32_t* metadataIndexPtr, uint32_t* polygonIndexPtr)\n{\n    uint32_t polygonId = 0;\n    uint32_t bboxIndex = library->bboxOffset;\n\n    uint32_t metadataIndex = 0, polygonIndex = 0;\n\n    while(bboxIndex < library->metadataOffset) {\n        uint64_t polygonIndexDelta;\n        int32_t metadataIndexDelta;\n        int32_t tmp;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &tmp)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &tmp)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &tmp)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &tmp)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &metadataIndexDelta)) break;\n        if(!ZDDecodeVariableLengthUnsigned(library, &bboxIndex, &polygonIndexDelta)) break;\n\n        metadataIndex += (uint32_t)metadataIndexDelta;\n        polygonIndex += (uint32_t)polygonIndexDelta;\n\n        if(polygonId == wantedId) {\n            if(metadataIndexPtr) {\n                metadataIndex += library->metadataOffset;\n                *metadataIndexPtr = metadataIndex;\n            }\n            if(polygonIndexPtr) {\n                polygonIndex += library->dataOffset;\n                *polygonIndexPtr = polygonIndex;\n            }\n            return 1;\n        }\n\n        polygonId ++;\n    }\n\n    return 0;\n}\n\nstatic int32_t* ZDPolygonToListInternal(const ZoneDetect *library, uint32_t polygonIndex, size_t* length)\n{\n    struct Reader reader;\n    ZDReaderInit(&reader, library, polygonIndex);\n\n    size_t listLength = 2 * 100;\n    size_t listIndex = 0;\n\n    int32_t* list = malloc(sizeof(int32_t) * listLength);\n    if(!list) {\n        goto fail;\n    }\n\n    while(1) {\n        int32_t pointLat, pointLon;\n        int result = ZDReaderGetPoint(&reader, &pointLat, &pointLon);\n        if(result < 0) {\n            goto fail;\n        } else if(result == 0) {\n            break;\n        }\n\n        if(listIndex >= listLength) {\n            listLength *= 2;\n            if(listLength >= 1048576) {\n                goto fail;\n            }\n\n            list = realloc(list, sizeof(int32_t) * listLength);\n            if(!list) {\n                goto fail;\n            }\n        }\n\n        list[listIndex++] = pointLat;\n        list[listIndex++] = pointLon;\n    }\n\n    if(length) {\n        *length = listIndex;\n    }\n\n    return list;\n\nfail:\n    if(list) {\n        free(list);\n    }\n    return NULL;\n}\n\nfloat* ZDPolygonToList(const ZoneDetect *library, uint32_t polygonId, size_t* lengthPtr)\n{\n    uint32_t polygonIndex;\n    int32_t* data = NULL;\n    float* flData = NULL;\n\n    if(!ZDFindPolygon(library, polygonId, NULL, &polygonIndex)) {\n        goto fail;\n    }\n\n    size_t length = 0;\n    data = ZDPolygonToListInternal(library, polygonIndex, &length);\n\n    if(!data) {\n        goto fail;\n    }\n\n    flData = malloc(sizeof(float) * length);\n    if(!flData) {\n        goto fail;\n    }\n\n    size_t i;\n    for(i = 0; i<length; i+= 2) {\n        int32_t lat = data[i];\n        int32_t lon = data[i+1];\n\n        flData[i] = ZDFixedPointToFloat(lat, 90, library->precision);\n        flData[i+1] = ZDFixedPointToFloat(lon, 180, library->precision);\n    }\n\n    if(lengthPtr) {\n        *lengthPtr = length;\n    }\n\n    return flData;\n\nfail:\n    if(data) {\n        free(data);\n    }\n    if(flData) {\n        free(flData);\n    }\n    return NULL;\n}\n\nstatic ZDLookupResult ZDPointInPolygon(const ZoneDetect *library, uint32_t polygonIndex, int32_t latFixedPoint, int32_t lonFixedPoint, uint64_t *distanceSqrMin)\n{\n    int32_t pointLat, pointLon, prevLat = 0, prevLon = 0;\n    int prevQuadrant = 0, winding = 0;\n\n    uint8_t first = 1;\n\n    struct Reader reader;\n    ZDReaderInit(&reader, library, polygonIndex);\n\n    while(1) {\n        int result = ZDReaderGetPoint(&reader, &pointLat, &pointLon);\n        if(result < 0) {\n            return ZD_LOOKUP_PARSE_ERROR;\n        } else if(result == 0) {\n            break;\n        }\n\n        /* Check if point is ON the border */\n        if(pointLat == latFixedPoint && pointLon == lonFixedPoint) {\n            if(distanceSqrMin) *distanceSqrMin = 0;\n            return ZD_LOOKUP_ON_BORDER_VERTEX;\n        }\n\n        /* Find quadrant */\n        int quadrant;\n        if(pointLat >= latFixedPoint) {\n            if(pointLon >= lonFixedPoint) {\n                quadrant = 0;\n            } else {\n                quadrant = 1;\n            }\n        } else {\n            if(pointLon >= lonFixedPoint) {\n                quadrant = 3;\n            } else {\n                quadrant = 2;\n            }\n        }\n\n        if(!first) {\n            int windingNeedCompare = 0, lineIsStraight = 0;\n            float a = 0, b = 0;\n\n            /* Calculate winding number */\n            if(quadrant == prevQuadrant) {\n                /* Do nothing */\n            } else if(quadrant == (prevQuadrant + 1) % 4) {\n                winding ++;\n            } else if((quadrant + 1) % 4 == prevQuadrant) {\n                winding --;\n            } else {\n                windingNeedCompare = 1;\n            }\n\n            /* Avoid horizontal and vertical lines */\n            if((pointLon == prevLon || pointLat == prevLat)) {\n                lineIsStraight = 1;\n            }\n\n            /* Calculate the parameters of y=ax+b if needed */\n            if(!lineIsStraight && (distanceSqrMin || windingNeedCompare)) {\n                a = ((float)pointLat - (float)prevLat) / ((float)pointLon - (float)prevLon);\n                b = (float)pointLat - a * (float)pointLon;\n            }\n\n            int onStraight = ZDPointInBox(pointLat, latFixedPoint, prevLat, pointLon, lonFixedPoint, prevLon);\n            if(lineIsStraight && (onStraight || windingNeedCompare)) {\n                if(distanceSqrMin) *distanceSqrMin = 0;\n                return ZD_LOOKUP_ON_BORDER_SEGMENT;\n            }\n\n            /* Jumped two quadrants. */\n            if(windingNeedCompare) {\n                /* Check if the target is on the border */\n                const int32_t intersectLon = (int32_t)(((float)latFixedPoint - b) / a);\n                if(intersectLon >= lonFixedPoint-1 && intersectLon <= lonFixedPoint+1) {\n                    if(distanceSqrMin) *distanceSqrMin = 0;\n                    return ZD_LOOKUP_ON_BORDER_SEGMENT;\n                }\n\n                /* Ok, it's not. In which direction did we go round the target? */\n                const int sign = (intersectLon < lonFixedPoint) ? 2 : -2;\n                if(quadrant == 2 || quadrant == 3) {\n                    winding += sign;\n                } else {\n                    winding -= sign;\n                }\n            }\n\n            /* Calculate closest point on line (if needed) */\n            if(distanceSqrMin) {\n                float closestLon, closestLat;\n                if(!lineIsStraight) {\n                    closestLon = ((float)lonFixedPoint + a * (float)latFixedPoint - a * b) / (a * a + 1);\n                    closestLat = (a * ((float)lonFixedPoint + a * (float)latFixedPoint) + b) / (a * a + 1);\n                } else {\n                    if(pointLon == prevLon) {\n                        closestLon = (float)pointLon;\n                        closestLat = (float)latFixedPoint;\n                    } else {\n                        closestLon = (float)lonFixedPoint;\n                        closestLat = (float)pointLat;\n                    }\n                }\n\n                const int closestInBox = ZDPointInBox(pointLon, (int32_t)closestLon, prevLon, pointLat, (int32_t)closestLat, prevLat);\n\n                int64_t diffLat, diffLon;\n                if(closestInBox) {\n                    /* Calculate squared distance to segment. */\n                    diffLat = (int64_t)(closestLat - (float)latFixedPoint);\n                    diffLon = (int64_t)(closestLon - (float)lonFixedPoint);\n                } else {\n                    /*\n                     * Calculate squared distance to vertices\n                     * It is enough to check the current point since the polygon is closed.\n                     */\n                    diffLat = (int64_t)(pointLat - latFixedPoint);\n                    diffLon = (int64_t)(pointLon - lonFixedPoint);\n                }\n\n                /* Note: lon has half scale */\n                uint64_t distanceSqr = (uint64_t)(diffLat * diffLat) + (uint64_t)(diffLon * diffLon) * 4;\n                if(distanceSqr < *distanceSqrMin) *distanceSqrMin = distanceSqr;\n            }\n        }\n\n        prevQuadrant = quadrant;\n        prevLat = pointLat;\n        prevLon = pointLon;\n        first = 0;\n    };\n\n    if(winding == -4) {\n        return ZD_LOOKUP_IN_ZONE;\n    } else if(winding == 4) {\n        return ZD_LOOKUP_IN_EXCLUDED_ZONE;\n    } else if(winding == 0) {\n        return ZD_LOOKUP_NOT_IN_ZONE;\n    }\n\n    /* Should not happen */\n    if(distanceSqrMin) *distanceSqrMin = 0;\n    return ZD_LOOKUP_ON_BORDER_SEGMENT;\n}\n\nvoid ZDCloseDatabase(ZoneDetect *library)\n{\n    if(library) {\n        if(library->fieldNames) {\n            size_t i;\n            for(i = 0; i < (size_t)library->numFields; i++) {\n                if(library->fieldNames[i]) {\n                    free(library->fieldNames[i]);\n                }\n            }\n            free(library->fieldNames);\n        }\n        if(library->notice) {\n            free(library->notice);\n        }\n\n        if(library->closeType == 0) {\n#if defined(_MSC_VER) || defined(__MINGW32__)\n            if(library->mapping && !UnmapViewOfFile(library->mapping)) zdError(ZD_E_DB_MUNMAP_MSVIEW, (int)GetLastError());\n            if(library->fdMap && !CloseHandle(library->fdMap))         zdError(ZD_E_DB_MUNMAP, (int)GetLastError());\n            if(library->fd && !CloseHandle(library->fd))               zdError(ZD_E_DB_CLOSE, (int)GetLastError());\n#elif defined(__APPLE__) || defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION)\n            if(library->mapping && munmap(library->mapping, (size_t)(library->length))) zdError(ZD_E_DB_MUNMAP, 0);\n            if(library->fd >= 0 && close(library->fd))                                  zdError(ZD_E_DB_CLOSE, 0);\n#endif\n        }\n\n        free(library);\n    }\n}\n\nZoneDetect *ZDOpenDatabaseFromMemory(void* buffer, size_t length)\n{\n    ZoneDetect *const library = malloc(sizeof *library);\n\n    if(library) {\n        memset(library, 0, sizeof(*library));\n        library->closeType = 1;\n        library->length = (long int)length;\n\n        if(library->length <= 0) {\n#if defined(_MSC_VER) || defined(__MINGW32__) || defined(__APPLE__) || defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION)\n            zdError(ZD_E_DB_SEEK, errno);\n#else\n            zdError(ZD_E_DB_SEEK, 0);\n#endif\n            goto fail;\n        }\n\n        library->mapping = buffer;\n\n        /* Parse the header */\n        if(ZDParseHeader(library)) {\n            zdError(ZD_E_PARSE_HEADER, 0);\n            goto fail;\n        }\n    }\n\n    return library;\n\nfail:\n    ZDCloseDatabase(library);\n    return NULL;\n}\n\nZoneDetect *ZDOpenDatabase(const char *path)\n{\n    ZoneDetect *const library = malloc(sizeof *library);\n\n    if(library) {\n        memset(library, 0, sizeof(*library));\n\n#if defined(_MSC_VER) || defined(__MINGW32__)\n        library->fd = CreateFile(path, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);\n        if (library->fd == INVALID_HANDLE_VALUE) {\n            zdError(ZD_E_DB_OPEN, (int)GetLastError());\n            goto fail;\n        }\n\n        const DWORD fsize = GetFileSize(library->fd, NULL);\n        if (fsize == INVALID_FILE_SIZE) {\n            zdError(ZD_E_DB_SEEK, (int)GetLastError());\n            goto fail;\n        }\n        library->length = (int32_t)fsize;\n\n        library->fdMap = CreateFileMappingA(library->fd, NULL, PAGE_READONLY, 0, 0, NULL);\n        if (!library->fdMap) {\n            zdError(ZD_E_DB_MMAP, (int)GetLastError());\n            goto fail;\n        }\n\n        library->mapping = MapViewOfFile(library->fdMap, FILE_MAP_READ, 0, 0, 0);\n        if (!library->mapping) {\n            zdError(ZD_E_DB_MMAP_MSVIEW, (int)GetLastError());\n            goto fail;\n        }\n#elif defined(__APPLE__) || defined(__linux__) || defined(__unix__) || defined(_POSIX_VERSION)\n        library->fd = open(path, O_RDONLY | O_CLOEXEC);\n        if(library->fd < 0) {\n            zdError(ZD_E_DB_OPEN, errno);\n            goto fail;\n        }\n\n        library->length = lseek(library->fd, 0, SEEK_END);\n        if(library->length <= 0 || library->length > 50331648) {\n            zdError(ZD_E_DB_SEEK, errno);\n            goto fail;\n        }\n        lseek(library->fd, 0, SEEK_SET);\n\n        library->mapping = mmap(NULL, (size_t)library->length, PROT_READ, MAP_PRIVATE | MAP_FILE, library->fd, 0);\n        if(library->mapping == MAP_FAILED) {\n            zdError(ZD_E_DB_MMAP, errno);\n            goto fail;\n        }\n#endif\n\n        /* Parse the header */\n        if(ZDParseHeader(library)) {\n            zdError(ZD_E_PARSE_HEADER, 0);\n            goto fail;\n        }\n    }\n\n    return library;\n\nfail:\n    ZDCloseDatabase(library);\n    return NULL;\n}\n\nZoneDetectResult *ZDLookup(const ZoneDetect *library, float lat, float lon, float *safezone)\n{\n    const int32_t latFixedPoint = ZDFloatToFixedPoint(lat, 90, library->precision);\n    const int32_t lonFixedPoint = ZDFloatToFixedPoint(lon, 180, library->precision);\n    size_t numResults = 0;\n    uint64_t distanceSqrMin = (uint64_t)-1;\n\n    /* Iterate over all polygons */\n    uint32_t bboxIndex = library->bboxOffset;\n    uint32_t metadataIndex = 0;\n    uint32_t polygonIndex = 0;\n\n    ZoneDetectResult *results = malloc(sizeof *results);\n    if(!results) {\n        return NULL;\n    }\n\n    uint32_t polygonId = 0;\n\n    while(bboxIndex < library->metadataOffset) {\n        int32_t minLat, minLon, maxLat, maxLon, metadataIndexDelta;\n        uint64_t polygonIndexDelta;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &minLat)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &minLon)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &maxLat)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &maxLon)) break;\n        if(!ZDDecodeVariableLengthSigned(library, &bboxIndex, &metadataIndexDelta)) break;\n        if(!ZDDecodeVariableLengthUnsigned(library, &bboxIndex, &polygonIndexDelta)) break;\n\n        metadataIndex += (uint32_t)metadataIndexDelta;\n        polygonIndex += (uint32_t)polygonIndexDelta;\n\n        if(latFixedPoint >= minLat) {\n            if(latFixedPoint <= maxLat &&\n                    lonFixedPoint >= minLon &&\n                    lonFixedPoint <= maxLon) {\n\n                const ZDLookupResult lookupResult = ZDPointInPolygon(library, library->dataOffset + polygonIndex, latFixedPoint, lonFixedPoint, (safezone) ? &distanceSqrMin : NULL);\n                if(lookupResult == ZD_LOOKUP_PARSE_ERROR) {\n                    break;\n                } else if(lookupResult != ZD_LOOKUP_NOT_IN_ZONE) {\n                    ZoneDetectResult *const newResults = realloc(results, sizeof *newResults * (numResults + 2));\n\n                    if(newResults) {\n                        results = newResults;\n                        results[numResults].polygonId = polygonId;\n                        results[numResults].metaId = metadataIndex;\n                        results[numResults].numFields = library->numFields;\n                        results[numResults].fieldNames = library->fieldNames;\n                        results[numResults].lookupResult = lookupResult;\n\n                        numResults++;\n                    } else {\n                        break;\n                    }\n                }\n            }\n        } else {\n            /* The data is sorted along minLat */\n            break;\n        }\n\n        polygonId++;\n    }\n\n    /* Clean up results */\n    size_t i;\n    for(i = 0; i < numResults; i++) {\n        int insideSum = 0;\n        ZDLookupResult overrideResult = ZD_LOOKUP_IGNORE;\n        size_t j;\n        for(j = i; j < numResults; j++) {\n            if(results[i].metaId == results[j].metaId) {\n                ZDLookupResult tmpResult = results[j].lookupResult;\n                results[j].lookupResult = ZD_LOOKUP_IGNORE;\n\n                /* This is the same result. Is it an exclusion zone? */\n                if(tmpResult == ZD_LOOKUP_IN_ZONE) {\n                    insideSum++;\n                } else if(tmpResult == ZD_LOOKUP_IN_EXCLUDED_ZONE) {\n                    insideSum--;\n                } else {\n                    /* If on the bodrder then the final result is on the border */\n                    overrideResult = tmpResult;\n                }\n\n            }\n        }\n\n        if(overrideResult != ZD_LOOKUP_IGNORE) {\n            results[i].lookupResult = overrideResult;\n        } else {\n            if(insideSum) {\n                results[i].lookupResult = ZD_LOOKUP_IN_ZONE;\n            }\n        }\n    }\n\n    /* Remove zones to ignore */\n    size_t newNumResults = 0;\n    for(i = 0; i < numResults; i++) {\n        if(results[i].lookupResult != ZD_LOOKUP_IGNORE) {\n            results[newNumResults] = results[i];\n            newNumResults++;\n        }\n    }\n    numResults = newNumResults;\n\n    /* Lookup metadata */\n    for(i = 0; i < numResults; i++) {\n        uint32_t tmpIndex = library->metadataOffset + results[i].metaId;\n        results[i].data = malloc(library->numFields * sizeof *results[i].data);\n        if(results[i].data) {\n            size_t j;\n            for(j = 0; j < library->numFields; j++) {\n                results[i].data[j] = ZDParseString(library, &tmpIndex);\n                if (!results[i].data[j]) {\n                    /* free all allocated memory */\n                    size_t m;\n                    for(m = 0; m < j; m++) {\n                        if(results[i].data[m]) {\n                            free(results[i].data[m]);\n                        }\n                    }\n                    size_t k;\n                    for(k = 0; k < i; k++) {\n                        size_t l;\n                        for(l = 0; l < (size_t)results[k].numFields; l++) {\n                            if(results[k].data[l]) {\n                                free(results[k].data[l]);\n                            }\n                        }\n                        if (results[k].data) {\n                            free(results[k].data);\n                        }\n                    }\n                    free(results);\n                    return NULL;\n                }\n            }\n        }\n        else {\n            /* free all allocated memory */\n            size_t k;\n            for(k = 0; k < i; k++) {\n                size_t l;\n                for(l = 0; l < (size_t)results[k].numFields; l++) {\n                    if(results[k].data[l]) {\n                        free(results[k].data[l]);\n                    }\n                }\n                if (results[k].data) {\n                    free(results[k].data);\n                }\n            }\n            free(results);\n            return NULL;\n        }\n    }\n\n    /* Write end marker */\n    results[numResults].lookupResult = ZD_LOOKUP_END;\n    results[numResults].numFields = 0;\n    results[numResults].fieldNames = NULL;\n    results[numResults].data = NULL;\n\n    if(safezone) {\n        *safezone = sqrtf((float)distanceSqrMin) * 90 / (float)(1 << (library->precision - 1));\n    }\n\n    return results;\n}\n\nvoid ZDFreeResults(ZoneDetectResult *results)\n{\n    unsigned int index = 0;\n\n    if(!results) {\n        return;\n    }\n\n    while(results[index].lookupResult != ZD_LOOKUP_END) {\n        if(results[index].data) {\n            size_t i;\n            for(i = 0; i < (size_t)results[index].numFields; i++) {\n                if(results[index].data[i]) {\n                    free(results[index].data[i]);\n                }\n            }\n            free(results[index].data);\n        }\n        index++;\n    }\n    free(results);\n}\n\nconst char *ZDGetNotice(const ZoneDetect *library)\n{\n    return library->notice;\n}\n\nuint8_t ZDGetTableType(const ZoneDetect *library)\n{\n    return library->tableType;\n}\n\nconst char *ZDLookupResultToString(ZDLookupResult result)\n{\n    switch(result) {\n        case ZD_LOOKUP_IGNORE:\n            return \"Ignore\";\n        case ZD_LOOKUP_END:\n            return \"End\";\n        case ZD_LOOKUP_PARSE_ERROR:\n            return \"Parsing error\";\n        case ZD_LOOKUP_NOT_IN_ZONE:\n            return \"Not in zone\";\n        case ZD_LOOKUP_IN_ZONE:\n            return \"In zone\";\n        case ZD_LOOKUP_IN_EXCLUDED_ZONE:\n            return \"In excluded zone\";\n        case ZD_LOOKUP_ON_BORDER_VERTEX:\n            return \"Target point is border vertex\";\n        case ZD_LOOKUP_ON_BORDER_SEGMENT:\n            return \"Target point is on border\";\n    }\n\n    return \"Unknown\";\n}\n\n#define ZD_E_COULD_NOT(msg) \"could not \" msg\n\nconst char *ZDGetErrorString(int errZD)\n{\n    switch ((enum ZDInternalError)errZD) {\n        default:\n            assert(0);\n        case ZD_OK                :\n            return \"\";\n        case ZD_E_DB_OPEN         :\n            return ZD_E_COULD_NOT(\"open database file\");\n        case ZD_E_DB_SEEK         :\n            return ZD_E_COULD_NOT(\"retrieve database file size\");\n        case ZD_E_DB_MMAP         :\n            return ZD_E_COULD_NOT(\"map database file to system memory\");\n#if defined(_MSC_VER) || defined(__MINGW32__)\n        case ZD_E_DB_MMAP_MSVIEW  :\n            return ZD_E_COULD_NOT(\"open database file view\");\n        case ZD_E_DB_MAP_EXCEPTION:\n            return \"I/O exception occurred while accessing database file view\";\n        case ZD_E_DB_MUNMAP_MSVIEW:\n            return ZD_E_COULD_NOT(\"close database file view\");\n#endif\n        case ZD_E_DB_MUNMAP       :\n            return ZD_E_COULD_NOT(\"unmap database\");\n        case ZD_E_DB_CLOSE        :\n            return ZD_E_COULD_NOT(\"close database file\");\n        case ZD_E_PARSE_HEADER    :\n            return ZD_E_COULD_NOT(\"parse database header\");\n    }\n}\n\n#undef ZD_E_COULD_NOT\n\nint ZDSetErrorHandler(void (*handler)(int, int))\n{\n    zdErrorHandler = handler;\n    return 0;\n}\n\nchar* ZDHelperSimpleLookupString(const ZoneDetect* library, float lat, float lon)\n{\n    ZoneDetectResult *result = ZDLookup(library, lat, lon, NULL);\n    if(!result) {\n        return NULL;\n    }\n\n    char* output = NULL;\n\n    if(result[0].lookupResult == ZD_LOOKUP_END) {\n        goto done;\n    }\n\n    char* strings[2] = {NULL};\n\n    unsigned int i;\n    for(i = 0; i < result[0].numFields; i++) {\n        if(result[0].fieldNames[i] && result[0].data[i]) {\n            if(library->tableType == 'T') {\n                if(!strcmp(result[0].fieldNames[i], \"TimezoneIdPrefix\")) {\n                    strings[0] = result[0].data[i];\n                }\n                if(!strcmp(result[0].fieldNames[i], \"TimezoneId\")) {\n                    strings[1] = result[0].data[i];\n                }\n            }\n            if(library->tableType == 'C') {\n                if(!strcmp(result[0].fieldNames[i], \"Name\")) {\n                    strings[0] = result[0].data[i];\n                }\n            }\n        }\n    }\n\n    size_t length = 0;\n    for(i=0; i<sizeof(strings)/sizeof(char*); i++) {\n        if(strings[i]) {\n            size_t partLength = strlen(strings[i]);\n            if(partLength > 512) {\n                goto done;\n            }\n            length += partLength;\n        }\n    }\n\n    if(length == 0) {\n        goto done;\n    }\n\n    length += 1;\n\n    output = (char*)malloc(length);\n    if(output) {\n        output[0] = 0;\n        for(i=0; i<sizeof(strings)/sizeof(char*); i++) {\n            if(strings[i]) {\n#if defined(_MSC_VER)\n                strcat_s(output + strlen(output), length-strlen(output), strings[i]);\n#else\n                strcat(output + strlen(output), strings[i]);\n#endif\n            }\n        }\n    }\n\ndone:\n    ZDFreeResults(result);\n    return output;\n}\n\nvoid ZDHelperSimpleLookupStringFree(char* str)\n{\n    free(str);\n}\n"
  },
  {
    "path": "core/zonedetect.h",
    "content": "/*\n * Copyright (c) 2018, Bertold Van den Bergh (vandenbergh@bertold.org)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the author nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n\n#ifndef INCL_ZONEDETECT_H_\n#define INCL_ZONEDETECT_H_\n\n#if !defined(ZD_EXPORT)\n#if defined(_MSC_VER)\n#define ZD_EXPORT __declspec(dllimport)\n#else\n#define ZD_EXPORT\n#endif\n#endif\n\ntypedef enum {\n    ZD_LOOKUP_IGNORE = -3,\n    ZD_LOOKUP_END = -2,\n    ZD_LOOKUP_PARSE_ERROR = -1,\n    ZD_LOOKUP_NOT_IN_ZONE = 0,\n    ZD_LOOKUP_IN_ZONE = 1,\n    ZD_LOOKUP_IN_EXCLUDED_ZONE = 2,\n    ZD_LOOKUP_ON_BORDER_VERTEX = 3,\n    ZD_LOOKUP_ON_BORDER_SEGMENT = 4\n} ZDLookupResult;\n\ntypedef struct {\n    ZDLookupResult lookupResult;\n\n    uint32_t polygonId;\n    uint32_t metaId;\n    uint8_t numFields;\n    char **fieldNames;\n    char **data;\n} ZoneDetectResult;\n\nstruct ZoneDetectOpaque;\ntypedef struct ZoneDetectOpaque ZoneDetect;\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nZD_EXPORT ZoneDetect *ZDOpenDatabase(const char *path);\nZD_EXPORT ZoneDetect *ZDOpenDatabaseFromMemory(void* buffer, size_t length);\nZD_EXPORT void        ZDCloseDatabase(ZoneDetect *library);\n\nZD_EXPORT ZoneDetectResult *ZDLookup(const ZoneDetect *library, float lat, float lon, float *safezone);\nZD_EXPORT void              ZDFreeResults(ZoneDetectResult *results);\n\nZD_EXPORT const char *ZDGetNotice(const ZoneDetect *library);\nZD_EXPORT uint8_t     ZDGetTableType(const ZoneDetect *library);\nZD_EXPORT const char *ZDLookupResultToString(ZDLookupResult result);\n\nZD_EXPORT int         ZDSetErrorHandler(void (*handler)(int, int));\nZD_EXPORT const char *ZDGetErrorString(int errZD);\n\nZD_EXPORT float* ZDPolygonToList(const ZoneDetect *library, uint32_t polygonId, size_t* length);\n\nZD_EXPORT char* ZDHelperSimpleLookupString(const ZoneDetect* library, float lat, float lon);\nZD_EXPORT void ZDHelperSimpleLookupStringFree(char* str);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif // INCL_ZONEDETECT_H_\n"
  },
  {
    "path": "cwkey/CWKeyer.cpp",
    "content": "#include \"CWKeyer.h\"\n#include \"cwkey/drivers/CWKey.h\"\n#include \"cwkey/drivers/CWDummyKey.h\"\n#include \"cwkey/drivers/CWWinKey.h\"\n#include \"cwkey/drivers/CWCatKey.h\"\n#include \"cwkey/drivers/CWDaemonKey.h\"\n#include \"cwkey/drivers/CWFldigiKey.h\"\n#include \"core/debug.h\"\n#include \"data/CWKeyProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.cwkeyer\");\n\n#define TIME_PERIOD 1000\n\nvoid CWKeyer::start()\n{\n    FCT_IDENTIFICATION;\n\n    timer = new QTimer(this);\n    connect(timer, &QTimer::timeout, this, &CWKeyer::update);\n    timer->start(TIME_PERIOD);\n}\n\nvoid CWKeyer::stopTimer()\n{\n    FCT_IDENTIFICATION;\n    bool check = QMetaObject::invokeMethod(CWKeyer::instance(), &CWKeyer::stopTimerImplt, Qt::QueuedConnection);\n    Q_ASSERT( check );\n}\n\nvoid CWKeyer::update()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n    if ( !cwKeyLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        return;\n    }\n    qCDebug(runtime) << \"Updating key state\";\n\n    if ( !cwKey )\n    {\n        cwKeyLock.unlock();\n        return;\n    }\n\n    CWKeyProfile currCWProfile = CWKeyProfilesManager::instance()->getCurProfile1();\n    /***********************************************************/\n    /* Is Opened Profile still the globbaly used CW Profile ? */\n    /* if NO then reconnect it                                 */\n    /***********************************************************/\n    if ( currCWProfile != connectedCWKeyProfile)\n    {\n        /* CW Key Profile Changed\n         * Need to reconnect CW Key\n         */\n        qCDebug(runtime) << \"Reconnecting to a new CW Key - \" << currCWProfile.profileName << \"; Old - \" << connectedCWKeyProfile.profileName;\n        __openCWKey();\n    }\n    timer->start(TIME_PERIOD);\n    cwKeyLock.unlock();\n}\n\nvoid CWKeyer::open()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &CWKeyer::openImpl, Qt::QueuedConnection);\n}\n\nvoid CWKeyer::openImpl()\n{\n    FCT_IDENTIFICATION;\n\n    cwKeyLock.lock();\n    __openCWKey();\n    cwKeyLock.unlock();\n}\n\nvoid CWKeyer::__openCWKey()\n{\n    FCT_IDENTIFICATION;\n\n    // if cw keys is active then close it\n    __closeCWKey();\n\n    CWKeyProfile newProfile = CWKeyProfilesManager::instance()->getCurProfile1();\n\n    if ( newProfile == CWKeyProfile() )\n    {\n        emit cwKeyerError(tr(\"No CW Keyer Profile selected\"),\n                          QString());\n\n        return;\n    }\n\n    qCDebug(runtime) << \"Opening profile name: \" << newProfile.profileName;\n\n    switch ( newProfile.model )\n    {\n    case CWKey::DUMMY_KEYER:\n        cwKey = new CWDummyKey(this);\n        break;\n    case CWKey::WINKEY_KEYER:\n        cwKey = new CWWinKey(newProfile.portPath,\n                              newProfile.baudrate,\n                              newProfile.keyMode,\n                              newProfile.defaultSpeed,\n                              newProfile.paddleSwap,\n                              newProfile.paddleOnlySidetone,\n                              newProfile.sidetoneFrequency,\n                              this);\n        break;\n    case CWKey::MORSEOVERCAT:\n        cwKey = new CWCatKey(newProfile.keyMode,\n                             newProfile.defaultSpeed,\n                             this);\n        break;\n     case CWKey::CWDAEMON_KEYER:\n        cwKey = new CWDaemonKey(newProfile.hostname,\n                                newProfile.netport,\n                                newProfile.keyMode,\n                                newProfile.defaultSpeed,\n                                newProfile.sidetoneFrequency,\n                                this);\n        break;\n    case CWKey::FLDIGI_KEYER:\n       cwKey = new CWFldigiKey(newProfile.hostname,\n                               newProfile.netport,\n                               newProfile.keyMode,\n                               newProfile.defaultSpeed,\n                               this);\n        break;\n    default:\n        cwKey = nullptr;\n        qWarning() << \"Unsupported Key Model \" << newProfile.model;\n    }\n\n    if ( !cwKey )\n    {\n        // initialization failed\n        emit cwKeyerError(tr(\"Initialization Error\"),\n                          tr(\"Internal Error\"));\n        return;\n    }\n\n    if ( !cwKey->open() )\n    {\n        emit cwKeyerError(tr(\"Connection Error\"),\n                          tr(\"Cannot open the Keyer connection\"));\n        qWarning() << cwKey->lastError();\n        __closeCWKey();\n        return;\n    }\n\n    connect(cwKey, &CWKey::keyError, this, &CWKeyer::keyErrorHandler);\n    connect(cwKey, &CWKey::keyChangedWPMSpeed, this, &CWKeyer::cwKeyWPMChangedHandler);\n    connect(cwKey, &CWKey::keyEchoText, this, &CWKeyer::cwKeyEchoTextHandler);\n    connect(cwKey, &CWKey::keyHWButton1Pressed, this, &CWKeyer::cwKeyHWButton1PressedHandler);\n    connect(cwKey, &CWKey::keyHWButton2Pressed, this, &CWKeyer::cwKeyHWButton2PressedHandler);\n    connect(cwKey, &CWKey::keyHWButton3Pressed, this, &CWKeyer::cwKeyHWButton3PressedHandler);\n    connect(cwKey, &CWKey::keyHWButton4Pressed, this, &CWKeyer::cwKeyHWButton4PressedHandler);\n\n    connectedCWKeyProfile = newProfile;\n\n    emit cwKeyConnected(connectedCWKeyProfile.profileName);\n}\n\nvoid CWKeyer::close()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &CWKeyer::closeImpl, Qt::QueuedConnection);\n}\n\nbool CWKeyer::canStopSending()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey )\n    {\n        return false;\n    }\n\n    bool ret = cwKey->canStopSending();\n\n    return ret;\n}\n\nbool CWKeyer::canEchoChar()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey )\n    {\n        return false;\n    }\n\n    bool ret = cwKey->canEchoChar();\n\n    return ret;\n}\n\nbool CWKeyer::rigMustConnected()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey )\n    {\n        return false;\n    }\n\n\n    bool ret = cwKey->mustRigConnected();\n\n    return ret;\n}\n\nbool CWKeyer::canSetSpeed()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey )\n    {\n        return false;\n    }\n\n    bool ret = cwKey->canSetSpeed();\n\n    return ret;\n}\n\nvoid CWKeyer::closeImpl()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n    cwKeyLock.lock();\n    qCDebug(runtime) << \"Using Key\";\n    __closeCWKey();\n    cwKeyLock.unlock();\n}\n\nvoid CWKeyer::__closeCWKey()\n{\n    FCT_IDENTIFICATION;\n\n    connectedCWKeyProfile = CWKeyProfile();\n\n    if ( cwKey )\n    {\n        cwKey->close();\n        cwKey->deleteLater();\n        cwKey = nullptr;\n    }\n\n    emit cwKeyDisconnected();\n}\n\nvoid CWKeyer::setSpeed(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"setSpeedImpl\",\n                              Qt::QueuedConnection,\n                              Q_ARG(qint16, wpm));\n}\n\nvoid CWKeyer::setSpeedImpl(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey ) return;\n\n    cwKey->setWPM(wpm);\n}\n\nvoid CWKeyer::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"sendTextImpl\",\n                              Qt::QueuedConnection,\n                              Q_ARG(QString, text));\n}\n\nvoid CWKeyer::sendTextImpl(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey ) return;\n\n    cwKey->sendText(text);\n}\n\nvoid CWKeyer::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"immediatelyStopImpl\",\n                              Qt::QueuedConnection);\n}\n\nvoid CWKeyer::immediatelyStopImpl()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for cwkey mutex\";\n\n    QMutexLocker locker(&cwKeyLock);\n\n    qCDebug(runtime) << \"Using Key\";\n\n    if ( !cwKey ) return;\n\n    cwKey->immediatelyStop();\n}\n\nvoid CWKeyer::stopTimerImplt()\n{\n    FCT_IDENTIFICATION;\n\n    if ( timer )\n    {\n        timer->stop();\n        timer->deleteLater();\n        timer = nullptr;\n    }\n}\n\nvoid CWKeyer::keyErrorHandler(const QString &main, const QString &detail)\n{\n    FCT_IDENTIFICATION;\n    emit cwKeyerError(main, detail);\n    closeImpl();\n}\n\nvoid CWKeyer::cwKeyWPMChangedHandler(qint32 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    emit cwKeyWPMChanged(wpm);\n}\n\nvoid CWKeyer::cwKeyEchoTextHandler(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    emit cwKeyEchoText(text);\n}\n\nvoid CWKeyer::cwKeyHWButton1PressedHandler()\n{\n    emit cwKeyHWButton(1);\n}\n\nvoid CWKeyer::cwKeyHWButton2PressedHandler()\n{\n    emit cwKeyHWButton(2);\n}\n\nvoid CWKeyer::cwKeyHWButton3PressedHandler()\n{\n    emit cwKeyHWButton(3);\n}\n\nvoid CWKeyer::cwKeyHWButton4PressedHandler()\n{\n    emit cwKeyHWButton(4);\n}\n\nCWKeyer::CWKeyer(QObject *parent ) :\n    QObject(parent),\n    cwKey(nullptr),\n    timer(nullptr)\n{\n    FCT_IDENTIFICATION;\n}\n\nCWKeyer::~CWKeyer()\n{\n    FCT_IDENTIFICATION;\n\n    if ( cwKey )\n    {\n        cwKey->deleteLater();\n    }\n}\n"
  },
  {
    "path": "cwkey/CWKeyer.h",
    "content": "#ifndef QLOG_CWKEY_CWKEYER_H\n#define QLOG_CWKEY_CWKEYER_H\n\n#include <QObject>\n\n#include \"cwkey/drivers/CWKey.h\"\n#include \"data/CWKeyProfile.h\"\n\nclass CWKeyer : public QObject\n{\n    Q_OBJECT\n\npublic:\n    static CWKeyer* instance()\n    {\n        static CWKeyer instance;\n        return &instance;\n    };\n    void stopTimer();\n\nsignals:\n    void cwKeyerError(QString, QString);\n    void cwKeyConnected(QString);\n    void cwKeyDisconnected();\n    void cwKeyWPMChanged(qint32);\n    void cwKeyEchoText(QString);\n    void cwKeyHWButton(int);\n    void cwKeyHWHaltPressed();\n\npublic slots:\n    void start();\n    void update();\n    void open();\n    void close();\n    bool canStopSending();\n    bool canEchoChar();\n    bool rigMustConnected();\n    bool canSetSpeed();\n\n    void setSpeed(const qint16 wpm);\n    void sendText(const QString&);\n    void immediatelyStop();\n\nprivate slots:\n    void openImpl();\n    void closeImpl();\n    void setSpeedImpl(const qint16 wpm);\n    void sendTextImpl(const QString&);\n    void immediatelyStopImpl();\n    void stopTimerImplt();\n    void keyErrorHandler(const QString&, const QString&);\n    void cwKeyWPMChangedHandler(qint32);\n    void cwKeyEchoTextHandler(const QString&);\n    void cwKeyHWButton1PressedHandler();\n    void cwKeyHWButton2PressedHandler();\n    void cwKeyHWButton3PressedHandler();\n    void cwKeyHWButton4PressedHandler();\n\nprivate:\n    explicit CWKeyer(QObject *parent = nullptr);\n    ~CWKeyer();\n\n    void __closeCWKey();\n    void __openCWKey();\n\n    CWKey *cwKey;\n    CWKeyProfile connectedCWKeyProfile;\n    QMutex cwKeyLock;\n    QTimer* timer;\n};\n\n#endif // QLOG_CWKEY_CWKEYER_H\n"
  },
  {
    "path": "cwkey/drivers/CWCatKey.cpp",
    "content": "#include \"CWCatKey.h\"\n#include \"core/debug.h\"\n#include \"rig/Rig.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwcatkey\");\n\nCWCatKey::CWCatKey(const CWKey::CWKeyModeID mode,\n                   const qint32 defaultSpeed,\n                   QObject *parent)\n    : CWKey(mode, defaultSpeed, parent),\n      isKeyConnected(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nCWCatKey::~CWCatKey()\n{\n    FCT_IDENTIFICATION;\n}\n\nbool CWCatKey::open()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n\n    __close();\n\n    /********************************/\n    /* Test if any rig is connected */\n    /********************************/\n    if ( !Rig::instance()->isRigConnected() )\n    {\n        qWarning() << \"Rig is not connected\";\n        lastErrorText = tr(\"No Rig is connected\");\n        __close();\n        return false;\n    }\n    /**************************************/\n    /* Test if the rig has Morse over CAT */\n    /**************************************/\n    if ( !Rig::instance()->isMorseOverCatSupported() )\n    {\n        qWarning() << \"Rig does not support Morse over CAT\";\n        lastErrorText = tr(\"Rig does not support Morse over CAT\");\n        __close();\n        return false;\n    }\n\n    /********************************************/\n    /* Rig must be in CW mode                   */\n    /* swith the rig to CW mode ?               */\n    /* Maybe Yes - we will see users reaction   */\n    /********************************************/\n    //it has the side-effect that every time you connect,\n    // it causes to switch to CW when the key is assigned.\n    // So let's disable it and see what's worse\n    //Rig::instance()->setMode(\"CW\", QString());\n\n    /*******************/\n    /* set default WPM */\n    /*******************/\n    Rig::instance()->setKeySpeed(defaultWPMSpeed);\n\n    /************************/\n    /* Test if hamlib > 4.0 */\n    /* Stop sending feature */\n    /************************/\n#if (HAMLIBVERSION_MAJOR >= 4)\n    stopSendingCap = 1;\n#endif\n    rigMustConnectedCap = true;\n    isKeyConnected = true;\n    canSetKeySpeed = true;\n    lastErrorText = QString();\n\n    connect(Rig::instance(), &Rig::keySpeedChanged, this, &CWCatKey::rigKeySpeedChanged);\n\n    return true;\n}\n\nbool CWCatKey::close()\n{\n    FCT_IDENTIFICATION;\n    QMutexLocker locker(&commandMutex);\n    isKeyConnected = false;\n\n    return true;\n}\n\nQString CWCatKey::lastError()\n{\n    FCT_IDENTIFICATION;\n\n    return lastErrorText;\n}\n\nbool CWCatKey::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isKeyConnected )\n    {\n        qCDebug(runtime) << \"Cannot send \";\n        emit keyError(tr(\"Cannot send Text to Rig\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    if ( !Rig::instance()->isRigConnected() )\n    {\n        qCDebug(runtime) << \"Cannot send\";\n        emit keyError(tr(\"Cannot send Text to Rig\"), tr(\"Rig is not connected\"));\n        return false;\n    }\n\n    if ( !Rig::instance()->isMorseOverCatSupported() )\n    {\n        qCDebug(runtime) << \"Cannot send\";\n        emit keyError(tr(\"Cannot send Text to Rig\"), tr(\"Rig does not support Morse over CAT\"));\n        return false;\n    }\n\n    QMutexLocker locker(&commandMutex);\n    Rig::instance()->sendMorse(text);\n    return true;\n}\n\nbool CWCatKey::setWPM(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isKeyConnected )\n    {\n        qCDebug(runtime) << \"Cannot set WPM \";\n        emit keyError(tr(\"Cannot set Keyer Speed\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    if ( !Rig::instance()->isRigConnected() )\n    {\n        qCDebug(runtime) << \"Cannot set WPM\";\n        emit keyError(tr(\"Cannot set Keyer Speed\"), tr(\"Rig is not connected\"));\n        return false;\n    }\n\n    QMutexLocker locker(&commandMutex);\n    Rig::instance()->setKeySpeed(wpm); //cat can echo a new Speed therefore\n                                       // emit keyChangedWPMSpeed is not emitted\n\n    return true;\n}\n\nbool CWCatKey::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isKeyConnected )\n    {\n        qCDebug(runtime) << \"Cannot stop\";\n        emit keyError(tr(\"Cannot stop Text Sending\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    if ( !Rig::instance()->isRigConnected() )\n    {\n        qCDebug(runtime) << \"Cannot stop\";\n        emit keyError(tr(\"Cannot stop Text Sending\"), tr(\"Rig is not connected\"));\n        return false;\n    }\n\n    if ( !Rig::instance()->isMorseOverCatSupported() )\n    {\n        qCDebug(runtime) << \"Cannot stop\";\n        emit keyError(tr(\"Cannot stop Text Sending\"), tr(\"Rig does not support Morse over CAT\"));\n        return false;\n    }\n\n    QMutexLocker locker(&commandMutex);\n    Rig::instance()->stopMorse();\n\n    return true;\n}\n\nvoid CWCatKey::__close()\n{\n    FCT_IDENTIFICATION;\n\n    disconnect(Rig::instance(), &Rig::keySpeedChanged, this, &CWCatKey::rigKeySpeedChanged);\n\n    isKeyConnected = false;\n}\n\nvoid CWCatKey::rigKeySpeedChanged(VFOID, unsigned int wpm)\n{\n    FCT_IDENTIFICATION;\n\n    emit keyChangedWPMSpeed(wpm);\n}\n"
  },
  {
    "path": "cwkey/drivers/CWCatKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWCATKEY_H\n#define QLOG_CWKEY_DRIVERS_CWCATKEY_H\n\n#include <QObject>\n#include <QMutex>\n#include \"CWKey.h\"\n#include \"rig/Rig.h\"\n\nclass CWCatKey : public CWKey\n{\n\n    Q_OBJECT\n\npublic:\n    explicit CWCatKey(const CWKey::CWKeyModeID mode,\n                      const qint32 defaultSpeed,\n                      QObject *parent = nullptr);\n    virtual ~CWCatKey();\n\n    virtual bool open() override;\n    virtual bool close() override;\n    virtual QString lastError() override;\n\n    virtual bool sendText(const QString &text) override;\n    virtual bool setWPM(const qint16 wpm) override;\n    virtual bool immediatelyStop() override;\n\nprivate:\n    QMutex commandMutex;\n    bool isKeyConnected;\n    QString lastErrorText; //user only in open part of communication\n\n    void __close();\n\nprivate slots:\n    void rigKeySpeedChanged(VFOID, unsigned int);\n};\n\n#endif // QLOG_CWKEY_DRIVERS_CWCATKEY_H\n"
  },
  {
    "path": "cwkey/drivers/CWDaemonKey.cpp",
    "content": "#include \"CWDaemonKey.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwdaemonkey\");\n\nCWDaemonKey::CWDaemonKey(const QString &hostname,\n                         const quint16 port,\n                         const CWKey::CWKeyModeID mode,\n                         const qint32 defaultSpeed,\n                         qint32 sidetoneFrequency,\n                         QObject *parent) :\n    CWKey(mode, defaultSpeed, parent),\n    CWKeyUDPInterface(hostname, port),\n    isOpen(false),\n    ESCChar(27),\n    sidetoneFrequency(sidetoneFrequency)\n{\n    FCT_IDENTIFICATION;\n\n    stopSendingCap = true;\n    canSetKeySpeed = true;\n    printKeyCaps();\n}\n\nbool CWDaemonKey::open()\n{\n    FCT_IDENTIFICATION;\n\n    isOpen = isSocketReady();\n\n    if ( isOpen && sidetoneFrequency > 0 )\n    {\n        QString toneCmd(ESCChar + QString(\"3\") + QString::number(sidetoneFrequency));\n        sendData(toneCmd.toLatin1());\n    }\n\n    return isOpen;\n}\n\nbool CWDaemonKey::close()\n{\n    FCT_IDENTIFICATION;\n\n    isOpen = false;\n\n    return true;\n}\n\nQString CWDaemonKey::lastError()\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime) << socket.error();\n    qCDebug(runtime) << lastLogicalError;\n    return (lastLogicalError.isEmpty()) ? socket.errorString() : lastLogicalError;\n}\n\nbool CWDaemonKey::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    if ( text.isEmpty() )\n        return true;\n\n    if ( !isOpen )\n    {\n        qCWarning(runtime) << \"Key is not connected\";\n        lastLogicalError = tr(\"Keyer is not connected\");\n        emit keyError(tr(\"Cannot send Text\"), lastLogicalError);\n        return false;\n    }\n\n    int pos = 0;\n    QRegularExpressionMatchIterator it = speedMarkerRE().globalMatch(text);\n    while ( it.hasNext() )\n    {\n        QRegularExpressionMatch match = it.next();\n        QString segment = text.mid(pos, match.capturedStart() - pos);\n        segment.remove('\\n');\n        if ( !segment.isEmpty() )\n            sendData(segment.toLatin1());\n\n        setWPM(applySpeedMarker(match.captured(1)));\n\n        pos = match.capturedEnd();\n    }\n    QString lastSegment = text.mid(pos);\n    lastSegment.remove('\\n');\n    if ( !lastSegment.isEmpty() )\n        sendData(lastSegment.toLatin1());\n\n    return true;\n}\n\nbool CWDaemonKey::setWPM(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !isOpen )\n    {\n        qCWarning(runtime) << \"Key is not connected\";\n        lastLogicalError = tr(\"Keyer is not connected\");\n        emit keyError(tr(\"Cannot set Keyer Speed\"), lastLogicalError);\n        return false;\n    }\n\n    currentWPM = wpm;\n    QString sentString(ESCChar + QString(\"2\") + QString::number(wpm));\n    emit keyChangedWPMSpeed(wpm);\n    return (sendData(sentString.toLatin1()) > 0) ? true : false;\n}\n\nbool CWDaemonKey::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isOpen )\n    {\n        qCWarning(runtime) << \"Key is not connected\";\n        lastLogicalError = tr(\"Keyer is not connected\");\n        emit keyError(tr(\"Cannot stop Text Sending\"), lastLogicalError);\n        return false;\n    }\n\n    QString sentString(ESCChar + QString(\"4\"));\n    return (sendData(sentString.toLatin1()) > 0) ? true : false;\n}\n"
  },
  {
    "path": "cwkey/drivers/CWDaemonKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWDAEMONKEY_H\n#define QLOG_CWKEY_DRIVERS_CWDAEMONKEY_H\n\n#include <QObject>\n#include \"CWKey.h\"\n\nclass CWDaemonKey : public CWKey,\n                    protected CWKeyUDPInterface\n{\n    Q_OBJECT\n\npublic:\n    explicit CWDaemonKey(const QString &hostname,\n                         const quint16 port,\n                         const CWKey::CWKeyModeID mode,\n                         const qint32 defaultSpeed,\n                         qint32 sidetoneFrequency,\n                         QObject *parent = nullptr);\n    virtual ~CWDaemonKey(){};\n\n    virtual bool open() override;\n    virtual bool close() override;\n    virtual QString lastError() override;\n\n    virtual bool sendText(const QString &text) override;\n    virtual bool setWPM(const qint16 wpm) override;\n    virtual bool immediatelyStop() override;\n\nprotected:\n    QString lastLogicalError;\n    bool isOpen;\n    const QChar ESCChar;\n    qint32 sidetoneFrequency;\n};\n\n#endif // QLOG_CWKEY_DRIVER_CWDAEMONKEY_H\n"
  },
  {
    "path": "cwkey/drivers/CWDummyKey.cpp",
    "content": "#include \"CWDummyKey.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwdummykey\");\n\nCWDummyKey::CWDummyKey(QObject *parent)\n    : CWKey(CWKey::IAMBIC_B, 25, parent),\n      isUsed(false)\n{\n    FCT_IDENTIFICATION;\n    canSetKeySpeed = true;\n}\n\nbool CWDummyKey::open()\n{\n    FCT_IDENTIFICATION;\n\n    qInfo() << \"Key is Connected\";\n\n    isUsed = true;\n\n    setWPM(defaultWPMSpeed);\n    return true;\n}\n\nbool CWDummyKey::close()\n{\n    FCT_IDENTIFICATION;\n\n    qInfo() << \"Key is Disconnected\";\n\n    isUsed = false;\n\n    return true;\n}\n\nbool CWDummyKey::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    if ( isUsed )\n    {\n        qInfo() << \"Sending \" << stripSpeedMarkers(text);\n    }\n\n    return true;\n}\n\nbool CWDummyKey::setWPM(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isUsed )\n        return true;\n\n    qInfo() << \"Setting Speed \" << wpm;\n\n    emit keyChangedWPMSpeed(wpm); // dummy does not echo a new Speed\n            //therefore keyChangedWPMSpeed informs the rest for QLog that\n            //Key speed has been changed\n    return true;\n}\n\nQString CWDummyKey::lastError()\n{\n    FCT_IDENTIFICATION;\n\n    return QString();\n}\n\nbool CWDummyKey::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isUsed )\n    {\n        qInfo() << \"immediately Stop\";\n    }\n\n    return true;\n}\n\n"
  },
  {
    "path": "cwkey/drivers/CWDummyKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWDUMMYKEY_H\n#define QLOG_CWKEY_DRIVERS_CWDUMMYKEY_H\n\n#include \"CWKey.h\"\n\nclass CWDummyKey : public CWKey\n{\n    Q_OBJECT\n\npublic:\n    explicit CWDummyKey(QObject *parent = nullptr);\n\n    virtual bool open() override;\n    virtual bool close() override;\n    virtual bool sendText(const QString &text) override;\n    virtual bool setWPM(const qint16 wpm) override;\n    virtual QString lastError() override;\n    virtual bool immediatelyStop() override;\n\nprivate:\n    bool isUsed;\n};\n\n#endif // QLOG_CWKEY_DRIVER_CWDUMMYKEY_H\n"
  },
  {
    "path": "cwkey/drivers/CWFldigiKey.cpp",
    "content": "#include <QNetworkReply>\n\n#include \"CWFldigiKey.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwfldigikey\");\n\n//response timeout in ms\n#define RESPONSE_TIMEOUT 10000\n\nCWFldigiKey::CWFldigiKey(const QString &hostname,\n                         const quint16 port,\n                         const CWKey::CWKeyModeID mode,\n                         const qint32 defaultSpeed,\n                         QObject *parent) :\n    CWKey(mode, defaultSpeed, parent),\n    isOpen(false),\n    nam(new QNetworkAccessManager(this)),\n    hostname(hostname),\n    port(port),\n    RXString(\"^r\"),\n    transmittingText(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nbool CWFldigiKey::open()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isOpen )\n    {\n        return true;\n    }\n\n    QByteArray resp;\n\n    // Check if QLog is connecting to FLDigi\n    // And FLDigi contains all necessary commands\n    if ( !sendXMLRPCCall(\"fldigi.list\", resp) )\n\n    {\n        qCDebug(runtime) << \"Connection error\";\n        return false;\n    }\n\n    if ( resp.contains(\"fldigi.list\")\n         && resp.contains(\"text.add_tx\")\n         && resp.contains(\"text.clear_tx\")\n         && resp.contains(\"main.tx\") )\n    {\n        qCDebug(runtime) << \"Connection check OK\";\n    }\n    else\n    {\n        qCDebug(runtime) << \"Connection checks failed\";\n        lastLogicalError = tr(\"Connected device is not FLDigi\");\n        return false;\n    }\n\n    if ( resp.contains(\"main.abort\") )\n    {\n        qCDebug(runtime) << \"Enabling stopSendingCap\";\n        stopSendingCap = true;\n    }\n\n    if ( resp.contains(\"tx.get_data\") )\n    {\n        qCDebug(runtime) << \"Enabling echoCharsCap\";\n        echoCharsCap = true;\n    }\n\n    printKeyCaps();\n\n    isOpen = true;\n\n    getEcho();\n\n    return true;\n}\n\nbool CWFldigiKey::close()\n{\n    FCT_IDENTIFICATION;\n\n    isOpen = false;\n    lastLogicalError = QString();\n    return true;\n}\n\nQString CWFldigiKey::lastError()\n{\n    FCT_IDENTIFICATION;\n\n    return lastLogicalError;\n}\n\nbool CWFldigiKey::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    if ( text.isEmpty() )\n        return true;\n\n    if ( !isOpen )\n    {\n        qCWarning(runtime) << \"Key is not connected\";\n        lastLogicalError = tr(\"Keyer is not connected\");\n        emit keyError(tr(\"Cannot send Text to FLDigi\"), lastLogicalError);\n        return false;\n    }\n\n    QByteArray resp;\n\n    if ( !transmittingText )\n    {\n        if ( !sendXMLRPCCall(\"text.clear_tx\", resp) )\n        {\n            emit keyError(tr(\"Cannot send the Clear command to FLDigi\"), lastError());\n            return false;\n        }\n\n        if ( !sendXMLRPCCall(\"main.tx\", resp) )\n        {\n            emit keyError(tr(\"Cannot send the TX command to FLDigi\"), lastError());\n            return false;\n        }\n        transmittingText = true;\n    }\n\n    QList<QPair<QString, QString>> params;\n\n    QString chpString = stripSpeedMarkers(text);\n\n    if ( chpString.contains(\"\\n\") )\n    {\n        chpString.replace(\"\\n\", RXString);\n        transmittingText = false;\n    }\n\n    params << QPair<QString, QString>(\"string\", chpString );\n\n    if ( !sendXMLRPCCall(\"text.add_tx\", resp, &params) )\n    {\n        transmittingText = false;\n        emit keyError(tr(\"Cannot send the Text command to FLDigi\"), lastError());\n        return false;\n    }\n\n    return true;\n}\n\nbool CWFldigiKey::setWPM(const qint16)\n{\n    FCT_IDENTIFICATION;\n\n    // currently I don't know which FLDigi function I should call.\n    return true;\n}\n\nbool CWFldigiKey::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! stopSendingCap )\n    {\n        qCDebug(runtime) << \"STOP is not supported by FLDigi\";\n        return true;\n    }\n\n    if ( !isOpen )\n    {\n        qCWarning(runtime) << \"Key is not connected\";\n        lastLogicalError = tr(\"Keyer is not connected\");\n        emit keyError(tr(\"Cannot send the Stop command to FLDigi\"), lastLogicalError);\n        return false;\n    }\n\n    QByteArray resp;\n\n    if ( !sendXMLRPCCall(\"main.abort\", resp) )\n    {\n        emit keyError(tr(\"Cannot send the Abort command to FLDigi\"), lastError());\n        return false;\n    }\n\n    if ( !sendXMLRPCCall(\"text.clear_tx\", resp) )\n    {\n        emit keyError(tr(\"Cannot send the Clear command to FLDigi\"), lastError());\n        return false;\n    }\n\n    return true;\n}\n\nvoid CWFldigiKey::getEcho()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! echoCharsCap )\n    {\n        qCDebug(runtime) << \"Echo Char is not supported by FLDigi\";\n        return;\n    }\n\n    if ( !isOpen )\n    {\n        qCDebug(runtime) << \"Key is not connected\";\n        return;\n    }\n\n    QByteArray resp;\n\n    if ( !sendXMLRPCCall(\"tx.get_data\", resp) )\n    {\n        qWarning() << \"Cannot receive the TX Data from FLDigi\";\n        emit keyError(tr(\"Cannot receive data from FLDigi\"), lastError());\n        return;\n    }\n\n    qsizetype start = resp.indexOf(\"<base64>\");\n    qsizetype stop = resp.indexOf(\"</base64>\");\n\n    if ( start == -1 || stop == -1 ||\n         stop < start )\n    {\n        qCDebug(runtime) << \"based64 block not found\";\n        // TODO: EMIT ERROR and disconnect? currently without an error, I will see\n        return;\n    }\n\n    QString echoString(QByteArray::fromBase64(resp.mid(start + 8, stop - start - 8)));\n    qCDebug(runtime) << \"\\tEcho String\" << echoString;\n    emit keyEchoText(echoString);\n\n    // check periodically\n    QTimer::singleShot(1 * 1000, this, &CWFldigiKey::getEcho);\n}\n\nbool CWFldigiKey::sendXMLRPCCall(const QString & methodName,\n                                 QByteArray &response,\n                                 const QList<QPair<QString, QString>> *params)\n{\n    FCT_IDENTIFICATION;\n\n    QEventLoop loop;\n    QString ret;\n    QXmlStreamWriter writer(&ret);\n    QNetworkRequest request(QUrl(QString(\"http://%1:%2/RPC\").arg(hostname, QString::number(port))));\n    QNetworkReply* reply = nullptr;\n    QTimer timer;\n\n    timer.setSingleShot(true);\n\n    response = QByteArray();\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/xml\");\n\n    writer.writeStartDocument();\n    writer.writeStartElement(\"methodCall\");\n    writer.writeTextElement(\"methodName\", methodName);\n\n    if ( params && !params->isEmpty() )\n    {\n        writer.writeStartElement(\"params\");\n\n        for( const QPair<QString, QString>& param : static_cast<const QList<QPair<QString, QString>>&>(*params) )\n        {\n            writer.writeStartElement(\"param\");\n            writer.writeStartElement(\"value\");\n            writer.writeTextElement(param.first, param.second);\n            writer.writeEndElement();\n            writer.writeEndElement();\n        }\n        writer.writeEndElement();\n    }\n    writer.writeEndElement();\n\n    writer.writeEndDocument();\n\n    qCDebug(runtime) << ret.toLocal8Bit();\n\n    reply= nam->post(request, ret.toLocal8Bit());\n\n    // blocking call is used\n    connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit);\n    connect(reply , &QNetworkReply::finished, &loop, &QEventLoop::quit);\n    timer.start(RESPONSE_TIMEOUT);  // timer for logical timeout - in ms\n    loop.exec();\n\n    // Timeout occurred\n    if (!timer.isActive())\n    {\n        disconnect(reply , &QNetworkReply::finished, &loop, &QEventLoop::quit);\n        qWarning() << \"XMLRPC Call Timeout\" << RESPONSE_TIMEOUT << \"ms\";\n        lastLogicalError = tr(\"FLDigi connection timeout\");\n        reply->abort();\n        reply->deleteLater();\n        return false;\n    }\n\n    timer.stop();\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300 )\n    {\n        qWarning() << \"XMLRPC Call Reply Error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        lastLogicalError = tr(\"FLDigi connection error\");\n        reply->deleteLater();\n        return false;\n    }\n\n    response = reply->readAll();\n\n    qCDebug(runtime) << response;\n\n    if ( response.contains(\"<fault>\") )\n    {\n        qWarning() << \"XMLRPC Call Logical Error\" << response;\n        lastLogicalError = tr(\"FLDigi command error\");\n        reply->deleteLater();\n        return false;\n    }\n\n    reply->deleteLater();    \n\n    return true;\n}\n"
  },
  {
    "path": "cwkey/drivers/CWFldigiKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWFLDIGIKEY_H\n#define QLOG_CWKEY_DRIVERS_CWFLDIGIKEY_H\n\n#include <QObject>\n#include <QNetworkAccessManager>\n#include \"CWKey.h\"\n\nclass CWFldigiKey : public CWKey\n{\n\npublic:\n    CWFldigiKey(const QString &hostname,\n                const quint16 port,\n                const CWKey::CWKeyModeID mode,\n                const qint32 defaultSpeed,\n                QObject *parent = nullptr);\n    virtual ~CWFldigiKey(){ nam->deleteLater();};\n\n    virtual bool open() override;\n    virtual bool close() override;\n    virtual QString lastError() override;\n\n    virtual bool sendText(const QString &text) override;\n    virtual bool setWPM(const qint16 wpm) override;\n    virtual bool immediatelyStop() override;\n\n\nprotected:\n\n    QString lastLogicalError;\n    bool isOpen;\n    QNetworkAccessManager *nam;\n    QString hostname;\n    quint16 port;\n\n    const QString RXString;\n    bool transmittingText;\n\nprivate:\n    bool sendXMLRPCCall(const QString&,\n                        QByteArray &,\n                        const QList<QPair<QString, QString>>* = nullptr);\nprivate slots:\n    void getEcho();\n};\n\n#endif // QLOG_CWKEY_DRIVERS_CWFLDIGIKEY_H\n"
  },
  {
    "path": "cwkey/drivers/CWKey.cpp",
    "content": "#include <QHostInfo>\n#include <QRegularExpression>\n#include \"CWKey.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwkey\");\n\nCWKey::CWKey(CWKeyModeID mode, qint32 defaultWPM, QObject *parent) :\n    QObject(parent),\n    keyMode(mode),\n    defaultWPMSpeed(defaultWPM),\n    currentWPM(static_cast<qint16>(defaultWPM)),\n    stopSendingCap(false),\n    echoCharsCap(false),\n    rigMustConnectedCap(false),\n    canSetKeySpeed(false)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << mode << defaultWPM;\n}\n\nvoid CWKey::printKeyCaps()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"stopSendingCap\" << stopSendingCap;\n    qCDebug(runtime) << \"echoCharsCap\" << echoCharsCap;\n    qCDebug(runtime) << \"rigMustConnectedCap\" << rigMustConnectedCap;\n    qCDebug(runtime) << \"canSetKeySpeed\" << canSetKeySpeed;\n}\n\nCWKey::CWKeyTypeID CWKey::intToTypeID(int i)\n{\n    FCT_IDENTIFICATION;\n\n    if ( i < DUMMY_KEYER || i > LAST_MODEL )\n    {\n        qCWarning(runtime) << \"Unknown Mode\" << i;\n        return LAST_MODEL;\n    }\n    return static_cast<CWKey::CWKeyTypeID>(i);\n}\n\nCWKey::CWKeyModeID CWKey::intToModeID(int i)\n{\n    FCT_IDENTIFICATION;\n\n    if ( i < SINGLE_PADDLE || i > LAST_MODE )\n    {\n        qCWarning(runtime) << \"Unknown Mode\" << i;\n        return LAST_MODE;\n    }\n    return static_cast<CWKey::CWKeyModeID>(i);\n}\n\nbool CWKey::isNetworkKey(const CWKeyTypeID &type)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (type == CWDAEMON_KEYER\n                || type == FLDIGI_KEYER );\n\n    qCDebug(runtime) << ret;\n    return ret;\n}\n\nconst QRegularExpression &CWKey::speedMarkerRE()\n{\n    static QRegularExpression re(\"<(\\\\++|-+)>\");\n    return re;\n}\n\nqint16 CWKey::applySpeedMarker(const QString &markerCapture)\n{\n    qint16 delta = static_cast<qint16>(\n        markerCapture.length() * ( markerCapture[0] == QLatin1Char('+') ? 5 : -5 ));\n    currentWPM = qBound(minWPM(), static_cast<qint16>(currentWPM + delta), maxWPM());\n    return currentWPM;\n}\n\nQString CWKey::stripSpeedMarkers(const QString &text)\n{\n    QString result(text);\n    result.remove(speedMarkerRE());\n    return result;\n}\n\nQDataStream& operator>>(QDataStream &in, CWKey::CWKeyModeID &v)\n{\n    int i;\n    in >> i;\n    v = static_cast<CWKey::CWKeyModeID>(i);\n    return in;\n}\n\nQDataStream& operator<<(QDataStream &out, const CWKey::CWKeyModeID &v)\n{\n    out << static_cast<int>(v);\n    return out;\n}\n\nQDataStream& operator>>(QDataStream &in, CWKey::CWKeyTypeID &v)\n{\n    int i;\n    in >> i;\n    v = static_cast<CWKey::CWKeyTypeID>(i);\n    return in;\n}\n\nQDataStream& operator<<(QDataStream &out, const CWKey::CWKeyTypeID &v)\n{\n    out << static_cast<int>(v);\n    return out;\n}\n\nCWKeySerialInterface::CWKeySerialInterface(const QString &portName,\n                                           const qint32 baudrate,\n                                           const qint32 timeout) :\n    timeout(timeout)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << portName << baudrate << timeout;\n\n    serial.setPortName(portName);\n\n    if ( ! serial.setBaudRate(baudrate, QSerialPort::AllDirections) )\n    {\n        qWarning() << \"Cannot set Baudrate for Serial port\";\n    }\n    if ( ! serial.setDataBits(QSerialPort::Data8) )\n    {\n        qWarning() << \"Cannot set Data Bits for Serial port\";\n    }\n    if ( ! serial.setParity(QSerialPort::NoParity) )\n    {\n        qWarning() << \"Cannot set Parity for Serial port\";\n    }\n    if ( ! serial.setFlowControl(QSerialPort::NoFlowControl) )\n    {\n        qWarning() << \"Cannot set Flow Control for Serial port\";\n    }\n    if ( ! serial.setStopBits(QSerialPort::TwoStop) )\n    {\n        qWarning() << \"Cannot set Stop Bits for Serial port\";\n    }\n}\n\nqint64 CWKeySerialInterface::sendDataAndWait(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Port Mutex\";\n    QMutexLocker locker(&portMutex);\n\n    if ( ! serial.isOpen() )\n    {\n        qCDebug(runtime) << \"Serial port is not opened\";\n        return - 1;\n    }\n\n    qCDebug(runtime) << \"\\t<<<<<< SND Sync: \" << data;\n\n    qint64 ret = serial.write(data);\n\n    if ( ret == -1 )\n    {\n        qWarning() << \"Serial Port Error: \" << serial.errorString() << serial.error();\n    }\n    else\n    {\n        if ( !serial.waitForBytesWritten(timeout) )\n        {\n            qCDebug(runtime) << \"Serial Port Timeout\";\n            return -1;\n        }\n    }\n    return ret;\n}\n\nqint64 CWKeySerialInterface::receiveDataAndWait(QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Port Mutex\";\n    QMutexLocker locker(&portMutex);\n\n    if ( ! serial.isOpen() )\n    {\n        qCDebug(runtime) << \"Serial port is not opened\";\n        return - 1;\n    }\n\n    if ( serial.waitForReadyRead(timeout))\n    {\n        data = serial.readAll();\n        while ( serial.waitForReadyRead(10) )\n        {\n            data += serial.readAll();\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Serial Port Timeout\";\n        return -1;\n    }\n\n    qCDebug(runtime) << \"\\t>>>>>> RCV Sync: \" << data;\n\n    return data.size();\n}\n\nqint64 CWKeySerialInterface::writeAsyncData(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Port Mutex\";\n    QMutexLocker locker(&portMutex);\n\n    if ( ! serial.isOpen() )\n    {\n        qCDebug(runtime) << \"Serial port is not opened\";\n        return - 1;\n    }\n\n    qCDebug(runtime) << \"\\t<<<<<< SND Async:\" << data;\n\n    qint64 ret = serial.write(data);\n\n    if ( ret == -1 )\n    {\n        qWarning() << \"Serial Port Error: \" << serial.errorString() << serial.error();\n    }\n\n    return ret;\n}\n\nCWKeyUDPInterface::CWKeyUDPInterface(const QString &hostname,\n                                     const quint16 port) :\n    CWKeyIPInterface(hostname, port)\n{\n    FCT_IDENTIFICATION;\n}\n\nqint64 CWKeyUDPInterface::sendData(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"\\t<<<<<< SND: \" << data << \"(\" << serverName << \"port:\" << port << \")\";\n\n    return socket.writeDatagram(data, serverName, port);\n}\n\nbool CWKeyUDPInterface::isSocketReady()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << hasIPAddress;\n\n    return hasIPAddress;\n}\n\nCWKeyIPInterface::CWKeyIPInterface(const QString &hostname,\n                                   const quint16 port) :\n    serverName(QHostAddress()),\n    port(port),\n    hasIPAddress(false)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << hostname << port;\n\n    QHostInfo info = QHostInfo::fromName(hostname);\n\n    if (info.error() == QHostInfo::NoError)\n    {\n        serverName = QHostAddress(info.addresses().at(0));\n        qCDebug(runtime) << \"Using IP address\" << serverName;\n        hasIPAddress = true;\n    }\n}\n"
  },
  {
    "path": "cwkey/drivers/CWKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWKEY_H\n#define QLOG_CWKEY_DRIVERS_CWKEY_H\n\n#include <QObject>\n#include <QRegularExpression>\n#include <QtSerialPort>\n#include <QUdpSocket>\n\nclass CWKeySerialInterface\n{\npublic:\n    explicit CWKeySerialInterface(const QString &portName,\n                                  const qint32 baudrate,\n                                  const qint32 timeout);\n    ~CWKeySerialInterface() {};\n\nprotected:\n\n    virtual qint64 sendDataAndWait(const QByteArray &data);\n    virtual qint64 receiveDataAndWait(QByteArray &data);\n    virtual qint64 writeAsyncData(const QByteArray &);\n\n    QSerialPort serial;\n    qint32 timeout;\n    QMutex portMutex;\n};\nclass CWKeyIPInterface\n{\npublic:\n    explicit CWKeyIPInterface(const QString &hostname,\n                               const quint16 port);\n    ~CWKeyIPInterface() {};\n\nprotected:\n    virtual qint64 sendData(const QByteArray &data) = 0;\n    virtual bool isSocketReady() = 0;\n\n    QHostAddress serverName;\n    quint16 port;\n    bool hasIPAddress;\n};\n\nclass CWKeyUDPInterface : public CWKeyIPInterface\n{\npublic:\n    explicit CWKeyUDPInterface(const QString &hostname,\n                               const quint16 port);\n    ~CWKeyUDPInterface() {};\n\nprotected:\n    virtual qint64 sendData(const QByteArray &data) override;\n    virtual bool isSocketReady() override;\n\n    QUdpSocket socket;\n};\n\nclass CWKey : public QObject\n{\n    Q_OBJECT;\n\npublic:\n    enum CWKeyTypeID\n    {\n        DUMMY_KEYER = 0,\n        WINKEY_KEYER = 1,\n        MORSEOVERCAT = 2,\n        CWDAEMON_KEYER = 3,\n        FLDIGI_KEYER = 4,\n        LAST_MODEL = 4\n    };\n\n    enum CWKeyModeID\n    {\n        SINGLE_PADDLE = 0,\n        IAMBIC_A = 1,\n        IAMBIC_B = 2,\n        ULTIMATE = 3,\n        LAST_MODE = 4\n    };\n\nsignals:\n    void keyError(QString, QString);\n    void keyChangedWPMSpeed(qint32);\n    void keyEchoText(QString);\n    void keyHWButton1Pressed();\n    void keyHWButton2Pressed();\n    void keyHWButton3Pressed();\n    void keyHWButton4Pressed();\n\npublic:\n    explicit CWKey(CWKeyModeID mode, qint32 defaultWPM, QObject *parent = nullptr);\n    virtual ~CWKey() {};\n\n    virtual bool open() = 0;\n    virtual bool close() = 0;\n    virtual bool sendText(const QString &text) = 0;\n    virtual bool setWPM(const qint16 wpm) = 0;\n    virtual QString lastError() = 0;\n    virtual bool immediatelyStop() = 0;\n    virtual bool canStopSending() { return stopSendingCap;}\n    virtual bool canEchoChar() { return echoCharsCap;}\n    virtual bool mustRigConnected() { return rigMustConnectedCap;}\n    virtual bool canSetSpeed() { return canSetKeySpeed; };\n\n    void printKeyCaps();\n\n    static CWKeyTypeID intToTypeID(int);\n    static CWKeyModeID intToModeID(int);\n    static bool isNetworkKey(const CWKeyTypeID &type);\n    static QString stripSpeedMarkers(const QString &text);\n\n    virtual qint16 minWPM() const { return 5; }\n    virtual qint16 maxWPM() const { return 99; }\n\n    friend QDataStream& operator<<(QDataStream& out, const CWKeyTypeID& v);\n    friend QDataStream& operator>>(QDataStream& in, CWKeyTypeID& v);\n\n    friend QDataStream& operator<<(QDataStream& out, const CWKeyModeID& v);\n    friend QDataStream& operator>>(QDataStream& in, CWKeyModeID& v);\n\nprotected:\n    CWKeyModeID keyMode;\n    qint32 defaultWPMSpeed;\n    qint16 currentWPM;\n\n    bool stopSendingCap;\n    bool echoCharsCap;\n    bool rigMustConnectedCap;\n    bool canSetKeySpeed;\n\n    static const QRegularExpression &speedMarkerRE();\n    qint16 applySpeedMarker(const QString &markerCapture);\n\n\n};\n\n#endif // QLOG_CWKEY_DRIVERS_CWKEY_H\n"
  },
  {
    "path": "cwkey/drivers/CWWinKey.cpp",
    "content": "#include <QMutexLocker>\n\n#include \"CWWinKey.h\"\n#include \"core/debug.h\"\n\n/* Based on WinKey Spec\n * https://k1el.tripod.com/files/Winkey10.pdf\n * https://k1el.tripod.com/WinkeyUSBman.pdf */\n\nMODULE_IDENTIFICATION(\"qlog.cwkey.driver.cwwinkey\");\n\nCWWinKey::CWWinKey(const QString &portName,\n                     const qint32 baudrate,\n                     const CWKey::CWKeyModeID mode,\n                     const qint32 defaultSpeed,\n                     bool paddleSwap,\n                     bool paddleOnlySidetone,\n                     qint32 sidetoneFrequency,\n                     QObject *parent)\n    : CWKey(mode, defaultSpeed, parent),\n      CWKeySerialInterface(portName, baudrate, 5000),\n      isInHostMode(false),\n      xoff(false),\n      paddleSwap(paddleSwap),\n      paddleOnlySidetone(paddleOnlySidetone),\n      sidetoneFrequency(sidetoneFrequency),\n      version(0)\n{\n    FCT_IDENTIFICATION;\n\n    minWPMRange = defaultSpeed - 15; // Winkey has 31 steps for POT, it means that 15 steps to left\n                                     // and 15 steps to right\n    if ( minWPMRange <= 0 ) minWPMRange = 1;\n\n    stopSendingCap = true;\n    echoCharsCap = true;\n    canSetKeySpeed = true;\n}\n\nCWWinKey::~CWWinKey()\n{\n    FCT_IDENTIFICATION;\n}\n\nbool CWWinKey::open()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n\n    __close();\n\n    /***************/\n    /* Open Port   */\n    /***************/\n    qCDebug(runtime) << \"Opening Serial\" << serial.portName();\n\n    if ( !serial.open(QIODevice::ReadWrite) )\n    {\n        qWarning() << \"Cannot open \" << serial.portName() << \" Error code \" << serial.error();\n        return false;\n    }\n\n    serial.setReadBufferSize(1); // WinKey Responses are 1B.\n                                 // It is important to set correct Buffer size beucase message below\n                                 /* https://forum.qt.io/topic/137268/solved-qserialport-readyread-not-emitted-qserialport-waitforreadyread-always-return-false-with-ch340\n                                    monegator Jun 16, 2022, 3:36 PM\n\n                                    Hello there,\n                                    i opened this thread so that others facing the same issue may find a solution.\n                                    In the past we always used USB-UART cables based on FTDI232 chips (TTL-232R-5V-WE).\n                                    However, due to a huge price increase in the last couple of years (5€ for a cable became 35€, now dropped to 25€) we decided to ditch\n                                    FTDI and bought cables that use the CH340 chip. And why shouldn't we, they cost less than 2€ each.\n\n                                    Our software based on VB6 worked flawlessly, even better (reduced latency) however we had issues with our Qt5 based software (Qt 5.15.2).\n                                    Even if the data is available (QSerialPort::bytesAvailable return values greater than zero) the readyRead signal is never emitted, and\n                                    waitForReadyRead always return false.\n\n                                    The issue was that readBufferSize was set to zero (default value), and there must be something in the interaction between CH340 driver,\n                                    windows COM port object and Qt that prevented the event from being raised, but that was never an issue for FTDI cables.\n\n                                    The solution was to set readBufferSize to 1. Once readBufferSize is different than zero readyRead works again.\n                                   */\n    serial.setDataTerminalReady(true);\n    serial.setRequestToSend(false);\n\n    qCDebug(runtime) << \"Serial port has been opened\";\n\n    QThread::msleep(200);\n\n    QByteArray cmd;\n    /***********************/\n    /* Echo Test           */\n    /*   Testing whether   */\n    /*   the opposite site */\n    /*   is Winkey         */\n    /***********************/\n    qCDebug(runtime) << \"Echo Test\";\n\n    cmd.resize(3);\n    cmd[0] = 0x00;\n    cmd[1] = 0x04;\n    cmd[2] = 0xF1u;\n\n    if ( sendDataAndWait(cmd) != 3 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n        __close();\n        return false;\n    }\n\n    if ( receiveDataAndWait(cmd) < 1 )\n    {\n        qWarning() << \"Unexpected size of response or communication error\";\n        qCDebug(runtime) << lastError();\n        __close();\n        return false;\n    }\n\n    if ( (unsigned char)cmd.at(0) != 0xF1 )\n    {\n        qWarning() << \"Connected device is not the Winkey type\";\n        lastLogicalError = tr(\"Connected device is not WinKey\");\n        __close();\n        return false;\n    }\n\n    qCDebug(runtime) << \"Echo Test OK\";\n\n    /********************/\n    /* Enable Host Mode */\n    /********************/\n    qCDebug(runtime) << \"Enabling Host Mode\";\n\n    cmd.resize(2);\n    cmd[0] = 0x00;\n    cmd[1] = 0x02;\n\n    if ( sendDataAndWait(cmd) != 2 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n        __close();\n        return false;\n    }\n\n    /* Based on the WinKey Spec, it is needed to call read:\n          The host must wait for this return code before\n          any other commands or data can be sent to Winkeyer\n    */\n    if ( receiveDataAndWait(cmd) < 1 )\n    {\n        qWarning() << \"Unexpected size of response or communication error\";\n        qCDebug(runtime) << lastError();\n        __close();\n        return false;\n    }\n\n    version = (unsigned char)cmd.at(0);\n    qCDebug(runtime) << \"Winkey version\" << version;\n\n    lastLogicalError = QString();\n\n    qCDebug(runtime) << \"Host Mode has been enabled\";\n\n    /******************/\n    /* Mode Setting   */\n    /******************/\n    qCDebug(runtime) << \"Mode Setting\";\n\n    cmd.resize(2);\n    cmd[0] = 0x0E;\n    cmd[1] = buildWKModeByte();\n\n    if ( sendDataAndWait(cmd) != 2 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n        __close();\n        return false;\n    }\n\n    //receiveDataAndWait(cmd); /* it is not needed to read here - no response */\n\n    qCDebug(runtime) << \"Mode has been set\";\n\n    /******************/\n    /* WK2 Mode Status*/\n    /******************/\n    if ( version >= 20 )\n    {\n        qCDebug(runtime) << \"WK2 PB Mode Setting\";\n\n        cmd.resize(2);\n        cmd[0] = 0x00;\n        cmd[1] = 0x0B;\n\n        if ( sendDataAndWait(cmd) != 2 )\n        {\n            qWarning() << \"Unexpected size of write response or communication error\";\n            qCDebug(runtime) << lastError();\n            __close();\n            return false;\n        }\n\n        // receiveDataAndWait(cmd); /* it is not needed to read here - no response */\n        qCDebug(runtime) << \"WK2 PB Mode has been set\";\n    }\n\n    QThread::msleep(200);\n\n    /* Starting Async Flow for WinKey */\n    /* From this point, all Serial port functions must be Async */\n    connect(&serial, &QSerialPort::readyRead, this, &CWWinKey::handleReadyRead);\n    connect(&serial, &QSerialPort::bytesWritten, this, &CWWinKey::handleBytesWritten);\n    connect(&serial, &QSerialPort::errorOccurred, this, &CWWinKey::handleError);\n\n    isInHostMode = true;\n\n    /* Force send current status */\n    __sendStatusRequest();\n\n    /* Set POT Range */\n    __setPOTRange();\n\n    /* Sidetone Setting */\n    __setSidetone(!paddleOnlySidetone);\n\n    /* Set Default value */\n    __setWPM(defaultWPMSpeed);\n\n    return true;\n}\n\nbool CWWinKey::close()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n    __close();\n\n    return true;\n}\n\nbool CWWinKey::sendText(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        emit keyError(tr(\"Cannot send Text to Rig\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    qCDebug(runtime) << \"Waiting for WriteBuffer Mutex\";\n    writeBufferMutex.lock();\n    qCDebug(runtime) << \"Appending input string\";\n\n    int pos = 0;\n    QRegularExpressionMatchIterator it = speedMarkerRE().globalMatch(text);\n    while ( it.hasNext() )\n    {\n        QRegularExpressionMatch match = it.next();\n        QString segment = text.mid(pos, match.capturedStart() - pos);\n        segment.remove('\\n');\n        writeBuffer.append(segment.toLatin1());\n\n        qint16 newWPM = applySpeedMarker(match.captured(1));\n        writeBuffer.append(static_cast<char>(0x1C)); // WinKey buffered speed change\n        writeBuffer.append(static_cast<char>(newWPM));\n        emit keyChangedWPMSpeed(newWPM);\n\n        pos = match.capturedEnd();\n    }\n    QString lastSegment = text.mid(pos);\n    lastSegment.remove('\\n');\n    writeBuffer.append(lastSegment.toLatin1());\n\n    writeBufferMutex.unlock();\n\n    tryAsyncWrite();\n\n    return true;\n}\n\nvoid CWWinKey::tryAsyncWrite()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for WriteBuffer Mutex\";\n    writeBufferMutex.lock();\n\n    qCDebug(runtime) << \"WBuffer Size: \" << writeBuffer.size()\n                     << \"; XOFF: \" << xoff;\n\n    if ( writeBuffer.isEmpty() || xoff )\n    {\n        writeBufferMutex.unlock();\n        qCDebug(runtime) << \"Skipping write call\";\n        return;\n    }\n\n    qint64 size = writeAsyncData(QByteArray(writeBuffer.constData(),1));\n    if ( size != 1 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n    }\n    writeBuffer.remove(0, size);\n    writeBufferMutex.unlock();\n\n    QCoreApplication::processEvents();\n}\n\nvoid CWWinKey::handleBytesWritten(qint64 bytes)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << bytes;\n\n    tryAsyncWrite();\n}\n\nvoid CWWinKey::handleReadyRead()\n{\n    FCT_IDENTIFICATION;\n\n    unsigned char rcvByte;\n\n    qCDebug(runtime) << \"Waiting for Port Mutex\";\n    portMutex.lock();\n    qCDebug(runtime) << \"Reading from Port\";\n    serial.read((char*)&rcvByte,1);\n    portMutex.unlock();\n\n    qCDebug(runtime) << \"\\t>>>>>> RCV Async:\" << QByteArray::fromRawData((char*)(&rcvByte),1);\n\n    if ( (rcvByte & 0xC0) == 0xC0 )\n    {\n        qCDebug(runtime) << \"\\tStatus Information Message:\";\n        xoff = false;\n\n        if ( rcvByte == 0xC0 ) qCDebug(runtime) << \"\\t\\tIdle\";\n        else\n        {\n            if ( version >= 20 && rcvByte & 0x08 )\n            {\n                qCDebug(runtime) << \"\\tPushButton Status Byte\";\n                if ( rcvByte & 0x01 )\n                {\n                    qCDebug(runtime) << \"\\t\\tButton1 pressed\";\n                    emit keyHWButton1Pressed();\n                }\n                if ( rcvByte & 0x02 )\n                {\n                    qCDebug(runtime) << \"\\t\\tButton2 pressed\";\n                    emit keyHWButton2Pressed();\n                }\n                if ( rcvByte & 0x04 )\n                {\n                    qCDebug(runtime) << \"\\t\\tButton3 pressed\";\n                    emit keyHWButton3Pressed();\n                }\n                if ( rcvByte & 0x10 )\n                {\n                    qCDebug(runtime) << \"\\t\\tButton4 pressed\";\n                    emit keyHWButton4Pressed();\n                }\n            }\n            else\n            {\n                qCDebug(runtime) << \"\\tStatus Byte\";\n\n                if ( rcvByte & 0x01 )\n                {\n                    qCDebug(runtime) << \"\\t\\tBuffer 2/3 full\";\n                    xoff = true; //slow down in sending Write Buffer - to block tryAsyncWrite\n                }\n                if ( rcvByte & 0x02 ) qCDebug(runtime) << \"\\t\\tBrk-in\";\n                if ( rcvByte & 0x04 ) qCDebug(runtime) << \"\\t\\tKey Busy\";\n                if ( rcvByte & 0x08 ) qCDebug(runtime) << \"\\t\\tTunning\";\n                if ( rcvByte & 0x0F ) qCDebug(runtime) << \"\\t\\tWaiting\";\n            }\n        }\n    }\n    else if ( (rcvByte & 0xC0) == 0x80 )\n    {\n        qint32 potValue = (rcvByte & 0x7F);\n        qint32 potWPM = minWPMRange + potValue;\n        qCDebug(runtime) << \"\\tPot: \" << potValue << \"; WPM=\" << potWPM;\n        setWPM(potWPM);\n    }\n    else\n    {\n        qCDebug(runtime) << \"\\tEcho Char\";\n        emit keyEchoText(QString(char(rcvByte)));\n    }\n\n    tryAsyncWrite();\n}\n\nvoid CWWinKey::handleError(QSerialPort::SerialPortError serialPortError)\n{\n    FCT_IDENTIFICATION;\n\n    QString detail = serial.errorString();\n\n    if ( serialPortError == QSerialPort::ReadError )\n    {\n        qWarning() << \"An I/O error occurred while reading: \" << detail;\n    }\n    else if ( serialPortError == QSerialPort::WriteError )\n    {\n        qWarning() << \"An I/O error occurred while writing: \" << detail;\n    }\n    else if ( serialPortError != QSerialPort::NoError )\n    {\n        qWarning() << \"An I/O error occurred: \" << detail;\n    }\n\n    /* Emit error */\n    emit keyError(tr(\"Communication Error\"), detail);\n}\n\nbool CWWinKey::setWPM(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n    bool ret = __setWPM(wpm);\n    if ( ret )\n    {\n        emit keyChangedWPMSpeed(wpm); //Winkey does not echo a new Speed\n                //therefore keyChangedWPMSpeed informs the rest for QLog that\n                //Key speed has been changed\n    }\n    return ret;\n}\n\nbool CWWinKey::__setWPM(const qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        emit keyError(tr(\"Cannot set Keyer Speed\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    QByteArray cmd;\n    cmd.resize(2);\n    cmd[0] = 0x02;\n    cmd[1] = static_cast<char>(wpm);\n\n    qint64 size = writeAsyncData(cmd);\n    if ( size != 2 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n        return false;\n    }\n\n    currentWPM = wpm;\n    return true;\n}\n\nQString CWWinKey::lastError()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << serial.error();\n    qCDebug(runtime) << lastLogicalError;\n    return (lastLogicalError.isEmpty()) ? serial.errorString() : lastLogicalError;\n}\n\nbool CWWinKey::immediatelyStop()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for Command Mutex\";\n    QMutexLocker locker(&commandMutex);\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        emit keyError(tr(\"Cannot stop Text Sending\"), tr(\"Keyer is not connected\"));\n        return false;\n    }\n\n    qCDebug(runtime) << \"Waiting for WriteBuffer Mutex\";\n    writeBufferMutex.lock();\n    qCDebug(runtime) << \"Clearing Buffer\";\n    writeBuffer.clear();\n    writeBufferMutex.unlock();\n\n    QByteArray cmd;\n    cmd.resize(3);\n    cmd[0] = 0x06; /* Stop */\n    cmd[1] = 0x01;\n    cmd[2] = 0x0A; /* Clear */\n\n    qint64 size = writeAsyncData(cmd);\n    if ( size != 3 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n    }\n\n    return true;\n}\n\nvoid CWWinKey::__close()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Waiting for WriteBuffer Mutex\";\n    writeBufferMutex.lock();\n    qCDebug(runtime) << \"Clearing Buffer\";\n    writeBuffer.clear();\n    writeBufferMutex.unlock();\n\n    if ( serial.isOpen() )\n    {\n        /* Switch to Sync Mode */\n        disconnect(&serial, &QSerialPort::bytesWritten, this, &CWWinKey::handleBytesWritten);\n        disconnect(&serial, &QSerialPort::errorOccurred, this, &CWWinKey::handleError);\n        disconnect(&serial, &QSerialPort::readyRead, this, &CWWinKey::handleReadyRead);\n\n        if ( isInHostMode )\n        {\n            QByteArray cmd;\n\n            /***********************/\n            /* clear buffer        */\n            /***********************/\n            qCDebug(runtime) << \"Clearing Buffer\";\n            cmd.resize(3);\n            cmd[0] = 0x06; /* Stop */\n            cmd[1] = 0x01;\n            cmd[2] = 0x0A; /* Clear */\n\n            if ( sendDataAndWait(cmd) != 3 )\n            {\n                qWarning() << \"Unexpected size of write response or communication error\";\n                qCDebug(runtime) << lastError();\n            }\n            else\n            {\n                qCDebug(runtime) << \"Buffered has been cleared\";\n            }\n\n            /***********************/\n            /* Disabling Host Mode */\n            /***********************/\n            qCDebug(runtime) << \"Disabling Host Mode\";\n            cmd.resize(2);\n            cmd[0] = 0x00;\n            cmd[1] = 0x03;\n\n            if ( sendDataAndWait(cmd) != 2 )\n            {\n                qWarning() << \"Unexpected size of write response or communication error\";\n                qCDebug(runtime) << lastError();\n            }\n            else\n            {\n                qCDebug(runtime) << \"Host Mode has been disabled\";\n            }\n        }\n        QThread::msleep(200);\n        serial.setDataTerminalReady(false);\n        serial.close();\n    }\n    else\n    {\n        qCDebug(runtime) << \"Port is already closed\";\n    }\n\n    isInHostMode = false;\n    xoff = false;\n    version = 0;\n    lastLogicalError = QString();\n}\n\nunsigned char CWWinKey::buildWKModeByte() const\n{\n    FCT_IDENTIFICATION;\n\n    /*\n       7   (MSB) Disable Paddle watchdog\n       6   Paddle Echoback (1=Enabled, 0=Disabled)\n       5,4 Key Mode: 00 = Iambic B\n                     01 = Iambic A\n                     10 = Ultimatic\n                     11 = Bug Mode\n       3   Paddle Swap (1=Swap, 0=Normal)\n       2   Serial Echoback (1=Enabled, 0=Disabled)\n       1   Autospace (1=Enabled, 0=Disabled)\n       0   (LSB) CT Spacing when=1, Normal Wordspace when=0\n     */\n\n    unsigned char settingByte = 0;\n\n    settingByte |= 1 << 7;  // Disabled Paddle Watchdog\n    settingByte |= 0 << 6;  // Paddle Echoback - Even Disable, characters are sent - K3NG Keyer\n\n    switch (keyMode)        // Key Mode\n    {\n    case IAMBIC_B:\n    case LAST_MODE:\n        //no action 00\n        break;\n    case IAMBIC_A:\n        settingByte |= 1 << 4;\n        break;\n    case ULTIMATE:\n        settingByte |= 1 << 5;\n        break;\n    case SINGLE_PADDLE:\n        settingByte |= 1 << 5;\n        settingByte |= 1 << 4;\n        break;\n    }\n\n    settingByte |= paddleSwap << 3;   // Paddle Swap Normal\n    settingByte |= 1 << 2;  // Serial Echoback Enabled - must be\n    //1     = 0             // Autospace Disabled\n    //0     = 0             // Normal Wordspace\n\n    return settingByte;\n}\n\nbool CWWinKey::__sendStatusRequest()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        return false;\n    }\n\n    QByteArray cmd;\n    cmd.resize(1);\n    cmd[0] = 0x15;\n\n    qint64 size = writeAsyncData(cmd);\n    if ( size != 1 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n    }\n\n    return true;\n}\n\nbool CWWinKey::__setPOTRange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        return false;\n    }\n\n    if ( defaultWPMSpeed <= 0 )\n    {\n        qCDebug(runtime) << \"Default WPM Speed is negative\" << defaultWPMSpeed;\n        return false;\n    }\n\n\n    qCDebug(runtime) << \"Key POT Range will be\" << minWPMRange << minWPMRange + 31;\n\n    QByteArray cmd;\n    cmd.resize(4);\n    cmd[0] = 0x05;\n    cmd[1] = minWPMRange;\n    cmd[2] = 31;\n    cmd[3] = 0xFFu;\n\n    qint64 size = writeAsyncData(cmd);\n    if ( size != 4 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n    }\n\n    return true;\n}\n\nQList<QPair<QString, int>> CWWinKey::sidetoneFrequencies()\n{\n    return {\n        {tr(\"4000 Hz\"), 4000},\n        {tr(\"2000 Hz\"), 2000},\n        {tr(\"1333 Hz\"), 1333},\n        {tr(\"1000 Hz\"), 1000},\n        {tr(\"800 Hz\"),   800},\n        {tr(\"666 Hz\"),   666},\n        {tr(\"571 Hz\"),   571},\n        {tr(\"500 Hz\"),   500},\n        {tr(\"444 Hz\"),   444},\n        {tr(\"400 Hz\"),   400}\n    };\n}\n\nbool CWWinKey::__setSidetone(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    /*\n     * Sidetone Control command: 0x01 <nn>\n     * Available on WinKey v2+ only (WK2 sidetone is always enabled).\n     *\n     * nn bit layout (Table 1 from WinKey spec):\n     *   Bit 7     : Paddle Only Sidetone - when 1, sidetone is muted for CW\n     *               sourced from the host port; paddle entry still has sidetone.\n     *   Bits 6-4  : Unused, set to zero.\n     *   Bits 3-0  : Sidetone frequency N (Table 2):\n     *               0x1=4000Hz, 0x2=2000Hz, 0x3=1333Hz, 0x4=1000Hz,\n     *               0x5=800Hz,  0x6=666Hz,  0x7=571Hz,  0x8=500Hz,\n     *               0x9=444Hz,  0xA=400Hz\n     *\n     * enabled=false -> Paddle Only Sidetone (0x80 | freqCode):\n     *                  host CW is muted, paddle sidetone at configured frequency.\n     * enabled=true  -> normal sidetone at configured frequency (freqCode).\n     */\n    if ( version < 20 )\n    {\n        qCDebug(runtime) << \"Sidetone control not supported on WK1\";\n        return false;\n    }\n\n    if ( !isInHostMode )\n    {\n        qCWarning(runtime) << \"Key is not in Host Mode\";\n        return false;\n    }\n\n    /* Convert Hz to WinKey frequency code (Table 2 of WinKey spec).\n     * sidetoneFrequency is stored in Hz; the combo shares Hz with CWDaemon. */\n    static const int hzToCode[][2] =\n    {\n        {4000, 1}, {2000, 2}, {1333, 3}, {1000, 4}, {800, 5},\n        {666,  6}, { 571, 7}, { 500, 8}, { 444, 9}, {400, 10}\n    };\n    int freqCode = 5; // fallback: 800 Hz\n    for ( const int (&pair)[2] : hzToCode )\n    {\n        if ( pair[0] == sidetoneFrequency )\n        {\n            freqCode = pair[1];\n            break;\n        }\n    }\n    unsigned char freqCodeByte = static_cast<unsigned char>(freqCode & 0x0F);\n    QByteArray cmd;\n    cmd.resize(2);\n    cmd[0] = 0x01;\n    cmd[1] = enabled ? freqCodeByte : static_cast<unsigned char>(0x80u | freqCodeByte);\n\n    qint64 size = writeAsyncData(cmd);\n    if ( size != 2 )\n    {\n        qWarning() << \"Unexpected size of write response or communication error\";\n        qCDebug(runtime) << lastError();\n        return false;\n    }\n\n    return true;\n}\n\n"
  },
  {
    "path": "cwkey/drivers/CWWinKey.h",
    "content": "#ifndef QLOG_CWKEY_DRIVERS_CWWINKEY_H\n#define QLOG_CWKEY_DRIVERS_CWWINKEY_H\n\n#include <QMutex>\n#include \"CWKey.h\"\n\nclass CWWinKey : public CWKey,\n                  protected CWKeySerialInterface\n{\n    Q_OBJECT\n\npublic:\n    explicit CWWinKey(const QString &portName,\n                      const qint32 baudrate,\n                      const CWKey::CWKeyModeID mode,\n                      const qint32 defaultSpeed,\n                      bool paddleSwap,\n                      bool paddleOnlySidetone,\n                      qint32 sidetoneFrequency,\n                      QObject *parent = nullptr);\n    virtual ~CWWinKey();\n\n    virtual bool open() override;\n    virtual bool close() override;\n    virtual QString lastError() override;\n\n    virtual bool sendText(const QString &text) override;\n    virtual bool setWPM(const qint16 wpm) override;\n    virtual bool immediatelyStop() override;\n\n    static QList<QPair<QString, int>> sidetoneFrequencies();\n    static int defaultSidetoneFrequency() { return 800; }\n\nprivate:\n\n    bool isInHostMode;\n    bool xoff;\n    bool paddleSwap;\n    bool paddleOnlySidetone;\n    qint32 sidetoneFrequency;\n\n    QMutex writeBufferMutex;\n    QMutex commandMutex;\n    QByteArray writeBuffer;\n    qint32 minWPMRange;\n    QString lastLogicalError;\n\n    void tryAsyncWrite();\n    unsigned char buildWKModeByte() const;\n    bool __sendStatusRequest();\n    bool __setPOTRange();\n    bool __setWPM(const qint16 wpm);\n    bool __setSidetone(bool enabled);\n    void __close();\n    unsigned char version;\n\nprivate slots:\n    void handleBytesWritten(qint64 bytes);\n    void handleError(QSerialPort::SerialPortError serialPortError);\n    void handleReadyRead();\n};\n\n#endif // QLOG_CWKEY_DRIVERS_CWWINKEY_H\n"
  },
  {
    "path": "data/Accents.cpp",
    "content": "#include \"Data.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.data\");\n\nconst char Data::translitTab[] = {\n1, ' ', 1, '!', 2, 'C', '/', 2, 'P', 'S', 2, '$', '?', 2, 'Y', '=',\n1, '|', 2, 'S', 'S', 1, '\\\"', 3, '(', 'c', ')', 1, 'a', 2, '<', '<',\n1, '!', 3, '(', 'r', ')', 1, '-', 3, 'd', 'e', 'g', 2, '+', '-', 1, '2',\n1, '3', 1, '\\'', 1, 'u', 1, 'P', 1, '*', 1, ',',\n1, '1', 1, 'o', 2, '>', '>', 5, ' ', '1', '/', '4', ' ', 5, ' ', '1', '/', '2', ' ', 5, ' ', '3', '/', '4', ' ',\n1, '?', 1, 'A', 1, 'A', 1, 'A', 1, 'A', 1, 'A',\n1, 'A', 2, 'A', 'E', 1, 'C', 1, 'E', 1, 'E', 1, 'E',\n1, 'E', 1, 'I', 1, 'I', 1, 'I', 1, 'I', 1, 'D',\n1, 'N', 1, 'O', 1, 'O', 1, 'O', 1, 'O', 1, 'O',\n1, 'x', 1, 'O', 1, 'U', 1, 'U', 1, 'U', 1, 'U',\n1, 'Y', 2, 'T', 'h', 2, 's', 's', 1, 'a', 1, 'a', 1, 'a',\n1, 'a', 1, 'a', 1, 'a', 2, 'a', 'e', 1, 'c', 1, 'e',\n1, 'e', 1, 'e', 1, 'e', 1, 'i', 1, 'i', 1, 'i',\n1, 'i', 1, 'd', 1, 'n', 1, 'o', 1, 'o', 1, 'o',\n1, 'o', 1, 'o', 1, '/', 1, 'o', 1, 'u', 1, 'u',\n1, 'u', 1, 'u', 1, 'y', 2, 't', 'h', 1, 'y', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 1, 'C',\n1, 'c', 1, 'C', 1, 'c', 1, 'C', 1, 'c', 1, 'C',\n1, 'c', 1, 'D', 1, 'd', 1, 'D', 1, 'd', 1, 'E',\n1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E',\n1, 'e', 1, 'E', 1, 'e', 1, 'G', 1, 'g', 1, 'G',\n1, 'g', 1, 'G', 1, 'g', 1, 'G', 1, 'g', 1, 'H',\n1, 'h', 1, 'H', 1, 'h', 1, 'I', 1, 'i', 1, 'I',\n1, 'i', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 1, 'I',\n1, 'i', 2, 'I', 'J', 2, 'i', 'j', 1, 'J', 1, 'j', 1, 'K',\n1, 'k', 1, 'k', 1, 'L', 1, 'l', 1, 'L', 1, 'l',\n1, 'L', 1, 'l', 1, 'L', 1, 'l', 1, 'L', 1, 'l',\n1, 'N', 1, 'n', 1, 'N', 1, 'n', 1, 'N', 1, 'n',\n2, '\\'', 'n', 2, 'n', 'g', 2, 'N', 'G', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 2, 'O', 'E', 2, 'o', 'e', 1, 'R',\n1, 'r', 1, 'R', 1, 'r', 1, 'R', 1, 'r', 1, 'S',\n1, 's', 1, 'S', 1, 's', 1, 'S', 1, 's', 1, 'S',\n1, 's', 1, 'T', 1, 't', 1, 'T', 1, 't', 1, 'T',\n1, 't', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U',\n1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U',\n1, 'u', 1, 'W', 1, 'w', 1, 'Y', 1, 'y', 1, 'Y',\n1, 'Z', 1, 'z', 1, 'Z', 1, 'z', 1, 'Z', 1, 'z',\n1, 's', 1, 'b', 1, 'B', 1, 'B', 1, 'b', 1, '6',\n1, '6', 1, 'O', 1, 'C', 1, 'c', 1, 'D', 1, 'D',\n1, 'D', 1, 'd', 1, 'd', 1, '3', 1, '@', 1, 'E',\n1, 'F', 1, 'f', 1, 'G', 1, 'G', 2, 'h', 'v', 1, 'I',\n1, 'I', 1, 'K', 1, 'k', 1, 'l', 1, 'l', 1, 'W',\n1, 'N', 1, 'n', 1, 'O', 1, 'O', 1, 'o', 2, 'O', 'I',\n2, 'o', 'i', 1, 'P', 1, 'p', 2, 'Y', 'R', 1, '2', 1, '2',\n2, 'S', 'H', 2, 's', 'h', 1, 't', 1, 'T', 1, 't', 1, 'T',\n1, 'U', 1, 'u', 1, 'Y', 1, 'V', 1, 'Y', 1, 'y',\n1, 'Z', 1, 'z', 2, 'Z', 'H', 2, 'Z', 'H', 2, 'z', 'h', 2, 'z', 'h',\n1, '2', 1, '5', 1, '5', 2, 't', 's', 1, 'w', 1, '|',\n2, '|', '|', 2, '|', '=', 1, '!', 2, 'D', 'Z', 2, 'D', 'z', 2, 'd', 'z',\n2, 'L', 'J', 2, 'L', 'j', 2, 'l', 'j', 2, 'N', 'J', 2, 'N', 'j', 2, 'n', 'j',\n1, 'A', 1, 'a', 1, 'I', 1, 'i', 1, 'O', 1, 'o',\n1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u',\n1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, '@', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 2, 'A', 'E', 2, 'a', 'e', 1, 'G',\n1, 'g', 1, 'G', 1, 'g', 1, 'K', 1, 'k', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 2, 'Z', 'H', 2, 'z', 'h', 1, 'j',\n2, 'D', 'Z', 2, 'D', 'z', 2, 'd', 'z', 1, 'G', 1, 'g', 2, 'H', 'V',\n1, 'W', 1, 'N', 1, 'n', 1, 'A', 1, 'a', 2, 'A', 'E',\n2, 'a', 'e', 1, 'O', 1, 'o', 1, 'A', 1, 'a', 1, 'A',\n1, 'a', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'I',\n1, 'i', 1, 'I', 1, 'i', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'R', 1, 'r', 1, 'R', 1, 'r', 1, 'U',\n1, 'u', 1, 'U', 1, 'u', 1, 'S', 1, 's', 1, 'T',\n1, 't', 1, 'Y', 1, 'y', 1, 'H', 1, 'h', 1, 'N',\n1, 'd', 2, 'O', 'U', 2, 'o', 'u', 1, 'Z', 1, 'z', 1, 'A',\n1, 'a', 1, 'E', 1, 'e', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'Y',\n1, 'y', 1, 'l', 1, 'n', 1, 't', 1, 'j', 2, 'd', 'b',\n2, 'q', 'p', 1, 'A', 1, 'C', 1, 'c', 1, 'L', 1, 'T',\n1, 's', 1, 'z', 1, 'B', 1, 'U', 1, '^', 1, 'E',\n1, 'e', 1, 'J', 1, 'j', 1, 'q', 1, 'q', 1, 'R',\n1, 'r', 1, 'Y', 1, 'y', 1, 'a', 1, 'a', 1, 'a',\n1, 'b', 1, 'o', 1, 'c', 1, 'd', 1, 'd', 1, 'e',\n1, '@', 1, '@', 1, 'e', 1, 'e', 1, 'e', 1, 'e',\n1, 'j', 1, 'g', 1, 'g', 1, 'g', 1, 'g', 1, 'u',\n1, 'Y', 1, 'h', 1, 'h', 1, 'i', 1, 'i', 1, 'I',\n1, 'l', 1, 'l', 1, 'l', 2, 'l', 'Z', 1, 'W', 1, 'W',\n1, 'm', 1, 'n', 1, 'n', 1, 'n', 1, 'o', 2, 'O', 'E',\n1, 'O', 1, 'F', 1, 'r', 1, 'r', 1, 'r', 1, 'r',\n1, 'r', 1, 'r', 1, 'r', 1, 'R', 1, 'R', 1, 's',\n1, 'S', 1, 'j', 1, 'S', 1, 'S', 1, 't', 1, 't',\n1, 'u', 1, 'U', 1, 'v', 1, '^', 1, 'w', 1, 'y',\n1, 'Y', 1, 'z', 1, 'z', 1, 'Z', 1, 'Z', 1, '?',\n1, '?', 1, '?', 1, 'C', 1, '@', 1, 'B', 1, 'E',\n1, 'G', 1, 'H', 1, 'j', 1, 'k', 1, 'L', 1, 'q',\n1, '?', 1, '?', 2, 'd', 'z', 2, 'd', 'Z', 2, 'd', 'z', 2, 't', 's',\n2, 't', 'S', 2, 't', 'C', 2, 'f', 'N', 2, 'l', 's', 2, 'l', 'z', 2, 'W', 'W',\n2, ']', ']', 1, 'h', 1, 'h', 1, 'h', 1, 'h', 1, 'j',\n1, 'r', 1, 'r', 1, 'r', 1, 'r', 1, 'w', 1, 'y',\n1, '\\'', 1, '\\\"', 1, '`', 1, '\\'', 1, '`', 1, '`',\n1, '\\'', 1, '?', 1, '?', 1, '<', 1, '>', 1, '^',\n1, 'V', 1, '^', 1, 'V', 1, '\\'', 1, '-', 1, '/',\n1, '\\\\', 1, ',', 1, '_', 1, '\\\\', 1, '/', 1, ':',\n1, '.', 1, '`', 1, '\\'', 1, '^', 1, 'V', 1, '+',\n1, '-', 1, 'V', 1, '.', 1, '@', 1, ',', 1, '~',\n1, '\\\"', 1, 'R', 1, 'X', 1, 'G', 1, 'l', 1, 's',\n1, 'x', 1, '?', 1, 'V', 1, '=', 1, '\\\"', 1, 'a',\n1, 'e', 1, 'i', 1, 'o', 1, 'u', 1, 'c', 1, 'd',\n1, 'h', 1, 'm', 1, 'r', 1, 't', 1, 'v', 1, 'x',\n1, '\\'', 1, ',', 1, '?', 1, 'A', 1, ';', 1, 'E',\n1, 'E', 1, 'I', 1, 'O', 1, 'U', 1, 'O', 1, 'I',\n1, 'A', 1, 'B', 1, 'G', 1, 'D', 1, 'E', 1, 'Z',\n1, 'E', 2, 'T', 'h', 1, 'I', 1, 'K', 1, 'L', 1, 'M',\n1, 'N', 2, 'K', 's', 1, 'O', 1, 'P', 1, 'R', 1, 'S',\n1, 'T', 1, 'U', 2, 'P', 'h', 2, 'K', 'h', 2, 'P', 's', 1, 'O',\n1, 'I', 1, 'U', 1, 'a', 1, 'e', 1, 'e', 1, 'i',\n1, 'u', 1, 'a', 1, 'b', 1, 'g', 1, 'd', 1, 'e',\n1, 'z', 1, 'e', 2, 't', 'h', 1, 'i', 1, 'k', 1, 'l',\n1, 'm', 1, 'n', 1, 'x', 1, 'o', 1, 'p', 1, 'r',\n1, 's', 1, 's', 1, 't', 1, 'u', 2, 'p', 'h', 2, 'k', 'h',\n2, 'p', 's', 1, 'o', 1, 'i', 1, 'u', 1, 'o', 1, 'u',\n1, 'o', 1, 'b', 2, 't', 'h', 1, 'U', 1, 'U', 1, 'U',\n2, 'p', 'h', 1, 'p', 1, '&', 2, 'S', 't', 2, 's', 't', 1, 'W',\n1, 'w', 1, 'Q', 1, 'q', 2, 'S', 'p', 2, 's', 'p', 2, 'S', 'h',\n2, 's', 'h', 1, 'F', 1, 'f', 2, 'K', 'h', 2, 'k', 'h', 1, 'H',\n1, 'h', 1, 'G', 1, 'g', 2, 'C', 'H', 2, 'c', 'h', 2, 'T', 'i',\n2, 't', 'i', 1, 'k', 1, 'r', 1, 'c', 1, 'j', 2, 'I', 'e',\n2, 'I', 'o', 2, 'D', 'j', 2, 'G', 'j', 2, 'I', 'e', 2, 'D', 'z', 1, 'I',\n2, 'Y', 'i', 1, 'J', 2, 'L', 'j', 2, 'N', 'j', 3, 'T', 's', 'h', 2, 'K', 'j',\n1, 'I', 1, 'U', 3, 'D', 'z', 'h', 1, 'A', 1, 'B', 1, 'V',\n1, 'G', 1, 'D', 1, 'E', 2, 'Z', 'h', 1, 'Z', 1, 'I',\n1, 'I', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O',\n1, 'P', 1, 'R', 1, 'S', 1, 'T', 1, 'U', 1, 'F',\n2, 'K', 'h', 2, 'T', 's', 2, 'C', 'h', 2, 'S', 'h', 4, 'S', 'h', 'c', 'h', 1, '\\'',\n1, 'Y', 1, '\\'', 1, 'E', 2, 'I', 'u', 2, 'I', 'a', 1, 'a',\n1, 'b', 1, 'v', 1, 'g', 1, 'd', 1, 'e', 2, 'z', 'h',\n1, 'z', 1, 'i', 1, 'i', 1, 'k', 1, 'l', 1, 'm',\n1, 'n', 1, 'o', 1, 'p', 1, 'r', 1, 's', 1, 't',\n1, 'u', 1, 'f', 2, 'k', 'h', 2, 't', 's', 2, 'c', 'h', 2, 's', 'h',\n4, 's', 'h', 'c', 'h', 1, '\\'', 1, 'y', 1, '\\'', 1, 'e', 2, 'i', 'u',\n2, 'i', 'a', 2, 'i', 'e', 2, 'i', 'o', 2, 'd', 'j', 2, 'g', 'j', 2, 'i', 'e',\n2, 'd', 'z', 1, 'i', 2, 'y', 'i', 1, 'j', 2, 'l', 'j', 2, 'n', 'j',\n3, 't', 's', 'h', 2, 'k', 'j', 1, 'i', 1, 'u', 3, 'd', 'z', 'h', 1, 'O',\n1, 'o', 1, 'E', 1, 'e', 2, 'I', 'e', 2, 'i', 'e', 1, 'E',\n1, 'e', 2, 'I', 'e', 2, 'i', 'e', 1, 'O', 1, 'o', 2, 'I', 'o',\n2, 'i', 'o', 2, 'K', 's', 2, 'k', 's', 2, 'P', 's', 2, 'p', 's', 1, 'F',\n1, 'f', 1, 'Y', 1, 'y', 1, 'Y', 1, 'y', 1, 'u',\n1, 'u', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 2, 'O', 't',\n2, 'o', 't', 1, 'Q', 1, 'q', 6, '*', '1', '0', '0', '0', '*', 9, '*', '1', '0', '0', '.', '0', '0', '0', '*', 11, '*', '1', '.', '0', '0', '0', '.', '0', '0', '0', '*',\n1, '\\\"', 1, '\\\"', 2, 'R', '\\'', 2, 'r', '\\'', 2, 'G', '\\'', 2, 'g', '\\'',\n2, 'G', '\\'', 2, 'g', '\\'', 2, 'G', '\\'', 2, 'g', '\\'', 3, 'Z', 'h', '\\'', 3, 'z', 'h', '\\'',\n2, 'Z', '\\'', 2, 'z', '\\'', 2, 'K', '\\'', 2, 'k', '\\'', 2, 'K', '\\'', 2, 'k', '\\'',\n2, 'K', '\\'', 2, 'k', '\\'', 2, 'K', '\\'', 2, 'k', '\\'', 2, 'N', '\\'', 2, 'n', '\\'',\n2, 'N', 'g', 2, 'n', 'g', 2, 'P', '\\'', 2, 'p', '\\'', 2, 'K', 'h', 2, 'k', 'h',\n2, 'S', '\\'', 2, 's', '\\'', 2, 'T', '\\'', 2, 't', '\\'', 1, 'U', 1, 'u',\n2, 'U', '\\'', 2, 'u', '\\'', 3, 'K', 'h', '\\'', 3, 'k', 'h', '\\'', 3, 'T', 't', 's', 3, 't', 't', 's',\n3, 'C', 'h', '\\'', 3, 'c', 'h', '\\'', 3, 'C', 'h', '\\'', 3, 'c', 'h', '\\'', 1, 'H', 1, 'h',\n2, 'C', 'h', 2, 'c', 'h', 3, 'C', 'h', '\\'', 3, 'c', 'h', '\\'', 1, '`', 2, 'Z', 'h',\n2, 'z', 'h', 2, 'K', '\\'', 2, 'k', '\\'', 2, 'N', '\\'', 2, 'n', '\\'', 2, 'C', 'h',\n2, 'c', 'h', 1, 'a', 1, 'a', 1, 'A', 1, 'a', 2, 'A', 'e',\n2, 'a', 'e', 2, 'I', 'e', 2, 'i', 'e', 1, '@', 1, '@', 1, '@',\n1, '@', 2, 'Z', 'h', 2, 'z', 'h', 1, 'Z', 1, 'z', 2, 'D', 'z',\n2, 'd', 'z', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'E',\n1, 'e', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U',\n1, 'u', 2, 'C', 'h', 2, 'c', 'h', 1, 'Y', 1, 'y', 1, 'A',\n1, 'B', 1, 'G', 1, 'D', 1, 'E', 1, 'Z', 1, 'E',\n1, 'E', 2, 'T', '`', 2, 'Z', 'h', 1, 'I', 1, 'L', 2, 'K', 'h',\n2, 'T', 's', 1, 'K', 1, 'H', 2, 'D', 'z', 2, 'G', 'h', 2, 'C', 'h',\n1, 'M', 1, 'Y', 1, 'N', 2, 'S', 'h', 1, 'O', 3, 'C', 'h', '`',\n1, 'P', 1, 'J', 2, 'R', 'h', 1, 'S', 1, 'V', 1, 'T',\n1, 'R', 3, 'T', 's', '`', 1, 'W', 2, 'P', '`', 2, 'K', '`', 1, 'O',\n1, 'F', 1, '<', 1, '\\'', 1, '/', 1, '!', 1, ',',\n1, '?', 1, '.', 1, 'a', 1, 'b', 1, 'g', 1, 'd',\n1, 'e', 1, 'z', 1, 'e', 1, 'e', 2, 't', '`', 2, 'z', 'h',\n1, 'i', 1, 'l', 2, 'k', 'h', 2, 't', 's', 1, 'k', 1, 'h',\n2, 'd', 'z', 2, 'g', 'h', 2, 'c', 'h', 1, 'm', 1, 'y', 1, 'n',\n2, 's', 'h', 1, 'o', 3, 'c', 'h', '`', 1, 'p', 1, 'j', 2, 'r', 'h',\n1, 's', 1, 'v', 1, 't', 1, 'r', 3, 't', 's', '`', 1, 'w',\n2, 'p', '`', 2, 'k', '`', 1, 'o', 1, 'f', 2, 'e', 'w', 1, ':',\n1, '-', 1, 'e', 1, 'a', 1, 'o', 1, 'i', 1, 'e',\n1, 'e', 1, 'a', 1, 'a', 1, 'o', 1, 'o', 1, 'u',\n1, '-', 1, '|', 1, '.', 1, 'n', 1, 'o', 1, 'A',\n1, 'b', 1, 'g', 1, 'd', 1, 'h', 1, 'v', 1, 'z',\n1, 'H', 1, 'T', 1, 'y', 2, 'K', 'H', 2, 'K', 'H', 1, 'l',\n1, 'm', 1, 'm', 1, 'n', 1, 'n', 1, 's', 1, '`',\n1, 'p', 1, 'p', 2, 'T', 'S', 2, 'T', 'S', 1, 'k', 1, 'r',\n2, 'S', 'H', 1, 't', 3, 'Y', 'Y', 'Y', 1, 'V', 2, 'O', 'Y', 2, 'E', 'Y',\n1, '\\'', 1, '\\\"', 1, ',', 1, ';', 1, '?', 1, 'a',\n1, '\\'', 2, 'w', '\\'', 2, 'y', '\\'', 1, 'b', 1, '@', 1, 't',\n2, 't', 'h', 1, 'j', 1, 'H', 2, 'k', 'h', 1, 'd', 2, 'd', 'h',\n1, 'r', 1, 'z', 1, 's', 2, 's', 'h', 1, 'S', 1, 'D',\n1, 'T', 1, 'Z', 1, '`', 1, 'G', 1, 'f', 1, 'q',\n1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'h', 1, 'w',\n1, '~', 1, 'y', 2, 'a', 'n', 2, 'u', 'n', 2, 'i', 'n', 1, 'a',\n1, 'u', 1, 'i', 1, 'W', 1, '\\'', 1, '\\'', 1, '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 1, '%', 1, '.', 1, ',',\n1, '*', 1, '\\'', 1, '\\'', 1, '\\'', 1, '\\'', 2, '\\'', 'w',\n2, '\\'', 'u', 2, '\\'', 'y', 2, 't', 't', 3, 't', 't', 'h', 1, 'b', 1, 't',\n1, 'T', 1, 'p', 2, 't', 'h', 2, 'b', 'h', 2, '\\'', 'h', 1, 'H',\n2, 'n', 'y', 2, 'd', 'y', 1, 'H', 2, 'c', 'h', 3, 'c', 'c', 'h', 2, 'd', 'd',\n1, 'D', 1, 'D', 2, 'D', 't', 2, 'd', 'h', 3, 'd', 'd', 'h', 1, 'd',\n1, 'D', 1, 'D', 2, 'r', 'r', 1, 'R', 1, 'R', 1, 'R',\n1, 'R', 1, 'R', 1, 'R', 1, 'j', 1, 'R', 1, 'S',\n1, 'S', 1, 'S', 1, 'S', 1, 'S', 1, 'T', 2, 'G', 'H',\n1, 'F', 1, 'F', 1, 'F', 1, 'v', 1, 'f', 2, 'p', 'h',\n1, 'Q', 1, 'Q', 2, 'k', 'h', 1, 'k', 1, 'K', 1, 'K',\n2, 'n', 'g', 1, 'K', 1, 'g', 1, 'G', 1, 'N', 1, 'G',\n1, 'G', 1, 'G', 1, 'L', 1, 'L', 1, 'L', 1, 'L',\n1, 'N', 1, 'N', 1, 'N', 1, 'N', 1, 'N', 1, 'h',\n2, 'C', 'h', 2, 'h', 'y', 1, 'h', 1, 'H', 1, '@', 1, 'W',\n2, 'o', 'e', 2, 'o', 'e', 1, 'u', 2, 'y', 'u', 2, 'y', 'u', 1, 'W',\n1, 'v', 1, 'y', 1, 'Y', 1, 'Y', 1, 'W', 1, 'y',\n2, 'y', '\\'', 1, '.', 2, 'a', 'e', 1, '@', 1, '#', 1, '^',\n1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5',\n1, '6', 1, '7', 1, '8', 1, '9', 2, 'S', 'h', 1, 'D',\n2, 'G', 'h', 1, '&', 2, '+', 'm', 2, '/', '/', 1, '/', 1, ',',\n1, '!', 1, '!', 1, '-', 1, ',', 1, ',', 1, ';',\n1, '?', 1, '~', 1, '{', 1, '}', 1, '*', 1, '\\'',\n1, 'b', 1, 'g', 1, 'g', 1, 'd', 1, 'd', 1, 'h',\n1, 'w', 1, 'z', 1, 'H', 1, 't', 1, 't', 1, 'y',\n2, 'y', 'h', 1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 's',\n1, 's', 1, '`', 1, 'p', 1, 'p', 1, 'S', 1, 'q',\n1, 'r', 2, 's', 'h', 1, 't', 1, 'a', 1, 'a', 1, 'a',\n1, 'A', 1, 'A', 1, 'A', 1, 'e', 1, 'e', 1, 'e',\n1, 'E', 1, 'i', 1, 'i', 1, 'u', 1, 'u', 1, 'u',\n1, 'o', 1, '`', 1, '\\'', 1, 'X', 1, 'Q', 1, '@',\n1, '@', 1, '|', 1, '+', 1, 'h', 2, 's', 'h', 1, 'n',\n1, 'r', 1, 'b', 1, 'L', 1, 'k', 1, '\\'', 1, 'v',\n1, 'm', 1, 'f', 2, 'd', 'h', 2, 't', 'h', 1, 'l', 1, 'g',\n2, 'n', 'y', 1, 's', 1, 'd', 1, 'z', 1, 't', 1, 'y',\n1, 'p', 1, 'j', 2, 'c', 'h', 2, 't', 't', 2, 'h', 'h', 2, 'k', 'h',\n2, 't', 'h', 1, 'z', 2, 's', 'h', 1, 's', 1, 'd', 1, 't',\n1, 'z', 1, '`', 2, 'g', 'h', 1, 'q', 1, 'w', 1, 'a',\n2, 'a', 'a', 1, 'i', 2, 'e', 'e', 1, 'u', 2, 'o', 'o', 1, 'e',\n2, 'e', 'y', 1, 'o', 2, 'o', 'a', 1, 'N', 1, 'N', 1, 'H',\n1, 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u',\n1, 'R', 1, 'L', 2, 'e', 'N', 1, 'e', 1, 'e', 2, 'a', 'i',\n2, 'o', 'N', 1, 'o', 1, 'o', 2, 'a', 'u', 1, 'k', 2, 'k', 'h',\n1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c', 2, 'c', 'h', 1, 'j',\n2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd', 3, 'd', 'd', 'h',\n2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h', 1, 'n',\n3, 'n', 'n', 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm',\n1, 'y', 1, 'r', 2, 'r', 'r', 1, 'l', 1, 'l', 3, 'l', 'l', 'l',\n1, 'v', 2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h', 1, '\\'',\n1, '\\'', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u',\n1, 'R', 2, 'R', 'R', 2, 'e', 'N', 1, 'e', 1, 'e', 2, 'a', 'i',\n2, 'o', 'N', 1, 'o', 1, 'o', 2, 'a', 'u', 3, 'A', 'U', 'M', 1, '\\'',\n1, '\\'', 1, '`', 1, '\\'', 1, 'q', 3, 'k', 'h', 'h', 3, 'g', 'h', 'h',\n1, 'z', 4, 'd', 'd', 'd', 'h', 2, 'r', 'h', 1, 'f', 2, 'y', 'y', 2, 'R', 'R',\n2, 'L', 'L', 1, 'L', 2, 'L', 'L', 3, ' ', '/', ' ', 4, ' ', '/', '/', ' ', 1, '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 1, '.', 1, 'N', 1, 'N',\n1, 'H', 1, 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u',\n2, 'u', 'u', 1, 'R', 2, 'R', 'R', 1, 'e', 2, 'a', 'i', 1, 'o',\n2, 'a', 'u', 1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g',\n1, 'c', 2, 'c', 'h', 1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't',\n3, 't', 't', 'h', 2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h',\n1, 'd', 2, 'd', 'h', 1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b',\n2, 'b', 'h', 1, 'm', 1, 'y', 1, 'r', 1, 'l', 2, 's', 'h',\n2, 's', 's', 1, 's', 1, 'h', 1, '\\'', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 2, 'R', 'R', 1, 'e',\n2, 'a', 'i', 1, 'o', 2, 'a', 'u', 1, '+', 2, 'r', 'r', 2, 'r', 'h',\n2, 'y', 'y', 2, 'R', 'R', 2, 'L', 'L', 1, 'L', 2, 'L', 'L', 1, '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 2, 'r', '\\'', 2, 'r', '`', 2, 'R', 's',\n2, 'R', 's', 2, '1', '/', 2, '2', '/', 2, '3', '/', 2, '4', '/', 7, ' ', '1', ' ', '-', ' ', '1', '/',\n3, '/', '1', '6', 1, 'N', 1, 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i',\n1, 'u', 2, 'u', 'u', 2, 'e', 'e', 2, 'a', 'i', 2, 'o', 'o', 2, 'a', 'u',\n1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c',\n2, 'c', 'h', 1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h',\n2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd',\n2, 'd', 'h', 1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'b',\n1, 'm', 1, 'y', 1, 'r', 1, 'l', 2, 'l', 'l', 1, 'v',\n2, 's', 'h', 1, 's', 1, 'h', 1, '\\'', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 2, 'e', 'e', 2, 'a', 'i', 2, 'o', 'o',\n2, 'a', 'u', 3, 'k', 'h', 'h', 3, 'g', 'h', 'h', 1, 'z', 2, 'r', 'r', 1, 'f',\n1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5',\n1, '6', 1, '7', 1, '8', 1, '9', 1, 'N', 1, 'H',\n6, 'G', '.', 'E', '.', 'O', '.', 1, 'N', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a',\n1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 2, 'e', 'N',\n1, 'e', 2, 'a', 'i', 2, 'o', 'N', 1, 'o', 2, 'a', 'u', 1, 'k',\n2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c', 2, 'c', 'h',\n1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd',\n3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h',\n1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm',\n2, 'y', 'a', 1, 'r', 1, 'l', 2, 'l', 'l', 1, 'v', 2, 's', 'h',\n2, 's', 's', 1, 's', 1, 'h', 1, '\\'', 1, '\\'', 2, 'a', 'a',\n1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 2, 'R', 'R',\n2, 'e', 'N', 1, 'e', 2, 'a', 'i', 2, 'o', 'N', 1, 'o', 2, 'a', 'u',\n3, 'A', 'U', 'M', 2, 'R', 'R', 1, '0', 1, '1', 1, '2', 1, '3',\n1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9',\n1, 'N', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 1, 'L', 1, 'e',\n2, 'a', 'i', 1, 'o', 2, 'a', 'u', 1, 'k', 2, 'k', 'h', 1, 'g',\n2, 'g', 'h', 2, 'n', 'g', 1, 'c', 2, 'c', 'h', 1, 'j', 2, 'j', 'h',\n2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n',\n1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h', 1, 'n', 1, 'p',\n2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm', 1, 'y', 1, 'r',\n1, 'l', 2, 'l', 'l', 2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h',\n1, '\\'', 1, '\\'', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u',\n2, 'u', 'u', 1, 'R', 1, 'e', 2, 'a', 'i', 1, 'o', 2, 'a', 'u',\n1, '+', 1, '+', 2, 'r', 'r', 2, 'r', 'h', 2, 'y', 'y', 2, 'R', 'R',\n2, 'L', 'L', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4',\n1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 1, 'N',\n1, 'H', 1, 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u',\n2, 'u', 'u', 1, 'e', 2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o',\n2, 'a', 'u', 1, 'k', 2, 'n', 'g', 1, 'c', 1, 'j', 2, 'n', 'y',\n2, 't', 't', 2, 'n', 'n', 1, 't', 1, 'n', 3, 'n', 'n', 'n', 1, 'p',\n1, 'm', 1, 'y', 1, 'r', 2, 'r', 'r', 1, 'l', 2, 'l', 'l',\n3, 'l', 'l', 'l', 1, 'v', 2, 's', 's', 1, 's', 1, 'h', 2, 'a', 'a',\n1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'e', 2, 'e', 'e',\n2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, '+', 1, '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 4, '+', '1', '0', '+', 5, '+', '1', '0', '0', '+', 6, '+', '1', '0', '0', '0', '+',\n1, 'N', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 1, 'L', 1, 'e',\n2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, 'k',\n2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c', 2, 'c', 'h',\n1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd',\n3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h',\n1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm',\n1, 'y', 1, 'r', 2, 'r', 'r', 1, 'l', 2, 'l', 'l', 1, 'v',\n2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 2, 'R', 'R', 1, 'e',\n2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, '+',\n1, '+', 2, 'R', 'R', 2, 'L', 'L', 1, '0', 1, '1', 1, '2',\n1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8',\n1, '9', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 1, 'L', 1, 'e',\n2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, 'k',\n2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c', 2, 'c', 'h',\n1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd',\n3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h',\n1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm',\n1, 'y', 1, 'r', 2, 'r', 'r', 1, 'l', 2, 'l', 'l', 1, 'v',\n2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h', 2, 'a', 'a', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 2, 'R', 'R', 1, 'e',\n2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, '+',\n1, '+', 3, 'l', 'l', 'l', 2, 'R', 'R', 2, 'L', 'L', 1, '0', 1, '1',\n1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7',\n1, '8', 1, '9', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a',\n1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 1, 'L',\n1, 'e', 2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u',\n1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c',\n2, 'c', 'h', 1, 'j', 2, 'j', 'h', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h',\n2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd',\n2, 'd', 'h', 1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h',\n1, 'm', 1, 'y', 1, 'r', 2, 'r', 'r', 1, 'l', 2, 'l', 'l',\n3, 'l', 'l', 'l', 1, 'v', 2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h',\n2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R',\n1, 'e', 2, 'e', 'e', 2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u',\n1, '+', 2, 'R', 'R', 2, 'L', 'L', 1, '0', 1, '1', 1, '2',\n1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8',\n1, '9', 1, 'N', 1, 'H', 1, 'a', 2, 'a', 'a', 2, 'a', 'e',\n3, 'a', 'a', 'e', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R',\n2, 'R', 'R', 1, 'L', 2, 'L', 'L', 1, 'e', 2, 'e', 'e', 2, 'a', 'i',\n1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, 'k', 2, 'k', 'h', 1, 'g',\n2, 'g', 'h', 2, 'n', 'g', 3, 'n', 'n', 'g', 1, 'c', 2, 'c', 'h', 1, 'j',\n2, 'j', 'h', 2, 'n', 'y', 3, 'j', 'n', 'y', 3, 'n', 'y', 'j', 2, 't', 't', 3, 't', 't', 'h',\n2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 4, 'n', 'n', 'd', 'd', 1, 't', 2, 't', 'h',\n1, 'd', 2, 'd', 'h', 1, 'n', 2, 'n', 'd', 1, 'p', 2, 'p', 'h',\n1, 'b', 2, 'b', 'h', 1, 'm', 2, 'm', 'b', 1, 'y', 1, 'r',\n1, 'l', 1, 'v', 2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h',\n2, 'l', 'l', 1, 'f', 2, 'a', 'a', 2, 'a', 'e', 3, 'a', 'a', 'e', 1, 'i',\n2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'R', 1, 'e', 2, 'e', 'e',\n2, 'a', 'i', 1, 'o', 2, 'o', 'o', 2, 'a', 'u', 1, 'L', 2, 'R', 'R',\n2, 'L', 'L', 3, ' ', '.', ' ', 1, 'k', 2, 'k', 'h', 2, 'k', 'h', 2, 'k', 'h',\n2, 'k', 'h', 2, 'k', 'h', 2, 'n', 'g', 3, 'c', 'c', 'h', 2, 'c', 'h', 2, 'c', 'h',\n2, 'c', 'h', 2, 'c', 'h', 1, 'y', 1, 'd', 1, 't', 2, 't', 'h',\n2, 't', 'h', 2, 't', 'h', 1, 'n', 1, 'd', 1, 't', 2, 't', 'h',\n2, 't', 'h', 2, 't', 'h', 1, 'n', 1, 'b', 1, 'p', 2, 'p', 'h',\n1, 'f', 2, 'p', 'h', 1, 'f', 2, 'p', 'h', 1, 'm', 1, 'y',\n1, 'r', 1, 'R', 1, 'l', 1, 'L', 1, 'w', 1, 's',\n1, 's', 1, 's', 1, 'h', 1, 'l', 1, '`', 1, 'h',\n1, '~', 1, 'a', 1, 'a', 2, 'a', 'a', 2, 'a', 'm', 1, 'i',\n2, 'i', 'i', 2, 'u', 'e', 3, 'u', 'u', 'e', 1, 'u', 2, 'u', 'u', 1, '\\'',\n3, 'B', 'h', '.', 1, 'e', 2, 'a', 'e', 1, 'o', 2, 'a', 'i', 2, 'a', 'i',\n2, 'a', 'o', 1, '+', 1, 'M', 3, ' ', '*', ' ', 1, '0', 1, '1',\n1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7',\n1, '8', 1, '9', 4, ' ', '/', '/', ' ', 5, ' ', '/', '/', '/', ' ', 1, 'k', 2, 'k', 'h',\n2, 'k', 'h', 2, 'n', 'g', 2, 'c', 'h', 1, 's', 2, 'n', 'y', 1, 'd',\n1, 'h', 2, 't', 'h', 2, 't', 'h', 1, 'n', 1, 'b', 1, 'p',\n2, 'p', 'h', 1, 'f', 2, 'p', 'h', 1, 'f', 1, 'm', 1, 'y',\n1, 'r', 1, 'l', 1, 'w', 1, 's', 1, 'h', 1, '`',\n1, '~', 1, 'a', 2, 'a', 'a', 2, 'a', 'm', 1, 'i', 2, 'i', 'i',\n1, 'y', 2, 'y', 'y', 1, 'u', 2, 'u', 'u', 1, 'o', 1, 'l',\n2, 'n', 'y', 1, 'e', 2, 'e', 'i', 1, 'o', 2, 'a', 'y', 2, 'a', 'i',\n1, '+', 1, 'M', 1, '0', 1, '1', 1, '2', 1, '3',\n1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9',\n2, 'h', 'n', 2, 'h', 'm', 3, 'A', 'U', 'M', 4, ' ', '/', '/', ' ', 3, ' ', '*', ' ', 1, '-',\n3, ' ', '/', ' ', 3, ' ', '/', ' ', 4, ' ', '/', '/', ' ', 4, ' ', '-', '/', ' ', 4, ' ', '+', '/', ' ', 4, ' ', 'X', '/', ' ',\n6, ' ', '/', 'X', 'X', '/', ' ', 5, ' ', '/', 'X', '/', ' ', 2, ',', ' ', 1, '0', 1, '1', 1, '2',\n1, '3', 1, '4', 1, '5', 1, '6', 1, '7', 1, '8',\n1, '9', 2, '.', '5', 3, '1', '.', '5', 3, '2', '.', '5', 3, '3', '.', '5', 3, '4', '.', '5',\n3, '5', '.', '5', 3, '6', '.', '5', 3, '7', '.', '5', 3, '8', '.', '5', 3, '-', '.', '5', 1, '+',\n1, '*', 1, '^', 1, '_', 1, '~', 1, ']', 2, '[', '[',\n2, ']', ']', 1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g',\n1, 'c', 2, 'c', 'h', 1, 'j', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h',\n2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd',\n2, 'd', 'h', 1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h',\n1, 'm', 2, 't', 's', 3, 't', 's', 'h', 2, 'd', 'z', 3, 'd', 'z', 'h', 1, 'w',\n2, 'z', 'h', 1, 'z', 1, '\\'', 1, 'y', 1, 'r', 1, 'l',\n2, 's', 'h', 3, 's', 's', 'h', 1, 's', 1, 'h', 1, 'a', 3, 'k', 's', 's',\n1, 'r', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u',\n1, 'R', 2, 'R', 'R', 1, 'L', 2, 'L', 'L', 1, 'e', 2, 'e', 'e',\n1, 'o', 2, 'o', 'o', 1, 'M', 1, 'H', 1, 'i', 2, 'i', 'i',\n1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g', 1, 'c',\n2, 'c', 'h', 1, 'j', 2, 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd',\n3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h',\n1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm',\n2, 't', 's', 3, 't', 's', 'h', 2, 'd', 'z', 3, 'd', 'z', 'h', 1, 'w', 2, 'z', 'h',\n1, 'z', 1, '\\'', 1, 'y', 1, 'r', 1, 'l', 2, 's', 'h',\n2, 's', 's', 1, 's', 1, 'h', 1, 'a', 3, 'k', 's', 's', 1, 'w',\n1, 'y', 1, 'r', 1, 'X', 5, ' ', ':', 'X', ':', ' ', 5, ' ', '/', 'O', '/', ' ', 5, ' ', '/', 'o', '/', ' ',\n5, ' ', '\\\\', 'o', '\\\\', ' ', 5, ' ', '(', 'O', ')', ' ', 1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h',\n2, 'n', 'g', 1, 'c', 2, 'c', 'h', 1, 'j', 2, 'j', 'h', 2, 'n', 'y',\n3, 'n', 'n', 'y', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd', 3, 'd', 'd', 'h', 2, 'n', 'n',\n2, 't', 't', 2, 't', 'h', 1, 'd', 2, 'd', 'h', 1, 'n', 1, 'p',\n2, 'p', 'h', 1, 'b', 2, 'b', 'h', 1, 'm', 1, 'y', 1, 'r',\n1, 'l', 1, 'w', 1, 's', 1, 'h', 2, 'l', 'l', 1, 'a',\n1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u', 1, 'e', 1, 'o',\n2, 'a', 'u', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'u',\n1, 'e', 2, 'a', 'i', 1, 'N', 1, '\\'', 1, ':', 1, '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 3, ' ', '/', ' ', 4, ' ', '/', '/', ' ', 2, 'n', '*',\n2, 'r', '*', 2, 'l', '*', 2, 'e', '*', 2, 's', 'h', 2, 's', 's', 1, 'R',\n2, 'R', 'R', 1, 'L', 2, 'L', 'L', 1, 'R', 2, 'R', 'R', 1, 'L',\n2, 'L', 'L', 1, 'A', 1, 'B', 1, 'G', 1, 'D', 1, 'E',\n1, 'V', 1, 'Z', 2, 'T', '`', 1, 'I', 1, 'K', 1, 'L',\n1, 'M', 1, 'N', 1, 'O', 1, 'P', 2, 'Z', 'h', 1, 'R',\n1, 'S', 1, 'T', 1, 'U', 2, 'P', '`', 2, 'K', '`', 2, 'G', '\\'',\n1, 'Q', 2, 'S', 'h', 3, 'C', 'h', '`', 2, 'C', '`', 2, 'Z', '\\'', 1, 'C',\n2, 'C', 'h', 1, 'X', 1, 'J', 1, 'H', 1, 'E', 1, 'Y',\n1, 'W', 2, 'X', 'h', 2, 'O', 'E', 1, 'a', 1, 'b', 1, 'g',\n1, 'd', 1, 'e', 1, 'v', 1, 'z', 2, 't', '`', 1, 'i',\n1, 'k', 1, 'l', 1, 'm', 1, 'n', 1, 'o', 1, 'p',\n2, 'z', 'h', 1, 'r', 1, 's', 1, 't', 1, 'u', 2, 'p', '`',\n2, 'k', '`', 2, 'g', '\\'', 1, 'q', 2, 's', 'h', 3, 'c', 'h', '`', 2, 'c', '`',\n2, 'z', '\\'', 1, 'c', 2, 'c', 'h', 1, 'x', 1, 'j', 1, 'h',\n1, 'e', 1, 'y', 1, 'w', 2, 'x', 'h', 2, 'o', 'e', 1, 'f',\n4, ' ', '/', '/', ' ', 1, 'g', 2, 'g', 'g', 1, 'n', 1, 'd', 2, 'd', 'd',\n1, 'r', 1, 'm', 1, 'b', 2, 'b', 'b', 1, 's', 2, 's', 's',\n1, 'j', 2, 'j', 'j', 1, 'c', 1, 'k', 1, 't', 1, 'p',\n1, 'h', 2, 'n', 'g', 2, 'n', 'n', 2, 'n', 'd', 2, 'n', 'b', 2, 'd', 'g',\n2, 'r', 'n', 2, 'r', 'r', 2, 'r', 'h', 2, 'r', 'N', 2, 'm', 'b', 2, 'm', 'N',\n2, 'b', 'g', 2, 'b', 'n', 2, 'b', 's', 3, 'b', 's', 'g', 3, 'b', 's', 't', 3, 'b', 's', 'b',\n3, 'b', 's', 's', 3, 'b', 's', 'j', 2, 'b', 'j', 2, 'b', 'c', 2, 'b', 't', 2, 'b', 'p',\n2, 'b', 'N', 3, 'b', 'b', 'N', 2, 's', 'g', 2, 's', 'n', 2, 's', 'd', 2, 's', 'r',\n2, 's', 'm', 2, 's', 'b', 3, 's', 'b', 'g', 3, 's', 's', 's', 1, 's', 2, 's', 'j',\n2, 's', 'c', 2, 's', 'k', 2, 's', 't', 2, 's', 'p', 2, 's', 'h', 1, 'Z',\n1, 'g', 1, 'd', 1, 'm', 1, 'b', 1, 's', 1, 'Z',\n1, 'j', 1, 'c', 1, 't', 1, 'p', 1, 'N', 1, 'j',\n2, 'c', 'k', 2, 'c', 'h', 2, 'p', 'b', 2, 'p', 'N', 2, 'h', 'h', 1, 'Q',\n1, 'a', 2, 'a', 'e', 2, 'y', 'a', 3, 'y', 'a', 'e', 2, 'e', 'o', 1, 'e',\n3, 'y', 'e', 'o', 2, 'y', 'e', 1, 'o', 2, 'w', 'a', 3, 'w', 'a', 'e', 2, 'o', 'e',\n2, 'y', 'o', 1, 'u', 3, 'w', 'e', 'o', 2, 'w', 'e', 2, 'w', 'i', 2, 'y', 'u',\n2, 'e', 'u', 2, 'y', 'i', 1, 'i', 3, 'a', '-', 'o', 3, 'a', '-', 'u', 4, 'y', 'a', '-', 'o',\n5, 'y', 'a', '-', 'y', 'o', 4, 'e', 'o', '-', 'o', 4, 'e', 'o', '-', 'u', 5, 'e', 'o', '-', 'e', 'u', 5, 'y', 'e', 'o', '-', 'o', 5, 'y', 'e', 'o', '-', 'u',\n4, 'o', '-', 'e', 'o', 3, 'o', '-', 'e', 4, 'o', '-', 'y', 'e', 3, 'o', '-', 'o', 3, 'o', '-', 'u', 5, 'y', 'o', '-', 'y', 'a',\n6, 'y', 'o', '-', 'y', 'a', 'e', 6, 'y', 'o', '-', 'y', 'e', 'o', 4, 'y', 'o', '-', 'o', 4, 'y', 'o', '-', 'i', 3, 'u', '-', 'a', 4, 'u', '-', 'a', 'e',\n7, 'u', '-', 'e', 'o', '-', 'e', 'u', 4, 'u', '-', 'y', 'e', 3, 'u', '-', 'u', 4, 'y', 'u', '-', 'a', 5, 'y', 'u', '-', 'e', 'o', 4, 'y', 'u', '-', 'e',\n6, 'y', 'u', '-', 'y', 'e', 'o', 5, 'y', 'u', '-', 'y', 'e', 4, 'y', 'u', '-', 'u', 4, 'y', 'u', '-', 'i', 4, 'e', 'u', '-', 'u', 5, 'e', 'u', '-', 'e', 'u',\n4, 'y', 'i', '-', 'u', 3, 'i', '-', 'a', 4, 'i', '-', 'y', 'a', 3, 'i', '-', 'o', 3, 'i', '-', 'u', 4, 'i', '-', 'e', 'u',\n3, 'i', '-', 'U', 1, 'U', 4, 'U', '-', 'e', 'o', 3, 'U', '-', 'u', 3, 'U', '-', 'i', 2, 'U', 'U',\n1, 'g', 2, 'g', 'g', 2, 'g', 's', 1, 'n', 2, 'n', 'j', 2, 'n', 'h',\n1, 'd', 1, 'l', 2, 'l', 'g', 2, 'l', 'm', 2, 'l', 'b', 2, 'l', 's',\n2, 'l', 't', 2, 'l', 'p', 2, 'l', 'h', 1, 'm', 1, 'b', 2, 'b', 's',\n1, 's', 2, 's', 's', 2, 'n', 'g', 1, 'j', 1, 'c', 1, 'k',\n1, 't', 1, 'p', 1, 'h', 2, 'g', 'l', 3, 'g', 's', 'g', 2, 'n', 'g',\n2, 'n', 'd', 2, 'n', 's', 2, 'n', 'Z', 2, 'n', 't', 2, 'd', 'g', 2, 't', 'l',\n3, 'l', 'g', 's', 2, 'l', 'n', 2, 'l', 'd', 3, 'l', 't', 'h', 2, 'l', 'l', 3, 'l', 'm', 'g',\n3, 'l', 'm', 's', 3, 'l', 'b', 's', 3, 'l', 'b', 'h', 3, 'r', 'N', 'p', 3, 'l', 's', 's', 2, 'l', 'Z',\n2, 'l', 'k', 2, 'l', 'Q', 2, 'm', 'g', 2, 'm', 'l', 2, 'm', 'b', 2, 'm', 's',\n3, 'm', 's', 's', 2, 'm', 'Z', 2, 'm', 'c', 2, 'm', 'h', 2, 'm', 'N', 2, 'b', 'l',\n2, 'b', 'p', 2, 'p', 'h', 2, 'p', 'N', 2, 's', 'g', 2, 's', 'd', 2, 's', 'l',\n2, 's', 'b', 1, 'Z', 1, 'g', 2, 's', 's', 2, 'k', 'h', 1, 'N',\n2, 'N', 's', 2, 'N', 'Z', 2, 'p', 'b', 2, 'p', 'N', 2, 'h', 'n', 2, 'h', 'l',\n2, 'h', 'm', 2, 'h', 'b', 1, 'Q', 2, 'h', 'a', 2, 'h', 'u', 2, 'h', 'i',\n3, 'h', 'a', 'a', 3, 'h', 'e', 'e', 2, 'h', 'e', 2, 'h', 'o', 2, 'l', 'a', 2, 'l', 'u',\n2, 'l', 'i', 3, 'l', 'a', 'a', 3, 'l', 'e', 'e', 2, 'l', 'e', 2, 'l', 'o', 3, 'l', 'w', 'a',\n3, 'h', 'h', 'a', 3, 'h', 'h', 'u', 3, 'h', 'h', 'i', 4, 'h', 'h', 'a', 'a', 4, 'h', 'h', 'e', 'e', 3, 'h', 'h', 'e',\n3, 'h', 'h', 'o', 4, 'h', 'h', 'w', 'a', 2, 'm', 'a', 2, 'm', 'u', 2, 'm', 'i', 3, 'm', 'a', 'a',\n3, 'm', 'e', 'e', 2, 'm', 'e', 2, 'm', 'o', 3, 'm', 'w', 'a', 3, 's', 'z', 'a', 3, 's', 'z', 'u',\n3, 's', 'z', 'i', 4, 's', 'z', 'a', 'a', 4, 's', 'z', 'e', 'e', 3, 's', 'z', 'e', 3, 's', 'z', 'o', 4, 's', 'z', 'w', 'a',\n2, 'r', 'a', 2, 'r', 'u', 2, 'r', 'i', 3, 'r', 'a', 'a', 3, 'r', 'e', 'e', 2, 'r', 'e',\n2, 'r', 'o', 3, 'r', 'w', 'a', 2, 's', 'a', 2, 's', 'u', 2, 's', 'i', 3, 's', 'a', 'a',\n3, 's', 'e', 'e', 2, 's', 'e', 2, 's', 'o', 3, 's', 'w', 'a', 3, 's', 'h', 'a', 3, 's', 'h', 'u',\n3, 's', 'h', 'i', 4, 's', 'h', 'a', 'a', 4, 's', 'h', 'e', 'e', 3, 's', 'h', 'e', 3, 's', 'h', 'o', 4, 's', 'h', 'w', 'a',\n2, 'q', 'a', 2, 'q', 'u', 2, 'q', 'i', 3, 'q', 'a', 'a', 3, 'q', 'e', 'e', 2, 'q', 'e',\n2, 'q', 'o', 3, 'q', 'w', 'a', 3, 'q', 'w', 'i', 4, 'q', 'w', 'a', 'a', 4, 'q', 'w', 'e', 'e', 3, 'q', 'w', 'e',\n3, 'q', 'h', 'a', 3, 'q', 'h', 'u', 3, 'q', 'h', 'i', 4, 'q', 'h', 'a', 'a', 4, 'q', 'h', 'e', 'e', 3, 'q', 'h', 'e',\n3, 'q', 'h', 'o', 4, 'q', 'h', 'w', 'a', 4, 'q', 'h', 'w', 'i', 5, 'q', 'h', 'w', 'a', 'a', 5, 'q', 'h', 'w', 'e', 'e', 4, 'q', 'h', 'w', 'e',\n2, 'b', 'a', 2, 'b', 'u', 2, 'b', 'i', 3, 'b', 'a', 'a', 3, 'b', 'e', 'e', 2, 'b', 'e',\n2, 'b', 'o', 3, 'b', 'w', 'a', 2, 'v', 'a', 2, 'v', 'u', 2, 'v', 'i', 3, 'v', 'a', 'a',\n3, 'v', 'e', 'e', 2, 'v', 'e', 2, 'v', 'o', 3, 'v', 'w', 'a', 2, 't', 'a', 2, 't', 'u',\n2, 't', 'i', 3, 't', 'a', 'a', 3, 't', 'e', 'e', 2, 't', 'e', 2, 't', 'o', 3, 't', 'w', 'a',\n2, 'c', 'a', 2, 'c', 'u', 2, 'c', 'i', 3, 'c', 'a', 'a', 3, 'c', 'e', 'e', 2, 'c', 'e',\n2, 'c', 'o', 3, 'c', 'w', 'a', 2, 'x', 'a', 2, 'x', 'u', 2, 'x', 'i', 3, 'x', 'a', 'a',\n3, 'x', 'e', 'e', 2, 'x', 'e', 2, 'x', 'o', 3, 'x', 'w', 'a', 3, 'x', 'w', 'i', 4, 'x', 'w', 'a', 'a',\n4, 'x', 'w', 'e', 'e', 3, 'x', 'w', 'e', 2, 'n', 'a', 2, 'n', 'u', 2, 'n', 'i', 3, 'n', 'a', 'a',\n3, 'n', 'e', 'e', 2, 'n', 'e', 2, 'n', 'o', 3, 'n', 'w', 'a', 3, 'n', 'y', 'a', 3, 'n', 'y', 'u',\n3, 'n', 'y', 'i', 4, 'n', 'y', 'a', 'a', 4, 'n', 'y', 'e', 'e', 3, 'n', 'y', 'e', 3, 'n', 'y', 'o', 4, 'n', 'y', 'w', 'a',\n2, '\\'', 'a', 2, '\\'', 'u', 3, '\\'', 'a', 'a', 3, '\\'', 'e', 'e', 2, '\\'', 'e', 2, '\\'', 'o',\n3, '\\'', 'w', 'a', 2, 'k', 'a', 2, 'k', 'u', 2, 'k', 'i', 3, 'k', 'a', 'a', 3, 'k', 'e', 'e',\n2, 'k', 'e', 2, 'k', 'o', 3, 'k', 'w', 'a', 3, 'k', 'w', 'i', 4, 'k', 'w', 'a', 'a', 4, 'k', 'w', 'e', 'e',\n3, 'k', 'w', 'e', 3, 'k', 'x', 'a', 3, 'k', 'x', 'u', 3, 'k', 'x', 'i', 4, 'k', 'x', 'a', 'a', 4, 'k', 'x', 'e', 'e',\n3, 'k', 'x', 'e', 3, 'k', 'x', 'o', 4, 'k', 'x', 'w', 'a', 4, 'k', 'x', 'w', 'i', 5, 'k', 'x', 'w', 'a', 'a', 5, 'k', 'x', 'w', 'e', 'e',\n4, 'k', 'x', 'w', 'e', 2, 'w', 'a', 2, 'w', 'u', 2, 'w', 'i', 3, 'w', 'a', 'a', 3, 'w', 'e', 'e',\n2, 'w', 'e', 2, 'w', 'o', 2, '`', 'a', 2, '`', 'u', 2, '`', 'i', 3, '`', 'a', 'a',\n3, '`', 'e', 'e', 2, '`', 'e', 2, '`', 'o', 2, 'z', 'a', 2, 'z', 'u', 2, 'z', 'i',\n3, 'z', 'a', 'a', 3, 'z', 'e', 'e', 2, 'z', 'e', 2, 'z', 'o', 3, 'z', 'w', 'a', 3, 'z', 'h', 'a',\n3, 'z', 'h', 'u', 3, 'z', 'h', 'i', 4, 'z', 'h', 'a', 'a', 4, 'z', 'h', 'e', 'e', 3, 'z', 'h', 'e', 3, 'z', 'h', 'o',\n4, 'z', 'h', 'w', 'a', 2, 'y', 'a', 2, 'y', 'u', 2, 'y', 'i', 3, 'y', 'a', 'a', 3, 'y', 'e', 'e',\n2, 'y', 'e', 2, 'y', 'o', 2, 'd', 'a', 2, 'd', 'u', 2, 'd', 'i', 3, 'd', 'a', 'a',\n3, 'd', 'e', 'e', 2, 'd', 'e', 2, 'd', 'o', 3, 'd', 'w', 'a', 3, 'd', 'd', 'a', 3, 'd', 'd', 'u',\n3, 'd', 'd', 'i', 4, 'd', 'd', 'a', 'a', 4, 'd', 'd', 'e', 'e', 3, 'd', 'd', 'e', 3, 'd', 'd', 'o', 4, 'd', 'd', 'w', 'a',\n2, 'j', 'a', 2, 'j', 'u', 2, 'j', 'i', 3, 'j', 'a', 'a', 3, 'j', 'e', 'e', 2, 'j', 'e',\n2, 'j', 'o', 3, 'j', 'w', 'a', 2, 'g', 'a', 2, 'g', 'u', 2, 'g', 'i', 3, 'g', 'a', 'a',\n3, 'g', 'e', 'e', 2, 'g', 'e', 2, 'g', 'o', 3, 'g', 'w', 'a', 3, 'g', 'w', 'i', 4, 'g', 'w', 'a', 'a',\n4, 'g', 'w', 'e', 'e', 3, 'g', 'w', 'e', 3, 'g', 'g', 'a', 3, 'g', 'g', 'u', 3, 'g', 'g', 'i', 4, 'g', 'g', 'a', 'a',\n4, 'g', 'g', 'e', 'e', 3, 'g', 'g', 'e', 3, 'g', 'g', 'o', 3, 't', 'h', 'a', 3, 't', 'h', 'u', 3, 't', 'h', 'i',\n4, 't', 'h', 'a', 'a', 4, 't', 'h', 'e', 'e', 3, 't', 'h', 'e', 3, 't', 'h', 'o', 4, 't', 'h', 'w', 'a', 3, 'c', 'h', 'a',\n3, 'c', 'h', 'u', 3, 'c', 'h', 'i', 4, 'c', 'h', 'a', 'a', 4, 'c', 'h', 'e', 'e', 3, 'c', 'h', 'e', 3, 'c', 'h', 'o',\n4, 'c', 'h', 'w', 'a', 3, 'p', 'h', 'a', 3, 'p', 'h', 'u', 3, 'p', 'h', 'i', 4, 'p', 'h', 'a', 'a', 4, 'p', 'h', 'e', 'e',\n3, 'p', 'h', 'e', 3, 'p', 'h', 'o', 4, 'p', 'h', 'w', 'a', 3, 't', 's', 'a', 3, 't', 's', 'u', 3, 't', 's', 'i',\n4, 't', 's', 'a', 'a', 4, 't', 's', 'e', 'e', 3, 't', 's', 'e', 3, 't', 's', 'o', 4, 't', 's', 'w', 'a', 3, 't', 'z', 'a',\n3, 't', 'z', 'u', 3, 't', 'z', 'i', 4, 't', 'z', 'a', 'a', 4, 't', 'z', 'e', 'e', 3, 't', 'z', 'e', 3, 't', 'z', 'o',\n2, 'f', 'a', 2, 'f', 'u', 2, 'f', 'i', 3, 'f', 'a', 'a', 3, 'f', 'e', 'e', 2, 'f', 'e',\n2, 'f', 'o', 3, 'f', 'w', 'a', 2, 'p', 'a', 2, 'p', 'u', 2, 'p', 'i', 3, 'p', 'a', 'a',\n3, 'p', 'e', 'e', 2, 'p', 'e', 2, 'p', 'o', 3, 'p', 'w', 'a', 3, 'r', 'y', 'a', 3, 'm', 'y', 'a',\n3, 'f', 'y', 'a', 1, ' ', 1, '.', 1, ',', 1, ';', 1, ':',\n3, ':', ':', ' ', 1, '?', 2, '/', '/', 1, '1', 1, '2', 1, '3',\n1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9',\n3, '1', '0', '+', 3, '2', '0', '+', 3, '3', '0', '+', 3, '4', '0', '+', 3, '5', '0', '+', 3, '6', '0', '+',\n3, '7', '0', '+', 3, '8', '0', '+', 3, '9', '0', '+', 4, '1', '0', '0', '+', 7, '1', '0', ',', '0', '0', '0', '+', 1, 'a',\n1, 'e', 1, 'i', 1, 'o', 1, 'u', 1, 'v', 2, 'g', 'a',\n2, 'k', 'a', 2, 'g', 'e', 2, 'g', 'i', 2, 'g', 'o', 2, 'g', 'u', 2, 'g', 'v',\n2, 'h', 'a', 2, 'h', 'e', 2, 'h', 'i', 2, 'h', 'o', 2, 'h', 'u', 2, 'h', 'v',\n2, 'l', 'a', 2, 'l', 'e', 2, 'l', 'i', 2, 'l', 'o', 2, 'l', 'u', 2, 'l', 'v',\n2, 'm', 'a', 2, 'm', 'e', 2, 'm', 'i', 2, 'm', 'o', 2, 'm', 'u', 2, 'n', 'a',\n3, 'h', 'n', 'a', 3, 'n', 'a', 'h', 2, 'n', 'e', 2, 'n', 'i', 2, 'n', 'o', 2, 'n', 'u',\n2, 'n', 'v', 3, 'q', 'u', 'a', 3, 'q', 'u', 'e', 3, 'q', 'u', 'i', 3, 'q', 'u', 'o', 3, 'q', 'u', 'u',\n3, 'q', 'u', 'v', 2, 's', 'a', 1, 's', 2, 's', 'e', 2, 's', 'i', 2, 's', 'o',\n2, 's', 'u', 2, 's', 'v', 2, 'd', 'a', 2, 't', 'a', 2, 'd', 'e', 2, 't', 'e',\n2, 'd', 'i', 2, 't', 'i', 2, 'd', 'o', 2, 'd', 'u', 2, 'd', 'v', 3, 'd', 'l', 'a',\n3, 't', 'l', 'a', 3, 't', 'l', 'e', 3, 't', 'l', 'i', 3, 't', 'l', 'o', 3, 't', 'l', 'u', 3, 't', 'l', 'v',\n3, 't', 's', 'a', 3, 't', 's', 'e', 3, 't', 's', 'i', 3, 't', 's', 'o', 3, 't', 's', 'u', 3, 't', 's', 'v',\n2, 'w', 'a', 2, 'w', 'e', 2, 'w', 'i', 2, 'w', 'o', 2, 'w', 'u', 2, 'w', 'v',\n2, 'y', 'a', 2, 'y', 'e', 2, 'y', 'i', 2, 'y', 'o', 2, 'y', 'u', 2, 'y', 'v',\n1, 'e', 3, 'a', 'a', 'i', 1, 'i', 2, 'i', 'i', 1, 'o', 2, 'o', 'o',\n2, 'o', 'o', 2, 'e', 'e', 1, 'i', 1, 'a', 2, 'a', 'a', 2, 'w', 'e',\n2, 'w', 'e', 2, 'w', 'i', 2, 'w', 'i', 3, 'w', 'i', 'i', 3, 'w', 'i', 'i', 2, 'w', 'o',\n2, 'w', 'o', 3, 'w', 'o', 'o', 3, 'w', 'o', 'o', 3, 'w', 'o', 'o', 2, 'w', 'a', 2, 'w', 'a',\n3, 'w', 'a', 'a', 3, 'w', 'a', 'a', 3, 'w', 'a', 'a', 2, 'a', 'i', 1, 'w', 1, '\\'',\n1, 't', 1, 'k', 2, 's', 'h', 1, 's', 1, 'n', 1, 'w',\n1, 'n', 1, 'w', 1, 'c', 1, '?', 1, 'l', 2, 'e', 'n',\n2, 'i', 'n', 2, 'o', 'n', 2, 'a', 'n', 2, 'p', 'e', 4, 'p', 'a', 'a', 'i', 2, 'p', 'i',\n3, 'p', 'i', 'i', 2, 'p', 'o', 3, 'p', 'o', 'o', 3, 'p', 'o', 'o', 3, 'h', 'e', 'e', 2, 'h', 'i',\n2, 'p', 'a', 3, 'p', 'a', 'a', 3, 'p', 'w', 'e', 3, 'p', 'w', 'e', 3, 'p', 'w', 'i', 3, 'p', 'w', 'i',\n4, 'p', 'w', 'i', 'i', 4, 'p', 'w', 'i', 'i', 3, 'p', 'w', 'o', 3, 'p', 'w', 'o', 4, 'p', 'w', 'o', 'o', 4, 'p', 'w', 'o', 'o',\n3, 'p', 'w', 'a', 3, 'p', 'w', 'a', 4, 'p', 'w', 'a', 'a', 4, 'p', 'w', 'a', 'a', 4, 'p', 'w', 'a', 'a', 1, 'p',\n1, 'p', 1, 'h', 2, 't', 'e', 4, 't', 'a', 'a', 'i', 2, 't', 'i', 3, 't', 'i', 'i',\n2, 't', 'o', 3, 't', 'o', 'o', 3, 't', 'o', 'o', 3, 'd', 'e', 'e', 2, 'd', 'i', 2, 't', 'a',\n3, 't', 'a', 'a', 3, 't', 'w', 'e', 3, 't', 'w', 'e', 3, 't', 'w', 'i', 3, 't', 'w', 'i', 4, 't', 'w', 'i', 'i',\n4, 't', 'w', 'i', 'i', 3, 't', 'w', 'o', 3, 't', 'w', 'o', 4, 't', 'w', 'o', 'o', 4, 't', 'w', 'o', 'o', 3, 't', 'w', 'a',\n3, 't', 'w', 'a', 4, 't', 'w', 'a', 'a', 4, 't', 'w', 'a', 'a', 4, 't', 'w', 'a', 'a', 1, 't', 3, 't', 't', 'e',\n3, 't', 't', 'i', 3, 't', 't', 'o', 3, 't', 't', 'a', 2, 'k', 'e', 4, 'k', 'a', 'a', 'i', 2, 'k', 'i',\n3, 'k', 'i', 'i', 2, 'k', 'o', 3, 'k', 'o', 'o', 3, 'k', 'o', 'o', 2, 'k', 'a', 3, 'k', 'a', 'a',\n3, 'k', 'w', 'e', 3, 'k', 'w', 'e', 3, 'k', 'w', 'i', 3, 'k', 'w', 'i', 4, 'k', 'w', 'i', 'i', 4, 'k', 'w', 'i', 'i',\n3, 'k', 'w', 'o', 3, 'k', 'w', 'o', 4, 'k', 'w', 'o', 'o', 4, 'k', 'w', 'o', 'o', 3, 'k', 'w', 'a', 3, 'k', 'w', 'a',\n4, 'k', 'w', 'a', 'a', 4, 'k', 'w', 'a', 'a', 4, 'k', 'w', 'a', 'a', 1, 'k', 2, 'k', 'w', 3, 'k', 'e', 'h',\n3, 'k', 'i', 'h', 3, 'k', 'o', 'h', 3, 'k', 'a', 'h', 2, 'c', 'e', 4, 'c', 'a', 'a', 'i', 2, 'c', 'i',\n3, 'c', 'i', 'i', 2, 'c', 'o', 3, 'c', 'o', 'o', 3, 'c', 'o', 'o', 2, 'c', 'a', 3, 'c', 'a', 'a',\n3, 'c', 'w', 'e', 3, 'c', 'w', 'e', 3, 'c', 'w', 'i', 3, 'c', 'w', 'i', 4, 'c', 'w', 'i', 'i', 4, 'c', 'w', 'i', 'i',\n3, 'c', 'w', 'o', 3, 'c', 'w', 'o', 4, 'c', 'w', 'o', 'o', 4, 'c', 'w', 'o', 'o', 3, 'c', 'w', 'a', 3, 'c', 'w', 'a',\n4, 'c', 'w', 'a', 'a', 4, 'c', 'w', 'a', 'a', 4, 'c', 'w', 'a', 'a', 1, 'c', 2, 't', 'h', 2, 'm', 'e',\n4, 'm', 'a', 'a', 'i', 2, 'm', 'i', 3, 'm', 'i', 'i', 2, 'm', 'o', 3, 'm', 'o', 'o', 3, 'm', 'o', 'o',\n2, 'm', 'a', 3, 'm', 'a', 'a', 3, 'm', 'w', 'e', 3, 'm', 'w', 'e', 3, 'm', 'w', 'i', 3, 'm', 'w', 'i',\n4, 'm', 'w', 'i', 'i', 4, 'm', 'w', 'i', 'i', 3, 'm', 'w', 'o', 3, 'm', 'w', 'o', 4, 'm', 'w', 'o', 'o', 4, 'm', 'w', 'o', 'o',\n3, 'm', 'w', 'a', 3, 'm', 'w', 'a', 4, 'm', 'w', 'a', 'a', 4, 'm', 'w', 'a', 'a', 4, 'm', 'w', 'a', 'a', 1, 'm',\n1, 'm', 2, 'm', 'h', 1, 'm', 1, 'm', 2, 'n', 'e', 4, 'n', 'a', 'a', 'i',\n2, 'n', 'i', 3, 'n', 'i', 'i', 2, 'n', 'o', 3, 'n', 'o', 'o', 3, 'n', 'o', 'o', 2, 'n', 'a',\n3, 'n', 'a', 'a', 3, 'n', 'w', 'e', 3, 'n', 'w', 'e', 3, 'n', 'w', 'a', 3, 'n', 'w', 'a', 4, 'n', 'w', 'a', 'a',\n4, 'n', 'w', 'a', 'a', 4, 'n', 'w', 'a', 'a', 1, 'n', 2, 'n', 'g', 2, 'n', 'h', 2, 'l', 'e',\n4, 'l', 'a', 'a', 'i', 2, 'l', 'i', 3, 'l', 'i', 'i', 2, 'l', 'o', 3, 'l', 'o', 'o', 3, 'l', 'o', 'o',\n2, 'l', 'a', 3, 'l', 'a', 'a', 3, 'l', 'w', 'e', 3, 'l', 'w', 'e', 3, 'l', 'w', 'i', 3, 'l', 'w', 'i',\n4, 'l', 'w', 'i', 'i', 4, 'l', 'w', 'i', 'i', 3, 'l', 'w', 'o', 3, 'l', 'w', 'o', 4, 'l', 'w', 'o', 'o', 4, 'l', 'w', 'o', 'o',\n3, 'l', 'w', 'a', 3, 'l', 'w', 'a', 4, 'l', 'w', 'a', 'a', 4, 'l', 'w', 'a', 'a', 1, 'l', 1, 'l',\n1, 'l', 2, 's', 'e', 4, 's', 'a', 'a', 'i', 2, 's', 'i', 3, 's', 'i', 'i', 2, 's', 'o',\n3, 's', 'o', 'o', 3, 's', 'o', 'o', 2, 's', 'a', 3, 's', 'a', 'a', 3, 's', 'w', 'e', 3, 's', 'w', 'e',\n3, 's', 'w', 'i', 3, 's', 'w', 'i', 4, 's', 'w', 'i', 'i', 4, 's', 'w', 'i', 'i', 3, 's', 'w', 'o', 3, 's', 'w', 'o',\n4, 's', 'w', 'o', 'o', 4, 's', 'w', 'o', 'o', 3, 's', 'w', 'a', 3, 's', 'w', 'a', 4, 's', 'w', 'a', 'a', 4, 's', 'w', 'a', 'a',\n4, 's', 'w', 'a', 'a', 1, 's', 1, 's', 2, 's', 'w', 1, 's', 2, 's', 'k',\n3, 's', 'k', 'w', 2, 's', 'W', 4, 's', 'p', 'w', 'a', 4, 's', 't', 'w', 'a', 4, 's', 'k', 'w', 'a', 4, 's', 'c', 'w', 'a',\n3, 's', 'h', 'e', 3, 's', 'h', 'i', 4, 's', 'h', 'i', 'i', 3, 's', 'h', 'o', 4, 's', 'h', 'o', 'o', 3, 's', 'h', 'a',\n4, 's', 'h', 'a', 'a', 4, 's', 'h', 'w', 'e', 4, 's', 'h', 'w', 'e', 4, 's', 'h', 'w', 'i', 4, 's', 'h', 'w', 'i', 5, 's', 'h', 'w', 'i', 'i',\n5, 's', 'h', 'w', 'i', 'i', 4, 's', 'h', 'w', 'o', 4, 's', 'h', 'w', 'o', 5, 's', 'h', 'w', 'o', 'o', 5, 's', 'h', 'w', 'o', 'o', 4, 's', 'h', 'w', 'a',\n4, 's', 'h', 'w', 'a', 5, 's', 'h', 'w', 'a', 'a', 5, 's', 'h', 'w', 'a', 'a', 2, 's', 'h', 2, 'y', 'e', 4, 'y', 'a', 'a', 'i',\n2, 'y', 'i', 3, 'y', 'i', 'i', 2, 'y', 'o', 3, 'y', 'o', 'o', 3, 'y', 'o', 'o', 2, 'y', 'a',\n3, 'y', 'a', 'a', 3, 'y', 'w', 'e', 3, 'y', 'w', 'e', 3, 'y', 'w', 'i', 3, 'y', 'w', 'i', 4, 'y', 'w', 'i', 'i',\n4, 'y', 'w', 'i', 'i', 3, 'y', 'w', 'o', 3, 'y', 'w', 'o', 4, 'y', 'w', 'o', 'o', 4, 'y', 'w', 'o', 'o', 3, 'y', 'w', 'a',\n3, 'y', 'w', 'a', 4, 'y', 'w', 'a', 'a', 4, 'y', 'w', 'a', 'a', 4, 'y', 'w', 'a', 'a', 1, 'y', 1, 'y',\n1, 'y', 2, 'y', 'i', 2, 'r', 'e', 2, 'r', 'e', 2, 'l', 'e', 4, 'r', 'a', 'a', 'i',\n2, 'r', 'i', 3, 'r', 'i', 'i', 2, 'r', 'o', 3, 'r', 'o', 'o', 2, 'l', 'o', 2, 'r', 'a',\n3, 'r', 'a', 'a', 2, 'l', 'a', 4, 'r', 'w', 'a', 'a', 4, 'r', 'w', 'a', 'a', 1, 'r', 1, 'r',\n1, 'r', 2, 'f', 'e', 4, 'f', 'a', 'a', 'i', 2, 'f', 'i', 3, 'f', 'i', 'i', 2, 'f', 'o',\n3, 'f', 'o', 'o', 2, 'f', 'a', 3, 'f', 'a', 'a', 4, 'f', 'w', 'a', 'a', 4, 'f', 'w', 'a', 'a', 1, 'f',\n3, 't', 'h', 'e', 3, 't', 'h', 'e', 3, 't', 'h', 'i', 3, 't', 'h', 'i', 4, 't', 'h', 'i', 'i', 4, 't', 'h', 'i', 'i',\n3, 't', 'h', 'o', 4, 't', 'h', 'o', 'o', 3, 't', 'h', 'a', 4, 't', 'h', 'a', 'a', 5, 't', 'h', 'w', 'a', 'a', 5, 't', 'h', 'w', 'a', 'a',\n2, 't', 'h', 4, 't', 't', 'h', 'e', 4, 't', 't', 'h', 'i', 4, 't', 't', 'h', 'o', 4, 't', 't', 'h', 'a', 3, 't', 't', 'h',\n3, 't', 'y', 'e', 3, 't', 'y', 'i', 3, 't', 'y', 'o', 3, 't', 'y', 'a', 2, 'h', 'e', 2, 'h', 'i',\n3, 'h', 'i', 'i', 2, 'h', 'o', 3, 'h', 'o', 'o', 2, 'h', 'a', 3, 'h', 'a', 'a', 1, 'h',\n1, 'h', 2, 'h', 'k', 4, 'q', 'a', 'a', 'i', 2, 'q', 'i', 3, 'q', 'i', 'i', 2, 'q', 'o',\n3, 'q', 'o', 'o', 2, 'q', 'a', 3, 'q', 'a', 'a', 1, 'q', 4, 't', 'l', 'h', 'e', 4, 't', 'l', 'h', 'i',\n4, 't', 'l', 'h', 'o', 4, 't', 'l', 'h', 'a', 2, 'r', 'e', 2, 'r', 'i', 2, 'r', 'o', 2, 'r', 'a',\n5, 'n', 'g', 'a', 'a', 'i', 3, 'n', 'g', 'i', 4, 'n', 'g', 'i', 'i', 3, 'n', 'g', 'o', 4, 'n', 'g', 'o', 'o', 3, 'n', 'g', 'a',\n4, 'n', 'g', 'a', 'a', 2, 'n', 'g', 3, 'n', 'n', 'g', 3, 's', 'h', 'e', 3, 's', 'h', 'i', 3, 's', 'h', 'o',\n3, 's', 'h', 'a', 3, 't', 'h', 'e', 3, 't', 'h', 'i', 3, 't', 'h', 'o', 3, 't', 'h', 'a', 2, 't', 'h',\n3, 'l', 'h', 'i', 4, 'l', 'h', 'i', 'i', 3, 'l', 'h', 'o', 4, 'l', 'h', 'o', 'o', 3, 'l', 'h', 'a', 4, 'l', 'h', 'a', 'a',\n2, 'l', 'h', 3, 't', 'h', 'e', 3, 't', 'h', 'i', 4, 't', 'h', 'i', 'i', 3, 't', 'h', 'o', 4, 't', 'h', 'o', 'o',\n3, 't', 'h', 'a', 4, 't', 'h', 'a', 'a', 2, 't', 'h', 1, 'b', 1, 'e', 1, 'i',\n1, 'o', 1, 'a', 2, 'w', 'e', 2, 'w', 'i', 2, 'w', 'o', 2, 'w', 'a',\n2, 'n', 'e', 2, 'n', 'i', 2, 'n', 'o', 2, 'n', 'a', 2, 'k', 'e', 2, 'k', 'i',\n2, 'k', 'o', 2, 'k', 'a', 2, 'h', 'e', 2, 'h', 'i', 2, 'h', 'o', 2, 'h', 'a',\n3, 'g', 'h', 'u', 3, 'g', 'h', 'o', 3, 'g', 'h', 'e', 4, 'g', 'h', 'e', 'e', 3, 'g', 'h', 'i', 3, 'g', 'h', 'a',\n2, 'r', 'u', 2, 'r', 'o', 2, 'r', 'e', 3, 'r', 'e', 'e', 2, 'r', 'i', 2, 'r', 'a',\n2, 'w', 'u', 2, 'w', 'o', 2, 'w', 'e', 3, 'w', 'e', 'e', 2, 'w', 'i', 2, 'w', 'a',\n3, 'h', 'w', 'u', 3, 'h', 'w', 'o', 3, 'h', 'w', 'e', 4, 'h', 'w', 'e', 'e', 3, 'h', 'w', 'i', 3, 'h', 'w', 'a',\n3, 't', 'h', 'u', 3, 't', 'h', 'o', 3, 't', 'h', 'e', 4, 't', 'h', 'e', 'e', 3, 't', 'h', 'i', 3, 't', 'h', 'a',\n3, 't', 't', 'u', 3, 't', 't', 'o', 3, 't', 't', 'e', 4, 't', 't', 'e', 'e', 3, 't', 't', 'i', 3, 't', 't', 'a',\n2, 'p', 'u', 2, 'p', 'o', 2, 'p', 'e', 3, 'p', 'e', 'e', 2, 'p', 'i', 2, 'p', 'a',\n1, 'p', 2, 'g', 'u', 2, 'g', 'o', 2, 'g', 'e', 3, 'g', 'e', 'e', 2, 'g', 'i',\n2, 'g', 'a', 3, 'k', 'h', 'u', 3, 'k', 'h', 'o', 3, 'k', 'h', 'e', 4, 'k', 'h', 'e', 'e', 3, 'k', 'h', 'i',\n3, 'k', 'h', 'a', 3, 'k', 'k', 'u', 3, 'k', 'k', 'o', 3, 'k', 'k', 'e', 4, 'k', 'k', 'e', 'e', 3, 'k', 'k', 'i',\n3, 'k', 'k', 'a', 2, 'k', 'k', 2, 'n', 'u', 2, 'n', 'o', 2, 'n', 'e', 3, 'n', 'e', 'e',\n2, 'n', 'i', 2, 'n', 'a', 2, 'm', 'u', 2, 'm', 'o', 2, 'm', 'e', 3, 'm', 'e', 'e',\n2, 'm', 'i', 2, 'm', 'a', 2, 'y', 'u', 2, 'y', 'o', 2, 'y', 'e', 3, 'y', 'e', 'e',\n2, 'y', 'i', 2, 'y', 'a', 2, 'j', 'u', 2, 'j', 'u', 2, 'j', 'o', 2, 'j', 'e',\n3, 'j', 'e', 'e', 2, 'j', 'i', 2, 'j', 'i', 2, 'j', 'a', 3, 'j', 'j', 'u', 3, 'j', 'j', 'o',\n3, 'j', 'j', 'e', 4, 'j', 'j', 'e', 'e', 3, 'j', 'j', 'i', 3, 'j', 'j', 'a', 2, 'l', 'u', 2, 'l', 'o',\n2, 'l', 'e', 3, 'l', 'e', 'e', 2, 'l', 'i', 2, 'l', 'a', 3, 'd', 'l', 'u', 3, 'd', 'l', 'o',\n3, 'd', 'l', 'e', 4, 'd', 'l', 'e', 'e', 3, 'd', 'l', 'i', 3, 'd', 'l', 'a', 3, 'l', 'h', 'u', 3, 'l', 'h', 'o',\n3, 'l', 'h', 'e', 4, 'l', 'h', 'e', 'e', 3, 'l', 'h', 'i', 3, 'l', 'h', 'a', 4, 't', 'l', 'h', 'u', 4, 't', 'l', 'h', 'o',\n4, 't', 'l', 'h', 'e', 5, 't', 'l', 'h', 'e', 'e', 4, 't', 'l', 'h', 'i', 4, 't', 'l', 'h', 'a', 3, 't', 'l', 'u', 3, 't', 'l', 'o',\n3, 't', 'l', 'e', 4, 't', 'l', 'e', 'e', 3, 't', 'l', 'i', 3, 't', 'l', 'a', 2, 'z', 'u', 2, 'z', 'o',\n2, 'z', 'e', 3, 'z', 'e', 'e', 2, 'z', 'i', 2, 'z', 'a', 1, 'z', 1, 'z',\n3, 'd', 'z', 'u', 3, 'd', 'z', 'o', 3, 'd', 'z', 'e', 4, 'd', 'z', 'e', 'e', 3, 'd', 'z', 'i', 3, 'd', 'z', 'a',\n2, 's', 'u', 2, 's', 'o', 2, 's', 'e', 3, 's', 'e', 'e', 2, 's', 'i', 2, 's', 'a',\n3, 's', 'h', 'u', 3, 's', 'h', 'o', 3, 's', 'h', 'e', 4, 's', 'h', 'e', 'e', 3, 's', 'h', 'i', 3, 's', 'h', 'a',\n2, 's', 'h', 3, 't', 's', 'u', 3, 't', 's', 'o', 3, 't', 's', 'e', 4, 't', 's', 'e', 'e', 3, 't', 's', 'i',\n3, 't', 's', 'a', 3, 'c', 'h', 'u', 3, 'c', 'h', 'o', 3, 'c', 'h', 'e', 4, 'c', 'h', 'e', 'e', 3, 'c', 'h', 'i',\n3, 'c', 'h', 'a', 4, 't', 't', 's', 'u', 4, 't', 't', 's', 'o', 4, 't', 't', 's', 'e', 5, 't', 't', 's', 'e', 'e', 4, 't', 't', 's', 'i',\n4, 't', 't', 's', 'a', 1, 'X', 1, '.', 3, 'q', 'a', 'i', 4, 'n', 'g', 'a', 'i', 4, 'n', 'n', 'g', 'i',\n5, 'n', 'n', 'g', 'i', 'i', 4, 'n', 'n', 'g', 'o', 5, 'n', 'n', 'g', 'o', 'o', 4, 'n', 'n', 'g', 'a', 5, 'n', 'n', 'g', 'a', 'a', 1, ' ',\n1, 'b', 1, 'l', 1, 'f', 1, 's', 1, 'n', 1, 'h',\n1, 'd', 1, 't', 1, 'c', 1, 'q', 1, 'm', 1, 'g',\n2, 'n', 'g', 1, 'z', 1, 'r', 1, 'a', 1, 'o', 1, 'u',\n1, 'e', 1, 'i', 2, 'c', 'h', 2, 't', 'h', 2, 'p', 'h', 1, 'p',\n1, 'x', 1, 'p', 1, '<', 1, '>', 1, 'f', 1, 'v',\n1, 'u', 2, 'y', 'r', 1, 'y', 1, 'w', 2, 't', 'h', 2, 't', 'h',\n1, 'a', 1, 'o', 2, 'a', 'c', 2, 'a', 'e', 1, 'o', 1, 'o',\n1, 'o', 2, 'o', 'e', 2, 'o', 'n', 1, 'r', 1, 'k', 1, 'c',\n1, 'k', 1, 'g', 2, 'n', 'g', 1, 'g', 1, 'g', 1, 'w',\n1, 'h', 1, 'h', 1, 'h', 1, 'h', 1, 'n', 1, 'n',\n1, 'n', 1, 'i', 1, 'e', 1, 'j', 1, 'g', 2, 'a', 'e',\n1, 'a', 2, 'e', 'o', 1, 'p', 1, 'z', 1, 's', 1, 's',\n1, 's', 1, 'c', 1, 'z', 1, 't', 1, 't', 1, 'd',\n1, 'b', 1, 'b', 1, 'p', 1, 'p', 1, 'e', 1, 'm',\n1, 'm', 1, 'm', 1, 'l', 1, 'l', 2, 'n', 'g', 2, 'n', 'g',\n1, 'd', 1, 'o', 3, 'e', 'a', 'r', 3, 'i', 'o', 'r', 2, 'q', 'u', 2, 'q', 'u',\n2, 'q', 'u', 1, 's', 2, 'y', 'r', 2, 'y', 'r', 2, 'y', 'r', 1, 'q',\n1, 'x', 1, '.', 1, ':', 1, '+', 2, '1', '7', 2, '1', '8',\n2, '1', '9', 1, 'k', 2, 'k', 'h', 1, 'g', 2, 'g', 'h', 2, 'n', 'g',\n1, 'c', 2, 'c', 'h', 1, 'j', 2, 'j', 'h', 2, 'n', 'y', 1, 't',\n3, 't', 't', 'h', 1, 'd', 3, 'd', 'd', 'h', 2, 'n', 'n', 1, 't', 2, 't', 'h',\n1, 'd', 2, 'd', 'h', 1, 'n', 1, 'p', 2, 'p', 'h', 1, 'b',\n2, 'b', 'h', 1, 'm', 1, 'y', 1, 'r', 1, 'l', 1, 'v',\n2, 's', 'h', 2, 's', 's', 1, 's', 1, 'h', 1, 'l', 1, 'q',\n1, 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'u', 2, 'u', 'k',\n2, 'u', 'u', 3, 'u', 'u', 'v', 2, 'r', 'y', 3, 'r', 'y', 'y', 2, 'l', 'y', 3, 'l', 'y', 'y',\n1, 'e', 2, 'a', 'i', 2, 'o', 'o', 2, 'o', 'o', 2, 'a', 'u', 1, 'a',\n2, 'a', 'a', 2, 'a', 'a', 1, 'i', 2, 'i', 'i', 1, 'y', 2, 'y', 'y',\n1, 'u', 2, 'u', 'u', 2, 'u', 'a', 2, 'o', 'e', 2, 'y', 'a', 2, 'i', 'e',\n1, 'e', 2, 'a', 'e', 2, 'a', 'i', 2, 'o', 'o', 2, 'a', 'u', 1, 'M',\n1, 'H', 2, 'a', '`', 1, 'r', 1, '!', 1, '.', 4, ' ', '/', '/', ' ',\n1, ':', 1, '+', 2, '+', '+', 3, ' ', '*', ' ', 5, ' ', '/', '/', '/', ' ', 2, 'K', 'R',\n1, '\\'', 1, '0', 1, '1', 1, '2', 1, '3', 1, '4',\n1, '5', 1, '6', 1, '7', 1, '8', 1, '9', 3, ' ', '@', ' ',\n5, ' ', '.', '.', '.', ' ', 2, ',', ' ', 2, '.', ' ', 2, ':', ' ', 4, ' ', '/', '/', ' ', 1, '-',\n2, ',', ' ', 2, '.', ' ', 1, '0', 1, '1', 1, '2', 1, '3',\n1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9',\n1, 'a', 1, 'e', 1, 'i', 1, 'o', 1, 'u', 1, 'O',\n1, 'U', 2, 'e', 'e', 1, 'n', 2, 'n', 'g', 1, 'b', 1, 'p',\n1, 'q', 1, 'g', 1, 'm', 1, 'l', 1, 's', 2, 's', 'h',\n1, 't', 1, 'd', 2, 'c', 'h', 1, 'j', 1, 'y', 1, 'r',\n1, 'w', 1, 'f', 1, 'k', 3, 'k', 'h', 'a', 2, 't', 's', 1, 'z',\n1, 'h', 2, 'z', 'r', 2, 'l', 'h', 2, 'z', 'h', 2, 'c', 'h', 1, '-',\n1, 'e', 1, 'i', 1, 'o', 1, 'u', 1, 'O', 1, 'U',\n2, 'n', 'g', 1, 'b', 1, 'p', 1, 'q', 1, 'g', 1, 'm',\n1, 't', 1, 'd', 2, 'c', 'h', 1, 'j', 2, 't', 's', 1, 'y',\n1, 'w', 1, 'k', 1, 'g', 1, 'h', 2, 'j', 'y', 2, 'n', 'y',\n2, 'd', 'z', 1, 'e', 1, 'i', 2, 'i', 'y', 1, 'U', 1, 'u',\n2, 'n', 'g', 1, 'k', 1, 'g', 1, 'h', 1, 'p', 2, 's', 'h',\n1, 't', 1, 'd', 1, 'j', 1, 'f', 1, 'g', 1, 'h',\n2, 't', 's', 1, 'z', 1, 'r', 2, 'c', 'h', 2, 'z', 'h', 1, 'i',\n1, 'k', 1, 'r', 1, 'f', 2, 'z', 'h', 1, 'H', 1, 'X',\n1, 'W', 1, 'M', 3, ' ', '3', ' ', 5, ' ', '3', '3', '3', ' ', 1, 'a', 1, 'i',\n1, 'k', 2, 'n', 'g', 1, 'c', 2, 't', 't', 3, 't', 't', 'h', 2, 'd', 'd',\n2, 'n', 'n', 1, 't', 1, 'd', 1, 'p', 2, 'p', 'h', 2, 's', 's',\n2, 'z', 'h', 1, 'z', 1, 'a', 1, 't', 2, 'z', 'h', 2, 'g', 'h',\n2, 'n', 'g', 1, 'c', 2, 'j', 'h', 3, 't', 't', 'a', 3, 'd', 'd', 'h', 1, 't',\n2, 'd', 'h', 2, 's', 's', 2, 'c', 'y', 2, 'z', 'h', 1, 'z', 1, 'u',\n1, 'y', 2, 'b', 'h', 1, '\\'', 1, 'A', 2, 'A', 'E', 2, 'a', 'e',\n1, 'B', 1, 'C', 1, 'D', 1, 'D', 1, 'E', 1, 'e',\n1, 'i', 1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N',\n1, 'O', 1, 'O', 1, 'O', 2, 'O', 'e', 2, 'O', 'u', 1, 'P',\n1, 'R', 1, 'R', 1, 'T', 1, 'U', 1, 'u', 1, 'u',\n1, 'm', 1, 'V', 1, 'W', 1, 'Z', 1, 'A', 2, 'A', 'E',\n1, 'B', 1, 'B', 1, 'D', 1, 'E', 1, 'E', 1, 'G',\n1, 'H', 1, 'I', 1, 'J', 1, 'K', 1, 'L', 1, 'M',\n1, 'N', 1, 'N', 1, 'O', 2, 'O', 'u', 1, 'P', 1, 'R',\n1, 'T', 1, 'U', 1, 'W', 1, 'a', 1, 'a', 1, 'a',\n2, 'a', 'e', 1, 'b', 1, 'd', 1, 'e', 1, 'e', 1, 'e',\n1, 'g', 1, 'i', 1, 'k', 1, 'm', 1, 'o', 1, 'p',\n1, 't', 1, 'u', 1, 'u', 1, 'm', 1, 'v', 1, 'b',\n1, 'g', 1, 'd', 1, 'f', 1, 'i', 1, 'r', 1, 'u',\n1, 'v', 1, 'b', 1, 'g', 1, 'r', 1, 'f', 1, 'b',\n1, 'd', 1, 'f', 1, 'm', 1, 'n', 1, 'p', 1, 'r',\n1, 'r', 1, 's', 1, 't', 1, 'z', 1, 'g', 1, 'p',\n1, 'b', 1, 'd', 1, 'f', 1, 'g', 1, 'k', 1, 'l',\n1, 'm', 1, 'n', 1, 'p', 1, 'r', 1, 's', 1, 'v',\n1, 'x', 1, 'z', 1, 'A', 1, 'a', 1, 'B', 1, 'b',\n1, 'B', 1, 'b', 1, 'B', 1, 'b', 1, 'C', 1, 'c',\n1, 'D', 1, 'd', 1, 'D', 1, 'd', 1, 'D', 1, 'd',\n1, 'D', 1, 'd', 1, 'D', 1, 'd', 1, 'E', 1, 'e',\n1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e',\n1, 'E', 1, 'e', 1, 'F', 1, 'f', 1, 'G', 1, 'g',\n1, 'H', 1, 'h', 1, 'H', 1, 'h', 1, 'H', 1, 'h',\n1, 'H', 1, 'h', 1, 'H', 1, 'h', 1, 'I', 1, 'i',\n1, 'I', 1, 'i', 1, 'K', 1, 'k', 1, 'K', 1, 'k',\n1, 'K', 1, 'k', 1, 'L', 1, 'l', 1, 'L', 1, 'l',\n1, 'L', 1, 'l', 1, 'L', 1, 'l', 1, 'M', 1, 'm',\n1, 'M', 1, 'm', 1, 'M', 1, 'm', 1, 'N', 1, 'n',\n1, 'N', 1, 'n', 1, 'N', 1, 'n', 1, 'N', 1, 'n',\n1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o',\n1, 'O', 1, 'o', 1, 'P', 1, 'p', 1, 'P', 1, 'p',\n1, 'R', 1, 'r', 1, 'R', 1, 'r', 1, 'R', 1, 'r',\n1, 'R', 1, 'r', 1, 'S', 1, 's', 1, 'S', 1, 's',\n1, 'S', 1, 's', 1, 'S', 1, 's', 1, 'S', 1, 's',\n1, 'T', 1, 't', 1, 'T', 1, 't', 1, 'T', 1, 't',\n1, 'T', 1, 't', 1, 'U', 1, 'u', 1, 'U', 1, 'u',\n1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u',\n1, 'V', 1, 'v', 1, 'V', 1, 'v', 1, 'W', 1, 'w',\n1, 'W', 1, 'w', 1, 'W', 1, 'w', 1, 'W', 1, 'w',\n1, 'W', 1, 'w', 1, 'X', 1, 'x', 1, 'X', 1, 'x',\n1, 'Y', 1, 'y', 1, 'Z', 1, 'z', 1, 'Z', 1, 'z',\n1, 'Z', 1, 'z', 1, 'h', 1, 't', 1, 'w', 1, 'y',\n1, 'a', 1, 'S', 2, 'S', 's', 1, 'A', 1, 'a', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 1, 'A', 1, 'a', 1, 'A',\n1, 'a', 1, 'A', 1, 'a', 1, 'E', 1, 'e', 1, 'E',\n1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E',\n1, 'e', 1, 'E', 1, 'e', 1, 'E', 1, 'e', 1, 'E',\n1, 'e', 1, 'I', 1, 'i', 1, 'I', 1, 'i', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'O',\n1, 'o', 1, 'O', 1, 'o', 1, 'O', 1, 'o', 1, 'U',\n1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U',\n1, 'u', 1, 'U', 1, 'u', 1, 'U', 1, 'u', 1, 'U',\n1, 'u', 1, 'Y', 1, 'y', 1, 'Y', 1, 'y', 1, 'Y',\n1, 'y', 1, 'Y', 1, 'y', 1, 'a', 1, 'a', 1, 'a',\n1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'A',\n1, 'A', 1, 'A', 1, 'A', 1, 'A', 1, 'A', 1, 'A',\n1, 'A', 1, 'e', 1, 'e', 1, 'e', 1, 'e', 1, 'e',\n1, 'e', 1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'E',\n1, 'E', 1, 'e', 1, 'e', 1, 'e', 1, 'e', 1, 'e',\n1, 'e', 1, 'e', 1, 'e', 1, 'E', 1, 'E', 1, 'E',\n1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'i',\n1, 'i', 1, 'i', 1, 'i', 1, 'i', 1, 'i', 1, 'i',\n1, 'i', 1, 'I', 1, 'I', 1, 'I', 1, 'I', 1, 'I',\n1, 'I', 1, 'I', 1, 'I', 1, 'o', 1, 'o', 1, 'o',\n1, 'o', 1, 'o', 1, 'o', 1, 'O', 1, 'O', 1, 'O',\n1, 'O', 1, 'O', 1, 'O', 1, 'u', 1, 'u', 1, 'u',\n1, 'u', 1, 'u', 1, 'u', 1, 'u', 1, 'u', 1, 'U',\n1, 'U', 1, 'U', 1, 'U', 1, 'o', 1, 'o', 1, 'o',\n1, 'o', 1, 'o', 1, 'o', 1, 'o', 1, 'o', 1, 'O',\n1, 'O', 1, 'O', 1, 'O', 1, 'O', 1, 'O', 1, 'O',\n1, 'O', 1, 'a', 1, 'a', 1, 'e', 1, 'e', 1, 'e',\n1, 'e', 1, 'i', 1, 'i', 1, 'o', 1, 'o', 1, 'u',\n1, 'u', 1, 'o', 1, 'o', 1, 'a', 1, 'a', 1, 'a',\n1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'A',\n1, 'A', 1, 'A', 1, 'A', 1, 'A', 1, 'A', 1, 'A',\n1, 'A', 1, 'e', 1, 'e', 1, 'e', 1, 'e', 1, 'e',\n1, 'e', 1, 'e', 1, 'e', 1, 'E', 1, 'E', 1, 'E',\n1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'o',\n1, 'o', 1, 'o', 1, 'o', 1, 'o', 1, 'o', 1, 'o',\n1, 'o', 1, 'O', 1, 'O', 1, 'O', 1, 'O', 1, 'O',\n1, 'O', 1, 'O', 1, 'O', 1, 'a', 1, 'a', 1, 'a',\n1, 'a', 1, 'a', 1, 'a', 1, 'a', 1, 'A', 1, 'A',\n1, 'A', 1, 'A', 1, 'A', 1, '\\'', 1, 'i', 1, '\\'',\n1, '~', 2, '\\\"', '~', 1, 'e', 1, 'e', 1, 'e', 1, 'e',\n1, 'e', 1, 'E', 1, 'E', 1, 'E', 1, 'E', 1, 'E',\n2, '\\'', '`', 2, '\\'', '\\'', 2, '\\'', '~', 1, 'i', 1, 'i', 1, 'i',\n1, 'i', 1, 'i', 1, 'i', 1, 'I', 1, 'I', 1, 'I',\n1, 'I', 2, '`', '\\'', 2, '`', '\\'', 2, '`', '~', 1, 'u', 1, 'u',\n1, 'u', 1, 'u', 1, 'R', 1, 'R', 1, 'u', 1, 'u',\n1, 'U', 1, 'U', 1, 'U', 1, 'U', 1, 'R', 2, '\\\"', '`',\n2, '\\\"', '\\'', 1, '`', 1, 'o', 1, 'o', 1, 'o', 1, 'o',\n1, 'o', 1, 'O', 1, 'O', 1, 'O', 1, 'O', 1, 'O',\n1, '\\'', 1, '`', 1, ' ', 1, ' ', 1, ' ', 1, ' ',\n1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ', 1, ' ',\n1, ' ', 1, ' ', 1, '-', 1, '-', 1, '-', 1, '-',\n2, '-', '-', 2, '-', '-', 2, '|', '|', 1, '_', 1, '\\'', 1, '\\'',\n1, ',', 1, '\\'', 1, '\\\"', 1, '\\\"', 2, ',', ',', 1, '\\\"',\n1, '+', 2, '+', '+', 1, '*', 2, '*', '>', 1, '.', 2, '.', '.',\n3, '.', '.', '.', 1, '.', 1, ' ', 2, ' ', ' ', 1, ' ', 2, '%', '0',\n3, '%', '0', '0', 1, '\\'', 2, '\\'', '\\'', 3, '\\'', '\\'', '\\'', 1, '`', 2, '`', '`',\n3, '`', '`', '`', 1, '^', 1, '<', 1, '>', 1, '*', 2, '!', '!',\n2, '!', '?', 1, '-', 1, '_', 1, '-', 1, '^', 3, '*', '*', '*',\n2, '-', '-', 1, '/', 2, '-', '[', 2, ']', '-', 2, '?', '?', 2, '?', '!',\n2, '!', '?', 1, '&', 2, 'P', 'P', 2, '(', ']', 2, '[', ')', 1, '*',\n1, '%', 1, '~', 4, '\\'', '\\'', '\\'', '\\'', 1, ' ', 1, '0', 1, 'i',\n1, '4', 1, '5', 1, '6', 1, '7', 1, '8', 1, '9',\n1, '+', 1, '-', 1, '=', 1, '(', 1, ')', 1, 'n',\n1, '0', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5',\n1, '6', 1, '7', 1, '8', 1, '9', 1, '+', 1, '-',\n1, '=', 1, '(', 1, ')', 1, 'a', 1, 'e', 1, 'o',\n1, 'x', 1, 'h', 1, 'k', 1, 'l', 1, 'm', 1, 'n',\n1, 'p', 1, 's', 1, 't', 3, 'E', 'C', 'U', 2, 'C', 'L', 2, 'C', 'r',\n2, 'F', 'F', 1, 'L', 3, 'm', 'i', 'l', 1, 'N', 3, 'P', 't', 's', 2, 'R', 's',\n1, 'W', 2, 'N', 'S', 1, 'D', 3, 'E', 'U', 'R', 1, 'K', 1, 'T',\n2, 'D', 'r', 2, 'P', 'f', 1, 'P', 1, 'G', 1, 'A', 3, 'U', 'A', 'H',\n2, 'C', '|', 1, 'L', 2, 'S', 'm', 1, 'T', 2, 'R', 's', 1, 'L',\n1, 'M', 1, 'm', 1, 'R', 1, 'l', 3, 'B', 'T', 'C', 5, ' ', 'a', '/', 'c', ' ',\n5, ' ', 'a', '/', 's', ' ', 1, 'C', 5, ' ', 'c', '/', 'o', ' ', 5, ' ', 'c', '/', 'u', ' ', 1, 'g', 1, 'H',\n1, 'H', 1, 'H', 1, 'h', 1, 'I', 1, 'I', 1, 'L',\n1, 'l', 1, 'N', 4, 'N', 'o', '.', ' ', 1, 'P', 1, 'Q', 1, 'R',\n1, 'R', 1, 'R', 4, '(', 's', 'm', ')', 3, 'T', 'E', 'L', 4, '(', 't', 'm', ')', 1, 'Z',\n1, 'Z', 1, 'K', 1, 'A', 1, 'B', 1, 'C', 1, 'e',\n1, 'e', 1, 'E', 1, 'F', 1, 'F', 1, 'M', 1, 'o',\n1, 'i', 3, 'F', 'A', 'X', 1, 'D', 1, 'd', 1, 'e', 1, 'i',\n1, 'j', 1, 'F', 5, ' ', '1', '/', '7', ' ', 5, ' ', '1', '/', '9', ' ', 6, ' ', '1', '/', '1', '0', ' ', 5, ' ', '1', '/', '3', ' ',\n5, ' ', '2', '/', '3', ' ', 5, ' ', '1', '/', '5', ' ', 5, ' ', '2', '/', '5', ' ', 5, ' ', '3', '/', '5', ' ', 5, ' ', '4', '/', '5', ' ', 5, ' ', '1', '/', '6', ' ',\n5, ' ', '5', '/', '6', ' ', 5, ' ', '1', '/', '8', ' ', 5, ' ', '3', '/', '8', ' ', 5, ' ', '5', '/', '8', ' ', 5, ' ', '7', '/', '8', ' ', 3, ' ', '1', '/',\n1, 'I', 2, 'I', 'I', 3, 'I', 'I', 'I', 2, 'I', 'V', 1, 'V', 2, 'V', 'I',\n3, 'V', 'I', 'I', 4, 'V', 'I', 'I', 'I', 2, 'I', 'X', 1, 'X', 2, 'X', 'I', 3, 'X', 'I', 'I',\n1, 'L', 1, 'C', 1, 'D', 1, 'M', 1, 'i', 2, 'i', 'i',\n3, 'i', 'i', 'i', 2, 'i', 'v', 1, 'v', 2, 'v', 'i', 3, 'v', 'i', 'i', 4, 'v', 'i', 'i', 'i',\n2, 'i', 'x', 1, 'x', 2, 'x', 'i', 3, 'x', 'i', 'i', 1, 'l', 1, 'c',\n1, 'd', 1, 'm', 2, '(', 'D', 2, 'D', ')', 5, '(', '(', '|', ')', ')', 1, ')',\n5, ' ', '0', '/', '3', ' ', 1, '-', 1, '|', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '\\\\', 1, '/', 1, '\\\\', 1, '/', 1, '-',\n1, '-', 1, '~', 1, '~', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '-', 1, '-', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '|', 1, '-', 1, '-', 1, '-', 1, '-',\n1, '-', 1, '-', 1, '|', 1, '|', 1, '|', 1, '|',\n1, '|', 1, '|', 1, '|', 1, '^', 1, 'V', 1, '\\\\',\n1, '=', 1, 'V', 1, '^', 1, '-', 1, '-', 1, '|',\n1, '|', 1, '-', 1, '-', 1, '|', 1, '|', 1, '=',\n1, '|', 1, '=', 1, '=', 1, '|', 1, '=', 1, '|',\n1, '=', 1, '=', 1, '=', 1, '=', 1, '=', 1, '=',\n1, '|', 1, '=', 1, '|', 1, '=', 1, '|', 1, '\\\\',\n1, '/', 1, '\\\\', 1, '/', 1, '=', 1, '=', 1, '~',\n1, '~', 1, '|', 1, '|', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '-', 1, '-', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '|', 1, '|', 1, '|', 1, '|', 1, '|',\n1, '|', 1, '-', 1, '\\\\', 1, '\\\\', 1, '|', 1, '-',\n1, '/', 1, '\\\\', 1, '*', 1, '|', 1, ':', 1, '~',\n2, '<', '=', 2, '>', '=', 2, '<', '=', 2, '>', '=', 1, '^', 1, '<',\n2, '>', ' ', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5',\n1, '6', 1, '7', 1, '8', 1, '9', 2, '1', '0', 2, '1', '1',\n2, '1', '2', 2, '1', '3', 2, '1', '4', 2, '1', '5', 2, '1', '6', 2, '1', '7',\n2, '1', '8', 2, '1', '9', 2, '2', '0', 3, '(', '1', ')', 3, '(', '2', ')', 3, '(', '3', ')',\n3, '(', '4', ')', 3, '(', '5', ')', 3, '(', '6', ')', 3, '(', '7', ')', 3, '(', '8', ')', 3, '(', '9', ')',\n4, '(', '1', '0', ')', 4, '(', '1', '1', ')', 4, '(', '1', '2', ')', 4, '(', '1', '3', ')', 4, '(', '1', '4', ')', 4, '(', '1', '5', ')',\n4, '(', '1', '6', ')', 4, '(', '1', '7', ')', 4, '(', '1', '8', ')', 4, '(', '1', '9', ')', 4, '(', '2', '0', ')', 2, '1', '.',\n2, '2', '.', 2, '3', '.', 2, '4', '.', 2, '5', '.', 2, '6', '.', 2, '7', '.',\n2, '8', '.', 2, '9', '.', 3, '1', '0', '.', 3, '1', '1', '.', 3, '1', '2', '.', 3, '1', '3', '.',\n3, '1', '4', '.', 3, '1', '5', '.', 3, '1', '6', '.', 3, '1', '7', '.', 3, '1', '8', '.', 3, '1', '9', '.',\n3, '2', '0', '.', 3, '(', 'a', ')', 3, '(', 'b', ')', 3, '(', 'c', ')', 3, '(', 'd', ')', 3, '(', 'e', ')',\n3, '(', 'f', ')', 3, '(', 'g', ')', 3, '(', 'h', ')', 3, '(', 'i', ')', 3, '(', 'j', ')', 3, '(', 'k', ')',\n3, '(', 'l', ')', 3, '(', 'm', ')', 3, '(', 'n', ')', 3, '(', 'o', ')', 3, '(', 'p', ')', 3, '(', 'q', ')',\n3, '(', 'r', ')', 3, '(', 's', ')', 3, '(', 't', ')', 3, '(', 'u', ')', 3, '(', 'v', ')', 3, '(', 'w', ')',\n3, '(', 'x', ')', 3, '(', 'y', ')', 3, '(', 'z', ')', 1, 'A', 1, 'B', 1, 'C',\n1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I',\n1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O',\n1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U',\n1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, 'a',\n1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g',\n1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm',\n1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's',\n1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y',\n1, 'z', 1, '0', 2, '1', '1', 2, '1', '2', 2, '1', '3', 2, '1', '4',\n2, '1', '5', 2, '1', '6', 2, '1', '7', 2, '1', '8', 2, '1', '9', 2, '2', '0',\n1, '1', 1, '2', 1, '3', 1, '4', 1, '5', 1, '6',\n1, '7', 1, '8', 1, '9', 2, '1', '0', 1, '0', 1, '-',\n1, '-', 1, '|', 1, '|', 1, '-', 1, '-', 1, '|',\n1, '|', 1, '-', 1, '-', 1, '|', 1, '|', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '-', 1, '-', 1, '|',\n1, '|', 1, '-', 1, '|', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '+', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '+', 1, '/', 1, '\\\\',\n1, 'X', 1, '-', 1, '|', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '-', 1, '|', 1, '-', 1, '|', 1, '-',\n1, '|', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '-', 1, '|', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '#', 1, '^',\n1, '^', 1, '^', 1, '^', 1, '>', 1, '>', 1, '>',\n1, '>', 1, '>', 1, '>', 1, 'V', 1, 'V', 1, 'V',\n1, 'V', 1, '<', 1, '<', 1, '<', 1, '<', 1, '<',\n1, '<', 1, '*', 1, '*', 1, '*', 1, '*', 1, '*',\n1, '*', 1, '*', 1, '*', 1, '*', 1, '*', 1, '*',\n1, '*', 1, '*', 1, '*', 1, '*', 1, '*', 1, '*',\n1, '*', 1, '*', 1, '*', 1, '*', 1, '*', 1, '*',\n1, '*', 1, '*', 1, '*', 1, '*', 1, '*', 1, '*',\n1, '*', 1, '*', 1, '*', 1, '*', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '^', 1, '^', 1, '^',\n1, 'O', 1, '#', 1, '#', 1, '#', 1, '#', 1, '#',\n1, '#', 1, '#', 1, '#', 1, '#', 1, '*', 1, '|',\n1, '\\'', 1, '\\\"', 1, '\\\"', 1, ',', 2, ',', ',', 1, '!',\n1, '[', 1, '<', 2, '>', ' ', 1, ' ', 1, 'a', 1, '1',\n1, 'b', 1, '\\'', 1, 'k', 1, '2', 1, 'l', 1, '@',\n1, 'c', 1, 'i', 1, 'f', 1, '/', 1, 'm', 1, 's',\n1, 'p', 1, '\\\"', 1, 'e', 1, '3', 1, 'h', 1, '9',\n1, 'o', 1, '6', 1, 'r', 1, '^', 1, 'd', 1, 'j',\n1, 'g', 1, '>', 1, 'n', 1, 't', 1, 'q', 1, ',',\n1, '*', 1, '5', 1, '<', 1, '-', 1, 'u', 1, '8',\n1, 'v', 1, '.', 1, '%', 1, '[', 1, '$', 1, '+',\n1, 'x', 1, '!', 1, '&', 1, ';', 1, ':', 1, '4',\n1, '\\\\', 1, '0', 1, 'z', 1, '7', 1, '(', 1, '_',\n1, '?', 1, 'w', 1, ']', 1, '#', 1, 'y', 1, ')',\n1, '=', 4, '[', 'd', '7', ']', 5, '[', 'd', '1', '7', ']', 5, '[', 'd', '2', '7', ']', 6, '[', 'd', '1', '2', '7', ']', 5, '[', 'd', '3', '7', ']',\n6, '[', 'd', '1', '3', '7', ']', 6, '[', 'd', '2', '3', '7', ']', 7, '[', 'd', '1', '2', '3', '7', ']', 5, '[', 'd', '4', '7', ']', 6, '[', 'd', '1', '4', '7', ']', 6, '[', 'd', '2', '4', '7', ']',\n7, '[', 'd', '1', '2', '4', '7', ']', 6, '[', 'd', '3', '4', '7', ']', 7, '[', 'd', '1', '3', '4', '7', ']', 7, '[', 'd', '2', '3', '4', '7', ']', 8, '[', 'd', '1', '2', '3', '4', '7', ']', 5, '[', 'd', '5', '7', ']',\n6, '[', 'd', '1', '5', '7', ']', 6, '[', 'd', '2', '5', '7', ']', 7, '[', 'd', '1', '2', '5', '7', ']', 6, '[', 'd', '3', '5', '7', ']', 7, '[', 'd', '1', '3', '5', '7', ']', 7, '[', 'd', '2', '3', '5', '7', ']',\n8, '[', 'd', '1', '2', '3', '5', '7', ']', 6, '[', 'd', '4', '5', '7', ']', 7, '[', 'd', '1', '4', '5', '7', ']', 7, '[', 'd', '2', '4', '5', '7', ']', 8, '[', 'd', '1', '2', '4', '5', '7', ']', 7, '[', 'd', '3', '4', '5', '7', ']',\n8, '[', 'd', '1', '3', '4', '5', '7', ']', 8, '[', 'd', '2', '3', '4', '5', '7', ']', 9, '[', 'd', '1', '2', '3', '4', '5', '7', ']', 5, '[', 'd', '6', '7', ']', 6, '[', 'd', '1', '6', '7', ']', 6, '[', 'd', '2', '6', '7', ']',\n7, '[', 'd', '1', '2', '6', '7', ']', 6, '[', 'd', '3', '6', '7', ']', 7, '[', 'd', '1', '3', '6', '7', ']', 7, '[', 'd', '2', '3', '6', '7', ']', 8, '[', 'd', '1', '2', '3', '6', '7', ']', 6, '[', 'd', '4', '6', '7', ']',\n7, '[', 'd', '1', '4', '6', '7', ']', 7, '[', 'd', '2', '4', '6', '7', ']', 8, '[', 'd', '1', '2', '4', '6', '7', ']', 7, '[', 'd', '3', '4', '6', '7', ']', 8, '[', 'd', '1', '3', '4', '6', '7', ']', 8, '[', 'd', '2', '3', '4', '6', '7', ']',\n9, '[', 'd', '1', '2', '3', '4', '6', '7', ']', 6, '[', 'd', '5', '6', '7', ']', 7, '[', 'd', '1', '5', '6', '7', ']', 7, '[', 'd', '2', '5', '6', '7', ']', 8, '[', 'd', '1', '2', '5', '6', '7', ']', 7, '[', 'd', '3', '5', '6', '7', ']',\n8, '[', 'd', '1', '3', '5', '6', '7', ']', 8, '[', 'd', '2', '3', '5', '6', '7', ']', 9, '[', 'd', '1', '2', '3', '5', '6', '7', ']', 7, '[', 'd', '4', '5', '6', '7', ']', 8, '[', 'd', '1', '4', '5', '6', '7', ']', 8, '[', 'd', '2', '4', '5', '6', '7', ']',\n9, '[', 'd', '1', '2', '4', '5', '6', '7', ']', 8, '[', 'd', '3', '4', '5', '6', '7', ']', 9, '[', 'd', '1', '3', '4', '5', '6', '7', ']', 9, '[', 'd', '2', '3', '4', '5', '6', '7', ']', 10, '[', 'd', '1', '2', '3', '4', '5', '6', '7', ']', 4, '[', 'd', '8', ']',\n5, '[', 'd', '1', '8', ']', 5, '[', 'd', '2', '8', ']', 6, '[', 'd', '1', '2', '8', ']', 5, '[', 'd', '3', '8', ']', 6, '[', 'd', '1', '3', '8', ']', 6, '[', 'd', '2', '3', '8', ']',\n7, '[', 'd', '1', '2', '3', '8', ']', 5, '[', 'd', '4', '8', ']', 6, '[', 'd', '1', '4', '8', ']', 6, '[', 'd', '2', '4', '8', ']', 7, '[', 'd', '1', '2', '4', '8', ']', 6, '[', 'd', '3', '4', '8', ']',\n7, '[', 'd', '1', '3', '4', '8', ']', 7, '[', 'd', '2', '3', '4', '8', ']', 8, '[', 'd', '1', '2', '3', '4', '8', ']', 5, '[', 'd', '5', '8', ']', 6, '[', 'd', '1', '5', '8', ']', 6, '[', 'd', '2', '5', '8', ']',\n7, '[', 'd', '1', '2', '5', '8', ']', 6, '[', 'd', '3', '5', '8', ']', 7, '[', 'd', '1', '3', '5', '8', ']', 7, '[', 'd', '2', '3', '5', '8', ']', 8, '[', 'd', '1', '2', '3', '5', '8', ']', 6, '[', 'd', '4', '5', '8', ']',\n7, '[', 'd', '1', '4', '5', '8', ']', 7, '[', 'd', '2', '4', '5', '8', ']', 8, '[', 'd', '1', '2', '4', '5', '8', ']', 7, '[', 'd', '3', '4', '5', '8', ']', 8, '[', 'd', '1', '3', '4', '5', '8', ']', 8, '[', 'd', '2', '3', '4', '5', '8', ']',\n9, '[', 'd', '1', '2', '3', '4', '5', '8', ']', 5, '[', 'd', '6', '8', ']', 6, '[', 'd', '1', '6', '8', ']', 6, '[', 'd', '2', '6', '8', ']', 7, '[', 'd', '1', '2', '6', '8', ']', 6, '[', 'd', '3', '6', '8', ']',\n7, '[', 'd', '1', '3', '6', '8', ']', 7, '[', 'd', '2', '3', '6', '8', ']', 8, '[', 'd', '1', '2', '3', '6', '8', ']', 6, '[', 'd', '4', '6', '8', ']', 7, '[', 'd', '1', '4', '6', '8', ']', 7, '[', 'd', '2', '4', '6', '8', ']',\n8, '[', 'd', '1', '2', '4', '6', '8', ']', 7, '[', 'd', '3', '4', '6', '8', ']', 8, '[', 'd', '1', '3', '4', '6', '8', ']', 8, '[', 'd', '2', '3', '4', '6', '8', ']', 9, '[', 'd', '1', '2', '3', '4', '6', '8', ']', 6, '[', 'd', '5', '6', '8', ']',\n7, '[', 'd', '1', '5', '6', '8', ']', 7, '[', 'd', '2', '5', '6', '8', ']', 8, '[', 'd', '1', '2', '5', '6', '8', ']', 7, '[', 'd', '3', '5', '6', '8', ']', 8, '[', 'd', '1', '3', '5', '6', '8', ']', 8, '[', 'd', '2', '3', '5', '6', '8', ']',\n9, '[', 'd', '1', '2', '3', '5', '6', '8', ']', 7, '[', 'd', '4', '5', '6', '8', ']', 8, '[', 'd', '1', '4', '5', '6', '8', ']', 8, '[', 'd', '2', '4', '5', '6', '8', ']', 9, '[', 'd', '1', '2', '4', '5', '6', '8', ']', 8, '[', 'd', '3', '4', '5', '6', '8', ']',\n9, '[', 'd', '1', '3', '4', '5', '6', '8', ']', 9, '[', 'd', '2', '3', '4', '5', '6', '8', ']', 10, '[', 'd', '1', '2', '3', '4', '5', '6', '8', ']', 5, '[', 'd', '7', '8', ']', 6, '[', 'd', '1', '7', '8', ']', 6, '[', 'd', '2', '7', '8', ']',\n7, '[', 'd', '1', '2', '7', '8', ']', 6, '[', 'd', '3', '7', '8', ']', 7, '[', 'd', '1', '3', '7', '8', ']', 7, '[', 'd', '2', '3', '7', '8', ']', 8, '[', 'd', '1', '2', '3', '7', '8', ']', 6, '[', 'd', '4', '7', '8', ']',\n7, '[', 'd', '1', '4', '7', '8', ']', 7, '[', 'd', '2', '4', '7', '8', ']', 8, '[', 'd', '1', '2', '4', '7', '8', ']', 7, '[', 'd', '3', '4', '7', '8', ']', 8, '[', 'd', '1', '3', '4', '7', '8', ']', 8, '[', 'd', '2', '3', '4', '7', '8', ']',\n9, '[', 'd', '1', '2', '3', '4', '7', '8', ']', 6, '[', 'd', '5', '7', '8', ']', 7, '[', 'd', '1', '5', '7', '8', ']', 7, '[', 'd', '2', '5', '7', '8', ']', 8, '[', 'd', '1', '2', '5', '7', '8', ']', 7, '[', 'd', '3', '5', '7', '8', ']',\n8, '[', 'd', '1', '3', '5', '7', '8', ']', 8, '[', 'd', '2', '3', '5', '7', '8', ']', 9, '[', 'd', '1', '2', '3', '5', '7', '8', ']', 7, '[', 'd', '4', '5', '7', '8', ']', 8, '[', 'd', '1', '4', '5', '7', '8', ']', 8, '[', 'd', '2', '4', '5', '7', '8', ']',\n9, '[', 'd', '1', '2', '4', '5', '7', '8', ']', 8, '[', 'd', '3', '4', '5', '7', '8', ']', 9, '[', 'd', '1', '3', '4', '5', '7', '8', ']', 9, '[', 'd', '2', '3', '4', '5', '7', '8', ']', 10, '[', 'd', '1', '2', '3', '4', '5', '7', '8', ']', 6, '[', 'd', '6', '7', '8', ']',\n7, '[', 'd', '1', '6', '7', '8', ']', 7, '[', 'd', '2', '6', '7', '8', ']', 8, '[', 'd', '1', '2', '6', '7', '8', ']', 7, '[', 'd', '3', '6', '7', '8', ']', 8, '[', 'd', '1', '3', '6', '7', '8', ']', 8, '[', 'd', '2', '3', '6', '7', '8', ']',\n9, '[', 'd', '1', '2', '3', '6', '7', '8', ']', 7, '[', 'd', '4', '6', '7', '8', ']', 8, '[', 'd', '1', '4', '6', '7', '8', ']', 8, '[', 'd', '2', '4', '6', '7', '8', ']', 9, '[', 'd', '1', '2', '4', '6', '7', '8', ']', 8, '[', 'd', '3', '4', '6', '7', '8', ']',\n9, '[', 'd', '1', '3', '4', '6', '7', '8', ']', 9, '[', 'd', '2', '3', '4', '6', '7', '8', ']', 10, '[', 'd', '1', '2', '3', '4', '6', '7', '8', ']', 7, '[', 'd', '5', '6', '7', '8', ']', 8, '[', 'd', '1', '5', '6', '7', '8', ']', 8, '[', 'd', '2', '5', '6', '7', '8', ']',\n9, '[', 'd', '1', '2', '5', '6', '7', '8', ']', 8, '[', 'd', '3', '5', '6', '7', '8', ']', 9, '[', 'd', '1', '3', '5', '6', '7', '8', ']', 9, '[', 'd', '2', '3', '5', '6', '7', '8', ']', 10, '[', 'd', '1', '2', '3', '5', '6', '7', '8', ']', 8, '[', 'd', '4', '5', '6', '7', '8', ']',\n9, '[', 'd', '1', '4', '5', '6', '7', '8', ']', 9, '[', 'd', '2', '4', '5', '6', '7', '8', ']', 10, '[', 'd', '1', '2', '4', '5', '6', '7', '8', ']', 9, '[', 'd', '3', '4', '5', '6', '7', '8', ']', 10, '[', 'd', '1', '3', '4', '5', '6', '7', '8', ']', 10, '[', 'd', '2', '3', '4', '5', '6', '7', '8', ']',\n11, '[', 'd', '1', '2', '3', '4', '5', '6', '7', '8', ']', 1, '{', 2, '}', ' ', 3, ':', ':', '=', 2, '=', '=', 3, '=', '=', '=',\n1, 'L', 1, 'l', 1, 'L', 1, 'P', 1, 'R', 1, 'a',\n1, 't', 1, 'H', 1, 'h', 1, 'K', 1, 'k', 1, 'Z',\n1, 'z', 1, 'M', 1, 'A', 1, 'r', 2, 'r', '.', 1, 'T',\n2, 'T', '.', 1, 's', 2, '[', ']', 1, '\\\\', 1, '/', 2, '_', '_',\n1, '>', 1, '%', 1, '>', 1, '=', 1, '/', 1, '-',\n1, '~', 1, '\\\\', 1, '/', 1, '~', 1, '~', 2, '|', '-',\n2, '-', '|', 2, '<', '=', 2, '=', '>', 2, '(', '(', 2, ')', ')', 2, ':', ':',\n1, '?', 1, '\\'', 1, 'o', 1, '.', 1, ',', 1, '.',\n1, ',', 1, ';', 4, '-', '-', '-', '-', 6, '-', '-', '-', '-', '-', '-', 1, 'x', 1, '|',\n1, '=', 1, ',', 1, '\\\"', 3, '`', '-', '-', 1, ' ', 2, ',', ' ',\n2, '.', ' ', 1, '\\\"', 5, '[', 'J', 'I', 'S', ']', 1, '\\\"', 1, '/', 1, '0',\n1, '<', 2, '>', ' ', 2, '<', '<', 3, '>', '>', ' ', 1, '[', 2, ']', ' ',\n1, '{', 2, '}', ' ', 2, '[', '(', 3, ')', ']', ' ', 1, '@', 2, 'X', ' ',\n1, '[', 2, ']', ' ', 2, '[', '[', 3, ']', ']', ' ', 2, '(', '(', 3, ')', ')', ' ',\n2, '[', '[', 3, ']', ']', ' ', 2, '~', ' ', 2, '`', '`', 2, '\\'', '\\'', 2, ',', ',',\n1, '@', 1, '1', 1, '2', 1, '3', 1, '4', 1, '5',\n1, '6', 1, '7', 1, '8', 1, '9', 1, '~', 1, '+',\n1, '+', 1, '+', 1, '+', 1, '@', 4, ' ', '/', '/', ' ', 4, '+', '1', '0', '+',\n4, '+', '2', '0', '+', 4, '+', '3', '0', '+', 1, 'a', 1, 'a', 1, 'i', 1, 'i',\n1, 'u', 1, 'u', 1, 'e', 1, 'e', 1, 'o', 1, 'o',\n2, 'k', 'a', 2, 'g', 'a', 2, 'k', 'i', 2, 'g', 'i', 2, 'k', 'u', 2, 'g', 'u',\n2, 'k', 'e', 2, 'g', 'e', 2, 'k', 'o', 2, 'g', 'o', 2, 's', 'a', 2, 'z', 'a',\n3, 's', 'h', 'i', 2, 'z', 'i', 2, 's', 'u', 2, 'z', 'u', 2, 's', 'e', 2, 'z', 'e',\n2, 's', 'o', 2, 'z', 'o', 2, 't', 'a', 2, 'd', 'a', 3, 'c', 'h', 'i', 2, 'd', 'i',\n3, 't', 's', 'u', 3, 't', 's', 'u', 2, 'd', 'u', 2, 't', 'e', 2, 'd', 'e', 2, 't', 'o',\n2, 'd', 'o', 2, 'n', 'a', 2, 'n', 'i', 2, 'n', 'u', 2, 'n', 'e', 2, 'n', 'o',\n2, 'h', 'a', 2, 'b', 'a', 2, 'p', 'a', 2, 'h', 'i', 2, 'b', 'i', 2, 'p', 'i',\n2, 'h', 'u', 2, 'b', 'u', 2, 'p', 'u', 2, 'h', 'e', 2, 'b', 'e', 2, 'p', 'e',\n2, 'h', 'o', 2, 'b', 'o', 2, 'p', 'o', 2, 'm', 'a', 2, 'm', 'i', 2, 'm', 'u',\n2, 'm', 'e', 2, 'm', 'o', 2, 'y', 'a', 2, 'y', 'a', 2, 'y', 'u', 2, 'y', 'u',\n2, 'y', 'o', 2, 'y', 'o', 2, 'r', 'a', 2, 'r', 'i', 2, 'r', 'u', 2, 'r', 'e',\n2, 'r', 'o', 2, 'w', 'a', 2, 'w', 'a', 2, 'w', 'i', 2, 'w', 'e', 2, 'w', 'o',\n1, 'n', 2, 'v', 'u', 1, '\\\"', 1, '\\\"', 1, 'a', 1, 'a',\n1, 'i', 1, 'i', 1, 'u', 1, 'u', 1, 'e', 1, 'e',\n1, 'o', 1, 'o', 2, 'k', 'a', 2, 'g', 'a', 2, 'k', 'i', 2, 'g', 'i',\n2, 'k', 'u', 2, 'g', 'u', 2, 'k', 'e', 2, 'g', 'e', 2, 'k', 'o', 2, 'g', 'o',\n2, 's', 'a', 2, 'z', 'a', 3, 's', 'h', 'i', 2, 'z', 'i', 2, 's', 'u', 2, 'z', 'u',\n2, 's', 'e', 2, 'z', 'e', 2, 's', 'o', 2, 'z', 'o', 2, 't', 'a', 2, 'd', 'a',\n3, 'c', 'h', 'i', 2, 'd', 'i', 3, 't', 's', 'u', 3, 't', 's', 'u', 2, 'd', 'u', 2, 't', 'e',\n2, 'd', 'e', 2, 't', 'o', 2, 'd', 'o', 2, 'n', 'a', 2, 'n', 'i', 2, 'n', 'u',\n2, 'n', 'e', 2, 'n', 'o', 2, 'h', 'a', 2, 'b', 'a', 2, 'p', 'a', 2, 'h', 'i',\n2, 'b', 'i', 2, 'p', 'i', 2, 'h', 'u', 2, 'b', 'u', 2, 'p', 'u', 2, 'h', 'e',\n2, 'b', 'e', 2, 'p', 'e', 2, 'h', 'o', 2, 'b', 'o', 2, 'p', 'o', 2, 'm', 'a',\n2, 'm', 'i', 2, 'm', 'u', 2, 'm', 'e', 2, 'm', 'o', 2, 'y', 'a', 2, 'y', 'a',\n2, 'y', 'u', 2, 'y', 'u', 2, 'y', 'o', 2, 'y', 'o', 2, 'r', 'a', 2, 'r', 'i',\n2, 'r', 'u', 2, 'r', 'e', 2, 'r', 'o', 2, 'w', 'a', 2, 'w', 'a', 2, 'w', 'i',\n2, 'w', 'e', 2, 'w', 'o', 1, 'n', 2, 'v', 'u', 2, 'k', 'a', 2, 'k', 'e',\n2, 'v', 'a', 2, 'v', 'i', 2, 'v', 'e', 2, 'v', 'o', 1, '\\\"', 1, '\\\"',\n1, 'B', 1, 'P', 1, 'M', 1, 'F', 1, 'D', 1, 'T',\n1, 'N', 1, 'L', 1, 'G', 1, 'K', 1, 'H', 1, 'J',\n1, 'Q', 1, 'X', 2, 'Z', 'H', 2, 'C', 'H', 2, 'S', 'H', 1, 'R',\n1, 'Z', 1, 'C', 1, 'S', 1, 'A', 1, 'O', 1, 'E',\n2, 'E', 'H', 2, 'A', 'I', 2, 'E', 'I', 2, 'A', 'U', 2, 'O', 'U', 2, 'A', 'N',\n2, 'E', 'N', 3, 'A', 'N', 'G', 3, 'E', 'N', 'G', 2, 'E', 'R', 1, 'I', 1, 'U',\n2, 'I', 'U', 1, 'V', 2, 'N', 'G', 2, 'G', 'N', 1, 'g', 2, 'g', 'g',\n2, 'g', 's', 1, 'n', 2, 'n', 'j', 2, 'n', 'h', 1, 'd', 2, 'd', 'd',\n1, 'r', 2, 'l', 'g', 2, 'l', 'm', 2, 'l', 'b', 2, 'l', 's', 2, 'l', 't',\n2, 'l', 'p', 2, 'r', 'h', 1, 'm', 1, 'b', 2, 'b', 'b', 2, 'b', 's',\n1, 's', 2, 's', 's', 1, 'j', 2, 'j', 'j', 1, 'c', 1, 'k',\n1, 't', 1, 'p', 1, 'h', 1, 'a', 2, 'a', 'e', 2, 'y', 'a',\n3, 'y', 'a', 'e', 2, 'e', 'o', 1, 'e', 3, 'y', 'e', 'o', 2, 'y', 'e', 1, 'o',\n2, 'w', 'a', 3, 'w', 'a', 'e', 2, 'o', 'e', 2, 'y', 'o', 1, 'u', 3, 'w', 'e', 'o',\n2, 'w', 'e', 2, 'w', 'i', 2, 'y', 'u', 2, 'e', 'u', 2, 'y', 'i', 1, 'i',\n2, 'n', 'n', 2, 'n', 'd', 2, 'n', 's', 2, 'n', 'Z', 3, 'l', 'g', 's', 2, 'l', 'd',\n3, 'l', 'b', 's', 2, 'l', 'Z', 2, 'l', 'Q', 2, 'm', 'b', 2, 'm', 's', 2, 'm', 'Z',\n2, 'm', 'N', 2, 'b', 'g', 3, 'b', 's', 'g', 3, 'b', 's', 't', 2, 'b', 'j', 2, 'b', 't',\n2, 'b', 'N', 3, 'b', 'b', 'N', 2, 's', 'g', 2, 's', 'n', 2, 's', 'd', 2, 's', 'b',\n2, 's', 'j', 1, 'Z', 1, 'N', 2, 'N', 's', 2, 'N', 'Z', 2, 'p', 'N',\n2, 'h', 'h', 1, 'Q', 5, 'y', 'o', '-', 'y', 'a', 6, 'y', 'o', '-', 'y', 'a', 'e', 4, 'y', 'o', '-', 'i', 6, 'y', 'u', '-', 'y', 'e', 'o',\n5, 'y', 'u', '-', 'y', 'e', 4, 'y', 'u', '-', 'i', 1, 'U', 3, 'U', '-', 'i', 2, 'B', 'U', 2, 'Z', 'I',\n2, 'J', 'I', 2, 'G', 'U', 2, 'E', 'E', 3, 'E', 'N', 'N', 2, 'O', 'O', 3, 'O', 'N', 'N',\n2, 'I', 'R', 3, 'A', 'N', 'N', 3, 'I', 'N', 'N', 3, 'U', 'N', 'N', 2, 'I', 'M', 3, 'N', 'G', 'G',\n4, 'A', 'I', 'N', 'N', 4, 'A', 'U', 'N', 'N', 2, 'A', 'M', 2, 'O', 'M', 3, 'O', 'N', 'G', 4, 'I', 'N', 'N', 'N',\n1, 'P', 1, 'T', 1, 'K', 1, 'H', 3, '(', 'g', ')', 3, '(', 'n', ')',\n3, '(', 'd', ')', 3, '(', 'r', ')', 3, '(', 'm', ')', 3, '(', 'b', ')', 3, '(', 's', ')', 2, '(', ')',\n3, '(', 'j', ')', 3, '(', 'c', ')', 3, '(', 'k', ')', 3, '(', 't', ')', 3, '(', 'p', ')', 3, '(', 'h', ')',\n4, '(', 'g', 'a', ')', 4, '(', 'n', 'a', ')', 4, '(', 'd', 'a', ')', 4, '(', 'r', 'a', ')', 4, '(', 'm', 'a', ')', 4, '(', 'b', 'a', ')',\n4, '(', 's', 'a', ')', 3, '(', 'a', ')', 4, '(', 'j', 'a', ')', 4, '(', 'c', 'a', ')', 4, '(', 'k', 'a', ')', 4, '(', 't', 'a', ')',\n4, '(', 'p', 'a', ')', 4, '(', 'h', 'a', ')', 4, '(', 'j', 'u', ')', 4, '(', '1', ')', ' ', 4, '(', '2', ')', ' ', 4, '(', '3', ')', ' ',\n4, '(', '4', ')', ' ', 4, '(', '5', ')', ' ', 4, '(', '6', ')', ' ', 4, '(', '7', ')', ' ', 4, '(', '8', ')', ' ', 4, '(', '9', ')', ' ',\n5, '(', '1', '0', ')', ' ', 6, '(', 'Y', 'u', 'e', ')', ' ', 6, '(', 'H', 'u', 'o', ')', ' ', 7, '(', 'S', 'h', 'u', 'i', ')', ' ', 5, '(', 'M', 'u', ')', ' ', 6, '(', 'J', 'i', 'n', ')', ' ',\n5, '(', 'T', 'u', ')', ' ', 5, '(', 'R', 'i', ')', ' ', 6, '(', 'Z', 'h', 'u', ')', ' ', 6, '(', 'Y', 'o', 'u', ')', ' ', 6, '(', 'S', 'h', 'e', ')', ' ', 7, '(', 'M', 'i', 'n', 'g', ')', ' ',\n5, '(', 'T', 'e', ')', ' ', 6, '(', 'C', 'a', 'i', ')', ' ', 6, '(', 'Z', 'h', 'u', ')', ' ', 6, '(', 'L', 'a', 'o', ')', ' ', 6, '(', 'D', 'a', 'i', ')', ' ', 5, '(', 'H', 'u', ')', ' ',\n6, '(', 'X', 'u', 'e', ')', ' ', 7, '(', 'J', 'i', 'a', 'n', ')', ' ', 5, '(', 'Q', 'i', ')', ' ', 5, '(', 'Z', 'i', ')', ' ', 6, '(', 'X', 'i', 'e', ')', ' ', 5, '(', 'J', 'i', ')', ' ',\n6, '(', 'X', 'i', 'u', ')', ' ', 2, '<', '<', 2, '>', '>', 2, '2', '1', 2, '2', '2', 2, '2', '3',\n2, '2', '4', 2, '2', '5', 2, '2', '6', 2, '2', '7', 2, '2', '8', 2, '2', '9',\n2, '3', '0', 2, '3', '1', 2, '3', '2', 2, '3', '3', 2, '3', '4', 2, '3', '5',\n3, '(', 'g', ')', 3, '(', 'n', ')', 3, '(', 'd', ')', 3, '(', 'r', ')', 3, '(', 'm', ')', 3, '(', 'b', ')',\n3, '(', 's', ')', 2, '(', ')', 3, '(', 'j', ')', 3, '(', 'c', ')', 3, '(', 'k', ')', 3, '(', 't', ')',\n3, '(', 'p', ')', 3, '(', 'h', ')', 4, '(', 'g', 'a', ')', 4, '(', 'n', 'a', ')', 4, '(', 'd', 'a', ')', 4, '(', 'r', 'a', ')',\n4, '(', 'm', 'a', ')', 4, '(', 'b', 'a', ')', 4, '(', 's', 'a', ')', 3, '(', 'a', ')', 4, '(', 'j', 'a', ')', 4, '(', 'c', 'a', ')',\n4, '(', 'k', 'a', ')', 4, '(', 't', 'a', ')', 4, '(', 'p', 'a', ')', 4, '(', 'h', 'a', ')', 4, 'K', 'I', 'S', ' ', 4, '(', '1', ')', ' ',\n4, '(', '2', ')', ' ', 4, '(', '3', ')', ' ', 4, '(', '4', ')', ' ', 4, '(', '5', ')', ' ', 4, '(', '6', ')', ' ', 4, '(', '7', ')', ' ',\n4, '(', '8', ')', ' ', 4, '(', '9', ')', ' ', 5, '(', '1', '0', ')', ' ', 6, '(', 'Y', 'u', 'e', ')', ' ', 6, '(', 'H', 'u', 'o', ')', ' ', 7, '(', 'S', 'h', 'u', 'i', ')', ' ',\n5, '(', 'M', 'u', ')', ' ', 6, '(', 'J', 'i', 'n', ')', ' ', 5, '(', 'T', 'u', ')', ' ', 5, '(', 'R', 'i', ')', ' ', 6, '(', 'Z', 'h', 'u', ')', ' ', 6, '(', 'Y', 'o', 'u', ')', ' ',\n6, '(', 'S', 'h', 'e', ')', ' ', 7, '(', 'M', 'i', 'n', 'g', ')', ' ', 5, '(', 'T', 'e', ')', ' ', 6, '(', 'C', 'a', 'i', ')', ' ', 6, '(', 'Z', 'h', 'u', ')', ' ', 6, '(', 'L', 'a', 'o', ')', ' ',\n5, '(', 'M', 'i', ')', ' ', 6, '(', 'N', 'a', 'n', ')', ' ', 5, '(', 'N', 'u', ')', ' ', 6, '(', 'S', 'h', 'i', ')', ' ', 6, '(', 'Y', 'o', 'u', ')', ' ', 6, '(', 'Y', 'i', 'n', ')', ' ',\n6, '(', 'Z', 'h', 'u', ')', ' ', 8, '(', 'X', 'i', 'a', 'n', 'g', ')', ' ', 6, '(', 'X', 'i', 'u', ')', ' ', 6, '(', 'X', 'i', 'e', ')', ' ', 8, '(', 'Z', 'h', 'e', 'n', 'g', ')', ' ', 8, '(', 'S', 'h', 'a', 'n', 'g', ')', ' ',\n8, '(', 'Z', 'h', 'o', 'n', 'g', ')', ' ', 6, '(', 'X', 'i', 'a', ')', ' ', 6, '(', 'Z', 'u', 'o', ')', ' ', 6, '(', 'Y', 'o', 'u', ')', ' ', 5, '(', 'Y', 'i', ')', ' ', 7, '(', 'Z', 'o', 'n', 'g', ')', ' ',\n6, '(', 'X', 'u', 'e', ')', ' ', 7, '(', 'J', 'i', 'a', 'n', ')', ' ', 5, '(', 'Q', 'i', ')', ' ', 5, '(', 'Z', 'i', ')', ' ', 6, '(', 'X', 'i', 'e', ')', ' ', 5, '(', 'Y', 'e', ')', ' ',\n2, '3', '6', 2, '3', '7', 2, '3', '8', 2, '3', '9', 2, '4', '0', 2, '4', '1',\n2, '4', '2', 2, '4', '3', 2, '4', '4', 2, '4', '5', 2, '4', '6', 2, '4', '7',\n2, '4', '8', 2, '4', '9', 2, '5', '0', 2, '1', 'M', 2, '2', 'M', 2, '3', 'M',\n2, '4', 'M', 2, '5', 'M', 2, '6', 'M', 2, '7', 'M', 2, '8', 'M', 2, '9', 'M',\n3, '1', '0', 'M', 3, '1', '1', 'M', 3, '1', '2', 'M', 2, 'H', 'g', 3, 'e', 'r', 'g', 2, 'e', 'V',\n3, 'L', 'T', 'D', 1, 'a', 1, 'i', 1, 'u', 1, 'u', 1, 'o',\n2, 'k', 'a', 2, 'k', 'i', 2, 'k', 'u', 2, 'k', 'e', 2, 'k', 'o', 2, 's', 'a',\n2, 's', 'i', 2, 's', 'u', 2, 's', 'e', 2, 's', 'o', 2, 't', 'a', 2, 't', 'i',\n2, 't', 'u', 2, 't', 'e', 2, 't', 'o', 2, 'n', 'a', 2, 'n', 'i', 2, 'n', 'u',\n2, 'n', 'e', 2, 'n', 'o', 2, 'h', 'a', 2, 'h', 'i', 2, 'h', 'u', 2, 'h', 'e',\n2, 'h', 'o', 2, 'm', 'a', 2, 'm', 'i', 2, 'm', 'u', 2, 'm', 'e', 2, 'm', 'o',\n2, 'y', 'a', 2, 'y', 'u', 2, 'y', 'o', 2, 'r', 'a', 2, 'r', 'i', 2, 'r', 'u',\n2, 'r', 'e', 2, 'r', 'o', 2, 'w', 'a', 2, 'w', 'i', 2, 'w', 'e', 2, 'w', 'o',\n9, 'a', 'p', 'a', 'r', 't', 'm', 'e', 'n', 't', 5, 'a', 'l', 'p', 'h', 'a', 6, 'a', 'm', 'p', 'e', 'r', 'e', 3, 'a', 'r', 'e', 6, 'i', 'n', 'n', 'i', 'n', 'g', 4, 'i', 'n', 'c', 'h',\n3, 'w', 'o', 'n', 6, 'e', 's', 'c', 'u', 'd', 'o', 4, 'a', 'c', 'r', 'e', 5, 'o', 'u', 'n', 'c', 'e', 3, 'o', 'h', 'm', 6, 'k', 'a', 'i', '-', 'r', 'i',\n5, 'c', 'a', 'r', 'a', 't', 7, 'c', 'a', 'l', 'o', 'r', 'i', 'e', 6, 'g', 'a', 'l', 'l', 'o', 'n', 5, 'g', 'a', 'm', 'm', 'a', 4, 'g', 'i', 'g', 'a', 6, 'g', 'u', 'i', 'n', 'e', 'a',\n5, 'c', 'u', 'r', 'i', 'e', 7, 'g', 'u', 'i', 'l', 'd', 'e', 'r', 4, 'k', 'i', 'l', 'o', 8, 'k', 'i', 'l', 'o', 'g', 'r', 'a', 'm', 9, 'k', 'i', 'l', 'o', 'm', 'e', 't', 'e', 'r', 8, 'k', 'i', 'l', 'o', 'w', 'a', 't', 't',\n4, 'g', 'r', 'a', 'm', 8, 'g', 'r', 'a', 'm', ' ', 't', 'o', 'n', 8, 'c', 'r', 'u', 'z', 'e', 'i', 'r', 'o', 5, 'k', 'r', 'o', 'n', 'e', 4, 'c', 'a', 's', 'e', 6, 'k', 'o', 'r', 'u', 'n', 'a',\n5, 'c', 'o', '-', 'o', 'p', 5, 'c', 'y', 'c', 'l', 'e', 7, 'c', 'e', 'n', 't', 'i', 'm', 'e', 8, 's', 'h', 'i', 'l', 'l', 'i', 'n', 'g', 5, 'c', 'e', 'n', 't', 'i', 4, 'c', 'e', 'n', 't',\n5, 'd', 'o', 'z', 'e', 'n', 4, 'd', 'e', 's', 'i', 6, 'd', 'o', 'l', 'l', 'a', 'r', 3, 't', 'o', 'n', 4, 'n', 'a', 'n', 'o', 4, 'k', 'n', 'o', 't',\n7, 'h', 'e', 'i', 'g', 'h', 't', 's', 7, 'p', 'e', 'r', 'c', 'e', 'n', 't', 5, 'p', 'a', 'r', 't', 's', 6, 'b', 'a', 'r', 'r', 'e', 'l', 7, 'p', 'i', 'a', 's', 't', 'e', 'r', 5, 'p', 'i', 'c', 'u', 'l',\n4, 'p', 'i', 'c', 'o', 8, 'b', 'u', 'i', 'l', 'd', 'i', 'n', 'g', 5, 'f', 'a', 'r', 'a', 'd', 4, 'f', 'e', 'e', 't', 6, 'b', 'u', 's', 'h', 'e', 'l', 5, 'f', 'r', 'a', 'n', 'c',\n7, 'h', 'e', 'c', 't', 'a', 'r', 'e', 4, 'p', 'e', 's', 'o', 7, 'p', 'f', 'e', 'n', 'n', 'i', 'g', 5, 'h', 'e', 'r', 't', 'z', 5, 'p', 'e', 'n', 'c', 'e', 4, 'p', 'a', 'g', 'e',\n4, 'b', 'e', 't', 'a', 5, 'p', 'o', 'i', 'n', 't', 4, 'v', 'o', 'l', 't', 3, 'h', 'o', 'n', 5, 'p', 'o', 'u', 'n', 'd', 4, 'h', 'a', 'l', 'l',\n4, 'h', 'o', 'r', 'n', 5, 'm', 'i', 'c', 'r', 'o', 4, 'm', 'i', 'l', 'e', 4, 'm', 'a', 'c', 'h', 4, 'm', 'a', 'r', 'k', 7, 'm', 'a', 'n', 's', 'i', 'o', 'n',\n6, 'm', 'i', 'c', 'r', 'o', 'n', 5, 'm', 'i', 'l', 'l', 'i', 8, 'm', 'i', 'l', 'l', 'i', 'b', 'a', 'r', 4, 'm', 'e', 'g', 'a', 7, 'm', 'e', 'g', 'a', 't', 'o', 'n', 5, 'm', 'e', 't', 'e', 'r',\n4, 'y', 'a', 'r', 'd', 4, 'y', 'a', 'r', 'd', 4, 'y', 'u', 'a', 'n', 5, 'l', 'i', 't', 'e', 'r', 4, 'l', 'i', 'r', 'a', 5, 'r', 'u', 'p', 'e', 'e',\n5, 'r', 'u', 'b', 'l', 'e', 3, 'r', 'e', 'm', 8, 'r', 'o', 'e', 'n', 't', 'g', 'e', 'n', 4, 'w', 'a', 't', 't', 2, '0', 'h', 2, '1', 'h',\n2, '2', 'h', 2, '3', 'h', 2, '4', 'h', 2, '5', 'h', 2, '6', 'h', 2, '7', 'h',\n2, '8', 'h', 2, '9', 'h', 3, '1', '0', 'h', 3, '1', '1', 'h', 3, '1', '2', 'h', 3, '1', '3', 'h',\n3, '1', '4', 'h', 3, '1', '5', 'h', 3, '1', '6', 'h', 3, '1', '7', 'h', 3, '1', '8', 'h', 3, '1', '9', 'h',\n3, '2', '0', 'h', 3, '2', '1', 'h', 3, '2', '2', 'h', 3, '2', '3', 'h', 3, '2', '4', 'h', 3, 'h', 'P', 'a',\n2, 'd', 'a', 2, 'A', 'U', 3, 'b', 'a', 'r', 2, 'o', 'V', 2, 'p', 'c', 2, 'd', 'm',\n4, 'd', 'm', '^', '2', 4, 'd', 'm', '^', '3', 2, 'I', 'U', 6, 'H', 'e', 'i', 's', 'e', 'i', 6, 'S', 'y', 'o', 'u', 'w', 'a', 7, 'T', 'a', 'i', 's', 'y', 'o', 'u',\n5, 'M', 'e', 'i', 'j', 'i', 4, 'I', 'n', 'c', '.', 2, 'p', 'A', 2, 'n', 'A', 2, 'u', 'A', 2, 'm', 'A',\n2, 'k', 'A', 2, 'k', 'B', 2, 'M', 'B', 2, 'G', 'B', 3, 'c', 'a', 'l', 4, 'k', 'c', 'a', 'l',\n2, 'p', 'F', 2, 'n', 'F', 2, 'u', 'F', 2, 'u', 'g', 2, 'm', 'g', 2, 'k', 'g',\n2, 'H', 'z', 3, 'k', 'H', 'z', 3, 'M', 'H', 'z', 3, 'G', 'H', 'z', 3, 'T', 'H', 'z', 2, 'u', 'l',\n2, 'm', 'l', 2, 'd', 'l', 2, 'k', 'l', 2, 'f', 'm', 2, 'n', 'm', 2, 'u', 'm',\n2, 'm', 'm', 2, 'c', 'm', 2, 'k', 'm', 4, 'm', 'm', '^', '2', 4, 'c', 'm', '^', '2', 3, 'm', '^', '2',\n4, 'k', 'm', '^', '2', 4, 'm', 'm', '^', '3', 4, 'c', 'm', '^', '3', 3, 'm', '^', '3', 4, 'k', 'm', '^', '3', 3, 'm', '/', 's',\n5, 'm', '/', 's', '^', '2', 2, 'P', 'a', 3, 'k', 'P', 'a', 3, 'M', 'P', 'a', 3, 'G', 'P', 'a', 3, 'r', 'a', 'd',\n5, 'r', 'a', 'd', '/', 's', 7, 'r', 'a', 'd', '/', 's', '^', '2', 2, 'p', 's', 2, 'n', 's', 2, 'u', 's', 2, 'm', 's',\n2, 'p', 'V', 2, 'n', 'V', 2, 'u', 'V', 2, 'm', 'V', 2, 'k', 'V', 2, 'M', 'V',\n2, 'p', 'W', 2, 'n', 'W', 2, 'u', 'W', 2, 'm', 'W', 2, 'k', 'W', 2, 'M', 'W',\n4, 'k', 'O', 'h', 'm', 4, 'M', 'O', 'h', 'm', 4, 'a', '.', 'm', '.', 2, 'B', 'q', 2, 'c', 'c', 2, 'c', 'd',\n4, 'C', '/', 'k', 'g', 3, 'C', 'o', '.', 2, 'd', 'B', 2, 'G', 'y', 2, 'h', 'a', 2, 'H', 'P',\n2, 'i', 'n', 4, 'K', '.', 'K', '.', 2, 'K', 'M', 2, 'k', 't', 2, 'l', 'm', 2, 'l', 'n',\n3, 'l', 'o', 'g', 2, 'l', 'x', 2, 'm', 'b', 3, 'm', 'i', 'l', 3, 'm', 'o', 'l', 2, 'p', 'H',\n4, 'p', '.', 'm', '.', 3, 'P', 'P', 'M', 2, 'P', 'R', 2, 's', 'r', 2, 'S', 'v', 2, 'W', 'b',\n3, 'V', '/', 'm', 3, 'A', '/', 'm', 2, '1', 'd', 2, '2', 'd', 2, '3', 'd', 2, '4', 'd',\n2, '5', 'd', 2, '6', 'd', 2, '7', 'd', 2, '8', 'd', 2, '9', 'd', 3, '1', '0', 'd',\n3, '1', '1', 'd', 3, '1', '2', 'd', 3, '1', '3', 'd', 3, '1', '4', 'd', 3, '1', '5', 'd', 3, '1', '6', 'd',\n3, '1', '7', 'd', 3, '1', '8', 'd', 3, '1', '9', 'd', 3, '2', '0', 'd', 3, '2', '1', 'd', 3, '2', '2', 'd',\n3, '2', '3', 'd', 3, '2', '4', 'd', 3, '2', '5', 'd', 3, '2', '6', 'd', 3, '2', '7', 'd', 3, '2', '8', 'd',\n3, '2', '9', 'd', 3, '3', '0', 'd', 3, '3', '1', 'd', 3, 'g', 'a', 'l', 3, 'Y', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n4, 'K', 'a', 'o', ' ', 3, 'Q', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 3, 'M', 'o', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ',\n4, 'S', 'a', 'n', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 3, 'J', 'i', ' ', 3, 'B', 'u', ' ', 3, 'Y', 'u', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 4, 'G', 'a', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Q', 'i', 'e', ' ',\n3, 'P', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'Y', 'e', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'S', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'D', 'i', 'u', ' ', 4, 'Q', 'i', 'u', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'D', 'i', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n5, 'S', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'n', ' ', 4, 'J', 'i', 'u', ' ', 3, 'G', 'e', ' ', 3, 'Y', 'a', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'H', 'a', ' ', 4, 'W', 'a', 'n', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 3, 'J', 'u', ' ',\n4, 'P', 'i', 'e', ' ', 3, 'F', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'N', 'a', 'i', ' ', 6, 'S', 'h', 'i', 'm', 'e', ' ',\n4, 'J', 'i', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'W', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'H', 'u', ' ', 3, 'F', 'a', ' ', 3, 'L', 'e', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'H', 'u', ' ', 5, 'G', 'u', 'a', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'M', 'i', 'e', ' ', 4, 'J', 'i', 'u', ' ', 3, 'Q', 'i', ' ',\n3, 'Y', 'e', ' ', 3, 'X', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ', 4, 'D', 'i', 'u', ' ', 4, 'H', 'a', 'l', ' ',\n4, 'S', 'h', 'u', ' ', 5, 'T', 'w', 'u', 'l', ' ', 4, 'S', 'h', 'i', ' ', 3, 'J', 'i', ' ', 5, 'N', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'K', 'e', 'l', ' ', 4, 'S', 'h', 'i', ' ', 3, 'O', 'l', ' ', 4, 'M', 'a', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'C', 'a', 'l', ' ',\n3, 'R', 'u', ' ', 4, 'X', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'S', 'h', 'a', ' ', 3, 'N', 'a', ' ',\n4, 'G', 'a', 'n', ' ', 4, 'S', 'o', 'l', ' ', 3, 'E', 'l', ' ', 5, 'C', 'w', 'u', 'l', ' ', 4, 'G', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'G', 'u', 'i', ' ', 4, 'G', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 3, 'M', 'a', ' ', 3, 'Y', 'u', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'E', 'r', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'H', 'u', ' ', 3, 'Q', 'i', ' ', 3, 'W', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'S', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n4, 'G', 'e', 'n', ' ', 4, 'G', 'e', 'n', ' ', 3, 'Y', 'a', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Y', 'a', ' ', 3, 'Q', 'i', ' ',\n3, 'Y', 'a', ' ', 3, 'J', 'i', ' ', 4, 'T', 'o', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'T', 'a', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'H', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'M', 'u', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'Y', 'e', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'B', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'X', 'i', 'e', ' ', 4, 'D', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'R', 'e', 'n', ' ', 3, 'J', 'i', ' ',\n3, 'L', 'a', ' ', 5, 'W', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'L', 'e', ' ',\n5, 'D', 'i', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 4, 'J', 'i', 'n', ' ', 3, 'P', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'B', 'a', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 4, 'J', 'i', 'e', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'R', 'e', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n3, 'F', 'o', ' ', 4, 'S', 'a', 'n', ' ', 4, 'L', 'u', 'n', ' ', 4, 'S', 'y', 'a', ' ', 5, 'C', 'a', 'n', 'g', ' ', 3, 'Z', 'i', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'T', 'a', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'T', 'u', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'R', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'D', 'i', ' ', 4, 'D', 'a', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'S', 'a', ' ', 3, 'Y', 'i', ' ', 3, 'M', 'u', ' ', 4, 'M', 'e', 'n', ' ', 4, 'R', 'e', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'C', 'h', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'P', 'i', ' ',\n4, 'W', 'a', 'n', ' ', 3, 'W', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n5, 'C', 'a', 'n', 'g', ' ', 4, 'R', 'e', 'n', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'D', 'i', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'P', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'n', ' ',\n4, 'W', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'i', 'n', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ',\n3, 'A', 'i', ' ', 3, 'W', 'u', ' ', 3, 'J', 'i', ' ', 3, 'F', 'u', ' ', 3, 'F', 'a', ' ', 4, 'X', 'i', 'u', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'B', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'F', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n4, 'Y', 'o', 'u', ' ', 4, 'H', 'u', 'o', ' ', 4, 'H', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'C', 'u', 'i', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n4, 'S', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'e', ' ', 3, 'Y', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'N', 'u', ' ', 3, 'B', 'o', ' ', 3, 'G', 'u', ' ',\n3, 'N', 'i', ' ', 3, 'N', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'B', 'a', 'n', ' ', 3, 'X', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'Q', 'u', ' ', 3, 'S', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 3, 'S', 'i', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'P', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'S', 'i', ' ', 3, 'A', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ', 4, 'M', 'a', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'B', 'u', ' ',\n3, 'Q', 'u', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'C', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'D', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'T', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n3, 'H', 'e', ' ', 3, 'B', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'S', 'h', 'e', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'i', ' ',\n3, 'F', 'o', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'K', 'o', 'u', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'W', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'K', 'a', ' ',\n4, 'P', 'e', 'i', ' ', 5, 'H', 'u', 'a', 'i', ' ', 3, 'H', 'e', ' ', 4, 'L', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'G', 'e', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'i', ' ', 3, 'F', 'a', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 3, 'E', 'r', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'H', 'e', 'n', ' ', 4, 'H', 'u', 'o', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'C', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'T', 'u', 'o', ' ', 4, 'K', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'G', 'a', 'i', ' ', 4, 'L', 'a', 'i', ' ',\n3, 'Y', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'K', 'u', 'a', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'M', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'X', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'A', 'n', ' ',\n3, 'L', 'u', ' ', 4, 'M', 'o', 'u', ' ', 3, 'E', 'r', ' ', 4, 'L', 'u', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'a', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'X', 'u', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'R', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 4, 'J', 'i', 'a', ' ', 4, 'Z', 'a', 'i', ' ', 3, 'L', 'u', ' ', 3, 'K', 'o', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'C', 'e', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ',\n5, 'N', 'i', 'n', 'g', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 3, 'W', 'u', ' ', 4, 'H', 'o', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'Z', 'u', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'L', 'u', ' ',\n3, 'J', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'T', 'u', 'o', ' ', 3, 'B', 'o', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'T', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'X', 'i', ' ',\n3, 'C', 'u', ' ', 2, 'E', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'X', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'K', 'u', ' ',\n3, 'W', 'u', ' ', 4, 'J', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'F', 'u', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'Z', 'u', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 3, 'L', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'S', 'a', 'n', ' ', 4, 'P', 'a', 'i', ' ', 3, 'S', 'u', ' ', 3, 'F', 'u', ' ', 3, 'X', 'i', ' ', 3, 'L', 'i', ' ',\n3, 'F', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'S', 'i', ' ', 4, 'X', 'i', 'a', ' ',\n4, 'X', 'i', 'n', ' ', 4, 'X', 'i', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'T', 'i', ' ', 4, 'C', 'h', 'e', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'L', 'i', 'a', ' ', 3, 'L', 'i', ' ', 4, 'L', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'H', 'e', ' ', 3, 'J', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'P', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'F', 'e', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 3, 'A', 'n', ' ',\n4, 'B', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'X', 'i', 'n', ' ', 3, 'B', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n4, 'C', 'h', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'C', 'u', 'i', ' ', 4, 'L', 'i', 'a', ' ',\n4, 'W', 'a', 'n', ' ', 4, 'L', 'a', 'i', ' ', 5, 'C', 'a', 'n', 'g', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'G', 'e', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n4, 'B', 'e', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'M', 'e', 'n', ' ', 4, 'D', 'a', 'o', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'H', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'T', 'i', ' ', 4, 'G', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'S', 'u', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'K', 'o', 'n', 'g', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'N', 'i', ' ',\n4, 'L', 'u', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'L', 'u', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'L', 'e', 'n', 'g', ' ',\n4, 'H', 'u', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 4, 'B', 'e', 'n', ' ', 3, 'W', 'u', ' ', 3, 'J', 'u', ' ',\n4, 'N', 'a', 'i', ' ', 4, 'C', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 3, 'Y', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'S', 'h', 'a', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'N', 'u', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'J', 'i', 'a', ' ', 4, 'J', 'i', 'e', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'Y', 'u', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'R', 'u', 'o', ' ', 3, 'T', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'P', 'i', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'W', 'o', ' ', 2, 'E', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'C', 'h', 'e', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'C', 'h', 'a', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 3, 'Y', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'C', 'i', ' ', 3, 'F', 'u', ' ', 3, 'B', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n3, 'J', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'X', 'u', 'n', ' ', 3, 'S', 'i', ' ', 5, 'D', 'u', 'a', 'n', ' ',\n3, 'C', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'O', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'B', 'e', 'i', ' ',\n3, 'Z', 'a', ' ', 3, 'L', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'W', 'e', 'i', ' ', 4, 'F', 'e', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n4, 'G', 'u', 'i', ' ', 4, 'S', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'S', 'u', ' ', 4, 'X', 'i', 'a', ' ', 3, 'F', 'u', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 3, 'R', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'G', 'o', 'u', ' ',\n3, 'M', 'a', ' ', 5, 'B', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'X', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ',\n4, 'S', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'T', 'a', 'n', ' ',\n4, 'S', 'u', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'F', 'a', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 4, 'D', 'a', 'i', ' ',\n4, 'Z', 'a', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'B', 'i', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'N', 'u', 'o', ' ', 4, 'C', 'a', 'n', ' ',\n4, 'L', 'e', 'i', ' ', 4, 'C', 'u', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 3, 'A', 'o', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 4, 'C', 'o', 'u', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 4, 'S', 'h', 'a', ' ', 4, 'H', 'a', 'n', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'D', 'i', ' ', 3, 'X', 'i', ' ', 3, 'L', 'u', ' ',\n4, 'B', 'e', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'M', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'T', 'u', 'i', ' ', 4, 'Z', 'u', 'n', ' ',\n3, 'P', 'u', ' ', 3, 'X', 'i', ' ', 4, 'L', 'a', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'J', 'i', ' ', 4, 'F', 'a', 'n', ' ',\n4, 'H', 'u', 'i', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ',\n5, 'S', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 2, 'E', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 3, 'B', 'o', ' ', 3, 'G', 'u', ' ', 3, 'S', 'u', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'M', 'i', 'n', ' ', 3, 'Y', 'e', ' ', 4, 'J', 'i', 'n', ' ', 4, 'J', 'i', 'a', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 3, 'P', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'A', 'i', ' ', 4, 'S', 'a', 'i', ' ',\n3, 'Y', 'i', ' ', 4, 'J', 'u', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'D', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'a', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'B', 'i', 'n', ' ', 3, 'A', 'n', ' ', 3, 'R', 'u', ' ',\n4, 'T', 'a', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'L', 'a', 'n', ' ', 3, 'N', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'N', 'i', 'n', 'g', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'L', 'e', 'i', ' ', 3, 'L', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ',\n3, 'D', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'S', 'i', ' ', 4, 'Y', 'o', 'u', ' ',\n4, 'H', 'a', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'L', 'i', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'R', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'L', 'i', ' ', 4, 'L', 'u', 'o', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'L', 'e', 'i', ' ', 5, 'N', 'a', 'n', 'g', ' ', 3, 'E', 'r', ' ', 3, 'W', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Z', 'a', 'n', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'D', 'u', 'i', ' ', 3, 'K', 'e', ' ', 4, 'D', 'u', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'T', 'u', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'E', 'r', ' ', 4, 'D', 'u', 'i', ' ', 3, 'E', 'r', ' ', 4, 'X', 'i', 'n', ' ', 3, 'T', 'u', ' ',\n3, 'S', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'D', 'o', 'u', ' ', 4, 'F', 'e', 'n', ' ', 4, 'M', 'a', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'D', 'o', 'u', ' ',\n4, 'B', 'a', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'R', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ',\n4, 'N', 'e', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'B', 'a', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'X', 'i', ' ', 4, 'L', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 3, 'J', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'Z', 'i', ' ',\n6, 'P', 'p', 'w', 'u', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'J', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ', 4, 'R', 'a', 'n', ' ', 4, 'N', 'e', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'R', 'a', 'n', ' ', 3, 'C', 'e', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ',\n3, 'C', 'e', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'G', 'u', 'a', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n4, 'M', 'o', 'u', ' ', 4, 'G', 'o', 'u', ' ', 3, 'X', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'K', 'a', 'n', ' ', 4, 'J', 'u', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n3, 'M', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 4, 'L', 'a', 'm', ' ', 3, 'F', 'u', ' ', 4, 'X', 'i', 'e', ' ',\n3, 'M', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 3, 'H', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 3, 'H', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n3, 'Y', 'e', ' ', 5, 'L', 'e', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'M', 'i', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'e', ' ', 4, 'X', 'i', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'M', 'e', 'i', ' ', 3, 'T', 'u', ' ', 3, 'Q', 'i', ' ', 3, 'G', 'u', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'C', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'L', 'i', ' ',\n5, 'C', 'a', 'n', 'g', ' ', 5, 'M', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'e', 'n', ' ', 4, 'C', 'u', 'i', ' ', 3, 'S', 'i', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'D', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n4, 'C', 'h', 'u', ' ', 5, 'T', 'a', 'k', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'M', 'o', 'k', ' ', 3, 'C', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'i', ' ',\n3, 'T', 'u', ' ', 3, 'A', 'o', ' ', 4, 'C', 'h', 'u', ' ', 3, 'J', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'D', 'a', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'D', 'a', 'o', ' ', 4, 'R', 'e', 'n', ' ',\n4, 'R', 'e', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'K', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'C', 'u', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'W', 'e', 'n', ' ', 3, 'J', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 4, 'W', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'L', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 4, 'L', 'i', 'e', ' ', 4, 'L', 'i', 'u', ' ', 3, 'Z', 'e', ' ', 5, 'G', 'a', 'n', 'g', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ',\n3, 'F', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Q', 'u', ' ', 3, 'J', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 4, 'B', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'L', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'B', 'i', 'e', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'G', 'e', 'n', ' ', 4, 'D', 'a', 'o', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 3, 'K', 'u', ' ',\n4, 'D', 'u', 'o', ' ', 3, 'E', 'r', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'S', 'h', 'u', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ',\n3, 'C', 'i', ' ', 3, 'K', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'G', 'u', 'i', ' ', 3, 'C', 'i', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'K', 'a', 'i', ' ', 4, 'D', 'u', 'o', ' ', 3, 'J', 'i', ' ', 3, 'T', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ',\n4, 'G', 'e', 'n', ' ', 3, 'Z', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'C', 'u', 'o', ' ', 4, 'X', 'u', 'e', ' ', 3, 'K', 'e', ' ',\n3, 'L', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'C', 'u', 'o', ' ', 3, 'L', 'i', ' ', 3, 'T', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'P', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'B', 'o', ' ',\n3, 'J', 'i', ' ', 4, 'D', 'u', 'o', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'J', 'i', ' ', 3, 'B', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'J', 'u', ' ', 4, 'H', 'u', 'o', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 5, 'D', 'u', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'G', 'u', 'a', ' ', 3, 'F', 'u', ' ',\n6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'G', 'e', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'K', 'a', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'T', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ', 3, 'L', 'i', ' ', 4, 'F', 'o', 'u', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'K', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'H', 'u', 'a', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n3, 'P', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'G', 'u', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'M', 'o', ' ', 3, 'L', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'W', 'u', ' ', 4, 'M', 'a', 'i', ' ', 4, 'L', 'i', 'e', ' ', 4, 'J', 'i', 'n', ' ', 5, 'K', 'e', 'n', 'g', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'N', 'u', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'Q', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'M', 'i', 'a', 'o', ' ', 3, 'L', 'i', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'K', 'o', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n3, 'W', 'a', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'M', 'o', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 4, 'L', 'i', 'e', ' ',\n3, 'H', 'e', ' ', 4, 'S', 'h', 'i', ' ', 3, 'K', 'e', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 3, 'B', 'o', ' ',\n4, 'M', 'i', 'n', ' ', 4, 'C', 'h', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n3, 'K', 'e', ' ', 4, 'X', 'u', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'P', 'o', 'u', ' ',\n5, 'M', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 3, 'L', 'e', ' ', 4, 'K', 'a', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n3, 'X', 'u', ' ', 3, 'X', 'u', ' ', 4, 'K', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'u', 'n', ' ',\n5, 'W', 'e', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'o', ' ', 3, 'M', 'u', ' ', 3, 'L', 'u', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'u', 'e', ' ', 4, 'F', 'a', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n3, 'J', 'u', ' ', 4, 'D', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'M', 'a', 'i', ' ', 4, 'X', 'u', 'n', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'L', 'u', ' ', 3, 'L', 'i', ' ', 4, 'C', 'h', 'e', ' ', 5, 'R', 'a', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ',\n5, 'S', 'h', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'J', 'i', 'u', ' ', 4, 'B', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ', 3, 'W', 'u', ' ',\n4, 'Y', 'u', 'n', ' ', 5, 'M', 'w', 'u', 'n', ' ', 4, 'N', 'a', 'y', ' ', 4, 'G', 'a', 'i', ' ', 4, 'G', 'a', 'i', ' ', 4, 'B', 'a', 'o', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ', 4, 'T', 'a', 'o', ' ', 3, 'G', 'e', ' ',\n3, 'P', 'u', ' ', 3, 'A', 'n', ' ', 4, 'P', 'a', 'o', ' ', 3, 'F', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'D', 'a', ' ',\n4, 'J', 'i', 'u', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'H', 'u', 'a', ' ', 4, 'B', 'e', 'i', ' ', 4, 'N', 'a', 'o', ' ',\n4, 'C', 'h', 'i', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'Z', 'a', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ',\n5, 'K', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 4, 'X', 'i', 'a', ' ', 3, 'Q', 'u', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Q', 'i', 'e', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ',\n3, 'H', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'G', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'S', 'u', 'a', 'n', ' ', 3, 'D', 'u', ' ', 4, 'J', 'i', 'u', ' ',\n3, 'Q', 'u', ' ', 3, 'X', 'i', ' ', 3, 'P', 'i', ' ', 3, 'Q', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'Q', 'i', 'a', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'N', 'i', ' ', 3, 'Q', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'X', 'i', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'S', 'a', ' ', 3, 'Z', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'B', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'X', 'i', ' ', 4, 'W', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'W', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ', 3, 'Z', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'M', 'a', 'i', ' ', 4, 'N', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'B', 'o', ' ',\n6, 'S', 'h', 'u', 'a', 'i', ' ', 3, 'B', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'B', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n4, 'Q', 'i', 'a', ' ', 3, 'L', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 4, 'G', 'u', 'a', ' ',\n3, 'W', 'o', ' ', 4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'W', 'e', 'i', ' ', 4, 'A', 'n', 'g', ' ',\n6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'M', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n3, 'J', 'i', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ',\n3, 'X', 'u', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 3, 'W', 'u', ' ', 3, 'J', 'i', ' ', 2, 'E', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'H', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 2, 'E', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'H', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'a', ' ', 3, 'Y', 'a', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'H', 'e', ' ',\n3, 'Y', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'C', 'e', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'T', 'i', ' ', 3, 'L', 'i', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'H', 'o', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Z', 'u', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'F', 'e', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 3, 'C', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'i', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'S', 'h', 'a', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Q', 'i', 'n', ' ',\n3, 'A', 'o', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'S', 'i', ' ', 3, 'L', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'S', 'i', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'Q', 'u', ' ', 3, 'Q', 'u', ' ', 3, 'U', 'k', ' ',\n4, 'L', 'e', 'i', ' ', 3, 'D', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 4, 'C', 'a', 'n', ' ',\n4, 'C', 'a', 'n', ' ', 4, 'C', 'a', 'n', ' ', 4, 'C', 'a', 'n', ' ', 3, 'A', 'i', ' ', 4, 'D', 'a', 'i', ' ', 4, 'Y', 'o', 'u', ' ',\n4, 'C', 'h', 'a', ' ', 3, 'J', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n5, 'G', 'u', 'a', 'i', ' ', 3, 'B', 'a', ' ', 3, 'F', 'a', ' ', 4, 'R', 'u', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 3, 'Q', 'u', ' ', 5, 'S', 'h', 'o', 'u', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'P', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ', 4, 'G', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'S', 'o', 'u', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'R', 'u', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 3, 'G', 'u', ' ', 3, 'J', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'T', 'a', 'o', ' ', 4, 'K', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n3, 'B', 'a', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'K', 'e', ' ', 4, 'T', 'a', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Y', 'o', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'P', 'o', ' ', 4, 'X', 'i', 'e', ' ', 4, 'H', 'a', 'o', ' ', 3, 'S', 'i', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'L', 'e', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n4, 'M', 'i', 'e', ' ', 3, 'X', 'u', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 3, 'G', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 3, 'Z', 'i', ' ', 3, 'H', 'e', ' ', 3, 'J', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'C', 'u', 'n', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'H', 'o', 'u', ' ', 3, 'L', 'i', ' ', 3, 'T', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'X', 'i', 'a', ' ', 3, 'Y', 'e', ' ', 3, 'L', 'u', ' ', 2, 'A', ' ', 3, 'M', 'a', ' ',\n3, 'O', 'u', ' ', 4, 'X', 'u', 'e', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'u', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'T', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'F', 'e', 'i', ' ', 3, 'B', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'Q', 'i', 'n', ' ',\n4, 'J', 'i', 'e', ' ', 3, 'B', 'u', ' ', 4, 'F', 'o', 'u', ' ', 3, 'B', 'a', ' ', 4, 'D', 'u', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n2, 'E', ' ', 4, 'H', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'H', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'n', ' ', 3, 'Q', 'i', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'W', 'u', ' ', 3, 'W', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n3, 'N', 'e', ' ', 4, 'X', 'u', 'e', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'u', 'i', ' ', 4, 'D', 'o', 'u', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'H', 'o', 'u', ' ', 3, 'O', 'u', ' ', 3, 'W', 'u', ' ', 4, 'G', 'a', 'o', ' ', 3, 'Y', 'a', ' ', 4, 'J', 'u', 'n', ' ',\n3, 'L', 'u', ' ', 2, 'E', ' ', 3, 'G', 'e', ' ', 4, 'M', 'e', 'i', ' ', 3, 'A', 'i', ' ', 3, 'Q', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'G', 'a', 'o', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n4, 'C', 'h', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'N', 'e', ' ', 4, 'T', 'u', 'n', ' ', 3, 'F', 'u', ' ', 3, 'Y', 'i', ' ',\n4, 'D', 'a', 'i', ' ', 3, 'O', 'u', ' ', 3, 'L', 'i', ' ', 4, 'B', 'a', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 2, 'E', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'P', 'e', 'n', ' ',\n4, 'W', 'e', 'n', ' ', 3, 'N', 'i', ' ', 2, 'M', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'R', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ',\n3, 'D', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'T', 'i', 'e', ' ', 3, 'X', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 3, 'G', 'u', ' ', 3, 'Z', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'X', 'u', ' ', 3, 'H', 'e', ' ', 4, 'N', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ', 4, 'P', 'e', 'i', ' ',\n3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'H', 'u', ' ', 5, 'M', 'i', 'n', 'g', ' ', 3, 'D', 'a', ' ',\n3, 'Q', 'u', ' ', 3, 'J', 'u', ' ', 4, 'G', 'e', 'm', ' ', 3, 'Z', 'a', ' ', 4, 'T', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'P', 'o', 'u', ' ', 4, 'P', 'a', 'o', ' ', 3, 'B', 'i', ' ', 3, 'F', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'H', 'e', ' ',\n4, 'Z', 'h', 'a', ' ', 3, 'H', 'e', ' ', 4, 'H', 'a', 'i', ' ', 4, 'J', 'i', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n4, 'Q', 'u', 'e', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'W', 'a', ' ', 3, 'K', 'a', ' ', 3, 'G', 'u', ' ', 3, 'K', 'a', ' ',\n4, 'Z', 'u', 'o', ' ', 3, 'B', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'T', 'h', 'a', ' ',\n3, 'S', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'E', 'r', ' ', 2, 'E', ' ',\n6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'L', 'i', 'e', ' ', 3, 'Z', 'i', ' ',\n4, 'M', 'i', 'e', ' ', 3, 'M', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'J', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n3, 'G', 'e', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'K', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'K', 'u', 'a', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'T', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 2, 'E', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'X', 'i', 'u', ' ', 4, 'W', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'L', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'A', 'i', ' ',\n4, 'P', 'i', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n3, 'W', 'a', ' ', 3, 'H', 'a', ' ', 4, 'Z', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'D', 'i', ' ', 4, 'P', 'a', 'i', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'A', 'i', ' ', 4, 'H', 'e', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 3, 'D', 'a', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'H', 'u', 'a', ' ', 6, 'S', 'a', 's', 'o', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ',\n4, 'D', 'u', 'o', ' ', 3, 'J', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'M', 'o', 'u', ' ', 3, 'Y', 'o', ' ', 4, 'H', 'a', 'o', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'P', 'o', 'u', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'G', 'e', ' ', 2, 'E', ' ',\n4, 'C', 'h', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'L', 'i', ' ', 3, 'N', 'a', ' ', 3, 'Z', 'u', ' ', 3, 'H', 'e', ' ',\n3, 'K', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'Z', 'h', 'e', ' ',\n4, 'Z', 'h', 'a', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'B', 'a', ' ', 4, 'M', 'i', 'e', ' ', 3, 'L', 'e', ' ', 4, 'S', 'u', 'i', ' ',\n4, 'F', 'o', 'u', ' ', 3, 'B', 'u', ' ', 4, 'H', 'a', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ',\n3, 'G', 'e', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'G', 'u', ' ', 3, 'G', 'u', ' ', 4, 'B', 'a', 'i', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'A', 'i', ' ', 4, 'J', 'i', 'a', ' ',\n3, 'T', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'X', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'Z', 'u', 'o', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'C', 'h', 'e', ' ', 3, 'W', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'Y', 'a', ' ',\n4, 'D', 'o', 'u', ' ', 3, 'Q', 'i', ' ', 3, 'D', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'M', 'a', ' ', 4, 'M', 'a', 'l', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ', 4, 'K', 'e', 's', ' ', 4, 'L', 'a', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ',\n4, 'Z', 'a', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'a', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'u', 'o', ' ',\n3, 'W', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'H', 'u', ' ', 3, 'Q', 'i', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'S', 'h', 'u', 'a', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'E', 'r', ' ', 3, 'L', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n3, 'A', 'n', ' ', 4, 'J', 'i', 'e', ' ', 3, 'Y', 'o', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'L', 'a', 'i', ' ', 4, 'S', 'h', 'a', ' ', 3, 'X', 'i', ' ', 4, 'T', 'u', 'o', ' ', 3, 'H', 'u', ' ', 3, 'A', 'i', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 4, 'N', 'o', 'u', ' ', 4, 'K', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ',\n3, 'D', 'i', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 2, 'A', ' ', 5, 'X', 'i', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'T', 'u', 'n', ' ', 3, 'W', 'u', ' ', 4, 'W', 'e', 'n', ' ', 4, 'C', 'u', 'i', ' ', 4, 'S', 'h', 'a', ' ', 3, 'H', 'u', ' ',\n3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'T', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'e', ' ',\n3, 'Z', 'i', ' ', 3, 'B', 'i', ' ', 4, 'C', 'u', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'H', 'e', ' ', 3, 'Y', 'a', ' ',\n3, 'Q', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'P', 'e', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'P', 'i', ' ',\n4, 'S', 'h', 'a', ' ', 3, 'L', 'a', ' ', 3, 'Z', 'e', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 3, 'P', 'a', ' ',\n4, 'Z', 'h', 'e', ' ', 3, 'S', 'e', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 4, 'G', 'u', 'o', ' ', 4, 'L', 'u', 'o', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'D', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 3, 'B', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 3, 'T', 'i', ' ', 3, 'A', 'n', ' ',\n4, 'J', 'i', 'u', ' ', 4, 'D', 'a', 'n', ' ', 3, 'K', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'N', 'a', 'n', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'L', 'a', ' ', 4, 'J', 'i', 'e', ' ', 4, 'H', 'o', 'u', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'W', 'a', 'i', ' ', 3, 'R', 'e', ' ',\n3, 'Y', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'W', 'o', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n3, 'H', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 3, 'H', 'e', ' ', 3, 'J', 'i', ' ', 4, 'K', 'u', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'S', 'h', 'a', ' ', 3, 'X', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'N', 'i', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'S', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'P', 'e', 'n', ' ', 4, 'C', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'o', ' ', 4, 'Z', 'h', 'a', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'M', 'i', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'P', 'e', 'n', ' ', 5, 'P', 'h', 'o', 's', ' ', 4, 'K', 'u', 'i', ' ',\n3, 'X', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'L', 'o', 'u', ' ', 3, 'K', 'u', ' ', 4, 'S', 'a', 'o', ' ',\n4, 'H', 'u', 'o', ' ', 3, 'T', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'H', 'e', ' ', 2, 'A', ' ', 4, 'X', 'i', 'u', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'S', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'S', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ',\n3, 'Y', 'i', ' ', 4, 'S', 'u', 'o', ' ', 3, 'M', 'a', ' ', 4, 'C', 'h', 'a', ' ', 4, 'H', 'a', 'i', ' ', 3, 'K', 'e', ' ',\n3, 'T', 'a', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'R', 'u', ' ', 4, 'S', 'o', 'u', ' ', 3, 'W', 'a', ' ',\n3, 'J', 'i', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'G', 'e', ' ',\n3, 'Z', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'L', 'u', 'o', ' ', 5, 'W', 'e', 'n', 'g', ' ', 3, 'W', 'a', ' ', 3, 'S', 'i', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'H', 'a', 'o', ' ', 4, 'S', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ', 4, 'H', 'a', 'i', ' ', 4, 'S', 'u', 'o', ' ',\n4, 'Q', 'i', 'n', ' ', 4, 'N', 'i', 'e', ' ', 3, 'H', 'e', ' ', 4, 'C', 'i', 's', ' ', 4, 'S', 'a', 'i', ' ', 3, 'N', 'g', ' ',\n3, 'G', 'e', ' ', 3, 'N', 'a', ' ', 4, 'D', 'i', 'a', ' ', 3, 'A', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'B', 'i', ' ',\n3, 'A', 'o', ' ', 3, 'A', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'C', 'u', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'M', 'o', ' ',\n4, 'S', 'o', 'u', ' ', 4, 'S', 'o', 'u', ' ', 4, 'T', 'a', 'n', ' ', 3, 'D', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'K', 'a', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 4, 'C', 'a', 'o', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'A', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'L', 'o', 'u', ' ', 3, 'G', 'a', ' ',\n3, 'G', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'H', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'G', 'u', 'o', ' ', 3, 'O', 'u', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'X', 'u', ' ', 3, 'P', 'o', ' ', 3, 'D', 'e', ' ',\n3, 'M', 'a', ' ', 3, 'M', 'a', ' ', 3, 'H', 'u', ' ', 4, 'L', 'e', 'i', ' ', 3, 'D', 'u', ' ', 3, 'G', 'a', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'S', 'a', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n3, 'M', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'a', ' ', 4, 'M', 'a', 'i', ' ', 4, 'R', 'a', 'n', ' ', 4, 'Z', 'u', 'o', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'S', 'i', ' ', 4, 'H', 'a', 'o', ' ', 3, 'F', 'u', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'X', 'i', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ',\n3, 'M', 'o', ' ', 4, 'X', 'u', 'n', ' ', 2, 'E', ' ', 4, 'Z', 'u', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'C', 'u', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'T', 'u', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'e', ' ', 3, 'X', 'i', ' ', 3, 'Q', 'i', ' ',\n4, 'H', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'P', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'N', 'i', 'e', ' ', 3, 'L', 'u', ' ',\n3, 'S', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'D', 'a', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 4, 'J', 'i', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'H', 'u', 'i', ' ', 3, 'Q', 'i', ' ',\n2, 'E', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n3, 'A', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'P', 'e', 'n', ' ',\n4, 'D', 'a', 'o', ' ', 3, 'G', 'e', ' ', 4, 'X', 'i', 'n', ' ', 4, 'D', 'u', 'n', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'S', 'i', 'n', ' ',\n4, 'S', 'a', 'i', ' ', 3, 'P', 'i', ' ', 3, 'P', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ',\n3, 'D', 'i', ' ', 4, 'L', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'H', 'u', 'o', ' ', 3, 'R', 'u', ' ', 4, 'H', 'a', 'o', ' ',\n4, 'X', 'i', 'a', ' ', 3, 'Y', 'a', ' ', 4, 'D', 'u', 'o', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'H', 'a', 'o', ' ', 3, 'T', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'C', 'a', ' ', 3, 'T', 'i', ' ',\n3, 'L', 'u', ' ', 4, 'H', 'u', 'i', ' ', 3, 'B', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'N', 'i', 'e', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'H', 'u', ' ', 3, 'M', 'o', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'L', 'i', ' ', 4, 'L', 'i', 'u', ' ',\n5, 'H', 'a', 'a', 'i', ' ', 5, 'N', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'M', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'i', ' ',\n3, 'L', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'D', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'P', 'i', 'n', ' ',\n3, 'P', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 3, 'M', 'o', ' ', 3, 'X', 'i', ' ', 4, 'D', 'u', 'o', ' ',\n3, 'K', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'R', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n3, 'L', 'a', ' ', 3, 'T', 'a', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'C', 'a', ' ', 3, 'L', 'i', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'i', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'L', 'u', 'o', ' ', 5, 'N', 'a', 'n', 'g', ' ',\n4, 'Z', 'a', 'n', ' ', 3, 'S', 'u', ' ', 3, 'X', 'i', ' ', 3, 'S', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Z', 'a', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 5, 'N', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'S', 'i', ' ', 4, 'N', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'X', 'i', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'N', 'a', 'n', ' ', 5, 'T', 'u', 'a', 'n', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'D', 'u', 'n', ' ',\n5, 'K', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n3, 'H', 'u', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'K', 'u', 'n', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'T', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'L', 'u', 'n', ' ', 4, 'G', 'u', 'o', ' ',\n4, 'Q', 'u', 'n', ' ', 3, 'R', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'T', 'a', 'i', ' ',\n4, 'G', 'u', 'o', ' ', 3, 'T', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'H', 'u', 'n', ' ',\n3, 'P', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'H', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'L', 'u', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 3, 'K', 'u', ' ', 3, 'F', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 2, 'E', ' ',\n3, 'T', 'u', ' ', 3, 'T', 'u', ' ', 3, 'T', 'u', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'L', 'u', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'Y', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 3, 'T', 'u', ' ', 3, 'Y', 'a', ' ',\n3, 'T', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'P', 'u', ' ', 3, 'L', 'u', ' ', 4, 'I', 'r', 'i', ' ',\n3, 'Y', 'a', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'G', 'e', ' ', 3, 'Y', 'u', ' ', 3, 'W', 'u', ' ',\n4, 'G', 'u', 'i', ' ', 3, 'P', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'D', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'a', ' ', 7, 'A', 'k', 'u', 't', 's', 'u', ' ', 5, 'Y', 'a', 'm', 'a', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'N', 'i', 'e', ' ', 3, 'M', 'o', ' ', 3, 'J', 'i', ' ',\n4, 'J', 'i', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'B', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'T', 'o', 'u', ' ',\n4, 'Q', 'i', 'n', ' ', 4, 'F', 'e', 'n', ' ', 4, 'J', 'u', 'n', ' ', 5, 'K', 'e', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'F', 'e', 'n', ' ', 4, 'B', 'e', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ', 3, 'P', 'i', ' ', 4, 'Z', 'u', 'o', ' ',\n5, 'K', 'e', 'n', 'g', ' ', 3, 'B', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n5, 'K', 'u', 'a', 'i', ' ', 3, 'D', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 3, 'L', 'i', ' ',\n3, 'B', 'a', ' ', 3, 'W', 'u', ' ', 4, 'F', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'P', 'o', ' ', 4, 'P', 'a', 'n', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'a', ' ', 3, 'N', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n3, 'P', 'i', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'F', 'o', ' ', 3, 'A', 'o', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 3, 'M', 'u', ' ', 3, 'K', 'e', ' ', 4, 'G', 'o', 'u', ' ', 4, 'X', 'u', 'e', ' ', 3, 'B', 'a', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'C', 'h', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'F', 'u', ' ', 3, 'H', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'C', 'h', 'u', 'i', ' ', 3, 'L', 'a', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ',\n3, 'A', 'o', ' ', 4, 'T', 'a', 'y', ' ', 4, 'P', 'a', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n3, 'K', 'e', ' ', 3, 'L', 'u', ' ', 3, 'C', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'L', 'e', 'i', ' ', 4, 'G', 'a', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'H', 'o', 'u', ' ', 4, 'D', 'u', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'F', 'u', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'G', 'u', 'i', ' ', 4, 'C', 'h', 'a', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'F', 'a', ' ', 4, 'G', 'o', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'K', 'e', 'n', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'o', 'u', ' ', 2, 'E', ' ', 3, 'H', 'a', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'K', 'u', 'a', ' ', 4, 'T', 'a', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ',\n5, 'G', 'a', 'k', 'e', ' ', 4, 'N', 'a', 'o', ' ', 3, 'A', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n5, 'B', 'a', 'n', 'g', ' ', 4, 'P', 'e', 'i', ' ', 3, 'B', 'a', ' ', 3, 'Y', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'X', 'u', ' ', 5, 'C', 'h', 'u', 'i', ' ', 4, 'C', 'e', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'A', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'D', 'i', ' ',\n4, 'M', 'a', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'Z', 'h', 'e', ' ', 4, 'L', 'e', 'i', ' ', 4, 'L', 'i', 'e', ' ', 3, 'B', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'G', 'o', 'm', 'i', ' ',\n3, 'B', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'X', 'u', 'n', ' ', 4, 'G', 'u', 'o', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 3, 'Y', 'e', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 3, 'D', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'B', 'u', ' ', 3, 'Y', 'a', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n4, 'S', 'u', 'i', ' ', 3, 'P', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'J', 'u', ' ', 4, 'L', 'u', 'n', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'K', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 4, 'T', 'a', 'n', ' ',\n3, 'A', 'n', ' ', 4, 'C', 'a', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'D', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'P', 'e', 'i', ' ', 3, 'J', 'i', ' ',\n5, 'Z', 'h', 'u', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'S', 'a', 'o', ' ', 3, 'J', 'u', ' ', 3, 'N', 'i', ' ', 3, 'K', 'u', ' ',\n3, 'K', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'n', ' ', 3, 'N', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'i', ' ',\n4, 'J', 'i', 'n', ' ', 5, 'G', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 2, 'E', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'G', 'u', ' ',\n3, 'T', 'u', ' ', 5, 'L', 'e', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'A', 'n', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'N', 'a', 'o', ' ', 3, 'T', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'H', 'u', 'n', ' ', 3, 'B', 'i', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 4, 'D', 'i', 'e', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'H', 'o', 'u', ' ', 4, 'B', 'a', 'o', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'D', 'i', ' ', 4, 'M', 'a', 'o', ' ', 4, 'J', 'i', 'e', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n2, 'E', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n2, 'E', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'M', 'e', 'i', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n6, 'P', 'y', 'e', 'n', 'g', ' ', 7, 'T', 'o', 'r', 'i', 'd', 'e', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'e', 'n', 'g', ' ', 5, 'D', 'u', 'a', 'n', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'T', 'a', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ', 3, 'S', 'u', ' ', 3, 'S', 'u', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'M', 'i', ' ', 3, 'T', 'a', ' ', 5, 'W', 'e', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'T', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'Q', 'u', 'e', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'S', 'a', 'i', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 4, 'D', 'u', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'G', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'A', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'L', 'i', 'u', ' ', 4, 'A', 'm', 'a', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'C', 'u', ' ',\n3, 'L', 'u', ' ', 3, 'O', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 3, 'M', 'o', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'L', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'D', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'X', 'i', ' ', 4, 'G', 'u', 'o', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 3, 'D', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'M', 'u', ' ', 4, 'C', 'u', 'i', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'T', 'a', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 3, 'X', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n3, 'B', 'a', ' ', 3, 'P', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ',\n3, 'M', 'o', ' ', 4, 'D', 'u', 'n', ' ', 4, 'D', 'u', 'n', ' ', 4, 'D', 'u', 'n', ' ', 3, 'D', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'T', 'a', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'F', 'e', 'n', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 3, 'D', 'a', ' ', 3, 'Y', 'e', ' ', 4, 'S', 'h', 'o', ' ', 5, 'M', 'a', 'm', 'a', ' ',\n3, 'Y', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'K', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n3, 'P', 'i', ' ', 3, 'B', 'i', ' ', 5, 'D', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n3, 'B', 'o', ' ', 4, 'T', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'J', 'u', ' ', 5, 'H', 'u', 'a', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n5, 'R', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'H', 'e', ' ',\n3, 'A', 'i', ' ', 3, 'Y', 'a', ' ', 4, 'D', 'a', 'o', ' ', 4, 'H', 'a', 'o', ' ', 5, 'R', 'u', 'a', 'n', ' ', 5, 'M', 'a', 'm', 'a', ' ',\n4, 'L', 'e', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'H', 'u', 'a', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'R', 'u', 'i', ' ', 3, 'L', 'i', ' ', 4, 'L', 'i', 'n', ' ',\n5, 'R', 'a', 'n', 'g', ' ', 4, 'T', 'e', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 3, 'B', 'a', ' ',\n4, 'S', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n4, 'M', 'a', 'i', ' ', 3, 'K', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'H', 'u', ' ',\n4, 'K', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'H', 'u', ' ', 3, 'X', 'u', ' ', 4, 'K', 'u', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'G', 'u', ' ',\n4, 'C', 'h', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 4, 'C', 'a', 'y', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n4, 'S', 'u', 'i', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'X', 'i', 'a', ' ',\n6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'N', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ', 4, 'K', 'u', 'i', ' ', 3, 'X', 'i', ' ', 4, 'W', 'a', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'S', 'u', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Y', 'e', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 4, 'U', 'y', 's', ' ', 4, 'G', 'o', 'u', ' ', 4, 'G', 'o', 'u', ' ', 3, 'Q', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n5, 'M', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'H', 'u', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'D', 'a', ' ', 3, 'Z', 'e', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'i', ' ', 3, 'F', 'u', ' ', 5, 'G', 'u', 'a', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'B', 'e', 'n', ' ', 4, 'T', 'a', 'i', ' ', 4, 'T', 'o', 'u', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'K', 'u', 'a', ' ', 4, 'J', 'i', 'a', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'K', 'w', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'P', 'a', ' ', 3, 'E', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'D', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'P', 'a', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 4, 'N', 'a', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 4, 'F', 'e', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'K', 'a', 'i', ' ', 4, 'Z', 'h', 'a', ' ',\n4, 'B', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'B', 'e', 'n', ' ',\n3, 'X', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'X', 'u', 'n', ' ', 5, 'K', 'e', 'n', 'g', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 3, 'A', 'o', ' ', 4, 'S', 'h', 'e', ' ', 5, 'W', 'e', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 3, 'A', 'o', ' ',\n3, 'W', 'u', ' ', 3, 'A', 'o', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 4, 'Y', 'u', 'n', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'F', 'e', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'B', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'D', 'u', 'o', ' ', 3, 'N', 'u', ' ', 3, 'N', 'u', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'N', 'a', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'J', 'i', 'u', ' ', 4, 'N', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 4, 'H', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'S', 'h', 'u', 'o', ' ', 3, 'R', 'u', ' ', 4, 'F', 'e', 'i', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'M', 'a', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'R', 'e', 'n', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'W', 'e', 'n', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'P', 'a', ' ', 3, 'D', 'u', ' ', 3, 'J', 'i', ' ', 5, 'K', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'P', 'e', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'N', 'i', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'N', 'a', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'F', 'e', 'n', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'T', 'u', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'u', 'i', ' ', 3, 'D', 'u', ' ', 3, 'B', 'a', ' ',\n3, 'N', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'D', 'a', ' ', 4, 'N', 'a', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'T', 'o', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 2, 'E', ' ', 4, 'M', 'e', 'i', ' ',\n3, 'M', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'Q', 'i', 'e', ' ', 2, 'E', ' ',\n3, 'H', 'e', ' ', 3, 'X', 'u', ' ', 3, 'F', 'a', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'M', 'i', 'n', ' ', 4, 'B', 'a', 'n', ' ',\n3, 'M', 'u', ' ', 3, 'F', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 3, 'Z', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'R', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 3, 'G', 'u', ' ',\n3, 'S', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'J', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'P', 'i', 'n', ' ', 4, 'R', 'e', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'G', 'a', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'o', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'G', 'o', 'u', ' ', 3, 'M', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'N', 'i', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n4, 'J', 'u', 'n', ' ', 4, 'K', 'u', 'a', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'P', 'e', 'i', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 3, 'W', 'a', ' ', 4, 'L', 'o', 'u', ' ', 3, 'Y', 'a', ' ', 4, 'R', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'L', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'S', 'u', 'o', ' ', 3, 'W', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'K', 'e', ' ', 4, 'L', 'a', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ', 6, 'N', 'i', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n4, 'N', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'N', 'u', 'o', ' ', 4, 'P', 'e', 'i', ' ', 4, 'N', 'e', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'H', 'a', 'n', ' ', 3, 'D', 'i', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 2, 'E', ' ',\n4, 'P', 'i', 'n', ' ', 4, 'T', 'u', 'i', ' ', 4, 'H', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'W', 'u', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'S', 'i', ' ', 3, 'Y', 'u', ' ',\n3, 'W', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'Q', 'u', ' ', 5, 'S', 'h', 'u', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'A', 'i', ' ',\n2, 'E', ' ', 2, 'E', ' ', 4, 'L', 'o', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'P', 'o', 'u', ' ',\n3, 'J', 'u', ' ', 3, 'P', 'o', ' ', 4, 'C', 'a', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'H', 'u', 'i', ' ', 3, 'F', 'u', ' ', 2, 'E', ' ',\n3, 'W', 'o', ' ', 4, 'T', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n3, 'N', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'W', 'a', ' ', 4, 'L', 'a', 'i', ' ', 3, 'B', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'K', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Y', 'a', ' ', 3, 'J', 'u', ' ',\n3, 'L', 'i', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'H', 'w', 'a', ' ', 4, 'H', 'u', 'a', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'W', 'u', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'R', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ', 4, 'T', 'o', 'u', ' ', 3, 'X', 'u', ' ', 3, 'Y', 'u', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'T', 'i', ' ', 4, 'R', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n4, 'Q', 'i', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'W', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'F', 'u', ' ', 4, 'J', 'i', 'e', ' ', 5, 'D', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'A', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'M', 'e', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'T', 'i', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'T', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 4, 'R', 'a', 'n', ' ', 3, 'S', 'i', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'W', 'a', ' ', 4, 'J', 'i', 'u', ' ', 3, 'H', 'u', ' ', 3, 'A', 'o', ' ',\n4, 'B', 'o', 'u', ' ', 3, 'X', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ',\n3, 'P', 'i', ' ', 3, 'X', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'R', 'u', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'P', 'a', 'n', ' ', 3, 'A', 'o', ' ', 3, 'M', 'a', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'K', 'u', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'J', 'i', 'a', ' ', 4, 'S', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n3, 'S', 'u', ' ', 5, 'N', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'o', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'L', 'a', 'n', 'g', ' ',\n4, 'N', 'a', 'o', ' ', 4, 'B', 'a', 'o', ' ', 3, 'A', 'i', ' ', 3, 'P', 'i', ' ', 4, 'P', 'i', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 4, 'L', 'e', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ', 3, 'L', 'i', ' ', 3, 'D', 'i', ' ',\n4, 'G', 'u', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'C', 'e', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'N', 'e', 'n', ' ', 4, 'L', 'a', 'o', ' ', 3, 'M', 'o', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'H', 'u', ' ',\n3, 'H', 'u', ' ', 3, 'A', 'o', ' ', 4, 'N', 'e', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'a', ' ', 4, 'P', 'i', 'e', ' ',\n3, 'G', 'u', ' ', 3, 'W', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'M', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'X', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'H', 'u', 'a', ' ',\n3, 'X', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'R', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'M', 'e', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'F', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'S', 'u', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'n', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'a', 'n', ' ', 3, 'A', 'i', ' ', 6, 'N', 'i', 'a', 'n', 'g', ' ', 5, 'N', 'e', 'n', 'g', ' ',\n3, 'M', 'a', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'J', 'i', 'n', ' ', 3, 'C', 'i', ' ', 3, 'Y', 'u', ' ',\n4, 'P', 'i', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'N', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'C', 'a', 'n', ' ', 5, 'N', 'i', 'a', 'o', ' ', 3, 'W', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n5, 'K', 'a', 'k', 'a', ' ', 3, 'M', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'N', 'i', ' ', 3, 'D', 'u', ' ',\n4, 'L', 'i', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 6, 'N', 'i', 'a', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ',\n6, 'S', 'h', 'u', 'a', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'M', 'i', ' ', 3, 'L', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'L', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'K', 'o', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'Z', 'i', ' ', 4, 'C', 'u', 'n', ' ', 4, 'S', 'u', 'n', ' ',\n3, 'F', 'u', ' ', 4, 'B', 'e', 'i', ' ', 3, 'Z', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'X', 'i', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'S', 'i', ' ', 4, 'T', 'a', 'i', ' ', 4, 'B', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'G', 'u', ' ', 3, 'N', 'u', ' ',\n4, 'X', 'u', 'e', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'H', 'a', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ',\n4, 'M', 'i', 'e', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'a', ' ',\n3, 'Z', 'i', ' ', 3, 'N', 'i', ' ', 3, 'F', 'u', ' ', 3, 'Z', 'i', ' ', 3, 'L', 'i', ' ', 4, 'X', 'u', 'e', ' ',\n3, 'B', 'o', ' ', 3, 'R', 'u', ' ', 4, 'L', 'a', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'N', 'i', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'T', 'a', ' ', 4, 'G', 'u', 'i', ' ',\n5, 'Z', 'h', 'a', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'S', 'h', 'o', 'u', ' ', 3, 'A', 'n', ' ', 3, 'T', 'u', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 3, 'M', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'B', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'K', 'e', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'S', 'h', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'B', 'a', 'o', ' ', 4, 'H', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'M', 'i', ' ', 4, 'K', 'o', 'u', ' ', 5, 'K', 'u', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 3, 'S', 'u', ' ', 4, 'C', 'a', 'i', ' ',\n4, 'Z', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'M', 'i', ' ',\n4, 'K', 'o', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n5, 'N', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'B', 'a', 'o', ' ', 5, 'K', 'u', 'a', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'M', 'o', ' ',\n4, 'C', 'h', 'a', ' ', 3, 'J', 'u', ' ', 4, 'G', 'u', 'a', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'H', 'u', ' ', 3, 'W', 'u', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'X', 'i', 'e', ' ', 5, 'K', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'J', 'u', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Q', 'i', 'n', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 4, 'C', 'u', 'n', ' ', 4, 'D', 'u', 'i', ' ', 3, 'S', 'i', ' ', 4, 'X', 'u', 'n', ' ', 4, 'D', 'a', 'o', ' ',\n3, 'L', 'u', ' ', 4, 'D', 'u', 'i', ' ', 5, 'S', 'h', 'o', 'u', ' ', 3, 'P', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n3, 'F', 'u', ' ', 4, 'S', 'h', 'e', ' ', 3, 'K', 'e', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'Z', 'u', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'S', 'h', 'u', ' ', 4, 'D', 'u', 'i', ' ', 4, 'D', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'E', 'r', ' ', 3, 'E', 'r', ' ', 3, 'E', 'r', ' ',\n3, 'G', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ',\n3, 'M', 'o', ' ', 3, 'G', 'a', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 3, 'G', 'a', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'D', 'u', 'o', ' ', 4, 'K', 'u', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'u', ' ', 4, 'G', 'a', 'n', ' ', 3, 'G', 'u', ' ',\n4, 'G', 'a', 'n', ' ', 4, 'T', 'u', 'i', ' ', 4, 'G', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'K', 'a', 'o', ' ', 3, 'N', 'i', ' ', 4, 'J', 'i', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n3, 'J', 'u', ' ', 3, 'P', 'i', ' ', 5, 'C', 'e', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'B', 'i', ' ', 3, 'J', 'u', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 3, 'T', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'W', 'u', ' ',\n5, 'D', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 3, 'X', 'i', ' ', 3, 'N', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'M', 'a', 'n', ' ',\n2, 'E', ' ', 4, 'L', 'o', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'T', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'X', 'i', 'e', ' ', 3, 'T', 'u', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 5, 'C', 'e', 'n', 'g', ' ',\n3, 'L', 'u', ' ', 3, 'J', 'u', ' ', 4, 'X', 'i', 'e', ' ', 3, 'J', 'u', ' ', 4, 'J', 'u', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'S', 'h', 'u', ' ', 3, 'X', 'i', ' ', 4, 'C', 'h', 'e', ' ', 4, 'T', 'u', 'n', ' ', 3, 'N', 'i', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'L', 'i', ' ', 4, 'X', 'u', 'e', ' ', 5, 'N', 'a', 't', 'a', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'W', 'u', ' ', 4, 'H', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'C', 'h', 'u', ' ', 4, 'S', 'u', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'B', 'a', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'A', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 3, 'W', 'u', ' ', 4, 'J', 'i', 'e', ' ', 2, 'E', ' ',\n3, 'J', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'e', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'h', 'a', ' ', 4, 'J', 'i', 'e', ' ', 3, 'Q', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'A', 'o', ' ', 4, 'L', 'a', 'n', ' ', 4, 'D', 'a', 'o', ' ', 3, 'B', 'a', ' ', 4, 'Z', 'u', 'o', ' ',\n4, 'Z', 'u', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ', 3, 'K', 'e', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'X', 'u', 'e', ' ', 4, 'B', 'e', 'i', ' ', 3, 'L', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'F', 'u', ' ', 4, 'X', 'i', 'u', ' ', 4, 'J', 'i', 'a', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'T', 'u', 'o', ' ', 4, 'P', 'e', 'i', ' ',\n4, 'Y', 'o', 'u', ' ', 4, 'D', 'a', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'Q', 'u', ' ', 3, 'H', 'u', ' ',\n3, 'P', 'o', ' ', 4, 'M', 'i', 'n', ' ', 3, 'A', 'n', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n5, 'Y', 'u', 'r', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'C', 'e', 'm', ' ', 4, 'K', 'u', 'i', ' ', 4, 'X', 'i', 'u', ' ', 4, 'M', 'a', 'o', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'K', 'u', 'r', 'a', ' ', 3, 'H', 'e', ' ', 3, 'K', 'e', ' ',\n4, 'L', 'u', 'o', ' ', 2, 'E', ' ', 3, 'F', 'u', ' ', 4, 'X', 'u', 'n', ' ', 4, 'D', 'i', 'e', ' ', 3, 'L', 'u', ' ',\n3, 'A', 'n', ' ', 3, 'E', 'r', ' ', 4, 'G', 'a', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n3, 'M', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'A', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'H', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'M', 'i', ' ', 3, 'L', 'i', ' ', 3, 'J', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'o', 'u', ' ',\n5, 'S', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 2, 'E', ' ', 2, 'E', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'e', ' ',\n3, 'B', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'N', 'a', 'o', ' ',\n3, 'L', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'T', 'u', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'J', 'u', 'n', ' ', 4, 'H', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 4, 'L', 'a', 'o', ' ', 4, 'L', 'a', 'i', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'K', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'T', 'a', ' ',\n4, 'L', 'i', 'n', ' ', 4, 'H', 'u', 'a', ' ', 3, 'J', 'u', ' ', 4, 'L', 'a', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'M', 'i', 'n', ' ',\n4, 'K', 'u', 'n', ' ', 4, 'K', 'u', 'n', ' ', 3, 'Z', 'u', ' ', 3, 'G', 'u', ' ', 4, 'C', 'u', 'i', ' ', 3, 'Y', 'a', ' ',\n3, 'Y', 'a', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ', 4, 'L', 'u', 'n', ' ', 5, 'L', 'e', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'D', 'u', 'o', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'P', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'B', 'e', 'n', 'g', ' ', 3, 'Z', 'u', ' ', 4, 'J', 'u', 'e', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n3, 'G', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Z', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'D', 'u', 'n', ' ', 3, 'T', 'i', ' ', 3, 'Y', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 2, 'E', ' ', 4, 'Z', 'h', 'u', ' ',\n4, 'K', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'G', 'a', 'n', ' ', 3, 'J', 'i', ' ',\n3, 'J', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n3, 'W', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'a', ' ', 4, 'S', 'u', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n10, 'Y', 'a', 'm', 'a', 's', 'h', 'i', 'n', 'a', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 9, 'K', 'e', 'w', 'a', 's', 'h', 'i', 'i', ' ', 4, 'L', 'o', 'u', ' ', 3, 'T', 'u', ' ',\n4, 'D', 'u', 'i', ' ', 3, 'X', 'i', ' ', 5, 'W', 'e', 'n', 'g', ' ', 5, 'C', 'a', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 3, 'A', 'i', ' ', 4, 'L', 'i', 'u', ' ', 3, 'W', 'u', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n3, 'Z', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'C', 'u', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 4, 'N', 'i', 'e', ' ', 4, 'C', 'u', 'o', ' ', 3, 'J', 'i', ' ', 4, 'T', 'a', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'C', 'e', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'T', 'u', ' ', 4, 'L', 'o', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 3, 'A', 'o', ' ', 4, 'C', 'a', 'o', ' ', 3, 'Q', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'Z', 'u', 'i', ' ',\n4, 'Z', 'u', 'i', ' ', 4, 'D', 'a', 'o', ' ', 4, 'D', 'a', 'o', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'B', 'o', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'e', 'n', 'g', ' ', 3, 'B', 'o', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'L', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'J', 'i', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'D', 'u', 'o', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'J', 'u', 'e', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'X', 'u', 'e', ' ', 4, 'N', 'a', 'o', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'i', ' ', 2, 'E', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'K', 'e', ' ', 3, 'X', 'i', ' ', 3, 'D', 'i', ' ',\n3, 'A', 'o', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'N', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n3, 'Z', 'a', ' ', 3, 'Y', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'J', 'i', 'e', ' ', 3, 'L', 'i', ' ',\n4, 'S', 'u', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ',\n3, 'J', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'N', 'a', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 5, 'C', 'u', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'N', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'X', 'u', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'L', 'i', 'e', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Z', 'u', 'o', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'K', 'e', 'k', ' ', 3, 'W', 'u', ' ', 4, 'P', 'w', 'u', ' ',\n4, 'P', 'w', 'u', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'S', 'i', ' ', 3, 'B', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'P', 'h', 'a', 's', ' ', 4, 'X', 'u', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n3, 'F', 'u', ' ', 3, 'Z', 'a', ' ', 3, 'B', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'u', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 4, 'S', 'h', 'i', ' ', 4, 'F', 'e', 'n', ' ', 3, 'P', 'a', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'X', 'i', ' ', 3, 'H', 'u', ' ', 4, 'D', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 3, 'M', 'a', ' ', 4, 'P', 'e', 'i', ' ', 3, 'P', 'a', ' ', 4, 'T', 'i', 'e', ' ',\n3, 'F', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'B', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'D', 'i', ' ', 3, 'M', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'a', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 3, 'R', 'u', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'D', 'a', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'i', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Q', 'u', 'n', ' ', 3, 'X', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n4, 'D', 'a', 'i', ' ', 4, 'G', 'u', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'a', ' ',\n4, 'W', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 4, 'W', 'e', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'a', ' ', 3, 'Q', 'i', ' ',\n3, 'Z', 'e', ' ', 4, 'G', 'u', 'o', ' ', 4, 'M', 'a', 'o', ' ', 3, 'D', 'u', ' ', 4, 'H', 'o', 'u', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n3, 'X', 'u', ' ', 3, 'M', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'W', 'o', ' ', 3, 'F', 'u', ' ', 3, 'Y', 'i', ' ',\n5, 'B', 'a', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 7, 'T', 'a', 'z', 'u', 'n', 'a', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n4, 'D', 'a', 'o', ' ', 3, 'M', 'i', ' ', 4, 'J', 'i', 'a', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 3, 'M', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'o', ' ', 3, 'Z', 'e', ' ',\n3, 'M', 'u', ' ', 5, 'B', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'H', 'u', ' ', 4, 'F', 'a', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'H', 'e', 'i', ' ',\n3, 'M', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'M', 'i', 'e', ' ', 4, 'C', 'h', 'u', ' ', 4, 'J', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Y', 'o', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'P', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'D', 'u', 'n', ' ',\n7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 3, 'Y', 'a', ' ', 4, 'B', 'a', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'X', 'u', ' ',\n3, 'L', 'u', ' ', 3, 'W', 'u', ' ', 3, 'K', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'P', 'a', 'o', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 5, 'M', 'i', 'a', 'o', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'C', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'X', 'i', 'u', ' ', 3, 'D', 'u', ' ', 4, 'Z', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n3, 'T', 'u', ' ', 4, 'G', 'u', 'i', ' ', 3, 'K', 'u', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ',\n3, 'B', 'u', ' ', 5, 'D', 'i', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 4, 'B', 'e', 'i', ' ', 3, 'J', 'i', ' ',\n3, 'A', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'T', 'u', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n4, 'S', 'h', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'S', 'o', 'u', ' ',\n3, 'C', 'e', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 4, 'J', 'i', 'u', ' ', 3, 'H', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'S', 'h', 'a', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'S', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'P', 'o', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'A', 'o', ' ',\n4, 'K', 'u', 'o', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'D', 'a', 'i', ' ', 3, 'L', 'u', ' ',\n3, 'Y', 'i', ' ', 4, 'C', 'h', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'T', 'u', ' ', 3, 'S', 'i', ' ', 4, 'X', 'i', 'n', ' ',\n5, 'M', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'F', 'e', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'K', 'o', 'c', ' ',\n5, 'K', 'u', 'a', 'i', ' ', 3, 'B', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 4, 'L', 'i', 'n', ' ', 4, 'L', 'i', 'n', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 3, 'L', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n3, 'D', 'i', ' ', 3, 'P', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'N', 'a', 'i', ' ', 4, 'H', 'u', 'i', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'K', 'a', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'N', 'o', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'J', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'a', 'n', 'g', ' ',\n3, 'B', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'E', 'r', ' ', 4, 'S', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'E', 'r', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'H', 'u', ' ', 3, 'F', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'T', 'u', 'i', ' ', 4, 'C', 'h', 'i', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'B', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'D', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'T', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'D', 'i', ' ', 3, 'M', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'H', 'u', ' ',\n5, 'C', 'h', 'a', 'o', ' ', 3, 'N', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'M', 'i', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'R', 'u', 'o', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'D', 'u', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 4, 'S', 'h', 'e', ' ', 4, 'D', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'S', 'e', 'i', ' ', 3, 'F', 'a', ' ', 3, 'B', 'i', ' ', 4, 'K', 'o', 'u', ' ', 5, 'N', 'a', 'g', 'i', ' ',\n4, 'B', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ', 4, 'K', 'u', 'o', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n3, 'M', 'i', ' ', 4, 'K', 'u', 'o', ' ', 4, 'W', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'Y', 'i', ' ', 4, 'H', 'u', 'o', ' ', 4, 'H', 'u', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'C', 'a', 'i', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'B', 'i', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'J', 'i', ' ', 5, 'P', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'e', ' ',\n3, 'B', 'i', ' ', 4, 'C', 'h', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n3, 'C', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 3, 'X', 'i', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'H', 'e', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'i', ' ', 3, 'L', 'u', ' ', 4, 'H', 'o', 'u', ' ', 3, 'W', 'a', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'X', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'T', 'u', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n4, 'L', 'a', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'D', 'e', ' ', 4, 'P', 'a', 'i', ' ', 3, 'X', 'i', ' ', 3, 'Q', 'i', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'L', 'a', 'i', ' ', 3, 'Y', 'u', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 4, 'J', 'i', 'a', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'X', 'u', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'X', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'i', ' ', 3, 'D', 'e', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'B', 'i', 'e', ' ', 3, 'D', 'e', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'e', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 4, 'M', 'e', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ', 3, 'Q', 'u', ' ', 4, 'X', 'i', 'n', ' ', 4, 'S', 'h', 'u', ' ', 3, 'B', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'L', 'e', ' ', 4, 'R', 'e', 'n', ' ', 4, 'D', 'a', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ',\n3, 'J', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'R', 'e', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 3, 'T', 'e', ' ',\n3, 'T', 'e', ' ', 4, 'G', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'C', 'u', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'F', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'M', 'i', 'n', ' ', 4, 'M', 'i', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'J', 'i', ' ',\n3, 'W', 'u', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'e', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'W', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Q', 'i', ' ',\n4, 'C', 'u', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'T', 'a', 'i', ' ', 4, 'T', 'u', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'N', 'i', 'a', 'n', ' ',\n4, 'H', 'u', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'N', 'i', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'n', ' ',\n5, 'K', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 4, 'K', 'a', 'i', ' ', 4, 'F', 'e', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'O', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n3, 'Y', 'i', ' ', 4, 'B', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'M', 'i', 'n', ' ', 4, 'P', 'e', 'i', ' ', 4, 'Z', 'u', 'o', ' ',\n4, 'Z', 'e', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 4, 'B', 'a', 'n', ' ', 3, 'N', 'u', ' ', 4, 'N', 'a', 'o', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'P', 'a', ' ', 3, 'B', 'u', ' ', 4, 'T', 'i', 'e', ' ', 3, 'G', 'u', ' ', 3, 'H', 'u', ' ',\n3, 'J', 'u', ' ', 3, 'D', 'a', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'S', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'D', 'i', ' ',\n4, 'D', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'T', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'F', 'u', ' ', 3, 'J', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'N', 'i', ' ', 5, 'G', 'u', 'a', 'i', ' ', 3, 'F', 'u', ' ',\n3, 'X', 'i', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Q', 'i', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'P', 'i', ' ', 3, 'X', 'i', ' ',\n3, 'X', 'i', ' ', 4, 'T', 'a', 'n', ' ', 8, 'K', 'o', 'r', 'a', 'e', 'r', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'D', 'u', 'i', ' ', 3, 'K', 'i', ' ',\n3, 'Y', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'L', 'a', 'o', ' ', 5, 'H', 'e', 'n', 'g', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'M', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'T', 'i', 'a', 'o', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'D', 'i', 'e', ' ', 4, 'H', 'a', 'o', ' ', 5, 'K', 'o', 'n', 'g', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'u', ' ', 2, 'S', ' ',\n4, 'K', 'u', 'a', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'Y', 'i', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'i', ' ', 4, 'L', 'i', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'Z', 'i', ' ', 3, 'X', 'u', ' ', 4, 'C', 'h', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'N', 'u', ' ', 4, 'H', 'e', 'n', ' ',\n3, 'E', 'n', ' ', 3, 'K', 'e', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 4, 'Q', 'i', 'a', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'K', 'e', 'n', ' ', 3, 'D', 'e', ' ',\n4, 'H', 'u', 'i', ' ', 2, 'E', ' ', 5, 'K', 'y', 'u', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'K', 'a', 'i', ' ',\n3, 'C', 'e', ' ', 4, 'N', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 3, 'P', 'i', ' ', 4, 'K', 'u', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'Y', 'u', ' ',\n3, 'Y', 'u', ' ', 4, 'J', 'i', 'e', ' ', 3, 'X', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'L', 'i', 'n', ' ', 3, 'T', 'i', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'T', 'i', ' ', 3, 'B', 'u', ' ', 3, 'Y', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'X', 'i', ' ', 4, 'B', 'e', 'i', ' ', 4, 'M', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'H', 'e', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 3, 'W', 'u', ' ',\n3, 'W', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'L', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'L', 'i', ' ', 4, 'N', 'i', 'n', ' ', 4, 'N', 'a', 'o', ' ', 2, 'E', ' ',\n4, 'Q', 'u', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'M', 'i', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'B', 'e', 'i', ' ', 4, 'D', 'u', 'o', ' ', 4, 'C', 'u', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'M', 'e', 'n', ' ',\n3, 'L', 'i', ' ', 3, 'J', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 5, 'K', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'L', 'u', 'n', ' ', 3, 'X', 'i', ' ', 4, 'K', 'a', 'n', ' ',\n4, 'K', 'u', 'n', ' ', 3, 'N', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'D', 'u', 'n', ' ', 4, 'G', 'u', 'o', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 3, 'J', 'i', ' ',\n4, 'L', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'H', 'u', 'o', ' ', 3, 'H', 'e', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ',\n3, 'T', 'i', ' ', 3, 'T', 'i', ' ', 4, 'N', 'i', 'e', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'B', 'u', ' ',\n4, 'H', 'u', 'n', ' ', 3, 'X', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'u', 'i', ' ',\n2, 'E', ' ', 4, 'R', 'u', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n3, 'J', 'u', ' ', 4, 'C', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'D', 'e', ' ', 4, 'B', 'e', 'i', ' ', 4, 'Q', 'i', 'e', ' ',\n4, 'C', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 4, 'N', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'D', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n3, 'R', 'e', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'C', 'e', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n3, 'T', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'B', 'e', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'G', 'e', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'B', 'i', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 2, 'E', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n4, 'M', 'o', 'u', ' ', 3, 'K', 'e', ' ', 3, 'K', 'e', ' ', 3, 'Y', 'u', ' ', 3, 'A', 'i', ' ', 4, 'Q', 'i', 'e', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 4, 'G', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'S', 'a', 'i', ' ',\n5, 'L', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'Y', 'u', 'n', ' ', 3, 'S', 'u', ' ', 3, 'S', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 3, 'G', 'u', ' ', 3, 'J', 'u', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'N', 'i', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'K', 'a', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'C', 'a', 'o', ' ', 4, 'S', 'u', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 3, 'B', 'o', ' ', 4, 'K', 'a', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'H', 'u', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'S', 'a', 'o', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'C', 'i', ' ', 3, 'X', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'M', 'o', ' ',\n3, 'M', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'C', 'h', 'i', ' ', 4, 'C', 'a', 'n', ' ', 4, 'C', 'a', 'n', ' ', 4, 'C', 'a', 'n', ' ',\n4, 'C', 'u', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'T', 'e', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'A', 'o', ' ',\n7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'K', 'a', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'O', 'u', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'L', 'u', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'L', 'o', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'Y', 'u', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'u', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ',\n4, 'B', 'i', 'e', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'D', 'u', 'i', ' ', 4, 'D', 'u', 'i', ' ', 3, 'S', 'u', ' ', 4, 'J', 'u', 'e', ' ', 3, 'C', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 4, 'L', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'W', 'u', ' ',\n4, 'C', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'C', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n3, 'P', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'h', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'N', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'T', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'W', 'a', 'i', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'C', 'a', 'o', ' ',\n4, 'K', 'e', 'n', ' ', 4, 'X', 'i', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'A', 'o', ' ', 4, 'M', 'a', 'o', ' ', 3, 'Y', 'i', ' ',\n4, 'L', 'i', 'n', ' ', 3, 'S', 'e', ' ', 4, 'J', 'u', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'M', 'e', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n3, 'A', 'i', ' ', 4, 'L', 'i', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'u', 'a', ' ', 4, 'X', 'i', 'a', ' ', 4, 'C', 'h', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'D', 'a', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'A', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n4, 'D', 'u', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'M', 'o', ' ', 4, 'L', 'a', 'n', ' ', 4, 'M', 'e', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'N', 'u', 'o', ' ', 4, 'N', 'u', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'B', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'F', 'u', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'M', 'i', 'e', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 5, 'R', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'J', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'S', 'h', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 3, 'M', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ', 3, 'G', 'e', ' ', 4, 'Y', 'u', 'e', ' ',\n3, 'W', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'W', 'o', ' ', 4, 'J', 'i', 'e', ' ', 3, 'G', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'H', 'u', 'o', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'D', 'i', 'e', ' ', 4, 'Z', 'e', 'i', ' ', 4, 'J', 'i', 'a', ' ', 3, 'J', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'K', 'a', 'n', ' ',\n3, 'J', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'G', 'a', 'i', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ',\n3, 'G', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 3, 'Y', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ',\n4, 'D', 'a', 'i', ' ', 3, 'Q', 'u', ' ', 3, 'H', 'u', ' ', 3, 'H', 'u', ' ', 3, 'H', 'u', ' ', 2, 'E', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'L', 'i', ' ', 4, 'M', 'a', 'o', ' ', 3, 'H', 'u', ' ', 3, 'L', 'i', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'S', 'u', 'o', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n3, 'Y', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'H', 'u', ' ', 4, 'F', 'e', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n2, 'T', ' ', 4, 'C', 'a', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'L', 'e', ' ', 3, 'B', 'u', ' ',\n3, 'B', 'a', ' ', 3, 'D', 'a', ' ', 5, 'R', 'e', 'n', 'g', ' ', 3, 'F', 'u', ' ', 7, 'H', 'a', 'm', 'e', 'r', 'u', ' ', 4, 'Z', 'a', 'i', ' ',\n4, 'T', 'u', 'o', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'K', 'u', ' ',\n4, 'H', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'C', 'h', 'a', ' ', 3, 'Y', 'i', ' ', 3, 'G', 'u', ' ', 4, 'K', 'o', 'u', ' ',\n3, 'W', 'u', ' ', 4, 'T', 'u', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'K', 'u', 'o', ' ',\n4, 'M', 'e', 'n', ' ', 4, 'S', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'N', 'i', 'u', ' ', 4, 'B', 'a', 'n', ' ', 4, 'C', 'h', 'e', ' ',\n4, 'R', 'a', 'o', ' ', 3, 'X', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'Y', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'A', 'o', ' ', 3, 'X', 'i', ' ', 3, 'P', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Z', 'i', ' ',\n2, 'E', ' ', 4, 'D', 'u', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'J', 'u', ' ', 4, 'W', 'e', 'n', ' ', 3, 'H', 'u', ' ',\n4, 'Y', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ', 3, 'B', 'a', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'W', 'a', 'n', ' ', 3, 'N', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'Z', 'h', 'u', 'a', ' ',\n4, 'P', 'o', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'D', 'o', 'u', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'P', 'o', 'u', ' ',\n3, 'F', 'u', ' ', 4, 'P', 'a', 'o', ' ', 3, 'B', 'a', ' ', 3, 'A', 'o', ' ', 3, 'Z', 'e', ' ', 5, 'T', 'u', 'a', 'n', ' ',\n4, 'K', 'o', 'u', ' ', 4, 'L', 'u', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 4, 'B', 'a', 'o', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 3, 'P', 'u', ' ', 3, 'P', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ', 3, 'H', 'e', ' ',\n3, 'N', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'D', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'P', 'i', ' ', 3, 'Z', 'a', ' ',\n3, 'M', 'o', ' ', 3, 'M', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'Y', 'a', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'Q', 'u', ' ',\n4, 'M', 'i', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'J', 'i', 'a', ' ', 3, 'F', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'i', ' ', 3, 'M', 'u', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'L', 'a', ' ', 3, 'F', 'u', ' ',\n4, 'P', 'a', 'o', ' ', 4, 'B', 'a', 'n', ' ', 4, 'P', 'a', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'N', 'a', ' ', 5, 'G', 'u', 'a', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 4, 'T', 'u', 'o', ' ', 3, 'B', 'a', ' ', 4, 'T', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'A', 'o', ' ', 3, 'J', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'P', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'B', 'a', 'i', ' ',\n4, 'B', 'a', 'i', ' ', 3, 'D', 'i', ' ', 3, 'N', 'i', ' ', 3, 'J', 'u', ' ', 4, 'K', 'u', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 3, 'B', 'o', ' ', 3, 'Z', 'e', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'H', 'e', 'n', ' ', 4, 'G', 'u', 'a', ' ', 4, 'S', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n4, 'N', 'i', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 6, 'S', 'h', 'u', 'a', 'n', ' ', 4, 'C', 'u', 'n', ' ',\n4, 'Z', 'a', 'n', ' ', 4, 'K', 'a', 'o', ' ', 4, 'C', 'h', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'C', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'P', 'i', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'N', 'a', ' ', 3, 'B', 'o', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'K', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Q', 'i', 'e', ' ', 3, 'A', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'G', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n3, 'K', 'u', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'R', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'L', 'u', ' ', 4, 'D', 'i', 'e', ' ', 3, 'W', 'a', ' ', 4, 'J', 'u', 'e', ' ', 8, 'M', 'u', 's', 'h', 'i', 'r', 'u', ' ', 3, 'J', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 5, 'Z', 'h', 'u', 'a', ' ', 3, 'T', 'a', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'N', 'a', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'X', 'u', 'n', ' ', 3, 'K', 'u', ' ', 3, 'A', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'N', 'u', 'o', ' ', 4, 'C', 'u', 'o', ' ',\n3, 'B', 'o', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'T', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ',\n4, 'S', 'u', 'o', ' ', 5, 'K', 'e', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 4, 'W', 'a', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'C', 'h', 'a', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'W', 'u', ' ', 4, 'J', 'u', 'n', ' ',\n4, 'J', 'i', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'T', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n4, 'P', 'o', 'u', ' ', 3, 'L', 'e', ' ', 3, 'B', 'a', ' ', 4, 'H', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'N', 'i', 'e', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 5, 'S', 'o', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 4, 'J', 'u', 'e', ' ', 3, 'B', 'u', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 3, 'B', 'u', ' ', 4, 'Z', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 3, 'L', 'u', ' ',\n4, 'S', 'o', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'L', 'a', 'o', ' ', 4, 'S', 'u', 'n', ' ', 5, 'B', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'D', 'a', 'o', ' ', 4, 'W', 'a', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ',\n4, 'L', 'i', 'e', ' ', 4, 'M', 'i', 'n', ' ', 4, 'M', 'e', 'n', ' ', 3, 'F', 'u', ' ', 4, 'B', 'a', 'i', ' ', 3, 'J', 'u', ' ',\n4, 'D', 'a', 'o', ' ', 3, 'W', 'o', ' ', 3, 'A', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'T', 'u', ' ', 4, 'B', 'e', 'n', ' ', 3, 'N', 'a', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 3, 'Z', 'u', ' ', 3, 'W', 'o', ' ', 3, 'X', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 4, 'L', 'u', 'n', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n4, 'D', 'u', 'o', ' ', 5, 'S', 'h', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'P', 'o', 'u', ' ', 3, 'D', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ',\n4, 'G', 'u', 'n', ' ', 3, 'J', 'i', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Q', 'i', 'a', ' ', 3, 'Q', 'i', ' ', 4, 'P', 'a', 'i', ' ',\n4, 'S', 'h', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'a', ' ', 4, 'J', 'u', 'e', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 3, 'Y', 'i', ' ', 4, 'H', 'u', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'L', 'u', 'e', ' ', 4, 'C', 'a', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'C', 'h', 'e', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 3, 'T', 'i', ' ', 5, 'K', 'o', 'n', 'g', ' ', 4, 'T', 'u', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'C', 'u', 'o', ' ',\n4, 'Z', 'o', 'u', ' ', 3, 'J', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'K', 'e', 'n', ' ', 4, 'B', 'a', 'i', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 4, 'J', 'i', 'e', ' ', 3, 'L', 'u', ' ', 4, 'G', 'u', 'o', ' ', 5, 'H', 'a', 'b', 'a', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'J', 'i', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'N', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ',\n3, 'P', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'S', 'a', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ',\n3, 'T', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'C', 'h', 'a', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n3, 'Y', 'i', ' ', 5, 'S', 'h', 'u', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'A', 'n', ' ', 3, 'X', 'u', ' ', 3, 'Y', 'a', ' ', 3, 'W', 'o', ' ',\n3, 'K', 'e', ' ', 6, 'C', 'h', 'u', 'a', 'i', ' ', 3, 'J', 'i', ' ', 3, 'T', 'i', ' ', 3, 'L', 'a', ' ', 3, 'L', 'a', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ', 4, 'J', 'i', 'u', ' ', 4, 'J', 'i', 'u', ' ', 3, 'T', 'u', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'H', 'u', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ', 4, 'S', 'h', 'e', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 4, 'C', 'h', 'a', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'B', 'e', 'i', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'L', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'G', 'e', ' ',\n4, 'L', 'o', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ', 4, 'Q', 'i', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ',\n4, 'S', 'u', 'n', ' ', 3, 'B', 'o', ' ', 4, 'C', 'h', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'C', 'u', 'o', ' ',\n4, 'S', 'a', 'o', ' ', 3, 'K', 'e', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'D', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'N', 'u', ' ',\n4, 'X', 'i', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'G', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'S', 'h', 'u', 'o', ' ', 5, 'S', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 4, 'M', 'i', 'e', ' ', 2, 'E', ' ', 5, 'C', 'h', 'u', 'i', ' ',\n4, 'N', 'u', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'J', 'i', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ',\n4, 'B', 'a', 'n', ' ', 3, 'D', 'a', ' ', 3, 'L', 'i', ' ', 4, 'T', 'a', 'o', ' ', 3, 'H', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'W', 'a', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 2, 'E', ' ', 3, 'X', 'i', ' ', 4, 'N', 'u', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ',\n4, 'Z', 'h', 'a', ' ', 3, 'G', 'e', ' ', 3, 'W', 'u', ' ', 3, 'E', 'n', ' ', 4, 'S', 'h', 'e', ' ', 5, 'K', 'a', 'n', 'g', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'S', 'h', 'u', ' ', 4, 'B', 'a', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'B', 'i', 'n', ' ', 4, 'S', 'o', 'u', ' ',\n4, 'T', 'a', 'n', ' ', 3, 'S', 'a', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ',\n7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 3, 'D', 'i', ' ',\n3, 'Q', 'i', ' ', 4, 'S', 'o', 'u', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n5, 'G', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'L', 'u', 'o', ' ', 4, 'L', 'o', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ',\n3, 'H', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 4, 'C', 'u', 'i', ' ',\n4, 'N', 'a', 'i', ' ', 3, 'M', 'o', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'A', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'M', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'K', 'o', 'u', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'S', 'u', 'o', ' ', 5, 'T', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'M', 'o', ' ', 3, 'M', 'o', ' ',\n4, 'Z', 'h', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'o', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'G', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'L', 'u', 'e', ' ', 3, 'J', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'P', 'i', 'e', ' ', 4, 'P', 'i', 'e', ' ', 4, 'L', 'a', 'o', ' ', 4, 'D', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'u', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n3, 'S', 'a', ' ', 4, 'N', 'a', 'o', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'S', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'D', 'a', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'C', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'C', 'h', 'e', ' ', 3, 'B', 'o', ' ', 4, 'C', 'h', 'e', ' ', 4, 'J', 'u', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'B', 'e', 'n', ' ', 3, 'F', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'C', 'u', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ', 3, 'P', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'D', 'u', 'n', ' ', 5, 'N', 'i', 'a', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 3, 'L', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ',\n4, 'K', 'u', 'o', ' ', 3, 'L', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Z', 'e', ' ', 3, 'P', 'u', ' ',\n5, 'C', 'h', 'u', 'o', ' ', 3, 'J', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 4, 'C', 'a', 'o', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'D', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 3, 'G', 'e', ' ', 3, 'P', 'i', ' ', 3, 'B', 'o', ' ', 3, 'A', 'o', ' ', 3, 'J', 'u', ' ',\n3, 'Y', 'e', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'S', 'o', 'u', ' ', 3, 'M', 'i', ' ', 3, 'J', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'D', 'a', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 3, 'C', 'a', ' ', 3, 'J', 'u', ' ',\n3, 'Y', 'e', ' ', 3, 'R', 'u', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'N', 'i', ' ', 3, 'H', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'B', 'i', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 3, 'G', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'K', 'u', 'o', ' ', 3, 'M', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'L', 'i', 'e', ' ', 4, 'T', 'a', 'n', ' ',\n4, 'B', 'a', 'i', ' ', 4, 'S', 'o', 'u', ' ', 3, 'L', 'u', ' ', 4, 'L', 'u', 'e', ' ', 4, 'R', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'P', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 3, 'S', 'a', ' ', 4, 'S', 'h', 'u', ' ', 4, 'Z', 'a', 'n', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'L', 'i', ' ', 3, 'L', 'a', ' ',\n4, 'H', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n4, 'Z', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ',\n5, 'R', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'e', ' ', 4, 'L', 'u', 'o', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'M', 'i', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ',\n5, 'Z', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'W', 'a', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'L', 'a', 'n', ' ', 3, 'L', 'i', ' ', 5, 'N', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'G', 'u', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'X', 'i', 'n', ' ', 3, 'P', 'u', ' ', 4, 'S', 'u', 'i', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'G', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ',\n4, 'B', 'a', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'B', 'o', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'K', 'o', 'u', ' ',\n4, 'M', 'i', 'n', ' ', 3, 'W', 'u', ' ', 3, 'G', 'u', ' ', 3, 'H', 'e', ' ', 3, 'C', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n3, 'M', 'i', ' ', 4, 'C', 'h', 'u', ' ', 3, 'G', 'e', ' ', 3, 'D', 'i', ' ', 3, 'X', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'M', 'i', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'J', 'i', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Y', 'u', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'A', 'o', ' ', 4, 'B', 'a', 'i', ' ', 3, 'X', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'o', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 3, 'B', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ',\n3, 'Y', 'i', ' ', 4, 'G', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 3, 'K', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'D', 'u', 'n', ' ',\n3, 'Q', 'i', ' ', 4, 'D', 'o', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 4, 'M', 'i', 'n', ' ', 4, 'S', 'h', 'u', ' ', 3, 'A', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n3, 'A', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'D', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'F', 'u', ' ', 4, 'S', 'h', 'u', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 3, 'Q', 'u', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'S', 'e', 'n', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 3, 'L', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'W', 'e', 'n', ' ', 4, 'X', 'u', 'e', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'Z', 'h', 'a', 'i', ' ', 4, 'B', 'i', 'n', ' ', 4, 'J', 'u', 'e', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'B', 'a', 'n', ' ',\n4, 'B', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'D', 'o', 'u', ' ',\n6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 3, 'H', 'u', ' ', 4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'a', ' ',\n3, 'Y', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'W', 'o', ' ', 4, 'T', 'o', 'u', ' ', 4, 'C', 'h', 'u', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'F', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n3, 'Q', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'S', 'i', ' ',\n4, 'X', 'i', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n4, 'C', 'h', 'u', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 5, 'H', 'a', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'P', 'e', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'M', 'y', 'e', ' ', 5, 'P', 'a', 'n', 'g', ' ',\n3, 'Q', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'L', 'u', ' ', 4, 'P', 'e', 'i', ' ', 3, 'P', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'F', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'N', 'i', ' ', 3, 'Z', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'L', 'i', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'E', 's', ' ', 3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'F', 'a', 'n', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 4, 'F', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'Y', 'u', ' ',\n3, 'W', 'u', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 4, 'H', 'u', 'o', ' ', 3, 'R', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'X', 'u', 'n', ' ', 3, 'X', 'u', ' ', 3, 'X', 'u', ' ', 3, 'X', 'u', ' ', 4, 'G', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'T', 'a', 'i', ' ', 3, 'D', 'i', ' ', 3, 'X', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'M', 'i', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'T', 'u', 'n', ' ',\n5, 'C', 'h', 'u', 'n', ' ', 3, 'W', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'B', 'e', 'i', ' ', 4, 'A', 'n', 'g', ' ', 3, 'Z', 'e', ' ',\n4, 'B', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'K', 'u', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'H', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'H', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ',\n4, 'F', 'e', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'H', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'X', 'i', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'J', 'u', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'P', 'e', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'H', 'a', 'o', ' ', 4, 'M', 'e', 'i', ' ',\n4, 'Z', 'u', 'o', ' ', 3, 'M', 'o', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'H', 'u', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'F', 'e', 'i', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'M', 'a', 'o', ' ', 3, 'N', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'A', 'i', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 4, 'A', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 3, 'X', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'a', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'S', 'h', 'a', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'Y', 'e', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'W', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'K', 'u', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n3, 'X', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'B', 'u', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'Z', 'h', 'e', ' ',\n3, 'W', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'a', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'W', 'a', 'n', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'P', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'X', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'X', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'A', 'n', ' ',\n4, 'W', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'Z', 'a', 'n', ' ', 3, 'H', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'i', 'a', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'F', 'u', ' ', 4, 'M', 'i', 'n', ' ', 4, 'K', 'u', 'i', ' ', 3, 'H', 'e', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ',\n4, 'N', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'N', 'u', 'a', 'n', ' ', 3, 'A', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'S', 'u', 'o', ' ', 4, 'J', 'i', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'K', 'a', 'i', ' ',\n4, 'G', 'a', 'o', ' ', 5, 'W', 'e', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'H', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 3, 'A', 'i', ' ', 3, 'J', 'i', ' ', 4, 'G', 'u', 'i', ' ', 4, 'M', 'e', 'n', ' ', 4, 'Z', 'a', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'H', 'a', 'o', ' ', 3, 'M', 'u', ' ', 3, 'M', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'B', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'P', 'i', 'e', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'T', 'u', 'n', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ',\n3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'L', 'i', ' ', 4, 'T', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'H', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'S', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'B', 'a', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'a', 'n', ' ',\n3, 'A', 'i', ' ', 3, 'Y', 'e', ' ', 3, 'R', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 3, 'P', 'u', ' ', 3, 'L', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'N', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'C', 'h', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'Q', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ',\n3, 'Y', 'e', ' ', 3, 'H', 'u', ' ', 3, 'H', 'e', ' ', 4, 'S', 'h', 'u', ' ', 4, 'C', 'a', 'o', ' ', 4, 'C', 'a', 'o', ' ',\n7, 'N', 'o', 'b', 'o', 'r', 'u', ' ', 4, 'M', 'a', 'n', ' ', 5, 'C', 'e', 'n', 'g', ' ', 5, 'C', 'e', 'n', 'g', ' ', 3, 'T', 'i', ' ', 4, 'Z', 'u', 'i', ' ',\n4, 'C', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Q', 'i', 'e', ' ', 4, 'F', 'e', 'n', ' ',\n3, 'P', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'R', 'u', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ',\n3, 'F', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 3, 'Q', 'u', ' ', 3, 'N', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n5, 'S', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 3, 'M', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'M', 'o', ' ', 4, 'B', 'e', 'n', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'R', 'e', 'n', ' ', 3, 'B', 'a', ' ',\n3, 'P', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'a', 'o', ' ', 3, 'L', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'J', 'i', 'u', ' ', 3, 'B', 'i', ' ', 4, 'X', 'i', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'C', 'i', ' ',\n4, 'S', 'h', 'a', ' ', 6, 'E', 'b', 'u', 'r', 'i', ' ', 3, 'Z', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'G', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'C', 'h', 'a', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'F', 'a', 'n', ' ',\n3, 'W', 'u', ' ', 3, 'Z', 'i', ' ', 3, 'L', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'C', 'a', 'i', ' ', 4, 'C', 'u', 'n', ' ',\n4, 'R', 'e', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ', 3, 'D', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'G', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'D', 'u', ' ', 3, 'Y', 'i', ' ',\n3, 'Q', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'M', 'o', 'k', 'u', ' ', 5, 'S', 'o', 'm', 'a', ' ',\n6, 'T', 'o', 'c', 'h', 'i', ' ', 4, 'L', 'a', 'i', ' ', 5, 'S', 'u', 'g', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'M', 'a', ' ',\n5, 'M', 'i', 'a', 'o', ' ', 3, 'S', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'H', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 4, 'B', 'e', 'i', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ',\n4, 'Q', 'u', 'n', ' ', 3, 'P', 'a', ' ', 4, 'S', 'h', 'u', ' ', 4, 'H', 'u', 'a', ' ', 4, 'X', 'i', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 5, 'S', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 4, 'J', 'i', 'n', ' ', 4, 'G', 'o', 'u', ' ', 3, 'J', 'i', ' ', 4, 'M', 'a', 'o', ' ', 3, 'P', 'i', ' ',\n3, 'B', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'A', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'N', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'H', 'u', ' ', 3, 'Y', 'a', ' ', 4, 'D', 'o', 'u', ' ',\n4, 'X', 'u', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'L', 'i', 'n', ' ', 4, 'R', 'u', 'i', ' ', 2, 'E', ' ',\n4, 'M', 'e', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'G', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'W', 'a', 'k', 'u', ' ', 4, 'D', 'o', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'L', 'i', ' ', 5, 'H', 'a', 'z', 'e', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 6, 'M', 'a', 't', 's', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'N', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'K', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'G', 'u', 'a', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 4, 'J', 'i', 'a', ' ', 4, 'G', 'o', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'M', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'N', 'i', 'e', ' ', 3, 'B', 'i', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n3, 'N', 'i', ' ', 3, 'L', 'a', ' ', 3, 'H', 'e', ' ', 4, 'P', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n4, 'D', 'a', 'i', ' ', 3, 'C', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'B', 'o', ' ', 4, 'M', 'o', 'u', ' ',\n4, 'G', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'R', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ', 4, 'M', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'X', 'i', 'a', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'N', 'a', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'D', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'C', 'h', 'a', ' ', 4, 'D', 'a', 'n', ' ', 3, 'G', 'u', ' ', 3, 'P', 'u', ' ',\n4, 'J', 'i', 'u', ' ', 3, 'A', 'o', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'o', ' ', 4, 'D', 'u', 'o', ' ',\n3, 'K', 'e', ' ', 4, 'N', 'a', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'B', 'i', ' ', 4, 'L', 'i', 'u', ' ', 5, 'C', 'h', 'a', 'i', ' ',\n4, 'Z', 'h', 'a', ' ', 3, 'S', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'P', 'e', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'G', 'u', 'a', 'i', ' ',\n4, 'C', 'h', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'i', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'H', 'o', 'y', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 6, 'S', 'a', 'y', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 4, 'L', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'X', 'u', 'n', ' ', 6, 'S', 'h', 'u', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 3, 'L', 'i', ' ', 3, 'S', 'u', ' ', 4, 'G', 'u', 'a', ' ', 4, 'K', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n4, 'R', 'e', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'R', 'e', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'X', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'Z', 'u', 'i', ' ', 3, 'E', 'r', ' ', 3, 'E', 'r', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'F', 'a', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n3, 'H', 'e', ' ', 4, 'G', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'G', 'e', ' ', 4, 'Z', 'a', 'i', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'J', 'i', 'e', ' ', 5, 'H', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 4, 'T', 'a', 'o', ' ',\n6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'R', 'u', ' ', 3, 'A', 'n', ' ', 3, 'A', 'n', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'K', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'u', ' ',\n4, 'X', 'u', 'e', ' ', 4, 'D', 'u', 'o', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'Z', 'a', 'n', ' ', 6, 'K', 'a', 's', 'e', 'i', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'M', 'a', 's', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 4, 'N', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n5, 'D', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'a', ' ', 5, 'K', 'u', 'a', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 4, 'S', 'u', 'o', ' ', 4, 'S', 'h', 'a', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'B', 'e', 'i', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'B', 'o', ' ', 4, 'B', 'e', 'n', ' ', 3, 'F', 'u', ' ',\n4, 'R', 'u', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 3, 'X', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'W', 'e', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'G', 'a', 'n', ' ', 3, 'C', 'u', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'T', 'u', ' ',\n4, 'Z', 'a', 'o', ' ', 3, 'A', 'o', ' ', 3, 'G', 'u', ' ', 3, 'B', 'i', ' ', 3, 'D', 'i', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'Z', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'B', 'e', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'L', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'C', 'e', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 4, 'D', 'o', 'u', ' ',\n4, 'C', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 3, 'J', 'u', ' ', 3, 'T', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'K', 'u', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'S', 'h', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 7, 'F', 'u', 'm', 'o', 't', 'o', ' ', 8, 'S', 'h', 'i', 'k', 'i', 'm', 'i', ' ', 4, 'T', 'a', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'L', 'a', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'a', 'i', ' ', 4, 'G', 'u', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n3, 'T', 'e', ' ', 4, 'F', 'e', 'i', ' ', 4, 'P', 'a', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'P', 'o', 'u', ' ', 4, 'H', 'u', 'n', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'L', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'G', 'u', ' ', 4, 'H', 'u', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n5, 'G', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ', 3, 'X', 'i', ' ', 4, 'F', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'S', 'e', 'n', ' ', 4, 'R', 'e', 'n', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'L', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 3, 'F', 'u', ' ', 3, 'K', 'e', ' ', 4, 'L', 'a', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 4, 'Z', 'o', 'u', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 4, 'F', 'e', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n4, 'N', 'i', 'e', ' ', 4, 'W', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 3, 'L', 'u', ' ', 4, 'H', 'a', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'Y', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'u', ' ', 3, 'J', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'u', 'o', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'Y', 'a', ' ', 3, 'J', 'u', ' ',\n4, 'B', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Z', 'i', ' ', 4, 'B', 'i', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n5, 'D', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 7, 'K', 'u', 'n', 'u', 'g', 'i', ' ', 7, 'M', 'o', 'm', 'i', 'j', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'G', 'u', 'i', ' ', 3, 'X', 'i', ' ', 3, 'D', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 7, 'K', 'u', 'n', 'u', 'g', 'i', ' ', 5, 'S', 'o', 'k', 'o', ' ',\n6, 'S', 'h', 'i', 'd', 'e', ' ', 4, 'L', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'K', 'e', 'n', ' ', 6, 'M', 'y', 'e', 'n', 'g', ' ', 5, 'T', 'a', 'f', 'u', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ', 4, 'S', 'e', 'n', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Y', 'e', ' ',\n4, 'F', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'H', 'e', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'W', 'o', ' ', 5, 'P', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'H', 'u', 'o', ' ', 3, 'X', 'u', ' ',\n4, 'R', 'u', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'L', 'a', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'B', 'e', 'n', ' ', 4, 'H', 'u', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'K', 'u', 'i', ' ', 3, 'S', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'M', 'u', ' ', 4, 'M', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ',\n3, 'H', 'u', ' ', 3, 'H', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'L', 'e', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'N', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 3, 'J', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'Y', 'e', ' ', 4, 'C', 'h', 'u', ' ', 5, 'S', 'h', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'C', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'M', 'e', 'i', ' ', 3, 'D', 'i', ' ', 3, 'J', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'K', 'a', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ', 3, 'L', 'e', ' ', 6, 'H', 'a', 'z', 'o', 'u', ' ',\n8, 'K', 'a', 't', 's', 'u', 'r', 'a', ' ', 4, 'P', 'i', 'n', ' ', 5, 'M', 'u', 'r', 'o', ' ', 4, 'G', 'a', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'Y', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'L', 'u', ' ', 3, 'J', 'u', ' ', 7, 'S', 'a', 'k', 'a', 'k', 'i', ' ',\n3, 'P', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'a', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n4, 'N', 'a', 'i', ' ', 3, 'M', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'G', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'J', 'u', ' ', 3, 'T', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'a', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 5, 'M', 'i', 'n', 'g', ' ', 3, 'S', 'u', ' ', 4, 'J', 'i', 'a', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'J', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n3, 'M', 'a', ' ', 4, 'S', 'u', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'C', 'u', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 3, 'S', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'T', 'a', ' ',\n3, 'K', 'e', ' ', 3, 'X', 'i', ' ', 3, 'G', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'K', 'a', 'o', ' ', 4, 'G', 'a', 'o', ' ',\n4, 'S', 'u', 'n', ' ', 4, 'P', 'a', 'n', ' ', 4, 'T', 'a', 'o', ' ', 3, 'G', 'e', ' ', 4, 'X', 'u', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'N', 'o', 'u', ' ', 3, 'J', 'i', ' ', 5, 'S', 'h', 'u', 'o', ' ', 4, 'G', 'o', 'u', ' ', 5, 'C', 'h', 'u', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'C', 'h', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'M', 'e', 'i', ' ', 3, 'X', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n4, 'G', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 6, 'H', 'a', 's', 'h', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 6, 'K', 'a', 's', 'h', 'i', ' ', 4, 'O', 'r', 'i', ' ', 4, 'B', 'i', 'n', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'X', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 4, 'G', 'a', 'i', ' ', 4, 'G', 'a', 'i', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ',\n3, 'C', 'u', ' ', 4, 'S', 'e', 'n', ' ', 4, 'C', 'u', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'H', 'u', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'N', 'i', 'e', ' ',\n4, 'G', 'a', 'o', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 4, 'G', 'u', 'i', ' ', 4, 'C', 'a', 'o', ' ', 4, 'M', 'a', 'n', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'D', 'i', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'L', 'e', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'S', 'u', 'o', ' ', 4, 'L', 'e', 'i', ' ', 3, 'L', 'u', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'i', ' ', 4, 'L', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'S', 'u', ' ', 3, 'K', 'e', ' ',\n4, 'S', 'h', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'L', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'S', 'h', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'M', 'e', 'n', ' ', 3, 'M', 'o', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'S', 'h', 'a', ' ', 3, 'X', 'i', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 7, 'H', 'o', 'k', 'u', 's', 'o', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n5, 'T', 'a', 'r', 'a', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'E', 'r', ' ', 4, 'X', 'i', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'Z', 'u', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'P', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'H', 'u', 'a', ' ', 4, 'K', 'u', 'i', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 4, 'Z', 'u', 'n', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'X', 'u', 'n', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 3, 'F', 'a', ' ', 4, 'G', 'a', 'n', ' ', 3, 'M', 'o', ' ', 3, 'W', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'N', 'a', 'o', ' ', 4, 'L', 'i', 'n', ' ', 4, 'L', 'i', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'R', 'u', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ', 4, 'L', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'S', 'h', 'u', 'n', ' ',\n4, 'T', 'u', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n3, 'S', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'T', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'N', 'u', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'T', 'u', 'o', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'R', 'u', 'i', ' ', 4, 'Z', 'h', 'u', ' ',\n7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'R', 'a', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ',\n4, 'C', 'e', 'n', ' ', 3, 'G', 'u', ' ', 4, 'L', 'i', 'u', ' ', 4, 'L', 'a', 'o', ' ', 4, 'G', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'Z', 'u', 's', 'a', ' ', 5, 'N', 'u', 'd', 'e', ' ', 3, 'C', 'a', ' ', 4, 'S', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'D', 'o', 'u', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 3, 'L', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'S', 'h', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'X', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'Z', 'u', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'P', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'B', 'o', ' ',\n3, 'B', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 5, 'Z', 'h', 'u', 'a', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'a', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'D', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ', 4, 'L', 'i', 'n', ' ',\n7, 'K', 'u', 'n', 'u', 'g', 'i', ' ', 4, 'C', 'h', 'a', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'T', 'a', 'o', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'T', 'o', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'J', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'G', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'E', 'r', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'M', 'i', ' ',\n5, 'Z', 'h', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'J', 'i', ' ', 4, 'K', 'u', 'i', ' ', 3, 'P', 'o', ' ',\n5, 'D', 'e', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 4, 'L', 'e', 'i', ' ', 3, 'S', 'a', ' ', 3, 'L', 'u', ' ', 3, 'L', 'i', ' ',\n5, 'C', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'M', 'i', 'e', ' ', 4, 'H', 'u', 'i', ' ', 3, 'O', 'u', ' ', 3, 'L', 'u', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'G', 'a', 'o', ' ', 3, 'D', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 4, 'F', 'e', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'S', 'o', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'T', 'a', 'm', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'Z', 'h', 'u', ' ',\n3, 'L', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'J', 'i', 'e', ' ',\n2, 'E', ' ', 3, 'S', 'u', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'N', 'i', 'e', ' ', 3, 'Y', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n4, 'L', 'a', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'K', 'w', 'i', ' ', 3, 'J', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'N', 'o', 'n', 'g', ' ', 3, 'B', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'J', 'u', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'W', 'e', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 5, 'C', 'a', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 4, 'L', 'u', 'o', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n4, 'J', 'u', 'e', ' ', 3, 'E', 'm', ' ', 4, 'L', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'L', 'e', 'i', ' ',\n3, 'L', 'i', ' ', 3, 'B', 'a', ' ', 5, 'N', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 6, 'T', 's', 'u', 'k', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'C', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'O', 'u', ' ', 3, 'X', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'K', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'u', 'e', ' ', 3, 'X', 'i', ' ', 3, 'X', 'u', ' ', 4, 'X', 'i', 'a', ' ',\n3, 'Y', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'u', 'o', ' ', 3, 'X', 'i', ' ',\n3, 'A', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'H', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Q', 'i', 'n', ' ',\n5, 'K', 'u', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'a', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'X', 'i', 'n', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Y', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'G', 'e', ' ', 3, 'W', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n3, 'O', 'u', ' ', 3, 'H', 'u', ' ', 3, 'T', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'P', 'e', 'n', ' ',\n3, 'X', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'X', 'u', ' ', 3, 'X', 'i', ' ', 4, 'S', 'e', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'C', 'h', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'K', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'C', 'i', ' ', 3, 'B', 'u', ' ', 3, 'W', 'u', ' ', 3, 'Q', 'i', ' ',\n3, 'B', 'u', ' ', 3, 'B', 'u', ' ', 4, 'W', 'a', 'i', ' ', 3, 'J', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ',\n3, 'S', 'e', ' ', 4, 'C', 'h', 'i', ' ', 3, 'S', 'e', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n3, 'L', 'i', ' ', 4, 'C', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'i', ' ', 4, 'G', 'u', 'i', ' ', 4, 'D', 'a', 'i', ' ',\n4, 'D', 'a', 'i', ' ', 3, 'S', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'M', 'o', ' ', 3, 'M', 'o', ' ',\n4, 'Y', 'a', 'o', ' ', 3, 'M', 'o', ' ', 3, 'C', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n4, 'D', 'a', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'X', 'u', 'n', ' ', 4, 'S', 'h', 'u', ' ', 4, 'C', 'a', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'Q', 'i', 'a', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'S', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n4, 'Y', 'u', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'F', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'e', ' ',\n4, 'C', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'W', 'e', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'B', 'i', 'n', ' ', 3, 'T', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'C', 'u', ' ', 4, 'H', 'u', 'i', ' ', 5, 'C', 'u', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'D', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ',\n3, 'D', 'u', ' ', 8, 'T', 's', 'u', 'k', 'u', 's', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 3, 'O', 'u', ' ', 5, 'D', 'u', 'a', 'n', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'a', ' ', 4, 'Q', 'u', 'e', ' ',\n3, 'K', 'e', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'J', 'u', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'G', 'u', ' ', 4, 'Q', 'u', 'e', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'O', 'u', ' ', 4, 'H', 'u', 'i', ' ',\n5, 'D', 'u', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'W', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'M', 'u', ' ',\n4, 'M', 'e', 'i', ' ', 4, 'M', 'e', 'i', ' ', 3, 'A', 'i', ' ', 4, 'Z', 'u', 'o', ' ', 3, 'D', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 3, 'P', 'i', ' ', 3, 'P', 'i', ' ', 3, 'B', 'i', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'P', 'u', ' ', 8, 'M', 'u', 's', 'h', 'i', 'r', 'u', ' ', 4, 'J', 'i', 'a', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n4, 'S', 'a', 'i', ' ', 3, 'M', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'X', 'u', 'n', ' ', 3, 'E', 'r', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'M', 'u', ' ', 4, 'H', 'a', 'o', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'D', 'o', 'u', ' ',\n8, 'M', 'u', 's', 'h', 'i', 'r', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'P', 'e', 'i', ' ', 3, 'J', 'u', ' ', 4, 'D', 'u', 'o', ' ', 4, 'C', 'u', 'i', ' ',\n3, 'B', 'i', ' ', 4, 'S', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 4, 'S', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n4, 'T', 'u', 'o', ' ', 3, 'H', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'S', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n3, 'M', 'u', ' ', 3, 'L', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'P', 'u', ' ',\n4, 'L', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ',\n3, 'Q', 'u', ' ', 4, 'D', 'i', 'e', ' ', 4, 'S', 'h', 'i', ' ', 3, 'D', 'i', ' ', 4, 'M', 'i', 'n', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'P', 'i', 'e', ' ', 4, 'N', 'a', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'D', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 3, 'R', 'i', ' ', 4, 'N', 'e', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'X', 'i', ' ',\n4, 'H', 'a', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'A', 'n', ' ', 3, 'Y', 'a', ' ', 3, 'K', 'e', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n3, 'Y', 'a', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ', 3, 'L', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'S', 'a', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ', 10, 'S', 'h', 'i', 't', 'a', 'm', 'i', 'z', 'u', ' ', 3, 'L', 'e', ' ', 3, 'N', 'i', ' ', 4, 'T', 'u', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'B', 'i', 'n', ' ',\n3, 'Z', 'e', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'C', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ',\n4, 'C', 'h', 'a', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ',\n3, 'X', 'i', ' ', 4, 'T', 'u', 'o', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'Q', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'P', 'a', 'i', ' ', 4, 'H', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'W', 'u', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'S', 'i', ' ', 3, 'R', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 3, 'W', 'u', ' ',\n7, 'T', 's', 'u', 'c', 'h', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ',\n3, 'Y', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'R', 'u', 'i', ' ', 4, 'J', 'u', 'n', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 5, 'N', 'i', 'o', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'F', 'e', 'n', ' ', 3, 'X', 'u', ' ', 3, 'X', 'u', ' ',\n4, 'Q', 'i', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'W', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'H', 'a', 'n', 'g', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'D', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'D', 'u', 'n', ' ',\n3, 'H', 'u', ' ', 4, 'H', 'u', 'o', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'M', 'u', ' ', 4, 'R', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ',\n3, 'T', 'a', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ',\n4, 'S', 'h', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'P', 'e', 'i', ' ', 4, 'P', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'Z', 'a', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'L', 'i', 'u', ' ', 4, 'M', 'e', 'i', ' ', 3, 'Z', 'e', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'O', 'u', ' ',\n3, 'L', 'i', ' ', 4, 'L', 'u', 'n', ' ', 5, 'C', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'H', 'u', ' ',\n3, 'M', 'o', ' ', 4, 'M', 'e', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'J', 'u', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 3, 'H', 'e', ' ', 3, 'L', 'i', ' ', 3, 'M', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'F', 'a', ' ', 4, 'F', 'e', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n3, 'G', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'S', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ',\n3, 'J', 'u', ' ', 4, 'X', 'i', 'e', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'i', 'a', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 3, 'B', 'o', ' ', 4, 'H', 'u', 'i', ' ', 3, 'M', 'i', ' ', 4, 'B', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n4, 'C', 'h', 'u', ' ', 3, 'L', 'e', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'G', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ',\n3, 'F', 'a', ' ', 4, 'M', 'a', 'o', ' ', 3, 'S', 'i', ' ', 3, 'H', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'C', 'i', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'S', 'u', ' ', 5, 'N', 'i', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'P', 'a', 'o', ' ', 3, 'B', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'S', 'i', ' ', 3, 'N', 'i', ' ', 3, 'J', 'u', ' ',\n4, 'Y', 'u', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'X', 'u', 'e', ' ',\n3, 'F', 'u', ' ', 4, 'P', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'T', 'a', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'X', 'u', 'e', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ',\n3, 'B', 'o', ' ', 4, 'X', 'i', 'e', ' ', 3, 'P', 'o', ' ', 3, 'Z', 'e', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Z', 'u', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n4, 'L', 'i', 'e', ' ', 3, 'S', 'i', ' ', 3, 'J', 'i', ' ', 3, 'E', 'r', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n3, 'S', 'a', ' ', 4, 'S', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'W', 'u', ' ', 3, 'X', 'i', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 3, 'A', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'M', 'o', 'u', ' ', 4, 'L', 'e', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'M', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'M', 'o', ' ', 4, 'W', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n3, 'X', 'u', ' ', 5, 'S', 'h', 'u', 'o', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'J', 'u', ' ',\n3, 'E', 'r', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'R', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 3, 'W', 'a', ' ',\n4, 'Q', 'i', 'a', ' ', 4, 'P', 'a', 'i', ' ', 3, 'W', 'u', ' ', 3, 'Q', 'u', ' ', 4, 'L', 'i', 'u', ' ', 3, 'Y', 'i', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'S', 'h', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'C', 'e', ' ', 4, 'P', 'a', 'l', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ', 3, 'H', 'u', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'J', 'u', 'n', ' ',\n4, 'H', 'a', 'n', ' ', 5, 'B', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'X', 'i', ' ',\n3, 'B', 'o', ' ', 4, 'D', 'o', 'u', ' ', 4, 'W', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'P', 'u', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 3, 'L', 'i', ' ',\n5, 'G', 'e', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'W', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'o', ' ', 4, 'H', 'a', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'W', 'e', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 4, 'S', 'u', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'P', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'T', 'u', ' ', 4, 'K', 'u', 'n', ' ', 4, 'P', 'i', 'n', ' ',\n4, 'N', 'i', 'e', ' ', 4, 'H', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'e', ' ', 5, 'N', 'i', 'a', 'n', ' ',\n3, 'T', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 2, 'E', ' ',\n3, 'S', 'u', ' ', 4, 'T', 'u', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'C', 'e', 'n', ' ', 3, 'T', 'i', ' ', 3, 'L', 'i', ' ',\n5, 'S', 'h', 'u', 'i', ' ', 3, 'S', 'i', ' ', 4, 'L', 'e', 'i', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'T', 'a', 'o', ' ', 3, 'D', 'u', ' ',\n4, 'L', 'a', 'o', ' ', 4, 'L', 'a', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'W', 'o', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 3, 'D', 'i', ' ', 4, 'R', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'S', 'e', ' ',\n3, 'F', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'o', 'u', ' ', 6, 'S', 'h', 'u', 'a', 'n', ' ', 3, 'Y', 'a', ' ',\n5, 'C', 'h', 'u', 'o', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 5, 'K', 'o', 'n', 'g', ' ', 3, 'W', 'o', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'T', 'u', 'o', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'H', 'e', ' ', 3, 'W', 'o', ' ', 3, 'J', 'u', ' ', 4, 'G', 'a', 'n', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 3, 'T', 'a', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'Q', 'i', 'e', ' ',\n3, 'D', 'e', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Q', 'i', ' ',\n3, 'G', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'H', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 3, 'Q', 'i', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'L', 'u', ' ', 4, 'N', 'a', 'o', ' ', 3, 'J', 'u', ' ', 4, 'T', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n4, 'L', 'e', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n3, 'P', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'N', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'u', ' ',\n4, 'G', 'a', 'n', ' ', 3, 'M', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'C', 'u', 'i', ' ', 3, 'Q', 'u', ' ', 5, 'H', 'u', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'W', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'L', 'a', 'i', ' ', 4, 'H', 'u', 'n', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'M', 'i', ' ', 4, 'B', 'e', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 3, 'R', 'e', ' ',\n4, 'F', 'e', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'K', 'e', ' ', 3, 'J', 'i', ' ', 4, 'S', 'h', 'e', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 7, 'S', 'h', 'i', 'b', 'u', 'i', ' ', 3, 'L', 'u', ' ', 3, 'Z', 'i', ' ', 3, 'D', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'M', 'i', 'n', ' ', 3, 'P', 'i', ' ', 5, 'T', 'a', 'n', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'R', 'o', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'N', 'u', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 3, 'D', 'u', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'a', ' ', 3, 'B', 'o', ' ', 3, 'W', 'o', ' ', 3, 'W', 'o', ' ', 3, 'D', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'W', 'e', 'n', ' ', 3, 'R', 'u', ' ', 4, 'X', 'i', 'e', ' ', 3, 'C', 'e', ' ', 4, 'W', 'e', 'i', ' ', 3, 'G', 'e', ' ',\n5, 'G', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'M', 'i', ' ', 3, 'K', 'e', ' ',\n4, 'M', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'o', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'H', 'u', 'n', ' ', 4, 'N', 'a', 'i', ' ', 4, 'K', 'u', 'i', ' ',\n4, 'S', 'h', 'i', ' ', 2, 'E', ' ', 4, 'P', 'a', 'i', ' ', 4, 'M', 'e', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ',\n3, 'Q', 'i', ' ', 4, 'M', 'e', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'C', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'C', 'a', 'n', ' ',\n5, 'T', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'M', 'o', ' ', 3, 'X', 'u', ' ', 3, 'J', 'i', ' ',\n4, 'P', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'H', 'u', ' ', 5, 'F', 'e', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'B', 'i', ' ', 4, 'M', 'i', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'T', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'S', 'u', 'e', 'i', ' ',\n4, 'J', 'i', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'o', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n4, 'H', 'u', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n5, 'C', 'h', 'u', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'N', 'i', 'e', ' ',\n3, 'Z', 'i', ' ', 4, 'W', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'R', 'a', 't', 's', 'u', ' ',\n4, 'K', 'u', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 3, 'L', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'G', 'a', 'i', ' ',\n3, 'P', 'o', ' ', 4, 'J', 'i', 'n', ' ', 4, 'G', 'u', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n3, 'K', 'e', ' ', 4, 'T', 'a', 'i', ' ', 3, 'D', 'a', ' ', 3, 'W', 'a', ' ', 4, 'L', 'i', 'u', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'S', 'a', 'o', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'L', 'u', 'n', ' ',\n3, 'M', 'a', ' ', 3, 'P', 'u', ' ', 4, 'W', 'e', 'i', ' ', 3, 'L', 'i', ' ', 4, 'C', 'a', 'i', ' ', 3, 'W', 'u', ' ',\n3, 'X', 'i', ' ', 4, 'W', 'e', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 4, 'S', 'h', 'i', ' ', 3, 'S', 'u', ' ',\n3, 'Y', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'S', 'o', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'X', 'i', 'u', ' ', 4, 'Y', 'i', 'n', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 3, 'S', 'u', ' ', 3, 'S', 'u', ' ', 3, 'N', 'i', ' ', 3, 'T', 'a', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'R', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'P', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'P', 'a', 'n', 'g', ' ', 5, 'W', 'e', 'n', 'g', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'M', 'i', 'e', ' ', 3, 'H', 'e', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'H', 'a', 'o', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'H', 'u', 'a', ' ', 3, 'G', 'e', ' ', 3, 'Z', 'i', ' ',\n4, 'T', 'a', 'o', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 3, 'B', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'G', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'G', 'a', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'M', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'L', 'u', ' ', 4, 'L', 'a', 'n', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 4, 'T', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'S', 'o', 'u', ' ', 3, 'H', 'u', ' ',\n3, 'B', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ', 3, 'M', 'i', ' ', 3, 'A', 'o', ' ', 3, 'L', 'u', ' ', 3, 'H', 'u', ' ',\n3, 'H', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'n', ' ',\n4, 'M', 'a', 'n', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'a', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'X', 'i', ' ', 3, 'J', 'i', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 4, 'G', 'u', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'G', 'a', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'C', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'T', 'u', 'a', 'n', ' ', 3, 'O', 'u', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'Y', 'e', ' ',\n3, 'X', 'i', ' ', 3, 'M', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'W', 'a', ' ', 3, 'L', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'M', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'K', 'a', 'n', 'g', ' ',\n4, 'L', 'e', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ',\n3, 'X', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 4, 'C', 'u', 'i', ' ', 3, 'T', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'X', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'P', 'i', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'P', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'W', 'u', ' ', 3, 'P', 'a', ' ', 3, 'J', 'i', ' ', 4, 'P', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'D', 'u', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'M', 'i', 'n', ' ', 4, 'R', 'u', 'n', ' ', 3, 'S', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'D', 'i', ' ', 4, 'W', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'T', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'X', 'u', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'Y', 'i', 'e', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n3, 'T', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'S', 'a', 'n', ' ', 4, 'H', 'e', 'i', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'P', 'u', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'S', 'e', ' ', 3, 'S', 'e', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'H', 'u', 'a', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 4, 'C', 'h', 'e', ' ', 4, 'G', 'a', 'n', ' ', 4, 'C', 'u', 'n', ' ',\n5, 'H', 'e', 'n', 'g', ' ', 3, 'S', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ',\n4, 'L', 'i', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'H', 'a', 'o', ' ', 3, 'H', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'O', 'k', 'i', ' ', 4, 'L', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'L', 'i', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'Z', 'e', ' ',\n4, 'X', 'i', 'e', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'X', 'u', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'M', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'C', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 3, 'A', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'M', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'P', 'i', ' ',\n3, 'J', 'u', ' ', 3, 'T', 'a', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'J', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'N', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 4, 'J', 'i', 'n', ' ', 4, 'F', 'e', 'n', ' ', 3, 'S', 'e', ' ', 3, 'J', 'i', ' ',\n4, 'S', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'C', 'h', 'u', ' ', 3, 'T', 'a', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'L', 'a', 'i', ' ', 4, 'B', 'i', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'S', 'h', 'u', ' ', 3, 'M', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'P', 'i', ' ', 3, 'J', 'i', ' ', 4, 'H', 'a', 'o', ' ', 3, 'R', 'u', ' ',\n4, 'Z', 'u', 'i', ' ', 3, 'W', 'o', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'D', 'u', 'i', ' ',\n3, 'C', 'i', ' ', 4, 'H', 'u', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 4, 'J', 'u', 'n', ' ', 3, 'A', 'i', ' ',\n3, 'P', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'B', 'i', 'n', ' ', 3, 'G', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 5, 'H', 'a', 'm', 'a', ' ', 4, 'K', 'u', 'o', ' ', 4, 'F', 'e', 'i', ' ', 5, 'B', 'o', 'k', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'L', 'u', 'o', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'L', 'u', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'o', 'u', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'S', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'D', 'u', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'P', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 3, 'M', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'P', 'u', ' ', 3, 'S', 'e', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'B', 'i', 'n', ' ', 4, 'H', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n4, 'Q', 'i', 'n', ' ', 4, 'H', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'X', 'i', 'e', ' ', 5, 'H', 'u', 'a', 'i', ' ',\n4, 'H', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 4, 'D', 'u', 'i', ' ', 4, 'F', 'a', 'n', ' ',\n3, 'H', 'u', ' ', 4, 'L', 'a', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ', 3, 'J', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'L', 'i', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'Y', 'u', 'e', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 5, 'R', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ',\n4, 'L', 'e', 'i', ' ', 4, 'L', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n3, 'F', 'a', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 6, 'H', 'y', 'e', 'n', 'g', ' ',\n3, 'S', 'a', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'M', 'i', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ',\n3, 'B', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 5, 'N', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'H', 'u', 'o', ' ', 3, 'S', 'i', ' ', 4, 'M', 'i', 'e', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 5, 'D', 'e', 'n', 'g', ' ',\n4, 'H', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'H', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'Z', 'a', 'o', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'X', 'i', 'e', ' ', 4, 'C', 'h', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'C', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'N', 'i', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ', 3, 'P', 'o', ' ',\n3, 'Y', 'i', ' ', 3, 'L', 'u', ' ', 5, 'C', 'h', 'u', 'i', ' ', 3, 'P', 'i', ' ', 4, 'K', 'a', 'i', ' ', 4, 'P', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'K', 'a', 'i', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'M', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n6, 'G', 'u', 'a', 'n', 'g', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'D', 'a', ' ', 4, 'X', 'i', 'a', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'K', 'e', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'B', 'a', ' ',\n4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'P', 'a', 'o', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'P', 'a', 'o', ' ', 4, 'T', 'a', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'a', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'H', 'u', ' ', 5, 'S', 'h', 'u', 'o', ' ', 4, 'L', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'X', 'u', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'L', 'i', 'e', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'X', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'W', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'S', 'h', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'e', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'K', 'a', 'i', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 4, 'X', 'i', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n3, 'P', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'F', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'Y', 'e', ' ', 4, 'H', 'u', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'R', 'e', ' ', 3, 'X', 'i', ' ', 3, 'F', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'e', ' ',\n3, 'P', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 4, 'H', 'a', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'H', 'u', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'H', 'e', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'K', 'u', ' ', 4, 'J', 'u', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'J', 'u', 'n', ' ', 3, 'D', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'J', 'i', ' ', 3, 'W', 'u', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'n', ' ', 3, 'J', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'F', 'e', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'K', 'u', 'n', ' ', 4, 'H', 'u', 'n', ' ', 4, 'T', 'u', 'n', ' ',\n3, 'X', 'i', ' ', 4, 'C', 'u', 'i', ' ', 3, 'W', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 3, 'F', 'u', ' ',\n3, 'W', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n4, 'R', 'u', 'o', ' ', 3, 'X', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'u', 'e', ' ', 3, 'Y', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'R', 'a', 'n', ' ',\n3, 'P', 'i', ' ', 3, 'G', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n3, 'H', 'e', ' ', 4, 'K', 'u', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 4, 'H', 'u', 'i', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'W', 'e', 'i', ' ', 5, 'T', 'u', 'a', 'n', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 5, 'N', 'u', 'a', 'n', ' ', 5, 'N', 'u', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n6, 'J', 'i', 'o', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'S', 'h', 'a', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'Y', 'e', ' ', 4, 'X', 'i', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n3, 'X', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'G', 'a', 'o', ' ', 4, 'G', 'u', 'a', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'H', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'T', 'u', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 2, 'N', ' ', 3, 'B', 'o', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 3, 'X', 'i', ' ', 3, 'W', 'u', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'H', 'e', ' ', 3, 'H', 'e', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'N', 'a', 'i', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'X', 'u', 'n', ' ', 3, 'M', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ', 8, 'O', 'o', 'z', 'u', 't', 's', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ',\n3, 'X', 'i', ' ', 3, 'B', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'L', 'o', 'u', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 3, 'Y', 'i', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'H', 'u', ' ', 3, 'Y', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'A', 'o', ' ', 4, 'W', 'e', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 3, 'O', 'u', ' ',\n3, 'R', 'e', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 5, 'C', 'u', 'a', 'n', ' ', 5, 'Z', 'e', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'C', 'h', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'R', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'D', 'u', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'F', 'e', 'n', ' ', 3, 'S', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'Y', 'u', ' ',\n4, 'L', 'i', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'F', 'e', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'X', 'u', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'M', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'u', 'e', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'T', 'a', 'i', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'C', 'a', 'n', ' ', 4, 'S', 'u', 'i', ' ', 3, 'X', 'i', ' ', 4, 'Q', 'u', 'e', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'X', 'i', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'i', 'e', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 6, 'T', 'a', 't', 's', 'u', ' ',\n5, 'N', 'u', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 3, 'R', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'K', 'a', 'o', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'J', 'i', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'H', 'e', ' ', 4, 'L', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 3, 'M', 'o', ' ', 4, 'B', 'a', 'o', ' ', 4, 'R', 'u', 'o', ' ',\n3, 'L', 'u', ' ', 3, 'L', 'a', ' ', 3, 'A', 'o', ' ', 4, 'X', 'u', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ',\n3, 'L', 'i', ' ', 3, 'L', 'u', ' ', 4, 'J', 'u', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n4, 'X', 'i', 'e', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 5, 'R', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'L', 'a', 'n', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'e', ' ', 3, 'M', 'i', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'L', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n5, 'Z', 'h', 'u', 'a', ' ', 13, 'T', 's', 'u', 'm', 'e', 'k', 'a', 'n', 'm', 'u', 'r', 'i', ' ', 3, 'P', 'a', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'P', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 3, 'A', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ', 3, 'F', 'u', ' ',\n3, 'Y', 'e', ' ', 3, 'B', 'a', ' ', 4, 'D', 'i', 'e', ' ', 3, 'Y', 'e', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Z', 'u', ' ',\n7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'E', 'r', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'G', 'e', ' ', 5, 'Z', 'a', 'n', 'g', ' ',\n4, 'D', 'i', 'e', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ',\n4, 'P', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'i', ' ', 3, 'D', 'u', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ',\n4, 'T', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 5, 'B', 'a', 'n', 'g', ' ', 3, 'B', 'o', ' ',\n7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'D', 'u', ' ', 3, 'Y', 'a', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'N', 'i', 'u', ' ',\n8, 'U', 's', 'h', 'i', 'h', 'e', 'n', ' ', 4, 'P', 'i', 'n', ' ', 4, 'J', 'i', 'u', ' ', 4, 'M', 'o', 'u', ' ', 4, 'T', 'u', 'o', ' ', 3, 'M', 'u', ' ',\n4, 'L', 'a', 'o', ' ', 4, 'R', 'e', 'n', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ', 3, 'M', 'u', ' ',\n5, 'G', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'G', 'e', ' ', 4, 'B', 'e', 'i', ' ', 3, 'S', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'G', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'G', 'e', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'M', 'u', ' ',\n3, 'D', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'T', 'e', ' ',\n3, 'X', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'G', 'u', ' ',\n3, 'X', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 4, 'P', 'o', 'u', ' ', 3, 'J', 'i', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'B', 'e', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'R', 'u', 'n', ' ', 3, 'D', 'u', ' ', 3, 'J', 'u', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'n', ' ', 3, 'K', 'e', ' ', 3, 'J', 'u', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ', 3, 'X', 'i', ' ', 4, 'B', 'e', 'i', ' ', 4, 'L', 'u', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'M', 'a', ' ', 4, 'S', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'L', 'i', ' ', 4, 'D', 'u', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 7, 'I', 'k', 'e', 'n', 'i', 'e', ' ', 3, 'L', 'i', ' ', 3, 'D', 'u', ' ', 4, 'L', 'i', 'e', ' ', 3, 'P', 'i', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 4, 'B', 'a', 'o', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'K', 'u', 'i', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 3, 'B', 'a', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'C', 'a', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'A', 'n', ' ', 4, 'J', 'i', 'e', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ',\n6, 'G', 'u', 'a', 'n', 'g', ' ', 3, 'M', 'a', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'B', 'o', ' ', 4, 'H', 'o', 'u', ' ',\n3, 'Y', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n4, 'N', 'i', 'u', ' ', 3, 'D', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'M', 'u', ' ', 4, 'B', 'e', 'i', ' ',\n3, 'P', 'i', ' ', 3, 'J', 'u', ' ', 3, 'N', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'P', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ',\n4, 'T', 'u', 'o', ' ', 3, 'H', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 3, 'P', 'i', ' ', 3, 'N', 'i', ' ',\n3, 'A', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'G', 'o', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'J', 'u', ' ', 4, 'D', 'a', 'n', ' ',\n3, 'P', 'o', ' ', 3, 'G', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'H', 'e', 'n', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 3, 'H', 'e', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'X', 'u', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n3, 'T', 'a', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'o', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'o', ' ', 3, 'D', 'u', ' ',\n4, 'X', 'i', 'a', ' ', 4, 'S', 'h', 'i', ' ', 4, 'H', 'u', 'a', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'S', 'u', 'n', ' ',\n3, 'Y', 'u', ' ', 3, 'B', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ',\n4, 'X', 'i', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'S', 'u', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'a', ' ', 3, 'L', 'i', ' ', 4, 'H', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'P', 'a', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'B', 'a', ' ', 3, 'Q', 'i', ' ', 3, 'N', 'i', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'L', 'a', 'i', ' ', 3, 'X', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'K', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'M', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'C', 'a', 'i', ' ',\n3, 'C', 'u', ' ', 4, 'S', 'h', 'e', ' ', 5, 'K', 'a', 'r', 'i', ' ', 4, 'C', 'e', 'n', ' ', 4, 'L', 'u', 'o', ' ', 3, 'H', 'u', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'W', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'M', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'T', 'u', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 4, 'N', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'a', ' ', 4, 'H', 'o', 'u', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'S', 'u', 'n', ' ', 3, 'B', 'o', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ',\n3, 'M', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'H', 'a', 'o', ' ',\n3, 'Y', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 4, 'M', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'A', 'o', ' ', 3, 'A', 'o', ' ',\n4, 'H', 'a', 'o', ' ', 4, 'C', 'u', 'i', ' ', 4, 'F', 'e', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'P', 'u', ' ', 4, 'L', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'S', 'w', 'u', ' ', 4, 'T', 'o', 'n', ' ', 3, 'X', 'i', ' ',\n3, 'G', 'e', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'D', 'u', ' ', 4, 'H', 'u', 'i', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 3, 'T', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'P', 'i', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 4, 'N', 'o', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'N', 'a', 'o', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 3, 'L', 'u', ' ', 3, 'T', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ', 5, 'R', 'a', 'n', 'g', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'N', 'a', 'o', ' ', 4, 'L', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ', 3, 'Z', 'i', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'S', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'G', 'a', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'L', 'e', ' ',\n3, 'B', 'a', ' ', 3, 'J', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'D', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ',\n4, 'J', 'i', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'M', 'a', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'F', 'u', ' ', 4, 'W', 'e', 'n', ' ', 4, 'J', 'i', 'e', ' ', 3, 'Y', 'a', ' ',\n4, 'F', 'e', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Y', 'u', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'W', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'P', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'A', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 3, 'B', 'o', ' ', 3, 'C', 'i', ' ', 4, 'G', 'o', 'u', ' ', 4, 'J', 'i', 'a', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n3, 'P', 'o', ' ', 3, 'C', 'i', ' ', 3, 'K', 'e', ' ', 4, 'R', 'a', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'Z', 'u', ' ', 4, 'J', 'i', 'a', ' ', 4, 'M', 'i', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ',\n3, 'B', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'F', 'a', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'L', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'X', 'u', ' ',\n4, 'L', 'u', 'o', ' ', 3, 'S', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'K', 'e', 'n', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'E', 'r', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ', 5, 'H', 'e', 'n', 'g', ' ',\n4, 'G', 'u', 'i', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'B', 'a', 'n', ' ', 4, 'P', 'e', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n3, 'E', 'i', ' ', 4, 'H', 'u', 'n', ' ', 4, 'W', 'e', 'n', ' ', 2, 'E', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'T', 'i', ' ',\n3, 'W', 'u', ' ', 3, 'W', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'J', 'u', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'B', 'e', 'i', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'o', ' ', 4, 'H', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Q', 'i', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'X', 'i', 'u', ' ', 3, 'F', 'u', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'Y', 'e', ' ', 3, 'X', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 8, 'C', 'h', 'i', 'i', 's', 'a', 'i', ' ', 4, 'W', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'P', 'i', 'n', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'C', 'u', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'J', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n4, 'L', 'a', 'i', ' ', 4, 'W', 'e', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'P', 'e', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'Q', 'i', ' ', 2, 'E', ' ',\n4, 'K', 'u', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'B', 'e', 'i', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'Q', 'i', 'n', ' ', 3, 'P', 'i', ' ', 3, 'P', 'a', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'Q', 'i', 'n', ' ',\n3, 'F', 'a', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'H', 'u', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'M', 'a', 'o', ' ', 4, 'M', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'T', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n4, 'D', 'a', 'i', ' ', 4, 'R', 'o', 'u', ' ', 4, 'M', 'i', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'Y', 'e', ' ',\n4, 'N', 'a', 'o', ' ', 3, 'H', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'R', 'u', 'i', ' ',\n3, 'S', 'e', ' ', 4, 'L', 'i', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'W', 'e', 'n', ' ', 3, 'W', 'u', ' ', 4, 'J', 'i', 'n', ' ', 4, 'J', 'i', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'M', 'a', ' ',\n4, 'T', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'u', 'o', ' ', 4, 'J', 'u', 'e', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ',\n3, 'A', 'i', ' ', 4, 'B', 'i', 'n', ' ', 3, 'T', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'u', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n3, 'L', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'A', 'o', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'L', 'u', ' ', 3, 'W', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'o', 'u', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'Q', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 5, 'L', 'i', 'a', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'S', 'u', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 3, 'P', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'A', 'i', ' ', 3, 'B', 'i', ' ', 4, 'C', 'a', 'n', ' ',\n3, 'Q', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'n', ' ', 4, 'T', 'a', 'n', ' ',\n4, 'H', 'u', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'S', 'e', ' ', 4, 'S', 'u', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'L', 'u', ' ', 4, 'B', 'i', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ', 4, 'W', 'e', 'n', ' ', 4, 'Z', 'u', 'i', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'J', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'G', 'a', 'i', ' ', 4, 'L', 'e', 'i', ' ', 3, 'D', 'u', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'R', 'o', 'u', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'G', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n3, 'L', 'a', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'D', 'a', 'o', ' ',\n4, 'Z', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'G', 'u', 'a', ' ', 3, 'B', 'o', ' ', 4, 'D', 'i', 'e', ' ', 4, 'B', 'a', 'o', ' ',\n3, 'H', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'B', 'a', 'n', ' ', 5, 'R', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n3, 'W', 'a', ' ', 11, 'D', 'e', 'k', 'a', 'g', 'u', 'r', 'a', 'm', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'P', 'e', 'n', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ', 5, 'W', 'e', 'n', 'g', ' ', 3, 'O', 'u', ' ', 12, 'D', 'e', 's', 'h', 'i', 'g', 'u', 'r', 'a', 'm', 'u', ' ', 11, 'M', 'i', 'r', 'i', 'g', 'u', 'r', 'a', 'm', 'u', ' ',\n5, 'T', 'h', 'o', 'n', ' ', 3, 'H', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'C', 'i', ' ',\n11, 'H', 'e', 'k', 'u', 't', 'o', 'g', 'u', 'r', 'a', ' ', 5, 'J', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 7, 'S', 'a', 'r', 'a', 'k', 'e', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n5, 'M', 'e', 'n', 'g', ' ', 4, 'P', 'o', 'u', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 11, 'S', 'e', 'n', 'c', 'h', 'i', 'g', 'u', 'r', 'a', ' ', 3, 'C', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'L', 'o', 'u', ' ', 3, 'D', 'i', ' ', 3, 'O', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n4, 'L', 'i', 'n', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'P', 'i', ' ', 4, 'D', 'a', 'n', ' ', 5, 'W', 'e', 'n', 'g', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'R', 'u', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'S', 'u', ' ', 4, 'S', 'e', 'n', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 3, 'L', 'u', ' ', 3, 'F', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'J', 'i', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n4, 'Z', 'h', 'a', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'N', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'B', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'X', 'u', 'n', ' ', 4, 'L', 'i', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n3, 'M', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'F', 'a', 'n', ' ', 3, 'F', 'u', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'F', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n3, 'M', 'u', ' ', 4, 'T', 'a', 'p', ' ', 4, 'P', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'W', 'a', ' ', 3, 'D', 'a', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ', 4, 'B', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'C', 'h', 'u', ' ', 3, 'M', 'u', ' ',\n3, 'M', 'u', ' ', 3, 'C', 'e', ' ', 4, 'C', 'e', 'n', ' ', 4, 'G', 'a', 'i', ' ', 3, 'B', 'i', ' ', 3, 'D', 'a', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'L', 'u', 'e', ' ', 3, 'Q', 'i', ' ', 4, 'L', 'u', 'e', ' ', 4, 'P', 'a', 'n', ' ', 5, 'K', 'e', 's', 'a', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'M', 'u', ' ', 4, 'J', 'u', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'L', 'i', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'D', 'i', 'e', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'H', 'u', 'a', ' ',\n5, 'D', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'J', 'i', ' ', 4, 'W', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 3, 'J', 'i', ' ', 4, 'C', 'h', 'a', ' ', 4, 'L', 'i', 'u', ' ',\n7, 'T', 'a', 't', 'a', 'm', 'u', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n3, 'B', 'o', ' ', 4, 'D', 'i', 'e', ' ', 4, 'D', 'i', 'e', ' ', 3, 'P', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'D', 'a', 'n', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'N', 'a', 'i', ' ',\n5, 'D', 'i', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'G', 'e', ' ',\n4, 'J', 'i', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'X', 'i', 'a', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'N', 'u', 'e', ' ',\n3, 'L', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'B', 'a', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'X', 'i', 'a', ' ', 4, 'C', 'u', 'i', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'L', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'P', 'a', 'o', ' ',\n3, 'P', 'i', ' ', 4, 'G', 'a', 'n', ' ', 3, 'K', 'e', ' ', 3, 'C', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Q', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'F', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'F', 'e', 'i', ' ', 3, 'Q', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'C', 'h', 'a', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'N', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'K', 'a', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'D', 'u', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'H', 'e', 'n', ' ',\n3, 'Y', 'a', ' ', 4, 'M', 'e', 'i', ' ', 4, 'D', 'o', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n3, 'T', 'u', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'P', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'S', 'u', 'a', 'n', ' ', 3, 'P', 'u', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 3, 'W', 'u', ' ', 4, 'S', 'h', 'a', ' ',\n4, 'L', 'a', 'o', ' ', 5, 'S', 'h', 'o', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 3, 'M', 'a', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'J', 'i', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'A', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'B', 'i', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'G', 'u', ' ', 4, 'D', 'u', 'i', ' ', 2, 'E', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'C', 'u', 'i', ' ', 3, 'Y', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'C', 'u', ' ', 4, 'D', 'a', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 6, 'Z', 'h', 'u', 'n', 'g', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'H', 'o', 'u', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n3, 'L', 'a', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'T', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'u', 'a', ' ',\n4, 'W', 'e', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'K', 'u', ' ', 4, 'J', 'i', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Y', 'i', ' ',\n3, 'L', 'u', ' ', 4, 'S', 'a', 'o', ' ', 4, 'J', 'u', 'e', ' ', 4, 'C', 'h', 'i', ' ', 3, 'X', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'W', 'e', 'n', ' ', 3, 'J', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 5, 'C', 'h', 'a', 'i', ' ', 5, 'S', 'h', 'o', 'u', ' ', 4, 'N', 'u', 'e', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'D', 'a', ' ',\n4, 'P', 'i', 'e', ' ', 4, 'T', 'a', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'C', 'u', ' ',\n4, 'L', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'i', ' ',\n4, 'S', 'o', 'u', ' ', 4, 'S', 'u', 'o', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'L', 'o', 'u', ' ', 3, 'L', 'u', ' ',\n3, 'M', 'o', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 4, 'L', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'H', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'Y', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'P', 'i', ' ', 4, 'L', 'e', 'i', ' ', 3, 'L', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'L', 'a', 'i', ' ', 4, 'P', 'i', 'e', ' ',\n3, 'J', 'i', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 4, 'H', 'u', 'o', ' ', 4, 'L', 'a', 'i', ' ', 6, 'S', 'h', 'a', 'k', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Q', 'u', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'L', 'u', 'o', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 3, 'B', 'o', ' ', 4, 'G', 'u', 'i', ' ', 3, 'P', 'o', ' ',\n3, 'F', 'a', ' ', 5, 'D', 'e', 'n', 'g', ' ', 3, 'F', 'a', ' ', 4, 'B', 'a', 'i', ' ', 4, 'B', 'a', 'i', ' ', 4, 'Q', 'i', 'e', ' ',\n3, 'B', 'i', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'M', 'a', 'o', ' ', 3, 'D', 'e', ' ', 3, 'P', 'a', ' ',\n4, 'J', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ', 3, 'C', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ',\n3, 'M', 'o', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 3, 'A', 'i', ' ',\n2, 'E', ' ', 4, 'H', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'W', 'a', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'A', 'i', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n4, 'H', 'a', 'o', ' ', 3, 'Z', 'e', ' ', 4, 'C', 'u', 'i', ' ', 4, 'H', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'Y', 'e', ' ',\n3, 'P', 'o', ' ', 4, 'H', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'A', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'H', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'P', 'i', ' ', 4, 'G', 'a', 'n', ' ',\n4, 'P', 'a', 'o', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'J', 'u', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'C', 'u', 'n', ' ', 4, 'Q', 'u', 'e', ' ',\n4, 'Z', 'h', 'a', ' ', 3, 'G', 'u', ' ', 4, 'J', 'u', 'n', ' ', 4, 'J', 'u', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'G', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'D', 'u', ' ', 4, 'M', 'i', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 4, 'B', 'e', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'P', 'e', 'n', ' ', 3, 'H', 'e', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'H', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'B', 'o', ' ', 4, 'W', 'a', 'n', ' ', 3, 'H', 'e', ' ',\n4, 'A', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'H', 'e', ' ', 3, 'Y', 'u', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'G', 'a', 'i', ' ', 4, 'D', 'a', 'o', ' ', 4, 'P', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ', 3, 'L', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 4, 'J', 'i', 'n', ' ', 3, 'X', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n3, 'A', 'n', ' ', 3, 'L', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'A', 'n', ' ',\n3, 'G', 'u', ' ', 3, 'L', 'i', ' ', 3, 'M', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ', 3, 'X', 'u', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'R', 'u', 'a', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'D', 'u', 'n', ' ', 4, 'X', 'i', 'n', ' ', 3, 'X', 'i', ' ', 4, 'P', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n4, 'D', 'u', 'n', ' ', 4, 'M', 'i', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ',\n4, 'M', 'a', 'o', ' ', 4, 'K', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'O', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'D', 'a', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'C', 'h', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ',\n3, 'M', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'D', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'Z', 'i', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n4, 'Z', 'h', 'a', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 3, 'M', 'i', ' ', 4, 'D', 'i', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'E', 'r', ' ', 5, 'M', 'i', 'n', 'g', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'M', 'o', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'M', 'o', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'M', 'a', 'i', ' ',\n5, 'Z', 'h', 'a', 'o', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 4, 'J', 'u', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 3, 'D', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'C', 'u', 'o', ' ', 5, 'J', 'u', 'a', 'n', ' ', 2, 'E', ' ',\n4, 'W', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'K', 'u', 'n', ' ', 4, 'L', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ', 4, 'W', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Y', 'a', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n4, 'L', 'a', 'i', ' ', 4, 'S', 'u', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'D', 'u', ' ',\n3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 3, 'M', 'u', ' ', 4, 'H', 'u', 'n', ' ', 3, 'N', 'i', ' ', 3, 'L', 'u', ' ',\n3, 'Y', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'C', 'a', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'H', 'u', 'n', ' ',\n3, 'M', 'a', ' ', 4, 'X', 'i', 'a', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'G', 'u', 'n', ' ', 4, 'C', 'a', 'i', ' ',\n5, 'C', 'h', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 3, 'D', 'u', ' ', 4, 'H', 'o', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n3, 'T', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'G', 'a', 'o', ' ', 4, 'R', 'u', 'i', ' ', 4, 'M', 'o', 'u', ' ', 3, 'X', 'u', ' ',\n3, 'F', 'a', ' ', 4, 'W', 'e', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'K', 'u', 'i', ' ', 3, 'M', 'i', ' ',\n5, 'W', 'e', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'K', 'e', ' ', 4, 'S', 'o', 'u', ' ',\n4, 'X', 'i', 'a', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 5, 'S', 'h', 'u', 'i', ' ',\n3, 'Z', 'e', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'O', 'u', ' ', 3, 'M', 'o', ' ',\n5, 'S', 'h', 'u', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'R', 'u', 'n', ' ', 4, 'P', 'i', 'e', ' ', 3, 'X', 'i', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 3, 'P', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'S', 'h', 'u', 'n', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 3, 'X', 'u', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 4, 'M', 'o', 'u', ' ', 4, 'L', 'i', 'n', ' ', 4, 'K', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'e', ' ',\n3, 'A', 'i', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'G', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n3, 'Q', 'u', ' ', 4, 'W', 'e', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'S', 'a', 'o', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'H', 'u', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ',\n3, 'L', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n4, 'C', 'h', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'M', 'a', 'o', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'L', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'S', 'h', 'u', 'o', ' ', 3, 'C', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'Y', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'H', 'o', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n3, 'J', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'C', 'u', 'o', ' ', 5, 'D', 'u', 'a', 'n', ' ', 3, 'A', 'i', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 4, 'B', 'a', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n3, 'Q', 'i', ' ', 3, 'J', 'i', ' ', 3, 'Z', 'i', ' ', 4, 'G', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'K', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'F', 'a', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n3, 'M', 'a', ' ', 4, 'S', 'h', 'a', ' ', 4, 'D', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 3, 'L', 'i', ' ', 3, 'F', 'u', ' ',\n4, 'M', 'i', 'n', ' ', 4, 'N', 'u', 'o', ' ', 4, 'H', 'u', 'o', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Q', 'i', ' ',\n4, 'K', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'F', 'e', 'n', ' ', 2, 'E', ' ', 3, 'Y', 'a', ' ', 3, 'P', 'i', ' ',\n4, 'Z', 'h', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'S', 'u', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'e', ' ', 4, 'D', 'u', 'n', ' ',\n4, 'P', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'F', 'a', ' ', 3, 'M', 'o', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'Q', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'L', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 3, 'D', 'i', ' ',\n5, 'Z', 'h', 'a', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'A', 'i', ' ', 4, 'F', 'e', 'i', ' ', 3, 'M', 'u', ' ', 4, 'Z', 'h', 'u', ' ',\n3, 'L', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'N', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'P', 'a', 'o', ' ', 3, 'L', 'e', ' ', 3, 'P', 'o', ' ', 3, 'B', 'o', ' ', 3, 'P', 'o', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n3, 'Z', 'a', ' ', 4, 'N', 'u', 'o', ' ', 3, 'L', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n8, 'A', 'r', 'a', 'g', 'a', 'n', 'e', ' ', 4, 'C', 'h', 'u', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n4, 'H', 'u', 'o', ' ', 2, 'E', ' ', 4, 'N', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 3, 'L', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'A', 'i', ' ', 4, 'L', 'u', 'o', ' ', 4, 'K', 'e', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ', 5, 'M', 'a', 'n', 'g', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 5, 'I', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'e', ' ', 4, 'C', 'h', 'e', ' ', 2, 'E', ' ', 4, 'L', 'i', 'u', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'a', ' ', 4, 'K', 'u', 'n', ' ',\n3, 'Y', 'u', ' ', 5, 'K', 'a', 'k', 'i', ' ', 3, 'L', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'N', 'u', 'e', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ',\n5, 'K', 'o', 'n', 'g', ' ', 5, 'C', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'B', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'M', 'i', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'H', 'e', ' ', 3, 'L', 'u', ' ', 3, 'A', 'i', ' ', 4, 'S', 'u', 'i', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'D', 'u', 'i', ' ', 3, 'W', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'L', 'u', 'n', ' ',\n4, 'W', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'P', 'e', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n5, 'R', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'K', 'e', ' ', 3, 'B', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'S', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'T', 'i', ' ',\n4, 'N', 'a', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'D', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ',\n5, 'S', 'e', 'k', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'Q', 'u', 'e', ' ',\n3, 'M', 'a', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'S', 'u', ' ', 2, 'E', ' ', 3, 'C', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'S', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 3, 'P', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'S', 'a', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 4, 'C', 'u', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'X', 'i', 'a', ' ',\n3, 'Q', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'D', 'u', 'i', ' ',\n4, 'Z', 'h', 'e', ' ', 3, 'K', 'e', ' ', 3, 'L', 'a', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'A', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ',\n4, 'K', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'L', 'e', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 3, 'M', 'o', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'u', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n5, 'C', 'h', 'u', 'o', ' ', 3, 'J', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'L', 'a', 'o', ' ', 3, 'Q', 'u', ' ', 5, 'Z', 'e', 'n', 'g', ' ',\n5, 'D', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'L', 'i', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 3, 'Z', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'D', 'i', ' ', 3, 'L', 'i', ' ',\n5, 'T', 'a', 'n', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'H', 'e', ' ', 4, 'H', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 4, 'L', 'e', 'i', ' ',\n3, 'K', 'e', ' ', 4, 'C', 'h', 'u', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'P', 'i', ' ', 3, 'P', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'P', 'i', 'n', ' ', 3, 'Q', 'i', ' ',\n3, 'A', 'i', ' ', 4, 'K', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'R', 'u', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n4, 'P', 'a', 'o', ' ', 3, 'C', 'i', ' ', 4, 'M', 'i', 'e', ' ', 3, 'C', 'a', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n4, 'L', 'e', 'i', ' ', 4, 'L', 'e', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 4, 'F', 'a', 'n', ' ',\n4, 'Q', 'u', 'e', ' ', 4, 'P', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n3, 'M', 'o', ' ', 3, 'B', 'o', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'L', 'i', ' ', 5, 'R', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ',\n4, 'Y', 'u', 'e', ' ', 3, 'S', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'T', 'a', ' ', 3, 'M', 'a', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ',\n4, 'D', 'u', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'F', 'u', ' ', 3, 'M', 'i', ' ', 3, 'Z', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'S', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Z', 'u', 'o', ' ', 3, 'Q', 'u', ' ', 3, 'H', 'u', ' ', 4, 'Z', 'h', 'u', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'S', 'u', 'i', ' ', 3, 'C', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ', 3, 'M', 'i', ' ', 3, 'L', 'u', ' ',\n3, 'Y', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ',\n4, 'G', 'u', 'i', ' ', 4, 'X', 'i', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ', 4, 'G', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'G', 'a', 'o', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'J', 'i', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'G', 'a', 'i', ' ', 4, 'K', 'u', 'n', ' ',\n3, 'D', 'i', ' ', 4, 'D', 'a', 'o', ' ', 4, 'H', 'u', 'o', ' ', 4, 'T', 'a', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'G', 'u', ' ',\n5, 'G', 'u', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'D', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'L', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ', 4, 'Z', 'h', 'e', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Z', 'i', ' ', 4, 'H', 'u', 'o', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 3, 'F', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'W', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n3, 'T', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'M', 'e', 'i', ' ', 3, 'S', 'i', ' ', 3, 'D', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'G', 'a', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'S', 'i', ' ',\n3, 'M', 'a', ' ', 3, 'T', 'a', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'X', 'i', ' ',\n3, 'J', 'i', ' ', 3, 'S', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n3, 'L', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ', 4, 'D', 'a', 'o', ' ', 3, 'L', 'i', ' ', 5, 'R', 'a', 'n', 'g', ' ',\n4, 'Y', 'u', 'e', ' ', 3, 'T', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 4, 'R', 'o', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'Y', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'H', 'e', ' ', 3, 'T', 'u', ' ',\n4, 'X', 'i', 'u', ' ', 3, 'S', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'T', 'u', ' ', 3, 'Z', 'i', ' ', 4, 'C', 'h', 'a', ' ',\n4, 'G', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'H', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'K', 'e', ' ',\n5, 'M', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'u', ' ',\n3, 'M', 'i', ' ', 3, 'K', 'u', ' ', 4, 'B', 'a', 'n', ' ', 3, 'P', 'i', ' ', 3, 'N', 'i', ' ', 3, 'L', 'i', ' ',\n4, 'Y', 'o', 'u', ' ', 3, 'Z', 'u', ' ', 3, 'P', 'i', ' ', 3, 'B', 'a', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'M', 'o', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'J', 'u', ' ', 3, 'Z', 'i', ' ', 4, 'H', 'u', 'o', ' ', 3, 'J', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'H', 'u', 'o', ' ', 3, 'H', 'e', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'Z', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'R', 'e', 'n', ' ', 3, 'D', 'u', ' ', 3, 'Y', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'H', 'u', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'X', 'i', ' ', 4, 'K', 'a', 'o', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'Z', 'e', ' ', 5, 'S', 'h', 'u', 'i', ' ', 3, 'L', 'u', ' ', 4, 'K', 'u', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'T', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'T', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n5, 'S', 'h', 'u', 'i', ' ', 3, 'Y', 'a', ' ', 4, 'L', 'u', 'n', ' ', 3, 'L', 'u', ' ', 3, 'G', 'u', ' ', 4, 'Z', 'u', 'o', ' ',\n4, 'R', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'i', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'K', 'u', 'n', ' ', 5, 'L', 'e', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'K', 'e', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 3, 'Z', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'S', 'u', ' ', 4, 'L', 'u', 'e', ' ', 3, 'Y', 'i', ' ',\n3, 'X', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'F', 'u', ' ', 3, 'B', 'i', ' ', 4, 'N', 'u', 'o', ' ',\n4, 'J', 'i', 'e', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'X', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ',\n4, 'W', 'e', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'J', 'i', ' ', 3, 'X', 'u', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'D', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 3, 'J', 'i', ' ', 4, 'G', 'a', 'o', ' ',\n4, 'G', 'a', 'o', ' ', 3, 'G', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'J', 'i', ' ',\n5, 'K', 'a', 'n', 'g', ' ', 3, 'M', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'M', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ',\n3, 'L', 'u', ' ', 3, 'S', 'u', ' ', 3, 'J', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ', 4, 'Q', 'i', 'u', ' ',\n3, 'S', 'e', ' ', 3, 'Y', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'J', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'P', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'S', 'a', 'i', ' ',\n3, 'L', 'u', ' ', 4, 'S', 'u', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'S', 'e', ' ', 4, 'H', 'u', 'i', ' ', 5, 'R', 'a', 'n', 'g', ' ',\n4, 'N', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 4, 'B', 'i', 'n', ' ', 3, 'J', 'i', ' ', 4, 'T', 'u', 'i', ' ', 4, 'W', 'e', 'n', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'R', 'a', 'n', 'g', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'X', 'u', 'e', ' ', 3, 'W', 'a', ' ', 4, 'J', 'i', 'u', ' ',\n6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 5, 'K', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'S', 'e', 'n', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 3, 'T', 'u', ' ', 4, 'L', 'a', 'o', ' ',\n4, 'Q', 'i', 'e', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 3, 'W', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ',\n3, 'W', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'K', 'o', 'u', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'W', 'o', ' ', 4, 'D', 'a', 'n', ' ', 3, 'K', 'u', ' ', 3, 'K', 'e', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 3, 'X', 'u', ' ', 3, 'S', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'D', 'o', 'u', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'W', 'o', ' ', 3, 'W', 'a', ' ', 3, 'Y', 'a', ' ', 3, 'Y', 'u', ' ', 3, 'J', 'u', ' ',\n6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'Y', 'u', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 3, 'W', 'u', ' ',\n4, 'K', 'u', 'i', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'K', 'u', 'a', 'n', ' ', 5, 'L', 'o', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'C', 'u', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'C', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n4, 'D', 'o', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'L', 'i', ' ', 4, 'C', 'h', 'u', ' ',\n4, 'S', 'h', 'i', ' ', 4, 'F', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'M', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'S', 'i', ' ', 4, 'J', 'u', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 4, 'J', 'i', 'e', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'C', 'e', 'n', 'g', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'C', 'u', 'i', ' ', 5, 'H', 'u', 'a', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'K', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'L', 'e', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'G', 'a', 'n', ' ', 5, 'M', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 7, 'U', 't', 's', 'u', 'b', 'o', ' ',\n3, 'D', 'u', ' ', 3, 'J', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'B', 'a', ' ', 5, 'S', 'u', 'a', 'n', ' ', 3, 'J', 'i', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'S', 'u', 'n', ' ', 3, 'Y', 'a', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n3, 'H', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'C', 'e', 'n', ' ', 3, 'P', 'i', ' ', 3, 'B', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ',\n3, 'D', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'N', 'a', ' ', 4, 'C', 'h', 'i', ' ', 3, 'G', 'u', ' ', 3, 'L', 'i', ' ',\n4, 'Q', 'i', 'e', ' ', 4, 'M', 'i', 'n', ' ', 4, 'B', 'a', 'o', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'S', 'i', ' ', 3, 'F', 'u', ' ',\n3, 'C', 'e', ' ', 4, 'B', 'e', 'n', ' ', 4, 'P', 'e', 'i', ' ', 3, 'D', 'a', ' ', 3, 'Z', 'i', ' ', 3, 'D', 'i', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 3, 'N', 'u', ' ', 3, 'F', 'u', ' ', 4, 'G', 'o', 'u', ' ', 4, 'F', 'a', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'G', 'e', ' ', 4, 'F', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'M', 'a', 'o', ' ', 3, 'P', 'o', ' ',\n4, 'S', 'e', 'y', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 6, 'S', 'o', 'u', 'k', 'e', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n4, 'L', 'u', 'o', ' ', 4, 'G', 'u', 'i', ' ', 3, 'Q', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'J', 'i', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ', 3, 'R', 'u', ' ', 3, 'F', 'a', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 3, 'D', 'a', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'C', 'e', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'K', 'o', 'u', ' ', 4, 'L', 'a', 'i', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'a', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'C', 'e', ' ', 3, 'F', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'T', 'u', ' ', 3, 'P', 'a', ' ',\n3, 'L', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'S', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'Z', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'o', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'C', 'e', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'G', 'a', 'o', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'G', 'a', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'K', 'a', 'g', 'o', ' ',\n5, 'G', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 2, 'O', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'P', 'u', ' ', 4, 'L', 'a', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ',\n3, 'G', 'e', ' ', 4, 'C', 'h', 'i', ' ', 5, 'G', 'u', 'a', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n3, 'G', 'u', ' ', 4, 'C', 'h', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'a', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n3, 'L', 'u', ' ', 3, 'B', 'o', ' ', 3, 'J', 'i', ' ', 4, 'L', 'i', 'n', ' ', 5, 'S', 'u', 'a', 'n', ' ', 4, 'J', 'u', 'n', ' ',\n3, 'F', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'G', 'u', ' ', 5, 'K', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n4, 'J', 'u', 'n', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'C', 'e', ' ', 3, 'J', 'u', ' ',\n3, 'B', 'o', ' ', 3, 'Z', 'e', ' ', 4, 'Q', 'i', 'e', ' ', 4, 'T', 'u', 'o', ' ', 4, 'L', 'u', 'o', ' ', 4, 'D', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 4, 'R', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'H', 'u', ' ',\n4, 'S', 'h', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'L', 'u', ' ', 3, 'W', 'u', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'J', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n4, 'M', 'e', 'i', ' ', 4, 'F', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'e', ' ', 4, 'H', 'o', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'M', 'i', 'a', 'o', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'S', 'i', 'k', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'H', 'e', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'G', 'a', 'o', ' ', 4, 'F', 'e', 'i', ' ', 4, 'R', 'u', 'o', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'o', 'u', ' ', 4, 'N', 'i', 'e', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'C', 'u', 'a', 'n', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 3, 'L', 'i', ' ', 3, 'B', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n4, 'C', 'h', 'u', ' ', 5, 'S', 'h', 'a', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n4, 'L', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'u', ' ', 3, 'L', 'i', ' ', 4, 'H', 'u', 'i', ' ', 3, 'B', 'i', ' ',\n3, 'D', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'S', 'e', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n4, 'P', 'a', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'D', 'o', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'M', 'i', 'e', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n3, 'Z', 'e', ' ', 3, 'X', 'i', ' ', 4, 'G', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'H', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'K', 'o', 'u', ' ', 3, 'C', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ', 4, 'G', 'u', 'i', ' ',\n3, 'S', 'u', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'L', 'u', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ',\n5, 'C', 'u', 'a', 'n', ' ', 7, 'S', 'a', 's', 'a', 'r', 'a', ' ', 4, 'S', 'u', 'o', ' ', 3, 'L', 'e', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'a', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 3, 'M', 'i', ' ', 3, 'S', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'K', 'u', 'i', ' ',\n4, 'D', 'a', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'D', 'e', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'n', ' ', 4, 'L', 'a', 'o', ' ',\n4, 'Z', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'D', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'P', 'a', 'i', ' ',\n5, 'H', 'a', 't', 'a', ' ', 4, 'P', 'a', 'i', ' ', 4, 'G', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'D', 'u', ' ', 3, 'L', 'u', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'B', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'S', 'a', 'i', ' ', 3, 'K', 'e', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'B', 'o', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'L', 'a', 'i', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'H', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'T', 'a', 'i', ' ',\n3, 'T', 'i', ' ', 3, 'M', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ', 5, 'H', 'a', 't', 'a', ' ', 5, 'T', 'e', 'n', 'g', ' ',\n6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'F', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'K', 'u', 'j', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'L', 'a', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 8, 'S', 'h', 'i', 'n', 's', 'h', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'L', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'Y', 'u', 'e', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'S', 'i', ' ', 4, 'L', 'u', 'o', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'X', 'u', ' ', 3, 'M', 'i', ' ', 3, 'D', 'i', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'N', 'u', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'L', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'N', 'i', ' ', 4, 'C', 'u', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'K', 'u', 'm', 'e', ' ', 3, 'B', 'i', ' ', 4, 'B', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'S', 'h', 'a', ' ', 5, 'K', 'a', 'n', 'g', ' ',\n4, 'R', 'o', 'u', ' ', 4, 'F', 'e', 'n', ' ', 3, 'B', 'i', ' ', 4, 'C', 'u', 'i', ' ', 3, 'L', 'i', ' ', 4, 'C', 'h', 'i', ' ',\n9, 'N', 'u', 'k', 'a', 'm', 'i', 's', 'o', ' ', 3, 'R', 'o', ' ', 3, 'B', 'a', ' ', 3, 'L', 'i', ' ', 4, 'G', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n3, 'P', 'o', ' ', 3, 'M', 'o', ' ', 3, 'C', 'u', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'L', 'i', ' ',\n3, 'S', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'L', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'S', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 3, 'C', 'e', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'L', 'i', 'n', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'i', ' ', 4, 'F', 'e', 'n', ' ', 3, 'J', 'i', ' ', 7, 'S', 'u', 'k', 'u', 'm', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'a', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 3, 'L', 'u', ' ', 3, 'J', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'u', 'i', ' ', 4, 'B', 'a', 'i', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 6, 'K', 'o', 'u', 'j', 'i', ' ',\n4, 'S', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n4, 'H', 'o', 'u', ' ', 3, 'X', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'H', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ',\n3, 'C', 'i', ' ', 3, 'L', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'F', 'u', ' ', 3, 'N', 'i', ' ', 4, 'B', 'e', 'i', ' ',\n3, 'G', 'u', ' ', 4, 'X', 'i', 'u', ' ', 4, 'G', 'a', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 7, 'S', 'u', 'k', 'u', 'm', 'o', ' ',\n4, 'C', 'a', 'o', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'M', 'i', ' ', 4, 'S', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n4, 'Z', 'a', 'o', ' ', 5, 'K', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 4, 'S', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ',\n4, 'N', 'u', 'o', ' ', 3, 'X', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'B', 'o', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'N', 'u', 'o', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'u', 'o', ' ', 3, 'D', 'i', ' ', 4, 'N', 'i', 'e', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'L', 'a', 'n', ' ',\n3, 'M', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 3, 'X', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n4, 'J', 'i', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'J', 'i', ' ', 4, 'C', 'h', 'a', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'Y', 'u', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'H', 'e', ' ', 4, 'W', 'a', 'n', ' ', 4, 'R', 'e', 'n', ' ',\n4, 'W', 'e', 'n', ' ', 4, 'W', 'e', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'N', 'a', ' ', 3, 'Z', 'i', ' ', 4, 'T', 'o', 'u', ' ',\n4, 'N', 'i', 'u', ' ', 4, 'F', 'o', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'S', 'h', 'u', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'P', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'S', 'h', 'a', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ', 4, 'F', 'e', 'n', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'R', 'e', 'n', ' ', 4, 'D', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 3, 'S', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'S', 'u', 'o', ' ', 4, 'C', 'u', 'i', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'K', 'i', 'n', 'u', ' ', 4, 'J', 'i', 'n', ' ',\n3, 'F', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'C', 'i', ' ', 3, 'Z', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'L', 'e', 'i', ' ', 3, 'X', 'i', ' ', 3, 'F', 'u', ' ', 4, 'X', 'i', 'e', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'Q', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'T', 'u', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'D', 'a', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'S', 'h', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Z', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ',\n4, 'B', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'M', 'o', ' ', 4, 'S', 'h', 'u', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'W', 'a', 't', 'a', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'R', 'e', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'G', 'u', 'a', ' ', 4, 'B', 'a', 'i', ' ', 4, 'J', 'u', 'e', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ',\n3, 'C', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ', 3, 'K', 'u', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'G', 'a', 'i', ' ', 4, 'L', 'u', 'o', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'G', 'e', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'L', 'e', 'i', ' ', 4, 'X', 'i', 'e', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'L', 'u', 'n', ' ',\n4, 'D', 'i', 'e', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'S', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 3, 'L', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'W', 'a', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'u', ' ',\n3, 'T', 'i', ' ', 4, 'X', 'i', 'u', ' ', 4, 'X', 'i', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'D', 'u', 'i', ' ', 4, 'K', 'u', 'n', ' ', 3, 'F', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'H', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n4, 'S', 'o', 'k', ' ', 5, 'K', 'a', 's', 'e', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 4, 'D', 'u', 'o', ' ', 3, 'L', 'i', ' ',\n3, 'L', 'u', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'Q', 'i', ' ',\n3, 'Q', 'i', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'W', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'T', 'a', 'o', ' ', 4, 'W', 'a', 'n', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'C', 'a', 'i', ' ', 4, 'G', 'u', 'o', ' ', 4, 'C', 'u', 'i', ' ',\n4, 'L', 'u', 'n', ' ', 4, 'L', 'i', 'u', ' ', 3, 'Q', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'Q', 'i', 'e', ' ', 4, 'T', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n4, 'G', 'u', 'n', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'Z', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'R', 'u', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n4, 'F', 'a', 'n', ' ', 3, 'L', 'u', ' ', 3, 'X', 'u', ' ', 6, 'Y', 'i', 'n', 'g', 'l', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 7, 'K', 'a', 's', 'u', 'r', 'i', ' ',\n3, 'X', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'K', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'D', 'u', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'M', 'i', 'n', ' ',\n5, 'M', 'i', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'B', 'a', 'o', ' ', 3, 'S', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'W', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'o', 'u', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'T', 'i', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ',\n4, 'X', 'i', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'X', 'u', ' ', 5, 'N', 'a', 'w', 'a', ' ', 7, 'O', 'd', 'o', 's', 'h', 'i', ' ',\n5, 'G', 'e', 'n', 'g', ' ', 4, 'S', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'h', 'u', 'i', ' ',\n3, 'N', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'P', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'C', 'u', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'X', 'i', 'a', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ',\n3, 'X', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 3, 'F', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'G', 'a', 'o', ' ', 3, 'R', 'u', ' ', 3, 'H', 'u', ' ', 4, 'Z', 'a', 'i', ' ', 5, 'T', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'S', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 5, 'H', 'o', 'r', 'o', ' ', 4, 'C', 'a', 'i', ' ',\n3, 'B', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'C', 'u', ' ', 3, 'L', 'i', ' ', 4, 'S', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'X', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'L', 'u', ' ', 3, 'M', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'S', 'u', 'i', ' ', 4, 'F', 'a', 'n', ' ',\n6, 'S', 'h', 'u', 'a', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'S', 'a', 'o', ' ', 4, 'M', 'o', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 4, 'S', 'e', 'm', ' ', 3, 'X', 'i', ' ', 5, 'J', 'u', 'n', 'g', ' ', 4, 'X', 'i', 'u', ' ',\n4, 'R', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'Z', 'u', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'F', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'u', 'o', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'R', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'R', 'u', 'i', ' ', 4, 'X', 'i', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'a', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'U', 'n', ' ', 3, 'D', 'a', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 3, 'X', 'i', ' ',\n3, 'S', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'N', 'a', 'o', ' ',\n4, 'S', 'u', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'S', 'h', 'a', 'i', ' ', 3, 'X', 'u', ' ', 3, 'J', 'i', ' ', 4, 'B', 'i', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'P', 'u', ' ', 4, 'X', 'u', 'n', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ', 3, 'M', 'o', ' ', 4, 'L', 'e', 'i', ' ', 4, 'X', 'i', 'e', ' ', 5, 'Z', 'u', 'a', 'n', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'X', 'u', ' ', 4, 'L', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'K', 'o', 'u', ' ', 3, 'L', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'C', 'a', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 3, 'X', 'i', ' ', 4, 'D', 'a', 'o', ' ',\n4, 'L', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'S', 'i', ' ', 4, 'J', 'i', 'u', ' ', 3, 'Y', 'u', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'H', 'e', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'J', 'i', ' ',\n4, 'W', 'a', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'P', 'i', ' ', 4, 'S', 'h', 'a', ' ', 5, 'G', 'a', 'n', 'g', ' ', 3, 'N', 'a', ' ',\n4, 'R', 'e', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ', 4, 'F', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'W', 'e', 'n', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'N', 'i', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 3, 'F', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'Z', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n3, 'X', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'B', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 3, 'K', 'u', ' ', 4, 'R', 'a', 'o', ' ', 4, 'D', 'i', 'e', ' ', 5, 'H', 'e', 'n', 'g', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'G', 'e', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ',\n3, 'X', 'i', ' ', 4, 'S', 'u', 'i', ' ', 4, 'T', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'T', 'i', ' ', 3, 'J', 'i', ' ',\n3, 'X', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'X', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'F', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n5, 'B', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'T', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ', 3, 'L', 'u', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'K', 'e', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'T', 'i', ' ', 5, 'M', 'i', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'S', 'i', ' ', 4, 'D', 'u', 'o', ' ', 5, 'D', 'u', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'G', 'o', 'u', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'D', 'i', ' ',\n3, 'L', 'u', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 3, 'F', 'u', ' ',\n3, 'R', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'G', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'M', 'a', 'n', ' ',\n4, 'L', 'e', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 4, 'M', 'o', 'u', ' ', 4, 'S', 'a', 'o', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'Z', 'a', 'o', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 4, 'F', 'o', 'u', ' ', 4, 'X', 'i', 'e', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n4, 'F', 'o', 'u', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'F', 'o', 'u', ' ', 8, 'K', 'a', 'a', 'k', 'e', 'r', 'u', ' ', 3, 'B', 'o', ' ', 5, 'P', 'i', 'n', 'g', ' ',\n4, 'H', 'o', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ',\n5, 'G', 'u', 'a', 'n', ' ', 4, 'Z', 'u', 'n', ' ', 4, 'T', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'W', 'e', 'n', 'g', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 4, 'T', 'a', 'n', ' ', 3, 'L', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'W', 'a', 'n', 'g', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 3, 'F', 'u', ' ',\n3, 'M', 'i', ' ', 3, 'F', 'a', ' ', 3, 'G', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'J', 'u', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'G', 'u', ' ', 4, 'M', 'i', 'n', ' ', 5, 'G', 'a', 'n', 'g', ' ', 3, 'B', 'a', ' ', 4, 'G', 'u', 'a', ' ', 3, 'T', 'i', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'L', 'i', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'Z', 'u', 'i', ' ',\n4, 'G', 'u', 'a', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'A', 'n', ' ', 3, 'F', 'a', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 3, 'S', 'i', ' ', 3, 'P', 'i', ' ', 3, 'M', 'a', ' ', 4, 'L', 'i', 'u', ' ',\n3, 'B', 'a', ' ', 3, 'F', 'a', ' ', 3, 'L', 'i', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 3, 'B', 'i', ' ',\n3, 'J', 'i', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ', 3, 'J', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n3, 'M', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'L', 'u', 'o', ' ', 3, 'P', 'i', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ',\n5, 'L', 'u', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'M', 'i', 'e', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'T', 'a', ' ', 4, 'M', 'e', 'i', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'F', 'e', 'n', ' ', 3, 'B', 'a', ' ', 4, 'G', 'a', 'o', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'D', 'i', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'Q', 'u', 'n', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'Z', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 9, 'Y', 'a', 's', 'h', 'i', 'n', 'a', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ',\n5, 'G', 'e', 'n', 'g', ' ', 4, 'N', 'o', 'u', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'W', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'C', 'u', 'i', ' ', 3, 'F', 'u', ' ', 4, 'X', 'i', 'a', ' ', 4, 'P', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n3, 'L', 'a', ' ', 3, 'Y', 'i', ' ', 3, 'P', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'Q', 'u', ' ', 3, 'X', 'i', ' ', 4, 'X', 'i', 'e', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ',\n3, 'Q', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'S', 'e', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'C', 'u', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'T', 'a', 'o', ' ',\n4, 'S', 'h', 'a', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'o', 'u', ' ', 3, 'H', 'e', ' ',\n3, 'H', 'e', ' ', 4, 'H', 'a', 'n', ' ', 3, 'A', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n3, 'Q', 'u', ' ', 4, 'L', 'i', 'n', ' ', 4, 'P', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'A', 'o', ' ', 4, 'F', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'H', 'u', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'D', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ',\n4, 'K', 'a', 'o', ' ', 4, 'M', 'a', 'o', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'Q', 'i', ' ', 4, 'G', 'o', 'u', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'D', 'i', 'e', ' ', 4, 'D', 'i', 'e', ' ', 3, 'E', 'r', ' ', 5, 'S', 'h', 'u', 'a', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n3, 'E', 'r', ' ', 4, 'N', 'a', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ',\n5, 'G', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'H', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'P', 'a', ' ', 3, 'P', 'i', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'S', 'i', ' ', 4, 'C', 'h', 'u', ' ', 4, 'J', 'i', 'a', ' ', 3, 'J', 'u', ' ', 3, 'H', 'e', ' ',\n4, 'C', 'h', 'u', ' ', 4, 'L', 'a', 'o', ' ', 4, 'L', 'u', 'n', ' ', 3, 'J', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'O', 'u', ' ',\n4, 'L', 'o', 'u', ' ', 4, 'N', 'o', 'u', ' ', 4, 'G', 'o', 'u', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 4, 'L', 'o', 'u', ' ',\n3, 'J', 'i', ' ', 4, 'L', 'a', 'o', ' ', 4, 'H', 'u', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'M', 'o', ' ', 5, 'H', 'u', 'a', 'i', ' ',\n3, 'E', 'r', ' ', 4, 'Z', 'h', 'e', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 3, 'D', 'a', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n4, 'Q', 'i', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'C', 'h', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n5, 'G', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'D', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'C', 'h', 'e', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'W', 'a', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'E', 'r', ' ', 3, 'Y', 'a', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'G', 'u', 'a', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'L', 'i', 'e', ' ', 4, 'P', 'i', 'n', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'J', 'u', ' ', 3, 'B', 'i', ' ', 3, 'D', 'i', ' ', 4, 'G', 'u', 'o', ' ', 4, 'W', 'e', 'n', ' ',\n3, 'X', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ', 8, 'S', 'h', 'i', 'k', 'a', 't', 'o', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 10, 'T', 's', 'u', 'r', 'a', 'n', 'e', 'r', 'u', ' ', 4, 'K', 'u', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'W', 'e', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'A', 'o', ' ',\n6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'J', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'S', 'i', ' ', 3, 'S', 'u', ' ',\n3, 'Y', 'i', ' ', 3, 'S', 'u', ' ', 3, 'S', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'R', 'o', 'u', ' ',\n3, 'Y', 'i', ' ', 3, 'L', 'e', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'K', 'e', 'n', ' ', 4, 'C', 'a', 'o', ' ',\n3, 'G', 'e', ' ', 3, 'D', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'R', 'e', 'n', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'R', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'D', 'u', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 3, 'W', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'H', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'F', 'e', 'i', ' ', 4, 'F', 'e', 'n', ' ', 4, 'P', 'e', 'i', ' ',\n5, 'P', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'N', 'a', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 4, 'K', 'e', 'n', ' ', 4, 'R', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'J', 'i', 'n', ' ', 3, 'P', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'K', 'e', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'D', 'i', 'e', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 3, 'B', 'a', ' ', 3, 'B', 'o', ' ', 3, 'Q', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'G', 'u', 'a', ' ', 4, 'T', 'a', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'K', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'N', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 3, 'F', 'u', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'P', 'e', 'i', ' ', 4, 'J', 'i', 'a', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'M', 'u', ' ', 3, 'Q', 'u', ' ', 3, 'H', 'u', ' ', 3, 'K', 'e', ' ', 3, 'Y', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'X', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 3, 'K', 'a', ' ',\n3, 'L', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'N', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'a', ' ',\n3, 'Y', 'i', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ', 3, 'G', 'e', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 3, 'E', 'r', ' ', 2, 'E', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 5, 'N', 'e', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 4, 'G', 'u', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'C', 'u', 'i', ' ', 4, 'M', 'e', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'C', 'u', 'i', ' ', 4, 'X', 'i', 'e', ' ',\n3, 'M', 'o', ' ', 4, 'M', 'a', 'i', ' ', 3, 'J', 'i', ' ', 11, 'O', 'b', 'i', 'y', 'a', 'a', 'k', 'a', 's', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'S', 'a', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'N', 'a', 'o', ' ', 3, 'M', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'L', 'u', 'a', 'n', ' ',\n4, 'W', 'a', 'n', ' ', 3, 'B', 'o', ' ', 4, 'W', 'e', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'C', 'u', 'o', ' ', 4, 'L', 'i', 'e', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'X', 'i', 'e', ' ', 3, 'D', 'e', ' ',\n4, 'Z', 'u', 'i', ' ', 3, 'C', 'u', ' ', 4, 'X', 'i', 'u', ' ', 4, 'X', 'i', 'n', ' ', 4, 'T', 'u', 'o', ' ', 4, 'P', 'a', 'o', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'N', 'e', 'i', ' ', 3, 'F', 'u', ' ', 4, 'D', 'o', 'u', ' ', 4, 'T', 'u', 'o', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n4, 'N', 'o', 'y', ' ', 3, 'P', 'i', ' ', 3, 'G', 'u', ' ', 4, 'G', 'u', 'a', ' ', 3, 'L', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'C', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'P', 'i', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'L', 'u', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 4, 'K', 'u', 'i', ' ', 5, 'C', 'h', 'u', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'N', 'e', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 3, 'L', 'a', ' ',\n3, 'Y', 'i', ' ', 3, 'A', 'n', ' ', 4, 'R', 'e', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'F', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'J', 'u', ' ', 4, 'F', 'e', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n3, 'P', 'i', ' ', 4, 'G', 'u', 'o', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'M', 'e', 'i', ' ',\n5, 'R', 'u', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'C', 'o', 'u', ' ', 4, 'G', 'u', 'a', ' ', 3, 'O', 'u', ' ',\n3, 'D', 'i', ' ', 3, 'A', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'N', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ', 2, 'E', ' ', 4, 'S', 'a', 'i', ' ',\n3, 'T', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'u', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'D', 'u', 'a', 'n', ' ', 3, 'B', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'N', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'W', 'a', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'T', 'u', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'L', 'u', ' ', 3, 'W', 'a', ' ', 4, 'S', 'o', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'S', 'u', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 3, 'G', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'B', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ',\n3, 'P', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'G', 'a', 'o', ' ', 3, 'L', 'u', ' ', 4, 'B', 'i', 'n', ' ', 3, 'O', 'u', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'G', 'u', 'o', ' ', 5, 'P', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'u', 'a', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 3, 'X', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n3, 'L', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'T', 'a', 'r', 'a', ' ',\n5, 'C', 'h', 'u', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'N', 'i', ' ', 4, 'Z', 'h', 'a', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 4, 'C', 'u', 'i', ' ', 4, 'G', 'u', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'W', 'u', ' ', 4, 'C', 'u', 'i', ' ', 4, 'R', 'u', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'F', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'a', ' ',\n4, 'D', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'L', 'a', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 4, 'T', 'u', 'n', ' ', 3, 'G', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'C', 'u', 'i', ' ',\n4, 'B', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ', 3, 'R', 'u', ' ', 4, 'H', 'u', 'o', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'K', 'u', 'a', 'n', ' ', 3, 'L', 'a', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n4, 'H', 'u', 'o', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 3, 'Q', 'u', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 5, 'L', 'u', 'a', 'n', ' ',\n3, 'N', 'i', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'W', 'o', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'N', 'i', 'e', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ', 4, 'G', 'a', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'G', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'X', 'i', 'u', ' ', 4, 'T', 'a', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'J', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'C', 'h', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'J', 'i', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'J', 'u', ' ', 4, 'J', 'i', 'u', ' ',\n4, 'X', 'i', 'n', ' ', 4, 'S', 'h', 'e', ' ', 4, 'S', 'h', 'e', ' ', 7, 'Y', 'a', 'd', 'o', 'r', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'P', 'u', ' ',\n3, 'P', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ', 4, 'T', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'u', 'n', ' ',\n4, 'X', 'i', 'a', ' ', 3, 'W', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'D', 'a', 'o', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'P', 'a', ' ', 4, 'T', 'a', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 7, 'H', 'e', 's', 'a', 'k', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'C', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'Z', 'e', ' ', 4, 'D', 'u', 'o', ' ',\n3, 'B', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'G', 'e', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'L', 'u', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'F', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'B', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'o', 'u', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 4, 'D', 'i', 'e', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'a', ' ',\n3, 'Y', 'i', ' ', 4, 'S', 'a', 'o', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'C', 'a', 'o', ' ', 4, 'L', 'o', 'u', ' ', 4, 'D', 'a', 'i', ' ',\n5, 'S', 'o', 'r', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 7, 'Y', 'o', 'f', 'u', 'n', 'e', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ',\n3, 'L', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'Q', 'i', ' ', 3, 'L', 'u', ' ', 3, 'L', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'e', 'n', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'S', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'C', 'a', 'o', ' ', 4, 'C', 'a', 'o', ' ', 3, 'Y', 'i', ' ',\n3, 'L', 'e', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'A', 'i', ' ', 4, 'N', 'a', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'e', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'e', ' ', 4, 'G', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n5, 'S', 'h', 'u', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'T', 'u', ' ', 4, 'X', 'i', 'a', ' ', 3, 'Q', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ',\n3, 'Z', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'T', 'u', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'W', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'R', 'e', 'n', ' ', 4, 'F', 'o', 'u', ' ', 4, 'K', 'o', 'u', ' ',\n4, 'J', 'i', 'e', ' ', 3, 'L', 'u', ' ', 3, 'X', 'u', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Q', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 3, 'B', 'a', ' ', 4, 'R', 'u', 'i', ' ', 4, 'X', 'i', 'n', ' ', 3, 'J', 'i', ' ',\n4, 'H', 'u', 'a', ' ', 4, 'H', 'u', 'a', ' ', 5, 'F', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'A', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'Y', 'a', ' ', 4, 'F', 'e', 'i', ' ', 5, 'R', 'e', 'n', 'g', ' ', 5, 'H', 'a', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'Y', 'o', 'u', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'S', 'u', 's', 'a', ' ', 4, 'W', 'e', 'i', ' ', 3, 'L', 'i', ' ',\n3, 'P', 'i', ' ', 2, 'E', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'C', 'a', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'S', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'R', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'T', 'i', 'a', 'o', ' ', 3, 'D', 'i', ' ', 5, 'M', 'i', 'a', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n3, 'K', 'e', ' ', 3, 'M', 'u', ' ', 4, 'P', 'e', 'i', ' ', 4, 'B', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ', 4, 'M', 'i', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'u', ' ', 3, 'P', 'i', ' ', 4, 'R', 'u', 'o', ' ', 3, 'K', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'N', 'i', ' ', 3, 'B', 'o', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'B', 'e', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 4, 'D', 'i', 'e', ' ', 4, 'N', 'i', 'e', ' ', 4, 'G', 'a', 'n', ' ', 3, 'H', 'u', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ', 3, 'F', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'G', 'u', ' ', 3, 'B', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'F', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'M', 'a', 'o', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Q', 'i', 'e', ' ',\n4, 'M', 'a', 'o', ' ', 4, 'M', 'a', 'o', ' ', 3, 'B', 'a', ' ', 3, 'Z', 'i', ' ', 3, 'M', 'o', ' ', 3, 'Z', 'i', ' ',\n3, 'D', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n4, 'X', 'u', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'G', 'e', ' ', 5, 'M', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'G', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n3, 'Y', 'u', ' ', 4, 'X', 'i', 'u', ' ', 3, 'Z', 'i', ' ', 4, 'L', 'i', 'e', ' ', 3, 'W', 'u', ' ', 3, 'J', 'i', ' ',\n4, 'K', 'u', 'i', ' ', 3, 'C', 'e', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'C', 'i', ' ', 4, 'G', 'o', 'u', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'Y', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'Z', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'C', 'h', 'a', ' ',\n3, 'F', 'a', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'R', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'X', 'u', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n4, 'G', 'a', 'i', ' ', 3, 'D', 'a', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'C', 'a', 'o', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'E', 'r', ' ', 3, 'A', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'T', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'L', 'a', 'o', ' ', 4, 'S', 'h', 'u', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'D', 'a', ' ', 4, 'J', 'i', 'a', ' ', 4, 'R', 'a', 'o', ' ',\n3, 'B', 'i', ' ', 3, 'Z', 'e', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'S', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'M', 'a', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n4, 'Y', 'a', 'o', ' ', 3, 'D', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'C', 'h', 'u', ' ', 4, 'D', 'o', 'u', ' ', 3, 'F', 'u', ' ',\n4, 'R', 'e', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'H', 'e', ' ', 3, 'B', 'i', ' ', 3, 'B', 'u', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'D', 'i', ' ', 3, 'T', 'u', ' ', 4, 'S', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n3, 'W', 'u', ' ', 4, 'B', 'i', 'e', ' ', 3, 'X', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ', 3, 'F', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'M', 'o', ' ', 3, 'L', 'i', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'Q', 'i', 'u', ' ', 4, 'S', 'h', 'a', ' ', 4, 'S', 'u', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n4, 'M', 'e', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'e', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'J', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'C', 'u', 'o', ' ', 4, 'W', 'a', 'n', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'C', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'Y', 'o', 'u', ' ',\n4, 'N', 'i', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 2, 'E', ' ',\n3, 'M', 'o', ' ', 4, 'W', 'e', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'N', 'a', 'n', ' ', 3, 'M', 'u', ' ', 4, 'K', 'a', 'n', ' ',\n4, 'L', 'a', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'W', 'o', ' ', 6, 'U', 's', 'a', 'g', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'N', 'u', 'c', ' ', 5, 'C', 'h', 'u', 'n', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'C', 'i', ' ', 4, 'W', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ',\n3, 'Q', 'u', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'G', 'u', ' ', 3, 'L', 'a', ' ',\n3, 'L', 'u', ' ', 3, 'J', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'J', 'u', 'n', ' ', 4, 'N', 'i', 'e', ' ', 4, 'K', 'u', 'n', ' ',\n3, 'H', 'e', ' ', 3, 'P', 'u', ' ', 3, 'Z', 'i', ' ', 4, 'G', 'a', 'o', ' ', 4, 'G', 'u', 'o', ' ', 3, 'F', 'u', ' ',\n4, 'L', 'u', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n4, 'M', 'e', 'n', ' ', 4, 'C', 'a', 'i', ' ', 3, 'B', 'a', ' ', 3, 'L', 'i', ' ', 3, 'T', 'u', ' ', 3, 'B', 'o', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'Q', 'i', 'n', ' ',\n3, 'D', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'P', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n4, 'T', 'a', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 3, 'G', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'A', 'n', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'J', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'D', 'a', 'o', ' ', 3, 'H', 'u', ' ', 3, 'Q', 'i', ' ', 3, 'H', 'e', ' ', 4, 'C', 'u', 'i', ' ', 4, 'T', 'a', 'o', ' ',\n5, 'C', 'h', 'u', 'n', ' ', 4, 'B', 'e', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'L', 'a', 'i', ' ',\n3, 'Q', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'S', 'h', 'a', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'Q', 'i', ' ', 4, 'W', 'a', 'n', ' ',\n3, 'C', 'e', ' ', 4, 'N', 'a', 'i', ' ', 11, 'K', 'u', 't', 'a', 'b', 'i', 'r', 'e', 'r', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'J', 'i', 'u', ' ', 4, 'T', 'i', 'e', ' ',\n4, 'L', 'u', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'Y', 'a', 'j', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'S', 'a', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'K', 'e', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'F', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n4, 'N', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 3, 'W', 'o', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'Y', 'u', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'A', 'n', ' ', 2, 'E', ' ', 4, 'L', 'u', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n4, 'H', 'u', 'o', ' ', 4, 'G', 'u', 'a', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'Z', 'u', 'o', ' ',\n3, 'J', 'u', ' ', 4, 'B', 'a', 'o', ' ', 4, 'R', 'o', 'u', ' ', 3, 'X', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'A', 'n', ' ',\n3, 'Q', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 3, 'L', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'P', 'e', 'n', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'H', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'T', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'Z', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'G', 'e', ' ', 4, 'J', 'i', 'e', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'P', 'u', ' ', 4, 'G', 'a', 'i', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'B', 'o', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'P', 'a', ' ', 3, 'J', 'i', ' ', 3, 'H', 'u', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 5, 'D', 'u', 'a', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'J', 'u', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'K', 'u', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Q', 'i', ' ',\n4, 'L', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Y', 'u', 'n', ' ',\n4, 'S', 'h', 'u', ' ', 3, 'D', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 7, 'S', 'u', 'k', 'u', 'm', 'o', ' ', 4, 'X', 'u', 'e', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 4, 'K', 'a', 'i', ' ', 4, 'K', 'u', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'P', 'a', 'i', ' ', 4, 'S', 'o', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'S', 'h', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Y', 'u', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'N', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'H', 'e', ' ',\n4, 'Q', 'u', 'e', ' ', 5, 'S', 'u', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'J', 'u', ' ', 3, 'X', 'i', ' ',\n5, 'P', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 3, 'X', 'u', ' ', 3, 'T', 'u', ' ', 4, 'L', 'i', 'u', ' ', 3, 'W', 'o', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Z', 'u', ' ', 3, 'P', 'o', ' ', 4, 'C', 'u', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n4, 'C', 'h', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'P', 'a', 'n', ' ', 3, 'P', 'u', ' ', 3, 'P', 'u', ' ',\n3, 'N', 'a', ' ', 5, 'S', 'h', 'u', 'o', ' ', 3, 'X', 'i', ' ', 4, 'F', 'e', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'R', 'u', 'o', ' ', 5, 'C', 'a', 'n', 'g', ' ', 3, 'E', 'n', ' ', 3, 'M', 'i', ' ',\n4, 'H', 'a', 'o', ' ', 4, 'S', 'u', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'S', 'o', 'u', ' ', 3, 'X', 'u', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'X', 'i', ' ', 3, 'G', 'u', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'W', 'e', 'n', 'g', ' ',\n4, 'G', 'a', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'S', 'h', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 3, 'R', 'u', ' ',\n4, 'S', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ', 3, 'B', 'i', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'n', ' ', 3, 'Z', 'a', ' ', 4, 'X', 'i', 'u', ' ', 3, 'C', 'e', ' ', 4, 'H', 'a', 'i', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'J', 'i', ' ', 3, 'L', 'i', ' ', 4, 'C', 'a', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'M', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'M', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'A', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'J', 'i', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'J', 'i', 'e', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'T', 'u', 'i', ' ', 4, 'C', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n3, 'B', 'i', ' ', 3, 'L', 'u', ' ', 3, 'S', 'u', ' ', 3, 'B', 'u', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n4, 'G', 'u', 'n', ' ', 4, 'H', 'a', 'n', ' ', 3, 'D', 'i', ' ', 3, 'S', 'u', ' ', 3, 'L', 'u', ' ', 4, 'S', 'h', 'e', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'M', 'i', 'e', ' ', 4, 'X', 'u', 'n', ' ', 4, 'M', 'a', 'n', ' ', 3, 'B', 'o', ' ',\n3, 'D', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'S', 'e', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'H', 'u', ' ', 3, 'A', 'o', ' ', 3, 'M', 'i', ' ', 4, 'L', 'o', 'u', ' ', 3, 'C', 'u', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n4, 'C', 'a', 'i', ' ', 3, 'P', 'o', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'J', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'K', 'u', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'H', 'u', ' ', 4, 'S', 'h', 'a', ' ', 4, 'K', 'o', 'u', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'M', 'a', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 7, 'S', 'o', 'n', 'o', 'k', 'o', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'K', 'o', 'u', ' ', 3, 'A', 'i', ' ', 3, 'B', 'i', ' ', 3, 'L', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'J', 'i', ' ', 4, 'X', 'u', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'O', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'R', 'u', 'i', ' ',\n4, 'R', 'u', 'i', ' ', 4, 'L', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'H', 'u', 'a', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'Q', 'u', ' ',\n3, 'L', 'u', ' ', 4, 'R', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 2, 'E', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'F', 'a', ' ', 3, 'R', 'u', ' ', 4, 'F', 'e', 'n', ' ', 4, 'K', 'u', 'i', ' ',\n5, 'S', 'h', 'u', 'n', ' ', 4, 'R', 'u', 'i', ' ', 3, 'Y', 'a', ' ', 3, 'X', 'u', ' ', 3, 'F', 'u', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'D', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'S', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'S', 'u', 'n', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n3, 'S', 'i', ' ', 5, 'N', 'o', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'Y', 'u', ' ',\n3, 'X', 'i', ' ', 4, 'H', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'H', 'a', 'o', ' ', 3, 'A', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'J', 'i', ' ', 3, 'C', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'u', 'a', 'n', ' ',\n4, 'M', 'i', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'e', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'K', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'D', 'a', ' ', 3, 'T', 'i', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 3, 'B', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 3, 'G', 'u', ' ', 4, 'X', 'i', 'e', ' ', 4, 'S', 'h', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'K', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'S', 'a', ' ', 4, 'X', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'H', 'i', 'e', ' ', 4, 'S', 'o', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'X', 'u', 'n', ' ', 4, 'D', 'u', 'i', ' ',\n4, 'P', 'i', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'N', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'M', 'a', 'i', ' ', 3, 'R', 'u', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 4, 'T', 'a', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n3, 'E', 'r', ' ', 3, 'N', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 3, 'F', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'K', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'M', 'i', ' ', 4, 'L', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 5, 'C', 'a', 'n', 'g', ' ',\n5, 'M', 'i', 'a', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'O', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'S', 'u', ' ', 3, 'L', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'X', 'u', ' ', 4, 'X', 'i', 'e', ' ', 3, 'L', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'L', 'a', ' ', 4, 'L', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'B', 'e', 'i', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'M', 'o', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'T', 'u', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'G', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'L', 'i', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'A', 'i', ' ', 4, 'L', 'i', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 4, 'L', 'a', 'i', ' ', 4, 'H', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 3, 'W', 'u', ' ', 4, 'R', 'u', 'i', ' ',\n4, 'R', 'u', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'S', 'u', ' ', 4, 'T', 'u', 'i', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'P', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'X', 'u', 'n', ' ', 3, 'J', 'i', ' ',\n6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'M', 'o', ' ', 5, 'H', 'a', 'g', 'i', ' ', 3, 'S', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ',\n4, 'N', 'i', 'e', ' ', 3, 'B', 'o', ' ', 5, 'R', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n3, 'J', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Q', 'u', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'F', 'a', 'n', ' ', 3, 'M', 'i', ' ', 4, 'L', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'L', 'a', 'n', ' ',\n3, 'J', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 8, 'K', 'a', 't', 's', 'u', 'r', 'a', ' ', 4, 'L', 'e', 'i', ' ', 4, 'L', 'e', 'i', ' ', 4, 'H', 'u', 'a', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'K', 'u', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'i', ' ',\n3, 'L', 'i', ' ', 3, 'J', 'i', ' ', 3, 'M', 'i', ' ', 4, 'L', 'e', 'i', ' ', 5, 'H', 'u', 'a', 'i', ' ', 4, 'L', 'u', 'o', ' ',\n3, 'J', 'i', ' ', 4, 'K', 'u', 'i', ' ', 3, 'L', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'n', ' ', 4, 'B', 'i', 'e', ' ',\n3, 'H', 'u', ' ', 3, 'H', 'u', ' ', 3, 'L', 'u', ' ', 4, 'N', 'u', 'e', ' ', 3, 'L', 'u', ' ', 3, 'S', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 3, 'H', 'u', ' ', 3, 'X', 'u', ' ', 4, 'C', 'u', 'o', ' ',\n3, 'F', 'u', ' ', 3, 'X', 'u', ' ', 3, 'X', 'u', ' ', 3, 'L', 'u', ' ', 3, 'H', 'u', ' ', 3, 'Y', 'u', ' ',\n4, 'H', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 4, 'B', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'S', 'h', 'e', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'a', 'n', ' ',\n3, 'Z', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'G', 'e', ' ', 4, 'S', 'u', 'i', ' ',\n4, 'X', 'i', 'a', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'M', 'a', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 2, 'E', ' ', 3, 'P', 'a', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'W', 'e', 'n', ' ', 4, 'R', 'u', 'i', ' ', 5, 'B', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'u', 'e', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'R', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Q', 'i', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n3, 'Y', 'a', ' ', 3, 'C', 'i', ' ', 3, 'M', 'u', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'F', 'u', ' ', 4, 'R', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'F', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'D', 'o', 'u', ' ', 5, 'P', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'N', 'i', ' ',\n3, 'T', 'e', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'Y', 'o', 'u', ' ', 3, 'H', 'e', ' ', 4, 'H', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'L', 'i', ' ', 3, 'F', 'u', ' ',\n4, 'R', 'a', 'n', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'G', 'o', 'u', ' ', 3, 'P', 'i', ' ', 3, 'B', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'B', 'i', 'e', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'R', 'a', 'n', ' ',\n3, 'Q', 'u', ' ', 4, 'S', 'h', 'e', ' ', 4, 'T', 'i', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'D', 'a', 'n', ' ',\n3, 'G', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'L', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 4, 'M', 'o', 'u', ' ',\n3, 'G', 'e', ' ', 3, 'C', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 3, 'W', 'a', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'K', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n3, 'H', 'a', ' ', 4, 'S', 'h', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ',\n4, 'Q', 'i', 'e', ' ', 4, 'G', 'u', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'M', 'a', 'n', ' ', 4, 'E', 'b', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'a', ' ', 4, 'R', 'a', 'o', ' ', 3, 'S', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n4, 'L', 'i', 'e', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 5, 'S', 'h', 'u', 'i', ' ',\n4, 'C', 'h', 'e', ' ', 4, 'B', 'a', 'i', ' ', 2, 'E', ' ', 4, 'H', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'F', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ',\n3, 'W', 'u', ' ', 3, 'F', 'u', ' ', 3, 'L', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'D', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'G', 'u', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n4, 'F', 'e', 'i', ' ', 3, 'J', 'u', ' ', 3, 'M', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'Y', 'u', ' ',\n4, 'J', 'u', 'n', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'M', 'e', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'S', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'L', 'u', 'n', ' ', 3, 'L', 'i', ' ', 4, 'D', 'i', 'e', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'T', 'a', 'o', ' ', 4, 'K', 'u', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 3, 'P', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'D', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'S', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'R', 'u', 'i', ' ', 3, 'N', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ',\n4, 'G', 'u', 'o', ' ', 4, 'W', 'a', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 2, 'E', ' ', 4, 'B', 'a', 'n', ' ', 3, 'D', 'i', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 4, 'C', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n3, 'L', 'a', ' ', 3, 'K', 'e', ' ', 3, 'J', 'i', ' ', 3, 'H', 'e', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'M', 'a', 'i', ' ',\n3, 'X', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'S', 'h', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'F', 'u', ' ', 5, 'R', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'Y', 'o', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'M', 'a', 'o', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'T', 'i', ' ', 3, 'F', 'u', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'L', 'a', ' ', 3, 'D', 'u', ' ', 3, 'H', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 4, 'D', 'i', 'e', ' ', 3, 'L', 'i', ' ', 4, 'G', 'u', 'a', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 3, 'S', 'i', ' ', 3, 'X', 'i', ' ', 3, 'C', 'i', ' ', 3, 'X', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 5, 'W', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ', 4, 'B', 'a', 'n', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 3, 'W', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'Q', 'i', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'B', 'i', ' ', 4, 'H', 'u', 'a', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'D', 'u', ' ',\n4, 'N', 'a', 'i', ' ', 3, 'H', 'e', ' ', 3, 'H', 'u', ' ', 4, 'H', 'u', 'i', ' ', 3, 'M', 'a', ' ', 5, 'M', 'i', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 4, 'W', 'e', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'a', 'n', 'g', ' ',\n3, 'S', 'o', ' ', 4, 'E', 'b', 'i', ' ', 4, 'M', 'a', 'n', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'C', 'a', 'o', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'D', 'i', ' ', 3, 'A', 'o', ' ', 3, 'L', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'Q', 'u', ' ', 3, 'P', 'i', ' ', 3, 'Y', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 4, 'L', 'o', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'W', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'W', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Z', 'h', 'e', ' ', 3, 'M', 'a', ' ', 3, 'M', 'a', ' ', 4, 'G', 'u', 'o', ' ', 4, 'L', 'i', 'u', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'X', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 9, 'K', 'a', 'm', 'a', 'k', 'i', 'r', 'i', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'M', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'S', 'i', ' ',\n4, 'Q', 'i', 'u', ' ', 3, 'T', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n3, 'Q', 'u', ' ', 4, 'B', 'i', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'P', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 3, 'X', 'i', ' ',\n3, 'J', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 4, 'L', 'a', 'o', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'R', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'M', 'o', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 3, 'S', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'X', 'i', 'e', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 3, 'D', 'a', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'C', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'L', 'u', 'o', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'i', ' ', 3, 'L', 'i', ' ',\n3, 'Z', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'Z', 'e', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Q', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n4, 'H', 'a', 'o', ' ', 5, 'R', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'J', 'i', 'e', ' ', 4, 'B', 'i', 'n', ' ',\n3, 'H', 'e', ' ', 4, 'M', 'i', 'e', ' ', 4, 'F', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'L', 'a', ' ',\n3, 'M', 'i', ' ', 3, 'L', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'L', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'N', 'i', 'e', ' ',\n3, 'L', 'u', ' ', 3, 'D', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 5, 'B', 'e', 'n', 'g', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'C', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'D', 'u', ' ', 4, 'C', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'X', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'N', 'i', 'u', ' ', 4, 'P', 'e', 'i', ' ', 3, 'N', 'u', ' ',\n4, 'X', 'i', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'M', 'o', ' ', 3, 'E', 'r', ' ', 3, 'K', 'e', ' ', 4, 'M', 'i', 'e', ' ',\n3, 'X', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'K', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 3, 'H', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'D', 'a', 'o', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'D', 'a', 'o', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 3, 'Y', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'B', 'u', ' ', 4, 'G', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'a', ' ',\n3, 'Y', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'F', 'u', ' ', 4, 'G', 'u', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n6, 'S', 'h', 'u', 'a', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'N', 'a', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ', 3, 'R', 'i', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Q', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'R', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'J', 'i', 'n', ' ', 4, 'J', 'u', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n4, 'M', 'e', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ', 3, 'A', 'o', ' ', 5, 'N', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 4, 'R', 'a', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 4, 'T', 'u', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 4, 'B', 'a', 'o', ' ', 4, 'P', 'a', 'o', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'Z', 'u', 'o', ' ', 3, 'B', 'i', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'T', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n3, 'H', 'e', ' ', 4, 'S', 'h', 'u', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'P', 'a', ' ',\n3, 'B', 'o', ' ', 3, 'D', 'i', ' ', 3, 'W', 'a', ' ', 3, 'F', 'u', ' ', 4, 'G', 'u', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'R', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'M', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'N', 'a', ' ', 4, 'K', 'o', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'B', 'e', 'i', ' ',\n4, 'G', 'u', 'n', ' ', 3, 'X', 'i', ' ', 3, 'N', 'e', ' ', 3, 'B', 'o', ' ', 5, 'H', 'o', 'r', 'o', ' ', 3, 'F', 'u', ' ',\n3, 'Y', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'K', 'u', ' ', 4, 'R', 'e', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'C', 'u', 'n', ' ', 3, 'M', 'o', ' ', 4, 'J', 'i', 'e', ' ', 3, 'E', 'r', ' ', 4, 'L', 'u', 'o', ' ', 3, 'R', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'C', 'a', 'i', ' ', 4, 'L', 'i', 'e', ' ', 10, 'K', 'a', 'm', 'i', 's', 'h', 'i', 'm', 'o', ' ',\n5, 'Y', 'u', 'k', 'i', ' ', 7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'n', ' ', 4, 'K', 'e', 'n', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'J', 'i', 'a', ' ', 4, 'K', 'u', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'P', 'o', 'u', ' ', 3, 'G', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'Q', 'u', 'n', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'B', 'u', ' ',\n7, 'Z', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'S', 'h', 'a', ' ', 4, 'Q', 'u', 'n', ' ', 3, 'L', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 3, 'K', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'F', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'B', 'i', ' ',\n4, 'G', 'u', 'n', ' ', 4, 'T', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'D', 'u', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'P', 'e', 'i', ' ',\n4, 'P', 'e', 'i', ' ', 4, 'F', 'e', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 4, 'G', 'u', 'o', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'D', 'u', ' ', 3, 'X', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'J', 'u', ' ', 3, 'Q', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'G', 'u', 'a', ' ', 4, 'K', 'e', 'n', ' ', 4, 'C', 'h', 'e', ' ', 3, 'T', 'i', ' ', 3, 'T', 'i', ' ',\n3, 'F', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 4, 'K', 'u', 'n', ' ',\n5, 'D', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ', 4, 'X', 'i', 'u', ' ', 3, 'H', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'Y', 'u', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'C', 'h', 'u', ' ', 3, 'L', 'u', ' ', 4, 'E', 'n', 'a', ' ', 6, 'H', 'i', 't', 'o', 'e', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'D', 'a', ' ', 4, 'G', 'o', 'u', ' ', 3, 'D', 'a', ' ', 5, 'H', 'u', 'a', 'i', ' ', 5, 'R', 'o', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n3, 'R', 'u', ' ', 4, 'N', 'a', 'i', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 4, 'B', 'a', 'n', ' ', 4, 'T', 'u', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'o', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'H', 'u', 'a', 'i', ' ', 3, 'K', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'o', ' ', 3, 'L', 'i', ' ', 4, 'Z', 'h', 'e', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'L', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'D', 'i', 'e', ' ', 4, 'X', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'C', 'a', 'o', ' ', 3, 'J', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'e', 'n', ' ',\n4, 'B', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 8, 'C', 'h', 'i', 'h', 'a', 'y', 'a', ' ', 3, 'P', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'J', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Z', 'a', ' ', 4, 'F', 'a', 'n', ' ',\n3, 'B', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ', 4, 'B', 'i', 'e', ' ', 4, 'R', 'a', 'o', ' ', 4, 'M', 'a', 'n', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'A', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'G', 'u', 'i', ' ', 4, 'C', 'a', 'o', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'N', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'J', 'i', 'n', ' ', 5, 'D', 'a', 'n', 'g', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'T', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'L', 'a', 'n', ' ', 3, 'P', 'u', ' ', 3, 'R', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'W', 'a', ' ', 4, 'S', 'h', 'i', ' ', 4, 'B', 'a', 'i', ' ', 4, 'X', 'i', 'e', ' ',\n3, 'B', 'o', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'L', 'a', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'L', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'D', 'a', 'i', ' ', 7, 'T', 'a', 's', 'u', 'k', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'R', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 3, 'X', 'i', ' ',\n3, 'X', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'F', 'u', ' ',\n3, 'B', 'a', ' ', 3, 'H', 'e', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 4, 'J', 'u', 'e', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'M', 'i', ' ', 3, 'M', 'i', ' ', 4, 'M', 'i', 'e', ' ', 4, 'S', 'h', 'i', ' ', 3, 'S', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n4, 'L', 'u', 'o', ' ', 4, 'J', 'u', 'e', ' ', 3, 'M', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'J', 'u', 'n', ' ', 3, 'X', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 3, 'X', 'i', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'L', 'a', 'n', ' ', 2, 'E', ' ', 3, 'D', 'u', ' ', 4, 'Q', 'i', 'n', ' ',\n5, 'P', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'M', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'G', 'o', 'u', ' ', 3, 'Q', 'u', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ',\n3, 'Q', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'J', 'u', 'e', ' ', 3, 'Q', 'u', ' ', 4, 'L', 'u', 'o', ' ',\n4, 'L', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'D', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 3, 'M', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 3, 'J', 'i', ' ', 3, 'X', 'i', ' ', 3, 'D', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'J', 'i', 'n', ' ', 3, 'Q', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 4, 'J', 'i', 'n', ' ',\n3, 'C', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'G', 'u', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'D', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'G', 'e', ' ', 4, 'C', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'G', 'u', 'i', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'H', 'u', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'S', 'u', ' ', 3, 'N', 'i', ' ',\n3, 'J', 'i', ' ', 3, 'L', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'B', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n3, 'H', 'u', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'X', 'u', 'e', ' ', 4, 'C', 'h', 'u', ' ',\n3, 'X', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'L', 'u', ' ', 4, 'J', 'u', 'e', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'Q', 'i', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ',\n5, 'D', 'i', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'C', 'h', 'a', ' ', 4, 'T', 'a', 'o', ' ', 3, 'X', 'u', ' ', 4, 'J', 'i', 'e', ' ',\n3, 'Y', 'i', ' ', 4, 'R', 'e', 'n', ' ', 4, 'X', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'Q', 'i', ' ',\n4, 'T', 'u', 'o', ' ', 3, 'J', 'i', ' ', 4, 'X', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 2, 'E', ' ', 4, 'F', 'e', 'n', ' ',\n3, 'Y', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'N', 'e', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ',\n6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'S', 'h', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'S', 'h', 'a', ' ', 4, 'T', 'u', 'n', ' ', 3, 'X', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'S', 'u', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'H', 'e', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'H', 'e', ' ', 3, 'X', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'Z', 'h', 'u', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'o', 'u', ' ', 3, 'Z', 'i', ' ', 3, 'Z', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n3, 'G', 'u', ' ', 3, 'F', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'D', 'i', 'e', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'N', 'a', 'o', ' ', 4, 'P', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'G', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'J', 'u', ' ', 3, 'A', 'o', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'T', 'u', 'o', ' ', 3, 'Y', 'i', ' ',\n3, 'Q', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'B', 'i', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ',\n3, 'B', 'a', ' ', 3, 'D', 'a', ' ', 3, 'Z', 'u', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'C', 'i', ' ',\n4, 'Z', 'h', 'e', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'X', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'H', 'e', ' ', 4, 'S', 'h', 'i', ' ', 4, 'C', 'h', 'a', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'H', 'e', 'n', ' ',\n4, 'C', 'h', 'a', ' ', 4, 'G', 'o', 'u', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'H', 'u', 'a', ' ', 4, 'G', 'a', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 3, 'M', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 2, 'E', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'Y', 'a', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'a', ' ', 3, 'E', 'r', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'L', 'e', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'K', 'u', 'a', ' ', 3, 'W', 'u', ' ',\n3, 'Y', 'u', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'S', 'u', ' ',\n5, 'L', 'a', 'n', 'g', ' ', 2, 'E', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 2, 'E', ' ', 4, 'S', 'h', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n4, 'D', 'a', 'n', ' ', 3, 'B', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'Q', 'i', 'n', ' ', 5, 'S', 'h', 'u', 'a', ' ', 3, 'A', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'W', 'u', ' ', 4, 'G', 'a', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n3, 'P', 'u', ' ', 4, 'H', 'u', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'S', 'h', 'u', 'o', ' ',\n3, 'D', 'u', ' ', 8, 'Y', 'a', 's', 'a', 's', 'h', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'i', ' ', 4, 'J', 'i', 'e', ' ', 3, 'K', 'e', ' ',\n3, 'Q', 'u', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'S', 'u', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'T', 'a', ' ', 3, 'Y', 'i', ' ', 3, 'N', 'a', ' ', 4, 'Y', 'i', 'n', ' ',\n5, 'D', 'i', 'a', 'o', ' ', 3, 'P', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'u', 'n', ' ',\n3, 'J', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'T', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'J', 'u', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'Z', 'e', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'H', 'a', 'o', ' ', 4, 'L', 'u', 'n', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'H', 'u', 'a', 'i', ' ', 5, 'P', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'D', 'i', 'e', ' ',\n3, 'X', 'u', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'H', 'u', 'n', ' ',\n4, 'H', 'u', 'a', ' ', 2, 'E', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'F', 'u', ' ',\n3, 'P', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'Z', 'i', ' ',\n6, 'C', 'h', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'A', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'N', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'H', 'e', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'G', 'e', ' ', 4, 'N', 'u', 'o', ' ', 3, 'Q', 'i', ' ', 4, 'M', 'o', 'u', ' ',\n3, 'Y', 'e', ' ', 4, 'W', 'e', 'i', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'B', 'o', ' ', 3, 'K', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 3, 'G', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n3, 'M', 'i', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'M', 'i', ' ', 3, 'X', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n4, 'N', 'u', 'e', ' ', 3, 'T', 'i', ' ', 3, 'S', 'u', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n4, 'S', 'h', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'X', 'u', 'e', ' ', 4, 'T', 'a', 'o', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Y', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 3, 'M', 'o', ' ', 3, 'M', 'o', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'M', 'i', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 4, 'J', 'i', 'e', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'L', 'o', 'u', ' ', 4, 'C', 'a', 'n', ' ',\n3, 'O', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'A', 'o', ' ', 3, 'A', 'o', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'H', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ',\n5, 'C', 'h', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'X', 'u', ' ', 5, 'Z', 'e', 'n', 'g', ' ',\n3, 'S', 'e', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'e', ' ', 4, 'D', 'u', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'N', 'a', 'o', ' ',\n4, 'L', 'a', 'n', ' ', 2, 'E', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'u', 'n', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'H', 'u', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 3, 'M', 'u', ' ', 4, 'Z', 'e', 'n', ' ',\n4, 'Z', 'h', 'a', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'e', 'n', ' ', 3, 'P', 'u', ' ',\n6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'T', 'a', 'n', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'N', 'o', 'u', ' ',\n3, 'Y', 'i', ' ', 3, 'A', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'P', 'i', ' ', 4, 'H', 'u', 'i', ' ', 4, 'H', 'u', 'a', ' ',\n3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'R', 'a', 'n', 'g', ' ', 4, 'N', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 3, 'T', 'a', ' ', 3, 'H', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'H', 'a', 'o', ' ', 3, 'Y', 'e', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'D', 'u', ' ',\n4, 'Z', 'h', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'L', 'e', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'Y', 'a', 'n', ' ',\n2, 'E', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'W', 'e', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n5, 'R', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'L', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'H', 'u', 'o', ' ', 4, 'Z', 'h', 'e', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'D', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'R', 'e', 'n', ' ',\n3, 'J', 'i', ' ', 4, 'J', 'i', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 5, 'R', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'X', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'X', 'u', 'n', ' ', 3, 'J', 'i', ' ',\n4, 'R', 'e', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 3, 'O', 'u', ' ', 3, 'J', 'u', ' ', 3, 'Y', 'a', ' ',\n3, 'N', 'e', ' ', 3, 'X', 'u', ' ', 2, 'E', ' ', 4, 'L', 'u', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'e', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'J', 'u', 'e', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'G', 'u', ' ',\n3, 'H', 'e', ' ', 5, 'P', 'i', 'n', 'g', ' ', 3, 'Z', 'u', ' ', 4, 'S', 'h', 'i', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ',\n3, 'S', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'C', 'i', ' ', 3, 'Q', 'u', ' ',\n5, 'Z', 'h', 'a', 'o', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ',\n4, 'S', 'h', 'i', ' ', 4, 'G', 'u', 'a', ' ', 4, 'S', 'h', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'H', 'u', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'H', 'u', 'a', ' ', 4, 'D', 'a', 'n', ' ', 4, 'G', 'o', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n4, 'G', 'u', 'i', ' ', 4, 'X', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'C', 'h', 'a', ' ', 4, 'H', 'u', 'n', ' ', 3, 'X', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'J', 'i', 'e', ' ', 3, 'W', 'u', ' ',\n3, 'Y', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'W', 'u', ' ', 4, 'G', 'a', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'H', 'u', 'i', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ', 5, 'S', 'o', 'n', 'g', ' ', 3, 'A', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ',\n4, 'Z', 'o', 'u', ' ', 4, 'N', 'u', 'o', ' ', 3, 'D', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'F', 'e', 'i', ' ', 3, 'K', 'e', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'S', 'h', 'u', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 4, 'S', 'u', 'i', ' ', 4, 'T', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'M', 'o', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'D', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'N', 'u', 'e', ' ', 3, 'Y', 'e', ' ', 4, 'W', 'e', 'i', ' ', 2, 'E', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 3, 'A', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'D', 'i', ' ', 3, 'M', 'i', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 3, 'X', 'u', ' ', 3, 'M', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'S', 'u', ' ', 4, 'X', 'i', 'e', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'M', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'e', 'n', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 4, 'L', 'a', 'n', ' ', 3, 'P', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'G', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'H', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 3, 'D', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'L', 'i', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ',\n3, 'B', 'i', ' ', 4, 'S', 'h', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'C', 'h', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'T', 'u', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'T', 'u', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'a', ' ', 4, 'H', 'o', 'u', ' ',\n2, 'E', ' ', 3, 'C', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'K', 'e', 'n', ' ',\n4, 'G', 'a', 'i', ' ', 3, 'Q', 'u', ' ', 3, 'F', 'u', ' ', 3, 'X', 'i', ' ', 4, 'B', 'i', 'n', ' ', 4, 'H', 'a', 'o', ' ',\n3, 'Y', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'J', 'i', 'a', ' ', 3, 'X', 'i', ' ', 3, 'B', 'o', ' ', 4, 'W', 'e', 'n', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 3, 'D', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'B', 'a', 'o', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'H', 'a', 'n', ' ', 3, 'P', 'i', ' ', 3, 'N', 'a', ' ',\n3, 'P', 'i', ' ', 4, 'G', 'o', 'u', ' ', 3, 'N', 'a', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'M', 'o', ' ',\n3, 'S', 'i', ' ', 4, 'X', 'i', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'n', ' ', 3, 'H', 'e', ' ', 3, 'H', 'e', ' ',\n3, 'M', 'o', ' ', 4, 'H', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'L', 'i', ' ', 3, 'N', 'i', ' ', 3, 'B', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'J', 'i', 'a', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 3, 'P', 'i', ' ', 3, 'X', 'i', ' ',\n2, 'E', ' ', 3, 'J', 'u', ' ', 3, 'M', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'T', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'B', 'e', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'C', 'a', 'i', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 3, 'T', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'H', 'a', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ', 4, 'P', 'i', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 4, 'F', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'Z', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'E', 'r', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'E', 'r', ' ',\n4, 'G', 'u', 'i', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'i', ' ', 4, 'D', 'a', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'i', ' ', 4, 'T', 'i', 'e', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'h', 'i', ' ', 4, 'M', 'a', 'o', ' ',\n3, 'H', 'e', ' ', 3, 'B', 'i', ' ', 3, 'L', 'u', ' ', 4, 'R', 'e', 'n', ' ', 4, 'H', 'u', 'i', ' ', 4, 'G', 'a', 'i', ' ',\n5, 'P', 'i', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 4, 'J', 'i', 'a', ' ', 3, 'X', 'u', ' ', 4, 'Z', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n4, 'G', 'a', 'i', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'B', 'i', 'n', ' ', 4, 'B', 'i', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'S', 'h', 'e', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'L', 'a', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'S', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n6, 'S', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'P', 'e', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'M', 'a', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'i', ' ', 3, 'F', 'u', ' ', 4, 'T', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'J', 'i', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ',\n5, 'S', 'h', 'u', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'L', 'a', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n5, 'C', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'A', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'S', 'a', 'i', ' ', 3, 'Z', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 4, 'B', 'a', 'i', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'Y', 'u', 'n', ' ',\n5, 'Z', 'e', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 4, 'G', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 3, 'B', 'i', ' ',\n3, 'D', 'u', ' ', 4, 'S', 'h', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'F', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'C', 'a', 'i', ' ', 3, 'Z', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'P', 'i', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'E', 'r', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'T', 'i', 'e', ' ', 4, 'G', 'u', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 4, 'M', 'a', 'o', ' ', 4, 'F', 'e', 'i', ' ',\n3, 'H', 'e', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'e', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'a', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'Z', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'L', 'u', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 4, 'G', 'a', 'i', ' ',\n4, 'J', 'i', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'L', 'a', 'i', ' ', 4, 'S', 'h', 'e', ' ', 3, 'F', 'u', ' ',\n3, 'D', 'u', ' ', 3, 'J', 'i', ' ', 4, 'S', 'h', 'u', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 3, 'S', 'i', ' ', 3, 'B', 'i', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'P', 'e', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'L', 'a', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 3, 'F', 'u', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'S', 'a', 'i', ' ', 3, 'Z', 'e', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Z', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 3, 'X', 'i', ' ', 4, 'S', 'h', 'e', ' ', 4, 'N', 'a', 'n', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'H', 'e', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'X', 'i', 'a', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'Z', 'o', 'u', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'L', 'i', ' ', 4, 'J', 'i', 'u', ' ', 3, 'F', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n4, 'G', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'C', 'i', ' ', 4, 'J', 'u', 'e', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'C', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 4, 'D', 'i', 'e', ' ', 3, 'J', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'D', 'i', ' ', 3, 'S', 'e', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'Q', 'u', ' ', 4, 'J', 'i', 'e', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'C', 'h', 'u', ' ', 4, 'G', 'u', 'a', ' ', 4, 'X', 'u', 'e', ' ', 3, 'C', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'L', 'i', 'e', ' ', 4, 'G', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 3, 'C', 'u', ' ', 3, 'X', 'i', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n3, 'S', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'J', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n5, 'C', 'h', 'u', 'o', ' ', 4, 'C', 'u', 'i', ' ', 3, 'L', 'u', ' ', 3, 'Q', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ',\n3, 'Z', 'i', ' ', 3, 'T', 'i', ' ', 3, 'Q', 'u', ' ', 4, 'C', 'h', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'T', 'i', ' ', 4, 'Z', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ',\n3, 'Z', 'u', ' ', 3, 'P', 'a', ' ', 4, 'B', 'a', 'o', ' ', 3, 'K', 'u', ' ', 3, 'K', 'e', ' ', 4, 'D', 'u', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 3, 'F', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'S', 'a', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'P', 'a', ' ', 3, 'Q', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'T', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'M', 'e', 'i', ' ',\n3, 'B', 'a', ' ', 4, 'D', 'i', 'e', ' ', 3, 'K', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ', 3, 'C', 'i', ' ',\n4, 'P', 'a', 'o', ' ', 4, 'Q', 'i', 'a', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'J', 'u', ' ', 4, 'D', 'i', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'P', 'a', 'n', ' ', 3, 'J', 'u', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'B', 'o', ' ', 3, 'N', 'i', ' ',\n3, 'J', 'u', ' ', 3, 'L', 'i', ' ', 4, 'G', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 4, 'D', 'a', 'i', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'K', 'u', 'a', ' ',\n6, 'Z', 'h', 'u', 'a', 'i', ' ', 4, 'G', 'u', 'i', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'h', 'i', ' ',\n3, 'L', 'u', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'J', 'i', 'a', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'C', 'a', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'T', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'B', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ',\n3, 'J', 'i', ' ', 3, 'J', 'u', ' ', 3, 'J', 'i', ' ', 4, 'S', 'h', 'u', ' ', 3, 'T', 'u', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 4, 'N', 'i', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Q', 'u', 'n', ' ',\n4, 'M', 'o', 'u', ' ', 4, 'S', 'h', 'u', ' ', 5, 'L', 'a', 'n', 'g', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 3, 'T', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'W', 'o', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'J', 'i', 'e', ' ', 3, 'J', 'i', ' ', 4, 'N', 'i', 'e', ' ', 3, 'J', 'u', ' ', 3, 'J', 'u', ' ',\n4, 'L', 'u', 'n', ' ', 3, 'L', 'u', ' ', 5, 'L', 'e', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'i', ' ', 3, 'J', 'u', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'W', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'T', 'i', ' ', 3, 'B', 'o', ' ', 3, 'Z', 'u', ' ', 4, 'Q', 'i', 'e', ' ',\n3, 'J', 'i', ' ', 3, 'C', 'u', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'C', 'a', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'D', 'u', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'Z', 'h', 'e', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'a', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'Z', 'u', ' ', 4, 'D', 'i', 'e', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ', 4, 'N', 'u', 'o', ' ',\n3, 'T', 'i', ' ', 4, 'C', 'h', 'a', ' ', 4, 'T', 'u', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'o', ' ', 4, 'C', 'u', 'o', ' ',\n3, 'X', 'i', ' ', 3, 'T', 'a', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'T', 'i', ' ',\n3, 'J', 'i', ' ', 4, 'N', 'i', 'e', ' ', 4, 'M', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'B', 'i', ' ',\n6, 'C', 'h', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'C', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ',\n4, 'S', 'u', 'o', ' ', 3, 'X', 'i', ' ', 4, 'K', 'u', 'i', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n3, 'D', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'B', 'e', 'n', 'g', ' ', 4, 'Z', 'a', 'o', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 4, 'B', 'i', 'e', ' ', 4, 'T', 'u', 'i', ' ', 3, 'J', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'C', 'e', 'n', 'g', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'D', 'u', 'n', ' ', 3, 'B', 'o', ' ',\n3, 'C', 'u', ' ', 3, 'Z', 'u', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'L', 'i', 'n', ' ', 3, 'T', 'a', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'P', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'n', ' ', 5, 'C', 'u', 'a', 'n', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'Z', 'a', 'o', ' ', 3, 'T', 'a', ' ', 3, 'B', 'i', ' ', 3, 'B', 'i', ' ', 4, 'Z', 'h', 'u', ' ',\n3, 'J', 'u', ' ', 4, 'C', 'h', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'D', 'u', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ', 3, 'J', 'i', ' ',\n3, 'W', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 5, 'R', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'e', ' ', 4, 'N', 'i', 'e', ' ', 3, 'T', 'a', ' ', 3, 'Q', 'u', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'C', 'u', 'a', 'n', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'L', 'i', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ', 7, 'S', 'e', 'g', 'a', 'r', 'e', ' ', 3, 'Q', 'u', ' ',\n3, 'T', 'i', ' ', 4, 'D', 'u', 'o', ' ', 4, 'D', 'u', 'o', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'L', 'a', 'n', 'g', ' ', 6, 'N', 'e', 'r', 'a', 'u', ' ',\n4, 'L', 'u', 'o', ' ', 3, 'A', 'i', ' ', 3, 'J', 'i', ' ', 3, 'J', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 7, 'U', 't', 's', 'u', 'k', 'e', ' ',\n4, 'Y', 'a', 'n', ' ', 9, 'S', 'h', 'i', 't', 's', 'u', 'k', 'e', ' ', 5, 'K', 'a', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 4, 'L', 'o', 'u', ' ', 4, 'L', 'a', 'o', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 7, 'Y', 'a', 'g', 'a', 't', 'e', ' ', 3, 'T', 'i', ' ', 4, 'D', 'a', 'o', ' ', 7, 'Y', 'a', 'g', 'a', 't', 'e', ' ',\n3, 'Y', 'u', ' ', 4, 'C', 'h', 'e', ' ', 3, 'Y', 'a', ' ', 4, 'G', 'u', 'i', ' ', 4, 'J', 'u', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 4, 'X', 'i', 'n', ' ', 3, 'D', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'R', 'e', 'n', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'T', 'u', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'D', 'a', 'i', ' ',\n2, 'E', ' ', 3, 'N', 'a', ' ', 3, 'Q', 'i', ' ', 4, 'M', 'a', 'o', ' ', 5, 'R', 'u', 'a', 'n', ' ', 4, 'R', 'e', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'Q', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n3, 'D', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 3, 'A', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'F', 'a', 'n', ' ',\n6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'A', 'n', 'g', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 3, 'G', 'u', ' ', 3, 'K', 'u', ' ',\n4, 'P', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'R', 'o', 'n', 'g', ' ', 2, 'E', ' ', 3, 'B', 'a', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'K', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 3, 'E', 'r', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ',\n3, 'L', 'u', ' ', 4, 'K', 'a', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Z', 'a', 'i', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'S', 'h', 'e', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 4, 'W', 'a', 'n', ' ', 3, 'F', 'u', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n3, 'N', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'e', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'Z', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 5, 'W', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'o', ' ', 4, 'G', 'u', 'o', ' ', 4, 'K', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'n', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n4, 'B', 'e', 'i', ' ', 4, 'L', 'u', 'n', ' ', 4, 'P', 'a', 'i', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'R', 'u', 'a', 'n', ' ', 4, 'R', 'o', 'u', ' ',\n3, 'J', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'C', 'o', 'u', ' ', 4, 'Q', 'u', 'n', ' ',\n3, 'G', 'e', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 3, 'F', 'u', ' ', 3, 'Z', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'W', 'e', 'n', ' ', 4, 'B', 'e', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'T', 'a', 'o', ' ', 3, 'G', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n4, 'J', 'i', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'u', 'n', ' ', 5, 'S', 'o', 'r', 'i', ' ',\n4, 'C', 'h', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'P', 'u', ' ', 4, 'L', 'a', 'o', ' ', 4, 'F', 'e', 'n', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 3, 'G', 'e', ' ', 3, 'S', 'e', ' ', 4, 'K', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ',\n3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 4, 'D', 'u', 'i', ' ', 3, 'E', 'r', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 4, 'P', 'e', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'u', ' ',\n4, 'L', 'i', 'n', ' ', 4, 'C', 'h', 'e', ' ', 3, 'Y', 'a', ' ', 4, 'G', 'u', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'D', 'i', ' ',\n4, 'R', 'e', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 2, 'E', ' ', 4, 'L', 'u', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n3, 'K', 'u', ' ', 3, 'K', 'e', ' ', 3, 'L', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'H', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n4, 'Z', 'a', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'F', 'u', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 4, 'G', 'u', 'n', ' ', 5, 'W', 'a', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'Z', 'i', ' ',\n4, 'C', 'o', 'u', ' ', 3, 'F', 'u', ' ', 3, 'J', 'i', ' ', 4, 'W', 'e', 'n', ' ', 4, 'S', 'h', 'u', ' ', 4, 'P', 'e', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'C', 'h', 'e', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'X', 'i', 'n', ' ', 3, 'G', 'u', ' ', 3, 'C', 'i', ' ', 3, 'C', 'i', ' ', 3, 'P', 'i', ' ', 4, 'Z', 'u', 'i', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 3, 'L', 'a', ' ', 3, 'L', 'a', ' ', 3, 'C', 'i', ' ', 4, 'X', 'u', 'e', ' ', 4, 'B', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 3, 'C', 'i', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'R', 'u', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'N', 'o', 'n', 'g', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'o', ' ', 7, 'S', 'u', 'b', 'e', 'r', 'u', ' ', 5, 'R', 'e', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 4, 'S', 'i', 'p', ' ', 3, 'I', 'p', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'D', 'a', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'G', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'Y', 'i', ' ', 4, 'G', 'u', 'o', ' ', 4, 'M', 'a', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'Z', 'a', ' ', 5, 'W', 'a', 'n', 'g', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'T', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 4, 'F', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'D', 'a', ' ', 2, 'E', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 7, 'T', 'o', 't', 'e', 'm', 'o', ' ', 4, 'J', 'i', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 4, 'C', 'h', 'e', ' ', 3, 'N', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'Y', 'i', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'D', 'a', 'i', ' ', 3, 'E', 'r', ' ',\n3, 'D', 'i', ' ', 3, 'P', 'o', ' ', 5, 'W', 'a', 'n', 'g', ' ', 4, 'D', 'i', 'e', ' ', 3, 'Z', 'e', ' ', 4, 'T', 'a', 'o', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'T', 'u', 'o', ' ', 4, 'K', 'e', 'p', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'i', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n4, 'Y', 'o', 'u', ' ', 3, 'M', 'i', ' ', 5, 'B', 'e', 'n', 'g', ' ', 3, 'J', 'i', ' ', 4, 'N', 'a', 'i', ' ', 3, 'Y', 'i', ' ',\n4, 'J', 'i', 'e', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'L', 'i', 'e', ' ', 4, 'X', 'u', 'n', ' ', 4, 'T', 'u', 'i', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'T', 'a', 'o', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'H', 'o', 'u', ' ', 3, 'N', 'i', ' ', 4, 'D', 'u', 'n', ' ',\n6, 'J', 'i', 'o', 'n', 'g', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 3, 'B', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'Q', 'i', 'u', ' ', 4, 'T', 'o', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'D', 'i', ' ', 3, 'D', 'i', ' ',\n3, 'T', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'T', 'i', ' ', 4, 'D', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'Z', 'h', 'e', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 3, 'W', 'u', ' ', 4, 'S', 'h', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 3, 'S', 'u', ' ',\n4, 'Z', 'a', 'o', ' ', 4, 'Q', 'u', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'L', 'i', ' ', 5, 'S', 'a', 'k', 'o', ' ', 4, 'L', 'a', 'i', ' ', 4, 'B', 'e', 'n', ' ', 4, 'C', 'u', 'o', ' ', 4, 'J', 'u', 'e', ' ',\n5, 'B', 'e', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 3, 'L', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n4, 'J', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'h', 'u', 'o', ' ', 4, 'K', 'u', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'T', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'D', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 3, 'B', 'i', ' ', 4, 'N', 'u', 'o', ' ',\n3, 'Y', 'u', ' ', 5, 'D', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 4, 'D', 'u', 'n', ' ', 4, 'S', 'u', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n6, 'C', 'h', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'T', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'Y', 'o', 'u', ' ', 4, 'Y', 'u', 'n', ' ', 2, 'E', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ', 2, 'E', ' ',\n4, 'X', 'i', 'a', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'D', 'a', 'o', ' ', 3, 'D', 'a', ' ', 4, 'W', 'e', 'i', ' ',\n7, 'A', 'p', 'p', 'a', 'r', 'e', ' ', 3, 'Y', 'i', ' ', 4, 'G', 'o', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'C', 'h', 'u', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'X', 'u', 'n', ' ', 3, 'T', 'a', ' ', 3, 'D', 'i', ' ', 4, 'C', 'h', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'S', 'u', ' ',\n3, 'T', 'a', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'G', 'u', 'a', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'A', 'o', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'C', 'e', ' ', 4, 'C', 'h', 'i', ' ', 3, 'S', 'u', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'Z', 'h', 'e', ' ',\n4, 'D', 'u', 'n', ' ', 3, 'D', 'i', ' ', 4, 'L', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'L', 'i', 'n', ' ',\n4, 'Z', 'u', 'n', ' ', 4, 'R', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'i', ' ',\n3, 'W', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'J', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'a', 'o', ' ',\n4, 'M', 'a', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'S', 'u', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'T', 'e', 'n', 'g', ' ',\n3, 'E', 'r', ' ', 5, 'M', 'i', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'L', 'a', ' ', 3, 'L', 'i', ' ',\n5, 'Y', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'L', 'u', 'o', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n5, 'D', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n5, 'M', 'a', 'n', 'g', ' ', 3, 'R', 'u', ' ', 6, 'Q', 'i', 'o', 'n', 'g', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 5, 'K', 'a', 'n', 'g', ' ',\n4, 'B', 'i', 'n', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'N', 'a', ' ', 4, 'X', 'i', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n5, 'B', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'C', 'u', 'n', ' ', 4, 'H', 'u', 'o', ' ', 4, 'X', 'i', 'e', ' ', 5, 'B', 'a', 'n', 'g', ' ',\n3, 'W', 'u', ' ', 3, 'J', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'T', 'a', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n3, 'B', 'i', ' ', 4, 'P', 'e', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'o', ' ', 4, 'B', 'e', 'i', ' ', 3, 'W', 'a', ' ',\n3, 'D', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'Y', 'e', ' ', 4, 'L', 'i', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'K', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'a', 'i', ' ', 3, 'G', 'e', ' ',\n3, 'X', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'J', 'i', ' ', 4, 'X', 'u', 'n', ' ', 4, 'H', 'o', 'u', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'G', 'u', 'i', ' ', 4, 'N', 'u', 'o', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ',\n5, 'K', 'u', 'a', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 6, 'O', 't', 'o', 'k', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'D', 'o', 'u', ' ', 4, 'C', 'h', 'i', ' ', 3, 'L', 'u', ' ', 3, 'F', 'u', ' ', 3, 'W', 'u', ' ', 3, 'F', 'u', ' ',\n4, 'G', 'a', 'o', ' ', 4, 'H', 'a', 'o', ' ', 5, 'L', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 5, 'G', 'e', 'n', 'g', ' ', 4, 'J', 'u', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 3, 'B', 'o', ' ', 3, 'X', 'i', ' ', 4, 'B', 'e', 'i', ' ', 3, 'L', 'i', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'B', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'P', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'G', 'u', 'o', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 3, 'N', 'i', ' ',\n5, 'C', 'h', 'e', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'B', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'D', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'M', 'e', 'i', ' ',\n4, 'R', 'u', 'o', ' ', 4, 'B', 'e', 'i', ' ', 2, 'E', ' ', 3, 'Y', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'H', 'o', 'u', ' ', 4, 'K', 'u', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'o', 'u', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 5, 'M', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'R', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Z', 'i', ' ',\n4, 'Z', 'o', 'u', ' ', 3, 'J', 'u', ' ', 3, 'W', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'H', 'a', 'o', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 3, 'B', 'i', ' ', 3, 'M', 'o', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'F', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'Y', 'i', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 3, 'H', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'X', 'u', ' ', 5, 'D', 'e', 'n', 'g', ' ', 3, 'B', 'i', ' ', 4, 'X', 'i', 'n', ' ',\n3, 'B', 'i', ' ', 5, 'C', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'M', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'L', 'i', 'n', ' ', 3, 'P', 'o', ' ', 4, 'D', 'a', 'n', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 4, 'C', 'a', 'o', ' ',\n5, 'K', 'u', 'a', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'Z', 'o', 'u', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n4, 'Z', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'Q', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'Z', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'X', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'Z', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 4, 'P', 'e', 'i', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'H', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'Z', 'u', 'i', ' ', 4, 'M', 'a', 'o', ' ', 4, 'D', 'a', 'n', ' ', 3, 'X', 'u', ' ', 4, 'T', 'o', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'F', 'e', 'n', ' ', 11, 'S', 'a', 'k', 'e', 'n', 'o', 'm', 'o', 't', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'T', 'a', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'Q', 'i', 'a', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'Z', 'u', 'o', ' ', 4, 'H', 'a', 'n', ' ', 3, 'G', 'u', ' ', 3, 'S', 'u', ' ', 3, 'P', 'o', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'Z', 'a', 'i', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'o', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'Y', 'o', 'u', ' ', 5, 'T', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'T', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'M', 'e', 'i', ' ', 3, 'K', 'u', ' ', 5, 'S', 'u', 'a', 'n', ' ',\n4, 'L', 'e', 'i', ' ', 3, 'P', 'u', ' ', 4, 'Z', 'u', 'i', ' ', 4, 'H', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n6, 'N', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'L', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'T', 'a', 'o', ' ',\n4, 'P', 'e', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ',\n3, 'C', 'u', ' ', 4, 'K', 'u', 'n', ' ', 3, 'T', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'D', 'u', ' ', 3, 'H', 'u', ' ',\n3, 'X', 'u', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 4, 'J', 'i', 'u', ' ', 5, 'C', 'h', 'u', 'n', ' ', 4, 'Y', 'u', 'n', ' ',\n3, 'P', 'o', ' ', 3, 'K', 'e', ' ', 4, 'S', 'o', 'u', ' ', 3, 'M', 'i', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'C', 'h', 'o', 'u', ' ',\n4, 'C', 'u', 'o', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'A', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'H', 'a', 'i', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'i', ' ',\n4, 'Z', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 3, 'P', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n3, 'X', 'i', ' ', 4, 'T', 'a', 'n', ' ', 3, 'P', 'o', ' ', 5, 'N', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'L', 'i', ' ',\n3, 'J', 'u', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 6, 'N', 'i', 'a', 'n', 'g', ' ', 3, 'R', 'u', ' ', 4, 'X', 'u', 'n', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ', 3, 'M', 'i', ' ', 6, 'N', 'i', 'a', 'n', 'g', ' ',\n4, 'X', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 3, 'M', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ',\n4, 'C', 'a', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 3, 'L', 'i', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'L', 'i', ' ', 4, 'J', 'i', 'n', ' ', 4, 'J', 'i', 'n', ' ',\n4, 'Q', 'i', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'D', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n3, 'P', 'o', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'H', 'e', ' ', 3, 'F', 'u', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'B', 'a', ' ', 5, 'L', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'N', 'a', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'o', ' ', 4, 'K', 'o', 'u', ' ', 6, 'C', 'h', 'u', 'a', 'n', ' ', 3, 'Z', 'i', ' ', 4, 'F', 'a', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'H', 'u', 'a', ' ', 4, 'H', 'a', 'n', ' ', 5, 'G', 'o', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'R', 'i', ' ',\n3, 'D', 'i', ' ', 3, 'S', 'i', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'T', 'u', ' ', 3, 'X', 'i', ' ', 3, 'N', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 9, 'I', 's', 'h', 'i', 'y', 'u', 'm', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'P', 'i', ' ', 3, 'Y', 'e', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'B', 'a', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'T', 'o', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'F', 'u', ' ', 3, 'P', 'i', ' ',\n3, 'N', 'a', ' ', 4, 'X', 'i', 'n', ' ', 2, 'E', ' ', 4, 'J', 'u', 'e', ' ', 4, 'D', 'u', 'n', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'Y', 'i', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'R', 'e', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n4, 'N', 'i', 'u', ' ', 4, 'F', 'e', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'J', 'i', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'P', 'i', ' ',\n4, 'G', 'u', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Y', 'i', ' ',\n6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'N', 'i', 'e', ' ', 4, 'G', 'a', 'i', ' ', 3, 'R', 'i', ' ', 4, 'H', 'u', 'o', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'K', 'a', 'n', 'g', ' ', 7, 'H', 'a', 'b', 'a', 'k', 'i', ' ', 6, 'I', 'r', 'o', 'r', 'i', ' ', 6, 'N', 'g', 'a', 'a', 'k', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Z', 'i', ' ',\n3, 'N', 'i', ' ', 3, 'T', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'G', 'u', ' ', 2, 'E', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'G', 'u', ' ', 3, 'B', 'a', ' ', 3, 'P', 'i', ' ',\n3, 'Y', 'u', ' ', 3, 'S', 'i', ' ', 4, 'Z', 'u', 'o', ' ', 3, 'B', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'J', 'i', 'a', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'T', 'i', 'e', ' ', 3, 'J', 'u', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'e', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 4, 'B', 'a', 'o', ' ',\n3, 'H', 'e', ' ', 3, 'B', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'o', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'C', 'h', 'i', ' ', 3, 'Z', 'a', ' ', 3, 'P', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n3, 'F', 'u', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 4, 'L', 'i', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 3, 'L', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 3, 'P', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 3, 'B', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'G', 'o', 'u', ' ', 4, 'S', 'h', 'u', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'M', 'u', ' ', 3, 'N', 'i', ' ', 4, 'N', 'i', 'e', ' ',\n3, 'D', 'i', ' ', 4, 'J', 'i', 'a', ' ', 3, 'M', 'u', ' ', 4, 'D', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ',\n3, 'S', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'K', 'a', ' ', 4, 'B', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'C', 'h', 'i', ' ', 3, 'E', 'r', ' ', 3, 'G', 'e', ' ',\n5, 'B', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'M', 'o', 'u', ' ', 4, 'J', 'i', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'J', 'u', 'n', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'M', 'o', ' ', 4, 'L', 'e', 'i', ' ',\n3, 'J', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'X', 'u', ' ', 4, 'R', 'e', 'n', ' ', 4, 'Z', 'u', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n6, 'Q', 'i', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'P', 'i', ' ', 4, 'T', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'H', 'o', 'u', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'a', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ', 4, 'J', 'u', 'n', ' ', 4, 'C', 'h', 'a', ' ',\n4, 'L', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'P', 'i', ' ', 3, 'R', 'u', ' ', 3, 'M', 'i', ' ', 3, 'Y', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 3, 'A', 'n', ' ', 5, 'D', 'i', 'o', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'S', 'e', ' ',\n4, 'K', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 8, 'K', 'a', 's', 'u', 'g', 'a', 'i', ' ', 3, 'A', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ',\n4, 'H', 'a', 'n', ' ', 4, 'R', 'u', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'K', 'e', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'Z', 'h', 'e', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 3, 'T', 'i', ' ', 4, 'C', 'u', 'o', ' ', 4, 'G', 'u', 'a', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ', 3, 'L', 'u', ' ', 4, 'M', 'e', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ',\n4, 'W', 'a', 'n', ' ', 4, 'X', 'i', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'B', 'e', 'i', ' ', 3, 'W', 'u', ' ', 3, 'S', 'u', ' ',\n3, 'Y', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 3, 'B', 'o', ' ', 4, 'H', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 5, 'C', 'u', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'W', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'S', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 3, 'W', 'u', ' ', 3, 'W', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n5, 'Z', 'h', 'u', 'o', ' ', 4, 'L', 'u', 'e', ' ', 5, 'X', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'L', 'u', 'e', ' ', 4, 'X', 'i', 'e', ' ', 4, 'C', 'h', 'u', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n4, 'T', 'i', 'e', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'P', 'u', ' ', 3, 'L', 'i', ' ', 4, 'P', 'a', 'n', ' ', 4, 'R', 'u', 'i', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ', 3, 'L', 'i', ' ', 3, 'T', 'e', ' ', 6, 'P', 'y', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ',\n3, 'T', 'u', ' ', 4, 'L', 'i', 'u', ' ', 4, 'Z', 'u', 'i', ' ', 3, 'J', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'G', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'T', 'a', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ',\n4, 'K', 'u', 'a', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'B', 'e', 'i', ' ', 3, 'L', 'u', ' ', 3, 'L', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ',\n4, 'P', 'o', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'Z', 'u', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'A', 'n', ' ',\n3, 'P', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'L', 'e', 'i', ' ', 2, 'A', ' ',\n5, 'K', 'o', 'n', 'g', ' ', 3, 'T', 'a', ' ', 4, 'K', 'u', 'n', ' ', 3, 'D', 'u', ' ', 4, 'W', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'i', ' ',\n3, 'Z', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'B', 'e', 'n', ' ', 4, 'N', 'i', 'e', ' ', 5, 'C', 'o', 'n', 'g', ' ', 4, 'Q', 'u', 'n', ' ',\n4, 'T', 'a', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Q', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'J', 'i', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n3, 'X', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'o', ' ', 3, 'G', 'u', ' ', 4, 'C', 'u', 'o', ' ', 4, 'S', 'h', 'u', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 3, 'L', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'H', 'u', 'a', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n3, 'G', 'a', ' ', 4, 'L', 'a', 'i', ' ', 4, 'K', 'e', 'n', ' ', 7, 'K', 'a', 'z', 'a', 'r', 'i', ' ', 3, 'B', 'u', ' ', 4, 'N', 'a', 'i', ' ',\n4, 'W', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'D', 'e', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ',\n4, 'M', 'e', 'n', ' ', 4, 'K', 'a', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'D', 'u', ' ', 3, 'T', 'u', ' ', 4, 'W', 'e', 'i', ' ', 5, 'C', 'o', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n4, 'R', 'o', 'u', ' ', 3, 'J', 'i', ' ', 2, 'E', ' ', 4, 'R', 'o', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'T', 'i', ' ',\n4, 'Z', 'h', 'a', ' ', 5, 'H', 'o', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 3, 'Y', 'u', ' ',\n5, 'K', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 3, 'F', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ',\n4, 'C', 'h', 'a', ' ', 4, 'Q', 'i', 'e', ' ', 4, 'S', 'h', 'e', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'M', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'H', 'o', 'u', ' ', 4, 'T', 'o', 'u', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 4, 'M', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'D', 'u', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 3, 'H', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 4, 'X', 'i', 'u', ' ', 3, 'Y', 'e', ' ',\n4, 'M', 'e', 'i', ' ', 4, 'P', 'a', 'i', ' ', 3, 'A', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'M', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ',\n3, 'T', 'a', ' ', 5, 'B', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'S', 'u', 'o', ' ', 3, 'X', 'i', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'Z', 'u', ' ', 3, 'Y', 'e', ' ', 4, 'N', 'o', 'u', ' ', 5, 'W', 'e', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n5, 'T', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'o', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'G', 'e', ' ', 5, 'S', 'h', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'i', ' ',\n3, 'B', 'o', ' ', 4, 'P', 'a', 'n', ' ', 3, 'S', 'a', ' ', 3, 'B', 'i', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'G', 'a', 'n', 'g', ' ',\n3, 'Z', 'i', ' ', 3, 'W', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'K', 'a', 'i', ' ', 4, 'S', 'u', 'n', ' ', 4, 'S', 'h', 'a', ' ', 4, 'S', 'o', 'u', ' ', 4, 'W', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'L', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'N', 'i', 'e', ' ', 3, 'X', 'i', ' ', 4, 'J', 'i', 'a', ' ', 3, 'G', 'e', ' ', 3, 'M', 'a', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n8, 'K', 'a', 's', 'u', 'g', 'a', 'i', ' ', 7, 'H', 'a', 'b', 'a', 'k', 'i', ' ', 4, 'S', 'u', 'o', ' ', 3, 'N', 'a', ' ', 3, 'L', 'u', ' ', 4, 'S', 'u', 'o', ' ',\n3, 'O', 'u', ' ', 3, 'Z', 'u', ' ', 5, 'T', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'S', 'h', 'o', 'u', ' ', 3, 'A', 'o', ' ', 4, 'M', 'a', 'n', ' ', 3, 'M', 'o', ' ', 4, 'L', 'u', 'o', ' ',\n3, 'B', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'L', 'i', 'u', ' ', 3, 'D', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 3, 'L', 'u', ' ', 3, 'A', 'o', ' ', 5, 'K', 'e', 'n', 'g', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'C', 'u', 'i', ' ',\n3, 'Q', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'S', 'h', 'u', ' ', 4, 'L', 'o', 'u', ' ', 4, 'X', 'i', 'u', ' ',\n5, 'C', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'Z', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'C', 'a', 'o', ' ', 3, 'L', 'i', ' ',\n4, 'X', 'i', 'a', ' ', 3, 'X', 'i', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ',\n4, 'H', 'u', 'a', ' ', 3, 'J', 'i', ' ', 3, 'P', 'u', ' ', 4, 'H', 'u', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 3, 'P', 'o', ' ',\n4, 'L', 'i', 'n', ' ', 4, 'S', 'u', 'o', ' ', 4, 'X', 'i', 'u', ' ', 4, 'S', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ',\n3, 'S', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'N', 'a', 'o', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'P', 'i', 'e', ' ', 4, 'S', 'u', 'i', ' ',\n4, 'F', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'J', 'u', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'L', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'e', ' ', 4, 'L', 'a', 'o', ' ',\n4, 'D', 'u', 'i', ' ', 4, 'T', 'a', 'n', ' ', 4, 'Z', 'a', 'n', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ',\n5, 'D', 'e', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'D', 'u', 'i', ' ', 4, 'J', 'u', 'e', ' ', 4, 'N', 'o', 'u', ' ',\n3, 'T', 'i', ' ', 3, 'P', 'u', ' ', 4, 'T', 'i', 'e', ' ', 5, 'D', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'K', 'a', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'L', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n3, 'Y', 'u', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ',\n4, 'L', 'e', 'i', ' ', 3, 'B', 'i', ' ', 4, 'T', 'i', 'e', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'G', 'u', 'o', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ', 4, 'F', 'e', 'n', ' ', 3, 'D', 'a', ' ', 4, 'B', 'e', 'i', ' ',\n3, 'Y', 'i', ' ', 3, 'A', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ',\n5, 'H', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 3, 'J', 'i', ' ', 4, 'N', 'i', 'e', ' ', 3, 'T', 'a', ' ', 4, 'H', 'u', 'o', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 4, 'B', 'i', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 3, 'X', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Y', 'a', 'r', 'i', ' ', 4, 'C', 'h', 'a', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'M', 'i', 'e', ' ',\n3, 'L', 'i', ' ', 4, 'L', 'e', 'i', ' ', 3, 'J', 'i', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 3, 'L', 'a', ' ', 3, 'D', 'u', ' ', 5, 'S', 'h', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'L', 'u', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'B', 'a', 'o', ' ', 3, 'L', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 2, 'E', ' ', 3, 'L', 'u', ' ',\n4, 'X', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ', 3, 'B', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'C', 'h', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'X', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'C', 'a', 'n', 'g', ' ',\n4, 'N', 'i', 'e', ' ', 4, 'L', 'e', 'i', ' ', 5, 'C', 'u', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'P', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ',\n5, 'Z', 'u', 'a', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'Z', 'a', 'o', ' ', 4, 'N', 'i', 'e', ' ', 4, 'J', 'u', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n4, 'S', 'h', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'Y', 'i', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n5, 'D', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'P', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'T', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n6, 'C', 'h', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'F', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'M', 'e', 'n', ' ',\n3, 'N', 'u', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'a', 'i', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'G', 'a', 'i', ' ', 3, 'B', 'u', ' ',\n4, 'T', 'a', 'i', ' ', 3, 'J', 'u', ' ', 4, 'D', 'u', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'N', 'a', ' ',\n4, 'B', 'e', 'i', ' ', 5, 'G', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Q', 'i', 'n', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'W', 'u', ' ', 4, 'G', 'o', 'u', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'T', 'o', 'u', ' ', 4, 'N', 'i', 'u', ' ', 3, 'B', 'a', ' ', 3, 'Y', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'G', 'u', ' ', 3, 'B', 'o', ' ', 2, 'E', ' ', 3, 'P', 'o', ' ', 3, 'B', 'u', ' ',\n3, 'B', 'a', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 3, 'M', 'u', ' ', 4, 'D', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ',\n5, 'D', 'i', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'T', 'i', 'e', ' ', 3, 'B', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'o', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ', 4, 'B', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'S', 'h', 'e', ' ',\n3, 'B', 'i', ' ', 3, 'N', 'i', ' ', 3, 'P', 'i', ' ', 4, 'D', 'u', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'K', 'a', 'o', ' ',\n4, 'L', 'a', 'o', ' ', 3, 'E', 'r', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'Y', 'a', ' ', 4, 'Y', 'o', 'u', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'Y', 'e', ' ', 4, 'N', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'n', 'g', ' ',\n3, 'L', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'K', 'a', 'i', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'Z', 'h', 'u', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'D', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'a', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n4, 'S', 'h', 'a', ' ', 4, 'J', 'i', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'G', 'e', ' ', 5, 'M', 'i', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ',\n3, 'S', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n3, 'A', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'R', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'L', 'a', 'o', ' ', 3, 'P', 'u', ' ',\n3, 'W', 'u', ' ', 4, 'L', 'a', 'i', ' ', 3, 'T', 'e', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'K', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n4, 'S', 'u', 'o', ' ', 3, 'L', 'i', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ', 4, 'G', 'u', 'o', ' ', 4, 'G', 'a', 'o', ' ',\n4, 'T', 'i', 'e', ' ', 4, 'X', 'i', 'u', ' ', 4, 'C', 'u', 'o', ' ', 4, 'L', 'u', 'e', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'K', 'a', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'R', 'u', 'i', ' ', 3, 'T', 'i', ' ', 5, 'L', 'a', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 2, 'A', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 4, 'D', 'u', 'o', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'C', 'u', 'o', ' ', 4, 'M', 'a', 'o', ' ', 4, 'B', 'e', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'D', 'e', ' ', 4, 'K', 'u', 'a', ' ',\n4, 'K', 'u', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'G', 'u', ' ', 4, 'L', 'u', 'o', ' ', 5, 'C', 'h', 'u', 'i', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 4, 'J', 'i', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'P', 'o', 'u', ' ', 4, 'T', 'a', 'n', ' ', 5, 'D', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n3, 'Z', 'i', ' ', 4, 'Q', 'i', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'K', 'a', 'i', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ',\n2, 'E', ' ', 4, 'C', 'h', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'D', 'u', 'a', 'n', ' ', 4, 'S', 'o', 'u', ' ',\n6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'A', 'i', ' ', 3, 'D', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'L', 'o', 'u', ' ',\n3, 'Z', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'M', 'e', 'i', ' ', 3, 'M', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'B', 'o', ' ',\n3, 'G', 'e', ' ', 4, 'N', 'i', 'e', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 3, 'N', 'a', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'H', 'a', 'o', ' ', 5, 'B', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'J', 'i', 'a', ' ', 4, 'B', 'i', 'n', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 5, 'B', 'e', 'n', 'g', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'D', 'i', ' ', 3, 'Z', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'J', 'u', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'P', 'u', ' ', 3, 'L', 'u', ' ', 4, 'D', 'u', 'i', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'P', 'u', ' ', 5, 'C', 'u', 'a', 'n', ' ', 6, 'Q', 'i', 'a', 'n', 'g', ' ', 5, 'D', 'e', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'L', 'e', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 5, 'L', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'h', 'a', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 3, 'L', 'a', ' ', 5, 'C', 'h', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n4, 'J', 'i', 'u', ' ', 3, 'A', 'o', ' ', 4, 'D', 'i', 'e', ' ', 3, 'Q', 'u', ' ', 5, 'L', 'i', 'a', 'o', ' ', 3, 'M', 'i', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'M', 'e', 'n', ' ', 3, 'M', 'a', ' ', 6, 'S', 'h', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'M', 'e', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'H', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'S', 'a', 'n', ' ',\n4, 'K', 'a', 'i', ' ', 5, 'K', 'a', 'n', 'g', ' ', 5, 'B', 'e', 'n', 'g', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'R', 'u', 'n', ' ', 4, 'S', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Y', 'u', 'r', 'u', ' ',\n4, 'D', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'N', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 4, 'R', 'u', 'n', ' ', 3, 'H', 'e', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n3, 'G', 'e', ' ', 3, 'G', 'e', ' ', 3, 'F', 'a', ' ', 4, 'C', 'h', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'M', 'i', 'n', ' ', 3, 'S', 'e', ' ', 4, 'K', 'u', 'n', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n4, 'S', 'h', 'a', ' ', 3, 'J', 'u', ' ', 4, 'Y', 'u', 'e', ' ', 4, 'Y', 'u', 'e', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Q', 'u', ' ',\n4, 'L', 'i', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'i', ' ', 4, 'K', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ',\n4, 'Y', 'a', 'n', ' ', 2, 'E', ' ', 4, 'H', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'e', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'B', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'W', 'e', 'n', ' ', 4, 'B', 'a', 'n', ' ',\n3, 'A', 'n', ' ', 4, 'W', 'e', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'K', 'u', 'o', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'L', 'a', 'n', ' ',\n3, 'D', 'u', ' ', 7, 'P', 'h', 'w', 'u', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 3, 'T', 'a', ' ', 4, 'K', 'a', 'i', ' ',\n3, 'H', 'e', ' ', 4, 'Q', 'u', 'e', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'D', 'o', 'u', ' ', 3, 'Q', 'i', ' ',\n4, 'K', 'u', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'K', 'a', 'n', ' ', 3, 'X', 'i', ' ',\n4, 'H', 'u', 'i', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'P', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'T', 'a', ' ',\n4, 'W', 'e', 'n', ' ', 4, 'M', 'e', 'n', ' ', 6, 'S', 'h', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'B', 'i', ' ', 4, 'W', 'e', 'n', ' ', 7, 'C', 'h', 'u', 'a', 'n', 'g', ' ', 4, 'R', 'u', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'M', 'e', 'n', ' ', 4, 'Z', 'h', 'a', ' ',\n4, 'N', 'a', 'o', ' ', 4, 'G', 'u', 'i', ' ', 4, 'W', 'e', 'n', ' ', 3, 'T', 'a', ' ', 4, 'M', 'i', 'n', ' ', 3, 'L', 'u', ' ',\n4, 'K', 'a', 'i', ' ', 3, 'F', 'a', ' ', 3, 'G', 'e', ' ', 3, 'H', 'e', ' ', 4, 'K', 'u', 'n', ' ', 4, 'J', 'i', 'u', ' ',\n4, 'Y', 'u', 'e', ' ', 5, 'L', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ',\n3, 'X', 'i', ' ', 4, 'W', 'e', 'n', ' ', 4, 'H', 'u', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 2, 'E', ' ', 5, 'C', 'h', 'a', 'n', ' ',\n4, 'L', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'K', 'u', 'o', ' ', 4, 'Q', 'u', 'e', ' ', 3, 'G', 'e', ' ',\n5, 'T', 'i', 'a', 'n', ' ', 3, 'T', 'a', ' ', 4, 'Q', 'u', 'e', ' ', 4, 'K', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n3, 'F', 'u', ' ', 3, 'L', 'e', ' ', 4, 'D', 'u', 'i', ' ', 4, 'X', 'i', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'W', 'u', ' ',\n3, 'Y', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ', 2, 'E', ' ',\n6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'B', 'a', 'n', ' ', 4, 'P', 'e', 'i', ' ', 5, 'K', 'e', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'R', 'u', 'a', 'n', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'P', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n5, 'Z', 'h', 'e', 'n', ' ', 4, 'J', 'i', 'e', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 2, 'E', ' ', 3, 'Q', 'u', ' ', 3, 'D', 'i', ' ',\n3, 'Z', 'u', ' ', 4, 'Z', 'u', 'o', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 2, 'A', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'T', 'u', 'o', ' ', 3, 'P', 'o', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'J', 'i', ' ', 3, 'L', 'u', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'D', 'u', 'o', ' ', 4, 'L', 'o', 'u', ' ', 3, 'M', 'o', ' ',\n6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'D', 'u', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'E', 'r', ' ', 4, 'G', 'u', 'i', ' ',\n3, 'Y', 'u', ' ', 4, 'G', 'a', 'i', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ',\n5, 'C', 'h', 'u', 'n', ' ', 3, 'F', 'u', ' ', 3, 'B', 'i', ' ', 4, 'X', 'i', 'a', ' ', 5, 'S', 'h', 'a', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'P', 'u', ' ', 4, 'D', 'o', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'T', 'o', 'u', ' ', 4, 'N', 'i', 'e', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'P', 'e', 'i', ' ',\n4, 'P', 'e', 'i', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'Y', 'i', ' ', 4, 'D', 'u', 'i', ' ', 4, 'L', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'J', 'u', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'P', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'L', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Z', 'h', 'u', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 5, 'R', 'e', 'n', 'g', ' ', 5, 'S', 'h', 'a', 'n', ' ', 6, 'C', 'h', 'o', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'Y', 'u', ' ', 3, 'T', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'L', 'o', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'N', 'i', 'e', ' ', 4, 'D', 'u', 'i', ' ', 4, 'S', 'u', 'i', ' ', 3, 'A', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'S', 'u', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'G', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'G', 'e', ' ',\n4, 'Y', 'u', 'n', ' ', 3, 'W', 'u', ' ', 4, 'W', 'e', 'i', ' ', 3, 'A', 'i', ' ', 3, 'X', 'i', ' ', 5, 'T', 'a', 'n', 'g', ' ',\n3, 'J', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'D', 'a', 'o', ' ', 3, 'A', 'o', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'R', 'a', 'o', ' ', 4, 'L', 'i', 'n', ' ', 4, 'T', 'u', 'i', ' ', 5, 'D', 'e', 'n', 'g', ' ', 3, 'P', 'i', ' ', 4, 'S', 'u', 'i', ' ',\n4, 'S', 'u', 'i', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ', 3, 'N', 'i', ' ', 3, 'E', 'r', ' ',\n3, 'J', 'i', ' ', 4, 'D', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 2, 'E', ' ', 4, 'H', 'u', 'i', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 3, 'X', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 5, 'Z', 'h', 'u', 'i', ' ',\n3, 'H', 'e', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'N', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'Q', 'u', 'e', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'Y', 'a', ' ', 6, 'X', 'i', 'o', 'n', 'g', ' ', 3, 'Y', 'a', ' ',\n3, 'J', 'i', ' ', 3, 'G', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'G', 'o', 'u', ' ', 4, 'J', 'u', 'n', ' ',\n3, 'C', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 3, 'J', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'H', 'u', ' ', 3, 'Z', 'a', ' ',\n4, 'L', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'S', 'u', 'i', ' ', 4, 'H', 'a', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Z', 'a', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n3, 'J', 'i', ' ', 3, 'X', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'L', 'i', 'u', ' ', 3, 'L', 'i', ' ', 4, 'N', 'a', 'n', ' ',\n4, 'X', 'u', 'e', ' ', 3, 'Z', 'a', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n4, 'X', 'u', 'e', ' ', 3, 'N', 'a', ' ', 4, 'F', 'o', 'u', ' ', 3, 'S', 'e', ' ', 3, 'M', 'u', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'F', 'e', 'n', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 3, 'L', 'i', ' ', 3, 'L', 'i', ' ', 4, 'A', 'n', 'g', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 3, 'A', 'n', ' ', 4, 'B', 'a', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n5, 'D', 'a', 'n', 'g', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 3, 'X', 'u', ' ', 3, 'J', 'i', ' ',\n3, 'M', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'T', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ',\n4, 'P', 'e', 'i', ' ', 4, 'M', 'e', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'H', 'u', 'o', ' ',\n4, 'S', 'h', 'a', ' ', 4, 'F', 'e', 'i', ' ', 5, 'W', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'N', 'i', ' ',\n5, 'C', 'h', 'o', 'u', ' ', 4, 'T', 'u', 'n', ' ', 4, 'L', 'i', 'n', ' ', 5, 'D', 'o', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'W', 'u', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'M', 'o', ' ', 4, 'M', 'a', 'i', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'L', 'i', 'u', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'B', 'i', 'n', ' ',\n3, 'W', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'u', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'X', 'i', ' ', 3, 'Y', 'i', ' ',\n3, 'A', 'i', ' ', 4, 'D', 'a', 'n', ' ', 5, 'D', 'e', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'u', ' ',\n5, 'L', 'o', 'n', 'g', ' ', 4, 'D', 'a', 'i', ' ', 3, 'J', 'i', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'B', 'a', ' ',\n3, 'P', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'X', 'i', ' ', 3, 'J', 'i', ' ', 4, 'M', 'a', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n5, 'M', 'e', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 3, 'L', 'i', ' ', 4, 'H', 'u', 'o', ' ', 3, 'A', 'i', ' ', 4, 'F', 'e', 'i', ' ',\n4, 'D', 'a', 'i', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'A', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n4, 'B', 'a', 'o', ' ', 3, 'H', 'e', ' ', 3, 'H', 'e', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ',\n4, 'F', 'e', 'i', ' ', 4, 'K', 'a', 'o', ' ', 3, 'M', 'i', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 4, 'P', 'a', 'o', ' ',\n3, 'Y', 'e', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 3, 'Y', 'e', ' ', 3, 'G', 'e', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n4, 'C', 'h', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'R', 'e', 'n', ' ', 3, 'D', 'i', ' ', 3, 'D', 'u', ' ', 3, 'W', 'u', ' ',\n4, 'R', 'e', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'J', 'i', 'n', ' ', 4, 'X', 'u', 'e', ' ', 4, 'N', 'i', 'u', ' ', 3, 'B', 'a', ' ',\n4, 'Y', 'i', 'n', ' ', 3, 'S', 'a', ' ', 3, 'N', 'a', ' ', 3, 'M', 'o', ' ', 3, 'Z', 'u', ' ', 3, 'D', 'a', ' ',\n4, 'B', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'T', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ', 4, 'J', 'i', 'a', ' ',\n5, 'H', 'o', 'n', 'g', ' ', 4, 'P', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'T', 'o', 'm', 'o', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'T', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'X', 'i', 'e', ' ', 3, 'A', 'n', ' ', 3, 'A', 'n', ' ', 4, 'H', 'e', 'n', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 7, 'K', 'o', 'h', 'a', 'z', 'e', ' ', 3, 'D', 'a', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'T', 'i', 'n', 'g', ' ', 4, 'W', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'K', 'o', 'n', 'g', ' ',\n5, 'B', 'e', 'n', 'g', ' ', 3, 'T', 'a', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'K', 'u', 'o', ' ', 3, 'J', 'u', ' ',\n3, 'L', 'a', ' ', 4, 'X', 'i', 'e', ' ', 4, 'R', 'o', 'u', ' ', 5, 'B', 'a', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n4, 'Q', 'i', 'u', ' ', 3, 'H', 'e', ' ', 5, 'X', 'i', 'a', 'o', ' ', 3, 'M', 'u', ' ', 3, 'J', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'B', 'i', 'a', 'n', ' ', 3, 'D', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'O', 'n', ' ', 4, 'T', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ',\n3, 'T', 'a', ' ', 4, 'B', 'e', 'i', ' ', 4, 'X', 'i', 'e', ' ', 4, 'P', 'a', 'n', ' ', 3, 'G', 'e', ' ', 3, 'B', 'i', ' ',\n4, 'K', 'u', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'X', 'u', 'e', ' ',\n3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'D', 'a', ' ', 4, 'H', 'u', 'o', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 3, 'D', 'u', ' ', 3, 'W', 'a', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'F', 'u', ' ', 4, 'M', 'e', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'G', 'e', ' ',\n4, 'W', 'e', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'H', 'a', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'R', 'o', 'u', ' ', 4, 'X', 'u', 'n', ' ',\n4, 'S', 'h', 'e', ' ', 4, 'W', 'e', 'i', ' ', 3, 'G', 'e', ' ', 4, 'B', 'e', 'i', ' ', 4, 'T', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ',\n4, 'Y', 'u', 'n', ' ', 3, 'B', 'i', ' ', 4, 'W', 'e', 'i', ' ', 4, 'H', 'u', 'i', ' ', 3, 'D', 'u', ' ', 3, 'W', 'a', ' ',\n3, 'D', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'F', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'T', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 4, 'J', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'J', 'i', ' ', 4, 'Y', 'i', 'n', ' ', 3, 'Z', 'a', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n3, 'L', 'e', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'Y', 'u', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'Y', 'e', ' ', 5, 'D', 'i', 'n', 'g', ' ',\n5, 'Q', 'i', 'n', 'g', ' ', 4, 'P', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'n', ' ', 4, 'H', 'a', 'n', ' ', 3, 'X', 'u', ' ',\n3, 'Y', 'i', ' ', 3, 'X', 'u', ' ', 3, 'G', 'u', ' ', 5, 'S', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'H', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'W', 'a', 'n', ' ', 4, 'B', 'a', 'n', ' ', 4, 'D', 'u', 'n', ' ', 3, 'D', 'i', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'P', 'a', 'n', ' ', 3, 'P', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'C', 'e', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'L', 'e', 'i', ' ', 3, 'H', 'e', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 2, 'E', ' ', 2, 'E', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'G', 'u', 'a', ' ', 5, 'S', 'h', 'e', 'n', ' ', 3, 'Y', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'H', 'a', 'i', ' ',\n4, 'D', 'u', 'i', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'L', 'e', 'i', ' ', 3, 'F', 'u', ' ', 4, 'J', 'i', 'a', ' ',\n4, 'T', 'o', 'u', ' ', 4, 'H', 'u', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'J', 'i', 'a', ' ', 3, 'L', 'e', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n6, 'C', 'h', 'e', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'J', 'u', 'n', ' ', 3, 'H', 'u', ' ', 4, 'H', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n4, 'T', 'u', 'i', ' ', 4, 'T', 'u', 'i', ' ', 4, 'P', 'i', 'n', ' ', 4, 'L', 'a', 'i', ' ', 4, 'T', 'u', 'i', ' ', 3, 'Z', 'i', ' ',\n3, 'Z', 'i', ' ', 5, 'C', 'h', 'u', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'K', 'e', ' ', 4, 'C', 'u', 'i', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'S', 'a', 'i', ' ', 3, 'T', 'i', ' ', 2, 'E', ' ', 2, 'E', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ',\n4, 'K', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'n', ' ',\n3, 'Y', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'S', 'a', 'n', 'g', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ',\n3, 'K', 'u', ' ', 4, 'L', 'e', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'M', 'a', 'n', ' ',\n3, 'Q', 'i', ' ', 4, 'R', 'a', 'o', ' ', 4, 'H', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 3, 'G', 'u', ' ', 4, 'X', 'u', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 3, 'R', 'u', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'B', 'i', 'n', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'P', 'i', 'n', ' ', 3, 'L', 'u', ' ', 4, 'L', 'a', 'n', ' ', 4, 'N', 'i', 'e', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'Y', 'e', ' ', 5, 'D', 'i', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'n', ' ',\n3, 'X', 'u', ' ', 3, 'X', 'u', ' ', 4, 'W', 'a', 'n', ' ', 3, 'G', 'u', ' ', 4, 'D', 'u', 'n', ' ', 3, 'Q', 'i', ' ',\n4, 'B', 'a', 'n', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'H', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n3, 'P', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'J', 'i', 'e', ' ', 4, 'J', 'i', 'a', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 4, 'H', 'a', 'i', ' ', 3, 'Y', 'i', ' ', 4, 'P', 'i', 'n', ' ', 4, 'H', 'u', 'i', ' ',\n4, 'T', 'u', 'i', ' ', 4, 'H', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'K', 'e', ' ', 3, 'T', 'i', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 2, 'E', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 2, 'E', ' ', 4, 'N', 'i', 'e', ' ',\n4, 'M', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'n', ' ', 5, 'S', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'o', ' ', 4, 'L', 'e', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ',\n3, 'R', 'u', ' ', 4, 'P', 'i', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 7, 'O', 'r', 'o', 's', 'h', 'i', ' ',\n3, 'F', 'u', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'S', 'a', ' ', 3, 'B', 'a', ' ',\n4, 'T', 'a', 'i', ' ', 4, 'L', 'i', 'e', ' ', 4, 'G', 'u', 'a', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'o', ' ', 3, 'J', 'u', ' ',\n3, 'B', 'i', ' ', 3, 'S', 'i', ' ', 4, 'W', 'e', 'i', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'S', 'o', 'u', ' ',\n4, 'K', 'a', 'i', ' ', 4, 'S', 'a', 'o', ' ', 4, 'F', 'a', 'n', ' ', 4, 'L', 'i', 'u', ' ', 3, 'X', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n5, 'P', 'i', 'a', 'o', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 3, 'S', 'e', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'S', 'a', ' ', 3, 'J', 'u', ' ', 3, 'S', 'i', ' ', 4, 'S', 'o', 'u', ' ',\n4, 'Y', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'P', 'i', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'F', 'e', 'i', ' ',\n4, 'F', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'F', 'e', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'C', 'a', 'n', ' ',\n3, 'J', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'S', 'i', ' ', 4, 'T', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 4, 'R', 'e', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'Y', 'i', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ', 4, 'S', 'u', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Z', 'h', 'u', ' ',\n3, 'Y', 'i', ' ', 5, 'Z', 'h', 'a', 'i', ' ', 3, 'B', 'i', ' ', 4, 'J', 'i', 'e', ' ', 4, 'T', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ',\n3, 'C', 'i', ' ', 4, 'T', 'i', 'e', ' ', 3, 'S', 'i', ' ', 4, 'B', 'a', 'o', ' ', 4, 'S', 'h', 'i', ' ', 4, 'D', 'u', 'o', ' ',\n4, 'H', 'a', 'i', ' ', 4, 'R', 'e', 'n', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'a', ' ', 5, 'B', 'i', 'n', 'g', ' ',\n4, 'Y', 'a', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'C', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n3, 'E', 'r', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'L', 'e', ' ', 3, 'Y', 'i', ' ', 4, 'C', 'a', 'n', ' ', 3, 'B', 'o', ' ',\n4, 'N', 'e', 'i', ' ', 2, 'E', ' ', 3, 'B', 'u', ' ', 4, 'J', 'u', 'n', ' ', 4, 'D', 'o', 'u', ' ', 3, 'S', 'u', ' ',\n3, 'Y', 'u', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'H', 'u', 'n', ' ', 4, 'G', 'u', 'o', ' ', 4, 'S', 'h', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'B', 'u', ' ', 3, 'Y', 'e', ' ',\n4, 'T', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 2, 'E', ' ',\n5, 'N', 'u', 'a', 'n', ' ', 4, 'H', 'u', 'n', ' ', 3, 'H', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'T', 'i', 'e', ' ', 4, 'H', 'u', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'o', 'u', ' ', 3, 'H', 'e', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 4, 'W', 'e', 'i', ' ',\n3, 'G', 'u', ' ', 4, 'C', 'h', 'a', ' ', 5, 'S', 'o', 'n', 'g', ' ', 5, 'T', 'a', 'n', 'g', ' ', 3, 'B', 'o', ' ', 4, 'G', 'a', 'o', ' ',\n3, 'X', 'i', ' ', 4, 'K', 'u', 'i', ' ', 4, 'L', 'i', 'u', ' ', 4, 'S', 'o', 'u', ' ', 4, 'T', 'a', 'o', ' ', 3, 'Y', 'e', ' ',\n4, 'Y', 'u', 'n', ' ', 3, 'M', 'o', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'M', 'a', 'n', ' ', 3, 'B', 'i', ' ', 3, 'Y', 'u', ' ',\n4, 'X', 'i', 'u', ' ', 4, 'J', 'i', 'n', ' ', 4, 'S', 'a', 'n', ' ', 4, 'K', 'u', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 4, 'R', 'a', 'o', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 4, 'T', 'a', 'o', ' ', 4, 'H', 'u', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'F', 'e', 'n', ' ',\n4, 'H', 'a', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'M', 'o', ' ', 5, 'C', 'h', 'a', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'L', 'u', 'o', ' ', 5, 'Z', 'u', 'a', 'n', ' ', 5, 'N', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ',\n4, 'T', 'u', 'o', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 3, 'X', 'i', ' ', 4, 'R', 'e', 'n', ' ', 3, 'Y', 'u', ' ',\n4, 'C', 'h', 'i', ' ', 4, 'F', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'B', 'a', 'o', ' ',\n3, 'S', 'i', ' ', 4, 'D', 'u', 'o', ' ', 3, 'Y', 'i', ' ', 3, 'E', 'r', ' ', 4, 'R', 'a', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'L', 'e', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 3, 'B', 'o', ' ',\n4, 'D', 'o', 'u', ' ', 2, 'E', ' ', 3, 'Y', 'u', ' ', 4, 'N', 'e', 'i', ' ', 4, 'J', 'u', 'n', ' ', 4, 'G', 'u', 'o', ' ',\n4, 'H', 'u', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'C', 'h', 'a', ' ', 4, 'K', 'u', 'i', ' ', 3, 'G', 'u', ' ',\n4, 'S', 'o', 'u', ' ', 5, 'C', 'h', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 3, 'M', 'o', ' ', 3, 'B', 'o', ' ', 4, 'L', 'i', 'u', ' ',\n4, 'X', 'i', 'u', ' ', 4, 'J', 'i', 'n', ' ', 4, 'M', 'a', 'n', ' ', 4, 'S', 'a', 'n', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'N', 'a', 'n', 'g', ' ',\n5, 'S', 'h', 'o', 'u', ' ', 4, 'K', 'u', 'i', ' ', 4, 'G', 'u', 'o', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'B', 'a', ' ',\n3, 'N', 'i', ' ', 3, 'B', 'i', ' ', 3, 'B', 'o', ' ', 3, 'T', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'A', 'n', ' ', 3, 'A', 'i', ' ', 3, 'F', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'X', 'i', 'n', ' ', 4, 'F', 'e', 'n', ' ', 4, 'B', 'i', 'n', ' ', 5, 'X', 'i', 'n', 'g', ' ', 3, 'M', 'a', ' ', 3, 'Y', 'u', ' ',\n5, 'F', 'e', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 3, 'D', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ', 4, 'C', 'h', 'i', ' ',\n4, 'X', 'u', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'P', 'e', 'i', ' ', 4, 'X', 'i', 'n', ' ', 3, 'R', 'i', ' ',\n3, 'S', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'W', 'e', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'L', 'u', ' ',\n4, 'Y', 'o', 'u', ' ', 3, 'B', 'o', ' ', 4, 'B', 'a', 'o', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'T', 'u', 'o', ' ', 3, 'Y', 'i', ' ',\n3, 'Q', 'u', ' ', 3, 'Q', 'u', ' ', 6, 'J', 'i', 'o', 'n', 'g', ' ', 3, 'B', 'o', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 3, 'J', 'u', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'N', 'u', ' ', 3, 'J', 'u', ' ',\n3, 'P', 'i', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'a', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'T', 'a', 'i', ' ',\n3, 'F', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 3, 'B', 'i', ' ', 4, 'T', 'u', 'o', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'S', 'i', ' ', 4, 'L', 'i', 'u', ' ', 3, 'M', 'a', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'T', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'R', 'o', 'n', 'g', ' ', 5, 'T', 'e', 'n', 'g', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n6, 'J', 'i', 'o', 'n', 'g', ' ', 3, 'E', 'r', ' ', 4, 'H', 'a', 'i', ' ', 3, 'B', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'Y', 'i', 'n', ' ',\n4, 'L', 'u', 'o', ' ', 5, 'S', 'h', 'u', 'u', ' ', 4, 'D', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'L', 'i', 'u', ' ', 3, 'J', 'u', ' ',\n5, 'S', 'o', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'M', 'a', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'H', 'a', 'n', ' ', 3, 'T', 'u', ' ',\n5, 'X', 'u', 'a', 'n', ' ', 4, 'T', 'u', 'i', ' ', 4, 'J', 'u', 'n', ' ', 2, 'E', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'X', 'i', 'n', ' ',\n3, 'A', 'i', ' ', 3, 'L', 'u', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'S', 'h', 'e', ' ', 5, 'P', 'i', 'a', 'n', ' ',\n4, 'K', 'u', 'n', ' ', 4, 'T', 'a', 'o', ' ', 4, 'L', 'a', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'K', 'e', ' ', 3, 'Q', 'i', ' ',\n3, 'Q', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'S', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'Y', 'a', 'o', ' ', 3, 'W', 'u', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n4, 'F', 'e', 'i', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'T', 'i', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'K', 'u', 'i', ' ', 4, 'R', 'o', 'u', ' ', 3, 'S', 'i', ' ',\n4, 'G', 'u', 'a', ' ', 4, 'T', 'u', 'o', ' ', 4, 'K', 'u', 'i', ' ', 4, 'S', 'o', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 4, 'L', 'i', 'u', ' ', 5, 'P', 'a', 'n', 'g', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'X', 'i', ' ', 4, 'C', 'a', 'o', ' ',\n3, 'D', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'Z', 'o', 'u', ' ', 4, 'S', 'a', 'o', ' ', 5, 'S', 'h', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'X', 'i', ' ', 4, 'L', 'u', 'o', ' ',\n6, 'Z', 'h', 'a', 'n', 'g', ' ', 3, 'M', 'o', ' ', 3, 'A', 'o', ' ', 4, 'C', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ',\n3, 'Q', 'u', ' ', 3, 'B', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'Y', 'u', ' ', 3, 'X', 'u', ' ', 4, 'H', 'u', 'a', ' ',\n3, 'B', 'o', ' ', 3, 'S', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'L', 'i', 'n', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'D', 'u', 'n', ' ',\n4, 'L', 'i', 'u', ' ', 4, 'T', 'u', 'o', ' ', 5, 'Z', 'e', 'n', 'g', ' ', 4, 'T', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'T', 'i', 'e', ' ',\n4, 'Y', 'a', 'n', ' ', 4, 'L', 'u', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'Y', 'i', ' ', 3, 'Y', 'e', ' ',\n4, 'T', 'u', 'o', ' ', 4, 'B', 'i', 'n', ' ', 4, 'Z', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'L', 'u', ' ',\n5, 'T', 'e', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'J', 'i', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'J', 'u', ' ', 3, 'X', 'i', ' ',\n5, 'H', 'u', 'a', 'n', ' ', 3, 'L', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'M', 'a', ' ', 3, 'Y', 'u', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'X', 'u', 'n', ' ', 4, 'C', 'h', 'i', ' ', 3, 'Q', 'u', ' ', 3, 'R', 'i', ' ', 3, 'B', 'o', ' ', 3, 'L', 'u', ' ',\n5, 'Z', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 3, 'S', 'i', ' ', 3, 'F', 'u', ' ', 3, 'J', 'u', ' ', 4, 'Z', 'o', 'u', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'T', 'u', 'o', ' ', 3, 'N', 'u', ' ', 4, 'J', 'i', 'a', ' ', 3, 'Y', 'i', ' ', 4, 'T', 'a', 'i', ' ',\n5, 'X', 'i', 'a', 'o', ' ', 3, 'M', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'H', 'u', 'a', ' ', 4, 'L', 'u', 'o', ' ',\n4, 'H', 'a', 'i', ' ', 5, 'P', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'L', 'i', ' ', 6, 'C', 'h', 'e', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'X', 'i', 'n', ' ', 4, 'Q', 'i', 'n', ' ', 4, 'J', 'u', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'K', 'e', ' ',\n5, 'Z', 'h', 'u', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'S', 'u', ' ', 4, 'C', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'S', 'a', 'o', ' ', 3, 'W', 'u', ' ', 3, 'A', 'o', ' ', 4, 'L', 'i', 'u', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'S', 'h', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'o', ' ', 4, 'L', 'u', 'o', ' ', 5, 'C', 'o', 'n', 'g', ' ', 5, 'C', 'h', 'a', 'n', ' ', 4, 'Z', 'o', 'u', ' ',\n3, 'J', 'i', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ', 4, 'W', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'G', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'A', 'n', 'g', ' ', 4, 'T', 'o', 'u', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'B', 'a', 'o', ' ', 3, 'B', 'i', ' ', 4, 'C', 'h', 'i', ' ', 3, 'T', 'i', ' ', 3, 'D', 'i', ' ',\n3, 'K', 'u', ' ', 4, 'H', 'a', 'i', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'G', 'o', 'u', ' ', 4, 'K', 'u', 'a', ' ', 3, 'G', 'e', ' ',\n4, 'T', 'u', 'i', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'P', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 3, 'K', 'e', ' ', 3, 'K', 'a', ' ',\n3, 'Y', 'u', ' ', 4, 'S', 'u', 'i', ' ', 4, 'L', 'o', 'u', ' ', 3, 'B', 'o', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'P', 'a', 'n', 'g', ' ',\n3, 'B', 'o', ' ', 3, 'C', 'i', ' ', 5, 'K', 'u', 'a', 'n', ' ', 4, 'B', 'i', 'n', ' ', 3, 'M', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ',\n4, 'L', 'o', 'u', ' ', 4, 'N', 'a', 'o', ' ', 3, 'D', 'u', ' ', 5, 'Z', 'a', 'n', 'g', ' ', 4, 'S', 'u', 'i', ' ', 3, 'T', 'i', ' ',\n4, 'B', 'i', 'n', ' ', 5, 'K', 'u', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'G', 'a', 'o', ' ', 4, 'G', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ',\n4, 'K', 'a', 'o', ' ', 5, 'Q', 'i', 'a', 'o', ' ', 4, 'L', 'a', 'o', ' ', 4, 'Z', 'a', 'o', ' ', 5, 'B', 'i', 'a', 'o', ' ', 4, 'K', 'u', 'n', ' ',\n4, 'K', 'u', 'n', ' ', 3, 'T', 'i', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'u', ' ', 4, 'R', 'a', 'n', ' ', 4, 'M', 'a', 'o', ' ',\n4, 'D', 'a', 'n', ' ', 4, 'K', 'u', 'n', ' ', 4, 'B', 'i', 'n', ' ', 3, 'F', 'a', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ',\n3, 'Z', 'i', ' ', 3, 'F', 'a', ' ', 4, 'R', 'a', 'n', ' ', 3, 'T', 'i', ' ', 4, 'P', 'a', 'o', ' ', 3, 'P', 'i', ' ',\n4, 'M', 'a', 'o', ' ', 3, 'F', 'u', ' ', 3, 'E', 'r', ' ', 5, 'R', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 5, 'G', 'o', 'n', 'g', ' ',\n4, 'X', 'i', 'u', ' ', 4, 'G', 'u', 'a', ' ', 3, 'J', 'i', ' ', 5, 'P', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'a', ' ', 5, 'S', 'h', 'a', 'o', ' ',\n4, 'S', 'h', 'a', ' ', 3, 'T', 'i', ' ', 3, 'L', 'i', ' ', 4, 'B', 'i', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 3, 'T', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'S', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 5, 'S', 'h', 'u', 'n', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'D', 'u', 'o', ' ', 3, 'H', 'u', ' ', 3, 'L', 'a', ' ', 4, 'J', 'i', 'u', ' ', 3, 'Q', 'i', ' ',\n5, 'L', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'B', 'i', 'n', ' ', 5, 'P', 'e', 'n', 'g', ' ', 3, 'M', 'o', ' ', 4, 'S', 'a', 'n', ' ',\n4, 'M', 'a', 'n', ' ', 4, 'M', 'a', 'n', ' ', 5, 'S', 'e', 'n', 'g', ' ', 3, 'X', 'u', ' ', 4, 'L', 'i', 'e', ' ', 5, 'Q', 'i', 'a', 'n', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'K', 'u', 'a', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'B', 'i', 'n', ' ',\n4, 'L', 'i', 'e', ' ', 5, 'R', 'a', 'n', 'g', ' ', 4, 'D', 'o', 'u', ' ', 4, 'D', 'o', 'u', ' ', 4, 'N', 'a', 'o', ' ', 5, 'H', 'o', 'n', 'g', ' ',\n3, 'X', 'i', ' ', 4, 'D', 'o', 'u', ' ', 4, 'H', 'a', 'n', ' ', 4, 'D', 'o', 'u', ' ', 4, 'D', 'o', 'u', ' ', 4, 'J', 'i', 'u', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'L', 'i', ' ', 5, 'J', 'u', 'a', 'n', ' ', 3, 'F', 'u', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ', 4, 'G', 'u', 'i', ' ', 6, 'S', 'h', 'a', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 4, 'G', 'u', 'i', ' ', 4, 'M', 'e', 'i', ' ', 3, 'J', 'i', ' ', 3, 'Q', 'i', ' ', 4, 'J', 'i', 'e', ' ',\n4, 'K', 'u', 'i', ' ', 4, 'H', 'u', 'n', ' ', 3, 'B', 'a', ' ', 3, 'P', 'o', ' ', 4, 'M', 'e', 'i', ' ', 3, 'X', 'u', ' ',\n4, 'Y', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 4, 'T', 'u', 'i', ' ', 3, 'Q', 'i', ' ',\n5, 'W', 'a', 'n', 'g', ' ', 6, 'L', 'i', 'a', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 5, 'P', 'i', 'a', 'o', ' ',\n3, 'B', 'i', ' ', 3, 'M', 'o', ' ', 3, 'J', 'i', ' ', 3, 'X', 'u', ' ', 5, 'C', 'h', 'o', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'D', 'a', 'o', ' ', 4, 'R', 'e', 'n', ' ', 3, 'J', 'i', ' ', 4, 'E', 'r', 'i', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 4, 'T', 'u', 'o', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'X', 'u', ' ', 2, 'E', ' ',\n2, 'E', ' ', 4, 'S', 'h', 'a', ' ', 5, 'H', 'a', 'n', 'g', ' ', 4, 'T', 'u', 'n', ' ', 3, 'M', 'o', ' ', 4, 'J', 'i', 'e', ' ',\n5, 'S', 'h', 'e', 'n', ' ', 4, 'F', 'a', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'B', 'i', ' ', 3, 'L', 'u', ' ', 4, 'W', 'e', 'n', ' ',\n3, 'H', 'u', ' ', 3, 'L', 'u', ' ', 3, 'Z', 'a', ' ', 5, 'F', 'a', 'n', 'g', ' ', 4, 'F', 'e', 'n', ' ', 3, 'N', 'a', ' ',\n4, 'Y', 'o', 'u', ' ', 7, 'N', 'a', 'm', 'a', 'z', 'u', ' ', 5, 'T', 'o', 'd', 'o', ' ', 3, 'H', 'e', ' ', 4, 'X', 'i', 'a', ' ', 3, 'Q', 'u', ' ',\n4, 'H', 'a', 'n', ' ', 3, 'P', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'T', 'u', 'o', ' ', 3, 'B', 'o', ' ', 4, 'Q', 'i', 'u', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'B', 'i', ' ', 3, 'J', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'J', 'u', ' ',\n5, 'D', 'i', 'a', 'o', ' ', 3, 'B', 'o', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'G', 'u', 'n', ' ', 3, 'P', 'i', ' ', 5, 'N', 'i', 'a', 'n', ' ',\n5, 'X', 'i', 'n', 'g', ' ', 4, 'T', 'a', 'i', ' ', 4, 'B', 'a', 'o', ' ', 3, 'F', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'J', 'u', ' ',\n3, 'G', 'u', ' ', 7, 'K', 'a', 'j', 'i', 'k', 'a', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'T', 'a', ' ', 4, 'J', 'i', 'e', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'H', 'o', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'E', 'r', ' ', 3, 'A', 'n', ' ', 4, 'W', 'e', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'L', 'i', 'e', ' ', 4, 'L', 'u', 'o', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'Y', 'i', ' ',\n3, 'Q', 'i', ' ', 5, 'B', 'i', 'n', 'g', ' ', 4, 'W', 'e', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'B', 'u', ' ', 4, 'G', 'u', 'i', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 3, 'G', 'e', ' ', 4, 'H', 'u', 'i', ' ', 5, 'B', 'o', 'r', 'a', ' ', 5, 'M', 'a', 't', 'e', ' ', 4, 'K', 'a', 'o', ' ',\n5, 'G', 'o', 'r', 'i', ' ', 4, 'D', 'u', 'o', ' ', 4, 'J', 'u', 'n', ' ', 3, 'T', 'i', ' ', 4, 'M', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'o', ' ',\n3, 'Z', 'a', ' ', 4, 'S', 'h', 'a', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'N', 'e', 'i', ' ', 4, 'Z', 'h', 'e', ' ',\n4, 'G', 'u', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'S', 'u', ' ', 3, 'W', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 5, 'T', 'i', 'n', 'g', ' ',\n3, 'F', 'u', ' ', 4, 'W', 'a', 'n', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'L', 'i', ' ', 4, 'S', 'h', 'a', ' ', 4, 'S', 'h', 'a', ' ',\n4, 'G', 'a', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'U', 'g', 'u', 'i', ' ', 6, 'A', 's', 'a', 'r', 'i', ' ', 10, 'S', 'u', 'b', 'a', 's', 'h', 'i', 'r', 'i', ' ', 9, 'K', 'a', 'z', 'u', 'n', 'o', 'k', 'o', ' ',\n5, 'Y', 'o', 'n', 'g', ' ', 3, 'N', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'Q', 'i', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ',\n4, 'N', 'e', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'J', 'i', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'Q', 'i', 'e', ' ', 3, 'G', 'u', ' ',\n5, 'Z', 'h', 'o', 'u', ' ', 5, 'D', 'o', 'n', 'g', ' ', 4, 'L', 'a', 'i', ' ', 4, 'F', 'e', 'i', ' ', 3, 'N', 'i', ' ', 3, 'Y', 'i', ' ',\n4, 'K', 'u', 'n', ' ', 3, 'L', 'u', ' ', 4, 'J', 'i', 'u', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'L', 'u', 'n', ' ',\n5, 'L', 'i', 'n', 'g', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'L', 'i', ' ', 5, 'M', 'e', 'n', 'g', ' ', 5, 'Z', 'o', 'n', 'g', ' ', 4, 'Z', 'h', 'i', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 7, 'S', 'h', 'a', 'c', 'h', 'i', ' ', 6, 'D', 'o', 'j', 'o', 'u', ' ', 8, 'S', 'u', 'k', 'e', 's', 'o', 'u', ' ', 4, 'S', 'h', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ',\n4, 'H', 'u', 'n', ' ', 4, 'S', 'h', 'i', ' ', 4, 'H', 'o', 'u', ' ', 5, 'X', 'i', 'n', 'g', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'L', 'a', ' ',\n5, 'Z', 'o', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'B', 'i', 'a', 'n', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ',\n3, 'Z', 'e', ' ', 4, 'W', 'e', 'i', ' ', 4, 'W', 'e', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'Q', 'u', 'n', ' ', 4, 'R', 'o', 'u', ' ',\n4, 'D', 'i', 'e', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'Q', 'i', 'u', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 3, 'B', 'i', ' ', 2, 'E', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ', 4, 'S', 'a', 'i', ' ',\n5, 'J', 'i', 'a', 'n', ' ', 4, 'X', 'i', 'a', ' ', 4, 'T', 'u', 'o', ' ', 3, 'H', 'u', ' ', 8, 'M', 'u', 'r', 'o', 'a', 'j', 'i', ' ', 4, 'R', 'u', 'o', ' ',\n7, 'H', 'a', 'r', 'a', 'k', 'a', ' ', 4, 'W', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'H', 'a', 'o', ' ', 3, 'W', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ',\n4, 'S', 'a', 'o', ' ', 4, 'L', 'i', 'u', ' ', 3, 'M', 'a', ' ', 4, 'S', 'h', 'i', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'i', 'n', ' ',\n2, 'Z', ' ', 5, 'T', 'e', 'n', 'g', ' ', 3, 'T', 'a', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'G', 'e', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 4, 'W', 'e', 'n', ' ', 4, 'R', 'u', 'o', ' ', 9, 'H', 'a', 't', 'a', 'h', 'a', 't', 'a', ' ', 5, 'L', 'i', 'a', 'n', ' ',\n3, 'A', 'o', ' ', 3, 'L', 'e', ' ', 4, 'H', 'u', 'i', ' ', 4, 'M', 'i', 'n', ' ', 3, 'J', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ',\n3, 'Q', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 4, 'M', 'a', 'n', ' ', 3, 'X', 'i', ' ', 4, 'Q', 'i', 'u', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 4, 'Q', 'i', 'u', ' ',\n6, 'Z', 'h', 'u', 'a', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 5, 'K', 'a', 'n', 'g', ' ', 4, 'X', 'u', 'e', ' ', 4, 'B', 'i', 'e', ' ',\n4, 'J', 'u', 'e', ' ', 3, 'Q', 'u', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'B', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'X', 'u', 'n', ' ',\n3, 'S', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'Z', 'u', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'F', 'a', 'n', ' ',\n4, 'J', 'u', 'e', ' ', 4, 'L', 'i', 'n', ' ', 4, 'X', 'u', 'n', ' ', 5, 'M', 'i', 'a', 'o', ' ', 3, 'X', 'i', ' ', 4, 'E', 's', 'o', ' ',\n5, 'K', 'y', 'o', 'u', ' ', 4, 'F', 'e', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 4, 'H', 'o', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 4, 'Z', 'e', 'i', ' ',\n4, 'S', 'a', 'o', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 4, 'G', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ',\n6, 'C', 'h', 'a', 'n', 'g', ' ', 9, 'H', 'a', 't', 'a', 'h', 'a', 't', 'a', ' ', 7, 'S', 'h', 'i', 'i', 'r', 'a', ' ', 6, 'M', 'u', 't', 's', 'u', ' ', 3, 'R', 'u', ' ', 3, 'J', 'i', ' ',\n3, 'X', 'u', ' ', 4, 'H', 'u', 'o', ' ', 7, 'S', 'h', 'i', 'i', 'r', 'a', ' ', 3, 'L', 'i', ' ', 4, 'L', 'i', 'e', ' ', 3, 'L', 'i', ' ',\n4, 'M', 'i', 'e', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 2, 'E', ' ', 3, 'L', 'u', ' ', 5, 'G', 'u', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'D', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'Y', 'o', 'u', ' ',\n4, 'T', 'u', 'n', ' ', 3, 'L', 'u', ' ', 5, 'F', 'a', 'n', 'g', ' ', 3, 'B', 'a', ' ', 3, 'H', 'e', ' ', 3, 'B', 'o', ' ',\n5, 'P', 'i', 'n', 'g', ' ', 5, 'N', 'i', 'a', 'n', ' ', 3, 'L', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'Z', 'h', 'a', ' ', 3, 'F', 'u', ' ',\n3, 'B', 'o', ' ', 4, 'B', 'a', 'o', ' ', 4, 'H', 'o', 'u', ' ', 3, 'P', 'i', ' ', 4, 'T', 'a', 'i', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'K', 'a', 'o', ' ', 4, 'W', 'e', 'i', ' ', 3, 'E', 'r', ' ', 5, 'T', 'o', 'n', 'g', ' ', 3, 'Z', 'e', ' ',\n4, 'H', 'o', 'u', ' ', 5, 'K', 'u', 'a', 'i', ' ', 3, 'J', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'Z', 'a', ' ',\n6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'X', 'u', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'L', 'i', ' ', 5, 'L', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n3, 'L', 'i', ' ', 4, 'S', 'h', 'i', ' ', 5, 'T', 'i', 'a', 'o', ' ', 4, 'G', 'u', 'n', ' ', 4, 'S', 'h', 'a', ' ', 4, 'W', 'a', 'n', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'J', 'i', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'Q', 'i', ' ',\n4, 'Z', 'o', 'u', ' ', 4, 'F', 'e', 'i', ' ', 4, 'K', 'u', 'n', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ', 3, 'N', 'i', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 5, 'D', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'n', 'g', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Z', 'i', ' ',\n4, 'F', 'e', 'n', ' ', 4, 'D', 'i', 'e', ' ', 3, 'B', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'W', 'e', 'n', ' ',\n4, 'W', 'e', 'i', ' ', 4, 'S', 'a', 'i', ' ', 2, 'E', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'F', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 6, 'J', 'i', 'a', 'n', 'g', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'S', 'a', 'o', ' ', 3, 'A', 'o', ' ', 3, 'Q', 'i', ' ',\n3, 'T', 'a', ' ', 4, 'Y', 'i', 'n', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'L', 'e', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'X', 'u', 'e', ' ', 4, 'B', 'i', 'e', ' ', 4, 'M', 'a', 'n', ' ', 4, 'M', 'i', 'n', ' ', 5, 'Y', 'o', 'n', 'g', ' ',\n4, 'W', 'e', 'i', ' ', 3, 'X', 'i', ' ', 4, 'J', 'u', 'e', ' ', 5, 'S', 'h', 'a', 'n', ' ', 4, 'L', 'i', 'n', ' ', 4, 'Z', 'u', 'n', ' ',\n4, 'H', 'u', 'o', ' ', 4, 'G', 'a', 'n', ' ', 3, 'L', 'i', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'G', 'u', 'a', 'n', ' ', 5, 'N', 'i', 'a', 'o', ' ',\n3, 'Y', 'i', ' ', 3, 'F', 'u', ' ', 3, 'L', 'i', ' ', 4, 'J', 'i', 'u', ' ', 3, 'B', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'F', 'u', ' ', 5, 'D', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'N', 'i', 'o', ' ', 4, 'G', 'a', 'n', ' ',\n4, 'S', 'h', 'i', ' ', 5, 'F', 'e', 'n', 'g', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ',\n3, 'H', 'u', ' ', 4, 'Q', 'i', 'n', ' ', 3, 'F', 'u', ' ', 4, 'F', 'e', 'n', ' ', 4, 'W', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'Y', 'u', ' ', 4, 'F', 'o', 'u', ' ', 5, 'Y', 'i', 'a', 'o', ' ', 4, 'J', 'u', 'e', ' ', 4, 'J', 'u', 'e', ' ',\n3, 'P', 'i', ' ', 5, 'H', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'B', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Y', 'a', ' ',\n6, 'Z', 'h', 'e', 'n', 'g', ' ', 5, 'F', 'a', 'n', 'g', ' ', 5, 'F', 'e', 'n', 'g', ' ', 4, 'W', 'e', 'n', ' ', 3, 'O', 'u', ' ', 3, 'T', 'e', ' ',\n4, 'J', 'i', 'a', ' ', 3, 'N', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'M', 'i', 'e', ' ', 3, 'F', 'u', ' ', 4, 'T', 'u', 'o', ' ',\n4, 'W', 'e', 'n', ' ', 3, 'L', 'i', ' ', 5, 'B', 'i', 'a', 'n', ' ', 4, 'Z', 'h', 'i', ' ', 3, 'G', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ',\n3, 'Z', 'i', ' ', 3, 'Q', 'u', ' ', 5, 'X', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'D', 'a', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'Y', 'o', 'u', ' ', 3, 'G', 'u', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'R', 'o', 'n', 'g', ' ',\n3, 'Y', 'a', ' ', 4, 'T', 'i', 'e', ' ', 3, 'Y', 'u', ' ', 6, 'S', 'h', 'i', 'g', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'i', ' ',\n3, 'W', 'u', ' ', 3, 'E', 'r', ' ', 4, 'G', 'u', 'a', ' ', 3, 'A', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'Y', 'a', 'n', ' ',\n5, 'H', 'e', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'J', 'i', ' ', 4, 'L', 'i', 'e', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'R', 'e', 'n', ' ',\n3, 'Y', 'i', ' ', 5, 'H', 'o', 'n', 'g', ' ', 4, 'L', 'u', 'o', ' ', 3, 'R', 'u', ' ', 4, 'M', 'o', 'u', ' ', 3, 'G', 'e', ' ',\n4, 'R', 'e', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'X', 'i', 'u', ' ', 5, 'Z', 'h', 'o', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'L', 'u', 'o', ' ',\n8, 'C', 'h', 'i', 'd', 'o', 'r', 'i', ' ', 5, 'T', 'o', 'k', 'i', ' ', 4, 'T', 'e', 'n', ' ', 5, 'L', 'u', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'J', 'i', ' ',\n3, 'Y', 'u', ' ', 5, 'H', 'u', 'a', 'n', ' ', 4, 'T', 'u', 'o', ' ', 3, 'B', 'u', ' ', 3, 'W', 'u', ' ', 5, 'J', 'u', 'a', 'n', ' ',\n3, 'Y', 'u', ' ', 3, 'B', 'o', ' ', 4, 'X', 'u', 'n', ' ', 4, 'X', 'u', 'n', ' ', 3, 'B', 'i', ' ', 3, 'X', 'i', ' ',\n4, 'J', 'u', 'n', ' ', 3, 'J', 'u', ' ', 3, 'T', 'u', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'T', 'i', ' ', 2, 'E', ' ',\n2, 'E', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 3, 'H', 'u', ' ', 3, 'W', 'u', ' ', 5, 'S', 'h', 'e', 'n', ' ', 4, 'L', 'a', 'i', ' ',\n8, 'I', 'k', 'a', 'r', 'u', 'g', 'a', ' ', 7, 'K', 'a', 'k', 'e', 's', 'u', ' ', 3, 'L', 'u', ' ', 5, 'P', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 3, 'F', 'u', ' ',\n3, 'A', 'n', ' ', 5, 'Z', 'h', 'a', 'o', ' ', 5, 'P', 'e', 'n', 'g', ' ', 4, 'Q', 'i', 'n', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 4, 'B', 'e', 'i', ' ',\n5, 'D', 'i', 'a', 'o', ' ', 3, 'L', 'u', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 3, 'T', 'u', ' ',\n3, 'Y', 'a', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'Q', 'i', ' ', 3, 'L', 'i', ' ', 3, 'Y', 'e', ' ', 5, 'Z', 'h', 'u', 'i', ' ',\n5, 'K', 'o', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'i', ' ', 4, 'K', 'u', 'n', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'Y', 'i', ' ', 3, 'Y', 'i', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 4, 'L', 'a', 'i', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n3, 'Q', 'i', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 3, 'J', 'u', ' ', 3, 'Q', 'u', ' ', 6, 'I', 's', 'u', 'k', 'a', ' ',\n12, 'K', 'i', 'k', 'u', 'i', 't', 'a', 'd', 'a', 'k', 'i', ' ', 3, 'J', 'i', ' ', 4, 'S', 'h', 'u', ' ', 4, 'C', 'h', 'i', ' ', 5, 'M', 'i', 'a', 'o', ' ', 4, 'R', 'o', 'u', ' ',\n3, 'A', 'n', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'T', 'i', ' ', 3, 'H', 'u', ' ', 3, 'T', 'i', ' ', 2, 'E', ' ',\n4, 'J', 'i', 'e', ' ', 4, 'M', 'a', 'o', ' ', 3, 'F', 'u', ' ', 5, 'C', 'h', 'u', 'n', ' ', 3, 'T', 'u', ' ', 4, 'Y', 'a', 'n', ' ',\n3, 'H', 'e', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'P', 'i', 'a', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'M', 'e', 'i', ' ', 3, 'H', 'u', ' ',\n5, 'Y', 'i', 'n', 'g', ' ', 4, 'D', 'u', 'n', ' ', 3, 'M', 'u', ' ', 3, 'J', 'u', ' ', 8, 'T', 's', 'u', 'g', 'u', 'm', 'i', ' ', 5, 'C', 'a', 'n', 'g', ' ',\n5, 'F', 'a', 'n', 'g', ' ', 3, 'G', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'W', 'e', 'n', 'g', ' ',\n4, 'S', 'h', 'i', ' ', 3, 'H', 'e', ' ', 4, 'C', 'h', 'u', ' ', 5, 'T', 'a', 'n', 'g', ' ', 4, 'X', 'i', 'a', ' ', 4, 'R', 'u', 'o', ' ',\n4, 'L', 'i', 'u', ' ', 3, 'J', 'i', ' ', 3, 'G', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'Z', 'h', 'u', 'n', ' ', 4, 'H', 'a', 'n', ' ',\n3, 'Z', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'N', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'J', 'i', ' ',\n3, 'L', 'i', ' ', 5, 'T', 'i', 'a', 'n', ' ', 4, 'K', 'o', 'u', ' ', 3, 'T', 'i', ' ', 3, 'T', 'i', ' ', 3, 'N', 'i', ' ',\n3, 'T', 'u', ' ', 3, 'M', 'a', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'G', 'a', 'o', ' ', 5, 'T', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ',\n3, 'L', 'i', ' ', 6, 'Z', 'h', 'u', 'a', 'n', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'A', 'o', ' ', 4, 'Y', 'a', 'o', ' ', 3, 'Y', 'i', ' ',\n3, 'O', 'u', ' ', 4, 'C', 'h', 'i', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'R', 'o', 'n', 'g', ' ', 4, 'L', 'o', 'u', ' ',\n3, 'B', 'i', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 5, 'Z', 'h', 'u', 'o', ' ', 3, 'Y', 'u', ' ', 3, 'W', 'u', ' ', 4, 'J', 'u', 'e', ' ',\n4, 'Y', 'i', 'n', ' ', 5, 'Q', 'u', 'a', 'n', ' ', 3, 'S', 'i', ' ', 5, 'J', 'i', 'a', 'o', ' ', 3, 'Y', 'i', ' ', 4, 'H', 'u', 'a', ' ',\n3, 'B', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'S', 'u', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'F', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'o', ' ',\n5, 'L', 'i', 'a', 'o', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'K', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ',\n3, 'T', 'u', ' ', 4, 'M', 'a', 'i', ' ', 4, 'Z', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 3, 'L', 'u', ' ',\n5, 'T', 'u', 'a', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'X', 'u', 'e', ' ', 3, 'Y', 'i', ' ', 3, 'P', 'i', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'L', 'u', 'o', ' ', 3, 'Q', 'i', ' ', 3, 'Y', 'i', ' ', 3, 'J', 'i', ' ', 4, 'Z', 'h', 'e', ' ', 3, 'Y', 'u', ' ',\n5, 'Z', 'h', 'a', 'n', ' ', 3, 'Y', 'e', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'P', 'i', ' ', 5, 'N', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ',\n3, 'M', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'M', 'e', 'n', 'g', ' ', 3, 'D', 'i', ' ', 4, 'Y', 'u', 'e', ' ', 3, 'Y', 'u', ' ',\n4, 'L', 'e', 'i', ' ', 4, 'B', 'a', 'o', ' ', 3, 'L', 'u', ' ', 3, 'H', 'e', ' ', 5, 'L', 'o', 'n', 'g', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ',\n4, 'Y', 'u', 'e', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 5, 'G', 'u', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 3, 'L', 'i', ' ', 5, 'L', 'u', 'a', 'n', ' ',\n5, 'N', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 3, 'J', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'M', 'i', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ',\n3, 'O', 'u', ' ', 3, 'Y', 'a', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'B', 'a', 'o', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 3, 'G', 'u', ' ',\n5, 'D', 'o', 'n', 'g', ' ', 3, 'L', 'u', ' ', 3, 'Y', 'a', ' ', 5, 'X', 'i', 'a', 'o', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'Q', 'u', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 4, 'X', 'u', 'e', ' ', 4, 'T', 'u', 'o', ' ', 3, 'S', 'i', ' ',\n4, 'Z', 'h', 'i', ' ', 3, 'E', 'r', ' ', 4, 'G', 'u', 'a', ' ', 4, 'X', 'i', 'u', ' ', 5, 'H', 'e', 'n', 'g', ' ', 5, 'Z', 'h', 'o', 'u', ' ',\n3, 'G', 'e', ' ', 5, 'L', 'u', 'a', 'n', ' ', 5, 'H', 'o', 'n', 'g', ' ', 3, 'W', 'u', ' ', 3, 'B', 'o', ' ', 3, 'L', 'i', ' ',\n5, 'J', 'u', 'a', 'n', ' ', 3, 'H', 'u', ' ', 2, 'E', ' ', 3, 'Y', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'T', 'i', ' ',\n3, 'W', 'u', ' ', 4, 'Q', 'u', 'e', ' ', 5, 'M', 'i', 'a', 'o', ' ', 3, 'A', 'n', ' ', 4, 'K', 'u', 'n', ' ', 4, 'B', 'e', 'i', ' ',\n5, 'P', 'e', 'n', 'g', ' ', 5, 'Q', 'i', 'a', 'n', ' ', 5, 'C', 'h', 'u', 'n', ' ', 5, 'G', 'e', 'n', 'g', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'S', 'u', ' ',\n3, 'H', 'u', ' ', 3, 'H', 'e', ' ', 2, 'E', ' ', 3, 'G', 'u', ' ', 4, 'Q', 'i', 'u', ' ', 3, 'Z', 'i', ' ',\n4, 'M', 'e', 'i', ' ', 3, 'M', 'u', ' ', 3, 'N', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 5, 'W', 'e', 'n', 'g', ' ', 4, 'L', 'i', 'u', ' ',\n3, 'J', 'i', ' ', 3, 'N', 'i', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'H', 'e', ' ', 3, 'Y', 'i', ' ', 5, 'Y', 'i', 'n', 'g', ' ',\n4, 'Z', 'h', 'e', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'a', 'o', ' ', 5, 'J', 'i', 'a', 'o', ' ', 4, 'J', 'i', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'L', 'u', ' ', 5, 'X', 'u', 'a', 'n', ' ', 5, 'Z', 'h', 'a', 'n', ' ', 5, 'Y', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'o', ' ', 5, 'M', 'e', 'n', 'g', ' ',\n5, 'G', 'u', 'a', 'n', ' ', 7, 'S', 'h', 'u', 'a', 'n', 'g', ' ', 3, 'L', 'u', ' ', 4, 'J', 'i', 'n', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'a', 'n', ' ',\n5, 'X', 'i', 'a', 'n', ' ', 4, 'C', 'u', 'o', ' ', 5, 'J', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'C', 'u', 'o', ' ',\n3, 'L', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 3, 'C', 'u', ' ', 3, 'J', 'i', ' ', 5, 'B', 'i', 'a', 'o', ' ', 3, 'C', 'u', ' ',\n5, 'B', 'i', 'a', 'o', ' ', 4, 'Z', 'h', 'u', ' ', 4, 'J', 'u', 'n', ' ', 4, 'Z', 'h', 'u', ' ', 5, 'J', 'i', 'a', 'n', ' ', 3, 'M', 'i', ' ',\n3, 'M', 'i', ' ', 3, 'W', 'u', ' ', 4, 'L', 'i', 'u', ' ', 5, 'C', 'h', 'e', 'n', ' ', 4, 'J', 'u', 'n', ' ', 4, 'L', 'i', 'n', ' ',\n3, 'N', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'L', 'u', ' ', 4, 'J', 'i', 'u', ' ', 4, 'J', 'u', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'L', 'i', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'J', 'i', 'a', ' ', 3, 'M', 'i', ' ', 3, 'L', 'i', ' ',\n4, 'S', 'h', 'e', ' ', 6, 'Z', 'h', 'a', 'n', 'g', ' ', 4, 'L', 'i', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'J', 'i', ' ', 5, 'L', 'i', 'n', 'g', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'C', 'u', ' ', 4, 'M', 'a', 'i', ' ', 4, 'M', 'a', 'i', ' ', 3, 'G', 'e', ' ', 5, 'C', 'h', 'a', 'o', ' ',\n3, 'F', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'F', 'u', ' ', 4, 'P', 'a', 'o', ' ', 3, 'Q', 'u', ' ',\n3, 'Q', 'u', ' ', 4, 'M', 'o', 'u', ' ', 3, 'F', 'u', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'L', 'a', 'i', ' ', 3, 'Q', 'u', ' ',\n5, 'M', 'i', 'a', 'n', ' ', 5, 'F', 'e', 'n', 'g', ' ', 3, 'F', 'u', ' ', 3, 'Q', 'u', ' ', 5, 'M', 'i', 'a', 'n', ' ', 3, 'M', 'a', ' ',\n3, 'M', 'o', ' ', 3, 'M', 'o', ' ', 4, 'H', 'u', 'i', ' ', 3, 'M', 'a', ' ', 4, 'Z', 'o', 'u', ' ', 4, 'N', 'e', 'n', ' ',\n4, 'F', 'e', 'n', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 6, 'H', 'u', 'a', 'n', 'g', ' ', 4, 'J', 'i', 'n', ' ', 6, 'G', 'u', 'a', 'n', 'g', ' ', 5, 'T', 'i', 'a', 'n', ' ',\n4, 'T', 'o', 'u', ' ', 5, 'H', 'e', 'n', 'g', ' ', 3, 'X', 'i', ' ', 6, 'K', 'u', 'a', 'n', 'g', ' ', 5, 'H', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ',\n3, 'L', 'i', ' ', 5, 'N', 'i', 'a', 'n', ' ', 4, 'C', 'h', 'i', ' ', 4, 'H', 'e', 'i', ' ', 4, 'H', 'e', 'i', ' ', 3, 'Y', 'i', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'n', ' ', 3, 'X', 'i', ' ', 5, 'T', 'u', 'a', 'n', ' ', 3, 'M', 'o', ' ', 3, 'M', 'o', ' ',\n5, 'Q', 'i', 'a', 'n', ' ', 4, 'D', 'a', 'i', ' ', 4, 'C', 'h', 'u', ' ', 4, 'Y', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ', 3, 'Y', 'i', ' ',\n4, 'X', 'i', 'a', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'Q', 'u', ' ', 4, 'M', 'e', 'i', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ',\n3, 'Y', 'u', ' ', 3, 'L', 'i', ' ', 5, 'D', 'a', 'n', 'g', ' ', 3, 'D', 'u', ' ', 4, 'C', 'a', 'n', ' ', 4, 'Y', 'i', 'n', ' ',\n3, 'A', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 4, 'T', 'a', 'n', ' ', 3, 'A', 'n', ' ', 5, 'Z', 'h', 'e', 'n', ' ', 4, 'D', 'a', 'i', ' ',\n4, 'C', 'a', 'n', ' ', 3, 'Y', 'i', ' ', 4, 'M', 'e', 'i', ' ', 4, 'D', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ', 3, 'D', 'u', ' ',\n3, 'L', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 4, 'F', 'e', 'n', ' ', 3, 'F', 'u', ' ', 3, 'F', 'u', ' ', 4, 'M', 'i', 'n', ' ',\n4, 'M', 'i', 'n', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'C', 'u', ' ', 3, 'Q', 'u', ' ', 5, 'C', 'h', 'a', 'o', ' ', 3, 'W', 'a', ' ',\n4, 'Z', 'h', 'u', ' ', 4, 'Z', 'h', 'i', ' ', 5, 'M', 'a', 'n', 'g', ' ', 3, 'A', 'o', ' ', 4, 'B', 'i', 'e', ' ', 4, 'T', 'u', 'o', ' ',\n3, 'B', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'C', 'h', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'M', 'i', ' ',\n4, 'N', 'a', 'i', ' ', 5, 'D', 'i', 'n', 'g', ' ', 3, 'Z', 'i', ' ', 3, 'G', 'u', ' ', 3, 'G', 'u', ' ', 5, 'D', 'o', 'n', 'g', ' ',\n4, 'F', 'e', 'n', ' ', 4, 'T', 'a', 'o', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 3, 'P', 'i', ' ', 6, 'C', 'h', 'a', 'n', 'g', ' ', 4, 'G', 'a', 'o', ' ',\n3, 'Q', 'i', ' ', 5, 'Y', 'u', 'a', 'n', ' ', 5, 'T', 'a', 'n', 'g', ' ', 5, 'T', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'u', ' ', 4, 'S', 'h', 'u', ' ',\n4, 'F', 'e', 'n', ' ', 4, 'F', 'e', 'i', ' ', 4, 'W', 'e', 'n', ' ', 3, 'B', 'a', ' ', 5, 'D', 'i', 'a', 'o', ' ', 4, 'T', 'u', 'o', ' ',\n5, 'T', 'o', 'n', 'g', ' ', 3, 'Q', 'u', ' ', 6, 'S', 'h', 'e', 'n', 'g', ' ', 4, 'S', 'h', 'i', ' ', 4, 'Y', 'o', 'u', ' ', 4, 'S', 'h', 'i', ' ',\n5, 'T', 'i', 'n', 'g', ' ', 3, 'W', 'u', ' ', 5, 'N', 'i', 'a', 'n', ' ', 5, 'J', 'i', 'n', 'g', ' ', 4, 'H', 'u', 'n', ' ', 3, 'J', 'u', ' ',\n4, 'Y', 'a', 'n', ' ', 3, 'T', 'u', ' ', 3, 'T', 'i', ' ', 3, 'X', 'i', ' ', 5, 'X', 'i', 'a', 'n', ' ', 4, 'Y', 'a', 'n', ' ',\n4, 'L', 'e', 'i', ' ', 3, 'B', 'i', ' ', 4, 'Y', 'a', 'o', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'H', 'a', 'n', ' ', 3, 'W', 'u', ' ',\n3, 'W', 'u', ' ', 4, 'H', 'o', 'u', ' ', 3, 'X', 'i', ' ', 3, 'G', 'e', ' ', 4, 'Z', 'h', 'a', ' ', 4, 'X', 'i', 'u', ' ',\n5, 'W', 'e', 'n', 'g', ' ', 4, 'Z', 'h', 'a', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'N', 'a', 'n', 'g', ' ', 3, 'Q', 'i', ' ', 5, 'Z', 'h', 'a', 'i', ' ',\n3, 'J', 'i', ' ', 3, 'Z', 'i', ' ', 3, 'J', 'i', ' ', 3, 'J', 'i', ' ', 3, 'Q', 'i', ' ', 3, 'J', 'i', ' ',\n4, 'C', 'h', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'H', 'e', ' ', 3, 'Y', 'a', ' ', 4, 'K', 'e', 'n', ' ',\n4, 'X', 'i', 'e', ' ', 4, 'P', 'a', 'o', ' ', 4, 'C', 'u', 'o', ' ', 4, 'S', 'h', 'i', ' ', 3, 'Z', 'i', ' ', 4, 'C', 'h', 'i', ' ',\n5, 'N', 'i', 'a', 'n', ' ', 3, 'J', 'u', ' ', 5, 'T', 'i', 'a', 'o', ' ', 5, 'L', 'i', 'n', 'g', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'C', 'h', 'u', ' ',\n5, 'Q', 'u', 'a', 'n', ' ', 4, 'X', 'i', 'e', ' ', 4, 'K', 'e', 'n', ' ', 4, 'N', 'i', 'e', ' ', 4, 'J', 'i', 'u', ' ', 4, 'Y', 'a', 'o', ' ',\n5, 'C', 'h', 'u', 'o', ' ', 4, 'K', 'u', 'n', ' ', 3, 'Y', 'u', ' ', 4, 'C', 'h', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'N', 'i', ' ',\n4, 'C', 'u', 'o', ' ', 4, 'Z', 'o', 'u', ' ', 3, 'Q', 'u', ' ', 4, 'N', 'e', 'n', ' ', 5, 'X', 'i', 'a', 'n', ' ', 3, 'O', 'u', ' ',\n2, 'E', ' ', 3, 'W', 'o', ' ', 3, 'Y', 'i', ' ', 5, 'C', 'h', 'u', 'o', ' ', 4, 'Z', 'o', 'u', ' ', 5, 'D', 'i', 'a', 'n', ' ',\n4, 'C', 'h', 'u', ' ', 4, 'J', 'i', 'n', ' ', 3, 'Y', 'a', ' ', 4, 'C', 'h', 'i', ' ', 5, 'C', 'h', 'e', 'n', ' ', 3, 'H', 'e', ' ',\n4, 'K', 'e', 'n', ' ', 3, 'J', 'u', ' ', 5, 'L', 'i', 'n', 'g', ' ', 4, 'P', 'a', 'o', ' ', 5, 'T', 'i', 'a', 'o', ' ', 3, 'Z', 'i', ' ',\n4, 'K', 'e', 'n', ' ', 3, 'Y', 'u', ' ', 5, 'C', 'h', 'u', 'o', ' ', 3, 'Q', 'u', ' ', 3, 'W', 'o', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'P', 'a', 'n', 'g', ' ', 5, 'G', 'o', 'n', 'g', ' ', 5, 'P', 'a', 'n', 'g', ' ', 4, 'Y', 'a', 'n', ' ', 5, 'L', 'o', 'n', 'g', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 3, 'T', 'a', ' ', 5, 'L', 'i', 'n', 'g', ' ', 3, 'T', 'a', ' ', 5, 'L', 'o', 'n', 'g', ' ',\n5, 'G', 'o', 'n', 'g', ' ', 4, 'K', 'a', 'n', ' ', 4, 'G', 'u', 'i', ' ', 4, 'Q', 'i', 'u', ' ', 4, 'B', 'i', 'e', ' ', 4, 'G', 'u', 'i', ' ',\n4, 'Y', 'u', 'e', ' ', 5, 'C', 'h', 'u', 'i', ' ', 3, 'H', 'e', ' ', 4, 'J', 'u', 'e', ' ', 4, 'X', 'i', 'e', ' ', 3, 'Y', 'u', ' ',\n2, 'i', 't', 2, 'i', 'x', 1, 'i', 2, 'i', 'p', 3, 'i', 'e', 't', 3, 'i', 'e', 'x',\n2, 'i', 'e', 3, 'i', 'e', 'p', 2, 'a', 't', 2, 'a', 'x', 1, 'a', 2, 'a', 'p',\n3, 'u', 'o', 'x', 2, 'u', 'o', 3, 'u', 'o', 'p', 2, 'o', 't', 2, 'o', 'x', 1, 'o',\n2, 'o', 'p', 2, 'e', 'x', 1, 'e', 2, 'w', 'u', 3, 'b', 'i', 't', 3, 'b', 'i', 'x',\n2, 'b', 'i', 3, 'b', 'i', 'p', 4, 'b', 'i', 'e', 't', 4, 'b', 'i', 'e', 'x', 3, 'b', 'i', 'e', 4, 'b', 'i', 'e', 'p',\n3, 'b', 'a', 't', 3, 'b', 'a', 'x', 2, 'b', 'a', 3, 'b', 'a', 'p', 4, 'b', 'u', 'o', 'x', 3, 'b', 'u', 'o',\n4, 'b', 'u', 'o', 'p', 3, 'b', 'o', 't', 3, 'b', 'o', 'x', 2, 'b', 'o', 3, 'b', 'o', 'p', 3, 'b', 'e', 'x',\n2, 'b', 'e', 3, 'b', 'e', 'p', 3, 'b', 'u', 't', 3, 'b', 'u', 'x', 2, 'b', 'u', 3, 'b', 'u', 'p',\n4, 'b', 'u', 'r', 'x', 3, 'b', 'u', 'r', 3, 'b', 'y', 't', 3, 'b', 'y', 'x', 2, 'b', 'y', 3, 'b', 'y', 'p',\n4, 'b', 'y', 'r', 'x', 3, 'b', 'y', 'r', 3, 'p', 'i', 't', 3, 'p', 'i', 'x', 2, 'p', 'i', 3, 'p', 'i', 'p',\n4, 'p', 'i', 'e', 'x', 3, 'p', 'i', 'e', 4, 'p', 'i', 'e', 'p', 3, 'p', 'a', 't', 3, 'p', 'a', 'x', 2, 'p', 'a',\n3, 'p', 'a', 'p', 4, 'p', 'u', 'o', 'x', 3, 'p', 'u', 'o', 4, 'p', 'u', 'o', 'p', 3, 'p', 'o', 't', 3, 'p', 'o', 'x',\n2, 'p', 'o', 3, 'p', 'o', 'p', 3, 'p', 'u', 't', 3, 'p', 'u', 'x', 2, 'p', 'u', 3, 'p', 'u', 'p',\n4, 'p', 'u', 'r', 'x', 3, 'p', 'u', 'r', 3, 'p', 'y', 't', 3, 'p', 'y', 'x', 2, 'p', 'y', 3, 'p', 'y', 'p',\n4, 'p', 'y', 'r', 'x', 3, 'p', 'y', 'r', 4, 'b', 'b', 'i', 't', 4, 'b', 'b', 'i', 'x', 3, 'b', 'b', 'i', 4, 'b', 'b', 'i', 'p',\n5, 'b', 'b', 'i', 'e', 't', 5, 'b', 'b', 'i', 'e', 'x', 4, 'b', 'b', 'i', 'e', 5, 'b', 'b', 'i', 'e', 'p', 4, 'b', 'b', 'a', 't', 4, 'b', 'b', 'a', 'x',\n3, 'b', 'b', 'a', 4, 'b', 'b', 'a', 'p', 5, 'b', 'b', 'u', 'o', 'x', 4, 'b', 'b', 'u', 'o', 5, 'b', 'b', 'u', 'o', 'p', 4, 'b', 'b', 'o', 't',\n4, 'b', 'b', 'o', 'x', 3, 'b', 'b', 'o', 4, 'b', 'b', 'o', 'p', 4, 'b', 'b', 'e', 'x', 3, 'b', 'b', 'e', 4, 'b', 'b', 'e', 'p',\n4, 'b', 'b', 'u', 't', 4, 'b', 'b', 'u', 'x', 3, 'b', 'b', 'u', 4, 'b', 'b', 'u', 'p', 5, 'b', 'b', 'u', 'r', 'x', 4, 'b', 'b', 'u', 'r',\n4, 'b', 'b', 'y', 't', 4, 'b', 'b', 'y', 'x', 3, 'b', 'b', 'y', 4, 'b', 'b', 'y', 'p', 4, 'n', 'b', 'i', 't', 4, 'n', 'b', 'i', 'x',\n3, 'n', 'b', 'i', 4, 'n', 'b', 'i', 'p', 5, 'n', 'b', 'i', 'e', 'x', 4, 'n', 'b', 'i', 'e', 5, 'n', 'b', 'i', 'e', 'p', 4, 'n', 'b', 'a', 't',\n4, 'n', 'b', 'a', 'x', 3, 'n', 'b', 'a', 4, 'n', 'b', 'a', 'p', 4, 'n', 'b', 'o', 't', 4, 'n', 'b', 'o', 'x', 3, 'n', 'b', 'o',\n4, 'n', 'b', 'o', 'p', 4, 'n', 'b', 'u', 't', 4, 'n', 'b', 'u', 'x', 3, 'n', 'b', 'u', 4, 'n', 'b', 'u', 'p', 5, 'n', 'b', 'u', 'r', 'x',\n4, 'n', 'b', 'u', 'r', 4, 'n', 'b', 'y', 't', 4, 'n', 'b', 'y', 'x', 3, 'n', 'b', 'y', 4, 'n', 'b', 'y', 'p', 5, 'n', 'b', 'y', 'r', 'x',\n4, 'n', 'b', 'y', 'r', 4, 'h', 'm', 'i', 't', 4, 'h', 'm', 'i', 'x', 3, 'h', 'm', 'i', 4, 'h', 'm', 'i', 'p', 5, 'h', 'm', 'i', 'e', 'x',\n4, 'h', 'm', 'i', 'e', 5, 'h', 'm', 'i', 'e', 'p', 4, 'h', 'm', 'a', 't', 4, 'h', 'm', 'a', 'x', 3, 'h', 'm', 'a', 4, 'h', 'm', 'a', 'p',\n5, 'h', 'm', 'u', 'o', 'x', 4, 'h', 'm', 'u', 'o', 5, 'h', 'm', 'u', 'o', 'p', 4, 'h', 'm', 'o', 't', 4, 'h', 'm', 'o', 'x', 3, 'h', 'm', 'o',\n4, 'h', 'm', 'o', 'p', 4, 'h', 'm', 'u', 't', 4, 'h', 'm', 'u', 'x', 3, 'h', 'm', 'u', 4, 'h', 'm', 'u', 'p', 5, 'h', 'm', 'u', 'r', 'x',\n4, 'h', 'm', 'u', 'r', 4, 'h', 'm', 'y', 'x', 3, 'h', 'm', 'y', 4, 'h', 'm', 'y', 'p', 5, 'h', 'm', 'y', 'r', 'x', 4, 'h', 'm', 'y', 'r',\n3, 'm', 'i', 't', 3, 'm', 'i', 'x', 2, 'm', 'i', 3, 'm', 'i', 'p', 4, 'm', 'i', 'e', 'x', 3, 'm', 'i', 'e',\n4, 'm', 'i', 'e', 'p', 3, 'm', 'a', 't', 3, 'm', 'a', 'x', 2, 'm', 'a', 3, 'm', 'a', 'p', 4, 'm', 'u', 'o', 't',\n4, 'm', 'u', 'o', 'x', 3, 'm', 'u', 'o', 4, 'm', 'u', 'o', 'p', 3, 'm', 'o', 't', 3, 'm', 'o', 'x', 2, 'm', 'o',\n3, 'm', 'o', 'p', 3, 'm', 'e', 'x', 2, 'm', 'e', 3, 'm', 'u', 't', 3, 'm', 'u', 'x', 2, 'm', 'u',\n3, 'm', 'u', 'p', 4, 'm', 'u', 'r', 'x', 3, 'm', 'u', 'r', 3, 'm', 'y', 't', 3, 'm', 'y', 'x', 2, 'm', 'y',\n3, 'm', 'y', 'p', 3, 'f', 'i', 't', 3, 'f', 'i', 'x', 2, 'f', 'i', 3, 'f', 'i', 'p', 3, 'f', 'a', 't',\n3, 'f', 'a', 'x', 2, 'f', 'a', 3, 'f', 'a', 'p', 3, 'f', 'o', 'x', 2, 'f', 'o', 3, 'f', 'o', 'p',\n3, 'f', 'u', 't', 3, 'f', 'u', 'x', 2, 'f', 'u', 3, 'f', 'u', 'p', 4, 'f', 'u', 'r', 'x', 3, 'f', 'u', 'r',\n3, 'f', 'y', 't', 3, 'f', 'y', 'x', 2, 'f', 'y', 3, 'f', 'y', 'p', 3, 'v', 'i', 't', 3, 'v', 'i', 'x',\n2, 'v', 'i', 3, 'v', 'i', 'p', 4, 'v', 'i', 'e', 't', 4, 'v', 'i', 'e', 'x', 3, 'v', 'i', 'e', 4, 'v', 'i', 'e', 'p',\n3, 'v', 'a', 't', 3, 'v', 'a', 'x', 2, 'v', 'a', 3, 'v', 'a', 'p', 3, 'v', 'o', 't', 3, 'v', 'o', 'x',\n2, 'v', 'o', 3, 'v', 'o', 'p', 3, 'v', 'e', 'x', 3, 'v', 'e', 'p', 3, 'v', 'u', 't', 3, 'v', 'u', 'x',\n2, 'v', 'u', 3, 'v', 'u', 'p', 4, 'v', 'u', 'r', 'x', 3, 'v', 'u', 'r', 3, 'v', 'y', 't', 3, 'v', 'y', 'x',\n2, 'v', 'y', 3, 'v', 'y', 'p', 4, 'v', 'y', 'r', 'x', 3, 'v', 'y', 'r', 3, 'd', 'i', 't', 3, 'd', 'i', 'x',\n2, 'd', 'i', 3, 'd', 'i', 'p', 4, 'd', 'i', 'e', 'x', 3, 'd', 'i', 'e', 4, 'd', 'i', 'e', 'p', 3, 'd', 'a', 't',\n3, 'd', 'a', 'x', 2, 'd', 'a', 3, 'd', 'a', 'p', 4, 'd', 'u', 'o', 'x', 3, 'd', 'u', 'o', 3, 'd', 'o', 't',\n3, 'd', 'o', 'x', 2, 'd', 'o', 3, 'd', 'o', 'p', 3, 'd', 'e', 'x', 2, 'd', 'e', 3, 'd', 'e', 'p',\n3, 'd', 'u', 't', 3, 'd', 'u', 'x', 2, 'd', 'u', 3, 'd', 'u', 'p', 4, 'd', 'u', 'r', 'x', 3, 'd', 'u', 'r',\n3, 't', 'i', 't', 3, 't', 'i', 'x', 2, 't', 'i', 3, 't', 'i', 'p', 4, 't', 'i', 'e', 'x', 3, 't', 'i', 'e',\n4, 't', 'i', 'e', 'p', 3, 't', 'a', 't', 3, 't', 'a', 'x', 2, 't', 'a', 3, 't', 'a', 'p', 4, 't', 'u', 'o', 't',\n4, 't', 'u', 'o', 'x', 3, 't', 'u', 'o', 4, 't', 'u', 'o', 'p', 3, 't', 'o', 't', 3, 't', 'o', 'x', 2, 't', 'o',\n3, 't', 'o', 'p', 3, 't', 'e', 'x', 2, 't', 'e', 3, 't', 'e', 'p', 3, 't', 'u', 't', 3, 't', 'u', 'x',\n2, 't', 'u', 3, 't', 'u', 'p', 4, 't', 'u', 'r', 'x', 3, 't', 'u', 'r', 4, 'd', 'd', 'i', 't', 4, 'd', 'd', 'i', 'x',\n3, 'd', 'd', 'i', 4, 'd', 'd', 'i', 'p', 5, 'd', 'd', 'i', 'e', 'x', 4, 'd', 'd', 'i', 'e', 5, 'd', 'd', 'i', 'e', 'p', 4, 'd', 'd', 'a', 't',\n4, 'd', 'd', 'a', 'x', 3, 'd', 'd', 'a', 4, 'd', 'd', 'a', 'p', 5, 'd', 'd', 'u', 'o', 'x', 4, 'd', 'd', 'u', 'o', 5, 'd', 'd', 'u', 'o', 'p',\n4, 'd', 'd', 'o', 't', 4, 'd', 'd', 'o', 'x', 3, 'd', 'd', 'o', 4, 'd', 'd', 'o', 'p', 4, 'd', 'd', 'e', 'x', 3, 'd', 'd', 'e',\n4, 'd', 'd', 'e', 'p', 4, 'd', 'd', 'u', 't', 4, 'd', 'd', 'u', 'x', 3, 'd', 'd', 'u', 4, 'd', 'd', 'u', 'p', 5, 'd', 'd', 'u', 'r', 'x',\n4, 'd', 'd', 'u', 'r', 4, 'n', 'd', 'i', 't', 4, 'n', 'd', 'i', 'x', 3, 'n', 'd', 'i', 4, 'n', 'd', 'i', 'p', 5, 'n', 'd', 'i', 'e', 'x',\n4, 'n', 'd', 'i', 'e', 4, 'n', 'd', 'a', 't', 4, 'n', 'd', 'a', 'x', 3, 'n', 'd', 'a', 4, 'n', 'd', 'a', 'p', 4, 'n', 'd', 'o', 't',\n4, 'n', 'd', 'o', 'x', 3, 'n', 'd', 'o', 4, 'n', 'd', 'o', 'p', 4, 'n', 'd', 'e', 'x', 3, 'n', 'd', 'e', 4, 'n', 'd', 'e', 'p',\n4, 'n', 'd', 'u', 't', 4, 'n', 'd', 'u', 'x', 3, 'n', 'd', 'u', 4, 'n', 'd', 'u', 'p', 5, 'n', 'd', 'u', 'r', 'x', 4, 'n', 'd', 'u', 'r',\n4, 'h', 'n', 'i', 't', 4, 'h', 'n', 'i', 'x', 3, 'h', 'n', 'i', 4, 'h', 'n', 'i', 'p', 5, 'h', 'n', 'i', 'e', 't', 5, 'h', 'n', 'i', 'e', 'x',\n4, 'h', 'n', 'i', 'e', 5, 'h', 'n', 'i', 'e', 'p', 4, 'h', 'n', 'a', 't', 4, 'h', 'n', 'a', 'x', 3, 'h', 'n', 'a', 4, 'h', 'n', 'a', 'p',\n5, 'h', 'n', 'u', 'o', 'x', 4, 'h', 'n', 'u', 'o', 4, 'h', 'n', 'o', 't', 4, 'h', 'n', 'o', 'x', 4, 'h', 'n', 'o', 'p', 4, 'h', 'n', 'e', 'x',\n3, 'h', 'n', 'e', 4, 'h', 'n', 'e', 'p', 4, 'h', 'n', 'u', 't', 3, 'n', 'i', 't', 3, 'n', 'i', 'x', 2, 'n', 'i',\n3, 'n', 'i', 'p', 4, 'n', 'i', 'e', 'x', 3, 'n', 'i', 'e', 4, 'n', 'i', 'e', 'p', 3, 'n', 'a', 'x', 2, 'n', 'a',\n3, 'n', 'a', 'p', 4, 'n', 'u', 'o', 'x', 3, 'n', 'u', 'o', 4, 'n', 'u', 'o', 'p', 3, 'n', 'o', 't', 3, 'n', 'o', 'x',\n2, 'n', 'o', 3, 'n', 'o', 'p', 3, 'n', 'e', 'x', 2, 'n', 'e', 3, 'n', 'e', 'p', 3, 'n', 'u', 't',\n3, 'n', 'u', 'x', 2, 'n', 'u', 3, 'n', 'u', 'p', 4, 'n', 'u', 'r', 'x', 3, 'n', 'u', 'r', 4, 'h', 'l', 'i', 't',\n4, 'h', 'l', 'i', 'x', 3, 'h', 'l', 'i', 4, 'h', 'l', 'i', 'p', 5, 'h', 'l', 'i', 'e', 'x', 4, 'h', 'l', 'i', 'e', 5, 'h', 'l', 'i', 'e', 'p',\n4, 'h', 'l', 'a', 't', 4, 'h', 'l', 'a', 'x', 3, 'h', 'l', 'a', 4, 'h', 'l', 'a', 'p', 5, 'h', 'l', 'u', 'o', 'x', 4, 'h', 'l', 'u', 'o',\n5, 'h', 'l', 'u', 'o', 'p', 4, 'h', 'l', 'o', 'x', 3, 'h', 'l', 'o', 4, 'h', 'l', 'o', 'p', 4, 'h', 'l', 'e', 'x', 3, 'h', 'l', 'e',\n4, 'h', 'l', 'e', 'p', 4, 'h', 'l', 'u', 't', 4, 'h', 'l', 'u', 'x', 3, 'h', 'l', 'u', 4, 'h', 'l', 'u', 'p', 5, 'h', 'l', 'u', 'r', 'x',\n4, 'h', 'l', 'u', 'r', 4, 'h', 'l', 'y', 't', 4, 'h', 'l', 'y', 'x', 3, 'h', 'l', 'y', 4, 'h', 'l', 'y', 'p', 5, 'h', 'l', 'y', 'r', 'x',\n4, 'h', 'l', 'y', 'r', 3, 'l', 'i', 't', 3, 'l', 'i', 'x', 2, 'l', 'i', 3, 'l', 'i', 'p', 4, 'l', 'i', 'e', 't',\n4, 'l', 'i', 'e', 'x', 3, 'l', 'i', 'e', 4, 'l', 'i', 'e', 'p', 3, 'l', 'a', 't', 3, 'l', 'a', 'x', 2, 'l', 'a',\n3, 'l', 'a', 'p', 4, 'l', 'u', 'o', 't', 4, 'l', 'u', 'o', 'x', 3, 'l', 'u', 'o', 4, 'l', 'u', 'o', 'p', 3, 'l', 'o', 't',\n3, 'l', 'o', 'x', 2, 'l', 'o', 3, 'l', 'o', 'p', 3, 'l', 'e', 'x', 2, 'l', 'e', 3, 'l', 'e', 'p',\n3, 'l', 'u', 't', 3, 'l', 'u', 'x', 2, 'l', 'u', 3, 'l', 'u', 'p', 4, 'l', 'u', 'r', 'x', 3, 'l', 'u', 'r',\n3, 'l', 'y', 't', 3, 'l', 'y', 'x', 2, 'l', 'y', 3, 'l', 'y', 'p', 4, 'l', 'y', 'r', 'x', 3, 'l', 'y', 'r',\n3, 'g', 'i', 't', 3, 'g', 'i', 'x', 2, 'g', 'i', 3, 'g', 'i', 'p', 4, 'g', 'i', 'e', 't', 4, 'g', 'i', 'e', 'x',\n3, 'g', 'i', 'e', 4, 'g', 'i', 'e', 'p', 3, 'g', 'a', 't', 3, 'g', 'a', 'x', 2, 'g', 'a', 3, 'g', 'a', 'p',\n4, 'g', 'u', 'o', 't', 4, 'g', 'u', 'o', 'x', 3, 'g', 'u', 'o', 4, 'g', 'u', 'o', 'p', 3, 'g', 'o', 't', 3, 'g', 'o', 'x',\n2, 'g', 'o', 3, 'g', 'o', 'p', 3, 'g', 'e', 't', 3, 'g', 'e', 'x', 2, 'g', 'e', 3, 'g', 'e', 'p',\n3, 'g', 'u', 't', 3, 'g', 'u', 'x', 2, 'g', 'u', 3, 'g', 'u', 'p', 4, 'g', 'u', 'r', 'x', 3, 'g', 'u', 'r',\n3, 'k', 'i', 't', 3, 'k', 'i', 'x', 2, 'k', 'i', 3, 'k', 'i', 'p', 4, 'k', 'i', 'e', 'x', 3, 'k', 'i', 'e',\n4, 'k', 'i', 'e', 'p', 3, 'k', 'a', 't', 3, 'k', 'a', 'x', 2, 'k', 'a', 3, 'k', 'a', 'p', 4, 'k', 'u', 'o', 'x',\n3, 'k', 'u', 'o', 4, 'k', 'u', 'o', 'p', 3, 'k', 'o', 't', 3, 'k', 'o', 'x', 2, 'k', 'o', 3, 'k', 'o', 'p',\n3, 'k', 'e', 't', 3, 'k', 'e', 'x', 2, 'k', 'e', 3, 'k', 'e', 'p', 3, 'k', 'u', 't', 3, 'k', 'u', 'x',\n2, 'k', 'u', 3, 'k', 'u', 'p', 4, 'k', 'u', 'r', 'x', 3, 'k', 'u', 'r', 4, 'g', 'g', 'i', 't', 4, 'g', 'g', 'i', 'x',\n3, 'g', 'g', 'i', 5, 'g', 'g', 'i', 'e', 'x', 4, 'g', 'g', 'i', 'e', 5, 'g', 'g', 'i', 'e', 'p', 4, 'g', 'g', 'a', 't', 4, 'g', 'g', 'a', 'x',\n3, 'g', 'g', 'a', 4, 'g', 'g', 'a', 'p', 5, 'g', 'g', 'u', 'o', 't', 5, 'g', 'g', 'u', 'o', 'x', 4, 'g', 'g', 'u', 'o', 5, 'g', 'g', 'u', 'o', 'p',\n4, 'g', 'g', 'o', 't', 4, 'g', 'g', 'o', 'x', 3, 'g', 'g', 'o', 4, 'g', 'g', 'o', 'p', 4, 'g', 'g', 'e', 't', 4, 'g', 'g', 'e', 'x',\n3, 'g', 'g', 'e', 4, 'g', 'g', 'e', 'p', 4, 'g', 'g', 'u', 't', 4, 'g', 'g', 'u', 'x', 3, 'g', 'g', 'u', 4, 'g', 'g', 'u', 'p',\n5, 'g', 'g', 'u', 'r', 'x', 4, 'g', 'g', 'u', 'r', 5, 'm', 'g', 'i', 'e', 'x', 4, 'm', 'g', 'i', 'e', 4, 'm', 'g', 'a', 't', 4, 'm', 'g', 'a', 'x',\n3, 'm', 'g', 'a', 4, 'm', 'g', 'a', 'p', 5, 'm', 'g', 'u', 'o', 'x', 4, 'm', 'g', 'u', 'o', 5, 'm', 'g', 'u', 'o', 'p', 4, 'm', 'g', 'o', 't',\n4, 'm', 'g', 'o', 'x', 3, 'm', 'g', 'o', 4, 'm', 'g', 'o', 'p', 4, 'm', 'g', 'e', 'x', 3, 'm', 'g', 'e', 4, 'm', 'g', 'e', 'p',\n4, 'm', 'g', 'u', 't', 4, 'm', 'g', 'u', 'x', 3, 'm', 'g', 'u', 4, 'm', 'g', 'u', 'p', 5, 'm', 'g', 'u', 'r', 'x', 4, 'm', 'g', 'u', 'r',\n4, 'h', 'x', 'i', 't', 4, 'h', 'x', 'i', 'x', 3, 'h', 'x', 'i', 4, 'h', 'x', 'i', 'p', 5, 'h', 'x', 'i', 'e', 't', 5, 'h', 'x', 'i', 'e', 'x',\n4, 'h', 'x', 'i', 'e', 5, 'h', 'x', 'i', 'e', 'p', 4, 'h', 'x', 'a', 't', 4, 'h', 'x', 'a', 'x', 3, 'h', 'x', 'a', 4, 'h', 'x', 'a', 'p',\n5, 'h', 'x', 'u', 'o', 't', 5, 'h', 'x', 'u', 'o', 'x', 4, 'h', 'x', 'u', 'o', 5, 'h', 'x', 'u', 'o', 'p', 4, 'h', 'x', 'o', 't', 4, 'h', 'x', 'o', 'x',\n3, 'h', 'x', 'o', 4, 'h', 'x', 'o', 'p', 4, 'h', 'x', 'e', 'x', 3, 'h', 'x', 'e', 4, 'h', 'x', 'e', 'p', 5, 'n', 'g', 'i', 'e', 'x',\n4, 'n', 'g', 'i', 'e', 5, 'n', 'g', 'i', 'e', 'p', 4, 'n', 'g', 'a', 't', 4, 'n', 'g', 'a', 'x', 3, 'n', 'g', 'a', 4, 'n', 'g', 'a', 'p',\n5, 'n', 'g', 'u', 'o', 't', 5, 'n', 'g', 'u', 'o', 'x', 4, 'n', 'g', 'u', 'o', 4, 'n', 'g', 'o', 't', 4, 'n', 'g', 'o', 'x', 3, 'n', 'g', 'o',\n4, 'n', 'g', 'o', 'p', 4, 'n', 'g', 'e', 'x', 3, 'n', 'g', 'e', 4, 'n', 'g', 'e', 'p', 3, 'h', 'i', 't', 4, 'h', 'i', 'e', 'x',\n3, 'h', 'i', 'e', 3, 'h', 'a', 't', 3, 'h', 'a', 'x', 2, 'h', 'a', 3, 'h', 'a', 'p', 4, 'h', 'u', 'o', 't',\n4, 'h', 'u', 'o', 'x', 3, 'h', 'u', 'o', 4, 'h', 'u', 'o', 'p', 3, 'h', 'o', 't', 3, 'h', 'o', 'x', 2, 'h', 'o',\n3, 'h', 'o', 'p', 3, 'h', 'e', 'x', 2, 'h', 'e', 3, 'h', 'e', 'p', 3, 'w', 'a', 't', 3, 'w', 'a', 'x',\n2, 'w', 'a', 3, 'w', 'a', 'p', 4, 'w', 'u', 'o', 'x', 3, 'w', 'u', 'o', 4, 'w', 'u', 'o', 'p', 3, 'w', 'o', 'x',\n2, 'w', 'o', 3, 'w', 'o', 'p', 3, 'w', 'e', 'x', 2, 'w', 'e', 3, 'w', 'e', 'p', 3, 'z', 'i', 't',\n3, 'z', 'i', 'x', 2, 'z', 'i', 3, 'z', 'i', 'p', 4, 'z', 'i', 'e', 'x', 3, 'z', 'i', 'e', 4, 'z', 'i', 'e', 'p',\n3, 'z', 'a', 't', 3, 'z', 'a', 'x', 2, 'z', 'a', 3, 'z', 'a', 'p', 4, 'z', 'u', 'o', 'x', 3, 'z', 'u', 'o',\n4, 'z', 'u', 'o', 'p', 3, 'z', 'o', 't', 3, 'z', 'o', 'x', 2, 'z', 'o', 3, 'z', 'o', 'p', 3, 'z', 'e', 'x',\n2, 'z', 'e', 3, 'z', 'e', 'p', 3, 'z', 'u', 't', 3, 'z', 'u', 'x', 2, 'z', 'u', 3, 'z', 'u', 'p',\n4, 'z', 'u', 'r', 'x', 3, 'z', 'u', 'r', 3, 'z', 'y', 't', 3, 'z', 'y', 'x', 2, 'z', 'y', 3, 'z', 'y', 'p',\n4, 'z', 'y', 'r', 'x', 3, 'z', 'y', 'r', 3, 'c', 'i', 't', 3, 'c', 'i', 'x', 2, 'c', 'i', 3, 'c', 'i', 'p',\n4, 'c', 'i', 'e', 't', 4, 'c', 'i', 'e', 'x', 3, 'c', 'i', 'e', 4, 'c', 'i', 'e', 'p', 3, 'c', 'a', 't', 3, 'c', 'a', 'x',\n2, 'c', 'a', 3, 'c', 'a', 'p', 4, 'c', 'u', 'o', 'x', 3, 'c', 'u', 'o', 4, 'c', 'u', 'o', 'p', 3, 'c', 'o', 't',\n3, 'c', 'o', 'x', 2, 'c', 'o', 3, 'c', 'o', 'p', 3, 'c', 'e', 'x', 2, 'c', 'e', 3, 'c', 'e', 'p',\n3, 'c', 'u', 't', 3, 'c', 'u', 'x', 2, 'c', 'u', 3, 'c', 'u', 'p', 4, 'c', 'u', 'r', 'x', 3, 'c', 'u', 'r',\n3, 'c', 'y', 't', 3, 'c', 'y', 'x', 2, 'c', 'y', 3, 'c', 'y', 'p', 4, 'c', 'y', 'r', 'x', 3, 'c', 'y', 'r',\n4, 'z', 'z', 'i', 't', 4, 'z', 'z', 'i', 'x', 3, 'z', 'z', 'i', 4, 'z', 'z', 'i', 'p', 5, 'z', 'z', 'i', 'e', 't', 5, 'z', 'z', 'i', 'e', 'x',\n4, 'z', 'z', 'i', 'e', 5, 'z', 'z', 'i', 'e', 'p', 4, 'z', 'z', 'a', 't', 4, 'z', 'z', 'a', 'x', 3, 'z', 'z', 'a', 4, 'z', 'z', 'a', 'p',\n4, 'z', 'z', 'o', 'x', 3, 'z', 'z', 'o', 4, 'z', 'z', 'o', 'p', 4, 'z', 'z', 'e', 'x', 3, 'z', 'z', 'e', 4, 'z', 'z', 'e', 'p',\n4, 'z', 'z', 'u', 'x', 3, 'z', 'z', 'u', 4, 'z', 'z', 'u', 'p', 5, 'z', 'z', 'u', 'r', 'x', 4, 'z', 'z', 'u', 'r', 4, 'z', 'z', 'y', 't',\n4, 'z', 'z', 'y', 'x', 3, 'z', 'z', 'y', 4, 'z', 'z', 'y', 'p', 5, 'z', 'z', 'y', 'r', 'x', 4, 'z', 'z', 'y', 'r', 4, 'n', 'z', 'i', 't',\n4, 'n', 'z', 'i', 'x', 3, 'n', 'z', 'i', 4, 'n', 'z', 'i', 'p', 5, 'n', 'z', 'i', 'e', 'x', 4, 'n', 'z', 'i', 'e', 5, 'n', 'z', 'i', 'e', 'p',\n4, 'n', 'z', 'a', 't', 4, 'n', 'z', 'a', 'x', 3, 'n', 'z', 'a', 4, 'n', 'z', 'a', 'p', 5, 'n', 'z', 'u', 'o', 'x', 4, 'n', 'z', 'u', 'o',\n4, 'n', 'z', 'o', 'x', 4, 'n', 'z', 'o', 'p', 4, 'n', 'z', 'e', 'x', 3, 'n', 'z', 'e', 4, 'n', 'z', 'u', 'x', 3, 'n', 'z', 'u',\n4, 'n', 'z', 'u', 'p', 5, 'n', 'z', 'u', 'r', 'x', 4, 'n', 'z', 'u', 'r', 4, 'n', 'z', 'y', 't', 4, 'n', 'z', 'y', 'x', 3, 'n', 'z', 'y',\n4, 'n', 'z', 'y', 'p', 5, 'n', 'z', 'y', 'r', 'x', 4, 'n', 'z', 'y', 'r', 3, 's', 'i', 't', 3, 's', 'i', 'x', 2, 's', 'i',\n3, 's', 'i', 'p', 4, 's', 'i', 'e', 'x', 3, 's', 'i', 'e', 4, 's', 'i', 'e', 'p', 3, 's', 'a', 't', 3, 's', 'a', 'x',\n2, 's', 'a', 3, 's', 'a', 'p', 4, 's', 'u', 'o', 'x', 3, 's', 'u', 'o', 4, 's', 'u', 'o', 'p', 3, 's', 'o', 't',\n3, 's', 'o', 'x', 2, 's', 'o', 3, 's', 'o', 'p', 3, 's', 'e', 'x', 2, 's', 'e', 3, 's', 'e', 'p',\n3, 's', 'u', 't', 3, 's', 'u', 'x', 2, 's', 'u', 3, 's', 'u', 'p', 4, 's', 'u', 'r', 'x', 3, 's', 'u', 'r',\n3, 's', 'y', 't', 3, 's', 'y', 'x', 2, 's', 'y', 3, 's', 'y', 'p', 4, 's', 'y', 'r', 'x', 3, 's', 'y', 'r',\n4, 's', 's', 'i', 't', 4, 's', 's', 'i', 'x', 3, 's', 's', 'i', 4, 's', 's', 'i', 'p', 5, 's', 's', 'i', 'e', 'x', 4, 's', 's', 'i', 'e',\n5, 's', 's', 'i', 'e', 'p', 4, 's', 's', 'a', 't', 4, 's', 's', 'a', 'x', 3, 's', 's', 'a', 4, 's', 's', 'a', 'p', 4, 's', 's', 'o', 't',\n4, 's', 's', 'o', 'x', 3, 's', 's', 'o', 4, 's', 's', 'o', 'p', 4, 's', 's', 'e', 'x', 3, 's', 's', 'e', 4, 's', 's', 'e', 'p',\n4, 's', 's', 'u', 't', 4, 's', 's', 'u', 'x', 3, 's', 's', 'u', 4, 's', 's', 'u', 'p', 4, 's', 's', 'y', 't', 4, 's', 's', 'y', 'x',\n3, 's', 's', 'y', 4, 's', 's', 'y', 'p', 5, 's', 's', 'y', 'r', 'x', 4, 's', 's', 'y', 'r', 4, 'z', 'h', 'a', 't', 4, 'z', 'h', 'a', 'x',\n3, 'z', 'h', 'a', 4, 'z', 'h', 'a', 'p', 5, 'z', 'h', 'u', 'o', 'x', 4, 'z', 'h', 'u', 'o', 5, 'z', 'h', 'u', 'o', 'p', 4, 'z', 'h', 'o', 't',\n4, 'z', 'h', 'o', 'x', 3, 'z', 'h', 'o', 4, 'z', 'h', 'o', 'p', 4, 'z', 'h', 'e', 't', 4, 'z', 'h', 'e', 'x', 3, 'z', 'h', 'e',\n4, 'z', 'h', 'e', 'p', 4, 'z', 'h', 'u', 't', 4, 'z', 'h', 'u', 'x', 3, 'z', 'h', 'u', 4, 'z', 'h', 'u', 'p', 5, 'z', 'h', 'u', 'r', 'x',\n4, 'z', 'h', 'u', 'r', 4, 'z', 'h', 'y', 't', 4, 'z', 'h', 'y', 'x', 3, 'z', 'h', 'y', 4, 'z', 'h', 'y', 'p', 5, 'z', 'h', 'y', 'r', 'x',\n4, 'z', 'h', 'y', 'r', 4, 'c', 'h', 'a', 't', 4, 'c', 'h', 'a', 'x', 3, 'c', 'h', 'a', 4, 'c', 'h', 'a', 'p', 5, 'c', 'h', 'u', 'o', 't',\n5, 'c', 'h', 'u', 'o', 'x', 4, 'c', 'h', 'u', 'o', 5, 'c', 'h', 'u', 'o', 'p', 4, 'c', 'h', 'o', 't', 4, 'c', 'h', 'o', 'x', 3, 'c', 'h', 'o',\n4, 'c', 'h', 'o', 'p', 4, 'c', 'h', 'e', 't', 4, 'c', 'h', 'e', 'x', 3, 'c', 'h', 'e', 4, 'c', 'h', 'e', 'p', 4, 'c', 'h', 'u', 'x',\n3, 'c', 'h', 'u', 4, 'c', 'h', 'u', 'p', 5, 'c', 'h', 'u', 'r', 'x', 4, 'c', 'h', 'u', 'r', 4, 'c', 'h', 'y', 't', 4, 'c', 'h', 'y', 'x',\n3, 'c', 'h', 'y', 4, 'c', 'h', 'y', 'p', 5, 'c', 'h', 'y', 'r', 'x', 4, 'c', 'h', 'y', 'r', 4, 'r', 'r', 'a', 'x', 3, 'r', 'r', 'a',\n5, 'r', 'r', 'u', 'o', 'x', 4, 'r', 'r', 'u', 'o', 4, 'r', 'r', 'o', 't', 4, 'r', 'r', 'o', 'x', 3, 'r', 'r', 'o', 4, 'r', 'r', 'o', 'p',\n4, 'r', 'r', 'e', 't', 4, 'r', 'r', 'e', 'x', 3, 'r', 'r', 'e', 4, 'r', 'r', 'e', 'p', 4, 'r', 'r', 'u', 't', 4, 'r', 'r', 'u', 'x',\n3, 'r', 'r', 'u', 4, 'r', 'r', 'u', 'p', 5, 'r', 'r', 'u', 'r', 'x', 4, 'r', 'r', 'u', 'r', 4, 'r', 'r', 'y', 't', 4, 'r', 'r', 'y', 'x',\n3, 'r', 'r', 'y', 4, 'r', 'r', 'y', 'p', 5, 'r', 'r', 'y', 'r', 'x', 4, 'r', 'r', 'y', 'r', 4, 'n', 'r', 'a', 't', 4, 'n', 'r', 'a', 'x',\n3, 'n', 'r', 'a', 4, 'n', 'r', 'a', 'p', 4, 'n', 'r', 'o', 'x', 3, 'n', 'r', 'o', 4, 'n', 'r', 'o', 'p', 4, 'n', 'r', 'e', 't',\n4, 'n', 'r', 'e', 'x', 3, 'n', 'r', 'e', 4, 'n', 'r', 'e', 'p', 4, 'n', 'r', 'u', 't', 4, 'n', 'r', 'u', 'x', 3, 'n', 'r', 'u',\n4, 'n', 'r', 'u', 'p', 5, 'n', 'r', 'u', 'r', 'x', 4, 'n', 'r', 'u', 'r', 4, 'n', 'r', 'y', 't', 4, 'n', 'r', 'y', 'x', 3, 'n', 'r', 'y',\n4, 'n', 'r', 'y', 'p', 5, 'n', 'r', 'y', 'r', 'x', 4, 'n', 'r', 'y', 'r', 4, 's', 'h', 'a', 't', 4, 's', 'h', 'a', 'x', 3, 's', 'h', 'a',\n4, 's', 'h', 'a', 'p', 5, 's', 'h', 'u', 'o', 'x', 4, 's', 'h', 'u', 'o', 5, 's', 'h', 'u', 'o', 'p', 4, 's', 'h', 'o', 't', 4, 's', 'h', 'o', 'x',\n3, 's', 'h', 'o', 4, 's', 'h', 'o', 'p', 4, 's', 'h', 'e', 't', 4, 's', 'h', 'e', 'x', 3, 's', 'h', 'e', 4, 's', 'h', 'e', 'p',\n4, 's', 'h', 'u', 't', 4, 's', 'h', 'u', 'x', 3, 's', 'h', 'u', 4, 's', 'h', 'u', 'p', 5, 's', 'h', 'u', 'r', 'x', 4, 's', 'h', 'u', 'r',\n4, 's', 'h', 'y', 't', 4, 's', 'h', 'y', 'x', 3, 's', 'h', 'y', 4, 's', 'h', 'y', 'p', 5, 's', 'h', 'y', 'r', 'x', 4, 's', 'h', 'y', 'r',\n3, 'r', 'a', 't', 3, 'r', 'a', 'x', 2, 'r', 'a', 3, 'r', 'a', 'p', 4, 'r', 'u', 'o', 'x', 3, 'r', 'u', 'o',\n4, 'r', 'u', 'o', 'p', 3, 'r', 'o', 't', 3, 'r', 'o', 'x', 2, 'r', 'o', 3, 'r', 'o', 'p', 3, 'r', 'e', 'x',\n2, 'r', 'e', 3, 'r', 'e', 'p', 3, 'r', 'u', 't', 3, 'r', 'u', 'x', 2, 'r', 'u', 3, 'r', 'u', 'p',\n4, 'r', 'u', 'r', 'x', 3, 'r', 'u', 'r', 3, 'r', 'y', 't', 3, 'r', 'y', 'x', 2, 'r', 'y', 3, 'r', 'y', 'p',\n4, 'r', 'y', 'r', 'x', 3, 'r', 'y', 'r', 3, 'j', 'i', 't', 3, 'j', 'i', 'x', 2, 'j', 'i', 3, 'j', 'i', 'p',\n4, 'j', 'i', 'e', 't', 4, 'j', 'i', 'e', 'x', 3, 'j', 'i', 'e', 4, 'j', 'i', 'e', 'p', 4, 'j', 'u', 'o', 't', 4, 'j', 'u', 'o', 'x',\n3, 'j', 'u', 'o', 4, 'j', 'u', 'o', 'p', 3, 'j', 'o', 't', 3, 'j', 'o', 'x', 2, 'j', 'o', 3, 'j', 'o', 'p',\n3, 'j', 'u', 't', 3, 'j', 'u', 'x', 2, 'j', 'u', 3, 'j', 'u', 'p', 4, 'j', 'u', 'r', 'x', 3, 'j', 'u', 'r',\n3, 'j', 'y', 't', 3, 'j', 'y', 'x', 2, 'j', 'y', 3, 'j', 'y', 'p', 4, 'j', 'y', 'r', 'x', 3, 'j', 'y', 'r',\n3, 'q', 'i', 't', 3, 'q', 'i', 'x', 2, 'q', 'i', 3, 'q', 'i', 'p', 4, 'q', 'i', 'e', 't', 4, 'q', 'i', 'e', 'x',\n3, 'q', 'i', 'e', 4, 'q', 'i', 'e', 'p', 4, 'q', 'u', 'o', 't', 4, 'q', 'u', 'o', 'x', 3, 'q', 'u', 'o', 4, 'q', 'u', 'o', 'p',\n3, 'q', 'o', 't', 3, 'q', 'o', 'x', 2, 'q', 'o', 3, 'q', 'o', 'p', 3, 'q', 'u', 't', 3, 'q', 'u', 'x',\n2, 'q', 'u', 3, 'q', 'u', 'p', 4, 'q', 'u', 'r', 'x', 3, 'q', 'u', 'r', 3, 'q', 'y', 't', 3, 'q', 'y', 'x',\n2, 'q', 'y', 3, 'q', 'y', 'p', 4, 'q', 'y', 'r', 'x', 3, 'q', 'y', 'r', 4, 'j', 'j', 'i', 't', 4, 'j', 'j', 'i', 'x',\n3, 'j', 'j', 'i', 4, 'j', 'j', 'i', 'p', 5, 'j', 'j', 'i', 'e', 't', 5, 'j', 'j', 'i', 'e', 'x', 4, 'j', 'j', 'i', 'e', 5, 'j', 'j', 'i', 'e', 'p',\n5, 'j', 'j', 'u', 'o', 'x', 4, 'j', 'j', 'u', 'o', 5, 'j', 'j', 'u', 'o', 'p', 4, 'j', 'j', 'o', 't', 4, 'j', 'j', 'o', 'x', 3, 'j', 'j', 'o',\n4, 'j', 'j', 'o', 'p', 4, 'j', 'j', 'u', 't', 4, 'j', 'j', 'u', 'x', 3, 'j', 'j', 'u', 4, 'j', 'j', 'u', 'p', 5, 'j', 'j', 'u', 'r', 'x',\n4, 'j', 'j', 'u', 'r', 4, 'j', 'j', 'y', 't', 4, 'j', 'j', 'y', 'x', 3, 'j', 'j', 'y', 4, 'j', 'j', 'y', 'p', 4, 'n', 'j', 'i', 't',\n4, 'n', 'j', 'i', 'x', 3, 'n', 'j', 'i', 4, 'n', 'j', 'i', 'p', 5, 'n', 'j', 'i', 'e', 't', 5, 'n', 'j', 'i', 'e', 'x', 4, 'n', 'j', 'i', 'e',\n5, 'n', 'j', 'i', 'e', 'p', 5, 'n', 'j', 'u', 'o', 'x', 4, 'n', 'j', 'u', 'o', 4, 'n', 'j', 'o', 't', 4, 'n', 'j', 'o', 'x', 3, 'n', 'j', 'o',\n4, 'n', 'j', 'o', 'p', 4, 'n', 'j', 'u', 'x', 3, 'n', 'j', 'u', 4, 'n', 'j', 'u', 'p', 5, 'n', 'j', 'u', 'r', 'x', 4, 'n', 'j', 'u', 'r',\n4, 'n', 'j', 'y', 't', 4, 'n', 'j', 'y', 'x', 3, 'n', 'j', 'y', 4, 'n', 'j', 'y', 'p', 5, 'n', 'j', 'y', 'r', 'x', 4, 'n', 'j', 'y', 'r',\n4, 'n', 'y', 'i', 't', 4, 'n', 'y', 'i', 'x', 3, 'n', 'y', 'i', 4, 'n', 'y', 'i', 'p', 5, 'n', 'y', 'i', 'e', 't', 5, 'n', 'y', 'i', 'e', 'x',\n4, 'n', 'y', 'i', 'e', 5, 'n', 'y', 'i', 'e', 'p', 5, 'n', 'y', 'u', 'o', 'x', 4, 'n', 'y', 'u', 'o', 5, 'n', 'y', 'u', 'o', 'p', 4, 'n', 'y', 'o', 't',\n4, 'n', 'y', 'o', 'x', 3, 'n', 'y', 'o', 4, 'n', 'y', 'o', 'p', 4, 'n', 'y', 'u', 't', 4, 'n', 'y', 'u', 'x', 3, 'n', 'y', 'u',\n4, 'n', 'y', 'u', 'p', 3, 'x', 'i', 't', 3, 'x', 'i', 'x', 2, 'x', 'i', 3, 'x', 'i', 'p', 4, 'x', 'i', 'e', 't',\n4, 'x', 'i', 'e', 'x', 3, 'x', 'i', 'e', 4, 'x', 'i', 'e', 'p', 4, 'x', 'u', 'o', 'x', 3, 'x', 'u', 'o', 3, 'x', 'o', 't',\n3, 'x', 'o', 'x', 2, 'x', 'o', 3, 'x', 'o', 'p', 3, 'x', 'y', 't', 3, 'x', 'y', 'x', 2, 'x', 'y',\n3, 'x', 'y', 'p', 4, 'x', 'y', 'r', 'x', 3, 'x', 'y', 'r', 3, 'y', 'i', 't', 3, 'y', 'i', 'x', 2, 'y', 'i',\n3, 'y', 'i', 'p', 4, 'y', 'i', 'e', 't', 4, 'y', 'i', 'e', 'x', 3, 'y', 'i', 'e', 4, 'y', 'i', 'e', 'p', 4, 'y', 'u', 'o', 't',\n4, 'y', 'u', 'o', 'x', 3, 'y', 'u', 'o', 4, 'y', 'u', 'o', 'p', 3, 'y', 'o', 't', 3, 'y', 'o', 'x', 2, 'y', 'o',\n3, 'y', 'o', 'p', 3, 'y', 'u', 't', 3, 'y', 'u', 'x', 2, 'y', 'u', 3, 'y', 'u', 'p', 4, 'y', 'u', 'r', 'x',\n3, 'y', 'u', 'r', 3, 'y', 'y', 't', 3, 'y', 'y', 'x', 2, 'y', 'y', 3, 'y', 'y', 'p', 4, 'y', 'y', 'r', 'x',\n3, 'y', 'y', 'r', 3, 'Q', 'o', 't', 2, 'L', 'i', 3, 'K', 'i', 't', 4, 'N', 'y', 'i', 'p', 3, 'C', 'y', 'p',\n3, 'S', 's', 'i', 4, 'G', 'g', 'o', 'p', 3, 'G', 'e', 'p', 2, 'M', 'i', 4, 'H', 'x', 'i', 't', 3, 'L', 'y', 'r',\n4, 'B', 'b', 'u', 't', 3, 'M', 'o', 'p', 2, 'Y', 'o', 3, 'P', 'u', 't', 4, 'H', 'x', 'u', 'o', 3, 'T', 'a', 't',\n2, 'G', 'a', 4, 'D', 'd', 'u', 'r', 3, 'B', 'u', 'r', 4, 'G', 'g', 'u', 'o', 4, 'N', 'y', 'o', 'p', 2, 'T', 'u',\n2, 'O', 'p', 4, 'J', 'j', 'u', 't', 3, 'Z', 'o', 't', 3, 'P', 'y', 't', 3, 'H', 'm', 'o', 3, 'Y', 'i', 't',\n3, 'V', 'u', 'r', 3, 'S', 'h', 'y', 3, 'V', 'e', 'p', 2, 'Z', 'a', 2, 'J', 'o', 3, 'J', 'j', 'y',\n3, 'G', 'o', 't', 4, 'J', 'j', 'i', 'e', 2, 'W', 'o', 2, 'D', 'u', 4, 'S', 'h', 'u', 'r', 3, 'L', 'i', 'e',\n2, 'C', 'y', 4, 'C', 'u', 'o', 'p', 3, 'C', 'i', 'p', 4, 'H', 'x', 'o', 'p', 4, 'S', 'h', 'a', 't', 4, 'S', 'h', 'o', 'p',\n3, 'C', 'h', 'e', 5, 'Z', 'z', 'i', 'e', 't', 2, 'K', 'e', 2, 'g', 'a', 3, 'g', 'a', 'g', 4, 'g', 'a', 'g', 'g',\n4, 'g', 'a', 'g', 's', 3, 'g', 'a', 'n', 4, 'g', 'a', 'n', 'j', 4, 'g', 'a', 'n', 'h', 3, 'g', 'a', 'd', 3, 'g', 'a', 'l',\n4, 'g', 'a', 'l', 'g', 4, 'g', 'a', 'l', 'm', 4, 'g', 'a', 'l', 'b', 4, 'g', 'a', 'l', 's', 4, 'g', 'a', 'l', 't', 4, 'g', 'a', 'l', 'p',\n4, 'g', 'a', 'l', 'h', 3, 'g', 'a', 'm', 3, 'g', 'a', 'b', 4, 'g', 'a', 'b', 's', 3, 'g', 'a', 's', 4, 'g', 'a', 's', 's',\n4, 'g', 'a', 'n', 'g', 3, 'g', 'a', 'j', 3, 'g', 'a', 'c', 3, 'g', 'a', 'k', 3, 'g', 'a', 't', 3, 'g', 'a', 'p',\n3, 'g', 'a', 'h', 3, 'g', 'a', 'e', 4, 'g', 'a', 'e', 'g', 5, 'g', 'a', 'e', 'g', 'g', 5, 'g', 'a', 'e', 'g', 's', 4, 'g', 'a', 'e', 'n',\n5, 'g', 'a', 'e', 'n', 'j', 5, 'g', 'a', 'e', 'n', 'h', 4, 'g', 'a', 'e', 'd', 4, 'g', 'a', 'e', 'l', 5, 'g', 'a', 'e', 'l', 'g', 5, 'g', 'a', 'e', 'l', 'm',\n5, 'g', 'a', 'e', 'l', 'b', 5, 'g', 'a', 'e', 'l', 's', 5, 'g', 'a', 'e', 'l', 't', 5, 'g', 'a', 'e', 'l', 'p', 5, 'g', 'a', 'e', 'l', 'h', 4, 'g', 'a', 'e', 'm',\n4, 'g', 'a', 'e', 'b', 5, 'g', 'a', 'e', 'b', 's', 4, 'g', 'a', 'e', 's', 5, 'g', 'a', 'e', 's', 's', 5, 'g', 'a', 'e', 'n', 'g', 4, 'g', 'a', 'e', 'j',\n4, 'g', 'a', 'e', 'c', 4, 'g', 'a', 'e', 'k', 4, 'g', 'a', 'e', 't', 4, 'g', 'a', 'e', 'p', 4, 'g', 'a', 'e', 'h', 3, 'g', 'y', 'a',\n4, 'g', 'y', 'a', 'g', 5, 'g', 'y', 'a', 'g', 'g', 5, 'g', 'y', 'a', 'g', 's', 4, 'g', 'y', 'a', 'n', 5, 'g', 'y', 'a', 'n', 'j', 5, 'g', 'y', 'a', 'n', 'h',\n4, 'g', 'y', 'a', 'd', 4, 'g', 'y', 'a', 'l', 5, 'g', 'y', 'a', 'l', 'g', 5, 'g', 'y', 'a', 'l', 'm', 5, 'g', 'y', 'a', 'l', 'b', 5, 'g', 'y', 'a', 'l', 's',\n5, 'g', 'y', 'a', 'l', 't', 5, 'g', 'y', 'a', 'l', 'p', 5, 'g', 'y', 'a', 'l', 'h', 4, 'g', 'y', 'a', 'm', 4, 'g', 'y', 'a', 'b', 5, 'g', 'y', 'a', 'b', 's',\n4, 'g', 'y', 'a', 's', 5, 'g', 'y', 'a', 's', 's', 5, 'g', 'y', 'a', 'n', 'g', 4, 'g', 'y', 'a', 'j', 4, 'g', 'y', 'a', 'c', 4, 'g', 'y', 'a', 'k',\n4, 'g', 'y', 'a', 't', 4, 'g', 'y', 'a', 'p', 4, 'g', 'y', 'a', 'h', 4, 'g', 'y', 'a', 'e', 5, 'g', 'y', 'a', 'e', 'g', 6, 'g', 'y', 'a', 'e', 'g', 'g',\n6, 'g', 'y', 'a', 'e', 'g', 's', 5, 'g', 'y', 'a', 'e', 'n', 6, 'g', 'y', 'a', 'e', 'n', 'j', 6, 'g', 'y', 'a', 'e', 'n', 'h', 5, 'g', 'y', 'a', 'e', 'd', 5, 'g', 'y', 'a', 'e', 'l',\n6, 'g', 'y', 'a', 'e', 'l', 'g', 6, 'g', 'y', 'a', 'e', 'l', 'm', 6, 'g', 'y', 'a', 'e', 'l', 'b', 6, 'g', 'y', 'a', 'e', 'l', 's', 6, 'g', 'y', 'a', 'e', 'l', 't', 6, 'g', 'y', 'a', 'e', 'l', 'p',\n6, 'g', 'y', 'a', 'e', 'l', 'h', 5, 'g', 'y', 'a', 'e', 'm', 5, 'g', 'y', 'a', 'e', 'b', 6, 'g', 'y', 'a', 'e', 'b', 's', 5, 'g', 'y', 'a', 'e', 's', 6, 'g', 'y', 'a', 'e', 's', 's',\n6, 'g', 'y', 'a', 'e', 'n', 'g', 5, 'g', 'y', 'a', 'e', 'j', 5, 'g', 'y', 'a', 'e', 'c', 5, 'g', 'y', 'a', 'e', 'k', 5, 'g', 'y', 'a', 'e', 't', 5, 'g', 'y', 'a', 'e', 'p',\n5, 'g', 'y', 'a', 'e', 'h', 3, 'g', 'e', 'o', 4, 'g', 'e', 'o', 'g', 5, 'g', 'e', 'o', 'g', 'g', 5, 'g', 'e', 'o', 'g', 's', 4, 'g', 'e', 'o', 'n',\n5, 'g', 'e', 'o', 'n', 'j', 5, 'g', 'e', 'o', 'n', 'h', 4, 'g', 'e', 'o', 'd', 4, 'g', 'e', 'o', 'l', 5, 'g', 'e', 'o', 'l', 'g', 5, 'g', 'e', 'o', 'l', 'm',\n5, 'g', 'e', 'o', 'l', 'b', 5, 'g', 'e', 'o', 'l', 's', 5, 'g', 'e', 'o', 'l', 't', 5, 'g', 'e', 'o', 'l', 'p', 5, 'g', 'e', 'o', 'l', 'h', 4, 'g', 'e', 'o', 'm',\n4, 'g', 'e', 'o', 'b', 5, 'g', 'e', 'o', 'b', 's', 4, 'g', 'e', 'o', 's', 5, 'g', 'e', 'o', 's', 's', 5, 'g', 'e', 'o', 'n', 'g', 4, 'g', 'e', 'o', 'j',\n4, 'g', 'e', 'o', 'c', 4, 'g', 'e', 'o', 'k', 4, 'g', 'e', 'o', 't', 4, 'g', 'e', 'o', 'p', 4, 'g', 'e', 'o', 'h', 2, 'g', 'e',\n3, 'g', 'e', 'g', 4, 'g', 'e', 'g', 'g', 4, 'g', 'e', 'g', 's', 3, 'g', 'e', 'n', 4, 'g', 'e', 'n', 'j', 4, 'g', 'e', 'n', 'h',\n3, 'g', 'e', 'd', 3, 'g', 'e', 'l', 4, 'g', 'e', 'l', 'g', 4, 'g', 'e', 'l', 'm', 4, 'g', 'e', 'l', 'b', 4, 'g', 'e', 'l', 's',\n4, 'g', 'e', 'l', 't', 4, 'g', 'e', 'l', 'p', 4, 'g', 'e', 'l', 'h', 3, 'g', 'e', 'm', 3, 'g', 'e', 'b', 4, 'g', 'e', 'b', 's',\n3, 'g', 'e', 's', 4, 'g', 'e', 's', 's', 4, 'g', 'e', 'n', 'g', 3, 'g', 'e', 'j', 3, 'g', 'e', 'c', 3, 'g', 'e', 'k',\n3, 'g', 'e', 't', 3, 'g', 'e', 'p', 3, 'g', 'e', 'h', 4, 'g', 'y', 'e', 'o', 5, 'g', 'y', 'e', 'o', 'g', 6, 'g', 'y', 'e', 'o', 'g', 'g',\n6, 'g', 'y', 'e', 'o', 'g', 's', 5, 'g', 'y', 'e', 'o', 'n', 6, 'g', 'y', 'e', 'o', 'n', 'j', 6, 'g', 'y', 'e', 'o', 'n', 'h', 5, 'g', 'y', 'e', 'o', 'd', 5, 'g', 'y', 'e', 'o', 'l',\n6, 'g', 'y', 'e', 'o', 'l', 'g', 6, 'g', 'y', 'e', 'o', 'l', 'm', 6, 'g', 'y', 'e', 'o', 'l', 'b', 6, 'g', 'y', 'e', 'o', 'l', 's', 6, 'g', 'y', 'e', 'o', 'l', 't', 6, 'g', 'y', 'e', 'o', 'l', 'p',\n6, 'g', 'y', 'e', 'o', 'l', 'h', 5, 'g', 'y', 'e', 'o', 'm', 5, 'g', 'y', 'e', 'o', 'b', 6, 'g', 'y', 'e', 'o', 'b', 's', 5, 'g', 'y', 'e', 'o', 's', 6, 'g', 'y', 'e', 'o', 's', 's',\n6, 'g', 'y', 'e', 'o', 'n', 'g', 5, 'g', 'y', 'e', 'o', 'j', 5, 'g', 'y', 'e', 'o', 'c', 5, 'g', 'y', 'e', 'o', 'k', 5, 'g', 'y', 'e', 'o', 't', 5, 'g', 'y', 'e', 'o', 'p',\n5, 'g', 'y', 'e', 'o', 'h', 3, 'g', 'y', 'e', 4, 'g', 'y', 'e', 'g', 5, 'g', 'y', 'e', 'g', 'g', 5, 'g', 'y', 'e', 'g', 's', 4, 'g', 'y', 'e', 'n',\n5, 'g', 'y', 'e', 'n', 'j', 5, 'g', 'y', 'e', 'n', 'h', 4, 'g', 'y', 'e', 'd', 4, 'g', 'y', 'e', 'l', 5, 'g', 'y', 'e', 'l', 'g', 5, 'g', 'y', 'e', 'l', 'm',\n5, 'g', 'y', 'e', 'l', 'b', 5, 'g', 'y', 'e', 'l', 's', 5, 'g', 'y', 'e', 'l', 't', 5, 'g', 'y', 'e', 'l', 'p', 5, 'g', 'y', 'e', 'l', 'h', 4, 'g', 'y', 'e', 'm',\n4, 'g', 'y', 'e', 'b', 5, 'g', 'y', 'e', 'b', 's', 4, 'g', 'y', 'e', 's', 5, 'g', 'y', 'e', 's', 's', 5, 'g', 'y', 'e', 'n', 'g', 4, 'g', 'y', 'e', 'j',\n4, 'g', 'y', 'e', 'c', 4, 'g', 'y', 'e', 'k', 4, 'g', 'y', 'e', 't', 4, 'g', 'y', 'e', 'p', 4, 'g', 'y', 'e', 'h', 2, 'g', 'o',\n3, 'g', 'o', 'g', 4, 'g', 'o', 'g', 'g', 4, 'g', 'o', 'g', 's', 3, 'g', 'o', 'n', 4, 'g', 'o', 'n', 'j', 4, 'g', 'o', 'n', 'h',\n3, 'g', 'o', 'd', 3, 'g', 'o', 'l', 4, 'g', 'o', 'l', 'g', 4, 'g', 'o', 'l', 'm', 4, 'g', 'o', 'l', 'b', 4, 'g', 'o', 'l', 's',\n4, 'g', 'o', 'l', 't', 4, 'g', 'o', 'l', 'p', 4, 'g', 'o', 'l', 'h', 3, 'g', 'o', 'm', 3, 'g', 'o', 'b', 4, 'g', 'o', 'b', 's',\n3, 'g', 'o', 's', 4, 'g', 'o', 's', 's', 4, 'g', 'o', 'n', 'g', 3, 'g', 'o', 'j', 3, 'g', 'o', 'c', 3, 'g', 'o', 'k',\n3, 'g', 'o', 't', 3, 'g', 'o', 'p', 3, 'g', 'o', 'h', 3, 'g', 'w', 'a', 4, 'g', 'w', 'a', 'g', 5, 'g', 'w', 'a', 'g', 'g',\n5, 'g', 'w', 'a', 'g', 's', 4, 'g', 'w', 'a', 'n', 5, 'g', 'w', 'a', 'n', 'j', 5, 'g', 'w', 'a', 'n', 'h', 4, 'g', 'w', 'a', 'd', 4, 'g', 'w', 'a', 'l',\n5, 'g', 'w', 'a', 'l', 'g', 5, 'g', 'w', 'a', 'l', 'm', 5, 'g', 'w', 'a', 'l', 'b', 5, 'g', 'w', 'a', 'l', 's', 5, 'g', 'w', 'a', 'l', 't', 5, 'g', 'w', 'a', 'l', 'p',\n5, 'g', 'w', 'a', 'l', 'h', 4, 'g', 'w', 'a', 'm', 4, 'g', 'w', 'a', 'b', 5, 'g', 'w', 'a', 'b', 's', 4, 'g', 'w', 'a', 's', 5, 'g', 'w', 'a', 's', 's',\n5, 'g', 'w', 'a', 'n', 'g', 4, 'g', 'w', 'a', 'j', 4, 'g', 'w', 'a', 'c', 4, 'g', 'w', 'a', 'k', 4, 'g', 'w', 'a', 't', 4, 'g', 'w', 'a', 'p',\n4, 'g', 'w', 'a', 'h', 4, 'g', 'w', 'a', 'e', 5, 'g', 'w', 'a', 'e', 'g', 6, 'g', 'w', 'a', 'e', 'g', 'g', 6, 'g', 'w', 'a', 'e', 'g', 's', 5, 'g', 'w', 'a', 'e', 'n',\n6, 'g', 'w', 'a', 'e', 'n', 'j', 6, 'g', 'w', 'a', 'e', 'n', 'h', 5, 'g', 'w', 'a', 'e', 'd', 5, 'g', 'w', 'a', 'e', 'l', 6, 'g', 'w', 'a', 'e', 'l', 'g', 6, 'g', 'w', 'a', 'e', 'l', 'm',\n6, 'g', 'w', 'a', 'e', 'l', 'b', 6, 'g', 'w', 'a', 'e', 'l', 's', 6, 'g', 'w', 'a', 'e', 'l', 't', 6, 'g', 'w', 'a', 'e', 'l', 'p', 6, 'g', 'w', 'a', 'e', 'l', 'h', 5, 'g', 'w', 'a', 'e', 'm',\n5, 'g', 'w', 'a', 'e', 'b', 6, 'g', 'w', 'a', 'e', 'b', 's', 5, 'g', 'w', 'a', 'e', 's', 6, 'g', 'w', 'a', 'e', 's', 's', 6, 'g', 'w', 'a', 'e', 'n', 'g', 5, 'g', 'w', 'a', 'e', 'j',\n5, 'g', 'w', 'a', 'e', 'c', 5, 'g', 'w', 'a', 'e', 'k', 5, 'g', 'w', 'a', 'e', 't', 5, 'g', 'w', 'a', 'e', 'p', 5, 'g', 'w', 'a', 'e', 'h', 3, 'g', 'o', 'e',\n4, 'g', 'o', 'e', 'g', 5, 'g', 'o', 'e', 'g', 'g', 5, 'g', 'o', 'e', 'g', 's', 4, 'g', 'o', 'e', 'n', 5, 'g', 'o', 'e', 'n', 'j', 5, 'g', 'o', 'e', 'n', 'h',\n4, 'g', 'o', 'e', 'd', 4, 'g', 'o', 'e', 'l', 5, 'g', 'o', 'e', 'l', 'g', 5, 'g', 'o', 'e', 'l', 'm', 5, 'g', 'o', 'e', 'l', 'b', 5, 'g', 'o', 'e', 'l', 's',\n5, 'g', 'o', 'e', 'l', 't', 5, 'g', 'o', 'e', 'l', 'p', 5, 'g', 'o', 'e', 'l', 'h', 4, 'g', 'o', 'e', 'm', 4, 'g', 'o', 'e', 'b', 5, 'g', 'o', 'e', 'b', 's',\n4, 'g', 'o', 'e', 's', 5, 'g', 'o', 'e', 's', 's', 5, 'g', 'o', 'e', 'n', 'g', 4, 'g', 'o', 'e', 'j', 4, 'g', 'o', 'e', 'c', 4, 'g', 'o', 'e', 'k',\n4, 'g', 'o', 'e', 't', 4, 'g', 'o', 'e', 'p', 4, 'g', 'o', 'e', 'h', 3, 'g', 'y', 'o', 4, 'g', 'y', 'o', 'g', 5, 'g', 'y', 'o', 'g', 'g',\n5, 'g', 'y', 'o', 'g', 's', 4, 'g', 'y', 'o', 'n', 5, 'g', 'y', 'o', 'n', 'j', 5, 'g', 'y', 'o', 'n', 'h', 4, 'g', 'y', 'o', 'd', 4, 'g', 'y', 'o', 'l',\n5, 'g', 'y', 'o', 'l', 'g', 5, 'g', 'y', 'o', 'l', 'm', 5, 'g', 'y', 'o', 'l', 'b', 5, 'g', 'y', 'o', 'l', 's', 5, 'g', 'y', 'o', 'l', 't', 5, 'g', 'y', 'o', 'l', 'p',\n5, 'g', 'y', 'o', 'l', 'h', 4, 'g', 'y', 'o', 'm', 4, 'g', 'y', 'o', 'b', 5, 'g', 'y', 'o', 'b', 's', 4, 'g', 'y', 'o', 's', 5, 'g', 'y', 'o', 's', 's',\n5, 'g', 'y', 'o', 'n', 'g', 4, 'g', 'y', 'o', 'j', 4, 'g', 'y', 'o', 'c', 4, 'g', 'y', 'o', 'k', 4, 'g', 'y', 'o', 't', 4, 'g', 'y', 'o', 'p',\n4, 'g', 'y', 'o', 'h', 2, 'g', 'u', 3, 'g', 'u', 'g', 4, 'g', 'u', 'g', 'g', 4, 'g', 'u', 'g', 's', 3, 'g', 'u', 'n',\n4, 'g', 'u', 'n', 'j', 4, 'g', 'u', 'n', 'h', 3, 'g', 'u', 'd', 3, 'g', 'u', 'l', 4, 'g', 'u', 'l', 'g', 4, 'g', 'u', 'l', 'm',\n4, 'g', 'u', 'l', 'b', 4, 'g', 'u', 'l', 's', 4, 'g', 'u', 'l', 't', 4, 'g', 'u', 'l', 'p', 4, 'g', 'u', 'l', 'h', 3, 'g', 'u', 'm',\n3, 'g', 'u', 'b', 4, 'g', 'u', 'b', 's', 3, 'g', 'u', 's', 4, 'g', 'u', 's', 's', 4, 'g', 'u', 'n', 'g', 3, 'g', 'u', 'j',\n3, 'g', 'u', 'c', 3, 'g', 'u', 'k', 3, 'g', 'u', 't', 3, 'g', 'u', 'p', 3, 'g', 'u', 'h', 4, 'g', 'w', 'e', 'o',\n5, 'g', 'w', 'e', 'o', 'g', 6, 'g', 'w', 'e', 'o', 'g', 'g', 6, 'g', 'w', 'e', 'o', 'g', 's', 5, 'g', 'w', 'e', 'o', 'n', 6, 'g', 'w', 'e', 'o', 'n', 'j', 6, 'g', 'w', 'e', 'o', 'n', 'h',\n5, 'g', 'w', 'e', 'o', 'd', 5, 'g', 'w', 'e', 'o', 'l', 6, 'g', 'w', 'e', 'o', 'l', 'g', 6, 'g', 'w', 'e', 'o', 'l', 'm', 6, 'g', 'w', 'e', 'o', 'l', 'b', 6, 'g', 'w', 'e', 'o', 'l', 's',\n6, 'g', 'w', 'e', 'o', 'l', 't', 6, 'g', 'w', 'e', 'o', 'l', 'p', 6, 'g', 'w', 'e', 'o', 'l', 'h', 5, 'g', 'w', 'e', 'o', 'm', 5, 'g', 'w', 'e', 'o', 'b', 6, 'g', 'w', 'e', 'o', 'b', 's',\n5, 'g', 'w', 'e', 'o', 's', 6, 'g', 'w', 'e', 'o', 's', 's', 6, 'g', 'w', 'e', 'o', 'n', 'g', 5, 'g', 'w', 'e', 'o', 'j', 5, 'g', 'w', 'e', 'o', 'c', 5, 'g', 'w', 'e', 'o', 'k',\n5, 'g', 'w', 'e', 'o', 't', 5, 'g', 'w', 'e', 'o', 'p', 5, 'g', 'w', 'e', 'o', 'h', 3, 'g', 'w', 'e', 4, 'g', 'w', 'e', 'g', 5, 'g', 'w', 'e', 'g', 'g',\n5, 'g', 'w', 'e', 'g', 's', 4, 'g', 'w', 'e', 'n', 5, 'g', 'w', 'e', 'n', 'j', 5, 'g', 'w', 'e', 'n', 'h', 4, 'g', 'w', 'e', 'd', 4, 'g', 'w', 'e', 'l',\n5, 'g', 'w', 'e', 'l', 'g', 5, 'g', 'w', 'e', 'l', 'm', 5, 'g', 'w', 'e', 'l', 'b', 5, 'g', 'w', 'e', 'l', 's', 5, 'g', 'w', 'e', 'l', 't', 5, 'g', 'w', 'e', 'l', 'p',\n5, 'g', 'w', 'e', 'l', 'h', 4, 'g', 'w', 'e', 'm', 4, 'g', 'w', 'e', 'b', 5, 'g', 'w', 'e', 'b', 's', 4, 'g', 'w', 'e', 's', 5, 'g', 'w', 'e', 's', 's',\n5, 'g', 'w', 'e', 'n', 'g', 4, 'g', 'w', 'e', 'j', 4, 'g', 'w', 'e', 'c', 4, 'g', 'w', 'e', 'k', 4, 'g', 'w', 'e', 't', 4, 'g', 'w', 'e', 'p',\n4, 'g', 'w', 'e', 'h', 3, 'g', 'w', 'i', 4, 'g', 'w', 'i', 'g', 5, 'g', 'w', 'i', 'g', 'g', 5, 'g', 'w', 'i', 'g', 's', 4, 'g', 'w', 'i', 'n',\n5, 'g', 'w', 'i', 'n', 'j', 5, 'g', 'w', 'i', 'n', 'h', 4, 'g', 'w', 'i', 'd', 4, 'g', 'w', 'i', 'l', 5, 'g', 'w', 'i', 'l', 'g', 5, 'g', 'w', 'i', 'l', 'm',\n5, 'g', 'w', 'i', 'l', 'b', 5, 'g', 'w', 'i', 'l', 's', 5, 'g', 'w', 'i', 'l', 't', 5, 'g', 'w', 'i', 'l', 'p', 5, 'g', 'w', 'i', 'l', 'h', 4, 'g', 'w', 'i', 'm',\n4, 'g', 'w', 'i', 'b', 5, 'g', 'w', 'i', 'b', 's', 4, 'g', 'w', 'i', 's', 5, 'g', 'w', 'i', 's', 's', 5, 'g', 'w', 'i', 'n', 'g', 4, 'g', 'w', 'i', 'j',\n4, 'g', 'w', 'i', 'c', 4, 'g', 'w', 'i', 'k', 4, 'g', 'w', 'i', 't', 4, 'g', 'w', 'i', 'p', 4, 'g', 'w', 'i', 'h', 3, 'g', 'y', 'u',\n4, 'g', 'y', 'u', 'g', 5, 'g', 'y', 'u', 'g', 'g', 5, 'g', 'y', 'u', 'g', 's', 4, 'g', 'y', 'u', 'n', 5, 'g', 'y', 'u', 'n', 'j', 5, 'g', 'y', 'u', 'n', 'h',\n4, 'g', 'y', 'u', 'd', 4, 'g', 'y', 'u', 'l', 5, 'g', 'y', 'u', 'l', 'g', 5, 'g', 'y', 'u', 'l', 'm', 5, 'g', 'y', 'u', 'l', 'b', 5, 'g', 'y', 'u', 'l', 's',\n5, 'g', 'y', 'u', 'l', 't', 5, 'g', 'y', 'u', 'l', 'p', 5, 'g', 'y', 'u', 'l', 'h', 4, 'g', 'y', 'u', 'm', 4, 'g', 'y', 'u', 'b', 5, 'g', 'y', 'u', 'b', 's',\n4, 'g', 'y', 'u', 's', 5, 'g', 'y', 'u', 's', 's', 5, 'g', 'y', 'u', 'n', 'g', 4, 'g', 'y', 'u', 'j', 4, 'g', 'y', 'u', 'c', 4, 'g', 'y', 'u', 'k',\n4, 'g', 'y', 'u', 't', 4, 'g', 'y', 'u', 'p', 4, 'g', 'y', 'u', 'h', 3, 'g', 'e', 'u', 4, 'g', 'e', 'u', 'g', 5, 'g', 'e', 'u', 'g', 'g',\n5, 'g', 'e', 'u', 'g', 's', 4, 'g', 'e', 'u', 'n', 5, 'g', 'e', 'u', 'n', 'j', 5, 'g', 'e', 'u', 'n', 'h', 4, 'g', 'e', 'u', 'd', 4, 'g', 'e', 'u', 'l',\n5, 'g', 'e', 'u', 'l', 'g', 5, 'g', 'e', 'u', 'l', 'm', 5, 'g', 'e', 'u', 'l', 'b', 5, 'g', 'e', 'u', 'l', 's', 5, 'g', 'e', 'u', 'l', 't', 5, 'g', 'e', 'u', 'l', 'p',\n5, 'g', 'e', 'u', 'l', 'h', 4, 'g', 'e', 'u', 'm', 4, 'g', 'e', 'u', 'b', 5, 'g', 'e', 'u', 'b', 's', 4, 'g', 'e', 'u', 's', 5, 'g', 'e', 'u', 's', 's',\n5, 'g', 'e', 'u', 'n', 'g', 4, 'g', 'e', 'u', 'j', 4, 'g', 'e', 'u', 'c', 4, 'g', 'e', 'u', 'k', 4, 'g', 'e', 'u', 't', 4, 'g', 'e', 'u', 'p',\n4, 'g', 'e', 'u', 'h', 3, 'g', 'y', 'i', 4, 'g', 'y', 'i', 'g', 5, 'g', 'y', 'i', 'g', 'g', 5, 'g', 'y', 'i', 'g', 's', 4, 'g', 'y', 'i', 'n',\n5, 'g', 'y', 'i', 'n', 'j', 5, 'g', 'y', 'i', 'n', 'h', 4, 'g', 'y', 'i', 'd', 4, 'g', 'y', 'i', 'l', 5, 'g', 'y', 'i', 'l', 'g', 5, 'g', 'y', 'i', 'l', 'm',\n5, 'g', 'y', 'i', 'l', 'b', 5, 'g', 'y', 'i', 'l', 's', 5, 'g', 'y', 'i', 'l', 't', 5, 'g', 'y', 'i', 'l', 'p', 5, 'g', 'y', 'i', 'l', 'h', 4, 'g', 'y', 'i', 'm',\n4, 'g', 'y', 'i', 'b', 5, 'g', 'y', 'i', 'b', 's', 4, 'g', 'y', 'i', 's', 5, 'g', 'y', 'i', 's', 's', 5, 'g', 'y', 'i', 'n', 'g', 4, 'g', 'y', 'i', 'j',\n4, 'g', 'y', 'i', 'c', 4, 'g', 'y', 'i', 'k', 4, 'g', 'y', 'i', 't', 4, 'g', 'y', 'i', 'p', 4, 'g', 'y', 'i', 'h', 2, 'g', 'i',\n3, 'g', 'i', 'g', 4, 'g', 'i', 'g', 'g', 4, 'g', 'i', 'g', 's', 3, 'g', 'i', 'n', 4, 'g', 'i', 'n', 'j', 4, 'g', 'i', 'n', 'h',\n3, 'g', 'i', 'd', 3, 'g', 'i', 'l', 4, 'g', 'i', 'l', 'g', 4, 'g', 'i', 'l', 'm', 4, 'g', 'i', 'l', 'b', 4, 'g', 'i', 'l', 's',\n4, 'g', 'i', 'l', 't', 4, 'g', 'i', 'l', 'p', 4, 'g', 'i', 'l', 'h', 3, 'g', 'i', 'm', 3, 'g', 'i', 'b', 4, 'g', 'i', 'b', 's',\n3, 'g', 'i', 's', 4, 'g', 'i', 's', 's', 4, 'g', 'i', 'n', 'g', 3, 'g', 'i', 'j', 3, 'g', 'i', 'c', 3, 'g', 'i', 'k',\n3, 'g', 'i', 't', 3, 'g', 'i', 'p', 3, 'g', 'i', 'h', 3, 'g', 'g', 'a', 4, 'g', 'g', 'a', 'g', 5, 'g', 'g', 'a', 'g', 'g',\n5, 'g', 'g', 'a', 'g', 's', 4, 'g', 'g', 'a', 'n', 5, 'g', 'g', 'a', 'n', 'j', 5, 'g', 'g', 'a', 'n', 'h', 4, 'g', 'g', 'a', 'd', 4, 'g', 'g', 'a', 'l',\n5, 'g', 'g', 'a', 'l', 'g', 5, 'g', 'g', 'a', 'l', 'm', 5, 'g', 'g', 'a', 'l', 'b', 5, 'g', 'g', 'a', 'l', 's', 5, 'g', 'g', 'a', 'l', 't', 5, 'g', 'g', 'a', 'l', 'p',\n5, 'g', 'g', 'a', 'l', 'h', 4, 'g', 'g', 'a', 'm', 4, 'g', 'g', 'a', 'b', 5, 'g', 'g', 'a', 'b', 's', 4, 'g', 'g', 'a', 's', 5, 'g', 'g', 'a', 's', 's',\n5, 'g', 'g', 'a', 'n', 'g', 4, 'g', 'g', 'a', 'j', 4, 'g', 'g', 'a', 'c', 4, 'g', 'g', 'a', 'k', 4, 'g', 'g', 'a', 't', 4, 'g', 'g', 'a', 'p',\n4, 'g', 'g', 'a', 'h', 4, 'g', 'g', 'a', 'e', 5, 'g', 'g', 'a', 'e', 'g', 6, 'g', 'g', 'a', 'e', 'g', 'g', 6, 'g', 'g', 'a', 'e', 'g', 's', 5, 'g', 'g', 'a', 'e', 'n',\n6, 'g', 'g', 'a', 'e', 'n', 'j', 6, 'g', 'g', 'a', 'e', 'n', 'h', 5, 'g', 'g', 'a', 'e', 'd', 5, 'g', 'g', 'a', 'e', 'l', 6, 'g', 'g', 'a', 'e', 'l', 'g', 6, 'g', 'g', 'a', 'e', 'l', 'm',\n6, 'g', 'g', 'a', 'e', 'l', 'b', 6, 'g', 'g', 'a', 'e', 'l', 's', 6, 'g', 'g', 'a', 'e', 'l', 't', 6, 'g', 'g', 'a', 'e', 'l', 'p', 6, 'g', 'g', 'a', 'e', 'l', 'h', 5, 'g', 'g', 'a', 'e', 'm',\n5, 'g', 'g', 'a', 'e', 'b', 6, 'g', 'g', 'a', 'e', 'b', 's', 5, 'g', 'g', 'a', 'e', 's', 6, 'g', 'g', 'a', 'e', 's', 's', 6, 'g', 'g', 'a', 'e', 'n', 'g', 5, 'g', 'g', 'a', 'e', 'j',\n5, 'g', 'g', 'a', 'e', 'c', 5, 'g', 'g', 'a', 'e', 'k', 5, 'g', 'g', 'a', 'e', 't', 5, 'g', 'g', 'a', 'e', 'p', 5, 'g', 'g', 'a', 'e', 'h', 4, 'g', 'g', 'y', 'a',\n5, 'g', 'g', 'y', 'a', 'g', 6, 'g', 'g', 'y', 'a', 'g', 'g', 6, 'g', 'g', 'y', 'a', 'g', 's', 5, 'g', 'g', 'y', 'a', 'n', 6, 'g', 'g', 'y', 'a', 'n', 'j', 6, 'g', 'g', 'y', 'a', 'n', 'h',\n5, 'g', 'g', 'y', 'a', 'd', 5, 'g', 'g', 'y', 'a', 'l', 6, 'g', 'g', 'y', 'a', 'l', 'g', 6, 'g', 'g', 'y', 'a', 'l', 'm', 6, 'g', 'g', 'y', 'a', 'l', 'b', 6, 'g', 'g', 'y', 'a', 'l', 's',\n6, 'g', 'g', 'y', 'a', 'l', 't', 6, 'g', 'g', 'y', 'a', 'l', 'p', 6, 'g', 'g', 'y', 'a', 'l', 'h', 5, 'g', 'g', 'y', 'a', 'm', 5, 'g', 'g', 'y', 'a', 'b', 6, 'g', 'g', 'y', 'a', 'b', 's',\n5, 'g', 'g', 'y', 'a', 's', 6, 'g', 'g', 'y', 'a', 's', 's', 6, 'g', 'g', 'y', 'a', 'n', 'g', 5, 'g', 'g', 'y', 'a', 'j', 5, 'g', 'g', 'y', 'a', 'c', 5, 'g', 'g', 'y', 'a', 'k',\n5, 'g', 'g', 'y', 'a', 't', 5, 'g', 'g', 'y', 'a', 'p', 5, 'g', 'g', 'y', 'a', 'h', 5, 'g', 'g', 'y', 'a', 'e', 6, 'g', 'g', 'y', 'a', 'e', 'g', 7, 'g', 'g', 'y', 'a', 'e', 'g', 'g',\n7, 'g', 'g', 'y', 'a', 'e', 'g', 's', 6, 'g', 'g', 'y', 'a', 'e', 'n', 7, 'g', 'g', 'y', 'a', 'e', 'n', 'j', 7, 'g', 'g', 'y', 'a', 'e', 'n', 'h', 6, 'g', 'g', 'y', 'a', 'e', 'd', 6, 'g', 'g', 'y', 'a', 'e', 'l',\n7, 'g', 'g', 'y', 'a', 'e', 'l', 'g', 7, 'g', 'g', 'y', 'a', 'e', 'l', 'm', 7, 'g', 'g', 'y', 'a', 'e', 'l', 'b', 7, 'g', 'g', 'y', 'a', 'e', 'l', 's', 7, 'g', 'g', 'y', 'a', 'e', 'l', 't', 7, 'g', 'g', 'y', 'a', 'e', 'l', 'p',\n7, 'g', 'g', 'y', 'a', 'e', 'l', 'h', 6, 'g', 'g', 'y', 'a', 'e', 'm', 6, 'g', 'g', 'y', 'a', 'e', 'b', 7, 'g', 'g', 'y', 'a', 'e', 'b', 's', 6, 'g', 'g', 'y', 'a', 'e', 's', 7, 'g', 'g', 'y', 'a', 'e', 's', 's',\n7, 'g', 'g', 'y', 'a', 'e', 'n', 'g', 6, 'g', 'g', 'y', 'a', 'e', 'j', 6, 'g', 'g', 'y', 'a', 'e', 'c', 6, 'g', 'g', 'y', 'a', 'e', 'k', 6, 'g', 'g', 'y', 'a', 'e', 't', 6, 'g', 'g', 'y', 'a', 'e', 'p',\n6, 'g', 'g', 'y', 'a', 'e', 'h', 4, 'g', 'g', 'e', 'o', 5, 'g', 'g', 'e', 'o', 'g', 6, 'g', 'g', 'e', 'o', 'g', 'g', 6, 'g', 'g', 'e', 'o', 'g', 's', 5, 'g', 'g', 'e', 'o', 'n',\n6, 'g', 'g', 'e', 'o', 'n', 'j', 6, 'g', 'g', 'e', 'o', 'n', 'h', 5, 'g', 'g', 'e', 'o', 'd', 5, 'g', 'g', 'e', 'o', 'l', 6, 'g', 'g', 'e', 'o', 'l', 'g', 6, 'g', 'g', 'e', 'o', 'l', 'm',\n6, 'g', 'g', 'e', 'o', 'l', 'b', 6, 'g', 'g', 'e', 'o', 'l', 's', 6, 'g', 'g', 'e', 'o', 'l', 't', 6, 'g', 'g', 'e', 'o', 'l', 'p', 6, 'g', 'g', 'e', 'o', 'l', 'h', 5, 'g', 'g', 'e', 'o', 'm',\n5, 'g', 'g', 'e', 'o', 'b', 6, 'g', 'g', 'e', 'o', 'b', 's', 5, 'g', 'g', 'e', 'o', 's', 6, 'g', 'g', 'e', 'o', 's', 's', 6, 'g', 'g', 'e', 'o', 'n', 'g', 5, 'g', 'g', 'e', 'o', 'j',\n5, 'g', 'g', 'e', 'o', 'c', 5, 'g', 'g', 'e', 'o', 'k', 5, 'g', 'g', 'e', 'o', 't', 5, 'g', 'g', 'e', 'o', 'p', 5, 'g', 'g', 'e', 'o', 'h', 3, 'g', 'g', 'e',\n4, 'g', 'g', 'e', 'g', 5, 'g', 'g', 'e', 'g', 'g', 5, 'g', 'g', 'e', 'g', 's', 4, 'g', 'g', 'e', 'n', 5, 'g', 'g', 'e', 'n', 'j', 5, 'g', 'g', 'e', 'n', 'h',\n4, 'g', 'g', 'e', 'd', 4, 'g', 'g', 'e', 'l', 5, 'g', 'g', 'e', 'l', 'g', 5, 'g', 'g', 'e', 'l', 'm', 5, 'g', 'g', 'e', 'l', 'b', 5, 'g', 'g', 'e', 'l', 's',\n5, 'g', 'g', 'e', 'l', 't', 5, 'g', 'g', 'e', 'l', 'p', 5, 'g', 'g', 'e', 'l', 'h', 4, 'g', 'g', 'e', 'm', 4, 'g', 'g', 'e', 'b', 5, 'g', 'g', 'e', 'b', 's',\n4, 'g', 'g', 'e', 's', 5, 'g', 'g', 'e', 's', 's', 5, 'g', 'g', 'e', 'n', 'g', 4, 'g', 'g', 'e', 'j', 4, 'g', 'g', 'e', 'c', 4, 'g', 'g', 'e', 'k',\n4, 'g', 'g', 'e', 't', 4, 'g', 'g', 'e', 'p', 4, 'g', 'g', 'e', 'h', 5, 'g', 'g', 'y', 'e', 'o', 6, 'g', 'g', 'y', 'e', 'o', 'g', 7, 'g', 'g', 'y', 'e', 'o', 'g', 'g',\n7, 'g', 'g', 'y', 'e', 'o', 'g', 's', 6, 'g', 'g', 'y', 'e', 'o', 'n', 7, 'g', 'g', 'y', 'e', 'o', 'n', 'j', 7, 'g', 'g', 'y', 'e', 'o', 'n', 'h', 6, 'g', 'g', 'y', 'e', 'o', 'd', 6, 'g', 'g', 'y', 'e', 'o', 'l',\n7, 'g', 'g', 'y', 'e', 'o', 'l', 'g', 7, 'g', 'g', 'y', 'e', 'o', 'l', 'm', 7, 'g', 'g', 'y', 'e', 'o', 'l', 'b', 7, 'g', 'g', 'y', 'e', 'o', 'l', 's', 7, 'g', 'g', 'y', 'e', 'o', 'l', 't', 7, 'g', 'g', 'y', 'e', 'o', 'l', 'p',\n7, 'g', 'g', 'y', 'e', 'o', 'l', 'h', 6, 'g', 'g', 'y', 'e', 'o', 'm', 6, 'g', 'g', 'y', 'e', 'o', 'b', 7, 'g', 'g', 'y', 'e', 'o', 'b', 's', 6, 'g', 'g', 'y', 'e', 'o', 's', 7, 'g', 'g', 'y', 'e', 'o', 's', 's',\n7, 'g', 'g', 'y', 'e', 'o', 'n', 'g', 6, 'g', 'g', 'y', 'e', 'o', 'j', 6, 'g', 'g', 'y', 'e', 'o', 'c', 6, 'g', 'g', 'y', 'e', 'o', 'k', 6, 'g', 'g', 'y', 'e', 'o', 't', 6, 'g', 'g', 'y', 'e', 'o', 'p',\n6, 'g', 'g', 'y', 'e', 'o', 'h', 4, 'g', 'g', 'y', 'e', 5, 'g', 'g', 'y', 'e', 'g', 6, 'g', 'g', 'y', 'e', 'g', 'g', 6, 'g', 'g', 'y', 'e', 'g', 's', 5, 'g', 'g', 'y', 'e', 'n',\n6, 'g', 'g', 'y', 'e', 'n', 'j', 6, 'g', 'g', 'y', 'e', 'n', 'h', 5, 'g', 'g', 'y', 'e', 'd', 5, 'g', 'g', 'y', 'e', 'l', 6, 'g', 'g', 'y', 'e', 'l', 'g', 6, 'g', 'g', 'y', 'e', 'l', 'm',\n6, 'g', 'g', 'y', 'e', 'l', 'b', 6, 'g', 'g', 'y', 'e', 'l', 's', 6, 'g', 'g', 'y', 'e', 'l', 't', 6, 'g', 'g', 'y', 'e', 'l', 'p', 6, 'g', 'g', 'y', 'e', 'l', 'h', 5, 'g', 'g', 'y', 'e', 'm',\n5, 'g', 'g', 'y', 'e', 'b', 6, 'g', 'g', 'y', 'e', 'b', 's', 5, 'g', 'g', 'y', 'e', 's', 6, 'g', 'g', 'y', 'e', 's', 's', 6, 'g', 'g', 'y', 'e', 'n', 'g', 5, 'g', 'g', 'y', 'e', 'j',\n5, 'g', 'g', 'y', 'e', 'c', 5, 'g', 'g', 'y', 'e', 'k', 5, 'g', 'g', 'y', 'e', 't', 5, 'g', 'g', 'y', 'e', 'p', 5, 'g', 'g', 'y', 'e', 'h', 3, 'g', 'g', 'o',\n4, 'g', 'g', 'o', 'g', 5, 'g', 'g', 'o', 'g', 'g', 5, 'g', 'g', 'o', 'g', 's', 4, 'g', 'g', 'o', 'n', 5, 'g', 'g', 'o', 'n', 'j', 5, 'g', 'g', 'o', 'n', 'h',\n4, 'g', 'g', 'o', 'd', 4, 'g', 'g', 'o', 'l', 5, 'g', 'g', 'o', 'l', 'g', 5, 'g', 'g', 'o', 'l', 'm', 5, 'g', 'g', 'o', 'l', 'b', 5, 'g', 'g', 'o', 'l', 's',\n5, 'g', 'g', 'o', 'l', 't', 5, 'g', 'g', 'o', 'l', 'p', 5, 'g', 'g', 'o', 'l', 'h', 4, 'g', 'g', 'o', 'm', 4, 'g', 'g', 'o', 'b', 5, 'g', 'g', 'o', 'b', 's',\n4, 'g', 'g', 'o', 's', 5, 'g', 'g', 'o', 's', 's', 5, 'g', 'g', 'o', 'n', 'g', 4, 'g', 'g', 'o', 'j', 4, 'g', 'g', 'o', 'c', 4, 'g', 'g', 'o', 'k',\n4, 'g', 'g', 'o', 't', 4, 'g', 'g', 'o', 'p', 4, 'g', 'g', 'o', 'h', 4, 'g', 'g', 'w', 'a', 5, 'g', 'g', 'w', 'a', 'g', 6, 'g', 'g', 'w', 'a', 'g', 'g',\n6, 'g', 'g', 'w', 'a', 'g', 's', 5, 'g', 'g', 'w', 'a', 'n', 6, 'g', 'g', 'w', 'a', 'n', 'j', 6, 'g', 'g', 'w', 'a', 'n', 'h', 5, 'g', 'g', 'w', 'a', 'd', 5, 'g', 'g', 'w', 'a', 'l',\n6, 'g', 'g', 'w', 'a', 'l', 'g', 6, 'g', 'g', 'w', 'a', 'l', 'm', 6, 'g', 'g', 'w', 'a', 'l', 'b', 6, 'g', 'g', 'w', 'a', 'l', 's', 6, 'g', 'g', 'w', 'a', 'l', 't', 6, 'g', 'g', 'w', 'a', 'l', 'p',\n6, 'g', 'g', 'w', 'a', 'l', 'h', 5, 'g', 'g', 'w', 'a', 'm', 5, 'g', 'g', 'w', 'a', 'b', 6, 'g', 'g', 'w', 'a', 'b', 's', 5, 'g', 'g', 'w', 'a', 's', 6, 'g', 'g', 'w', 'a', 's', 's',\n6, 'g', 'g', 'w', 'a', 'n', 'g', 5, 'g', 'g', 'w', 'a', 'j', 5, 'g', 'g', 'w', 'a', 'c', 5, 'g', 'g', 'w', 'a', 'k', 5, 'g', 'g', 'w', 'a', 't', 5, 'g', 'g', 'w', 'a', 'p',\n5, 'g', 'g', 'w', 'a', 'h', 5, 'g', 'g', 'w', 'a', 'e', 6, 'g', 'g', 'w', 'a', 'e', 'g', 7, 'g', 'g', 'w', 'a', 'e', 'g', 'g', 7, 'g', 'g', 'w', 'a', 'e', 'g', 's', 6, 'g', 'g', 'w', 'a', 'e', 'n',\n7, 'g', 'g', 'w', 'a', 'e', 'n', 'j', 7, 'g', 'g', 'w', 'a', 'e', 'n', 'h', 6, 'g', 'g', 'w', 'a', 'e', 'd', 6, 'g', 'g', 'w', 'a', 'e', 'l', 7, 'g', 'g', 'w', 'a', 'e', 'l', 'g', 7, 'g', 'g', 'w', 'a', 'e', 'l', 'm',\n7, 'g', 'g', 'w', 'a', 'e', 'l', 'b', 7, 'g', 'g', 'w', 'a', 'e', 'l', 's', 7, 'g', 'g', 'w', 'a', 'e', 'l', 't', 7, 'g', 'g', 'w', 'a', 'e', 'l', 'p', 7, 'g', 'g', 'w', 'a', 'e', 'l', 'h', 6, 'g', 'g', 'w', 'a', 'e', 'm',\n6, 'g', 'g', 'w', 'a', 'e', 'b', 7, 'g', 'g', 'w', 'a', 'e', 'b', 's', 6, 'g', 'g', 'w', 'a', 'e', 's', 7, 'g', 'g', 'w', 'a', 'e', 's', 's', 7, 'g', 'g', 'w', 'a', 'e', 'n', 'g', 6, 'g', 'g', 'w', 'a', 'e', 'j',\n6, 'g', 'g', 'w', 'a', 'e', 'c', 6, 'g', 'g', 'w', 'a', 'e', 'k', 6, 'g', 'g', 'w', 'a', 'e', 't', 6, 'g', 'g', 'w', 'a', 'e', 'p', 6, 'g', 'g', 'w', 'a', 'e', 'h', 4, 'g', 'g', 'o', 'e',\n5, 'g', 'g', 'o', 'e', 'g', 6, 'g', 'g', 'o', 'e', 'g', 'g', 6, 'g', 'g', 'o', 'e', 'g', 's', 5, 'g', 'g', 'o', 'e', 'n', 6, 'g', 'g', 'o', 'e', 'n', 'j', 6, 'g', 'g', 'o', 'e', 'n', 'h',\n5, 'g', 'g', 'o', 'e', 'd', 5, 'g', 'g', 'o', 'e', 'l', 6, 'g', 'g', 'o', 'e', 'l', 'g', 6, 'g', 'g', 'o', 'e', 'l', 'm', 6, 'g', 'g', 'o', 'e', 'l', 'b', 6, 'g', 'g', 'o', 'e', 'l', 's',\n6, 'g', 'g', 'o', 'e', 'l', 't', 6, 'g', 'g', 'o', 'e', 'l', 'p', 6, 'g', 'g', 'o', 'e', 'l', 'h', 5, 'g', 'g', 'o', 'e', 'm', 5, 'g', 'g', 'o', 'e', 'b', 6, 'g', 'g', 'o', 'e', 'b', 's',\n5, 'g', 'g', 'o', 'e', 's', 6, 'g', 'g', 'o', 'e', 's', 's', 6, 'g', 'g', 'o', 'e', 'n', 'g', 5, 'g', 'g', 'o', 'e', 'j', 5, 'g', 'g', 'o', 'e', 'c', 5, 'g', 'g', 'o', 'e', 'k',\n5, 'g', 'g', 'o', 'e', 't', 5, 'g', 'g', 'o', 'e', 'p', 5, 'g', 'g', 'o', 'e', 'h', 4, 'g', 'g', 'y', 'o', 5, 'g', 'g', 'y', 'o', 'g', 6, 'g', 'g', 'y', 'o', 'g', 'g',\n6, 'g', 'g', 'y', 'o', 'g', 's', 5, 'g', 'g', 'y', 'o', 'n', 6, 'g', 'g', 'y', 'o', 'n', 'j', 6, 'g', 'g', 'y', 'o', 'n', 'h', 5, 'g', 'g', 'y', 'o', 'd', 5, 'g', 'g', 'y', 'o', 'l',\n6, 'g', 'g', 'y', 'o', 'l', 'g', 6, 'g', 'g', 'y', 'o', 'l', 'm', 6, 'g', 'g', 'y', 'o', 'l', 'b', 6, 'g', 'g', 'y', 'o', 'l', 's', 6, 'g', 'g', 'y', 'o', 'l', 't', 6, 'g', 'g', 'y', 'o', 'l', 'p',\n6, 'g', 'g', 'y', 'o', 'l', 'h', 5, 'g', 'g', 'y', 'o', 'm', 5, 'g', 'g', 'y', 'o', 'b', 6, 'g', 'g', 'y', 'o', 'b', 's', 5, 'g', 'g', 'y', 'o', 's', 6, 'g', 'g', 'y', 'o', 's', 's',\n6, 'g', 'g', 'y', 'o', 'n', 'g', 5, 'g', 'g', 'y', 'o', 'j', 5, 'g', 'g', 'y', 'o', 'c', 5, 'g', 'g', 'y', 'o', 'k', 5, 'g', 'g', 'y', 'o', 't', 5, 'g', 'g', 'y', 'o', 'p',\n5, 'g', 'g', 'y', 'o', 'h', 3, 'g', 'g', 'u', 4, 'g', 'g', 'u', 'g', 5, 'g', 'g', 'u', 'g', 'g', 5, 'g', 'g', 'u', 'g', 's', 4, 'g', 'g', 'u', 'n',\n5, 'g', 'g', 'u', 'n', 'j', 5, 'g', 'g', 'u', 'n', 'h', 4, 'g', 'g', 'u', 'd', 4, 'g', 'g', 'u', 'l', 5, 'g', 'g', 'u', 'l', 'g', 5, 'g', 'g', 'u', 'l', 'm',\n5, 'g', 'g', 'u', 'l', 'b', 5, 'g', 'g', 'u', 'l', 's', 5, 'g', 'g', 'u', 'l', 't', 5, 'g', 'g', 'u', 'l', 'p', 5, 'g', 'g', 'u', 'l', 'h', 4, 'g', 'g', 'u', 'm',\n4, 'g', 'g', 'u', 'b', 5, 'g', 'g', 'u', 'b', 's', 4, 'g', 'g', 'u', 's', 5, 'g', 'g', 'u', 's', 's', 5, 'g', 'g', 'u', 'n', 'g', 4, 'g', 'g', 'u', 'j',\n4, 'g', 'g', 'u', 'c', 4, 'g', 'g', 'u', 'k', 4, 'g', 'g', 'u', 't', 4, 'g', 'g', 'u', 'p', 4, 'g', 'g', 'u', 'h', 5, 'g', 'g', 'w', 'e', 'o',\n6, 'g', 'g', 'w', 'e', 'o', 'g', 7, 'g', 'g', 'w', 'e', 'o', 'g', 'g', 7, 'g', 'g', 'w', 'e', 'o', 'g', 's', 6, 'g', 'g', 'w', 'e', 'o', 'n', 7, 'g', 'g', 'w', 'e', 'o', 'n', 'j', 7, 'g', 'g', 'w', 'e', 'o', 'n', 'h',\n6, 'g', 'g', 'w', 'e', 'o', 'd', 6, 'g', 'g', 'w', 'e', 'o', 'l', 7, 'g', 'g', 'w', 'e', 'o', 'l', 'g', 7, 'g', 'g', 'w', 'e', 'o', 'l', 'm', 7, 'g', 'g', 'w', 'e', 'o', 'l', 'b', 7, 'g', 'g', 'w', 'e', 'o', 'l', 's',\n7, 'g', 'g', 'w', 'e', 'o', 'l', 't', 7, 'g', 'g', 'w', 'e', 'o', 'l', 'p', 7, 'g', 'g', 'w', 'e', 'o', 'l', 'h', 6, 'g', 'g', 'w', 'e', 'o', 'm', 6, 'g', 'g', 'w', 'e', 'o', 'b', 7, 'g', 'g', 'w', 'e', 'o', 'b', 's',\n6, 'g', 'g', 'w', 'e', 'o', 's', 7, 'g', 'g', 'w', 'e', 'o', 's', 's', 7, 'g', 'g', 'w', 'e', 'o', 'n', 'g', 6, 'g', 'g', 'w', 'e', 'o', 'j', 6, 'g', 'g', 'w', 'e', 'o', 'c', 6, 'g', 'g', 'w', 'e', 'o', 'k',\n6, 'g', 'g', 'w', 'e', 'o', 't', 6, 'g', 'g', 'w', 'e', 'o', 'p', 6, 'g', 'g', 'w', 'e', 'o', 'h', 4, 'g', 'g', 'w', 'e', 5, 'g', 'g', 'w', 'e', 'g', 6, 'g', 'g', 'w', 'e', 'g', 'g',\n6, 'g', 'g', 'w', 'e', 'g', 's', 5, 'g', 'g', 'w', 'e', 'n', 6, 'g', 'g', 'w', 'e', 'n', 'j', 6, 'g', 'g', 'w', 'e', 'n', 'h', 5, 'g', 'g', 'w', 'e', 'd', 5, 'g', 'g', 'w', 'e', 'l',\n6, 'g', 'g', 'w', 'e', 'l', 'g', 6, 'g', 'g', 'w', 'e', 'l', 'm', 6, 'g', 'g', 'w', 'e', 'l', 'b', 6, 'g', 'g', 'w', 'e', 'l', 's', 6, 'g', 'g', 'w', 'e', 'l', 't', 6, 'g', 'g', 'w', 'e', 'l', 'p',\n6, 'g', 'g', 'w', 'e', 'l', 'h', 5, 'g', 'g', 'w', 'e', 'm', 5, 'g', 'g', 'w', 'e', 'b', 6, 'g', 'g', 'w', 'e', 'b', 's', 5, 'g', 'g', 'w', 'e', 's', 6, 'g', 'g', 'w', 'e', 's', 's',\n6, 'g', 'g', 'w', 'e', 'n', 'g', 5, 'g', 'g', 'w', 'e', 'j', 5, 'g', 'g', 'w', 'e', 'c', 5, 'g', 'g', 'w', 'e', 'k', 5, 'g', 'g', 'w', 'e', 't', 5, 'g', 'g', 'w', 'e', 'p',\n5, 'g', 'g', 'w', 'e', 'h', 4, 'g', 'g', 'w', 'i', 5, 'g', 'g', 'w', 'i', 'g', 6, 'g', 'g', 'w', 'i', 'g', 'g', 6, 'g', 'g', 'w', 'i', 'g', 's', 5, 'g', 'g', 'w', 'i', 'n',\n6, 'g', 'g', 'w', 'i', 'n', 'j', 6, 'g', 'g', 'w', 'i', 'n', 'h', 5, 'g', 'g', 'w', 'i', 'd', 5, 'g', 'g', 'w', 'i', 'l', 6, 'g', 'g', 'w', 'i', 'l', 'g', 6, 'g', 'g', 'w', 'i', 'l', 'm',\n6, 'g', 'g', 'w', 'i', 'l', 'b', 6, 'g', 'g', 'w', 'i', 'l', 's', 6, 'g', 'g', 'w', 'i', 'l', 't', 6, 'g', 'g', 'w', 'i', 'l', 'p', 6, 'g', 'g', 'w', 'i', 'l', 'h', 5, 'g', 'g', 'w', 'i', 'm',\n5, 'g', 'g', 'w', 'i', 'b', 6, 'g', 'g', 'w', 'i', 'b', 's', 5, 'g', 'g', 'w', 'i', 's', 6, 'g', 'g', 'w', 'i', 's', 's', 6, 'g', 'g', 'w', 'i', 'n', 'g', 5, 'g', 'g', 'w', 'i', 'j',\n5, 'g', 'g', 'w', 'i', 'c', 5, 'g', 'g', 'w', 'i', 'k', 5, 'g', 'g', 'w', 'i', 't', 5, 'g', 'g', 'w', 'i', 'p', 5, 'g', 'g', 'w', 'i', 'h', 4, 'g', 'g', 'y', 'u',\n5, 'g', 'g', 'y', 'u', 'g', 6, 'g', 'g', 'y', 'u', 'g', 'g', 6, 'g', 'g', 'y', 'u', 'g', 's', 5, 'g', 'g', 'y', 'u', 'n', 6, 'g', 'g', 'y', 'u', 'n', 'j', 6, 'g', 'g', 'y', 'u', 'n', 'h',\n5, 'g', 'g', 'y', 'u', 'd', 5, 'g', 'g', 'y', 'u', 'l', 6, 'g', 'g', 'y', 'u', 'l', 'g', 6, 'g', 'g', 'y', 'u', 'l', 'm', 6, 'g', 'g', 'y', 'u', 'l', 'b', 6, 'g', 'g', 'y', 'u', 'l', 's',\n6, 'g', 'g', 'y', 'u', 'l', 't', 6, 'g', 'g', 'y', 'u', 'l', 'p', 6, 'g', 'g', 'y', 'u', 'l', 'h', 5, 'g', 'g', 'y', 'u', 'm', 5, 'g', 'g', 'y', 'u', 'b', 6, 'g', 'g', 'y', 'u', 'b', 's',\n5, 'g', 'g', 'y', 'u', 's', 6, 'g', 'g', 'y', 'u', 's', 's', 6, 'g', 'g', 'y', 'u', 'n', 'g', 5, 'g', 'g', 'y', 'u', 'j', 5, 'g', 'g', 'y', 'u', 'c', 5, 'g', 'g', 'y', 'u', 'k',\n5, 'g', 'g', 'y', 'u', 't', 5, 'g', 'g', 'y', 'u', 'p', 5, 'g', 'g', 'y', 'u', 'h', 4, 'g', 'g', 'e', 'u', 5, 'g', 'g', 'e', 'u', 'g', 6, 'g', 'g', 'e', 'u', 'g', 'g',\n6, 'g', 'g', 'e', 'u', 'g', 's', 5, 'g', 'g', 'e', 'u', 'n', 6, 'g', 'g', 'e', 'u', 'n', 'j', 6, 'g', 'g', 'e', 'u', 'n', 'h', 5, 'g', 'g', 'e', 'u', 'd', 5, 'g', 'g', 'e', 'u', 'l',\n6, 'g', 'g', 'e', 'u', 'l', 'g', 6, 'g', 'g', 'e', 'u', 'l', 'm', 6, 'g', 'g', 'e', 'u', 'l', 'b', 6, 'g', 'g', 'e', 'u', 'l', 's', 6, 'g', 'g', 'e', 'u', 'l', 't', 6, 'g', 'g', 'e', 'u', 'l', 'p',\n6, 'g', 'g', 'e', 'u', 'l', 'h', 5, 'g', 'g', 'e', 'u', 'm', 5, 'g', 'g', 'e', 'u', 'b', 6, 'g', 'g', 'e', 'u', 'b', 's', 5, 'g', 'g', 'e', 'u', 's', 6, 'g', 'g', 'e', 'u', 's', 's',\n6, 'g', 'g', 'e', 'u', 'n', 'g', 5, 'g', 'g', 'e', 'u', 'j', 5, 'g', 'g', 'e', 'u', 'c', 5, 'g', 'g', 'e', 'u', 'k', 5, 'g', 'g', 'e', 'u', 't', 5, 'g', 'g', 'e', 'u', 'p',\n5, 'g', 'g', 'e', 'u', 'h', 4, 'g', 'g', 'y', 'i', 5, 'g', 'g', 'y', 'i', 'g', 6, 'g', 'g', 'y', 'i', 'g', 'g', 6, 'g', 'g', 'y', 'i', 'g', 's', 5, 'g', 'g', 'y', 'i', 'n',\n6, 'g', 'g', 'y', 'i', 'n', 'j', 6, 'g', 'g', 'y', 'i', 'n', 'h', 5, 'g', 'g', 'y', 'i', 'd', 5, 'g', 'g', 'y', 'i', 'l', 6, 'g', 'g', 'y', 'i', 'l', 'g', 6, 'g', 'g', 'y', 'i', 'l', 'm',\n6, 'g', 'g', 'y', 'i', 'l', 'b', 6, 'g', 'g', 'y', 'i', 'l', 's', 6, 'g', 'g', 'y', 'i', 'l', 't', 6, 'g', 'g', 'y', 'i', 'l', 'p', 6, 'g', 'g', 'y', 'i', 'l', 'h', 5, 'g', 'g', 'y', 'i', 'm',\n5, 'g', 'g', 'y', 'i', 'b', 6, 'g', 'g', 'y', 'i', 'b', 's', 5, 'g', 'g', 'y', 'i', 's', 6, 'g', 'g', 'y', 'i', 's', 's', 6, 'g', 'g', 'y', 'i', 'n', 'g', 5, 'g', 'g', 'y', 'i', 'j',\n5, 'g', 'g', 'y', 'i', 'c', 5, 'g', 'g', 'y', 'i', 'k', 5, 'g', 'g', 'y', 'i', 't', 5, 'g', 'g', 'y', 'i', 'p', 5, 'g', 'g', 'y', 'i', 'h', 3, 'g', 'g', 'i',\n4, 'g', 'g', 'i', 'g', 5, 'g', 'g', 'i', 'g', 'g', 5, 'g', 'g', 'i', 'g', 's', 4, 'g', 'g', 'i', 'n', 5, 'g', 'g', 'i', 'n', 'j', 5, 'g', 'g', 'i', 'n', 'h',\n4, 'g', 'g', 'i', 'd', 4, 'g', 'g', 'i', 'l', 5, 'g', 'g', 'i', 'l', 'g', 5, 'g', 'g', 'i', 'l', 'm', 5, 'g', 'g', 'i', 'l', 'b', 5, 'g', 'g', 'i', 'l', 's',\n5, 'g', 'g', 'i', 'l', 't', 5, 'g', 'g', 'i', 'l', 'p', 5, 'g', 'g', 'i', 'l', 'h', 4, 'g', 'g', 'i', 'm', 4, 'g', 'g', 'i', 'b', 5, 'g', 'g', 'i', 'b', 's',\n4, 'g', 'g', 'i', 's', 5, 'g', 'g', 'i', 's', 's', 5, 'g', 'g', 'i', 'n', 'g', 4, 'g', 'g', 'i', 'j', 4, 'g', 'g', 'i', 'c', 4, 'g', 'g', 'i', 'k',\n4, 'g', 'g', 'i', 't', 4, 'g', 'g', 'i', 'p', 4, 'g', 'g', 'i', 'h', 2, 'n', 'a', 3, 'n', 'a', 'g', 4, 'n', 'a', 'g', 'g',\n4, 'n', 'a', 'g', 's', 3, 'n', 'a', 'n', 4, 'n', 'a', 'n', 'j', 4, 'n', 'a', 'n', 'h', 3, 'n', 'a', 'd', 3, 'n', 'a', 'l',\n4, 'n', 'a', 'l', 'g', 4, 'n', 'a', 'l', 'm', 4, 'n', 'a', 'l', 'b', 4, 'n', 'a', 'l', 's', 4, 'n', 'a', 'l', 't', 4, 'n', 'a', 'l', 'p',\n4, 'n', 'a', 'l', 'h', 3, 'n', 'a', 'm', 3, 'n', 'a', 'b', 4, 'n', 'a', 'b', 's', 3, 'n', 'a', 's', 4, 'n', 'a', 's', 's',\n4, 'n', 'a', 'n', 'g', 3, 'n', 'a', 'j', 3, 'n', 'a', 'c', 3, 'n', 'a', 'k', 3, 'n', 'a', 't', 3, 'n', 'a', 'p',\n3, 'n', 'a', 'h', 3, 'n', 'a', 'e', 4, 'n', 'a', 'e', 'g', 5, 'n', 'a', 'e', 'g', 'g', 5, 'n', 'a', 'e', 'g', 's', 4, 'n', 'a', 'e', 'n',\n5, 'n', 'a', 'e', 'n', 'j', 5, 'n', 'a', 'e', 'n', 'h', 4, 'n', 'a', 'e', 'd', 4, 'n', 'a', 'e', 'l', 5, 'n', 'a', 'e', 'l', 'g', 5, 'n', 'a', 'e', 'l', 'm',\n5, 'n', 'a', 'e', 'l', 'b', 5, 'n', 'a', 'e', 'l', 's', 5, 'n', 'a', 'e', 'l', 't', 5, 'n', 'a', 'e', 'l', 'p', 5, 'n', 'a', 'e', 'l', 'h', 4, 'n', 'a', 'e', 'm',\n4, 'n', 'a', 'e', 'b', 5, 'n', 'a', 'e', 'b', 's', 4, 'n', 'a', 'e', 's', 5, 'n', 'a', 'e', 's', 's', 5, 'n', 'a', 'e', 'n', 'g', 4, 'n', 'a', 'e', 'j',\n4, 'n', 'a', 'e', 'c', 4, 'n', 'a', 'e', 'k', 4, 'n', 'a', 'e', 't', 4, 'n', 'a', 'e', 'p', 4, 'n', 'a', 'e', 'h', 3, 'n', 'y', 'a',\n4, 'n', 'y', 'a', 'g', 5, 'n', 'y', 'a', 'g', 'g', 5, 'n', 'y', 'a', 'g', 's', 4, 'n', 'y', 'a', 'n', 5, 'n', 'y', 'a', 'n', 'j', 5, 'n', 'y', 'a', 'n', 'h',\n4, 'n', 'y', 'a', 'd', 4, 'n', 'y', 'a', 'l', 5, 'n', 'y', 'a', 'l', 'g', 5, 'n', 'y', 'a', 'l', 'm', 5, 'n', 'y', 'a', 'l', 'b', 5, 'n', 'y', 'a', 'l', 's',\n5, 'n', 'y', 'a', 'l', 't', 5, 'n', 'y', 'a', 'l', 'p', 5, 'n', 'y', 'a', 'l', 'h', 4, 'n', 'y', 'a', 'm', 4, 'n', 'y', 'a', 'b', 5, 'n', 'y', 'a', 'b', 's',\n4, 'n', 'y', 'a', 's', 5, 'n', 'y', 'a', 's', 's', 5, 'n', 'y', 'a', 'n', 'g', 4, 'n', 'y', 'a', 'j', 4, 'n', 'y', 'a', 'c', 4, 'n', 'y', 'a', 'k',\n4, 'n', 'y', 'a', 't', 4, 'n', 'y', 'a', 'p', 4, 'n', 'y', 'a', 'h', 4, 'n', 'y', 'a', 'e', 5, 'n', 'y', 'a', 'e', 'g', 6, 'n', 'y', 'a', 'e', 'g', 'g',\n6, 'n', 'y', 'a', 'e', 'g', 's', 5, 'n', 'y', 'a', 'e', 'n', 6, 'n', 'y', 'a', 'e', 'n', 'j', 6, 'n', 'y', 'a', 'e', 'n', 'h', 5, 'n', 'y', 'a', 'e', 'd', 5, 'n', 'y', 'a', 'e', 'l',\n6, 'n', 'y', 'a', 'e', 'l', 'g', 6, 'n', 'y', 'a', 'e', 'l', 'm', 6, 'n', 'y', 'a', 'e', 'l', 'b', 6, 'n', 'y', 'a', 'e', 'l', 's', 6, 'n', 'y', 'a', 'e', 'l', 't', 6, 'n', 'y', 'a', 'e', 'l', 'p',\n6, 'n', 'y', 'a', 'e', 'l', 'h', 5, 'n', 'y', 'a', 'e', 'm', 5, 'n', 'y', 'a', 'e', 'b', 6, 'n', 'y', 'a', 'e', 'b', 's', 5, 'n', 'y', 'a', 'e', 's', 6, 'n', 'y', 'a', 'e', 's', 's',\n6, 'n', 'y', 'a', 'e', 'n', 'g', 5, 'n', 'y', 'a', 'e', 'j', 5, 'n', 'y', 'a', 'e', 'c', 5, 'n', 'y', 'a', 'e', 'k', 5, 'n', 'y', 'a', 'e', 't', 5, 'n', 'y', 'a', 'e', 'p',\n5, 'n', 'y', 'a', 'e', 'h', 3, 'n', 'e', 'o', 4, 'n', 'e', 'o', 'g', 5, 'n', 'e', 'o', 'g', 'g', 5, 'n', 'e', 'o', 'g', 's', 4, 'n', 'e', 'o', 'n',\n5, 'n', 'e', 'o', 'n', 'j', 5, 'n', 'e', 'o', 'n', 'h', 4, 'n', 'e', 'o', 'd', 4, 'n', 'e', 'o', 'l', 5, 'n', 'e', 'o', 'l', 'g', 5, 'n', 'e', 'o', 'l', 'm',\n5, 'n', 'e', 'o', 'l', 'b', 5, 'n', 'e', 'o', 'l', 's', 5, 'n', 'e', 'o', 'l', 't', 5, 'n', 'e', 'o', 'l', 'p', 5, 'n', 'e', 'o', 'l', 'h', 4, 'n', 'e', 'o', 'm',\n4, 'n', 'e', 'o', 'b', 5, 'n', 'e', 'o', 'b', 's', 4, 'n', 'e', 'o', 's', 5, 'n', 'e', 'o', 's', 's', 5, 'n', 'e', 'o', 'n', 'g', 4, 'n', 'e', 'o', 'j',\n4, 'n', 'e', 'o', 'c', 4, 'n', 'e', 'o', 'k', 4, 'n', 'e', 'o', 't', 4, 'n', 'e', 'o', 'p', 4, 'n', 'e', 'o', 'h', 2, 'n', 'e',\n3, 'n', 'e', 'g', 4, 'n', 'e', 'g', 'g', 4, 'n', 'e', 'g', 's', 3, 'n', 'e', 'n', 4, 'n', 'e', 'n', 'j', 4, 'n', 'e', 'n', 'h',\n3, 'n', 'e', 'd', 3, 'n', 'e', 'l', 4, 'n', 'e', 'l', 'g', 4, 'n', 'e', 'l', 'm', 4, 'n', 'e', 'l', 'b', 4, 'n', 'e', 'l', 's',\n4, 'n', 'e', 'l', 't', 4, 'n', 'e', 'l', 'p', 4, 'n', 'e', 'l', 'h', 3, 'n', 'e', 'm', 3, 'n', 'e', 'b', 4, 'n', 'e', 'b', 's',\n3, 'n', 'e', 's', 4, 'n', 'e', 's', 's', 4, 'n', 'e', 'n', 'g', 3, 'n', 'e', 'j', 3, 'n', 'e', 'c', 3, 'n', 'e', 'k',\n3, 'n', 'e', 't', 3, 'n', 'e', 'p', 3, 'n', 'e', 'h', 4, 'n', 'y', 'e', 'o', 5, 'n', 'y', 'e', 'o', 'g', 6, 'n', 'y', 'e', 'o', 'g', 'g',\n6, 'n', 'y', 'e', 'o', 'g', 's', 5, 'n', 'y', 'e', 'o', 'n', 6, 'n', 'y', 'e', 'o', 'n', 'j', 6, 'n', 'y', 'e', 'o', 'n', 'h', 5, 'n', 'y', 'e', 'o', 'd', 5, 'n', 'y', 'e', 'o', 'l',\n6, 'n', 'y', 'e', 'o', 'l', 'g', 6, 'n', 'y', 'e', 'o', 'l', 'm', 6, 'n', 'y', 'e', 'o', 'l', 'b', 6, 'n', 'y', 'e', 'o', 'l', 's', 6, 'n', 'y', 'e', 'o', 'l', 't', 6, 'n', 'y', 'e', 'o', 'l', 'p',\n6, 'n', 'y', 'e', 'o', 'l', 'h', 5, 'n', 'y', 'e', 'o', 'm', 5, 'n', 'y', 'e', 'o', 'b', 6, 'n', 'y', 'e', 'o', 'b', 's', 5, 'n', 'y', 'e', 'o', 's', 6, 'n', 'y', 'e', 'o', 's', 's',\n6, 'n', 'y', 'e', 'o', 'n', 'g', 5, 'n', 'y', 'e', 'o', 'j', 5, 'n', 'y', 'e', 'o', 'c', 5, 'n', 'y', 'e', 'o', 'k', 5, 'n', 'y', 'e', 'o', 't', 5, 'n', 'y', 'e', 'o', 'p',\n5, 'n', 'y', 'e', 'o', 'h', 3, 'n', 'y', 'e', 4, 'n', 'y', 'e', 'g', 5, 'n', 'y', 'e', 'g', 'g', 5, 'n', 'y', 'e', 'g', 's', 4, 'n', 'y', 'e', 'n',\n5, 'n', 'y', 'e', 'n', 'j', 5, 'n', 'y', 'e', 'n', 'h', 4, 'n', 'y', 'e', 'd', 4, 'n', 'y', 'e', 'l', 5, 'n', 'y', 'e', 'l', 'g', 5, 'n', 'y', 'e', 'l', 'm',\n5, 'n', 'y', 'e', 'l', 'b', 5, 'n', 'y', 'e', 'l', 's', 5, 'n', 'y', 'e', 'l', 't', 5, 'n', 'y', 'e', 'l', 'p', 5, 'n', 'y', 'e', 'l', 'h', 4, 'n', 'y', 'e', 'm',\n4, 'n', 'y', 'e', 'b', 5, 'n', 'y', 'e', 'b', 's', 4, 'n', 'y', 'e', 's', 5, 'n', 'y', 'e', 's', 's', 5, 'n', 'y', 'e', 'n', 'g', 4, 'n', 'y', 'e', 'j',\n4, 'n', 'y', 'e', 'c', 4, 'n', 'y', 'e', 'k', 4, 'n', 'y', 'e', 't', 4, 'n', 'y', 'e', 'p', 4, 'n', 'y', 'e', 'h', 2, 'n', 'o',\n3, 'n', 'o', 'g', 4, 'n', 'o', 'g', 'g', 4, 'n', 'o', 'g', 's', 3, 'n', 'o', 'n', 4, 'n', 'o', 'n', 'j', 4, 'n', 'o', 'n', 'h',\n3, 'n', 'o', 'd', 3, 'n', 'o', 'l', 4, 'n', 'o', 'l', 'g', 4, 'n', 'o', 'l', 'm', 4, 'n', 'o', 'l', 'b', 4, 'n', 'o', 'l', 's',\n4, 'n', 'o', 'l', 't', 4, 'n', 'o', 'l', 'p', 4, 'n', 'o', 'l', 'h', 3, 'n', 'o', 'm', 3, 'n', 'o', 'b', 4, 'n', 'o', 'b', 's',\n3, 'n', 'o', 's', 4, 'n', 'o', 's', 's', 4, 'n', 'o', 'n', 'g', 3, 'n', 'o', 'j', 3, 'n', 'o', 'c', 3, 'n', 'o', 'k',\n3, 'n', 'o', 't', 3, 'n', 'o', 'p', 3, 'n', 'o', 'h', 3, 'n', 'w', 'a', 4, 'n', 'w', 'a', 'g', 5, 'n', 'w', 'a', 'g', 'g',\n5, 'n', 'w', 'a', 'g', 's', 4, 'n', 'w', 'a', 'n', 5, 'n', 'w', 'a', 'n', 'j', 5, 'n', 'w', 'a', 'n', 'h', 4, 'n', 'w', 'a', 'd', 4, 'n', 'w', 'a', 'l',\n5, 'n', 'w', 'a', 'l', 'g', 5, 'n', 'w', 'a', 'l', 'm', 5, 'n', 'w', 'a', 'l', 'b', 5, 'n', 'w', 'a', 'l', 's', 5, 'n', 'w', 'a', 'l', 't', 5, 'n', 'w', 'a', 'l', 'p',\n5, 'n', 'w', 'a', 'l', 'h', 4, 'n', 'w', 'a', 'm', 4, 'n', 'w', 'a', 'b', 5, 'n', 'w', 'a', 'b', 's', 4, 'n', 'w', 'a', 's', 5, 'n', 'w', 'a', 's', 's',\n5, 'n', 'w', 'a', 'n', 'g', 4, 'n', 'w', 'a', 'j', 4, 'n', 'w', 'a', 'c', 4, 'n', 'w', 'a', 'k', 4, 'n', 'w', 'a', 't', 4, 'n', 'w', 'a', 'p',\n4, 'n', 'w', 'a', 'h', 4, 'n', 'w', 'a', 'e', 5, 'n', 'w', 'a', 'e', 'g', 6, 'n', 'w', 'a', 'e', 'g', 'g', 6, 'n', 'w', 'a', 'e', 'g', 's', 5, 'n', 'w', 'a', 'e', 'n',\n6, 'n', 'w', 'a', 'e', 'n', 'j', 6, 'n', 'w', 'a', 'e', 'n', 'h', 5, 'n', 'w', 'a', 'e', 'd', 5, 'n', 'w', 'a', 'e', 'l', 6, 'n', 'w', 'a', 'e', 'l', 'g', 6, 'n', 'w', 'a', 'e', 'l', 'm',\n6, 'n', 'w', 'a', 'e', 'l', 'b', 6, 'n', 'w', 'a', 'e', 'l', 's', 6, 'n', 'w', 'a', 'e', 'l', 't', 6, 'n', 'w', 'a', 'e', 'l', 'p', 6, 'n', 'w', 'a', 'e', 'l', 'h', 5, 'n', 'w', 'a', 'e', 'm',\n5, 'n', 'w', 'a', 'e', 'b', 6, 'n', 'w', 'a', 'e', 'b', 's', 5, 'n', 'w', 'a', 'e', 's', 6, 'n', 'w', 'a', 'e', 's', 's', 6, 'n', 'w', 'a', 'e', 'n', 'g', 5, 'n', 'w', 'a', 'e', 'j',\n5, 'n', 'w', 'a', 'e', 'c', 5, 'n', 'w', 'a', 'e', 'k', 5, 'n', 'w', 'a', 'e', 't', 5, 'n', 'w', 'a', 'e', 'p', 5, 'n', 'w', 'a', 'e', 'h', 3, 'n', 'o', 'e',\n4, 'n', 'o', 'e', 'g', 5, 'n', 'o', 'e', 'g', 'g', 5, 'n', 'o', 'e', 'g', 's', 4, 'n', 'o', 'e', 'n', 5, 'n', 'o', 'e', 'n', 'j', 5, 'n', 'o', 'e', 'n', 'h',\n4, 'n', 'o', 'e', 'd', 4, 'n', 'o', 'e', 'l', 5, 'n', 'o', 'e', 'l', 'g', 5, 'n', 'o', 'e', 'l', 'm', 5, 'n', 'o', 'e', 'l', 'b', 5, 'n', 'o', 'e', 'l', 's',\n5, 'n', 'o', 'e', 'l', 't', 5, 'n', 'o', 'e', 'l', 'p', 5, 'n', 'o', 'e', 'l', 'h', 4, 'n', 'o', 'e', 'm', 4, 'n', 'o', 'e', 'b', 5, 'n', 'o', 'e', 'b', 's',\n4, 'n', 'o', 'e', 's', 5, 'n', 'o', 'e', 's', 's', 5, 'n', 'o', 'e', 'n', 'g', 4, 'n', 'o', 'e', 'j', 4, 'n', 'o', 'e', 'c', 4, 'n', 'o', 'e', 'k',\n4, 'n', 'o', 'e', 't', 4, 'n', 'o', 'e', 'p', 4, 'n', 'o', 'e', 'h', 3, 'n', 'y', 'o', 4, 'n', 'y', 'o', 'g', 5, 'n', 'y', 'o', 'g', 'g',\n5, 'n', 'y', 'o', 'g', 's', 4, 'n', 'y', 'o', 'n', 5, 'n', 'y', 'o', 'n', 'j', 5, 'n', 'y', 'o', 'n', 'h', 4, 'n', 'y', 'o', 'd', 4, 'n', 'y', 'o', 'l',\n5, 'n', 'y', 'o', 'l', 'g', 5, 'n', 'y', 'o', 'l', 'm', 5, 'n', 'y', 'o', 'l', 'b', 5, 'n', 'y', 'o', 'l', 's', 5, 'n', 'y', 'o', 'l', 't', 5, 'n', 'y', 'o', 'l', 'p',\n5, 'n', 'y', 'o', 'l', 'h', 4, 'n', 'y', 'o', 'm', 4, 'n', 'y', 'o', 'b', 5, 'n', 'y', 'o', 'b', 's', 4, 'n', 'y', 'o', 's', 5, 'n', 'y', 'o', 's', 's',\n5, 'n', 'y', 'o', 'n', 'g', 4, 'n', 'y', 'o', 'j', 4, 'n', 'y', 'o', 'c', 4, 'n', 'y', 'o', 'k', 4, 'n', 'y', 'o', 't', 4, 'n', 'y', 'o', 'p',\n4, 'n', 'y', 'o', 'h', 2, 'n', 'u', 3, 'n', 'u', 'g', 4, 'n', 'u', 'g', 'g', 4, 'n', 'u', 'g', 's', 3, 'n', 'u', 'n',\n4, 'n', 'u', 'n', 'j', 4, 'n', 'u', 'n', 'h', 3, 'n', 'u', 'd', 3, 'n', 'u', 'l', 4, 'n', 'u', 'l', 'g', 4, 'n', 'u', 'l', 'm',\n4, 'n', 'u', 'l', 'b', 4, 'n', 'u', 'l', 's', 4, 'n', 'u', 'l', 't', 4, 'n', 'u', 'l', 'p', 4, 'n', 'u', 'l', 'h', 3, 'n', 'u', 'm',\n3, 'n', 'u', 'b', 4, 'n', 'u', 'b', 's', 3, 'n', 'u', 's', 4, 'n', 'u', 's', 's', 4, 'n', 'u', 'n', 'g', 3, 'n', 'u', 'j',\n3, 'n', 'u', 'c', 3, 'n', 'u', 'k', 3, 'n', 'u', 't', 3, 'n', 'u', 'p', 3, 'n', 'u', 'h', 4, 'n', 'w', 'e', 'o',\n5, 'n', 'w', 'e', 'o', 'g', 6, 'n', 'w', 'e', 'o', 'g', 'g', 6, 'n', 'w', 'e', 'o', 'g', 's', 5, 'n', 'w', 'e', 'o', 'n', 6, 'n', 'w', 'e', 'o', 'n', 'j', 6, 'n', 'w', 'e', 'o', 'n', 'h',\n5, 'n', 'w', 'e', 'o', 'd', 5, 'n', 'w', 'e', 'o', 'l', 6, 'n', 'w', 'e', 'o', 'l', 'g', 6, 'n', 'w', 'e', 'o', 'l', 'm', 6, 'n', 'w', 'e', 'o', 'l', 'b', 6, 'n', 'w', 'e', 'o', 'l', 's',\n6, 'n', 'w', 'e', 'o', 'l', 't', 6, 'n', 'w', 'e', 'o', 'l', 'p', 6, 'n', 'w', 'e', 'o', 'l', 'h', 5, 'n', 'w', 'e', 'o', 'm', 5, 'n', 'w', 'e', 'o', 'b', 6, 'n', 'w', 'e', 'o', 'b', 's',\n5, 'n', 'w', 'e', 'o', 's', 6, 'n', 'w', 'e', 'o', 's', 's', 6, 'n', 'w', 'e', 'o', 'n', 'g', 5, 'n', 'w', 'e', 'o', 'j', 5, 'n', 'w', 'e', 'o', 'c', 5, 'n', 'w', 'e', 'o', 'k',\n5, 'n', 'w', 'e', 'o', 't', 5, 'n', 'w', 'e', 'o', 'p', 5, 'n', 'w', 'e', 'o', 'h', 3, 'n', 'w', 'e', 4, 'n', 'w', 'e', 'g', 5, 'n', 'w', 'e', 'g', 'g',\n5, 'n', 'w', 'e', 'g', 's', 4, 'n', 'w', 'e', 'n', 5, 'n', 'w', 'e', 'n', 'j', 5, 'n', 'w', 'e', 'n', 'h', 4, 'n', 'w', 'e', 'd', 4, 'n', 'w', 'e', 'l',\n5, 'n', 'w', 'e', 'l', 'g', 5, 'n', 'w', 'e', 'l', 'm', 5, 'n', 'w', 'e', 'l', 'b', 5, 'n', 'w', 'e', 'l', 's', 5, 'n', 'w', 'e', 'l', 't', 5, 'n', 'w', 'e', 'l', 'p',\n5, 'n', 'w', 'e', 'l', 'h', 4, 'n', 'w', 'e', 'm', 4, 'n', 'w', 'e', 'b', 5, 'n', 'w', 'e', 'b', 's', 4, 'n', 'w', 'e', 's', 5, 'n', 'w', 'e', 's', 's',\n5, 'n', 'w', 'e', 'n', 'g', 4, 'n', 'w', 'e', 'j', 4, 'n', 'w', 'e', 'c', 4, 'n', 'w', 'e', 'k', 4, 'n', 'w', 'e', 't', 4, 'n', 'w', 'e', 'p',\n4, 'n', 'w', 'e', 'h', 3, 'n', 'w', 'i', 4, 'n', 'w', 'i', 'g', 5, 'n', 'w', 'i', 'g', 'g', 5, 'n', 'w', 'i', 'g', 's', 4, 'n', 'w', 'i', 'n',\n5, 'n', 'w', 'i', 'n', 'j', 5, 'n', 'w', 'i', 'n', 'h', 4, 'n', 'w', 'i', 'd', 4, 'n', 'w', 'i', 'l', 5, 'n', 'w', 'i', 'l', 'g', 5, 'n', 'w', 'i', 'l', 'm',\n5, 'n', 'w', 'i', 'l', 'b', 5, 'n', 'w', 'i', 'l', 's', 5, 'n', 'w', 'i', 'l', 't', 5, 'n', 'w', 'i', 'l', 'p', 5, 'n', 'w', 'i', 'l', 'h', 4, 'n', 'w', 'i', 'm',\n4, 'n', 'w', 'i', 'b', 5, 'n', 'w', 'i', 'b', 's', 4, 'n', 'w', 'i', 's', 5, 'n', 'w', 'i', 's', 's', 5, 'n', 'w', 'i', 'n', 'g', 4, 'n', 'w', 'i', 'j',\n4, 'n', 'w', 'i', 'c', 4, 'n', 'w', 'i', 'k', 4, 'n', 'w', 'i', 't', 4, 'n', 'w', 'i', 'p', 4, 'n', 'w', 'i', 'h', 3, 'n', 'y', 'u',\n4, 'n', 'y', 'u', 'g', 5, 'n', 'y', 'u', 'g', 'g', 5, 'n', 'y', 'u', 'g', 's', 4, 'n', 'y', 'u', 'n', 5, 'n', 'y', 'u', 'n', 'j', 5, 'n', 'y', 'u', 'n', 'h',\n4, 'n', 'y', 'u', 'd', 4, 'n', 'y', 'u', 'l', 5, 'n', 'y', 'u', 'l', 'g', 5, 'n', 'y', 'u', 'l', 'm', 5, 'n', 'y', 'u', 'l', 'b', 5, 'n', 'y', 'u', 'l', 's',\n5, 'n', 'y', 'u', 'l', 't', 5, 'n', 'y', 'u', 'l', 'p', 5, 'n', 'y', 'u', 'l', 'h', 4, 'n', 'y', 'u', 'm', 4, 'n', 'y', 'u', 'b', 5, 'n', 'y', 'u', 'b', 's',\n4, 'n', 'y', 'u', 's', 5, 'n', 'y', 'u', 's', 's', 5, 'n', 'y', 'u', 'n', 'g', 4, 'n', 'y', 'u', 'j', 4, 'n', 'y', 'u', 'c', 4, 'n', 'y', 'u', 'k',\n4, 'n', 'y', 'u', 't', 4, 'n', 'y', 'u', 'p', 4, 'n', 'y', 'u', 'h', 3, 'n', 'e', 'u', 4, 'n', 'e', 'u', 'g', 5, 'n', 'e', 'u', 'g', 'g',\n5, 'n', 'e', 'u', 'g', 's', 4, 'n', 'e', 'u', 'n', 5, 'n', 'e', 'u', 'n', 'j', 5, 'n', 'e', 'u', 'n', 'h', 4, 'n', 'e', 'u', 'd', 4, 'n', 'e', 'u', 'l',\n5, 'n', 'e', 'u', 'l', 'g', 5, 'n', 'e', 'u', 'l', 'm', 5, 'n', 'e', 'u', 'l', 'b', 5, 'n', 'e', 'u', 'l', 's', 5, 'n', 'e', 'u', 'l', 't', 5, 'n', 'e', 'u', 'l', 'p',\n5, 'n', 'e', 'u', 'l', 'h', 4, 'n', 'e', 'u', 'm', 4, 'n', 'e', 'u', 'b', 5, 'n', 'e', 'u', 'b', 's', 4, 'n', 'e', 'u', 's', 5, 'n', 'e', 'u', 's', 's',\n5, 'n', 'e', 'u', 'n', 'g', 4, 'n', 'e', 'u', 'j', 4, 'n', 'e', 'u', 'c', 4, 'n', 'e', 'u', 'k', 4, 'n', 'e', 'u', 't', 4, 'n', 'e', 'u', 'p',\n4, 'n', 'e', 'u', 'h', 3, 'n', 'y', 'i', 4, 'n', 'y', 'i', 'g', 5, 'n', 'y', 'i', 'g', 'g', 5, 'n', 'y', 'i', 'g', 's', 4, 'n', 'y', 'i', 'n',\n5, 'n', 'y', 'i', 'n', 'j', 5, 'n', 'y', 'i', 'n', 'h', 4, 'n', 'y', 'i', 'd', 4, 'n', 'y', 'i', 'l', 5, 'n', 'y', 'i', 'l', 'g', 5, 'n', 'y', 'i', 'l', 'm',\n5, 'n', 'y', 'i', 'l', 'b', 5, 'n', 'y', 'i', 'l', 's', 5, 'n', 'y', 'i', 'l', 't', 5, 'n', 'y', 'i', 'l', 'p', 5, 'n', 'y', 'i', 'l', 'h', 4, 'n', 'y', 'i', 'm',\n4, 'n', 'y', 'i', 'b', 5, 'n', 'y', 'i', 'b', 's', 4, 'n', 'y', 'i', 's', 5, 'n', 'y', 'i', 's', 's', 5, 'n', 'y', 'i', 'n', 'g', 4, 'n', 'y', 'i', 'j',\n4, 'n', 'y', 'i', 'c', 4, 'n', 'y', 'i', 'k', 4, 'n', 'y', 'i', 't', 4, 'n', 'y', 'i', 'p', 4, 'n', 'y', 'i', 'h', 2, 'n', 'i',\n3, 'n', 'i', 'g', 4, 'n', 'i', 'g', 'g', 4, 'n', 'i', 'g', 's', 3, 'n', 'i', 'n', 4, 'n', 'i', 'n', 'j', 4, 'n', 'i', 'n', 'h',\n3, 'n', 'i', 'd', 3, 'n', 'i', 'l', 4, 'n', 'i', 'l', 'g', 4, 'n', 'i', 'l', 'm', 4, 'n', 'i', 'l', 'b', 4, 'n', 'i', 'l', 's',\n4, 'n', 'i', 'l', 't', 4, 'n', 'i', 'l', 'p', 4, 'n', 'i', 'l', 'h', 3, 'n', 'i', 'm', 3, 'n', 'i', 'b', 4, 'n', 'i', 'b', 's',\n3, 'n', 'i', 's', 4, 'n', 'i', 's', 's', 4, 'n', 'i', 'n', 'g', 3, 'n', 'i', 'j', 3, 'n', 'i', 'c', 3, 'n', 'i', 'k',\n3, 'n', 'i', 't', 3, 'n', 'i', 'p', 3, 'n', 'i', 'h', 2, 'd', 'a', 3, 'd', 'a', 'g', 4, 'd', 'a', 'g', 'g',\n4, 'd', 'a', 'g', 's', 3, 'd', 'a', 'n', 4, 'd', 'a', 'n', 'j', 4, 'd', 'a', 'n', 'h', 3, 'd', 'a', 'd', 3, 'd', 'a', 'l',\n4, 'd', 'a', 'l', 'g', 4, 'd', 'a', 'l', 'm', 4, 'd', 'a', 'l', 'b', 4, 'd', 'a', 'l', 's', 4, 'd', 'a', 'l', 't', 4, 'd', 'a', 'l', 'p',\n4, 'd', 'a', 'l', 'h', 3, 'd', 'a', 'm', 3, 'd', 'a', 'b', 4, 'd', 'a', 'b', 's', 3, 'd', 'a', 's', 4, 'd', 'a', 's', 's',\n4, 'd', 'a', 'n', 'g', 3, 'd', 'a', 'j', 3, 'd', 'a', 'c', 3, 'd', 'a', 'k', 3, 'd', 'a', 't', 3, 'd', 'a', 'p',\n3, 'd', 'a', 'h', 3, 'd', 'a', 'e', 4, 'd', 'a', 'e', 'g', 5, 'd', 'a', 'e', 'g', 'g', 5, 'd', 'a', 'e', 'g', 's', 4, 'd', 'a', 'e', 'n',\n5, 'd', 'a', 'e', 'n', 'j', 5, 'd', 'a', 'e', 'n', 'h', 4, 'd', 'a', 'e', 'd', 4, 'd', 'a', 'e', 'l', 5, 'd', 'a', 'e', 'l', 'g', 5, 'd', 'a', 'e', 'l', 'm',\n5, 'd', 'a', 'e', 'l', 'b', 5, 'd', 'a', 'e', 'l', 's', 5, 'd', 'a', 'e', 'l', 't', 5, 'd', 'a', 'e', 'l', 'p', 5, 'd', 'a', 'e', 'l', 'h', 4, 'd', 'a', 'e', 'm',\n4, 'd', 'a', 'e', 'b', 5, 'd', 'a', 'e', 'b', 's', 4, 'd', 'a', 'e', 's', 5, 'd', 'a', 'e', 's', 's', 5, 'd', 'a', 'e', 'n', 'g', 4, 'd', 'a', 'e', 'j',\n4, 'd', 'a', 'e', 'c', 4, 'd', 'a', 'e', 'k', 4, 'd', 'a', 'e', 't', 4, 'd', 'a', 'e', 'p', 4, 'd', 'a', 'e', 'h', 3, 'd', 'y', 'a',\n4, 'd', 'y', 'a', 'g', 5, 'd', 'y', 'a', 'g', 'g', 5, 'd', 'y', 'a', 'g', 's', 4, 'd', 'y', 'a', 'n', 5, 'd', 'y', 'a', 'n', 'j', 5, 'd', 'y', 'a', 'n', 'h',\n4, 'd', 'y', 'a', 'd', 4, 'd', 'y', 'a', 'l', 5, 'd', 'y', 'a', 'l', 'g', 5, 'd', 'y', 'a', 'l', 'm', 5, 'd', 'y', 'a', 'l', 'b', 5, 'd', 'y', 'a', 'l', 's',\n5, 'd', 'y', 'a', 'l', 't', 5, 'd', 'y', 'a', 'l', 'p', 5, 'd', 'y', 'a', 'l', 'h', 4, 'd', 'y', 'a', 'm', 4, 'd', 'y', 'a', 'b', 5, 'd', 'y', 'a', 'b', 's',\n4, 'd', 'y', 'a', 's', 5, 'd', 'y', 'a', 's', 's', 5, 'd', 'y', 'a', 'n', 'g', 4, 'd', 'y', 'a', 'j', 4, 'd', 'y', 'a', 'c', 4, 'd', 'y', 'a', 'k',\n4, 'd', 'y', 'a', 't', 4, 'd', 'y', 'a', 'p', 4, 'd', 'y', 'a', 'h', 4, 'd', 'y', 'a', 'e', 5, 'd', 'y', 'a', 'e', 'g', 6, 'd', 'y', 'a', 'e', 'g', 'g',\n6, 'd', 'y', 'a', 'e', 'g', 's', 5, 'd', 'y', 'a', 'e', 'n', 6, 'd', 'y', 'a', 'e', 'n', 'j', 6, 'd', 'y', 'a', 'e', 'n', 'h', 5, 'd', 'y', 'a', 'e', 'd', 5, 'd', 'y', 'a', 'e', 'l',\n6, 'd', 'y', 'a', 'e', 'l', 'g', 6, 'd', 'y', 'a', 'e', 'l', 'm', 6, 'd', 'y', 'a', 'e', 'l', 'b', 6, 'd', 'y', 'a', 'e', 'l', 's', 6, 'd', 'y', 'a', 'e', 'l', 't', 6, 'd', 'y', 'a', 'e', 'l', 'p',\n6, 'd', 'y', 'a', 'e', 'l', 'h', 5, 'd', 'y', 'a', 'e', 'm', 5, 'd', 'y', 'a', 'e', 'b', 6, 'd', 'y', 'a', 'e', 'b', 's', 5, 'd', 'y', 'a', 'e', 's', 6, 'd', 'y', 'a', 'e', 's', 's',\n6, 'd', 'y', 'a', 'e', 'n', 'g', 5, 'd', 'y', 'a', 'e', 'j', 5, 'd', 'y', 'a', 'e', 'c', 5, 'd', 'y', 'a', 'e', 'k', 5, 'd', 'y', 'a', 'e', 't', 5, 'd', 'y', 'a', 'e', 'p',\n5, 'd', 'y', 'a', 'e', 'h', 3, 'd', 'e', 'o', 4, 'd', 'e', 'o', 'g', 5, 'd', 'e', 'o', 'g', 'g', 5, 'd', 'e', 'o', 'g', 's', 4, 'd', 'e', 'o', 'n',\n5, 'd', 'e', 'o', 'n', 'j', 5, 'd', 'e', 'o', 'n', 'h', 4, 'd', 'e', 'o', 'd', 4, 'd', 'e', 'o', 'l', 5, 'd', 'e', 'o', 'l', 'g', 5, 'd', 'e', 'o', 'l', 'm',\n5, 'd', 'e', 'o', 'l', 'b', 5, 'd', 'e', 'o', 'l', 's', 5, 'd', 'e', 'o', 'l', 't', 5, 'd', 'e', 'o', 'l', 'p', 5, 'd', 'e', 'o', 'l', 'h', 4, 'd', 'e', 'o', 'm',\n4, 'd', 'e', 'o', 'b', 5, 'd', 'e', 'o', 'b', 's', 4, 'd', 'e', 'o', 's', 5, 'd', 'e', 'o', 's', 's', 5, 'd', 'e', 'o', 'n', 'g', 4, 'd', 'e', 'o', 'j',\n4, 'd', 'e', 'o', 'c', 4, 'd', 'e', 'o', 'k', 4, 'd', 'e', 'o', 't', 4, 'd', 'e', 'o', 'p', 4, 'd', 'e', 'o', 'h', 2, 'd', 'e',\n3, 'd', 'e', 'g', 4, 'd', 'e', 'g', 'g', 4, 'd', 'e', 'g', 's', 3, 'd', 'e', 'n', 4, 'd', 'e', 'n', 'j', 4, 'd', 'e', 'n', 'h',\n3, 'd', 'e', 'd', 3, 'd', 'e', 'l', 4, 'd', 'e', 'l', 'g', 4, 'd', 'e', 'l', 'm', 4, 'd', 'e', 'l', 'b', 4, 'd', 'e', 'l', 's',\n4, 'd', 'e', 'l', 't', 4, 'd', 'e', 'l', 'p', 4, 'd', 'e', 'l', 'h', 3, 'd', 'e', 'm', 3, 'd', 'e', 'b', 4, 'd', 'e', 'b', 's',\n3, 'd', 'e', 's', 4, 'd', 'e', 's', 's', 4, 'd', 'e', 'n', 'g', 3, 'd', 'e', 'j', 3, 'd', 'e', 'c', 3, 'd', 'e', 'k',\n3, 'd', 'e', 't', 3, 'd', 'e', 'p', 3, 'd', 'e', 'h', 4, 'd', 'y', 'e', 'o', 5, 'd', 'y', 'e', 'o', 'g', 6, 'd', 'y', 'e', 'o', 'g', 'g',\n6, 'd', 'y', 'e', 'o', 'g', 's', 5, 'd', 'y', 'e', 'o', 'n', 6, 'd', 'y', 'e', 'o', 'n', 'j', 6, 'd', 'y', 'e', 'o', 'n', 'h', 5, 'd', 'y', 'e', 'o', 'd', 5, 'd', 'y', 'e', 'o', 'l',\n6, 'd', 'y', 'e', 'o', 'l', 'g', 6, 'd', 'y', 'e', 'o', 'l', 'm', 6, 'd', 'y', 'e', 'o', 'l', 'b', 6, 'd', 'y', 'e', 'o', 'l', 's', 6, 'd', 'y', 'e', 'o', 'l', 't', 6, 'd', 'y', 'e', 'o', 'l', 'p',\n6, 'd', 'y', 'e', 'o', 'l', 'h', 5, 'd', 'y', 'e', 'o', 'm', 5, 'd', 'y', 'e', 'o', 'b', 6, 'd', 'y', 'e', 'o', 'b', 's', 5, 'd', 'y', 'e', 'o', 's', 6, 'd', 'y', 'e', 'o', 's', 's',\n6, 'd', 'y', 'e', 'o', 'n', 'g', 5, 'd', 'y', 'e', 'o', 'j', 5, 'd', 'y', 'e', 'o', 'c', 5, 'd', 'y', 'e', 'o', 'k', 5, 'd', 'y', 'e', 'o', 't', 5, 'd', 'y', 'e', 'o', 'p',\n5, 'd', 'y', 'e', 'o', 'h', 3, 'd', 'y', 'e', 4, 'd', 'y', 'e', 'g', 5, 'd', 'y', 'e', 'g', 'g', 5, 'd', 'y', 'e', 'g', 's', 4, 'd', 'y', 'e', 'n',\n5, 'd', 'y', 'e', 'n', 'j', 5, 'd', 'y', 'e', 'n', 'h', 4, 'd', 'y', 'e', 'd', 4, 'd', 'y', 'e', 'l', 5, 'd', 'y', 'e', 'l', 'g', 5, 'd', 'y', 'e', 'l', 'm',\n5, 'd', 'y', 'e', 'l', 'b', 5, 'd', 'y', 'e', 'l', 's', 5, 'd', 'y', 'e', 'l', 't', 5, 'd', 'y', 'e', 'l', 'p', 5, 'd', 'y', 'e', 'l', 'h', 4, 'd', 'y', 'e', 'm',\n4, 'd', 'y', 'e', 'b', 5, 'd', 'y', 'e', 'b', 's', 4, 'd', 'y', 'e', 's', 5, 'd', 'y', 'e', 's', 's', 5, 'd', 'y', 'e', 'n', 'g', 4, 'd', 'y', 'e', 'j',\n4, 'd', 'y', 'e', 'c', 4, 'd', 'y', 'e', 'k', 4, 'd', 'y', 'e', 't', 4, 'd', 'y', 'e', 'p', 4, 'd', 'y', 'e', 'h', 2, 'd', 'o',\n3, 'd', 'o', 'g', 4, 'd', 'o', 'g', 'g', 4, 'd', 'o', 'g', 's', 3, 'd', 'o', 'n', 4, 'd', 'o', 'n', 'j', 4, 'd', 'o', 'n', 'h',\n3, 'd', 'o', 'd', 3, 'd', 'o', 'l', 4, 'd', 'o', 'l', 'g', 4, 'd', 'o', 'l', 'm', 4, 'd', 'o', 'l', 'b', 4, 'd', 'o', 'l', 's',\n4, 'd', 'o', 'l', 't', 4, 'd', 'o', 'l', 'p', 4, 'd', 'o', 'l', 'h', 3, 'd', 'o', 'm', 3, 'd', 'o', 'b', 4, 'd', 'o', 'b', 's',\n3, 'd', 'o', 's', 4, 'd', 'o', 's', 's', 4, 'd', 'o', 'n', 'g', 3, 'd', 'o', 'j', 3, 'd', 'o', 'c', 3, 'd', 'o', 'k',\n3, 'd', 'o', 't', 3, 'd', 'o', 'p', 3, 'd', 'o', 'h', 3, 'd', 'w', 'a', 4, 'd', 'w', 'a', 'g', 5, 'd', 'w', 'a', 'g', 'g',\n5, 'd', 'w', 'a', 'g', 's', 4, 'd', 'w', 'a', 'n', 5, 'd', 'w', 'a', 'n', 'j', 5, 'd', 'w', 'a', 'n', 'h', 4, 'd', 'w', 'a', 'd', 4, 'd', 'w', 'a', 'l',\n5, 'd', 'w', 'a', 'l', 'g', 5, 'd', 'w', 'a', 'l', 'm', 5, 'd', 'w', 'a', 'l', 'b', 5, 'd', 'w', 'a', 'l', 's', 5, 'd', 'w', 'a', 'l', 't', 5, 'd', 'w', 'a', 'l', 'p',\n5, 'd', 'w', 'a', 'l', 'h', 4, 'd', 'w', 'a', 'm', 4, 'd', 'w', 'a', 'b', 5, 'd', 'w', 'a', 'b', 's', 4, 'd', 'w', 'a', 's', 5, 'd', 'w', 'a', 's', 's',\n5, 'd', 'w', 'a', 'n', 'g', 4, 'd', 'w', 'a', 'j', 4, 'd', 'w', 'a', 'c', 4, 'd', 'w', 'a', 'k', 4, 'd', 'w', 'a', 't', 4, 'd', 'w', 'a', 'p',\n4, 'd', 'w', 'a', 'h', 4, 'd', 'w', 'a', 'e', 5, 'd', 'w', 'a', 'e', 'g', 6, 'd', 'w', 'a', 'e', 'g', 'g', 6, 'd', 'w', 'a', 'e', 'g', 's', 5, 'd', 'w', 'a', 'e', 'n',\n6, 'd', 'w', 'a', 'e', 'n', 'j', 6, 'd', 'w', 'a', 'e', 'n', 'h', 5, 'd', 'w', 'a', 'e', 'd', 5, 'd', 'w', 'a', 'e', 'l', 6, 'd', 'w', 'a', 'e', 'l', 'g', 6, 'd', 'w', 'a', 'e', 'l', 'm',\n6, 'd', 'w', 'a', 'e', 'l', 'b', 6, 'd', 'w', 'a', 'e', 'l', 's', 6, 'd', 'w', 'a', 'e', 'l', 't', 6, 'd', 'w', 'a', 'e', 'l', 'p', 6, 'd', 'w', 'a', 'e', 'l', 'h', 5, 'd', 'w', 'a', 'e', 'm',\n5, 'd', 'w', 'a', 'e', 'b', 6, 'd', 'w', 'a', 'e', 'b', 's', 5, 'd', 'w', 'a', 'e', 's', 6, 'd', 'w', 'a', 'e', 's', 's', 6, 'd', 'w', 'a', 'e', 'n', 'g', 5, 'd', 'w', 'a', 'e', 'j',\n5, 'd', 'w', 'a', 'e', 'c', 5, 'd', 'w', 'a', 'e', 'k', 5, 'd', 'w', 'a', 'e', 't', 5, 'd', 'w', 'a', 'e', 'p', 5, 'd', 'w', 'a', 'e', 'h', 3, 'd', 'o', 'e',\n4, 'd', 'o', 'e', 'g', 5, 'd', 'o', 'e', 'g', 'g', 5, 'd', 'o', 'e', 'g', 's', 4, 'd', 'o', 'e', 'n', 5, 'd', 'o', 'e', 'n', 'j', 5, 'd', 'o', 'e', 'n', 'h',\n4, 'd', 'o', 'e', 'd', 4, 'd', 'o', 'e', 'l', 5, 'd', 'o', 'e', 'l', 'g', 5, 'd', 'o', 'e', 'l', 'm', 5, 'd', 'o', 'e', 'l', 'b', 5, 'd', 'o', 'e', 'l', 's',\n5, 'd', 'o', 'e', 'l', 't', 5, 'd', 'o', 'e', 'l', 'p', 5, 'd', 'o', 'e', 'l', 'h', 4, 'd', 'o', 'e', 'm', 4, 'd', 'o', 'e', 'b', 5, 'd', 'o', 'e', 'b', 's',\n4, 'd', 'o', 'e', 's', 5, 'd', 'o', 'e', 's', 's', 5, 'd', 'o', 'e', 'n', 'g', 4, 'd', 'o', 'e', 'j', 4, 'd', 'o', 'e', 'c', 4, 'd', 'o', 'e', 'k',\n4, 'd', 'o', 'e', 't', 4, 'd', 'o', 'e', 'p', 4, 'd', 'o', 'e', 'h', 3, 'd', 'y', 'o', 4, 'd', 'y', 'o', 'g', 5, 'd', 'y', 'o', 'g', 'g',\n5, 'd', 'y', 'o', 'g', 's', 4, 'd', 'y', 'o', 'n', 5, 'd', 'y', 'o', 'n', 'j', 5, 'd', 'y', 'o', 'n', 'h', 4, 'd', 'y', 'o', 'd', 4, 'd', 'y', 'o', 'l',\n5, 'd', 'y', 'o', 'l', 'g', 5, 'd', 'y', 'o', 'l', 'm', 5, 'd', 'y', 'o', 'l', 'b', 5, 'd', 'y', 'o', 'l', 's', 5, 'd', 'y', 'o', 'l', 't', 5, 'd', 'y', 'o', 'l', 'p',\n5, 'd', 'y', 'o', 'l', 'h', 4, 'd', 'y', 'o', 'm', 4, 'd', 'y', 'o', 'b', 5, 'd', 'y', 'o', 'b', 's', 4, 'd', 'y', 'o', 's', 5, 'd', 'y', 'o', 's', 's',\n5, 'd', 'y', 'o', 'n', 'g', 4, 'd', 'y', 'o', 'j', 4, 'd', 'y', 'o', 'c', 4, 'd', 'y', 'o', 'k', 4, 'd', 'y', 'o', 't', 4, 'd', 'y', 'o', 'p',\n4, 'd', 'y', 'o', 'h', 2, 'd', 'u', 3, 'd', 'u', 'g', 4, 'd', 'u', 'g', 'g', 4, 'd', 'u', 'g', 's', 3, 'd', 'u', 'n',\n4, 'd', 'u', 'n', 'j', 4, 'd', 'u', 'n', 'h', 3, 'd', 'u', 'd', 3, 'd', 'u', 'l', 4, 'd', 'u', 'l', 'g', 4, 'd', 'u', 'l', 'm',\n4, 'd', 'u', 'l', 'b', 4, 'd', 'u', 'l', 's', 4, 'd', 'u', 'l', 't', 4, 'd', 'u', 'l', 'p', 4, 'd', 'u', 'l', 'h', 3, 'd', 'u', 'm',\n3, 'd', 'u', 'b', 4, 'd', 'u', 'b', 's', 3, 'd', 'u', 's', 4, 'd', 'u', 's', 's', 4, 'd', 'u', 'n', 'g', 3, 'd', 'u', 'j',\n3, 'd', 'u', 'c', 3, 'd', 'u', 'k', 3, 'd', 'u', 't', 3, 'd', 'u', 'p', 3, 'd', 'u', 'h', 4, 'd', 'w', 'e', 'o',\n5, 'd', 'w', 'e', 'o', 'g', 6, 'd', 'w', 'e', 'o', 'g', 'g', 6, 'd', 'w', 'e', 'o', 'g', 's', 5, 'd', 'w', 'e', 'o', 'n', 6, 'd', 'w', 'e', 'o', 'n', 'j', 6, 'd', 'w', 'e', 'o', 'n', 'h',\n5, 'd', 'w', 'e', 'o', 'd', 5, 'd', 'w', 'e', 'o', 'l', 6, 'd', 'w', 'e', 'o', 'l', 'g', 6, 'd', 'w', 'e', 'o', 'l', 'm', 6, 'd', 'w', 'e', 'o', 'l', 'b', 6, 'd', 'w', 'e', 'o', 'l', 's',\n6, 'd', 'w', 'e', 'o', 'l', 't', 6, 'd', 'w', 'e', 'o', 'l', 'p', 6, 'd', 'w', 'e', 'o', 'l', 'h', 5, 'd', 'w', 'e', 'o', 'm', 5, 'd', 'w', 'e', 'o', 'b', 6, 'd', 'w', 'e', 'o', 'b', 's',\n5, 'd', 'w', 'e', 'o', 's', 6, 'd', 'w', 'e', 'o', 's', 's', 6, 'd', 'w', 'e', 'o', 'n', 'g', 5, 'd', 'w', 'e', 'o', 'j', 5, 'd', 'w', 'e', 'o', 'c', 5, 'd', 'w', 'e', 'o', 'k',\n5, 'd', 'w', 'e', 'o', 't', 5, 'd', 'w', 'e', 'o', 'p', 5, 'd', 'w', 'e', 'o', 'h', 3, 'd', 'w', 'e', 4, 'd', 'w', 'e', 'g', 5, 'd', 'w', 'e', 'g', 'g',\n5, 'd', 'w', 'e', 'g', 's', 4, 'd', 'w', 'e', 'n', 5, 'd', 'w', 'e', 'n', 'j', 5, 'd', 'w', 'e', 'n', 'h', 4, 'd', 'w', 'e', 'd', 4, 'd', 'w', 'e', 'l',\n5, 'd', 'w', 'e', 'l', 'g', 5, 'd', 'w', 'e', 'l', 'm', 5, 'd', 'w', 'e', 'l', 'b', 5, 'd', 'w', 'e', 'l', 's', 5, 'd', 'w', 'e', 'l', 't', 5, 'd', 'w', 'e', 'l', 'p',\n5, 'd', 'w', 'e', 'l', 'h', 4, 'd', 'w', 'e', 'm', 4, 'd', 'w', 'e', 'b', 5, 'd', 'w', 'e', 'b', 's', 4, 'd', 'w', 'e', 's', 5, 'd', 'w', 'e', 's', 's',\n5, 'd', 'w', 'e', 'n', 'g', 4, 'd', 'w', 'e', 'j', 4, 'd', 'w', 'e', 'c', 4, 'd', 'w', 'e', 'k', 4, 'd', 'w', 'e', 't', 4, 'd', 'w', 'e', 'p',\n4, 'd', 'w', 'e', 'h', 3, 'd', 'w', 'i', 4, 'd', 'w', 'i', 'g', 5, 'd', 'w', 'i', 'g', 'g', 5, 'd', 'w', 'i', 'g', 's', 4, 'd', 'w', 'i', 'n',\n5, 'd', 'w', 'i', 'n', 'j', 5, 'd', 'w', 'i', 'n', 'h', 4, 'd', 'w', 'i', 'd', 4, 'd', 'w', 'i', 'l', 5, 'd', 'w', 'i', 'l', 'g', 5, 'd', 'w', 'i', 'l', 'm',\n5, 'd', 'w', 'i', 'l', 'b', 5, 'd', 'w', 'i', 'l', 's', 5, 'd', 'w', 'i', 'l', 't', 5, 'd', 'w', 'i', 'l', 'p', 5, 'd', 'w', 'i', 'l', 'h', 4, 'd', 'w', 'i', 'm',\n4, 'd', 'w', 'i', 'b', 5, 'd', 'w', 'i', 'b', 's', 4, 'd', 'w', 'i', 's', 5, 'd', 'w', 'i', 's', 's', 5, 'd', 'w', 'i', 'n', 'g', 4, 'd', 'w', 'i', 'j',\n4, 'd', 'w', 'i', 'c', 4, 'd', 'w', 'i', 'k', 4, 'd', 'w', 'i', 't', 4, 'd', 'w', 'i', 'p', 4, 'd', 'w', 'i', 'h', 3, 'd', 'y', 'u',\n4, 'd', 'y', 'u', 'g', 5, 'd', 'y', 'u', 'g', 'g', 5, 'd', 'y', 'u', 'g', 's', 4, 'd', 'y', 'u', 'n', 5, 'd', 'y', 'u', 'n', 'j', 5, 'd', 'y', 'u', 'n', 'h',\n4, 'd', 'y', 'u', 'd', 4, 'd', 'y', 'u', 'l', 5, 'd', 'y', 'u', 'l', 'g', 5, 'd', 'y', 'u', 'l', 'm', 5, 'd', 'y', 'u', 'l', 'b', 5, 'd', 'y', 'u', 'l', 's',\n5, 'd', 'y', 'u', 'l', 't', 5, 'd', 'y', 'u', 'l', 'p', 5, 'd', 'y', 'u', 'l', 'h', 4, 'd', 'y', 'u', 'm', 4, 'd', 'y', 'u', 'b', 5, 'd', 'y', 'u', 'b', 's',\n4, 'd', 'y', 'u', 's', 5, 'd', 'y', 'u', 's', 's', 5, 'd', 'y', 'u', 'n', 'g', 4, 'd', 'y', 'u', 'j', 4, 'd', 'y', 'u', 'c', 4, 'd', 'y', 'u', 'k',\n4, 'd', 'y', 'u', 't', 4, 'd', 'y', 'u', 'p', 4, 'd', 'y', 'u', 'h', 3, 'd', 'e', 'u', 4, 'd', 'e', 'u', 'g', 5, 'd', 'e', 'u', 'g', 'g',\n5, 'd', 'e', 'u', 'g', 's', 4, 'd', 'e', 'u', 'n', 5, 'd', 'e', 'u', 'n', 'j', 5, 'd', 'e', 'u', 'n', 'h', 4, 'd', 'e', 'u', 'd', 4, 'd', 'e', 'u', 'l',\n5, 'd', 'e', 'u', 'l', 'g', 5, 'd', 'e', 'u', 'l', 'm', 5, 'd', 'e', 'u', 'l', 'b', 5, 'd', 'e', 'u', 'l', 's', 5, 'd', 'e', 'u', 'l', 't', 5, 'd', 'e', 'u', 'l', 'p',\n5, 'd', 'e', 'u', 'l', 'h', 4, 'd', 'e', 'u', 'm', 4, 'd', 'e', 'u', 'b', 5, 'd', 'e', 'u', 'b', 's', 4, 'd', 'e', 'u', 's', 5, 'd', 'e', 'u', 's', 's',\n5, 'd', 'e', 'u', 'n', 'g', 4, 'd', 'e', 'u', 'j', 4, 'd', 'e', 'u', 'c', 4, 'd', 'e', 'u', 'k', 4, 'd', 'e', 'u', 't', 4, 'd', 'e', 'u', 'p',\n4, 'd', 'e', 'u', 'h', 3, 'd', 'y', 'i', 4, 'd', 'y', 'i', 'g', 5, 'd', 'y', 'i', 'g', 'g', 5, 'd', 'y', 'i', 'g', 's', 4, 'd', 'y', 'i', 'n',\n5, 'd', 'y', 'i', 'n', 'j', 5, 'd', 'y', 'i', 'n', 'h', 4, 'd', 'y', 'i', 'd', 4, 'd', 'y', 'i', 'l', 5, 'd', 'y', 'i', 'l', 'g', 5, 'd', 'y', 'i', 'l', 'm',\n5, 'd', 'y', 'i', 'l', 'b', 5, 'd', 'y', 'i', 'l', 's', 5, 'd', 'y', 'i', 'l', 't', 5, 'd', 'y', 'i', 'l', 'p', 5, 'd', 'y', 'i', 'l', 'h', 4, 'd', 'y', 'i', 'm',\n4, 'd', 'y', 'i', 'b', 5, 'd', 'y', 'i', 'b', 's', 4, 'd', 'y', 'i', 's', 5, 'd', 'y', 'i', 's', 's', 5, 'd', 'y', 'i', 'n', 'g', 4, 'd', 'y', 'i', 'j',\n4, 'd', 'y', 'i', 'c', 4, 'd', 'y', 'i', 'k', 4, 'd', 'y', 'i', 't', 4, 'd', 'y', 'i', 'p', 4, 'd', 'y', 'i', 'h', 2, 'd', 'i',\n3, 'd', 'i', 'g', 4, 'd', 'i', 'g', 'g', 4, 'd', 'i', 'g', 's', 3, 'd', 'i', 'n', 4, 'd', 'i', 'n', 'j', 4, 'd', 'i', 'n', 'h',\n3, 'd', 'i', 'd', 3, 'd', 'i', 'l', 4, 'd', 'i', 'l', 'g', 4, 'd', 'i', 'l', 'm', 4, 'd', 'i', 'l', 'b', 4, 'd', 'i', 'l', 's',\n4, 'd', 'i', 'l', 't', 4, 'd', 'i', 'l', 'p', 4, 'd', 'i', 'l', 'h', 3, 'd', 'i', 'm', 3, 'd', 'i', 'b', 4, 'd', 'i', 'b', 's',\n3, 'd', 'i', 's', 4, 'd', 'i', 's', 's', 4, 'd', 'i', 'n', 'g', 3, 'd', 'i', 'j', 3, 'd', 'i', 'c', 3, 'd', 'i', 'k',\n3, 'd', 'i', 't', 3, 'd', 'i', 'p', 3, 'd', 'i', 'h', 3, 'd', 'd', 'a', 4, 'd', 'd', 'a', 'g', 5, 'd', 'd', 'a', 'g', 'g',\n5, 'd', 'd', 'a', 'g', 's', 4, 'd', 'd', 'a', 'n', 5, 'd', 'd', 'a', 'n', 'j', 5, 'd', 'd', 'a', 'n', 'h', 4, 'd', 'd', 'a', 'd', 4, 'd', 'd', 'a', 'l',\n5, 'd', 'd', 'a', 'l', 'g', 5, 'd', 'd', 'a', 'l', 'm', 5, 'd', 'd', 'a', 'l', 'b', 5, 'd', 'd', 'a', 'l', 's', 5, 'd', 'd', 'a', 'l', 't', 5, 'd', 'd', 'a', 'l', 'p',\n5, 'd', 'd', 'a', 'l', 'h', 4, 'd', 'd', 'a', 'm', 4, 'd', 'd', 'a', 'b', 5, 'd', 'd', 'a', 'b', 's', 4, 'd', 'd', 'a', 's', 5, 'd', 'd', 'a', 's', 's',\n5, 'd', 'd', 'a', 'n', 'g', 4, 'd', 'd', 'a', 'j', 4, 'd', 'd', 'a', 'c', 4, 'd', 'd', 'a', 'k', 4, 'd', 'd', 'a', 't', 4, 'd', 'd', 'a', 'p',\n4, 'd', 'd', 'a', 'h', 4, 'd', 'd', 'a', 'e', 5, 'd', 'd', 'a', 'e', 'g', 6, 'd', 'd', 'a', 'e', 'g', 'g', 6, 'd', 'd', 'a', 'e', 'g', 's', 5, 'd', 'd', 'a', 'e', 'n',\n6, 'd', 'd', 'a', 'e', 'n', 'j', 6, 'd', 'd', 'a', 'e', 'n', 'h', 5, 'd', 'd', 'a', 'e', 'd', 5, 'd', 'd', 'a', 'e', 'l', 6, 'd', 'd', 'a', 'e', 'l', 'g', 6, 'd', 'd', 'a', 'e', 'l', 'm',\n6, 'd', 'd', 'a', 'e', 'l', 'b', 6, 'd', 'd', 'a', 'e', 'l', 's', 6, 'd', 'd', 'a', 'e', 'l', 't', 6, 'd', 'd', 'a', 'e', 'l', 'p', 6, 'd', 'd', 'a', 'e', 'l', 'h', 5, 'd', 'd', 'a', 'e', 'm',\n5, 'd', 'd', 'a', 'e', 'b', 6, 'd', 'd', 'a', 'e', 'b', 's', 5, 'd', 'd', 'a', 'e', 's', 6, 'd', 'd', 'a', 'e', 's', 's', 6, 'd', 'd', 'a', 'e', 'n', 'g', 5, 'd', 'd', 'a', 'e', 'j',\n5, 'd', 'd', 'a', 'e', 'c', 5, 'd', 'd', 'a', 'e', 'k', 5, 'd', 'd', 'a', 'e', 't', 5, 'd', 'd', 'a', 'e', 'p', 5, 'd', 'd', 'a', 'e', 'h', 4, 'd', 'd', 'y', 'a',\n5, 'd', 'd', 'y', 'a', 'g', 6, 'd', 'd', 'y', 'a', 'g', 'g', 6, 'd', 'd', 'y', 'a', 'g', 's', 5, 'd', 'd', 'y', 'a', 'n', 6, 'd', 'd', 'y', 'a', 'n', 'j', 6, 'd', 'd', 'y', 'a', 'n', 'h',\n5, 'd', 'd', 'y', 'a', 'd', 5, 'd', 'd', 'y', 'a', 'l', 6, 'd', 'd', 'y', 'a', 'l', 'g', 6, 'd', 'd', 'y', 'a', 'l', 'm', 6, 'd', 'd', 'y', 'a', 'l', 'b', 6, 'd', 'd', 'y', 'a', 'l', 's',\n6, 'd', 'd', 'y', 'a', 'l', 't', 6, 'd', 'd', 'y', 'a', 'l', 'p', 6, 'd', 'd', 'y', 'a', 'l', 'h', 5, 'd', 'd', 'y', 'a', 'm', 5, 'd', 'd', 'y', 'a', 'b', 6, 'd', 'd', 'y', 'a', 'b', 's',\n5, 'd', 'd', 'y', 'a', 's', 6, 'd', 'd', 'y', 'a', 's', 's', 6, 'd', 'd', 'y', 'a', 'n', 'g', 5, 'd', 'd', 'y', 'a', 'j', 5, 'd', 'd', 'y', 'a', 'c', 5, 'd', 'd', 'y', 'a', 'k',\n5, 'd', 'd', 'y', 'a', 't', 5, 'd', 'd', 'y', 'a', 'p', 5, 'd', 'd', 'y', 'a', 'h', 5, 'd', 'd', 'y', 'a', 'e', 6, 'd', 'd', 'y', 'a', 'e', 'g', 7, 'd', 'd', 'y', 'a', 'e', 'g', 'g',\n7, 'd', 'd', 'y', 'a', 'e', 'g', 's', 6, 'd', 'd', 'y', 'a', 'e', 'n', 7, 'd', 'd', 'y', 'a', 'e', 'n', 'j', 7, 'd', 'd', 'y', 'a', 'e', 'n', 'h', 6, 'd', 'd', 'y', 'a', 'e', 'd', 6, 'd', 'd', 'y', 'a', 'e', 'l',\n7, 'd', 'd', 'y', 'a', 'e', 'l', 'g', 7, 'd', 'd', 'y', 'a', 'e', 'l', 'm', 7, 'd', 'd', 'y', 'a', 'e', 'l', 'b', 7, 'd', 'd', 'y', 'a', 'e', 'l', 's', 7, 'd', 'd', 'y', 'a', 'e', 'l', 't', 7, 'd', 'd', 'y', 'a', 'e', 'l', 'p',\n7, 'd', 'd', 'y', 'a', 'e', 'l', 'h', 6, 'd', 'd', 'y', 'a', 'e', 'm', 6, 'd', 'd', 'y', 'a', 'e', 'b', 7, 'd', 'd', 'y', 'a', 'e', 'b', 's', 6, 'd', 'd', 'y', 'a', 'e', 's', 7, 'd', 'd', 'y', 'a', 'e', 's', 's',\n7, 'd', 'd', 'y', 'a', 'e', 'n', 'g', 6, 'd', 'd', 'y', 'a', 'e', 'j', 6, 'd', 'd', 'y', 'a', 'e', 'c', 6, 'd', 'd', 'y', 'a', 'e', 'k', 6, 'd', 'd', 'y', 'a', 'e', 't', 6, 'd', 'd', 'y', 'a', 'e', 'p',\n6, 'd', 'd', 'y', 'a', 'e', 'h', 4, 'd', 'd', 'e', 'o', 5, 'd', 'd', 'e', 'o', 'g', 6, 'd', 'd', 'e', 'o', 'g', 'g', 6, 'd', 'd', 'e', 'o', 'g', 's', 5, 'd', 'd', 'e', 'o', 'n',\n6, 'd', 'd', 'e', 'o', 'n', 'j', 6, 'd', 'd', 'e', 'o', 'n', 'h', 5, 'd', 'd', 'e', 'o', 'd', 5, 'd', 'd', 'e', 'o', 'l', 6, 'd', 'd', 'e', 'o', 'l', 'g', 6, 'd', 'd', 'e', 'o', 'l', 'm',\n6, 'd', 'd', 'e', 'o', 'l', 'b', 6, 'd', 'd', 'e', 'o', 'l', 's', 6, 'd', 'd', 'e', 'o', 'l', 't', 6, 'd', 'd', 'e', 'o', 'l', 'p', 6, 'd', 'd', 'e', 'o', 'l', 'h', 5, 'd', 'd', 'e', 'o', 'm',\n5, 'd', 'd', 'e', 'o', 'b', 6, 'd', 'd', 'e', 'o', 'b', 's', 5, 'd', 'd', 'e', 'o', 's', 6, 'd', 'd', 'e', 'o', 's', 's', 6, 'd', 'd', 'e', 'o', 'n', 'g', 5, 'd', 'd', 'e', 'o', 'j',\n5, 'd', 'd', 'e', 'o', 'c', 5, 'd', 'd', 'e', 'o', 'k', 5, 'd', 'd', 'e', 'o', 't', 5, 'd', 'd', 'e', 'o', 'p', 5, 'd', 'd', 'e', 'o', 'h', 3, 'd', 'd', 'e',\n4, 'd', 'd', 'e', 'g', 5, 'd', 'd', 'e', 'g', 'g', 5, 'd', 'd', 'e', 'g', 's', 4, 'd', 'd', 'e', 'n', 5, 'd', 'd', 'e', 'n', 'j', 5, 'd', 'd', 'e', 'n', 'h',\n4, 'd', 'd', 'e', 'd', 4, 'd', 'd', 'e', 'l', 5, 'd', 'd', 'e', 'l', 'g', 5, 'd', 'd', 'e', 'l', 'm', 5, 'd', 'd', 'e', 'l', 'b', 5, 'd', 'd', 'e', 'l', 's',\n5, 'd', 'd', 'e', 'l', 't', 5, 'd', 'd', 'e', 'l', 'p', 5, 'd', 'd', 'e', 'l', 'h', 4, 'd', 'd', 'e', 'm', 4, 'd', 'd', 'e', 'b', 5, 'd', 'd', 'e', 'b', 's',\n4, 'd', 'd', 'e', 's', 5, 'd', 'd', 'e', 's', 's', 5, 'd', 'd', 'e', 'n', 'g', 4, 'd', 'd', 'e', 'j', 4, 'd', 'd', 'e', 'c', 4, 'd', 'd', 'e', 'k',\n4, 'd', 'd', 'e', 't', 4, 'd', 'd', 'e', 'p', 4, 'd', 'd', 'e', 'h', 5, 'd', 'd', 'y', 'e', 'o', 6, 'd', 'd', 'y', 'e', 'o', 'g', 7, 'd', 'd', 'y', 'e', 'o', 'g', 'g',\n7, 'd', 'd', 'y', 'e', 'o', 'g', 's', 6, 'd', 'd', 'y', 'e', 'o', 'n', 7, 'd', 'd', 'y', 'e', 'o', 'n', 'j', 7, 'd', 'd', 'y', 'e', 'o', 'n', 'h', 6, 'd', 'd', 'y', 'e', 'o', 'd', 6, 'd', 'd', 'y', 'e', 'o', 'l',\n7, 'd', 'd', 'y', 'e', 'o', 'l', 'g', 7, 'd', 'd', 'y', 'e', 'o', 'l', 'm', 7, 'd', 'd', 'y', 'e', 'o', 'l', 'b', 7, 'd', 'd', 'y', 'e', 'o', 'l', 's', 7, 'd', 'd', 'y', 'e', 'o', 'l', 't', 7, 'd', 'd', 'y', 'e', 'o', 'l', 'p',\n7, 'd', 'd', 'y', 'e', 'o', 'l', 'h', 6, 'd', 'd', 'y', 'e', 'o', 'm', 6, 'd', 'd', 'y', 'e', 'o', 'b', 7, 'd', 'd', 'y', 'e', 'o', 'b', 's', 6, 'd', 'd', 'y', 'e', 'o', 's', 7, 'd', 'd', 'y', 'e', 'o', 's', 's',\n7, 'd', 'd', 'y', 'e', 'o', 'n', 'g', 6, 'd', 'd', 'y', 'e', 'o', 'j', 6, 'd', 'd', 'y', 'e', 'o', 'c', 6, 'd', 'd', 'y', 'e', 'o', 'k', 6, 'd', 'd', 'y', 'e', 'o', 't', 6, 'd', 'd', 'y', 'e', 'o', 'p',\n6, 'd', 'd', 'y', 'e', 'o', 'h', 4, 'd', 'd', 'y', 'e', 5, 'd', 'd', 'y', 'e', 'g', 6, 'd', 'd', 'y', 'e', 'g', 'g', 6, 'd', 'd', 'y', 'e', 'g', 's', 5, 'd', 'd', 'y', 'e', 'n',\n6, 'd', 'd', 'y', 'e', 'n', 'j', 6, 'd', 'd', 'y', 'e', 'n', 'h', 5, 'd', 'd', 'y', 'e', 'd', 5, 'd', 'd', 'y', 'e', 'l', 6, 'd', 'd', 'y', 'e', 'l', 'g', 6, 'd', 'd', 'y', 'e', 'l', 'm',\n6, 'd', 'd', 'y', 'e', 'l', 'b', 6, 'd', 'd', 'y', 'e', 'l', 's', 6, 'd', 'd', 'y', 'e', 'l', 't', 6, 'd', 'd', 'y', 'e', 'l', 'p', 6, 'd', 'd', 'y', 'e', 'l', 'h', 5, 'd', 'd', 'y', 'e', 'm',\n5, 'd', 'd', 'y', 'e', 'b', 6, 'd', 'd', 'y', 'e', 'b', 's', 5, 'd', 'd', 'y', 'e', 's', 6, 'd', 'd', 'y', 'e', 's', 's', 6, 'd', 'd', 'y', 'e', 'n', 'g', 5, 'd', 'd', 'y', 'e', 'j',\n5, 'd', 'd', 'y', 'e', 'c', 5, 'd', 'd', 'y', 'e', 'k', 5, 'd', 'd', 'y', 'e', 't', 5, 'd', 'd', 'y', 'e', 'p', 5, 'd', 'd', 'y', 'e', 'h', 3, 'd', 'd', 'o',\n4, 'd', 'd', 'o', 'g', 5, 'd', 'd', 'o', 'g', 'g', 5, 'd', 'd', 'o', 'g', 's', 4, 'd', 'd', 'o', 'n', 5, 'd', 'd', 'o', 'n', 'j', 5, 'd', 'd', 'o', 'n', 'h',\n4, 'd', 'd', 'o', 'd', 4, 'd', 'd', 'o', 'l', 5, 'd', 'd', 'o', 'l', 'g', 5, 'd', 'd', 'o', 'l', 'm', 5, 'd', 'd', 'o', 'l', 'b', 5, 'd', 'd', 'o', 'l', 's',\n5, 'd', 'd', 'o', 'l', 't', 5, 'd', 'd', 'o', 'l', 'p', 5, 'd', 'd', 'o', 'l', 'h', 4, 'd', 'd', 'o', 'm', 4, 'd', 'd', 'o', 'b', 5, 'd', 'd', 'o', 'b', 's',\n4, 'd', 'd', 'o', 's', 5, 'd', 'd', 'o', 's', 's', 5, 'd', 'd', 'o', 'n', 'g', 4, 'd', 'd', 'o', 'j', 4, 'd', 'd', 'o', 'c', 4, 'd', 'd', 'o', 'k',\n4, 'd', 'd', 'o', 't', 4, 'd', 'd', 'o', 'p', 4, 'd', 'd', 'o', 'h', 4, 'd', 'd', 'w', 'a', 5, 'd', 'd', 'w', 'a', 'g', 6, 'd', 'd', 'w', 'a', 'g', 'g',\n6, 'd', 'd', 'w', 'a', 'g', 's', 5, 'd', 'd', 'w', 'a', 'n', 6, 'd', 'd', 'w', 'a', 'n', 'j', 6, 'd', 'd', 'w', 'a', 'n', 'h', 5, 'd', 'd', 'w', 'a', 'd', 5, 'd', 'd', 'w', 'a', 'l',\n6, 'd', 'd', 'w', 'a', 'l', 'g', 6, 'd', 'd', 'w', 'a', 'l', 'm', 6, 'd', 'd', 'w', 'a', 'l', 'b', 6, 'd', 'd', 'w', 'a', 'l', 's', 6, 'd', 'd', 'w', 'a', 'l', 't', 6, 'd', 'd', 'w', 'a', 'l', 'p',\n6, 'd', 'd', 'w', 'a', 'l', 'h', 5, 'd', 'd', 'w', 'a', 'm', 5, 'd', 'd', 'w', 'a', 'b', 6, 'd', 'd', 'w', 'a', 'b', 's', 5, 'd', 'd', 'w', 'a', 's', 6, 'd', 'd', 'w', 'a', 's', 's',\n6, 'd', 'd', 'w', 'a', 'n', 'g', 5, 'd', 'd', 'w', 'a', 'j', 5, 'd', 'd', 'w', 'a', 'c', 5, 'd', 'd', 'w', 'a', 'k', 5, 'd', 'd', 'w', 'a', 't', 5, 'd', 'd', 'w', 'a', 'p',\n5, 'd', 'd', 'w', 'a', 'h', 5, 'd', 'd', 'w', 'a', 'e', 6, 'd', 'd', 'w', 'a', 'e', 'g', 7, 'd', 'd', 'w', 'a', 'e', 'g', 'g', 7, 'd', 'd', 'w', 'a', 'e', 'g', 's', 6, 'd', 'd', 'w', 'a', 'e', 'n',\n7, 'd', 'd', 'w', 'a', 'e', 'n', 'j', 7, 'd', 'd', 'w', 'a', 'e', 'n', 'h', 6, 'd', 'd', 'w', 'a', 'e', 'd', 6, 'd', 'd', 'w', 'a', 'e', 'l', 7, 'd', 'd', 'w', 'a', 'e', 'l', 'g', 7, 'd', 'd', 'w', 'a', 'e', 'l', 'm',\n7, 'd', 'd', 'w', 'a', 'e', 'l', 'b', 7, 'd', 'd', 'w', 'a', 'e', 'l', 's', 7, 'd', 'd', 'w', 'a', 'e', 'l', 't', 7, 'd', 'd', 'w', 'a', 'e', 'l', 'p', 7, 'd', 'd', 'w', 'a', 'e', 'l', 'h', 6, 'd', 'd', 'w', 'a', 'e', 'm',\n6, 'd', 'd', 'w', 'a', 'e', 'b', 7, 'd', 'd', 'w', 'a', 'e', 'b', 's', 6, 'd', 'd', 'w', 'a', 'e', 's', 7, 'd', 'd', 'w', 'a', 'e', 's', 's', 7, 'd', 'd', 'w', 'a', 'e', 'n', 'g', 6, 'd', 'd', 'w', 'a', 'e', 'j',\n6, 'd', 'd', 'w', 'a', 'e', 'c', 6, 'd', 'd', 'w', 'a', 'e', 'k', 6, 'd', 'd', 'w', 'a', 'e', 't', 6, 'd', 'd', 'w', 'a', 'e', 'p', 6, 'd', 'd', 'w', 'a', 'e', 'h', 4, 'd', 'd', 'o', 'e',\n5, 'd', 'd', 'o', 'e', 'g', 6, 'd', 'd', 'o', 'e', 'g', 'g', 6, 'd', 'd', 'o', 'e', 'g', 's', 5, 'd', 'd', 'o', 'e', 'n', 6, 'd', 'd', 'o', 'e', 'n', 'j', 6, 'd', 'd', 'o', 'e', 'n', 'h',\n5, 'd', 'd', 'o', 'e', 'd', 5, 'd', 'd', 'o', 'e', 'l', 6, 'd', 'd', 'o', 'e', 'l', 'g', 6, 'd', 'd', 'o', 'e', 'l', 'm', 6, 'd', 'd', 'o', 'e', 'l', 'b', 6, 'd', 'd', 'o', 'e', 'l', 's',\n6, 'd', 'd', 'o', 'e', 'l', 't', 6, 'd', 'd', 'o', 'e', 'l', 'p', 6, 'd', 'd', 'o', 'e', 'l', 'h', 5, 'd', 'd', 'o', 'e', 'm', 5, 'd', 'd', 'o', 'e', 'b', 6, 'd', 'd', 'o', 'e', 'b', 's',\n5, 'd', 'd', 'o', 'e', 's', 6, 'd', 'd', 'o', 'e', 's', 's', 6, 'd', 'd', 'o', 'e', 'n', 'g', 5, 'd', 'd', 'o', 'e', 'j', 5, 'd', 'd', 'o', 'e', 'c', 5, 'd', 'd', 'o', 'e', 'k',\n5, 'd', 'd', 'o', 'e', 't', 5, 'd', 'd', 'o', 'e', 'p', 5, 'd', 'd', 'o', 'e', 'h', 4, 'd', 'd', 'y', 'o', 5, 'd', 'd', 'y', 'o', 'g', 6, 'd', 'd', 'y', 'o', 'g', 'g',\n6, 'd', 'd', 'y', 'o', 'g', 's', 5, 'd', 'd', 'y', 'o', 'n', 6, 'd', 'd', 'y', 'o', 'n', 'j', 6, 'd', 'd', 'y', 'o', 'n', 'h', 5, 'd', 'd', 'y', 'o', 'd', 5, 'd', 'd', 'y', 'o', 'l',\n6, 'd', 'd', 'y', 'o', 'l', 'g', 6, 'd', 'd', 'y', 'o', 'l', 'm', 6, 'd', 'd', 'y', 'o', 'l', 'b', 6, 'd', 'd', 'y', 'o', 'l', 's', 6, 'd', 'd', 'y', 'o', 'l', 't', 6, 'd', 'd', 'y', 'o', 'l', 'p',\n6, 'd', 'd', 'y', 'o', 'l', 'h', 5, 'd', 'd', 'y', 'o', 'm', 5, 'd', 'd', 'y', 'o', 'b', 6, 'd', 'd', 'y', 'o', 'b', 's', 5, 'd', 'd', 'y', 'o', 's', 6, 'd', 'd', 'y', 'o', 's', 's',\n6, 'd', 'd', 'y', 'o', 'n', 'g', 5, 'd', 'd', 'y', 'o', 'j', 5, 'd', 'd', 'y', 'o', 'c', 5, 'd', 'd', 'y', 'o', 'k', 5, 'd', 'd', 'y', 'o', 't', 5, 'd', 'd', 'y', 'o', 'p',\n5, 'd', 'd', 'y', 'o', 'h', 3, 'd', 'd', 'u', 4, 'd', 'd', 'u', 'g', 5, 'd', 'd', 'u', 'g', 'g', 5, 'd', 'd', 'u', 'g', 's', 4, 'd', 'd', 'u', 'n',\n5, 'd', 'd', 'u', 'n', 'j', 5, 'd', 'd', 'u', 'n', 'h', 4, 'd', 'd', 'u', 'd', 4, 'd', 'd', 'u', 'l', 5, 'd', 'd', 'u', 'l', 'g', 5, 'd', 'd', 'u', 'l', 'm',\n5, 'd', 'd', 'u', 'l', 'b', 5, 'd', 'd', 'u', 'l', 's', 5, 'd', 'd', 'u', 'l', 't', 5, 'd', 'd', 'u', 'l', 'p', 5, 'd', 'd', 'u', 'l', 'h', 4, 'd', 'd', 'u', 'm',\n4, 'd', 'd', 'u', 'b', 5, 'd', 'd', 'u', 'b', 's', 4, 'd', 'd', 'u', 's', 5, 'd', 'd', 'u', 's', 's', 5, 'd', 'd', 'u', 'n', 'g', 4, 'd', 'd', 'u', 'j',\n4, 'd', 'd', 'u', 'c', 4, 'd', 'd', 'u', 'k', 4, 'd', 'd', 'u', 't', 4, 'd', 'd', 'u', 'p', 4, 'd', 'd', 'u', 'h', 5, 'd', 'd', 'w', 'e', 'o',\n6, 'd', 'd', 'w', 'e', 'o', 'g', 7, 'd', 'd', 'w', 'e', 'o', 'g', 'g', 7, 'd', 'd', 'w', 'e', 'o', 'g', 's', 6, 'd', 'd', 'w', 'e', 'o', 'n', 7, 'd', 'd', 'w', 'e', 'o', 'n', 'j', 7, 'd', 'd', 'w', 'e', 'o', 'n', 'h',\n6, 'd', 'd', 'w', 'e', 'o', 'd', 6, 'd', 'd', 'w', 'e', 'o', 'l', 7, 'd', 'd', 'w', 'e', 'o', 'l', 'g', 7, 'd', 'd', 'w', 'e', 'o', 'l', 'm', 7, 'd', 'd', 'w', 'e', 'o', 'l', 'b', 7, 'd', 'd', 'w', 'e', 'o', 'l', 's',\n7, 'd', 'd', 'w', 'e', 'o', 'l', 't', 7, 'd', 'd', 'w', 'e', 'o', 'l', 'p', 7, 'd', 'd', 'w', 'e', 'o', 'l', 'h', 6, 'd', 'd', 'w', 'e', 'o', 'm', 6, 'd', 'd', 'w', 'e', 'o', 'b', 7, 'd', 'd', 'w', 'e', 'o', 'b', 's',\n6, 'd', 'd', 'w', 'e', 'o', 's', 7, 'd', 'd', 'w', 'e', 'o', 's', 's', 7, 'd', 'd', 'w', 'e', 'o', 'n', 'g', 6, 'd', 'd', 'w', 'e', 'o', 'j', 6, 'd', 'd', 'w', 'e', 'o', 'c', 6, 'd', 'd', 'w', 'e', 'o', 'k',\n6, 'd', 'd', 'w', 'e', 'o', 't', 6, 'd', 'd', 'w', 'e', 'o', 'p', 6, 'd', 'd', 'w', 'e', 'o', 'h', 4, 'd', 'd', 'w', 'e', 5, 'd', 'd', 'w', 'e', 'g', 6, 'd', 'd', 'w', 'e', 'g', 'g',\n6, 'd', 'd', 'w', 'e', 'g', 's', 5, 'd', 'd', 'w', 'e', 'n', 6, 'd', 'd', 'w', 'e', 'n', 'j', 6, 'd', 'd', 'w', 'e', 'n', 'h', 5, 'd', 'd', 'w', 'e', 'd', 5, 'd', 'd', 'w', 'e', 'l',\n6, 'd', 'd', 'w', 'e', 'l', 'g', 6, 'd', 'd', 'w', 'e', 'l', 'm', 6, 'd', 'd', 'w', 'e', 'l', 'b', 6, 'd', 'd', 'w', 'e', 'l', 's', 6, 'd', 'd', 'w', 'e', 'l', 't', 6, 'd', 'd', 'w', 'e', 'l', 'p',\n6, 'd', 'd', 'w', 'e', 'l', 'h', 5, 'd', 'd', 'w', 'e', 'm', 5, 'd', 'd', 'w', 'e', 'b', 6, 'd', 'd', 'w', 'e', 'b', 's', 5, 'd', 'd', 'w', 'e', 's', 6, 'd', 'd', 'w', 'e', 's', 's',\n6, 'd', 'd', 'w', 'e', 'n', 'g', 5, 'd', 'd', 'w', 'e', 'j', 5, 'd', 'd', 'w', 'e', 'c', 5, 'd', 'd', 'w', 'e', 'k', 5, 'd', 'd', 'w', 'e', 't', 5, 'd', 'd', 'w', 'e', 'p',\n5, 'd', 'd', 'w', 'e', 'h', 4, 'd', 'd', 'w', 'i', 5, 'd', 'd', 'w', 'i', 'g', 6, 'd', 'd', 'w', 'i', 'g', 'g', 6, 'd', 'd', 'w', 'i', 'g', 's', 5, 'd', 'd', 'w', 'i', 'n',\n6, 'd', 'd', 'w', 'i', 'n', 'j', 6, 'd', 'd', 'w', 'i', 'n', 'h', 5, 'd', 'd', 'w', 'i', 'd', 5, 'd', 'd', 'w', 'i', 'l', 6, 'd', 'd', 'w', 'i', 'l', 'g', 6, 'd', 'd', 'w', 'i', 'l', 'm',\n6, 'd', 'd', 'w', 'i', 'l', 'b', 6, 'd', 'd', 'w', 'i', 'l', 's', 6, 'd', 'd', 'w', 'i', 'l', 't', 6, 'd', 'd', 'w', 'i', 'l', 'p', 6, 'd', 'd', 'w', 'i', 'l', 'h', 5, 'd', 'd', 'w', 'i', 'm',\n5, 'd', 'd', 'w', 'i', 'b', 6, 'd', 'd', 'w', 'i', 'b', 's', 5, 'd', 'd', 'w', 'i', 's', 6, 'd', 'd', 'w', 'i', 's', 's', 6, 'd', 'd', 'w', 'i', 'n', 'g', 5, 'd', 'd', 'w', 'i', 'j',\n5, 'd', 'd', 'w', 'i', 'c', 5, 'd', 'd', 'w', 'i', 'k', 5, 'd', 'd', 'w', 'i', 't', 5, 'd', 'd', 'w', 'i', 'p', 5, 'd', 'd', 'w', 'i', 'h', 4, 'd', 'd', 'y', 'u',\n5, 'd', 'd', 'y', 'u', 'g', 6, 'd', 'd', 'y', 'u', 'g', 'g', 6, 'd', 'd', 'y', 'u', 'g', 's', 5, 'd', 'd', 'y', 'u', 'n', 6, 'd', 'd', 'y', 'u', 'n', 'j', 6, 'd', 'd', 'y', 'u', 'n', 'h',\n5, 'd', 'd', 'y', 'u', 'd', 5, 'd', 'd', 'y', 'u', 'l', 6, 'd', 'd', 'y', 'u', 'l', 'g', 6, 'd', 'd', 'y', 'u', 'l', 'm', 6, 'd', 'd', 'y', 'u', 'l', 'b', 6, 'd', 'd', 'y', 'u', 'l', 's',\n6, 'd', 'd', 'y', 'u', 'l', 't', 6, 'd', 'd', 'y', 'u', 'l', 'p', 6, 'd', 'd', 'y', 'u', 'l', 'h', 5, 'd', 'd', 'y', 'u', 'm', 5, 'd', 'd', 'y', 'u', 'b', 6, 'd', 'd', 'y', 'u', 'b', 's',\n5, 'd', 'd', 'y', 'u', 's', 6, 'd', 'd', 'y', 'u', 's', 's', 6, 'd', 'd', 'y', 'u', 'n', 'g', 5, 'd', 'd', 'y', 'u', 'j', 5, 'd', 'd', 'y', 'u', 'c', 5, 'd', 'd', 'y', 'u', 'k',\n5, 'd', 'd', 'y', 'u', 't', 5, 'd', 'd', 'y', 'u', 'p', 5, 'd', 'd', 'y', 'u', 'h', 4, 'd', 'd', 'e', 'u', 5, 'd', 'd', 'e', 'u', 'g', 6, 'd', 'd', 'e', 'u', 'g', 'g',\n6, 'd', 'd', 'e', 'u', 'g', 's', 5, 'd', 'd', 'e', 'u', 'n', 6, 'd', 'd', 'e', 'u', 'n', 'j', 6, 'd', 'd', 'e', 'u', 'n', 'h', 5, 'd', 'd', 'e', 'u', 'd', 5, 'd', 'd', 'e', 'u', 'l',\n6, 'd', 'd', 'e', 'u', 'l', 'g', 6, 'd', 'd', 'e', 'u', 'l', 'm', 6, 'd', 'd', 'e', 'u', 'l', 'b', 6, 'd', 'd', 'e', 'u', 'l', 's', 6, 'd', 'd', 'e', 'u', 'l', 't', 6, 'd', 'd', 'e', 'u', 'l', 'p',\n6, 'd', 'd', 'e', 'u', 'l', 'h', 5, 'd', 'd', 'e', 'u', 'm', 5, 'd', 'd', 'e', 'u', 'b', 6, 'd', 'd', 'e', 'u', 'b', 's', 5, 'd', 'd', 'e', 'u', 's', 6, 'd', 'd', 'e', 'u', 's', 's',\n6, 'd', 'd', 'e', 'u', 'n', 'g', 5, 'd', 'd', 'e', 'u', 'j', 5, 'd', 'd', 'e', 'u', 'c', 5, 'd', 'd', 'e', 'u', 'k', 5, 'd', 'd', 'e', 'u', 't', 5, 'd', 'd', 'e', 'u', 'p',\n5, 'd', 'd', 'e', 'u', 'h', 4, 'd', 'd', 'y', 'i', 5, 'd', 'd', 'y', 'i', 'g', 6, 'd', 'd', 'y', 'i', 'g', 'g', 6, 'd', 'd', 'y', 'i', 'g', 's', 5, 'd', 'd', 'y', 'i', 'n',\n6, 'd', 'd', 'y', 'i', 'n', 'j', 6, 'd', 'd', 'y', 'i', 'n', 'h', 5, 'd', 'd', 'y', 'i', 'd', 5, 'd', 'd', 'y', 'i', 'l', 6, 'd', 'd', 'y', 'i', 'l', 'g', 6, 'd', 'd', 'y', 'i', 'l', 'm',\n6, 'd', 'd', 'y', 'i', 'l', 'b', 6, 'd', 'd', 'y', 'i', 'l', 's', 6, 'd', 'd', 'y', 'i', 'l', 't', 6, 'd', 'd', 'y', 'i', 'l', 'p', 6, 'd', 'd', 'y', 'i', 'l', 'h', 5, 'd', 'd', 'y', 'i', 'm',\n5, 'd', 'd', 'y', 'i', 'b', 6, 'd', 'd', 'y', 'i', 'b', 's', 5, 'd', 'd', 'y', 'i', 's', 6, 'd', 'd', 'y', 'i', 's', 's', 6, 'd', 'd', 'y', 'i', 'n', 'g', 5, 'd', 'd', 'y', 'i', 'j',\n5, 'd', 'd', 'y', 'i', 'c', 5, 'd', 'd', 'y', 'i', 'k', 5, 'd', 'd', 'y', 'i', 't', 5, 'd', 'd', 'y', 'i', 'p', 5, 'd', 'd', 'y', 'i', 'h', 3, 'd', 'd', 'i',\n4, 'd', 'd', 'i', 'g', 5, 'd', 'd', 'i', 'g', 'g', 5, 'd', 'd', 'i', 'g', 's', 4, 'd', 'd', 'i', 'n', 5, 'd', 'd', 'i', 'n', 'j', 5, 'd', 'd', 'i', 'n', 'h',\n4, 'd', 'd', 'i', 'd', 4, 'd', 'd', 'i', 'l', 5, 'd', 'd', 'i', 'l', 'g', 5, 'd', 'd', 'i', 'l', 'm', 5, 'd', 'd', 'i', 'l', 'b', 5, 'd', 'd', 'i', 'l', 's',\n5, 'd', 'd', 'i', 'l', 't', 5, 'd', 'd', 'i', 'l', 'p', 5, 'd', 'd', 'i', 'l', 'h', 4, 'd', 'd', 'i', 'm', 4, 'd', 'd', 'i', 'b', 5, 'd', 'd', 'i', 'b', 's',\n4, 'd', 'd', 'i', 's', 5, 'd', 'd', 'i', 's', 's', 5, 'd', 'd', 'i', 'n', 'g', 4, 'd', 'd', 'i', 'j', 4, 'd', 'd', 'i', 'c', 4, 'd', 'd', 'i', 'k',\n4, 'd', 'd', 'i', 't', 4, 'd', 'd', 'i', 'p', 4, 'd', 'd', 'i', 'h', 2, 'r', 'a', 3, 'r', 'a', 'g', 4, 'r', 'a', 'g', 'g',\n4, 'r', 'a', 'g', 's', 3, 'r', 'a', 'n', 4, 'r', 'a', 'n', 'j', 4, 'r', 'a', 'n', 'h', 3, 'r', 'a', 'd', 3, 'r', 'a', 'l',\n4, 'r', 'a', 'l', 'g', 4, 'r', 'a', 'l', 'm', 4, 'r', 'a', 'l', 'b', 4, 'r', 'a', 'l', 's', 4, 'r', 'a', 'l', 't', 4, 'r', 'a', 'l', 'p',\n4, 'r', 'a', 'l', 'h', 3, 'r', 'a', 'm', 3, 'r', 'a', 'b', 4, 'r', 'a', 'b', 's', 3, 'r', 'a', 's', 4, 'r', 'a', 's', 's',\n4, 'r', 'a', 'n', 'g', 3, 'r', 'a', 'j', 3, 'r', 'a', 'c', 3, 'r', 'a', 'k', 3, 'r', 'a', 't', 3, 'r', 'a', 'p',\n3, 'r', 'a', 'h', 3, 'r', 'a', 'e', 4, 'r', 'a', 'e', 'g', 5, 'r', 'a', 'e', 'g', 'g', 5, 'r', 'a', 'e', 'g', 's', 4, 'r', 'a', 'e', 'n',\n5, 'r', 'a', 'e', 'n', 'j', 5, 'r', 'a', 'e', 'n', 'h', 4, 'r', 'a', 'e', 'd', 4, 'r', 'a', 'e', 'l', 5, 'r', 'a', 'e', 'l', 'g', 5, 'r', 'a', 'e', 'l', 'm',\n5, 'r', 'a', 'e', 'l', 'b', 5, 'r', 'a', 'e', 'l', 's', 5, 'r', 'a', 'e', 'l', 't', 5, 'r', 'a', 'e', 'l', 'p', 5, 'r', 'a', 'e', 'l', 'h', 4, 'r', 'a', 'e', 'm',\n4, 'r', 'a', 'e', 'b', 5, 'r', 'a', 'e', 'b', 's', 4, 'r', 'a', 'e', 's', 5, 'r', 'a', 'e', 's', 's', 5, 'r', 'a', 'e', 'n', 'g', 4, 'r', 'a', 'e', 'j',\n4, 'r', 'a', 'e', 'c', 4, 'r', 'a', 'e', 'k', 4, 'r', 'a', 'e', 't', 4, 'r', 'a', 'e', 'p', 4, 'r', 'a', 'e', 'h', 3, 'r', 'y', 'a',\n4, 'r', 'y', 'a', 'g', 5, 'r', 'y', 'a', 'g', 'g', 5, 'r', 'y', 'a', 'g', 's', 4, 'r', 'y', 'a', 'n', 5, 'r', 'y', 'a', 'n', 'j', 5, 'r', 'y', 'a', 'n', 'h',\n4, 'r', 'y', 'a', 'd', 4, 'r', 'y', 'a', 'l', 5, 'r', 'y', 'a', 'l', 'g', 5, 'r', 'y', 'a', 'l', 'm', 5, 'r', 'y', 'a', 'l', 'b', 5, 'r', 'y', 'a', 'l', 's',\n5, 'r', 'y', 'a', 'l', 't', 5, 'r', 'y', 'a', 'l', 'p', 5, 'r', 'y', 'a', 'l', 'h', 4, 'r', 'y', 'a', 'm', 4, 'r', 'y', 'a', 'b', 5, 'r', 'y', 'a', 'b', 's',\n4, 'r', 'y', 'a', 's', 5, 'r', 'y', 'a', 's', 's', 5, 'r', 'y', 'a', 'n', 'g', 4, 'r', 'y', 'a', 'j', 4, 'r', 'y', 'a', 'c', 4, 'r', 'y', 'a', 'k',\n4, 'r', 'y', 'a', 't', 4, 'r', 'y', 'a', 'p', 4, 'r', 'y', 'a', 'h', 4, 'r', 'y', 'a', 'e', 5, 'r', 'y', 'a', 'e', 'g', 6, 'r', 'y', 'a', 'e', 'g', 'g',\n6, 'r', 'y', 'a', 'e', 'g', 's', 5, 'r', 'y', 'a', 'e', 'n', 6, 'r', 'y', 'a', 'e', 'n', 'j', 6, 'r', 'y', 'a', 'e', 'n', 'h', 5, 'r', 'y', 'a', 'e', 'd', 5, 'r', 'y', 'a', 'e', 'l',\n6, 'r', 'y', 'a', 'e', 'l', 'g', 6, 'r', 'y', 'a', 'e', 'l', 'm', 6, 'r', 'y', 'a', 'e', 'l', 'b', 6, 'r', 'y', 'a', 'e', 'l', 's', 6, 'r', 'y', 'a', 'e', 'l', 't', 6, 'r', 'y', 'a', 'e', 'l', 'p',\n6, 'r', 'y', 'a', 'e', 'l', 'h', 5, 'r', 'y', 'a', 'e', 'm', 5, 'r', 'y', 'a', 'e', 'b', 6, 'r', 'y', 'a', 'e', 'b', 's', 5, 'r', 'y', 'a', 'e', 's', 6, 'r', 'y', 'a', 'e', 's', 's',\n6, 'r', 'y', 'a', 'e', 'n', 'g', 5, 'r', 'y', 'a', 'e', 'j', 5, 'r', 'y', 'a', 'e', 'c', 5, 'r', 'y', 'a', 'e', 'k', 5, 'r', 'y', 'a', 'e', 't', 5, 'r', 'y', 'a', 'e', 'p',\n5, 'r', 'y', 'a', 'e', 'h', 3, 'r', 'e', 'o', 4, 'r', 'e', 'o', 'g', 5, 'r', 'e', 'o', 'g', 'g', 5, 'r', 'e', 'o', 'g', 's', 4, 'r', 'e', 'o', 'n',\n5, 'r', 'e', 'o', 'n', 'j', 5, 'r', 'e', 'o', 'n', 'h', 4, 'r', 'e', 'o', 'd', 4, 'r', 'e', 'o', 'l', 5, 'r', 'e', 'o', 'l', 'g', 5, 'r', 'e', 'o', 'l', 'm',\n5, 'r', 'e', 'o', 'l', 'b', 5, 'r', 'e', 'o', 'l', 's', 5, 'r', 'e', 'o', 'l', 't', 5, 'r', 'e', 'o', 'l', 'p', 5, 'r', 'e', 'o', 'l', 'h', 4, 'r', 'e', 'o', 'm',\n4, 'r', 'e', 'o', 'b', 5, 'r', 'e', 'o', 'b', 's', 4, 'r', 'e', 'o', 's', 5, 'r', 'e', 'o', 's', 's', 5, 'r', 'e', 'o', 'n', 'g', 4, 'r', 'e', 'o', 'j',\n4, 'r', 'e', 'o', 'c', 4, 'r', 'e', 'o', 'k', 4, 'r', 'e', 'o', 't', 4, 'r', 'e', 'o', 'p', 4, 'r', 'e', 'o', 'h', 2, 'r', 'e',\n3, 'r', 'e', 'g', 4, 'r', 'e', 'g', 'g', 4, 'r', 'e', 'g', 's', 3, 'r', 'e', 'n', 4, 'r', 'e', 'n', 'j', 4, 'r', 'e', 'n', 'h',\n3, 'r', 'e', 'd', 3, 'r', 'e', 'l', 4, 'r', 'e', 'l', 'g', 4, 'r', 'e', 'l', 'm', 4, 'r', 'e', 'l', 'b', 4, 'r', 'e', 'l', 's',\n4, 'r', 'e', 'l', 't', 4, 'r', 'e', 'l', 'p', 4, 'r', 'e', 'l', 'h', 3, 'r', 'e', 'm', 3, 'r', 'e', 'b', 4, 'r', 'e', 'b', 's',\n3, 'r', 'e', 's', 4, 'r', 'e', 's', 's', 4, 'r', 'e', 'n', 'g', 3, 'r', 'e', 'j', 3, 'r', 'e', 'c', 3, 'r', 'e', 'k',\n3, 'r', 'e', 't', 3, 'r', 'e', 'p', 3, 'r', 'e', 'h', 4, 'r', 'y', 'e', 'o', 5, 'r', 'y', 'e', 'o', 'g', 6, 'r', 'y', 'e', 'o', 'g', 'g',\n6, 'r', 'y', 'e', 'o', 'g', 's', 5, 'r', 'y', 'e', 'o', 'n', 6, 'r', 'y', 'e', 'o', 'n', 'j', 6, 'r', 'y', 'e', 'o', 'n', 'h', 5, 'r', 'y', 'e', 'o', 'd', 5, 'r', 'y', 'e', 'o', 'l',\n6, 'r', 'y', 'e', 'o', 'l', 'g', 6, 'r', 'y', 'e', 'o', 'l', 'm', 6, 'r', 'y', 'e', 'o', 'l', 'b', 6, 'r', 'y', 'e', 'o', 'l', 's', 6, 'r', 'y', 'e', 'o', 'l', 't', 6, 'r', 'y', 'e', 'o', 'l', 'p',\n6, 'r', 'y', 'e', 'o', 'l', 'h', 5, 'r', 'y', 'e', 'o', 'm', 5, 'r', 'y', 'e', 'o', 'b', 6, 'r', 'y', 'e', 'o', 'b', 's', 5, 'r', 'y', 'e', 'o', 's', 6, 'r', 'y', 'e', 'o', 's', 's',\n6, 'r', 'y', 'e', 'o', 'n', 'g', 5, 'r', 'y', 'e', 'o', 'j', 5, 'r', 'y', 'e', 'o', 'c', 5, 'r', 'y', 'e', 'o', 'k', 5, 'r', 'y', 'e', 'o', 't', 5, 'r', 'y', 'e', 'o', 'p',\n5, 'r', 'y', 'e', 'o', 'h', 3, 'r', 'y', 'e', 4, 'r', 'y', 'e', 'g', 5, 'r', 'y', 'e', 'g', 'g', 5, 'r', 'y', 'e', 'g', 's', 4, 'r', 'y', 'e', 'n',\n5, 'r', 'y', 'e', 'n', 'j', 5, 'r', 'y', 'e', 'n', 'h', 4, 'r', 'y', 'e', 'd', 4, 'r', 'y', 'e', 'l', 5, 'r', 'y', 'e', 'l', 'g', 5, 'r', 'y', 'e', 'l', 'm',\n5, 'r', 'y', 'e', 'l', 'b', 5, 'r', 'y', 'e', 'l', 's', 5, 'r', 'y', 'e', 'l', 't', 5, 'r', 'y', 'e', 'l', 'p', 5, 'r', 'y', 'e', 'l', 'h', 4, 'r', 'y', 'e', 'm',\n4, 'r', 'y', 'e', 'b', 5, 'r', 'y', 'e', 'b', 's', 4, 'r', 'y', 'e', 's', 5, 'r', 'y', 'e', 's', 's', 5, 'r', 'y', 'e', 'n', 'g', 4, 'r', 'y', 'e', 'j',\n4, 'r', 'y', 'e', 'c', 4, 'r', 'y', 'e', 'k', 4, 'r', 'y', 'e', 't', 4, 'r', 'y', 'e', 'p', 4, 'r', 'y', 'e', 'h', 2, 'r', 'o',\n3, 'r', 'o', 'g', 4, 'r', 'o', 'g', 'g', 4, 'r', 'o', 'g', 's', 3, 'r', 'o', 'n', 4, 'r', 'o', 'n', 'j', 4, 'r', 'o', 'n', 'h',\n3, 'r', 'o', 'd', 3, 'r', 'o', 'l', 4, 'r', 'o', 'l', 'g', 4, 'r', 'o', 'l', 'm', 4, 'r', 'o', 'l', 'b', 4, 'r', 'o', 'l', 's',\n4, 'r', 'o', 'l', 't', 4, 'r', 'o', 'l', 'p', 4, 'r', 'o', 'l', 'h', 3, 'r', 'o', 'm', 3, 'r', 'o', 'b', 4, 'r', 'o', 'b', 's',\n3, 'r', 'o', 's', 4, 'r', 'o', 's', 's', 4, 'r', 'o', 'n', 'g', 3, 'r', 'o', 'j', 3, 'r', 'o', 'c', 3, 'r', 'o', 'k',\n3, 'r', 'o', 't', 3, 'r', 'o', 'p', 3, 'r', 'o', 'h', 3, 'r', 'w', 'a', 4, 'r', 'w', 'a', 'g', 5, 'r', 'w', 'a', 'g', 'g',\n5, 'r', 'w', 'a', 'g', 's', 4, 'r', 'w', 'a', 'n', 5, 'r', 'w', 'a', 'n', 'j', 5, 'r', 'w', 'a', 'n', 'h', 4, 'r', 'w', 'a', 'd', 4, 'r', 'w', 'a', 'l',\n5, 'r', 'w', 'a', 'l', 'g', 5, 'r', 'w', 'a', 'l', 'm', 5, 'r', 'w', 'a', 'l', 'b', 5, 'r', 'w', 'a', 'l', 's', 5, 'r', 'w', 'a', 'l', 't', 5, 'r', 'w', 'a', 'l', 'p',\n5, 'r', 'w', 'a', 'l', 'h', 4, 'r', 'w', 'a', 'm', 4, 'r', 'w', 'a', 'b', 5, 'r', 'w', 'a', 'b', 's', 4, 'r', 'w', 'a', 's', 5, 'r', 'w', 'a', 's', 's',\n5, 'r', 'w', 'a', 'n', 'g', 4, 'r', 'w', 'a', 'j', 4, 'r', 'w', 'a', 'c', 4, 'r', 'w', 'a', 'k', 4, 'r', 'w', 'a', 't', 4, 'r', 'w', 'a', 'p',\n4, 'r', 'w', 'a', 'h', 4, 'r', 'w', 'a', 'e', 5, 'r', 'w', 'a', 'e', 'g', 6, 'r', 'w', 'a', 'e', 'g', 'g', 6, 'r', 'w', 'a', 'e', 'g', 's', 5, 'r', 'w', 'a', 'e', 'n',\n6, 'r', 'w', 'a', 'e', 'n', 'j', 6, 'r', 'w', 'a', 'e', 'n', 'h', 5, 'r', 'w', 'a', 'e', 'd', 5, 'r', 'w', 'a', 'e', 'l', 6, 'r', 'w', 'a', 'e', 'l', 'g', 6, 'r', 'w', 'a', 'e', 'l', 'm',\n6, 'r', 'w', 'a', 'e', 'l', 'b', 6, 'r', 'w', 'a', 'e', 'l', 's', 6, 'r', 'w', 'a', 'e', 'l', 't', 6, 'r', 'w', 'a', 'e', 'l', 'p', 6, 'r', 'w', 'a', 'e', 'l', 'h', 5, 'r', 'w', 'a', 'e', 'm',\n5, 'r', 'w', 'a', 'e', 'b', 6, 'r', 'w', 'a', 'e', 'b', 's', 5, 'r', 'w', 'a', 'e', 's', 6, 'r', 'w', 'a', 'e', 's', 's', 6, 'r', 'w', 'a', 'e', 'n', 'g', 5, 'r', 'w', 'a', 'e', 'j',\n5, 'r', 'w', 'a', 'e', 'c', 5, 'r', 'w', 'a', 'e', 'k', 5, 'r', 'w', 'a', 'e', 't', 5, 'r', 'w', 'a', 'e', 'p', 5, 'r', 'w', 'a', 'e', 'h', 3, 'r', 'o', 'e',\n4, 'r', 'o', 'e', 'g', 5, 'r', 'o', 'e', 'g', 'g', 5, 'r', 'o', 'e', 'g', 's', 4, 'r', 'o', 'e', 'n', 5, 'r', 'o', 'e', 'n', 'j', 5, 'r', 'o', 'e', 'n', 'h',\n4, 'r', 'o', 'e', 'd', 4, 'r', 'o', 'e', 'l', 5, 'r', 'o', 'e', 'l', 'g', 5, 'r', 'o', 'e', 'l', 'm', 5, 'r', 'o', 'e', 'l', 'b', 5, 'r', 'o', 'e', 'l', 's',\n5, 'r', 'o', 'e', 'l', 't', 5, 'r', 'o', 'e', 'l', 'p', 5, 'r', 'o', 'e', 'l', 'h', 4, 'r', 'o', 'e', 'm', 4, 'r', 'o', 'e', 'b', 5, 'r', 'o', 'e', 'b', 's',\n4, 'r', 'o', 'e', 's', 5, 'r', 'o', 'e', 's', 's', 5, 'r', 'o', 'e', 'n', 'g', 4, 'r', 'o', 'e', 'j', 4, 'r', 'o', 'e', 'c', 4, 'r', 'o', 'e', 'k',\n4, 'r', 'o', 'e', 't', 4, 'r', 'o', 'e', 'p', 4, 'r', 'o', 'e', 'h', 3, 'r', 'y', 'o', 4, 'r', 'y', 'o', 'g', 5, 'r', 'y', 'o', 'g', 'g',\n5, 'r', 'y', 'o', 'g', 's', 4, 'r', 'y', 'o', 'n', 5, 'r', 'y', 'o', 'n', 'j', 5, 'r', 'y', 'o', 'n', 'h', 4, 'r', 'y', 'o', 'd', 4, 'r', 'y', 'o', 'l',\n5, 'r', 'y', 'o', 'l', 'g', 5, 'r', 'y', 'o', 'l', 'm', 5, 'r', 'y', 'o', 'l', 'b', 5, 'r', 'y', 'o', 'l', 's', 5, 'r', 'y', 'o', 'l', 't', 5, 'r', 'y', 'o', 'l', 'p',\n5, 'r', 'y', 'o', 'l', 'h', 4, 'r', 'y', 'o', 'm', 4, 'r', 'y', 'o', 'b', 5, 'r', 'y', 'o', 'b', 's', 4, 'r', 'y', 'o', 's', 5, 'r', 'y', 'o', 's', 's',\n5, 'r', 'y', 'o', 'n', 'g', 4, 'r', 'y', 'o', 'j', 4, 'r', 'y', 'o', 'c', 4, 'r', 'y', 'o', 'k', 4, 'r', 'y', 'o', 't', 4, 'r', 'y', 'o', 'p',\n4, 'r', 'y', 'o', 'h', 2, 'r', 'u', 3, 'r', 'u', 'g', 4, 'r', 'u', 'g', 'g', 4, 'r', 'u', 'g', 's', 3, 'r', 'u', 'n',\n4, 'r', 'u', 'n', 'j', 4, 'r', 'u', 'n', 'h', 3, 'r', 'u', 'd', 3, 'r', 'u', 'l', 4, 'r', 'u', 'l', 'g', 4, 'r', 'u', 'l', 'm',\n4, 'r', 'u', 'l', 'b', 4, 'r', 'u', 'l', 's', 4, 'r', 'u', 'l', 't', 4, 'r', 'u', 'l', 'p', 4, 'r', 'u', 'l', 'h', 3, 'r', 'u', 'm',\n3, 'r', 'u', 'b', 4, 'r', 'u', 'b', 's', 3, 'r', 'u', 's', 4, 'r', 'u', 's', 's', 4, 'r', 'u', 'n', 'g', 3, 'r', 'u', 'j',\n3, 'r', 'u', 'c', 3, 'r', 'u', 'k', 3, 'r', 'u', 't', 3, 'r', 'u', 'p', 3, 'r', 'u', 'h', 4, 'r', 'w', 'e', 'o',\n5, 'r', 'w', 'e', 'o', 'g', 6, 'r', 'w', 'e', 'o', 'g', 'g', 6, 'r', 'w', 'e', 'o', 'g', 's', 5, 'r', 'w', 'e', 'o', 'n', 6, 'r', 'w', 'e', 'o', 'n', 'j', 6, 'r', 'w', 'e', 'o', 'n', 'h',\n5, 'r', 'w', 'e', 'o', 'd', 5, 'r', 'w', 'e', 'o', 'l', 6, 'r', 'w', 'e', 'o', 'l', 'g', 6, 'r', 'w', 'e', 'o', 'l', 'm', 6, 'r', 'w', 'e', 'o', 'l', 'b', 6, 'r', 'w', 'e', 'o', 'l', 's',\n6, 'r', 'w', 'e', 'o', 'l', 't', 6, 'r', 'w', 'e', 'o', 'l', 'p', 6, 'r', 'w', 'e', 'o', 'l', 'h', 5, 'r', 'w', 'e', 'o', 'm', 5, 'r', 'w', 'e', 'o', 'b', 6, 'r', 'w', 'e', 'o', 'b', 's',\n5, 'r', 'w', 'e', 'o', 's', 6, 'r', 'w', 'e', 'o', 's', 's', 6, 'r', 'w', 'e', 'o', 'n', 'g', 5, 'r', 'w', 'e', 'o', 'j', 5, 'r', 'w', 'e', 'o', 'c', 5, 'r', 'w', 'e', 'o', 'k',\n5, 'r', 'w', 'e', 'o', 't', 5, 'r', 'w', 'e', 'o', 'p', 5, 'r', 'w', 'e', 'o', 'h', 3, 'r', 'w', 'e', 4, 'r', 'w', 'e', 'g', 5, 'r', 'w', 'e', 'g', 'g',\n5, 'r', 'w', 'e', 'g', 's', 4, 'r', 'w', 'e', 'n', 5, 'r', 'w', 'e', 'n', 'j', 5, 'r', 'w', 'e', 'n', 'h', 4, 'r', 'w', 'e', 'd', 4, 'r', 'w', 'e', 'l',\n5, 'r', 'w', 'e', 'l', 'g', 5, 'r', 'w', 'e', 'l', 'm', 5, 'r', 'w', 'e', 'l', 'b', 5, 'r', 'w', 'e', 'l', 's', 5, 'r', 'w', 'e', 'l', 't', 5, 'r', 'w', 'e', 'l', 'p',\n5, 'r', 'w', 'e', 'l', 'h', 4, 'r', 'w', 'e', 'm', 4, 'r', 'w', 'e', 'b', 5, 'r', 'w', 'e', 'b', 's', 4, 'r', 'w', 'e', 's', 5, 'r', 'w', 'e', 's', 's',\n5, 'r', 'w', 'e', 'n', 'g', 4, 'r', 'w', 'e', 'j', 4, 'r', 'w', 'e', 'c', 4, 'r', 'w', 'e', 'k', 4, 'r', 'w', 'e', 't', 4, 'r', 'w', 'e', 'p',\n4, 'r', 'w', 'e', 'h', 3, 'r', 'w', 'i', 4, 'r', 'w', 'i', 'g', 5, 'r', 'w', 'i', 'g', 'g', 5, 'r', 'w', 'i', 'g', 's', 4, 'r', 'w', 'i', 'n',\n5, 'r', 'w', 'i', 'n', 'j', 5, 'r', 'w', 'i', 'n', 'h', 4, 'r', 'w', 'i', 'd', 4, 'r', 'w', 'i', 'l', 5, 'r', 'w', 'i', 'l', 'g', 5, 'r', 'w', 'i', 'l', 'm',\n5, 'r', 'w', 'i', 'l', 'b', 5, 'r', 'w', 'i', 'l', 's', 5, 'r', 'w', 'i', 'l', 't', 5, 'r', 'w', 'i', 'l', 'p', 5, 'r', 'w', 'i', 'l', 'h', 4, 'r', 'w', 'i', 'm',\n4, 'r', 'w', 'i', 'b', 5, 'r', 'w', 'i', 'b', 's', 4, 'r', 'w', 'i', 's', 5, 'r', 'w', 'i', 's', 's', 5, 'r', 'w', 'i', 'n', 'g', 4, 'r', 'w', 'i', 'j',\n4, 'r', 'w', 'i', 'c', 4, 'r', 'w', 'i', 'k', 4, 'r', 'w', 'i', 't', 4, 'r', 'w', 'i', 'p', 4, 'r', 'w', 'i', 'h', 3, 'r', 'y', 'u',\n4, 'r', 'y', 'u', 'g', 5, 'r', 'y', 'u', 'g', 'g', 5, 'r', 'y', 'u', 'g', 's', 4, 'r', 'y', 'u', 'n', 5, 'r', 'y', 'u', 'n', 'j', 5, 'r', 'y', 'u', 'n', 'h',\n4, 'r', 'y', 'u', 'd', 4, 'r', 'y', 'u', 'l', 5, 'r', 'y', 'u', 'l', 'g', 5, 'r', 'y', 'u', 'l', 'm', 5, 'r', 'y', 'u', 'l', 'b', 5, 'r', 'y', 'u', 'l', 's',\n5, 'r', 'y', 'u', 'l', 't', 5, 'r', 'y', 'u', 'l', 'p', 5, 'r', 'y', 'u', 'l', 'h', 4, 'r', 'y', 'u', 'm', 4, 'r', 'y', 'u', 'b', 5, 'r', 'y', 'u', 'b', 's',\n4, 'r', 'y', 'u', 's', 5, 'r', 'y', 'u', 's', 's', 5, 'r', 'y', 'u', 'n', 'g', 4, 'r', 'y', 'u', 'j', 4, 'r', 'y', 'u', 'c', 4, 'r', 'y', 'u', 'k',\n4, 'r', 'y', 'u', 't', 4, 'r', 'y', 'u', 'p', 4, 'r', 'y', 'u', 'h', 3, 'r', 'e', 'u', 4, 'r', 'e', 'u', 'g', 5, 'r', 'e', 'u', 'g', 'g',\n5, 'r', 'e', 'u', 'g', 's', 4, 'r', 'e', 'u', 'n', 5, 'r', 'e', 'u', 'n', 'j', 5, 'r', 'e', 'u', 'n', 'h', 4, 'r', 'e', 'u', 'd', 4, 'r', 'e', 'u', 'l',\n5, 'r', 'e', 'u', 'l', 'g', 5, 'r', 'e', 'u', 'l', 'm', 5, 'r', 'e', 'u', 'l', 'b', 5, 'r', 'e', 'u', 'l', 's', 5, 'r', 'e', 'u', 'l', 't', 5, 'r', 'e', 'u', 'l', 'p',\n5, 'r', 'e', 'u', 'l', 'h', 4, 'r', 'e', 'u', 'm', 4, 'r', 'e', 'u', 'b', 5, 'r', 'e', 'u', 'b', 's', 4, 'r', 'e', 'u', 's', 5, 'r', 'e', 'u', 's', 's',\n5, 'r', 'e', 'u', 'n', 'g', 4, 'r', 'e', 'u', 'j', 4, 'r', 'e', 'u', 'c', 4, 'r', 'e', 'u', 'k', 4, 'r', 'e', 'u', 't', 4, 'r', 'e', 'u', 'p',\n4, 'r', 'e', 'u', 'h', 3, 'r', 'y', 'i', 4, 'r', 'y', 'i', 'g', 5, 'r', 'y', 'i', 'g', 'g', 5, 'r', 'y', 'i', 'g', 's', 4, 'r', 'y', 'i', 'n',\n5, 'r', 'y', 'i', 'n', 'j', 5, 'r', 'y', 'i', 'n', 'h', 4, 'r', 'y', 'i', 'd', 4, 'r', 'y', 'i', 'l', 5, 'r', 'y', 'i', 'l', 'g', 5, 'r', 'y', 'i', 'l', 'm',\n5, 'r', 'y', 'i', 'l', 'b', 5, 'r', 'y', 'i', 'l', 's', 5, 'r', 'y', 'i', 'l', 't', 5, 'r', 'y', 'i', 'l', 'p', 5, 'r', 'y', 'i', 'l', 'h', 4, 'r', 'y', 'i', 'm',\n4, 'r', 'y', 'i', 'b', 5, 'r', 'y', 'i', 'b', 's', 4, 'r', 'y', 'i', 's', 5, 'r', 'y', 'i', 's', 's', 5, 'r', 'y', 'i', 'n', 'g', 4, 'r', 'y', 'i', 'j',\n4, 'r', 'y', 'i', 'c', 4, 'r', 'y', 'i', 'k', 4, 'r', 'y', 'i', 't', 4, 'r', 'y', 'i', 'p', 4, 'r', 'y', 'i', 'h', 2, 'r', 'i',\n3, 'r', 'i', 'g', 4, 'r', 'i', 'g', 'g', 4, 'r', 'i', 'g', 's', 3, 'r', 'i', 'n', 4, 'r', 'i', 'n', 'j', 4, 'r', 'i', 'n', 'h',\n3, 'r', 'i', 'd', 3, 'r', 'i', 'l', 4, 'r', 'i', 'l', 'g', 4, 'r', 'i', 'l', 'm', 4, 'r', 'i', 'l', 'b', 4, 'r', 'i', 'l', 's',\n4, 'r', 'i', 'l', 't', 4, 'r', 'i', 'l', 'p', 4, 'r', 'i', 'l', 'h', 3, 'r', 'i', 'm', 3, 'r', 'i', 'b', 4, 'r', 'i', 'b', 's',\n3, 'r', 'i', 's', 4, 'r', 'i', 's', 's', 4, 'r', 'i', 'n', 'g', 3, 'r', 'i', 'j', 3, 'r', 'i', 'c', 3, 'r', 'i', 'k',\n3, 'r', 'i', 't', 3, 'r', 'i', 'p', 3, 'r', 'i', 'h', 2, 'm', 'a', 3, 'm', 'a', 'g', 4, 'm', 'a', 'g', 'g',\n4, 'm', 'a', 'g', 's', 3, 'm', 'a', 'n', 4, 'm', 'a', 'n', 'j', 4, 'm', 'a', 'n', 'h', 3, 'm', 'a', 'd', 3, 'm', 'a', 'l',\n4, 'm', 'a', 'l', 'g', 4, 'm', 'a', 'l', 'm', 4, 'm', 'a', 'l', 'b', 4, 'm', 'a', 'l', 's', 4, 'm', 'a', 'l', 't', 4, 'm', 'a', 'l', 'p',\n4, 'm', 'a', 'l', 'h', 3, 'm', 'a', 'm', 3, 'm', 'a', 'b', 4, 'm', 'a', 'b', 's', 3, 'm', 'a', 's', 4, 'm', 'a', 's', 's',\n4, 'm', 'a', 'n', 'g', 3, 'm', 'a', 'j', 3, 'm', 'a', 'c', 3, 'm', 'a', 'k', 3, 'm', 'a', 't', 3, 'm', 'a', 'p',\n3, 'm', 'a', 'h', 3, 'm', 'a', 'e', 4, 'm', 'a', 'e', 'g', 5, 'm', 'a', 'e', 'g', 'g', 5, 'm', 'a', 'e', 'g', 's', 4, 'm', 'a', 'e', 'n',\n5, 'm', 'a', 'e', 'n', 'j', 5, 'm', 'a', 'e', 'n', 'h', 4, 'm', 'a', 'e', 'd', 4, 'm', 'a', 'e', 'l', 5, 'm', 'a', 'e', 'l', 'g', 5, 'm', 'a', 'e', 'l', 'm',\n5, 'm', 'a', 'e', 'l', 'b', 5, 'm', 'a', 'e', 'l', 's', 5, 'm', 'a', 'e', 'l', 't', 5, 'm', 'a', 'e', 'l', 'p', 5, 'm', 'a', 'e', 'l', 'h', 4, 'm', 'a', 'e', 'm',\n4, 'm', 'a', 'e', 'b', 5, 'm', 'a', 'e', 'b', 's', 4, 'm', 'a', 'e', 's', 5, 'm', 'a', 'e', 's', 's', 5, 'm', 'a', 'e', 'n', 'g', 4, 'm', 'a', 'e', 'j',\n4, 'm', 'a', 'e', 'c', 4, 'm', 'a', 'e', 'k', 4, 'm', 'a', 'e', 't', 4, 'm', 'a', 'e', 'p', 4, 'm', 'a', 'e', 'h', 3, 'm', 'y', 'a',\n4, 'm', 'y', 'a', 'g', 5, 'm', 'y', 'a', 'g', 'g', 5, 'm', 'y', 'a', 'g', 's', 4, 'm', 'y', 'a', 'n', 5, 'm', 'y', 'a', 'n', 'j', 5, 'm', 'y', 'a', 'n', 'h',\n4, 'm', 'y', 'a', 'd', 4, 'm', 'y', 'a', 'l', 5, 'm', 'y', 'a', 'l', 'g', 5, 'm', 'y', 'a', 'l', 'm', 5, 'm', 'y', 'a', 'l', 'b', 5, 'm', 'y', 'a', 'l', 's',\n5, 'm', 'y', 'a', 'l', 't', 5, 'm', 'y', 'a', 'l', 'p', 5, 'm', 'y', 'a', 'l', 'h', 4, 'm', 'y', 'a', 'm', 4, 'm', 'y', 'a', 'b', 5, 'm', 'y', 'a', 'b', 's',\n4, 'm', 'y', 'a', 's', 5, 'm', 'y', 'a', 's', 's', 5, 'm', 'y', 'a', 'n', 'g', 4, 'm', 'y', 'a', 'j', 4, 'm', 'y', 'a', 'c', 4, 'm', 'y', 'a', 'k',\n4, 'm', 'y', 'a', 't', 4, 'm', 'y', 'a', 'p', 4, 'm', 'y', 'a', 'h', 4, 'm', 'y', 'a', 'e', 5, 'm', 'y', 'a', 'e', 'g', 6, 'm', 'y', 'a', 'e', 'g', 'g',\n6, 'm', 'y', 'a', 'e', 'g', 's', 5, 'm', 'y', 'a', 'e', 'n', 6, 'm', 'y', 'a', 'e', 'n', 'j', 6, 'm', 'y', 'a', 'e', 'n', 'h', 5, 'm', 'y', 'a', 'e', 'd', 5, 'm', 'y', 'a', 'e', 'l',\n6, 'm', 'y', 'a', 'e', 'l', 'g', 6, 'm', 'y', 'a', 'e', 'l', 'm', 6, 'm', 'y', 'a', 'e', 'l', 'b', 6, 'm', 'y', 'a', 'e', 'l', 's', 6, 'm', 'y', 'a', 'e', 'l', 't', 6, 'm', 'y', 'a', 'e', 'l', 'p',\n6, 'm', 'y', 'a', 'e', 'l', 'h', 5, 'm', 'y', 'a', 'e', 'm', 5, 'm', 'y', 'a', 'e', 'b', 6, 'm', 'y', 'a', 'e', 'b', 's', 5, 'm', 'y', 'a', 'e', 's', 6, 'm', 'y', 'a', 'e', 's', 's',\n6, 'm', 'y', 'a', 'e', 'n', 'g', 5, 'm', 'y', 'a', 'e', 'j', 5, 'm', 'y', 'a', 'e', 'c', 5, 'm', 'y', 'a', 'e', 'k', 5, 'm', 'y', 'a', 'e', 't', 5, 'm', 'y', 'a', 'e', 'p',\n5, 'm', 'y', 'a', 'e', 'h', 3, 'm', 'e', 'o', 4, 'm', 'e', 'o', 'g', 5, 'm', 'e', 'o', 'g', 'g', 5, 'm', 'e', 'o', 'g', 's', 4, 'm', 'e', 'o', 'n',\n5, 'm', 'e', 'o', 'n', 'j', 5, 'm', 'e', 'o', 'n', 'h', 4, 'm', 'e', 'o', 'd', 4, 'm', 'e', 'o', 'l', 5, 'm', 'e', 'o', 'l', 'g', 5, 'm', 'e', 'o', 'l', 'm',\n5, 'm', 'e', 'o', 'l', 'b', 5, 'm', 'e', 'o', 'l', 's', 5, 'm', 'e', 'o', 'l', 't', 5, 'm', 'e', 'o', 'l', 'p', 5, 'm', 'e', 'o', 'l', 'h', 4, 'm', 'e', 'o', 'm',\n4, 'm', 'e', 'o', 'b', 5, 'm', 'e', 'o', 'b', 's', 4, 'm', 'e', 'o', 's', 5, 'm', 'e', 'o', 's', 's', 5, 'm', 'e', 'o', 'n', 'g', 4, 'm', 'e', 'o', 'j',\n4, 'm', 'e', 'o', 'c', 4, 'm', 'e', 'o', 'k', 4, 'm', 'e', 'o', 't', 4, 'm', 'e', 'o', 'p', 4, 'm', 'e', 'o', 'h', 2, 'm', 'e',\n3, 'm', 'e', 'g', 4, 'm', 'e', 'g', 'g', 4, 'm', 'e', 'g', 's', 3, 'm', 'e', 'n', 4, 'm', 'e', 'n', 'j', 4, 'm', 'e', 'n', 'h',\n3, 'm', 'e', 'd', 3, 'm', 'e', 'l', 4, 'm', 'e', 'l', 'g', 4, 'm', 'e', 'l', 'm', 4, 'm', 'e', 'l', 'b', 4, 'm', 'e', 'l', 's',\n4, 'm', 'e', 'l', 't', 4, 'm', 'e', 'l', 'p', 4, 'm', 'e', 'l', 'h', 3, 'm', 'e', 'm', 3, 'm', 'e', 'b', 4, 'm', 'e', 'b', 's',\n3, 'm', 'e', 's', 4, 'm', 'e', 's', 's', 4, 'm', 'e', 'n', 'g', 3, 'm', 'e', 'j', 3, 'm', 'e', 'c', 3, 'm', 'e', 'k',\n3, 'm', 'e', 't', 3, 'm', 'e', 'p', 3, 'm', 'e', 'h', 4, 'm', 'y', 'e', 'o', 5, 'm', 'y', 'e', 'o', 'g', 6, 'm', 'y', 'e', 'o', 'g', 'g',\n6, 'm', 'y', 'e', 'o', 'g', 's', 5, 'm', 'y', 'e', 'o', 'n', 6, 'm', 'y', 'e', 'o', 'n', 'j', 6, 'm', 'y', 'e', 'o', 'n', 'h', 5, 'm', 'y', 'e', 'o', 'd', 5, 'm', 'y', 'e', 'o', 'l',\n6, 'm', 'y', 'e', 'o', 'l', 'g', 6, 'm', 'y', 'e', 'o', 'l', 'm', 6, 'm', 'y', 'e', 'o', 'l', 'b', 6, 'm', 'y', 'e', 'o', 'l', 's', 6, 'm', 'y', 'e', 'o', 'l', 't', 6, 'm', 'y', 'e', 'o', 'l', 'p',\n6, 'm', 'y', 'e', 'o', 'l', 'h', 5, 'm', 'y', 'e', 'o', 'm', 5, 'm', 'y', 'e', 'o', 'b', 6, 'm', 'y', 'e', 'o', 'b', 's', 5, 'm', 'y', 'e', 'o', 's', 6, 'm', 'y', 'e', 'o', 's', 's',\n6, 'm', 'y', 'e', 'o', 'n', 'g', 5, 'm', 'y', 'e', 'o', 'j', 5, 'm', 'y', 'e', 'o', 'c', 5, 'm', 'y', 'e', 'o', 'k', 5, 'm', 'y', 'e', 'o', 't', 5, 'm', 'y', 'e', 'o', 'p',\n5, 'm', 'y', 'e', 'o', 'h', 3, 'm', 'y', 'e', 4, 'm', 'y', 'e', 'g', 5, 'm', 'y', 'e', 'g', 'g', 5, 'm', 'y', 'e', 'g', 's', 4, 'm', 'y', 'e', 'n',\n5, 'm', 'y', 'e', 'n', 'j', 5, 'm', 'y', 'e', 'n', 'h', 4, 'm', 'y', 'e', 'd', 4, 'm', 'y', 'e', 'l', 5, 'm', 'y', 'e', 'l', 'g', 5, 'm', 'y', 'e', 'l', 'm',\n5, 'm', 'y', 'e', 'l', 'b', 5, 'm', 'y', 'e', 'l', 's', 5, 'm', 'y', 'e', 'l', 't', 5, 'm', 'y', 'e', 'l', 'p', 5, 'm', 'y', 'e', 'l', 'h', 4, 'm', 'y', 'e', 'm',\n4, 'm', 'y', 'e', 'b', 5, 'm', 'y', 'e', 'b', 's', 4, 'm', 'y', 'e', 's', 5, 'm', 'y', 'e', 's', 's', 5, 'm', 'y', 'e', 'n', 'g', 4, 'm', 'y', 'e', 'j',\n4, 'm', 'y', 'e', 'c', 4, 'm', 'y', 'e', 'k', 4, 'm', 'y', 'e', 't', 4, 'm', 'y', 'e', 'p', 4, 'm', 'y', 'e', 'h', 2, 'm', 'o',\n3, 'm', 'o', 'g', 4, 'm', 'o', 'g', 'g', 4, 'm', 'o', 'g', 's', 3, 'm', 'o', 'n', 4, 'm', 'o', 'n', 'j', 4, 'm', 'o', 'n', 'h',\n3, 'm', 'o', 'd', 3, 'm', 'o', 'l', 4, 'm', 'o', 'l', 'g', 4, 'm', 'o', 'l', 'm', 4, 'm', 'o', 'l', 'b', 4, 'm', 'o', 'l', 's',\n4, 'm', 'o', 'l', 't', 4, 'm', 'o', 'l', 'p', 4, 'm', 'o', 'l', 'h', 3, 'm', 'o', 'm', 3, 'm', 'o', 'b', 4, 'm', 'o', 'b', 's',\n3, 'm', 'o', 's', 4, 'm', 'o', 's', 's', 4, 'm', 'o', 'n', 'g', 3, 'm', 'o', 'j', 3, 'm', 'o', 'c', 3, 'm', 'o', 'k',\n3, 'm', 'o', 't', 3, 'm', 'o', 'p', 3, 'm', 'o', 'h', 3, 'm', 'w', 'a', 4, 'm', 'w', 'a', 'g', 5, 'm', 'w', 'a', 'g', 'g',\n5, 'm', 'w', 'a', 'g', 's', 4, 'm', 'w', 'a', 'n', 5, 'm', 'w', 'a', 'n', 'j', 5, 'm', 'w', 'a', 'n', 'h', 4, 'm', 'w', 'a', 'd', 4, 'm', 'w', 'a', 'l',\n5, 'm', 'w', 'a', 'l', 'g', 5, 'm', 'w', 'a', 'l', 'm', 5, 'm', 'w', 'a', 'l', 'b', 5, 'm', 'w', 'a', 'l', 's', 5, 'm', 'w', 'a', 'l', 't', 5, 'm', 'w', 'a', 'l', 'p',\n5, 'm', 'w', 'a', 'l', 'h', 4, 'm', 'w', 'a', 'm', 4, 'm', 'w', 'a', 'b', 5, 'm', 'w', 'a', 'b', 's', 4, 'm', 'w', 'a', 's', 5, 'm', 'w', 'a', 's', 's',\n5, 'm', 'w', 'a', 'n', 'g', 4, 'm', 'w', 'a', 'j', 4, 'm', 'w', 'a', 'c', 4, 'm', 'w', 'a', 'k', 4, 'm', 'w', 'a', 't', 4, 'm', 'w', 'a', 'p',\n4, 'm', 'w', 'a', 'h', 4, 'm', 'w', 'a', 'e', 5, 'm', 'w', 'a', 'e', 'g', 6, 'm', 'w', 'a', 'e', 'g', 'g', 6, 'm', 'w', 'a', 'e', 'g', 's', 5, 'm', 'w', 'a', 'e', 'n',\n6, 'm', 'w', 'a', 'e', 'n', 'j', 6, 'm', 'w', 'a', 'e', 'n', 'h', 5, 'm', 'w', 'a', 'e', 'd', 5, 'm', 'w', 'a', 'e', 'l', 6, 'm', 'w', 'a', 'e', 'l', 'g', 6, 'm', 'w', 'a', 'e', 'l', 'm',\n6, 'm', 'w', 'a', 'e', 'l', 'b', 6, 'm', 'w', 'a', 'e', 'l', 's', 6, 'm', 'w', 'a', 'e', 'l', 't', 6, 'm', 'w', 'a', 'e', 'l', 'p', 6, 'm', 'w', 'a', 'e', 'l', 'h', 5, 'm', 'w', 'a', 'e', 'm',\n5, 'm', 'w', 'a', 'e', 'b', 6, 'm', 'w', 'a', 'e', 'b', 's', 5, 'm', 'w', 'a', 'e', 's', 6, 'm', 'w', 'a', 'e', 's', 's', 6, 'm', 'w', 'a', 'e', 'n', 'g', 5, 'm', 'w', 'a', 'e', 'j',\n5, 'm', 'w', 'a', 'e', 'c', 5, 'm', 'w', 'a', 'e', 'k', 5, 'm', 'w', 'a', 'e', 't', 5, 'm', 'w', 'a', 'e', 'p', 5, 'm', 'w', 'a', 'e', 'h', 3, 'm', 'o', 'e',\n4, 'm', 'o', 'e', 'g', 5, 'm', 'o', 'e', 'g', 'g', 5, 'm', 'o', 'e', 'g', 's', 4, 'm', 'o', 'e', 'n', 5, 'm', 'o', 'e', 'n', 'j', 5, 'm', 'o', 'e', 'n', 'h',\n4, 'm', 'o', 'e', 'd', 4, 'm', 'o', 'e', 'l', 5, 'm', 'o', 'e', 'l', 'g', 5, 'm', 'o', 'e', 'l', 'm', 5, 'm', 'o', 'e', 'l', 'b', 5, 'm', 'o', 'e', 'l', 's',\n5, 'm', 'o', 'e', 'l', 't', 5, 'm', 'o', 'e', 'l', 'p', 5, 'm', 'o', 'e', 'l', 'h', 4, 'm', 'o', 'e', 'm', 4, 'm', 'o', 'e', 'b', 5, 'm', 'o', 'e', 'b', 's',\n4, 'm', 'o', 'e', 's', 5, 'm', 'o', 'e', 's', 's', 5, 'm', 'o', 'e', 'n', 'g', 4, 'm', 'o', 'e', 'j', 4, 'm', 'o', 'e', 'c', 4, 'm', 'o', 'e', 'k',\n4, 'm', 'o', 'e', 't', 4, 'm', 'o', 'e', 'p', 4, 'm', 'o', 'e', 'h', 3, 'm', 'y', 'o', 4, 'm', 'y', 'o', 'g', 5, 'm', 'y', 'o', 'g', 'g',\n5, 'm', 'y', 'o', 'g', 's', 4, 'm', 'y', 'o', 'n', 5, 'm', 'y', 'o', 'n', 'j', 5, 'm', 'y', 'o', 'n', 'h', 4, 'm', 'y', 'o', 'd', 4, 'm', 'y', 'o', 'l',\n5, 'm', 'y', 'o', 'l', 'g', 5, 'm', 'y', 'o', 'l', 'm', 5, 'm', 'y', 'o', 'l', 'b', 5, 'm', 'y', 'o', 'l', 's', 5, 'm', 'y', 'o', 'l', 't', 5, 'm', 'y', 'o', 'l', 'p',\n5, 'm', 'y', 'o', 'l', 'h', 4, 'm', 'y', 'o', 'm', 4, 'm', 'y', 'o', 'b', 5, 'm', 'y', 'o', 'b', 's', 4, 'm', 'y', 'o', 's', 5, 'm', 'y', 'o', 's', 's',\n5, 'm', 'y', 'o', 'n', 'g', 4, 'm', 'y', 'o', 'j', 4, 'm', 'y', 'o', 'c', 4, 'm', 'y', 'o', 'k', 4, 'm', 'y', 'o', 't', 4, 'm', 'y', 'o', 'p',\n4, 'm', 'y', 'o', 'h', 2, 'm', 'u', 3, 'm', 'u', 'g', 4, 'm', 'u', 'g', 'g', 4, 'm', 'u', 'g', 's', 3, 'm', 'u', 'n',\n4, 'm', 'u', 'n', 'j', 4, 'm', 'u', 'n', 'h', 3, 'm', 'u', 'd', 3, 'm', 'u', 'l', 4, 'm', 'u', 'l', 'g', 4, 'm', 'u', 'l', 'm',\n4, 'm', 'u', 'l', 'b', 4, 'm', 'u', 'l', 's', 4, 'm', 'u', 'l', 't', 4, 'm', 'u', 'l', 'p', 4, 'm', 'u', 'l', 'h', 3, 'm', 'u', 'm',\n3, 'm', 'u', 'b', 4, 'm', 'u', 'b', 's', 3, 'm', 'u', 's', 4, 'm', 'u', 's', 's', 4, 'm', 'u', 'n', 'g', 3, 'm', 'u', 'j',\n3, 'm', 'u', 'c', 3, 'm', 'u', 'k', 3, 'm', 'u', 't', 3, 'm', 'u', 'p', 3, 'm', 'u', 'h', 4, 'm', 'w', 'e', 'o',\n5, 'm', 'w', 'e', 'o', 'g', 6, 'm', 'w', 'e', 'o', 'g', 'g', 6, 'm', 'w', 'e', 'o', 'g', 's', 5, 'm', 'w', 'e', 'o', 'n', 6, 'm', 'w', 'e', 'o', 'n', 'j', 6, 'm', 'w', 'e', 'o', 'n', 'h',\n5, 'm', 'w', 'e', 'o', 'd', 5, 'm', 'w', 'e', 'o', 'l', 6, 'm', 'w', 'e', 'o', 'l', 'g', 6, 'm', 'w', 'e', 'o', 'l', 'm', 6, 'm', 'w', 'e', 'o', 'l', 'b', 6, 'm', 'w', 'e', 'o', 'l', 's',\n6, 'm', 'w', 'e', 'o', 'l', 't', 6, 'm', 'w', 'e', 'o', 'l', 'p', 6, 'm', 'w', 'e', 'o', 'l', 'h', 5, 'm', 'w', 'e', 'o', 'm', 5, 'm', 'w', 'e', 'o', 'b', 6, 'm', 'w', 'e', 'o', 'b', 's',\n5, 'm', 'w', 'e', 'o', 's', 6, 'm', 'w', 'e', 'o', 's', 's', 6, 'm', 'w', 'e', 'o', 'n', 'g', 5, 'm', 'w', 'e', 'o', 'j', 5, 'm', 'w', 'e', 'o', 'c', 5, 'm', 'w', 'e', 'o', 'k',\n5, 'm', 'w', 'e', 'o', 't', 5, 'm', 'w', 'e', 'o', 'p', 5, 'm', 'w', 'e', 'o', 'h', 3, 'm', 'w', 'e', 4, 'm', 'w', 'e', 'g', 5, 'm', 'w', 'e', 'g', 'g',\n5, 'm', 'w', 'e', 'g', 's', 4, 'm', 'w', 'e', 'n', 5, 'm', 'w', 'e', 'n', 'j', 5, 'm', 'w', 'e', 'n', 'h', 4, 'm', 'w', 'e', 'd', 4, 'm', 'w', 'e', 'l',\n5, 'm', 'w', 'e', 'l', 'g', 5, 'm', 'w', 'e', 'l', 'm', 5, 'm', 'w', 'e', 'l', 'b', 5, 'm', 'w', 'e', 'l', 's', 5, 'm', 'w', 'e', 'l', 't', 5, 'm', 'w', 'e', 'l', 'p',\n5, 'm', 'w', 'e', 'l', 'h', 4, 'm', 'w', 'e', 'm', 4, 'm', 'w', 'e', 'b', 5, 'm', 'w', 'e', 'b', 's', 4, 'm', 'w', 'e', 's', 5, 'm', 'w', 'e', 's', 's',\n5, 'm', 'w', 'e', 'n', 'g', 4, 'm', 'w', 'e', 'j', 4, 'm', 'w', 'e', 'c', 4, 'm', 'w', 'e', 'k', 4, 'm', 'w', 'e', 't', 4, 'm', 'w', 'e', 'p',\n4, 'm', 'w', 'e', 'h', 3, 'm', 'w', 'i', 4, 'm', 'w', 'i', 'g', 5, 'm', 'w', 'i', 'g', 'g', 5, 'm', 'w', 'i', 'g', 's', 4, 'm', 'w', 'i', 'n',\n5, 'm', 'w', 'i', 'n', 'j', 5, 'm', 'w', 'i', 'n', 'h', 4, 'm', 'w', 'i', 'd', 4, 'm', 'w', 'i', 'l', 5, 'm', 'w', 'i', 'l', 'g', 5, 'm', 'w', 'i', 'l', 'm',\n5, 'm', 'w', 'i', 'l', 'b', 5, 'm', 'w', 'i', 'l', 's', 5, 'm', 'w', 'i', 'l', 't', 5, 'm', 'w', 'i', 'l', 'p', 5, 'm', 'w', 'i', 'l', 'h', 4, 'm', 'w', 'i', 'm',\n4, 'm', 'w', 'i', 'b', 5, 'm', 'w', 'i', 'b', 's', 4, 'm', 'w', 'i', 's', 5, 'm', 'w', 'i', 's', 's', 5, 'm', 'w', 'i', 'n', 'g', 4, 'm', 'w', 'i', 'j',\n4, 'm', 'w', 'i', 'c', 4, 'm', 'w', 'i', 'k', 4, 'm', 'w', 'i', 't', 4, 'm', 'w', 'i', 'p', 4, 'm', 'w', 'i', 'h', 3, 'm', 'y', 'u',\n4, 'm', 'y', 'u', 'g', 5, 'm', 'y', 'u', 'g', 'g', 5, 'm', 'y', 'u', 'g', 's', 4, 'm', 'y', 'u', 'n', 5, 'm', 'y', 'u', 'n', 'j', 5, 'm', 'y', 'u', 'n', 'h',\n4, 'm', 'y', 'u', 'd', 4, 'm', 'y', 'u', 'l', 5, 'm', 'y', 'u', 'l', 'g', 5, 'm', 'y', 'u', 'l', 'm', 5, 'm', 'y', 'u', 'l', 'b', 5, 'm', 'y', 'u', 'l', 's',\n5, 'm', 'y', 'u', 'l', 't', 5, 'm', 'y', 'u', 'l', 'p', 5, 'm', 'y', 'u', 'l', 'h', 4, 'm', 'y', 'u', 'm', 4, 'm', 'y', 'u', 'b', 5, 'm', 'y', 'u', 'b', 's',\n4, 'm', 'y', 'u', 's', 5, 'm', 'y', 'u', 's', 's', 5, 'm', 'y', 'u', 'n', 'g', 4, 'm', 'y', 'u', 'j', 4, 'm', 'y', 'u', 'c', 4, 'm', 'y', 'u', 'k',\n4, 'm', 'y', 'u', 't', 4, 'm', 'y', 'u', 'p', 4, 'm', 'y', 'u', 'h', 3, 'm', 'e', 'u', 4, 'm', 'e', 'u', 'g', 5, 'm', 'e', 'u', 'g', 'g',\n5, 'm', 'e', 'u', 'g', 's', 4, 'm', 'e', 'u', 'n', 5, 'm', 'e', 'u', 'n', 'j', 5, 'm', 'e', 'u', 'n', 'h', 4, 'm', 'e', 'u', 'd', 4, 'm', 'e', 'u', 'l',\n5, 'm', 'e', 'u', 'l', 'g', 5, 'm', 'e', 'u', 'l', 'm', 5, 'm', 'e', 'u', 'l', 'b', 5, 'm', 'e', 'u', 'l', 's', 5, 'm', 'e', 'u', 'l', 't', 5, 'm', 'e', 'u', 'l', 'p',\n5, 'm', 'e', 'u', 'l', 'h', 4, 'm', 'e', 'u', 'm', 4, 'm', 'e', 'u', 'b', 5, 'm', 'e', 'u', 'b', 's', 4, 'm', 'e', 'u', 's', 5, 'm', 'e', 'u', 's', 's',\n5, 'm', 'e', 'u', 'n', 'g', 4, 'm', 'e', 'u', 'j', 4, 'm', 'e', 'u', 'c', 4, 'm', 'e', 'u', 'k', 4, 'm', 'e', 'u', 't', 4, 'm', 'e', 'u', 'p',\n4, 'm', 'e', 'u', 'h', 3, 'm', 'y', 'i', 4, 'm', 'y', 'i', 'g', 5, 'm', 'y', 'i', 'g', 'g', 5, 'm', 'y', 'i', 'g', 's', 4, 'm', 'y', 'i', 'n',\n5, 'm', 'y', 'i', 'n', 'j', 5, 'm', 'y', 'i', 'n', 'h', 4, 'm', 'y', 'i', 'd', 4, 'm', 'y', 'i', 'l', 5, 'm', 'y', 'i', 'l', 'g', 5, 'm', 'y', 'i', 'l', 'm',\n5, 'm', 'y', 'i', 'l', 'b', 5, 'm', 'y', 'i', 'l', 's', 5, 'm', 'y', 'i', 'l', 't', 5, 'm', 'y', 'i', 'l', 'p', 5, 'm', 'y', 'i', 'l', 'h', 4, 'm', 'y', 'i', 'm',\n4, 'm', 'y', 'i', 'b', 5, 'm', 'y', 'i', 'b', 's', 4, 'm', 'y', 'i', 's', 5, 'm', 'y', 'i', 's', 's', 5, 'm', 'y', 'i', 'n', 'g', 4, 'm', 'y', 'i', 'j',\n4, 'm', 'y', 'i', 'c', 4, 'm', 'y', 'i', 'k', 4, 'm', 'y', 'i', 't', 4, 'm', 'y', 'i', 'p', 4, 'm', 'y', 'i', 'h', 2, 'm', 'i',\n3, 'm', 'i', 'g', 4, 'm', 'i', 'g', 'g', 4, 'm', 'i', 'g', 's', 3, 'm', 'i', 'n', 4, 'm', 'i', 'n', 'j', 4, 'm', 'i', 'n', 'h',\n3, 'm', 'i', 'd', 3, 'm', 'i', 'l', 4, 'm', 'i', 'l', 'g', 4, 'm', 'i', 'l', 'm', 4, 'm', 'i', 'l', 'b', 4, 'm', 'i', 'l', 's',\n4, 'm', 'i', 'l', 't', 4, 'm', 'i', 'l', 'p', 4, 'm', 'i', 'l', 'h', 3, 'm', 'i', 'm', 3, 'm', 'i', 'b', 4, 'm', 'i', 'b', 's',\n3, 'm', 'i', 's', 4, 'm', 'i', 's', 's', 4, 'm', 'i', 'n', 'g', 3, 'm', 'i', 'j', 3, 'm', 'i', 'c', 3, 'm', 'i', 'k',\n3, 'm', 'i', 't', 3, 'm', 'i', 'p', 3, 'm', 'i', 'h', 2, 'b', 'a', 3, 'b', 'a', 'g', 4, 'b', 'a', 'g', 'g',\n4, 'b', 'a', 'g', 's', 3, 'b', 'a', 'n', 4, 'b', 'a', 'n', 'j', 4, 'b', 'a', 'n', 'h', 3, 'b', 'a', 'd', 3, 'b', 'a', 'l',\n4, 'b', 'a', 'l', 'g', 4, 'b', 'a', 'l', 'm', 4, 'b', 'a', 'l', 'b', 4, 'b', 'a', 'l', 's', 4, 'b', 'a', 'l', 't', 4, 'b', 'a', 'l', 'p',\n4, 'b', 'a', 'l', 'h', 3, 'b', 'a', 'm', 3, 'b', 'a', 'b', 4, 'b', 'a', 'b', 's', 3, 'b', 'a', 's', 4, 'b', 'a', 's', 's',\n4, 'b', 'a', 'n', 'g', 3, 'b', 'a', 'j', 3, 'b', 'a', 'c', 3, 'b', 'a', 'k', 3, 'b', 'a', 't', 3, 'b', 'a', 'p',\n3, 'b', 'a', 'h', 3, 'b', 'a', 'e', 4, 'b', 'a', 'e', 'g', 5, 'b', 'a', 'e', 'g', 'g', 5, 'b', 'a', 'e', 'g', 's', 4, 'b', 'a', 'e', 'n',\n5, 'b', 'a', 'e', 'n', 'j', 5, 'b', 'a', 'e', 'n', 'h', 4, 'b', 'a', 'e', 'd', 4, 'b', 'a', 'e', 'l', 5, 'b', 'a', 'e', 'l', 'g', 5, 'b', 'a', 'e', 'l', 'm',\n5, 'b', 'a', 'e', 'l', 'b', 5, 'b', 'a', 'e', 'l', 's', 5, 'b', 'a', 'e', 'l', 't', 5, 'b', 'a', 'e', 'l', 'p', 5, 'b', 'a', 'e', 'l', 'h', 4, 'b', 'a', 'e', 'm',\n4, 'b', 'a', 'e', 'b', 5, 'b', 'a', 'e', 'b', 's', 4, 'b', 'a', 'e', 's', 5, 'b', 'a', 'e', 's', 's', 5, 'b', 'a', 'e', 'n', 'g', 4, 'b', 'a', 'e', 'j',\n4, 'b', 'a', 'e', 'c', 4, 'b', 'a', 'e', 'k', 4, 'b', 'a', 'e', 't', 4, 'b', 'a', 'e', 'p', 4, 'b', 'a', 'e', 'h', 3, 'b', 'y', 'a',\n4, 'b', 'y', 'a', 'g', 5, 'b', 'y', 'a', 'g', 'g', 5, 'b', 'y', 'a', 'g', 's', 4, 'b', 'y', 'a', 'n', 5, 'b', 'y', 'a', 'n', 'j', 5, 'b', 'y', 'a', 'n', 'h',\n4, 'b', 'y', 'a', 'd', 4, 'b', 'y', 'a', 'l', 5, 'b', 'y', 'a', 'l', 'g', 5, 'b', 'y', 'a', 'l', 'm', 5, 'b', 'y', 'a', 'l', 'b', 5, 'b', 'y', 'a', 'l', 's',\n5, 'b', 'y', 'a', 'l', 't', 5, 'b', 'y', 'a', 'l', 'p', 5, 'b', 'y', 'a', 'l', 'h', 4, 'b', 'y', 'a', 'm', 4, 'b', 'y', 'a', 'b', 5, 'b', 'y', 'a', 'b', 's',\n4, 'b', 'y', 'a', 's', 5, 'b', 'y', 'a', 's', 's', 5, 'b', 'y', 'a', 'n', 'g', 4, 'b', 'y', 'a', 'j', 4, 'b', 'y', 'a', 'c', 4, 'b', 'y', 'a', 'k',\n4, 'b', 'y', 'a', 't', 4, 'b', 'y', 'a', 'p', 4, 'b', 'y', 'a', 'h', 4, 'b', 'y', 'a', 'e', 5, 'b', 'y', 'a', 'e', 'g', 6, 'b', 'y', 'a', 'e', 'g', 'g',\n6, 'b', 'y', 'a', 'e', 'g', 's', 5, 'b', 'y', 'a', 'e', 'n', 6, 'b', 'y', 'a', 'e', 'n', 'j', 6, 'b', 'y', 'a', 'e', 'n', 'h', 5, 'b', 'y', 'a', 'e', 'd', 5, 'b', 'y', 'a', 'e', 'l',\n6, 'b', 'y', 'a', 'e', 'l', 'g', 6, 'b', 'y', 'a', 'e', 'l', 'm', 6, 'b', 'y', 'a', 'e', 'l', 'b', 6, 'b', 'y', 'a', 'e', 'l', 's', 6, 'b', 'y', 'a', 'e', 'l', 't', 6, 'b', 'y', 'a', 'e', 'l', 'p',\n6, 'b', 'y', 'a', 'e', 'l', 'h', 5, 'b', 'y', 'a', 'e', 'm', 5, 'b', 'y', 'a', 'e', 'b', 6, 'b', 'y', 'a', 'e', 'b', 's', 5, 'b', 'y', 'a', 'e', 's', 6, 'b', 'y', 'a', 'e', 's', 's',\n6, 'b', 'y', 'a', 'e', 'n', 'g', 5, 'b', 'y', 'a', 'e', 'j', 5, 'b', 'y', 'a', 'e', 'c', 5, 'b', 'y', 'a', 'e', 'k', 5, 'b', 'y', 'a', 'e', 't', 5, 'b', 'y', 'a', 'e', 'p',\n5, 'b', 'y', 'a', 'e', 'h', 3, 'b', 'e', 'o', 4, 'b', 'e', 'o', 'g', 5, 'b', 'e', 'o', 'g', 'g', 5, 'b', 'e', 'o', 'g', 's', 4, 'b', 'e', 'o', 'n',\n5, 'b', 'e', 'o', 'n', 'j', 5, 'b', 'e', 'o', 'n', 'h', 4, 'b', 'e', 'o', 'd', 4, 'b', 'e', 'o', 'l', 5, 'b', 'e', 'o', 'l', 'g', 5, 'b', 'e', 'o', 'l', 'm',\n5, 'b', 'e', 'o', 'l', 'b', 5, 'b', 'e', 'o', 'l', 's', 5, 'b', 'e', 'o', 'l', 't', 5, 'b', 'e', 'o', 'l', 'p', 5, 'b', 'e', 'o', 'l', 'h', 4, 'b', 'e', 'o', 'm',\n4, 'b', 'e', 'o', 'b', 5, 'b', 'e', 'o', 'b', 's', 4, 'b', 'e', 'o', 's', 5, 'b', 'e', 'o', 's', 's', 5, 'b', 'e', 'o', 'n', 'g', 4, 'b', 'e', 'o', 'j',\n4, 'b', 'e', 'o', 'c', 4, 'b', 'e', 'o', 'k', 4, 'b', 'e', 'o', 't', 4, 'b', 'e', 'o', 'p', 4, 'b', 'e', 'o', 'h', 2, 'b', 'e',\n3, 'b', 'e', 'g', 4, 'b', 'e', 'g', 'g', 4, 'b', 'e', 'g', 's', 3, 'b', 'e', 'n', 4, 'b', 'e', 'n', 'j', 4, 'b', 'e', 'n', 'h',\n3, 'b', 'e', 'd', 3, 'b', 'e', 'l', 4, 'b', 'e', 'l', 'g', 4, 'b', 'e', 'l', 'm', 4, 'b', 'e', 'l', 'b', 4, 'b', 'e', 'l', 's',\n4, 'b', 'e', 'l', 't', 4, 'b', 'e', 'l', 'p', 4, 'b', 'e', 'l', 'h', 3, 'b', 'e', 'm', 3, 'b', 'e', 'b', 4, 'b', 'e', 'b', 's',\n3, 'b', 'e', 's', 4, 'b', 'e', 's', 's', 4, 'b', 'e', 'n', 'g', 3, 'b', 'e', 'j', 3, 'b', 'e', 'c', 3, 'b', 'e', 'k',\n3, 'b', 'e', 't', 3, 'b', 'e', 'p', 3, 'b', 'e', 'h', 4, 'b', 'y', 'e', 'o', 5, 'b', 'y', 'e', 'o', 'g', 6, 'b', 'y', 'e', 'o', 'g', 'g',\n6, 'b', 'y', 'e', 'o', 'g', 's', 5, 'b', 'y', 'e', 'o', 'n', 6, 'b', 'y', 'e', 'o', 'n', 'j', 6, 'b', 'y', 'e', 'o', 'n', 'h', 5, 'b', 'y', 'e', 'o', 'd', 5, 'b', 'y', 'e', 'o', 'l',\n6, 'b', 'y', 'e', 'o', 'l', 'g', 6, 'b', 'y', 'e', 'o', 'l', 'm', 6, 'b', 'y', 'e', 'o', 'l', 'b', 6, 'b', 'y', 'e', 'o', 'l', 's', 6, 'b', 'y', 'e', 'o', 'l', 't', 6, 'b', 'y', 'e', 'o', 'l', 'p',\n6, 'b', 'y', 'e', 'o', 'l', 'h', 5, 'b', 'y', 'e', 'o', 'm', 5, 'b', 'y', 'e', 'o', 'b', 6, 'b', 'y', 'e', 'o', 'b', 's', 5, 'b', 'y', 'e', 'o', 's', 6, 'b', 'y', 'e', 'o', 's', 's',\n6, 'b', 'y', 'e', 'o', 'n', 'g', 5, 'b', 'y', 'e', 'o', 'j', 5, 'b', 'y', 'e', 'o', 'c', 5, 'b', 'y', 'e', 'o', 'k', 5, 'b', 'y', 'e', 'o', 't', 5, 'b', 'y', 'e', 'o', 'p',\n5, 'b', 'y', 'e', 'o', 'h', 3, 'b', 'y', 'e', 4, 'b', 'y', 'e', 'g', 5, 'b', 'y', 'e', 'g', 'g', 5, 'b', 'y', 'e', 'g', 's', 4, 'b', 'y', 'e', 'n',\n5, 'b', 'y', 'e', 'n', 'j', 5, 'b', 'y', 'e', 'n', 'h', 4, 'b', 'y', 'e', 'd', 4, 'b', 'y', 'e', 'l', 5, 'b', 'y', 'e', 'l', 'g', 5, 'b', 'y', 'e', 'l', 'm',\n5, 'b', 'y', 'e', 'l', 'b', 5, 'b', 'y', 'e', 'l', 's', 5, 'b', 'y', 'e', 'l', 't', 5, 'b', 'y', 'e', 'l', 'p', 5, 'b', 'y', 'e', 'l', 'h', 4, 'b', 'y', 'e', 'm',\n4, 'b', 'y', 'e', 'b', 5, 'b', 'y', 'e', 'b', 's', 4, 'b', 'y', 'e', 's', 5, 'b', 'y', 'e', 's', 's', 5, 'b', 'y', 'e', 'n', 'g', 4, 'b', 'y', 'e', 'j',\n4, 'b', 'y', 'e', 'c', 4, 'b', 'y', 'e', 'k', 4, 'b', 'y', 'e', 't', 4, 'b', 'y', 'e', 'p', 4, 'b', 'y', 'e', 'h', 2, 'b', 'o',\n3, 'b', 'o', 'g', 4, 'b', 'o', 'g', 'g', 4, 'b', 'o', 'g', 's', 3, 'b', 'o', 'n', 4, 'b', 'o', 'n', 'j', 4, 'b', 'o', 'n', 'h',\n3, 'b', 'o', 'd', 3, 'b', 'o', 'l', 4, 'b', 'o', 'l', 'g', 4, 'b', 'o', 'l', 'm', 4, 'b', 'o', 'l', 'b', 4, 'b', 'o', 'l', 's',\n4, 'b', 'o', 'l', 't', 4, 'b', 'o', 'l', 'p', 4, 'b', 'o', 'l', 'h', 3, 'b', 'o', 'm', 3, 'b', 'o', 'b', 4, 'b', 'o', 'b', 's',\n3, 'b', 'o', 's', 4, 'b', 'o', 's', 's', 4, 'b', 'o', 'n', 'g', 3, 'b', 'o', 'j', 3, 'b', 'o', 'c', 3, 'b', 'o', 'k',\n3, 'b', 'o', 't', 3, 'b', 'o', 'p', 3, 'b', 'o', 'h', 3, 'b', 'w', 'a', 4, 'b', 'w', 'a', 'g', 5, 'b', 'w', 'a', 'g', 'g',\n5, 'b', 'w', 'a', 'g', 's', 4, 'b', 'w', 'a', 'n', 5, 'b', 'w', 'a', 'n', 'j', 5, 'b', 'w', 'a', 'n', 'h', 4, 'b', 'w', 'a', 'd', 4, 'b', 'w', 'a', 'l',\n5, 'b', 'w', 'a', 'l', 'g', 5, 'b', 'w', 'a', 'l', 'm', 5, 'b', 'w', 'a', 'l', 'b', 5, 'b', 'w', 'a', 'l', 's', 5, 'b', 'w', 'a', 'l', 't', 5, 'b', 'w', 'a', 'l', 'p',\n5, 'b', 'w', 'a', 'l', 'h', 4, 'b', 'w', 'a', 'm', 4, 'b', 'w', 'a', 'b', 5, 'b', 'w', 'a', 'b', 's', 4, 'b', 'w', 'a', 's', 5, 'b', 'w', 'a', 's', 's',\n5, 'b', 'w', 'a', 'n', 'g', 4, 'b', 'w', 'a', 'j', 4, 'b', 'w', 'a', 'c', 4, 'b', 'w', 'a', 'k', 4, 'b', 'w', 'a', 't', 4, 'b', 'w', 'a', 'p',\n4, 'b', 'w', 'a', 'h', 4, 'b', 'w', 'a', 'e', 5, 'b', 'w', 'a', 'e', 'g', 6, 'b', 'w', 'a', 'e', 'g', 'g', 6, 'b', 'w', 'a', 'e', 'g', 's', 5, 'b', 'w', 'a', 'e', 'n',\n6, 'b', 'w', 'a', 'e', 'n', 'j', 6, 'b', 'w', 'a', 'e', 'n', 'h', 5, 'b', 'w', 'a', 'e', 'd', 5, 'b', 'w', 'a', 'e', 'l', 6, 'b', 'w', 'a', 'e', 'l', 'g', 6, 'b', 'w', 'a', 'e', 'l', 'm',\n6, 'b', 'w', 'a', 'e', 'l', 'b', 6, 'b', 'w', 'a', 'e', 'l', 's', 6, 'b', 'w', 'a', 'e', 'l', 't', 6, 'b', 'w', 'a', 'e', 'l', 'p', 6, 'b', 'w', 'a', 'e', 'l', 'h', 5, 'b', 'w', 'a', 'e', 'm',\n5, 'b', 'w', 'a', 'e', 'b', 6, 'b', 'w', 'a', 'e', 'b', 's', 5, 'b', 'w', 'a', 'e', 's', 6, 'b', 'w', 'a', 'e', 's', 's', 6, 'b', 'w', 'a', 'e', 'n', 'g', 5, 'b', 'w', 'a', 'e', 'j',\n5, 'b', 'w', 'a', 'e', 'c', 5, 'b', 'w', 'a', 'e', 'k', 5, 'b', 'w', 'a', 'e', 't', 5, 'b', 'w', 'a', 'e', 'p', 5, 'b', 'w', 'a', 'e', 'h', 3, 'b', 'o', 'e',\n4, 'b', 'o', 'e', 'g', 5, 'b', 'o', 'e', 'g', 'g', 5, 'b', 'o', 'e', 'g', 's', 4, 'b', 'o', 'e', 'n', 5, 'b', 'o', 'e', 'n', 'j', 5, 'b', 'o', 'e', 'n', 'h',\n4, 'b', 'o', 'e', 'd', 4, 'b', 'o', 'e', 'l', 5, 'b', 'o', 'e', 'l', 'g', 5, 'b', 'o', 'e', 'l', 'm', 5, 'b', 'o', 'e', 'l', 'b', 5, 'b', 'o', 'e', 'l', 's',\n5, 'b', 'o', 'e', 'l', 't', 5, 'b', 'o', 'e', 'l', 'p', 5, 'b', 'o', 'e', 'l', 'h', 4, 'b', 'o', 'e', 'm', 4, 'b', 'o', 'e', 'b', 5, 'b', 'o', 'e', 'b', 's',\n4, 'b', 'o', 'e', 's', 5, 'b', 'o', 'e', 's', 's', 5, 'b', 'o', 'e', 'n', 'g', 4, 'b', 'o', 'e', 'j', 4, 'b', 'o', 'e', 'c', 4, 'b', 'o', 'e', 'k',\n4, 'b', 'o', 'e', 't', 4, 'b', 'o', 'e', 'p', 4, 'b', 'o', 'e', 'h', 3, 'b', 'y', 'o', 4, 'b', 'y', 'o', 'g', 5, 'b', 'y', 'o', 'g', 'g',\n5, 'b', 'y', 'o', 'g', 's', 4, 'b', 'y', 'o', 'n', 5, 'b', 'y', 'o', 'n', 'j', 5, 'b', 'y', 'o', 'n', 'h', 4, 'b', 'y', 'o', 'd', 4, 'b', 'y', 'o', 'l',\n5, 'b', 'y', 'o', 'l', 'g', 5, 'b', 'y', 'o', 'l', 'm', 5, 'b', 'y', 'o', 'l', 'b', 5, 'b', 'y', 'o', 'l', 's', 5, 'b', 'y', 'o', 'l', 't', 5, 'b', 'y', 'o', 'l', 'p',\n5, 'b', 'y', 'o', 'l', 'h', 4, 'b', 'y', 'o', 'm', 4, 'b', 'y', 'o', 'b', 5, 'b', 'y', 'o', 'b', 's', 4, 'b', 'y', 'o', 's', 5, 'b', 'y', 'o', 's', 's',\n5, 'b', 'y', 'o', 'n', 'g', 4, 'b', 'y', 'o', 'j', 4, 'b', 'y', 'o', 'c', 4, 'b', 'y', 'o', 'k', 4, 'b', 'y', 'o', 't', 4, 'b', 'y', 'o', 'p',\n4, 'b', 'y', 'o', 'h', 2, 'b', 'u', 3, 'b', 'u', 'g', 4, 'b', 'u', 'g', 'g', 4, 'b', 'u', 'g', 's', 3, 'b', 'u', 'n',\n4, 'b', 'u', 'n', 'j', 4, 'b', 'u', 'n', 'h', 3, 'b', 'u', 'd', 3, 'b', 'u', 'l', 4, 'b', 'u', 'l', 'g', 4, 'b', 'u', 'l', 'm',\n4, 'b', 'u', 'l', 'b', 4, 'b', 'u', 'l', 's', 4, 'b', 'u', 'l', 't', 4, 'b', 'u', 'l', 'p', 4, 'b', 'u', 'l', 'h', 3, 'b', 'u', 'm',\n3, 'b', 'u', 'b', 4, 'b', 'u', 'b', 's', 3, 'b', 'u', 's', 4, 'b', 'u', 's', 's', 4, 'b', 'u', 'n', 'g', 3, 'b', 'u', 'j',\n3, 'b', 'u', 'c', 3, 'b', 'u', 'k', 3, 'b', 'u', 't', 3, 'b', 'u', 'p', 3, 'b', 'u', 'h', 4, 'b', 'w', 'e', 'o',\n5, 'b', 'w', 'e', 'o', 'g', 6, 'b', 'w', 'e', 'o', 'g', 'g', 6, 'b', 'w', 'e', 'o', 'g', 's', 5, 'b', 'w', 'e', 'o', 'n', 6, 'b', 'w', 'e', 'o', 'n', 'j', 6, 'b', 'w', 'e', 'o', 'n', 'h',\n5, 'b', 'w', 'e', 'o', 'd', 5, 'b', 'w', 'e', 'o', 'l', 6, 'b', 'w', 'e', 'o', 'l', 'g', 6, 'b', 'w', 'e', 'o', 'l', 'm', 6, 'b', 'w', 'e', 'o', 'l', 'b', 6, 'b', 'w', 'e', 'o', 'l', 's',\n6, 'b', 'w', 'e', 'o', 'l', 't', 6, 'b', 'w', 'e', 'o', 'l', 'p', 6, 'b', 'w', 'e', 'o', 'l', 'h', 5, 'b', 'w', 'e', 'o', 'm', 5, 'b', 'w', 'e', 'o', 'b', 6, 'b', 'w', 'e', 'o', 'b', 's',\n5, 'b', 'w', 'e', 'o', 's', 6, 'b', 'w', 'e', 'o', 's', 's', 6, 'b', 'w', 'e', 'o', 'n', 'g', 5, 'b', 'w', 'e', 'o', 'j', 5, 'b', 'w', 'e', 'o', 'c', 5, 'b', 'w', 'e', 'o', 'k',\n5, 'b', 'w', 'e', 'o', 't', 5, 'b', 'w', 'e', 'o', 'p', 5, 'b', 'w', 'e', 'o', 'h', 3, 'b', 'w', 'e', 4, 'b', 'w', 'e', 'g', 5, 'b', 'w', 'e', 'g', 'g',\n5, 'b', 'w', 'e', 'g', 's', 4, 'b', 'w', 'e', 'n', 5, 'b', 'w', 'e', 'n', 'j', 5, 'b', 'w', 'e', 'n', 'h', 4, 'b', 'w', 'e', 'd', 4, 'b', 'w', 'e', 'l',\n5, 'b', 'w', 'e', 'l', 'g', 5, 'b', 'w', 'e', 'l', 'm', 5, 'b', 'w', 'e', 'l', 'b', 5, 'b', 'w', 'e', 'l', 's', 5, 'b', 'w', 'e', 'l', 't', 5, 'b', 'w', 'e', 'l', 'p',\n5, 'b', 'w', 'e', 'l', 'h', 4, 'b', 'w', 'e', 'm', 4, 'b', 'w', 'e', 'b', 5, 'b', 'w', 'e', 'b', 's', 4, 'b', 'w', 'e', 's', 5, 'b', 'w', 'e', 's', 's',\n5, 'b', 'w', 'e', 'n', 'g', 4, 'b', 'w', 'e', 'j', 4, 'b', 'w', 'e', 'c', 4, 'b', 'w', 'e', 'k', 4, 'b', 'w', 'e', 't', 4, 'b', 'w', 'e', 'p',\n4, 'b', 'w', 'e', 'h', 3, 'b', 'w', 'i', 4, 'b', 'w', 'i', 'g', 5, 'b', 'w', 'i', 'g', 'g', 5, 'b', 'w', 'i', 'g', 's', 4, 'b', 'w', 'i', 'n',\n5, 'b', 'w', 'i', 'n', 'j', 5, 'b', 'w', 'i', 'n', 'h', 4, 'b', 'w', 'i', 'd', 4, 'b', 'w', 'i', 'l', 5, 'b', 'w', 'i', 'l', 'g', 5, 'b', 'w', 'i', 'l', 'm',\n5, 'b', 'w', 'i', 'l', 'b', 5, 'b', 'w', 'i', 'l', 's', 5, 'b', 'w', 'i', 'l', 't', 5, 'b', 'w', 'i', 'l', 'p', 5, 'b', 'w', 'i', 'l', 'h', 4, 'b', 'w', 'i', 'm',\n4, 'b', 'w', 'i', 'b', 5, 'b', 'w', 'i', 'b', 's', 4, 'b', 'w', 'i', 's', 5, 'b', 'w', 'i', 's', 's', 5, 'b', 'w', 'i', 'n', 'g', 4, 'b', 'w', 'i', 'j',\n4, 'b', 'w', 'i', 'c', 4, 'b', 'w', 'i', 'k', 4, 'b', 'w', 'i', 't', 4, 'b', 'w', 'i', 'p', 4, 'b', 'w', 'i', 'h', 3, 'b', 'y', 'u',\n4, 'b', 'y', 'u', 'g', 5, 'b', 'y', 'u', 'g', 'g', 5, 'b', 'y', 'u', 'g', 's', 4, 'b', 'y', 'u', 'n', 5, 'b', 'y', 'u', 'n', 'j', 5, 'b', 'y', 'u', 'n', 'h',\n4, 'b', 'y', 'u', 'd', 4, 'b', 'y', 'u', 'l', 5, 'b', 'y', 'u', 'l', 'g', 5, 'b', 'y', 'u', 'l', 'm', 5, 'b', 'y', 'u', 'l', 'b', 5, 'b', 'y', 'u', 'l', 's',\n5, 'b', 'y', 'u', 'l', 't', 5, 'b', 'y', 'u', 'l', 'p', 5, 'b', 'y', 'u', 'l', 'h', 4, 'b', 'y', 'u', 'm', 4, 'b', 'y', 'u', 'b', 5, 'b', 'y', 'u', 'b', 's',\n4, 'b', 'y', 'u', 's', 5, 'b', 'y', 'u', 's', 's', 5, 'b', 'y', 'u', 'n', 'g', 4, 'b', 'y', 'u', 'j', 4, 'b', 'y', 'u', 'c', 4, 'b', 'y', 'u', 'k',\n4, 'b', 'y', 'u', 't', 4, 'b', 'y', 'u', 'p', 4, 'b', 'y', 'u', 'h', 3, 'b', 'e', 'u', 4, 'b', 'e', 'u', 'g', 5, 'b', 'e', 'u', 'g', 'g',\n5, 'b', 'e', 'u', 'g', 's', 4, 'b', 'e', 'u', 'n', 5, 'b', 'e', 'u', 'n', 'j', 5, 'b', 'e', 'u', 'n', 'h', 4, 'b', 'e', 'u', 'd', 4, 'b', 'e', 'u', 'l',\n5, 'b', 'e', 'u', 'l', 'g', 5, 'b', 'e', 'u', 'l', 'm', 5, 'b', 'e', 'u', 'l', 'b', 5, 'b', 'e', 'u', 'l', 's', 5, 'b', 'e', 'u', 'l', 't', 5, 'b', 'e', 'u', 'l', 'p',\n5, 'b', 'e', 'u', 'l', 'h', 4, 'b', 'e', 'u', 'm', 4, 'b', 'e', 'u', 'b', 5, 'b', 'e', 'u', 'b', 's', 4, 'b', 'e', 'u', 's', 5, 'b', 'e', 'u', 's', 's',\n5, 'b', 'e', 'u', 'n', 'g', 4, 'b', 'e', 'u', 'j', 4, 'b', 'e', 'u', 'c', 4, 'b', 'e', 'u', 'k', 4, 'b', 'e', 'u', 't', 4, 'b', 'e', 'u', 'p',\n4, 'b', 'e', 'u', 'h', 3, 'b', 'y', 'i', 4, 'b', 'y', 'i', 'g', 5, 'b', 'y', 'i', 'g', 'g', 5, 'b', 'y', 'i', 'g', 's', 4, 'b', 'y', 'i', 'n',\n5, 'b', 'y', 'i', 'n', 'j', 5, 'b', 'y', 'i', 'n', 'h', 4, 'b', 'y', 'i', 'd', 4, 'b', 'y', 'i', 'l', 5, 'b', 'y', 'i', 'l', 'g', 5, 'b', 'y', 'i', 'l', 'm',\n5, 'b', 'y', 'i', 'l', 'b', 5, 'b', 'y', 'i', 'l', 's', 5, 'b', 'y', 'i', 'l', 't', 5, 'b', 'y', 'i', 'l', 'p', 5, 'b', 'y', 'i', 'l', 'h', 4, 'b', 'y', 'i', 'm',\n4, 'b', 'y', 'i', 'b', 5, 'b', 'y', 'i', 'b', 's', 4, 'b', 'y', 'i', 's', 5, 'b', 'y', 'i', 's', 's', 5, 'b', 'y', 'i', 'n', 'g', 4, 'b', 'y', 'i', 'j',\n4, 'b', 'y', 'i', 'c', 4, 'b', 'y', 'i', 'k', 4, 'b', 'y', 'i', 't', 4, 'b', 'y', 'i', 'p', 4, 'b', 'y', 'i', 'h', 2, 'b', 'i',\n3, 'b', 'i', 'g', 4, 'b', 'i', 'g', 'g', 4, 'b', 'i', 'g', 's', 3, 'b', 'i', 'n', 4, 'b', 'i', 'n', 'j', 4, 'b', 'i', 'n', 'h',\n3, 'b', 'i', 'd', 3, 'b', 'i', 'l', 4, 'b', 'i', 'l', 'g', 4, 'b', 'i', 'l', 'm', 4, 'b', 'i', 'l', 'b', 4, 'b', 'i', 'l', 's',\n4, 'b', 'i', 'l', 't', 4, 'b', 'i', 'l', 'p', 4, 'b', 'i', 'l', 'h', 3, 'b', 'i', 'm', 3, 'b', 'i', 'b', 4, 'b', 'i', 'b', 's',\n3, 'b', 'i', 's', 4, 'b', 'i', 's', 's', 4, 'b', 'i', 'n', 'g', 3, 'b', 'i', 'j', 3, 'b', 'i', 'c', 3, 'b', 'i', 'k',\n3, 'b', 'i', 't', 3, 'b', 'i', 'p', 3, 'b', 'i', 'h', 3, 'b', 'b', 'a', 4, 'b', 'b', 'a', 'g', 5, 'b', 'b', 'a', 'g', 'g',\n5, 'b', 'b', 'a', 'g', 's', 4, 'b', 'b', 'a', 'n', 5, 'b', 'b', 'a', 'n', 'j', 5, 'b', 'b', 'a', 'n', 'h', 4, 'b', 'b', 'a', 'd', 4, 'b', 'b', 'a', 'l',\n5, 'b', 'b', 'a', 'l', 'g', 5, 'b', 'b', 'a', 'l', 'm', 5, 'b', 'b', 'a', 'l', 'b', 5, 'b', 'b', 'a', 'l', 's', 5, 'b', 'b', 'a', 'l', 't', 5, 'b', 'b', 'a', 'l', 'p',\n5, 'b', 'b', 'a', 'l', 'h', 4, 'b', 'b', 'a', 'm', 4, 'b', 'b', 'a', 'b', 5, 'b', 'b', 'a', 'b', 's', 4, 'b', 'b', 'a', 's', 5, 'b', 'b', 'a', 's', 's',\n5, 'b', 'b', 'a', 'n', 'g', 4, 'b', 'b', 'a', 'j', 4, 'b', 'b', 'a', 'c', 4, 'b', 'b', 'a', 'k', 4, 'b', 'b', 'a', 't', 4, 'b', 'b', 'a', 'p',\n4, 'b', 'b', 'a', 'h', 4, 'b', 'b', 'a', 'e', 5, 'b', 'b', 'a', 'e', 'g', 6, 'b', 'b', 'a', 'e', 'g', 'g', 6, 'b', 'b', 'a', 'e', 'g', 's', 5, 'b', 'b', 'a', 'e', 'n',\n6, 'b', 'b', 'a', 'e', 'n', 'j', 6, 'b', 'b', 'a', 'e', 'n', 'h', 5, 'b', 'b', 'a', 'e', 'd', 5, 'b', 'b', 'a', 'e', 'l', 6, 'b', 'b', 'a', 'e', 'l', 'g', 6, 'b', 'b', 'a', 'e', 'l', 'm',\n6, 'b', 'b', 'a', 'e', 'l', 'b', 6, 'b', 'b', 'a', 'e', 'l', 's', 6, 'b', 'b', 'a', 'e', 'l', 't', 6, 'b', 'b', 'a', 'e', 'l', 'p', 6, 'b', 'b', 'a', 'e', 'l', 'h', 5, 'b', 'b', 'a', 'e', 'm',\n5, 'b', 'b', 'a', 'e', 'b', 6, 'b', 'b', 'a', 'e', 'b', 's', 5, 'b', 'b', 'a', 'e', 's', 6, 'b', 'b', 'a', 'e', 's', 's', 6, 'b', 'b', 'a', 'e', 'n', 'g', 5, 'b', 'b', 'a', 'e', 'j',\n5, 'b', 'b', 'a', 'e', 'c', 5, 'b', 'b', 'a', 'e', 'k', 5, 'b', 'b', 'a', 'e', 't', 5, 'b', 'b', 'a', 'e', 'p', 5, 'b', 'b', 'a', 'e', 'h', 4, 'b', 'b', 'y', 'a',\n5, 'b', 'b', 'y', 'a', 'g', 6, 'b', 'b', 'y', 'a', 'g', 'g', 6, 'b', 'b', 'y', 'a', 'g', 's', 5, 'b', 'b', 'y', 'a', 'n', 6, 'b', 'b', 'y', 'a', 'n', 'j', 6, 'b', 'b', 'y', 'a', 'n', 'h',\n5, 'b', 'b', 'y', 'a', 'd', 5, 'b', 'b', 'y', 'a', 'l', 6, 'b', 'b', 'y', 'a', 'l', 'g', 6, 'b', 'b', 'y', 'a', 'l', 'm', 6, 'b', 'b', 'y', 'a', 'l', 'b', 6, 'b', 'b', 'y', 'a', 'l', 's',\n6, 'b', 'b', 'y', 'a', 'l', 't', 6, 'b', 'b', 'y', 'a', 'l', 'p', 6, 'b', 'b', 'y', 'a', 'l', 'h', 5, 'b', 'b', 'y', 'a', 'm', 5, 'b', 'b', 'y', 'a', 'b', 6, 'b', 'b', 'y', 'a', 'b', 's',\n5, 'b', 'b', 'y', 'a', 's', 6, 'b', 'b', 'y', 'a', 's', 's', 6, 'b', 'b', 'y', 'a', 'n', 'g', 5, 'b', 'b', 'y', 'a', 'j', 5, 'b', 'b', 'y', 'a', 'c', 5, 'b', 'b', 'y', 'a', 'k',\n5, 'b', 'b', 'y', 'a', 't', 5, 'b', 'b', 'y', 'a', 'p', 5, 'b', 'b', 'y', 'a', 'h', 5, 'b', 'b', 'y', 'a', 'e', 6, 'b', 'b', 'y', 'a', 'e', 'g', 7, 'b', 'b', 'y', 'a', 'e', 'g', 'g',\n7, 'b', 'b', 'y', 'a', 'e', 'g', 's', 6, 'b', 'b', 'y', 'a', 'e', 'n', 7, 'b', 'b', 'y', 'a', 'e', 'n', 'j', 7, 'b', 'b', 'y', 'a', 'e', 'n', 'h', 6, 'b', 'b', 'y', 'a', 'e', 'd', 6, 'b', 'b', 'y', 'a', 'e', 'l',\n7, 'b', 'b', 'y', 'a', 'e', 'l', 'g', 7, 'b', 'b', 'y', 'a', 'e', 'l', 'm', 7, 'b', 'b', 'y', 'a', 'e', 'l', 'b', 7, 'b', 'b', 'y', 'a', 'e', 'l', 's', 7, 'b', 'b', 'y', 'a', 'e', 'l', 't', 7, 'b', 'b', 'y', 'a', 'e', 'l', 'p',\n7, 'b', 'b', 'y', 'a', 'e', 'l', 'h', 6, 'b', 'b', 'y', 'a', 'e', 'm', 6, 'b', 'b', 'y', 'a', 'e', 'b', 7, 'b', 'b', 'y', 'a', 'e', 'b', 's', 6, 'b', 'b', 'y', 'a', 'e', 's', 7, 'b', 'b', 'y', 'a', 'e', 's', 's',\n7, 'b', 'b', 'y', 'a', 'e', 'n', 'g', 6, 'b', 'b', 'y', 'a', 'e', 'j', 6, 'b', 'b', 'y', 'a', 'e', 'c', 6, 'b', 'b', 'y', 'a', 'e', 'k', 6, 'b', 'b', 'y', 'a', 'e', 't', 6, 'b', 'b', 'y', 'a', 'e', 'p',\n6, 'b', 'b', 'y', 'a', 'e', 'h', 4, 'b', 'b', 'e', 'o', 5, 'b', 'b', 'e', 'o', 'g', 6, 'b', 'b', 'e', 'o', 'g', 'g', 6, 'b', 'b', 'e', 'o', 'g', 's', 5, 'b', 'b', 'e', 'o', 'n',\n6, 'b', 'b', 'e', 'o', 'n', 'j', 6, 'b', 'b', 'e', 'o', 'n', 'h', 5, 'b', 'b', 'e', 'o', 'd', 5, 'b', 'b', 'e', 'o', 'l', 6, 'b', 'b', 'e', 'o', 'l', 'g', 6, 'b', 'b', 'e', 'o', 'l', 'm',\n6, 'b', 'b', 'e', 'o', 'l', 'b', 6, 'b', 'b', 'e', 'o', 'l', 's', 6, 'b', 'b', 'e', 'o', 'l', 't', 6, 'b', 'b', 'e', 'o', 'l', 'p', 6, 'b', 'b', 'e', 'o', 'l', 'h', 5, 'b', 'b', 'e', 'o', 'm',\n5, 'b', 'b', 'e', 'o', 'b', 6, 'b', 'b', 'e', 'o', 'b', 's', 5, 'b', 'b', 'e', 'o', 's', 6, 'b', 'b', 'e', 'o', 's', 's', 6, 'b', 'b', 'e', 'o', 'n', 'g', 5, 'b', 'b', 'e', 'o', 'j',\n5, 'b', 'b', 'e', 'o', 'c', 5, 'b', 'b', 'e', 'o', 'k', 5, 'b', 'b', 'e', 'o', 't', 5, 'b', 'b', 'e', 'o', 'p', 5, 'b', 'b', 'e', 'o', 'h', 3, 'b', 'b', 'e',\n4, 'b', 'b', 'e', 'g', 5, 'b', 'b', 'e', 'g', 'g', 5, 'b', 'b', 'e', 'g', 's', 4, 'b', 'b', 'e', 'n', 5, 'b', 'b', 'e', 'n', 'j', 5, 'b', 'b', 'e', 'n', 'h',\n4, 'b', 'b', 'e', 'd', 4, 'b', 'b', 'e', 'l', 5, 'b', 'b', 'e', 'l', 'g', 5, 'b', 'b', 'e', 'l', 'm', 5, 'b', 'b', 'e', 'l', 'b', 5, 'b', 'b', 'e', 'l', 's',\n5, 'b', 'b', 'e', 'l', 't', 5, 'b', 'b', 'e', 'l', 'p', 5, 'b', 'b', 'e', 'l', 'h', 4, 'b', 'b', 'e', 'm', 4, 'b', 'b', 'e', 'b', 5, 'b', 'b', 'e', 'b', 's',\n4, 'b', 'b', 'e', 's', 5, 'b', 'b', 'e', 's', 's', 5, 'b', 'b', 'e', 'n', 'g', 4, 'b', 'b', 'e', 'j', 4, 'b', 'b', 'e', 'c', 4, 'b', 'b', 'e', 'k',\n4, 'b', 'b', 'e', 't', 4, 'b', 'b', 'e', 'p', 4, 'b', 'b', 'e', 'h', 5, 'b', 'b', 'y', 'e', 'o', 6, 'b', 'b', 'y', 'e', 'o', 'g', 7, 'b', 'b', 'y', 'e', 'o', 'g', 'g',\n7, 'b', 'b', 'y', 'e', 'o', 'g', 's', 6, 'b', 'b', 'y', 'e', 'o', 'n', 7, 'b', 'b', 'y', 'e', 'o', 'n', 'j', 7, 'b', 'b', 'y', 'e', 'o', 'n', 'h', 6, 'b', 'b', 'y', 'e', 'o', 'd', 6, 'b', 'b', 'y', 'e', 'o', 'l',\n7, 'b', 'b', 'y', 'e', 'o', 'l', 'g', 7, 'b', 'b', 'y', 'e', 'o', 'l', 'm', 7, 'b', 'b', 'y', 'e', 'o', 'l', 'b', 7, 'b', 'b', 'y', 'e', 'o', 'l', 's', 7, 'b', 'b', 'y', 'e', 'o', 'l', 't', 7, 'b', 'b', 'y', 'e', 'o', 'l', 'p',\n7, 'b', 'b', 'y', 'e', 'o', 'l', 'h', 6, 'b', 'b', 'y', 'e', 'o', 'm', 6, 'b', 'b', 'y', 'e', 'o', 'b', 7, 'b', 'b', 'y', 'e', 'o', 'b', 's', 6, 'b', 'b', 'y', 'e', 'o', 's', 7, 'b', 'b', 'y', 'e', 'o', 's', 's',\n7, 'b', 'b', 'y', 'e', 'o', 'n', 'g', 6, 'b', 'b', 'y', 'e', 'o', 'j', 6, 'b', 'b', 'y', 'e', 'o', 'c', 6, 'b', 'b', 'y', 'e', 'o', 'k', 6, 'b', 'b', 'y', 'e', 'o', 't', 6, 'b', 'b', 'y', 'e', 'o', 'p',\n6, 'b', 'b', 'y', 'e', 'o', 'h', 4, 'b', 'b', 'y', 'e', 5, 'b', 'b', 'y', 'e', 'g', 6, 'b', 'b', 'y', 'e', 'g', 'g', 6, 'b', 'b', 'y', 'e', 'g', 's', 5, 'b', 'b', 'y', 'e', 'n',\n6, 'b', 'b', 'y', 'e', 'n', 'j', 6, 'b', 'b', 'y', 'e', 'n', 'h', 5, 'b', 'b', 'y', 'e', 'd', 5, 'b', 'b', 'y', 'e', 'l', 6, 'b', 'b', 'y', 'e', 'l', 'g', 6, 'b', 'b', 'y', 'e', 'l', 'm',\n6, 'b', 'b', 'y', 'e', 'l', 'b', 6, 'b', 'b', 'y', 'e', 'l', 's', 6, 'b', 'b', 'y', 'e', 'l', 't', 6, 'b', 'b', 'y', 'e', 'l', 'p', 6, 'b', 'b', 'y', 'e', 'l', 'h', 5, 'b', 'b', 'y', 'e', 'm',\n5, 'b', 'b', 'y', 'e', 'b', 6, 'b', 'b', 'y', 'e', 'b', 's', 5, 'b', 'b', 'y', 'e', 's', 6, 'b', 'b', 'y', 'e', 's', 's', 6, 'b', 'b', 'y', 'e', 'n', 'g', 5, 'b', 'b', 'y', 'e', 'j',\n5, 'b', 'b', 'y', 'e', 'c', 5, 'b', 'b', 'y', 'e', 'k', 5, 'b', 'b', 'y', 'e', 't', 5, 'b', 'b', 'y', 'e', 'p', 5, 'b', 'b', 'y', 'e', 'h', 3, 'b', 'b', 'o',\n4, 'b', 'b', 'o', 'g', 5, 'b', 'b', 'o', 'g', 'g', 5, 'b', 'b', 'o', 'g', 's', 4, 'b', 'b', 'o', 'n', 5, 'b', 'b', 'o', 'n', 'j', 5, 'b', 'b', 'o', 'n', 'h',\n4, 'b', 'b', 'o', 'd', 4, 'b', 'b', 'o', 'l', 5, 'b', 'b', 'o', 'l', 'g', 5, 'b', 'b', 'o', 'l', 'm', 5, 'b', 'b', 'o', 'l', 'b', 5, 'b', 'b', 'o', 'l', 's',\n5, 'b', 'b', 'o', 'l', 't', 5, 'b', 'b', 'o', 'l', 'p', 5, 'b', 'b', 'o', 'l', 'h', 4, 'b', 'b', 'o', 'm', 4, 'b', 'b', 'o', 'b', 5, 'b', 'b', 'o', 'b', 's',\n4, 'b', 'b', 'o', 's', 5, 'b', 'b', 'o', 's', 's', 5, 'b', 'b', 'o', 'n', 'g', 4, 'b', 'b', 'o', 'j', 4, 'b', 'b', 'o', 'c', 4, 'b', 'b', 'o', 'k',\n4, 'b', 'b', 'o', 't', 4, 'b', 'b', 'o', 'p', 4, 'b', 'b', 'o', 'h', 4, 'b', 'b', 'w', 'a', 5, 'b', 'b', 'w', 'a', 'g', 6, 'b', 'b', 'w', 'a', 'g', 'g',\n6, 'b', 'b', 'w', 'a', 'g', 's', 5, 'b', 'b', 'w', 'a', 'n', 6, 'b', 'b', 'w', 'a', 'n', 'j', 6, 'b', 'b', 'w', 'a', 'n', 'h', 5, 'b', 'b', 'w', 'a', 'd', 5, 'b', 'b', 'w', 'a', 'l',\n6, 'b', 'b', 'w', 'a', 'l', 'g', 6, 'b', 'b', 'w', 'a', 'l', 'm', 6, 'b', 'b', 'w', 'a', 'l', 'b', 6, 'b', 'b', 'w', 'a', 'l', 's', 6, 'b', 'b', 'w', 'a', 'l', 't', 6, 'b', 'b', 'w', 'a', 'l', 'p',\n6, 'b', 'b', 'w', 'a', 'l', 'h', 5, 'b', 'b', 'w', 'a', 'm', 5, 'b', 'b', 'w', 'a', 'b', 6, 'b', 'b', 'w', 'a', 'b', 's', 5, 'b', 'b', 'w', 'a', 's', 6, 'b', 'b', 'w', 'a', 's', 's',\n6, 'b', 'b', 'w', 'a', 'n', 'g', 5, 'b', 'b', 'w', 'a', 'j', 5, 'b', 'b', 'w', 'a', 'c', 5, 'b', 'b', 'w', 'a', 'k', 5, 'b', 'b', 'w', 'a', 't', 5, 'b', 'b', 'w', 'a', 'p',\n5, 'b', 'b', 'w', 'a', 'h', 5, 'b', 'b', 'w', 'a', 'e', 6, 'b', 'b', 'w', 'a', 'e', 'g', 7, 'b', 'b', 'w', 'a', 'e', 'g', 'g', 7, 'b', 'b', 'w', 'a', 'e', 'g', 's', 6, 'b', 'b', 'w', 'a', 'e', 'n',\n7, 'b', 'b', 'w', 'a', 'e', 'n', 'j', 7, 'b', 'b', 'w', 'a', 'e', 'n', 'h', 6, 'b', 'b', 'w', 'a', 'e', 'd', 6, 'b', 'b', 'w', 'a', 'e', 'l', 7, 'b', 'b', 'w', 'a', 'e', 'l', 'g', 7, 'b', 'b', 'w', 'a', 'e', 'l', 'm',\n7, 'b', 'b', 'w', 'a', 'e', 'l', 'b', 7, 'b', 'b', 'w', 'a', 'e', 'l', 's', 7, 'b', 'b', 'w', 'a', 'e', 'l', 't', 7, 'b', 'b', 'w', 'a', 'e', 'l', 'p', 7, 'b', 'b', 'w', 'a', 'e', 'l', 'h', 6, 'b', 'b', 'w', 'a', 'e', 'm',\n6, 'b', 'b', 'w', 'a', 'e', 'b', 7, 'b', 'b', 'w', 'a', 'e', 'b', 's', 6, 'b', 'b', 'w', 'a', 'e', 's', 7, 'b', 'b', 'w', 'a', 'e', 's', 's', 7, 'b', 'b', 'w', 'a', 'e', 'n', 'g', 6, 'b', 'b', 'w', 'a', 'e', 'j',\n6, 'b', 'b', 'w', 'a', 'e', 'c', 6, 'b', 'b', 'w', 'a', 'e', 'k', 6, 'b', 'b', 'w', 'a', 'e', 't', 6, 'b', 'b', 'w', 'a', 'e', 'p', 6, 'b', 'b', 'w', 'a', 'e', 'h', 4, 'b', 'b', 'o', 'e',\n5, 'b', 'b', 'o', 'e', 'g', 6, 'b', 'b', 'o', 'e', 'g', 'g', 6, 'b', 'b', 'o', 'e', 'g', 's', 5, 'b', 'b', 'o', 'e', 'n', 6, 'b', 'b', 'o', 'e', 'n', 'j', 6, 'b', 'b', 'o', 'e', 'n', 'h',\n5, 'b', 'b', 'o', 'e', 'd', 5, 'b', 'b', 'o', 'e', 'l', 6, 'b', 'b', 'o', 'e', 'l', 'g', 6, 'b', 'b', 'o', 'e', 'l', 'm', 6, 'b', 'b', 'o', 'e', 'l', 'b', 6, 'b', 'b', 'o', 'e', 'l', 's',\n6, 'b', 'b', 'o', 'e', 'l', 't', 6, 'b', 'b', 'o', 'e', 'l', 'p', 6, 'b', 'b', 'o', 'e', 'l', 'h', 5, 'b', 'b', 'o', 'e', 'm', 5, 'b', 'b', 'o', 'e', 'b', 6, 'b', 'b', 'o', 'e', 'b', 's',\n5, 'b', 'b', 'o', 'e', 's', 6, 'b', 'b', 'o', 'e', 's', 's', 6, 'b', 'b', 'o', 'e', 'n', 'g', 5, 'b', 'b', 'o', 'e', 'j', 5, 'b', 'b', 'o', 'e', 'c', 5, 'b', 'b', 'o', 'e', 'k',\n5, 'b', 'b', 'o', 'e', 't', 5, 'b', 'b', 'o', 'e', 'p', 5, 'b', 'b', 'o', 'e', 'h', 4, 'b', 'b', 'y', 'o', 5, 'b', 'b', 'y', 'o', 'g', 6, 'b', 'b', 'y', 'o', 'g', 'g',\n6, 'b', 'b', 'y', 'o', 'g', 's', 5, 'b', 'b', 'y', 'o', 'n', 6, 'b', 'b', 'y', 'o', 'n', 'j', 6, 'b', 'b', 'y', 'o', 'n', 'h', 5, 'b', 'b', 'y', 'o', 'd', 5, 'b', 'b', 'y', 'o', 'l',\n6, 'b', 'b', 'y', 'o', 'l', 'g', 6, 'b', 'b', 'y', 'o', 'l', 'm', 6, 'b', 'b', 'y', 'o', 'l', 'b', 6, 'b', 'b', 'y', 'o', 'l', 's', 6, 'b', 'b', 'y', 'o', 'l', 't', 6, 'b', 'b', 'y', 'o', 'l', 'p',\n6, 'b', 'b', 'y', 'o', 'l', 'h', 5, 'b', 'b', 'y', 'o', 'm', 5, 'b', 'b', 'y', 'o', 'b', 6, 'b', 'b', 'y', 'o', 'b', 's', 5, 'b', 'b', 'y', 'o', 's', 6, 'b', 'b', 'y', 'o', 's', 's',\n6, 'b', 'b', 'y', 'o', 'n', 'g', 5, 'b', 'b', 'y', 'o', 'j', 5, 'b', 'b', 'y', 'o', 'c', 5, 'b', 'b', 'y', 'o', 'k', 5, 'b', 'b', 'y', 'o', 't', 5, 'b', 'b', 'y', 'o', 'p',\n5, 'b', 'b', 'y', 'o', 'h', 3, 'b', 'b', 'u', 4, 'b', 'b', 'u', 'g', 5, 'b', 'b', 'u', 'g', 'g', 5, 'b', 'b', 'u', 'g', 's', 4, 'b', 'b', 'u', 'n',\n5, 'b', 'b', 'u', 'n', 'j', 5, 'b', 'b', 'u', 'n', 'h', 4, 'b', 'b', 'u', 'd', 4, 'b', 'b', 'u', 'l', 5, 'b', 'b', 'u', 'l', 'g', 5, 'b', 'b', 'u', 'l', 'm',\n5, 'b', 'b', 'u', 'l', 'b', 5, 'b', 'b', 'u', 'l', 's', 5, 'b', 'b', 'u', 'l', 't', 5, 'b', 'b', 'u', 'l', 'p', 5, 'b', 'b', 'u', 'l', 'h', 4, 'b', 'b', 'u', 'm',\n4, 'b', 'b', 'u', 'b', 5, 'b', 'b', 'u', 'b', 's', 4, 'b', 'b', 'u', 's', 5, 'b', 'b', 'u', 's', 's', 5, 'b', 'b', 'u', 'n', 'g', 4, 'b', 'b', 'u', 'j',\n4, 'b', 'b', 'u', 'c', 4, 'b', 'b', 'u', 'k', 4, 'b', 'b', 'u', 't', 4, 'b', 'b', 'u', 'p', 4, 'b', 'b', 'u', 'h', 5, 'b', 'b', 'w', 'e', 'o',\n6, 'b', 'b', 'w', 'e', 'o', 'g', 7, 'b', 'b', 'w', 'e', 'o', 'g', 'g', 7, 'b', 'b', 'w', 'e', 'o', 'g', 's', 6, 'b', 'b', 'w', 'e', 'o', 'n', 7, 'b', 'b', 'w', 'e', 'o', 'n', 'j', 7, 'b', 'b', 'w', 'e', 'o', 'n', 'h',\n6, 'b', 'b', 'w', 'e', 'o', 'd', 6, 'b', 'b', 'w', 'e', 'o', 'l', 7, 'b', 'b', 'w', 'e', 'o', 'l', 'g', 7, 'b', 'b', 'w', 'e', 'o', 'l', 'm', 7, 'b', 'b', 'w', 'e', 'o', 'l', 'b', 7, 'b', 'b', 'w', 'e', 'o', 'l', 's',\n7, 'b', 'b', 'w', 'e', 'o', 'l', 't', 7, 'b', 'b', 'w', 'e', 'o', 'l', 'p', 7, 'b', 'b', 'w', 'e', 'o', 'l', 'h', 6, 'b', 'b', 'w', 'e', 'o', 'm', 6, 'b', 'b', 'w', 'e', 'o', 'b', 7, 'b', 'b', 'w', 'e', 'o', 'b', 's',\n6, 'b', 'b', 'w', 'e', 'o', 's', 7, 'b', 'b', 'w', 'e', 'o', 's', 's', 7, 'b', 'b', 'w', 'e', 'o', 'n', 'g', 6, 'b', 'b', 'w', 'e', 'o', 'j', 6, 'b', 'b', 'w', 'e', 'o', 'c', 6, 'b', 'b', 'w', 'e', 'o', 'k',\n6, 'b', 'b', 'w', 'e', 'o', 't', 6, 'b', 'b', 'w', 'e', 'o', 'p', 6, 'b', 'b', 'w', 'e', 'o', 'h', 4, 'b', 'b', 'w', 'e', 5, 'b', 'b', 'w', 'e', 'g', 6, 'b', 'b', 'w', 'e', 'g', 'g',\n6, 'b', 'b', 'w', 'e', 'g', 's', 5, 'b', 'b', 'w', 'e', 'n', 6, 'b', 'b', 'w', 'e', 'n', 'j', 6, 'b', 'b', 'w', 'e', 'n', 'h', 5, 'b', 'b', 'w', 'e', 'd', 5, 'b', 'b', 'w', 'e', 'l',\n6, 'b', 'b', 'w', 'e', 'l', 'g', 6, 'b', 'b', 'w', 'e', 'l', 'm', 6, 'b', 'b', 'w', 'e', 'l', 'b', 6, 'b', 'b', 'w', 'e', 'l', 's', 6, 'b', 'b', 'w', 'e', 'l', 't', 6, 'b', 'b', 'w', 'e', 'l', 'p',\n6, 'b', 'b', 'w', 'e', 'l', 'h', 5, 'b', 'b', 'w', 'e', 'm', 5, 'b', 'b', 'w', 'e', 'b', 6, 'b', 'b', 'w', 'e', 'b', 's', 5, 'b', 'b', 'w', 'e', 's', 6, 'b', 'b', 'w', 'e', 's', 's',\n6, 'b', 'b', 'w', 'e', 'n', 'g', 5, 'b', 'b', 'w', 'e', 'j', 5, 'b', 'b', 'w', 'e', 'c', 5, 'b', 'b', 'w', 'e', 'k', 5, 'b', 'b', 'w', 'e', 't', 5, 'b', 'b', 'w', 'e', 'p',\n5, 'b', 'b', 'w', 'e', 'h', 4, 'b', 'b', 'w', 'i', 5, 'b', 'b', 'w', 'i', 'g', 6, 'b', 'b', 'w', 'i', 'g', 'g', 6, 'b', 'b', 'w', 'i', 'g', 's', 5, 'b', 'b', 'w', 'i', 'n',\n6, 'b', 'b', 'w', 'i', 'n', 'j', 6, 'b', 'b', 'w', 'i', 'n', 'h', 5, 'b', 'b', 'w', 'i', 'd', 5, 'b', 'b', 'w', 'i', 'l', 6, 'b', 'b', 'w', 'i', 'l', 'g', 6, 'b', 'b', 'w', 'i', 'l', 'm',\n6, 'b', 'b', 'w', 'i', 'l', 'b', 6, 'b', 'b', 'w', 'i', 'l', 's', 6, 'b', 'b', 'w', 'i', 'l', 't', 6, 'b', 'b', 'w', 'i', 'l', 'p', 6, 'b', 'b', 'w', 'i', 'l', 'h', 5, 'b', 'b', 'w', 'i', 'm',\n5, 'b', 'b', 'w', 'i', 'b', 6, 'b', 'b', 'w', 'i', 'b', 's', 5, 'b', 'b', 'w', 'i', 's', 6, 'b', 'b', 'w', 'i', 's', 's', 6, 'b', 'b', 'w', 'i', 'n', 'g', 5, 'b', 'b', 'w', 'i', 'j',\n5, 'b', 'b', 'w', 'i', 'c', 5, 'b', 'b', 'w', 'i', 'k', 5, 'b', 'b', 'w', 'i', 't', 5, 'b', 'b', 'w', 'i', 'p', 5, 'b', 'b', 'w', 'i', 'h', 4, 'b', 'b', 'y', 'u',\n5, 'b', 'b', 'y', 'u', 'g', 6, 'b', 'b', 'y', 'u', 'g', 'g', 6, 'b', 'b', 'y', 'u', 'g', 's', 5, 'b', 'b', 'y', 'u', 'n', 6, 'b', 'b', 'y', 'u', 'n', 'j', 6, 'b', 'b', 'y', 'u', 'n', 'h',\n5, 'b', 'b', 'y', 'u', 'd', 5, 'b', 'b', 'y', 'u', 'l', 6, 'b', 'b', 'y', 'u', 'l', 'g', 6, 'b', 'b', 'y', 'u', 'l', 'm', 6, 'b', 'b', 'y', 'u', 'l', 'b', 6, 'b', 'b', 'y', 'u', 'l', 's',\n6, 'b', 'b', 'y', 'u', 'l', 't', 6, 'b', 'b', 'y', 'u', 'l', 'p', 6, 'b', 'b', 'y', 'u', 'l', 'h', 5, 'b', 'b', 'y', 'u', 'm', 5, 'b', 'b', 'y', 'u', 'b', 6, 'b', 'b', 'y', 'u', 'b', 's',\n5, 'b', 'b', 'y', 'u', 's', 6, 'b', 'b', 'y', 'u', 's', 's', 6, 'b', 'b', 'y', 'u', 'n', 'g', 5, 'b', 'b', 'y', 'u', 'j', 5, 'b', 'b', 'y', 'u', 'c', 5, 'b', 'b', 'y', 'u', 'k',\n5, 'b', 'b', 'y', 'u', 't', 5, 'b', 'b', 'y', 'u', 'p', 5, 'b', 'b', 'y', 'u', 'h', 4, 'b', 'b', 'e', 'u', 5, 'b', 'b', 'e', 'u', 'g', 6, 'b', 'b', 'e', 'u', 'g', 'g',\n6, 'b', 'b', 'e', 'u', 'g', 's', 5, 'b', 'b', 'e', 'u', 'n', 6, 'b', 'b', 'e', 'u', 'n', 'j', 6, 'b', 'b', 'e', 'u', 'n', 'h', 5, 'b', 'b', 'e', 'u', 'd', 5, 'b', 'b', 'e', 'u', 'l',\n6, 'b', 'b', 'e', 'u', 'l', 'g', 6, 'b', 'b', 'e', 'u', 'l', 'm', 6, 'b', 'b', 'e', 'u', 'l', 'b', 6, 'b', 'b', 'e', 'u', 'l', 's', 6, 'b', 'b', 'e', 'u', 'l', 't', 6, 'b', 'b', 'e', 'u', 'l', 'p',\n6, 'b', 'b', 'e', 'u', 'l', 'h', 5, 'b', 'b', 'e', 'u', 'm', 5, 'b', 'b', 'e', 'u', 'b', 6, 'b', 'b', 'e', 'u', 'b', 's', 5, 'b', 'b', 'e', 'u', 's', 6, 'b', 'b', 'e', 'u', 's', 's',\n6, 'b', 'b', 'e', 'u', 'n', 'g', 5, 'b', 'b', 'e', 'u', 'j', 5, 'b', 'b', 'e', 'u', 'c', 5, 'b', 'b', 'e', 'u', 'k', 5, 'b', 'b', 'e', 'u', 't', 5, 'b', 'b', 'e', 'u', 'p',\n5, 'b', 'b', 'e', 'u', 'h', 4, 'b', 'b', 'y', 'i', 5, 'b', 'b', 'y', 'i', 'g', 6, 'b', 'b', 'y', 'i', 'g', 'g', 6, 'b', 'b', 'y', 'i', 'g', 's', 5, 'b', 'b', 'y', 'i', 'n',\n6, 'b', 'b', 'y', 'i', 'n', 'j', 6, 'b', 'b', 'y', 'i', 'n', 'h', 5, 'b', 'b', 'y', 'i', 'd', 5, 'b', 'b', 'y', 'i', 'l', 6, 'b', 'b', 'y', 'i', 'l', 'g', 6, 'b', 'b', 'y', 'i', 'l', 'm',\n6, 'b', 'b', 'y', 'i', 'l', 'b', 6, 'b', 'b', 'y', 'i', 'l', 's', 6, 'b', 'b', 'y', 'i', 'l', 't', 6, 'b', 'b', 'y', 'i', 'l', 'p', 6, 'b', 'b', 'y', 'i', 'l', 'h', 5, 'b', 'b', 'y', 'i', 'm',\n5, 'b', 'b', 'y', 'i', 'b', 6, 'b', 'b', 'y', 'i', 'b', 's', 5, 'b', 'b', 'y', 'i', 's', 6, 'b', 'b', 'y', 'i', 's', 's', 6, 'b', 'b', 'y', 'i', 'n', 'g', 5, 'b', 'b', 'y', 'i', 'j',\n5, 'b', 'b', 'y', 'i', 'c', 5, 'b', 'b', 'y', 'i', 'k', 5, 'b', 'b', 'y', 'i', 't', 5, 'b', 'b', 'y', 'i', 'p', 5, 'b', 'b', 'y', 'i', 'h', 3, 'b', 'b', 'i',\n4, 'b', 'b', 'i', 'g', 5, 'b', 'b', 'i', 'g', 'g', 5, 'b', 'b', 'i', 'g', 's', 4, 'b', 'b', 'i', 'n', 5, 'b', 'b', 'i', 'n', 'j', 5, 'b', 'b', 'i', 'n', 'h',\n4, 'b', 'b', 'i', 'd', 4, 'b', 'b', 'i', 'l', 5, 'b', 'b', 'i', 'l', 'g', 5, 'b', 'b', 'i', 'l', 'm', 5, 'b', 'b', 'i', 'l', 'b', 5, 'b', 'b', 'i', 'l', 's',\n5, 'b', 'b', 'i', 'l', 't', 5, 'b', 'b', 'i', 'l', 'p', 5, 'b', 'b', 'i', 'l', 'h', 4, 'b', 'b', 'i', 'm', 4, 'b', 'b', 'i', 'b', 5, 'b', 'b', 'i', 'b', 's',\n4, 'b', 'b', 'i', 's', 5, 'b', 'b', 'i', 's', 's', 5, 'b', 'b', 'i', 'n', 'g', 4, 'b', 'b', 'i', 'j', 4, 'b', 'b', 'i', 'c', 4, 'b', 'b', 'i', 'k',\n4, 'b', 'b', 'i', 't', 4, 'b', 'b', 'i', 'p', 4, 'b', 'b', 'i', 'h', 2, 's', 'a', 3, 's', 'a', 'g', 4, 's', 'a', 'g', 'g',\n4, 's', 'a', 'g', 's', 3, 's', 'a', 'n', 4, 's', 'a', 'n', 'j', 4, 's', 'a', 'n', 'h', 3, 's', 'a', 'd', 3, 's', 'a', 'l',\n4, 's', 'a', 'l', 'g', 4, 's', 'a', 'l', 'm', 4, 's', 'a', 'l', 'b', 4, 's', 'a', 'l', 's', 4, 's', 'a', 'l', 't', 4, 's', 'a', 'l', 'p',\n4, 's', 'a', 'l', 'h', 3, 's', 'a', 'm', 3, 's', 'a', 'b', 4, 's', 'a', 'b', 's', 3, 's', 'a', 's', 4, 's', 'a', 's', 's',\n4, 's', 'a', 'n', 'g', 3, 's', 'a', 'j', 3, 's', 'a', 'c', 3, 's', 'a', 'k', 3, 's', 'a', 't', 3, 's', 'a', 'p',\n3, 's', 'a', 'h', 3, 's', 'a', 'e', 4, 's', 'a', 'e', 'g', 5, 's', 'a', 'e', 'g', 'g', 5, 's', 'a', 'e', 'g', 's', 4, 's', 'a', 'e', 'n',\n5, 's', 'a', 'e', 'n', 'j', 5, 's', 'a', 'e', 'n', 'h', 4, 's', 'a', 'e', 'd', 4, 's', 'a', 'e', 'l', 5, 's', 'a', 'e', 'l', 'g', 5, 's', 'a', 'e', 'l', 'm',\n5, 's', 'a', 'e', 'l', 'b', 5, 's', 'a', 'e', 'l', 's', 5, 's', 'a', 'e', 'l', 't', 5, 's', 'a', 'e', 'l', 'p', 5, 's', 'a', 'e', 'l', 'h', 4, 's', 'a', 'e', 'm',\n4, 's', 'a', 'e', 'b', 5, 's', 'a', 'e', 'b', 's', 4, 's', 'a', 'e', 's', 5, 's', 'a', 'e', 's', 's', 5, 's', 'a', 'e', 'n', 'g', 4, 's', 'a', 'e', 'j',\n4, 's', 'a', 'e', 'c', 4, 's', 'a', 'e', 'k', 4, 's', 'a', 'e', 't', 4, 's', 'a', 'e', 'p', 4, 's', 'a', 'e', 'h', 3, 's', 'y', 'a',\n4, 's', 'y', 'a', 'g', 5, 's', 'y', 'a', 'g', 'g', 5, 's', 'y', 'a', 'g', 's', 4, 's', 'y', 'a', 'n', 5, 's', 'y', 'a', 'n', 'j', 5, 's', 'y', 'a', 'n', 'h',\n4, 's', 'y', 'a', 'd', 4, 's', 'y', 'a', 'l', 5, 's', 'y', 'a', 'l', 'g', 5, 's', 'y', 'a', 'l', 'm', 5, 's', 'y', 'a', 'l', 'b', 5, 's', 'y', 'a', 'l', 's',\n5, 's', 'y', 'a', 'l', 't', 5, 's', 'y', 'a', 'l', 'p', 5, 's', 'y', 'a', 'l', 'h', 4, 's', 'y', 'a', 'm', 4, 's', 'y', 'a', 'b', 5, 's', 'y', 'a', 'b', 's',\n4, 's', 'y', 'a', 's', 5, 's', 'y', 'a', 's', 's', 5, 's', 'y', 'a', 'n', 'g', 4, 's', 'y', 'a', 'j', 4, 's', 'y', 'a', 'c', 4, 's', 'y', 'a', 'k',\n4, 's', 'y', 'a', 't', 4, 's', 'y', 'a', 'p', 4, 's', 'y', 'a', 'h', 4, 's', 'y', 'a', 'e', 5, 's', 'y', 'a', 'e', 'g', 6, 's', 'y', 'a', 'e', 'g', 'g',\n6, 's', 'y', 'a', 'e', 'g', 's', 5, 's', 'y', 'a', 'e', 'n', 6, 's', 'y', 'a', 'e', 'n', 'j', 6, 's', 'y', 'a', 'e', 'n', 'h', 5, 's', 'y', 'a', 'e', 'd', 5, 's', 'y', 'a', 'e', 'l',\n6, 's', 'y', 'a', 'e', 'l', 'g', 6, 's', 'y', 'a', 'e', 'l', 'm', 6, 's', 'y', 'a', 'e', 'l', 'b', 6, 's', 'y', 'a', 'e', 'l', 's', 6, 's', 'y', 'a', 'e', 'l', 't', 6, 's', 'y', 'a', 'e', 'l', 'p',\n6, 's', 'y', 'a', 'e', 'l', 'h', 5, 's', 'y', 'a', 'e', 'm', 5, 's', 'y', 'a', 'e', 'b', 6, 's', 'y', 'a', 'e', 'b', 's', 5, 's', 'y', 'a', 'e', 's', 6, 's', 'y', 'a', 'e', 's', 's',\n6, 's', 'y', 'a', 'e', 'n', 'g', 5, 's', 'y', 'a', 'e', 'j', 5, 's', 'y', 'a', 'e', 'c', 5, 's', 'y', 'a', 'e', 'k', 5, 's', 'y', 'a', 'e', 't', 5, 's', 'y', 'a', 'e', 'p',\n5, 's', 'y', 'a', 'e', 'h', 3, 's', 'e', 'o', 4, 's', 'e', 'o', 'g', 5, 's', 'e', 'o', 'g', 'g', 5, 's', 'e', 'o', 'g', 's', 4, 's', 'e', 'o', 'n',\n5, 's', 'e', 'o', 'n', 'j', 5, 's', 'e', 'o', 'n', 'h', 4, 's', 'e', 'o', 'd', 4, 's', 'e', 'o', 'l', 5, 's', 'e', 'o', 'l', 'g', 5, 's', 'e', 'o', 'l', 'm',\n5, 's', 'e', 'o', 'l', 'b', 5, 's', 'e', 'o', 'l', 's', 5, 's', 'e', 'o', 'l', 't', 5, 's', 'e', 'o', 'l', 'p', 5, 's', 'e', 'o', 'l', 'h', 4, 's', 'e', 'o', 'm',\n4, 's', 'e', 'o', 'b', 5, 's', 'e', 'o', 'b', 's', 4, 's', 'e', 'o', 's', 5, 's', 'e', 'o', 's', 's', 5, 's', 'e', 'o', 'n', 'g', 4, 's', 'e', 'o', 'j',\n4, 's', 'e', 'o', 'c', 4, 's', 'e', 'o', 'k', 4, 's', 'e', 'o', 't', 4, 's', 'e', 'o', 'p', 4, 's', 'e', 'o', 'h', 2, 's', 'e',\n3, 's', 'e', 'g', 4, 's', 'e', 'g', 'g', 4, 's', 'e', 'g', 's', 3, 's', 'e', 'n', 4, 's', 'e', 'n', 'j', 4, 's', 'e', 'n', 'h',\n3, 's', 'e', 'd', 3, 's', 'e', 'l', 4, 's', 'e', 'l', 'g', 4, 's', 'e', 'l', 'm', 4, 's', 'e', 'l', 'b', 4, 's', 'e', 'l', 's',\n4, 's', 'e', 'l', 't', 4, 's', 'e', 'l', 'p', 4, 's', 'e', 'l', 'h', 3, 's', 'e', 'm', 3, 's', 'e', 'b', 4, 's', 'e', 'b', 's',\n3, 's', 'e', 's', 4, 's', 'e', 's', 's', 4, 's', 'e', 'n', 'g', 3, 's', 'e', 'j', 3, 's', 'e', 'c', 3, 's', 'e', 'k',\n3, 's', 'e', 't', 3, 's', 'e', 'p', 3, 's', 'e', 'h', 4, 's', 'y', 'e', 'o', 5, 's', 'y', 'e', 'o', 'g', 6, 's', 'y', 'e', 'o', 'g', 'g',\n6, 's', 'y', 'e', 'o', 'g', 's', 5, 's', 'y', 'e', 'o', 'n', 6, 's', 'y', 'e', 'o', 'n', 'j', 6, 's', 'y', 'e', 'o', 'n', 'h', 5, 's', 'y', 'e', 'o', 'd', 5, 's', 'y', 'e', 'o', 'l',\n6, 's', 'y', 'e', 'o', 'l', 'g', 6, 's', 'y', 'e', 'o', 'l', 'm', 6, 's', 'y', 'e', 'o', 'l', 'b', 6, 's', 'y', 'e', 'o', 'l', 's', 6, 's', 'y', 'e', 'o', 'l', 't', 6, 's', 'y', 'e', 'o', 'l', 'p',\n6, 's', 'y', 'e', 'o', 'l', 'h', 5, 's', 'y', 'e', 'o', 'm', 5, 's', 'y', 'e', 'o', 'b', 6, 's', 'y', 'e', 'o', 'b', 's', 5, 's', 'y', 'e', 'o', 's', 6, 's', 'y', 'e', 'o', 's', 's',\n6, 's', 'y', 'e', 'o', 'n', 'g', 5, 's', 'y', 'e', 'o', 'j', 5, 's', 'y', 'e', 'o', 'c', 5, 's', 'y', 'e', 'o', 'k', 5, 's', 'y', 'e', 'o', 't', 5, 's', 'y', 'e', 'o', 'p',\n5, 's', 'y', 'e', 'o', 'h', 3, 's', 'y', 'e', 4, 's', 'y', 'e', 'g', 5, 's', 'y', 'e', 'g', 'g', 5, 's', 'y', 'e', 'g', 's', 4, 's', 'y', 'e', 'n',\n5, 's', 'y', 'e', 'n', 'j', 5, 's', 'y', 'e', 'n', 'h', 4, 's', 'y', 'e', 'd', 4, 's', 'y', 'e', 'l', 5, 's', 'y', 'e', 'l', 'g', 5, 's', 'y', 'e', 'l', 'm',\n5, 's', 'y', 'e', 'l', 'b', 5, 's', 'y', 'e', 'l', 's', 5, 's', 'y', 'e', 'l', 't', 5, 's', 'y', 'e', 'l', 'p', 5, 's', 'y', 'e', 'l', 'h', 4, 's', 'y', 'e', 'm',\n4, 's', 'y', 'e', 'b', 5, 's', 'y', 'e', 'b', 's', 4, 's', 'y', 'e', 's', 5, 's', 'y', 'e', 's', 's', 5, 's', 'y', 'e', 'n', 'g', 4, 's', 'y', 'e', 'j',\n4, 's', 'y', 'e', 'c', 4, 's', 'y', 'e', 'k', 4, 's', 'y', 'e', 't', 4, 's', 'y', 'e', 'p', 4, 's', 'y', 'e', 'h', 2, 's', 'o',\n3, 's', 'o', 'g', 4, 's', 'o', 'g', 'g', 4, 's', 'o', 'g', 's', 3, 's', 'o', 'n', 4, 's', 'o', 'n', 'j', 4, 's', 'o', 'n', 'h',\n3, 's', 'o', 'd', 3, 's', 'o', 'l', 4, 's', 'o', 'l', 'g', 4, 's', 'o', 'l', 'm', 4, 's', 'o', 'l', 'b', 4, 's', 'o', 'l', 's',\n4, 's', 'o', 'l', 't', 4, 's', 'o', 'l', 'p', 4, 's', 'o', 'l', 'h', 3, 's', 'o', 'm', 3, 's', 'o', 'b', 4, 's', 'o', 'b', 's',\n3, 's', 'o', 's', 4, 's', 'o', 's', 's', 4, 's', 'o', 'n', 'g', 3, 's', 'o', 'j', 3, 's', 'o', 'c', 3, 's', 'o', 'k',\n3, 's', 'o', 't', 3, 's', 'o', 'p', 3, 's', 'o', 'h', 3, 's', 'w', 'a', 4, 's', 'w', 'a', 'g', 5, 's', 'w', 'a', 'g', 'g',\n5, 's', 'w', 'a', 'g', 's', 4, 's', 'w', 'a', 'n', 5, 's', 'w', 'a', 'n', 'j', 5, 's', 'w', 'a', 'n', 'h', 4, 's', 'w', 'a', 'd', 4, 's', 'w', 'a', 'l',\n5, 's', 'w', 'a', 'l', 'g', 5, 's', 'w', 'a', 'l', 'm', 5, 's', 'w', 'a', 'l', 'b', 5, 's', 'w', 'a', 'l', 's', 5, 's', 'w', 'a', 'l', 't', 5, 's', 'w', 'a', 'l', 'p',\n5, 's', 'w', 'a', 'l', 'h', 4, 's', 'w', 'a', 'm', 4, 's', 'w', 'a', 'b', 5, 's', 'w', 'a', 'b', 's', 4, 's', 'w', 'a', 's', 5, 's', 'w', 'a', 's', 's',\n5, 's', 'w', 'a', 'n', 'g', 4, 's', 'w', 'a', 'j', 4, 's', 'w', 'a', 'c', 4, 's', 'w', 'a', 'k', 4, 's', 'w', 'a', 't', 4, 's', 'w', 'a', 'p',\n4, 's', 'w', 'a', 'h', 4, 's', 'w', 'a', 'e', 5, 's', 'w', 'a', 'e', 'g', 6, 's', 'w', 'a', 'e', 'g', 'g', 6, 's', 'w', 'a', 'e', 'g', 's', 5, 's', 'w', 'a', 'e', 'n',\n6, 's', 'w', 'a', 'e', 'n', 'j', 6, 's', 'w', 'a', 'e', 'n', 'h', 5, 's', 'w', 'a', 'e', 'd', 5, 's', 'w', 'a', 'e', 'l', 6, 's', 'w', 'a', 'e', 'l', 'g', 6, 's', 'w', 'a', 'e', 'l', 'm',\n6, 's', 'w', 'a', 'e', 'l', 'b', 6, 's', 'w', 'a', 'e', 'l', 's', 6, 's', 'w', 'a', 'e', 'l', 't', 6, 's', 'w', 'a', 'e', 'l', 'p', 6, 's', 'w', 'a', 'e', 'l', 'h', 5, 's', 'w', 'a', 'e', 'm',\n5, 's', 'w', 'a', 'e', 'b', 6, 's', 'w', 'a', 'e', 'b', 's', 5, 's', 'w', 'a', 'e', 's', 6, 's', 'w', 'a', 'e', 's', 's', 6, 's', 'w', 'a', 'e', 'n', 'g', 5, 's', 'w', 'a', 'e', 'j',\n5, 's', 'w', 'a', 'e', 'c', 5, 's', 'w', 'a', 'e', 'k', 5, 's', 'w', 'a', 'e', 't', 5, 's', 'w', 'a', 'e', 'p', 5, 's', 'w', 'a', 'e', 'h', 3, 's', 'o', 'e',\n4, 's', 'o', 'e', 'g', 5, 's', 'o', 'e', 'g', 'g', 5, 's', 'o', 'e', 'g', 's', 4, 's', 'o', 'e', 'n', 5, 's', 'o', 'e', 'n', 'j', 5, 's', 'o', 'e', 'n', 'h',\n4, 's', 'o', 'e', 'd', 4, 's', 'o', 'e', 'l', 5, 's', 'o', 'e', 'l', 'g', 5, 's', 'o', 'e', 'l', 'm', 5, 's', 'o', 'e', 'l', 'b', 5, 's', 'o', 'e', 'l', 's',\n5, 's', 'o', 'e', 'l', 't', 5, 's', 'o', 'e', 'l', 'p', 5, 's', 'o', 'e', 'l', 'h', 4, 's', 'o', 'e', 'm', 4, 's', 'o', 'e', 'b', 5, 's', 'o', 'e', 'b', 's',\n4, 's', 'o', 'e', 's', 5, 's', 'o', 'e', 's', 's', 5, 's', 'o', 'e', 'n', 'g', 4, 's', 'o', 'e', 'j', 4, 's', 'o', 'e', 'c', 4, 's', 'o', 'e', 'k',\n4, 's', 'o', 'e', 't', 4, 's', 'o', 'e', 'p', 4, 's', 'o', 'e', 'h', 3, 's', 'y', 'o', 4, 's', 'y', 'o', 'g', 5, 's', 'y', 'o', 'g', 'g',\n5, 's', 'y', 'o', 'g', 's', 4, 's', 'y', 'o', 'n', 5, 's', 'y', 'o', 'n', 'j', 5, 's', 'y', 'o', 'n', 'h', 4, 's', 'y', 'o', 'd', 4, 's', 'y', 'o', 'l',\n5, 's', 'y', 'o', 'l', 'g', 5, 's', 'y', 'o', 'l', 'm', 5, 's', 'y', 'o', 'l', 'b', 5, 's', 'y', 'o', 'l', 's', 5, 's', 'y', 'o', 'l', 't', 5, 's', 'y', 'o', 'l', 'p',\n5, 's', 'y', 'o', 'l', 'h', 4, 's', 'y', 'o', 'm', 4, 's', 'y', 'o', 'b', 5, 's', 'y', 'o', 'b', 's', 4, 's', 'y', 'o', 's', 5, 's', 'y', 'o', 's', 's',\n5, 's', 'y', 'o', 'n', 'g', 4, 's', 'y', 'o', 'j', 4, 's', 'y', 'o', 'c', 4, 's', 'y', 'o', 'k', 4, 's', 'y', 'o', 't', 4, 's', 'y', 'o', 'p',\n4, 's', 'y', 'o', 'h', 2, 's', 'u', 3, 's', 'u', 'g', 4, 's', 'u', 'g', 'g', 4, 's', 'u', 'g', 's', 3, 's', 'u', 'n',\n4, 's', 'u', 'n', 'j', 4, 's', 'u', 'n', 'h', 3, 's', 'u', 'd', 3, 's', 'u', 'l', 4, 's', 'u', 'l', 'g', 4, 's', 'u', 'l', 'm',\n4, 's', 'u', 'l', 'b', 4, 's', 'u', 'l', 's', 4, 's', 'u', 'l', 't', 4, 's', 'u', 'l', 'p', 4, 's', 'u', 'l', 'h', 3, 's', 'u', 'm',\n3, 's', 'u', 'b', 4, 's', 'u', 'b', 's', 3, 's', 'u', 's', 4, 's', 'u', 's', 's', 4, 's', 'u', 'n', 'g', 3, 's', 'u', 'j',\n3, 's', 'u', 'c', 3, 's', 'u', 'k', 3, 's', 'u', 't', 3, 's', 'u', 'p', 3, 's', 'u', 'h', 4, 's', 'w', 'e', 'o',\n5, 's', 'w', 'e', 'o', 'g', 6, 's', 'w', 'e', 'o', 'g', 'g', 6, 's', 'w', 'e', 'o', 'g', 's', 5, 's', 'w', 'e', 'o', 'n', 6, 's', 'w', 'e', 'o', 'n', 'j', 6, 's', 'w', 'e', 'o', 'n', 'h',\n5, 's', 'w', 'e', 'o', 'd', 5, 's', 'w', 'e', 'o', 'l', 6, 's', 'w', 'e', 'o', 'l', 'g', 6, 's', 'w', 'e', 'o', 'l', 'm', 6, 's', 'w', 'e', 'o', 'l', 'b', 6, 's', 'w', 'e', 'o', 'l', 's',\n6, 's', 'w', 'e', 'o', 'l', 't', 6, 's', 'w', 'e', 'o', 'l', 'p', 6, 's', 'w', 'e', 'o', 'l', 'h', 5, 's', 'w', 'e', 'o', 'm', 5, 's', 'w', 'e', 'o', 'b', 6, 's', 'w', 'e', 'o', 'b', 's',\n5, 's', 'w', 'e', 'o', 's', 6, 's', 'w', 'e', 'o', 's', 's', 6, 's', 'w', 'e', 'o', 'n', 'g', 5, 's', 'w', 'e', 'o', 'j', 5, 's', 'w', 'e', 'o', 'c', 5, 's', 'w', 'e', 'o', 'k',\n5, 's', 'w', 'e', 'o', 't', 5, 's', 'w', 'e', 'o', 'p', 5, 's', 'w', 'e', 'o', 'h', 3, 's', 'w', 'e', 4, 's', 'w', 'e', 'g', 5, 's', 'w', 'e', 'g', 'g',\n5, 's', 'w', 'e', 'g', 's', 4, 's', 'w', 'e', 'n', 5, 's', 'w', 'e', 'n', 'j', 5, 's', 'w', 'e', 'n', 'h', 4, 's', 'w', 'e', 'd', 4, 's', 'w', 'e', 'l',\n5, 's', 'w', 'e', 'l', 'g', 5, 's', 'w', 'e', 'l', 'm', 5, 's', 'w', 'e', 'l', 'b', 5, 's', 'w', 'e', 'l', 's', 5, 's', 'w', 'e', 'l', 't', 5, 's', 'w', 'e', 'l', 'p',\n5, 's', 'w', 'e', 'l', 'h', 4, 's', 'w', 'e', 'm', 4, 's', 'w', 'e', 'b', 5, 's', 'w', 'e', 'b', 's', 4, 's', 'w', 'e', 's', 5, 's', 'w', 'e', 's', 's',\n5, 's', 'w', 'e', 'n', 'g', 4, 's', 'w', 'e', 'j', 4, 's', 'w', 'e', 'c', 4, 's', 'w', 'e', 'k', 4, 's', 'w', 'e', 't', 4, 's', 'w', 'e', 'p',\n4, 's', 'w', 'e', 'h', 3, 's', 'w', 'i', 4, 's', 'w', 'i', 'g', 5, 's', 'w', 'i', 'g', 'g', 5, 's', 'w', 'i', 'g', 's', 4, 's', 'w', 'i', 'n',\n5, 's', 'w', 'i', 'n', 'j', 5, 's', 'w', 'i', 'n', 'h', 4, 's', 'w', 'i', 'd', 4, 's', 'w', 'i', 'l', 5, 's', 'w', 'i', 'l', 'g', 5, 's', 'w', 'i', 'l', 'm',\n5, 's', 'w', 'i', 'l', 'b', 5, 's', 'w', 'i', 'l', 's', 5, 's', 'w', 'i', 'l', 't', 5, 's', 'w', 'i', 'l', 'p', 5, 's', 'w', 'i', 'l', 'h', 4, 's', 'w', 'i', 'm',\n4, 's', 'w', 'i', 'b', 5, 's', 'w', 'i', 'b', 's', 4, 's', 'w', 'i', 's', 5, 's', 'w', 'i', 's', 's', 5, 's', 'w', 'i', 'n', 'g', 4, 's', 'w', 'i', 'j',\n4, 's', 'w', 'i', 'c', 4, 's', 'w', 'i', 'k', 4, 's', 'w', 'i', 't', 4, 's', 'w', 'i', 'p', 4, 's', 'w', 'i', 'h', 3, 's', 'y', 'u',\n4, 's', 'y', 'u', 'g', 5, 's', 'y', 'u', 'g', 'g', 5, 's', 'y', 'u', 'g', 's', 4, 's', 'y', 'u', 'n', 5, 's', 'y', 'u', 'n', 'j', 5, 's', 'y', 'u', 'n', 'h',\n4, 's', 'y', 'u', 'd', 4, 's', 'y', 'u', 'l', 5, 's', 'y', 'u', 'l', 'g', 5, 's', 'y', 'u', 'l', 'm', 5, 's', 'y', 'u', 'l', 'b', 5, 's', 'y', 'u', 'l', 's',\n5, 's', 'y', 'u', 'l', 't', 5, 's', 'y', 'u', 'l', 'p', 5, 's', 'y', 'u', 'l', 'h', 4, 's', 'y', 'u', 'm', 4, 's', 'y', 'u', 'b', 5, 's', 'y', 'u', 'b', 's',\n4, 's', 'y', 'u', 's', 5, 's', 'y', 'u', 's', 's', 5, 's', 'y', 'u', 'n', 'g', 4, 's', 'y', 'u', 'j', 4, 's', 'y', 'u', 'c', 4, 's', 'y', 'u', 'k',\n4, 's', 'y', 'u', 't', 4, 's', 'y', 'u', 'p', 4, 's', 'y', 'u', 'h', 3, 's', 'e', 'u', 4, 's', 'e', 'u', 'g', 5, 's', 'e', 'u', 'g', 'g',\n5, 's', 'e', 'u', 'g', 's', 4, 's', 'e', 'u', 'n', 5, 's', 'e', 'u', 'n', 'j', 5, 's', 'e', 'u', 'n', 'h', 4, 's', 'e', 'u', 'd', 4, 's', 'e', 'u', 'l',\n5, 's', 'e', 'u', 'l', 'g', 5, 's', 'e', 'u', 'l', 'm', 5, 's', 'e', 'u', 'l', 'b', 5, 's', 'e', 'u', 'l', 's', 5, 's', 'e', 'u', 'l', 't', 5, 's', 'e', 'u', 'l', 'p',\n5, 's', 'e', 'u', 'l', 'h', 4, 's', 'e', 'u', 'm', 4, 's', 'e', 'u', 'b', 5, 's', 'e', 'u', 'b', 's', 4, 's', 'e', 'u', 's', 5, 's', 'e', 'u', 's', 's',\n5, 's', 'e', 'u', 'n', 'g', 4, 's', 'e', 'u', 'j', 4, 's', 'e', 'u', 'c', 4, 's', 'e', 'u', 'k', 4, 's', 'e', 'u', 't', 4, 's', 'e', 'u', 'p',\n4, 's', 'e', 'u', 'h', 3, 's', 'y', 'i', 4, 's', 'y', 'i', 'g', 5, 's', 'y', 'i', 'g', 'g', 5, 's', 'y', 'i', 'g', 's', 4, 's', 'y', 'i', 'n',\n5, 's', 'y', 'i', 'n', 'j', 5, 's', 'y', 'i', 'n', 'h', 4, 's', 'y', 'i', 'd', 4, 's', 'y', 'i', 'l', 5, 's', 'y', 'i', 'l', 'g', 5, 's', 'y', 'i', 'l', 'm',\n5, 's', 'y', 'i', 'l', 'b', 5, 's', 'y', 'i', 'l', 's', 5, 's', 'y', 'i', 'l', 't', 5, 's', 'y', 'i', 'l', 'p', 5, 's', 'y', 'i', 'l', 'h', 4, 's', 'y', 'i', 'm',\n4, 's', 'y', 'i', 'b', 5, 's', 'y', 'i', 'b', 's', 4, 's', 'y', 'i', 's', 5, 's', 'y', 'i', 's', 's', 5, 's', 'y', 'i', 'n', 'g', 4, 's', 'y', 'i', 'j',\n4, 's', 'y', 'i', 'c', 4, 's', 'y', 'i', 'k', 4, 's', 'y', 'i', 't', 4, 's', 'y', 'i', 'p', 4, 's', 'y', 'i', 'h', 2, 's', 'i',\n3, 's', 'i', 'g', 4, 's', 'i', 'g', 'g', 4, 's', 'i', 'g', 's', 3, 's', 'i', 'n', 4, 's', 'i', 'n', 'j', 4, 's', 'i', 'n', 'h',\n3, 's', 'i', 'd', 3, 's', 'i', 'l', 4, 's', 'i', 'l', 'g', 4, 's', 'i', 'l', 'm', 4, 's', 'i', 'l', 'b', 4, 's', 'i', 'l', 's',\n4, 's', 'i', 'l', 't', 4, 's', 'i', 'l', 'p', 4, 's', 'i', 'l', 'h', 3, 's', 'i', 'm', 3, 's', 'i', 'b', 4, 's', 'i', 'b', 's',\n3, 's', 'i', 's', 4, 's', 'i', 's', 's', 4, 's', 'i', 'n', 'g', 3, 's', 'i', 'j', 3, 's', 'i', 'c', 3, 's', 'i', 'k',\n3, 's', 'i', 't', 3, 's', 'i', 'p', 3, 's', 'i', 'h', 3, 's', 's', 'a', 4, 's', 's', 'a', 'g', 5, 's', 's', 'a', 'g', 'g',\n5, 's', 's', 'a', 'g', 's', 4, 's', 's', 'a', 'n', 5, 's', 's', 'a', 'n', 'j', 5, 's', 's', 'a', 'n', 'h', 4, 's', 's', 'a', 'd', 4, 's', 's', 'a', 'l',\n5, 's', 's', 'a', 'l', 'g', 5, 's', 's', 'a', 'l', 'm', 5, 's', 's', 'a', 'l', 'b', 5, 's', 's', 'a', 'l', 's', 5, 's', 's', 'a', 'l', 't', 5, 's', 's', 'a', 'l', 'p',\n5, 's', 's', 'a', 'l', 'h', 4, 's', 's', 'a', 'm', 4, 's', 's', 'a', 'b', 5, 's', 's', 'a', 'b', 's', 4, 's', 's', 'a', 's', 5, 's', 's', 'a', 's', 's',\n5, 's', 's', 'a', 'n', 'g', 4, 's', 's', 'a', 'j', 4, 's', 's', 'a', 'c', 4, 's', 's', 'a', 'k', 4, 's', 's', 'a', 't', 4, 's', 's', 'a', 'p',\n4, 's', 's', 'a', 'h', 4, 's', 's', 'a', 'e', 5, 's', 's', 'a', 'e', 'g', 6, 's', 's', 'a', 'e', 'g', 'g', 6, 's', 's', 'a', 'e', 'g', 's', 5, 's', 's', 'a', 'e', 'n',\n6, 's', 's', 'a', 'e', 'n', 'j', 6, 's', 's', 'a', 'e', 'n', 'h', 5, 's', 's', 'a', 'e', 'd', 5, 's', 's', 'a', 'e', 'l', 6, 's', 's', 'a', 'e', 'l', 'g', 6, 's', 's', 'a', 'e', 'l', 'm',\n6, 's', 's', 'a', 'e', 'l', 'b', 6, 's', 's', 'a', 'e', 'l', 's', 6, 's', 's', 'a', 'e', 'l', 't', 6, 's', 's', 'a', 'e', 'l', 'p', 6, 's', 's', 'a', 'e', 'l', 'h', 5, 's', 's', 'a', 'e', 'm',\n5, 's', 's', 'a', 'e', 'b', 6, 's', 's', 'a', 'e', 'b', 's', 5, 's', 's', 'a', 'e', 's', 6, 's', 's', 'a', 'e', 's', 's', 6, 's', 's', 'a', 'e', 'n', 'g', 5, 's', 's', 'a', 'e', 'j',\n5, 's', 's', 'a', 'e', 'c', 5, 's', 's', 'a', 'e', 'k', 5, 's', 's', 'a', 'e', 't', 5, 's', 's', 'a', 'e', 'p', 5, 's', 's', 'a', 'e', 'h', 4, 's', 's', 'y', 'a',\n5, 's', 's', 'y', 'a', 'g', 6, 's', 's', 'y', 'a', 'g', 'g', 6, 's', 's', 'y', 'a', 'g', 's', 5, 's', 's', 'y', 'a', 'n', 6, 's', 's', 'y', 'a', 'n', 'j', 6, 's', 's', 'y', 'a', 'n', 'h',\n5, 's', 's', 'y', 'a', 'd', 5, 's', 's', 'y', 'a', 'l', 6, 's', 's', 'y', 'a', 'l', 'g', 6, 's', 's', 'y', 'a', 'l', 'm', 6, 's', 's', 'y', 'a', 'l', 'b', 6, 's', 's', 'y', 'a', 'l', 's',\n6, 's', 's', 'y', 'a', 'l', 't', 6, 's', 's', 'y', 'a', 'l', 'p', 6, 's', 's', 'y', 'a', 'l', 'h', 5, 's', 's', 'y', 'a', 'm', 5, 's', 's', 'y', 'a', 'b', 6, 's', 's', 'y', 'a', 'b', 's',\n5, 's', 's', 'y', 'a', 's', 6, 's', 's', 'y', 'a', 's', 's', 6, 's', 's', 'y', 'a', 'n', 'g', 5, 's', 's', 'y', 'a', 'j', 5, 's', 's', 'y', 'a', 'c', 5, 's', 's', 'y', 'a', 'k',\n5, 's', 's', 'y', 'a', 't', 5, 's', 's', 'y', 'a', 'p', 5, 's', 's', 'y', 'a', 'h', 5, 's', 's', 'y', 'a', 'e', 6, 's', 's', 'y', 'a', 'e', 'g', 7, 's', 's', 'y', 'a', 'e', 'g', 'g',\n7, 's', 's', 'y', 'a', 'e', 'g', 's', 6, 's', 's', 'y', 'a', 'e', 'n', 7, 's', 's', 'y', 'a', 'e', 'n', 'j', 7, 's', 's', 'y', 'a', 'e', 'n', 'h', 6, 's', 's', 'y', 'a', 'e', 'd', 6, 's', 's', 'y', 'a', 'e', 'l',\n7, 's', 's', 'y', 'a', 'e', 'l', 'g', 7, 's', 's', 'y', 'a', 'e', 'l', 'm', 7, 's', 's', 'y', 'a', 'e', 'l', 'b', 7, 's', 's', 'y', 'a', 'e', 'l', 's', 7, 's', 's', 'y', 'a', 'e', 'l', 't', 7, 's', 's', 'y', 'a', 'e', 'l', 'p',\n7, 's', 's', 'y', 'a', 'e', 'l', 'h', 6, 's', 's', 'y', 'a', 'e', 'm', 6, 's', 's', 'y', 'a', 'e', 'b', 7, 's', 's', 'y', 'a', 'e', 'b', 's', 6, 's', 's', 'y', 'a', 'e', 's', 7, 's', 's', 'y', 'a', 'e', 's', 's',\n7, 's', 's', 'y', 'a', 'e', 'n', 'g', 6, 's', 's', 'y', 'a', 'e', 'j', 6, 's', 's', 'y', 'a', 'e', 'c', 6, 's', 's', 'y', 'a', 'e', 'k', 6, 's', 's', 'y', 'a', 'e', 't', 6, 's', 's', 'y', 'a', 'e', 'p',\n6, 's', 's', 'y', 'a', 'e', 'h', 4, 's', 's', 'e', 'o', 5, 's', 's', 'e', 'o', 'g', 6, 's', 's', 'e', 'o', 'g', 'g', 6, 's', 's', 'e', 'o', 'g', 's', 5, 's', 's', 'e', 'o', 'n',\n6, 's', 's', 'e', 'o', 'n', 'j', 6, 's', 's', 'e', 'o', 'n', 'h', 5, 's', 's', 'e', 'o', 'd', 5, 's', 's', 'e', 'o', 'l', 6, 's', 's', 'e', 'o', 'l', 'g', 6, 's', 's', 'e', 'o', 'l', 'm',\n6, 's', 's', 'e', 'o', 'l', 'b', 6, 's', 's', 'e', 'o', 'l', 's', 6, 's', 's', 'e', 'o', 'l', 't', 6, 's', 's', 'e', 'o', 'l', 'p', 6, 's', 's', 'e', 'o', 'l', 'h', 5, 's', 's', 'e', 'o', 'm',\n5, 's', 's', 'e', 'o', 'b', 6, 's', 's', 'e', 'o', 'b', 's', 5, 's', 's', 'e', 'o', 's', 6, 's', 's', 'e', 'o', 's', 's', 6, 's', 's', 'e', 'o', 'n', 'g', 5, 's', 's', 'e', 'o', 'j',\n5, 's', 's', 'e', 'o', 'c', 5, 's', 's', 'e', 'o', 'k', 5, 's', 's', 'e', 'o', 't', 5, 's', 's', 'e', 'o', 'p', 5, 's', 's', 'e', 'o', 'h', 3, 's', 's', 'e',\n4, 's', 's', 'e', 'g', 5, 's', 's', 'e', 'g', 'g', 5, 's', 's', 'e', 'g', 's', 4, 's', 's', 'e', 'n', 5, 's', 's', 'e', 'n', 'j', 5, 's', 's', 'e', 'n', 'h',\n4, 's', 's', 'e', 'd', 4, 's', 's', 'e', 'l', 5, 's', 's', 'e', 'l', 'g', 5, 's', 's', 'e', 'l', 'm', 5, 's', 's', 'e', 'l', 'b', 5, 's', 's', 'e', 'l', 's',\n5, 's', 's', 'e', 'l', 't', 5, 's', 's', 'e', 'l', 'p', 5, 's', 's', 'e', 'l', 'h', 4, 's', 's', 'e', 'm', 4, 's', 's', 'e', 'b', 5, 's', 's', 'e', 'b', 's',\n4, 's', 's', 'e', 's', 5, 's', 's', 'e', 's', 's', 5, 's', 's', 'e', 'n', 'g', 4, 's', 's', 'e', 'j', 4, 's', 's', 'e', 'c', 4, 's', 's', 'e', 'k',\n4, 's', 's', 'e', 't', 4, 's', 's', 'e', 'p', 4, 's', 's', 'e', 'h', 5, 's', 's', 'y', 'e', 'o', 6, 's', 's', 'y', 'e', 'o', 'g', 7, 's', 's', 'y', 'e', 'o', 'g', 'g',\n7, 's', 's', 'y', 'e', 'o', 'g', 's', 6, 's', 's', 'y', 'e', 'o', 'n', 7, 's', 's', 'y', 'e', 'o', 'n', 'j', 7, 's', 's', 'y', 'e', 'o', 'n', 'h', 6, 's', 's', 'y', 'e', 'o', 'd', 6, 's', 's', 'y', 'e', 'o', 'l',\n7, 's', 's', 'y', 'e', 'o', 'l', 'g', 7, 's', 's', 'y', 'e', 'o', 'l', 'm', 7, 's', 's', 'y', 'e', 'o', 'l', 'b', 7, 's', 's', 'y', 'e', 'o', 'l', 's', 7, 's', 's', 'y', 'e', 'o', 'l', 't', 7, 's', 's', 'y', 'e', 'o', 'l', 'p',\n7, 's', 's', 'y', 'e', 'o', 'l', 'h', 6, 's', 's', 'y', 'e', 'o', 'm', 6, 's', 's', 'y', 'e', 'o', 'b', 7, 's', 's', 'y', 'e', 'o', 'b', 's', 6, 's', 's', 'y', 'e', 'o', 's', 7, 's', 's', 'y', 'e', 'o', 's', 's',\n7, 's', 's', 'y', 'e', 'o', 'n', 'g', 6, 's', 's', 'y', 'e', 'o', 'j', 6, 's', 's', 'y', 'e', 'o', 'c', 6, 's', 's', 'y', 'e', 'o', 'k', 6, 's', 's', 'y', 'e', 'o', 't', 6, 's', 's', 'y', 'e', 'o', 'p',\n6, 's', 's', 'y', 'e', 'o', 'h', 4, 's', 's', 'y', 'e', 5, 's', 's', 'y', 'e', 'g', 6, 's', 's', 'y', 'e', 'g', 'g', 6, 's', 's', 'y', 'e', 'g', 's', 5, 's', 's', 'y', 'e', 'n',\n6, 's', 's', 'y', 'e', 'n', 'j', 6, 's', 's', 'y', 'e', 'n', 'h', 5, 's', 's', 'y', 'e', 'd', 5, 's', 's', 'y', 'e', 'l', 6, 's', 's', 'y', 'e', 'l', 'g', 6, 's', 's', 'y', 'e', 'l', 'm',\n6, 's', 's', 'y', 'e', 'l', 'b', 6, 's', 's', 'y', 'e', 'l', 's', 6, 's', 's', 'y', 'e', 'l', 't', 6, 's', 's', 'y', 'e', 'l', 'p', 6, 's', 's', 'y', 'e', 'l', 'h', 5, 's', 's', 'y', 'e', 'm',\n5, 's', 's', 'y', 'e', 'b', 6, 's', 's', 'y', 'e', 'b', 's', 5, 's', 's', 'y', 'e', 's', 6, 's', 's', 'y', 'e', 's', 's', 6, 's', 's', 'y', 'e', 'n', 'g', 5, 's', 's', 'y', 'e', 'j',\n5, 's', 's', 'y', 'e', 'c', 5, 's', 's', 'y', 'e', 'k', 5, 's', 's', 'y', 'e', 't', 5, 's', 's', 'y', 'e', 'p', 5, 's', 's', 'y', 'e', 'h', 3, 's', 's', 'o',\n4, 's', 's', 'o', 'g', 5, 's', 's', 'o', 'g', 'g', 5, 's', 's', 'o', 'g', 's', 4, 's', 's', 'o', 'n', 5, 's', 's', 'o', 'n', 'j', 5, 's', 's', 'o', 'n', 'h',\n4, 's', 's', 'o', 'd', 4, 's', 's', 'o', 'l', 5, 's', 's', 'o', 'l', 'g', 5, 's', 's', 'o', 'l', 'm', 5, 's', 's', 'o', 'l', 'b', 5, 's', 's', 'o', 'l', 's',\n5, 's', 's', 'o', 'l', 't', 5, 's', 's', 'o', 'l', 'p', 5, 's', 's', 'o', 'l', 'h', 4, 's', 's', 'o', 'm', 4, 's', 's', 'o', 'b', 5, 's', 's', 'o', 'b', 's',\n4, 's', 's', 'o', 's', 5, 's', 's', 'o', 's', 's', 5, 's', 's', 'o', 'n', 'g', 4, 's', 's', 'o', 'j', 4, 's', 's', 'o', 'c', 4, 's', 's', 'o', 'k',\n4, 's', 's', 'o', 't', 4, 's', 's', 'o', 'p', 4, 's', 's', 'o', 'h', 4, 's', 's', 'w', 'a', 5, 's', 's', 'w', 'a', 'g', 6, 's', 's', 'w', 'a', 'g', 'g',\n6, 's', 's', 'w', 'a', 'g', 's', 5, 's', 's', 'w', 'a', 'n', 6, 's', 's', 'w', 'a', 'n', 'j', 6, 's', 's', 'w', 'a', 'n', 'h', 5, 's', 's', 'w', 'a', 'd', 5, 's', 's', 'w', 'a', 'l',\n6, 's', 's', 'w', 'a', 'l', 'g', 6, 's', 's', 'w', 'a', 'l', 'm', 6, 's', 's', 'w', 'a', 'l', 'b', 6, 's', 's', 'w', 'a', 'l', 's', 6, 's', 's', 'w', 'a', 'l', 't', 6, 's', 's', 'w', 'a', 'l', 'p',\n6, 's', 's', 'w', 'a', 'l', 'h', 5, 's', 's', 'w', 'a', 'm', 5, 's', 's', 'w', 'a', 'b', 6, 's', 's', 'w', 'a', 'b', 's', 5, 's', 's', 'w', 'a', 's', 6, 's', 's', 'w', 'a', 's', 's',\n6, 's', 's', 'w', 'a', 'n', 'g', 5, 's', 's', 'w', 'a', 'j', 5, 's', 's', 'w', 'a', 'c', 5, 's', 's', 'w', 'a', 'k', 5, 's', 's', 'w', 'a', 't', 5, 's', 's', 'w', 'a', 'p',\n5, 's', 's', 'w', 'a', 'h', 5, 's', 's', 'w', 'a', 'e', 6, 's', 's', 'w', 'a', 'e', 'g', 7, 's', 's', 'w', 'a', 'e', 'g', 'g', 7, 's', 's', 'w', 'a', 'e', 'g', 's', 6, 's', 's', 'w', 'a', 'e', 'n',\n7, 's', 's', 'w', 'a', 'e', 'n', 'j', 7, 's', 's', 'w', 'a', 'e', 'n', 'h', 6, 's', 's', 'w', 'a', 'e', 'd', 6, 's', 's', 'w', 'a', 'e', 'l', 7, 's', 's', 'w', 'a', 'e', 'l', 'g', 7, 's', 's', 'w', 'a', 'e', 'l', 'm',\n7, 's', 's', 'w', 'a', 'e', 'l', 'b', 7, 's', 's', 'w', 'a', 'e', 'l', 's', 7, 's', 's', 'w', 'a', 'e', 'l', 't', 7, 's', 's', 'w', 'a', 'e', 'l', 'p', 7, 's', 's', 'w', 'a', 'e', 'l', 'h', 6, 's', 's', 'w', 'a', 'e', 'm',\n6, 's', 's', 'w', 'a', 'e', 'b', 7, 's', 's', 'w', 'a', 'e', 'b', 's', 6, 's', 's', 'w', 'a', 'e', 's', 7, 's', 's', 'w', 'a', 'e', 's', 's', 7, 's', 's', 'w', 'a', 'e', 'n', 'g', 6, 's', 's', 'w', 'a', 'e', 'j',\n6, 's', 's', 'w', 'a', 'e', 'c', 6, 's', 's', 'w', 'a', 'e', 'k', 6, 's', 's', 'w', 'a', 'e', 't', 6, 's', 's', 'w', 'a', 'e', 'p', 6, 's', 's', 'w', 'a', 'e', 'h', 4, 's', 's', 'o', 'e',\n5, 's', 's', 'o', 'e', 'g', 6, 's', 's', 'o', 'e', 'g', 'g', 6, 's', 's', 'o', 'e', 'g', 's', 5, 's', 's', 'o', 'e', 'n', 6, 's', 's', 'o', 'e', 'n', 'j', 6, 's', 's', 'o', 'e', 'n', 'h',\n5, 's', 's', 'o', 'e', 'd', 5, 's', 's', 'o', 'e', 'l', 6, 's', 's', 'o', 'e', 'l', 'g', 6, 's', 's', 'o', 'e', 'l', 'm', 6, 's', 's', 'o', 'e', 'l', 'b', 6, 's', 's', 'o', 'e', 'l', 's',\n6, 's', 's', 'o', 'e', 'l', 't', 6, 's', 's', 'o', 'e', 'l', 'p', 6, 's', 's', 'o', 'e', 'l', 'h', 5, 's', 's', 'o', 'e', 'm', 5, 's', 's', 'o', 'e', 'b', 6, 's', 's', 'o', 'e', 'b', 's',\n5, 's', 's', 'o', 'e', 's', 6, 's', 's', 'o', 'e', 's', 's', 6, 's', 's', 'o', 'e', 'n', 'g', 5, 's', 's', 'o', 'e', 'j', 5, 's', 's', 'o', 'e', 'c', 5, 's', 's', 'o', 'e', 'k',\n5, 's', 's', 'o', 'e', 't', 5, 's', 's', 'o', 'e', 'p', 5, 's', 's', 'o', 'e', 'h', 4, 's', 's', 'y', 'o', 5, 's', 's', 'y', 'o', 'g', 6, 's', 's', 'y', 'o', 'g', 'g',\n6, 's', 's', 'y', 'o', 'g', 's', 5, 's', 's', 'y', 'o', 'n', 6, 's', 's', 'y', 'o', 'n', 'j', 6, 's', 's', 'y', 'o', 'n', 'h', 5, 's', 's', 'y', 'o', 'd', 5, 's', 's', 'y', 'o', 'l',\n6, 's', 's', 'y', 'o', 'l', 'g', 6, 's', 's', 'y', 'o', 'l', 'm', 6, 's', 's', 'y', 'o', 'l', 'b', 6, 's', 's', 'y', 'o', 'l', 's', 6, 's', 's', 'y', 'o', 'l', 't', 6, 's', 's', 'y', 'o', 'l', 'p',\n6, 's', 's', 'y', 'o', 'l', 'h', 5, 's', 's', 'y', 'o', 'm', 5, 's', 's', 'y', 'o', 'b', 6, 's', 's', 'y', 'o', 'b', 's', 5, 's', 's', 'y', 'o', 's', 6, 's', 's', 'y', 'o', 's', 's',\n6, 's', 's', 'y', 'o', 'n', 'g', 5, 's', 's', 'y', 'o', 'j', 5, 's', 's', 'y', 'o', 'c', 5, 's', 's', 'y', 'o', 'k', 5, 's', 's', 'y', 'o', 't', 5, 's', 's', 'y', 'o', 'p',\n5, 's', 's', 'y', 'o', 'h', 3, 's', 's', 'u', 4, 's', 's', 'u', 'g', 5, 's', 's', 'u', 'g', 'g', 5, 's', 's', 'u', 'g', 's', 4, 's', 's', 'u', 'n',\n5, 's', 's', 'u', 'n', 'j', 5, 's', 's', 'u', 'n', 'h', 4, 's', 's', 'u', 'd', 4, 's', 's', 'u', 'l', 5, 's', 's', 'u', 'l', 'g', 5, 's', 's', 'u', 'l', 'm',\n5, 's', 's', 'u', 'l', 'b', 5, 's', 's', 'u', 'l', 's', 5, 's', 's', 'u', 'l', 't', 5, 's', 's', 'u', 'l', 'p', 5, 's', 's', 'u', 'l', 'h', 4, 's', 's', 'u', 'm',\n4, 's', 's', 'u', 'b', 5, 's', 's', 'u', 'b', 's', 4, 's', 's', 'u', 's', 5, 's', 's', 'u', 's', 's', 5, 's', 's', 'u', 'n', 'g', 4, 's', 's', 'u', 'j',\n4, 's', 's', 'u', 'c', 4, 's', 's', 'u', 'k', 4, 's', 's', 'u', 't', 4, 's', 's', 'u', 'p', 4, 's', 's', 'u', 'h', 5, 's', 's', 'w', 'e', 'o',\n6, 's', 's', 'w', 'e', 'o', 'g', 7, 's', 's', 'w', 'e', 'o', 'g', 'g', 7, 's', 's', 'w', 'e', 'o', 'g', 's', 6, 's', 's', 'w', 'e', 'o', 'n', 7, 's', 's', 'w', 'e', 'o', 'n', 'j', 7, 's', 's', 'w', 'e', 'o', 'n', 'h',\n6, 's', 's', 'w', 'e', 'o', 'd', 6, 's', 's', 'w', 'e', 'o', 'l', 7, 's', 's', 'w', 'e', 'o', 'l', 'g', 7, 's', 's', 'w', 'e', 'o', 'l', 'm', 7, 's', 's', 'w', 'e', 'o', 'l', 'b', 7, 's', 's', 'w', 'e', 'o', 'l', 's',\n7, 's', 's', 'w', 'e', 'o', 'l', 't', 7, 's', 's', 'w', 'e', 'o', 'l', 'p', 7, 's', 's', 'w', 'e', 'o', 'l', 'h', 6, 's', 's', 'w', 'e', 'o', 'm', 6, 's', 's', 'w', 'e', 'o', 'b', 7, 's', 's', 'w', 'e', 'o', 'b', 's',\n6, 's', 's', 'w', 'e', 'o', 's', 7, 's', 's', 'w', 'e', 'o', 's', 's', 7, 's', 's', 'w', 'e', 'o', 'n', 'g', 6, 's', 's', 'w', 'e', 'o', 'j', 6, 's', 's', 'w', 'e', 'o', 'c', 6, 's', 's', 'w', 'e', 'o', 'k',\n6, 's', 's', 'w', 'e', 'o', 't', 6, 's', 's', 'w', 'e', 'o', 'p', 6, 's', 's', 'w', 'e', 'o', 'h', 4, 's', 's', 'w', 'e', 5, 's', 's', 'w', 'e', 'g', 6, 's', 's', 'w', 'e', 'g', 'g',\n6, 's', 's', 'w', 'e', 'g', 's', 5, 's', 's', 'w', 'e', 'n', 6, 's', 's', 'w', 'e', 'n', 'j', 6, 's', 's', 'w', 'e', 'n', 'h', 5, 's', 's', 'w', 'e', 'd', 5, 's', 's', 'w', 'e', 'l',\n6, 's', 's', 'w', 'e', 'l', 'g', 6, 's', 's', 'w', 'e', 'l', 'm', 6, 's', 's', 'w', 'e', 'l', 'b', 6, 's', 's', 'w', 'e', 'l', 's', 6, 's', 's', 'w', 'e', 'l', 't', 6, 's', 's', 'w', 'e', 'l', 'p',\n6, 's', 's', 'w', 'e', 'l', 'h', 5, 's', 's', 'w', 'e', 'm', 5, 's', 's', 'w', 'e', 'b', 6, 's', 's', 'w', 'e', 'b', 's', 5, 's', 's', 'w', 'e', 's', 6, 's', 's', 'w', 'e', 's', 's',\n6, 's', 's', 'w', 'e', 'n', 'g', 5, 's', 's', 'w', 'e', 'j', 5, 's', 's', 'w', 'e', 'c', 5, 's', 's', 'w', 'e', 'k', 5, 's', 's', 'w', 'e', 't', 5, 's', 's', 'w', 'e', 'p',\n5, 's', 's', 'w', 'e', 'h', 4, 's', 's', 'w', 'i', 5, 's', 's', 'w', 'i', 'g', 6, 's', 's', 'w', 'i', 'g', 'g', 6, 's', 's', 'w', 'i', 'g', 's', 5, 's', 's', 'w', 'i', 'n',\n6, 's', 's', 'w', 'i', 'n', 'j', 6, 's', 's', 'w', 'i', 'n', 'h', 5, 's', 's', 'w', 'i', 'd', 5, 's', 's', 'w', 'i', 'l', 6, 's', 's', 'w', 'i', 'l', 'g', 6, 's', 's', 'w', 'i', 'l', 'm',\n6, 's', 's', 'w', 'i', 'l', 'b', 6, 's', 's', 'w', 'i', 'l', 's', 6, 's', 's', 'w', 'i', 'l', 't', 6, 's', 's', 'w', 'i', 'l', 'p', 6, 's', 's', 'w', 'i', 'l', 'h', 5, 's', 's', 'w', 'i', 'm',\n5, 's', 's', 'w', 'i', 'b', 6, 's', 's', 'w', 'i', 'b', 's', 5, 's', 's', 'w', 'i', 's', 6, 's', 's', 'w', 'i', 's', 's', 6, 's', 's', 'w', 'i', 'n', 'g', 5, 's', 's', 'w', 'i', 'j',\n5, 's', 's', 'w', 'i', 'c', 5, 's', 's', 'w', 'i', 'k', 5, 's', 's', 'w', 'i', 't', 5, 's', 's', 'w', 'i', 'p', 5, 's', 's', 'w', 'i', 'h', 4, 's', 's', 'y', 'u',\n5, 's', 's', 'y', 'u', 'g', 6, 's', 's', 'y', 'u', 'g', 'g', 6, 's', 's', 'y', 'u', 'g', 's', 5, 's', 's', 'y', 'u', 'n', 6, 's', 's', 'y', 'u', 'n', 'j', 6, 's', 's', 'y', 'u', 'n', 'h',\n5, 's', 's', 'y', 'u', 'd', 5, 's', 's', 'y', 'u', 'l', 6, 's', 's', 'y', 'u', 'l', 'g', 6, 's', 's', 'y', 'u', 'l', 'm', 6, 's', 's', 'y', 'u', 'l', 'b', 6, 's', 's', 'y', 'u', 'l', 's',\n6, 's', 's', 'y', 'u', 'l', 't', 6, 's', 's', 'y', 'u', 'l', 'p', 6, 's', 's', 'y', 'u', 'l', 'h', 5, 's', 's', 'y', 'u', 'm', 5, 's', 's', 'y', 'u', 'b', 6, 's', 's', 'y', 'u', 'b', 's',\n5, 's', 's', 'y', 'u', 's', 6, 's', 's', 'y', 'u', 's', 's', 6, 's', 's', 'y', 'u', 'n', 'g', 5, 's', 's', 'y', 'u', 'j', 5, 's', 's', 'y', 'u', 'c', 5, 's', 's', 'y', 'u', 'k',\n5, 's', 's', 'y', 'u', 't', 5, 's', 's', 'y', 'u', 'p', 5, 's', 's', 'y', 'u', 'h', 4, 's', 's', 'e', 'u', 5, 's', 's', 'e', 'u', 'g', 6, 's', 's', 'e', 'u', 'g', 'g',\n6, 's', 's', 'e', 'u', 'g', 's', 5, 's', 's', 'e', 'u', 'n', 6, 's', 's', 'e', 'u', 'n', 'j', 6, 's', 's', 'e', 'u', 'n', 'h', 5, 's', 's', 'e', 'u', 'd', 5, 's', 's', 'e', 'u', 'l',\n6, 's', 's', 'e', 'u', 'l', 'g', 6, 's', 's', 'e', 'u', 'l', 'm', 6, 's', 's', 'e', 'u', 'l', 'b', 6, 's', 's', 'e', 'u', 'l', 's', 6, 's', 's', 'e', 'u', 'l', 't', 6, 's', 's', 'e', 'u', 'l', 'p',\n6, 's', 's', 'e', 'u', 'l', 'h', 5, 's', 's', 'e', 'u', 'm', 5, 's', 's', 'e', 'u', 'b', 6, 's', 's', 'e', 'u', 'b', 's', 5, 's', 's', 'e', 'u', 's', 6, 's', 's', 'e', 'u', 's', 's',\n6, 's', 's', 'e', 'u', 'n', 'g', 5, 's', 's', 'e', 'u', 'j', 5, 's', 's', 'e', 'u', 'c', 5, 's', 's', 'e', 'u', 'k', 5, 's', 's', 'e', 'u', 't', 5, 's', 's', 'e', 'u', 'p',\n5, 's', 's', 'e', 'u', 'h', 4, 's', 's', 'y', 'i', 5, 's', 's', 'y', 'i', 'g', 6, 's', 's', 'y', 'i', 'g', 'g', 6, 's', 's', 'y', 'i', 'g', 's', 5, 's', 's', 'y', 'i', 'n',\n6, 's', 's', 'y', 'i', 'n', 'j', 6, 's', 's', 'y', 'i', 'n', 'h', 5, 's', 's', 'y', 'i', 'd', 5, 's', 's', 'y', 'i', 'l', 6, 's', 's', 'y', 'i', 'l', 'g', 6, 's', 's', 'y', 'i', 'l', 'm',\n6, 's', 's', 'y', 'i', 'l', 'b', 6, 's', 's', 'y', 'i', 'l', 's', 6, 's', 's', 'y', 'i', 'l', 't', 6, 's', 's', 'y', 'i', 'l', 'p', 6, 's', 's', 'y', 'i', 'l', 'h', 5, 's', 's', 'y', 'i', 'm',\n5, 's', 's', 'y', 'i', 'b', 6, 's', 's', 'y', 'i', 'b', 's', 5, 's', 's', 'y', 'i', 's', 6, 's', 's', 'y', 'i', 's', 's', 6, 's', 's', 'y', 'i', 'n', 'g', 5, 's', 's', 'y', 'i', 'j',\n5, 's', 's', 'y', 'i', 'c', 5, 's', 's', 'y', 'i', 'k', 5, 's', 's', 'y', 'i', 't', 5, 's', 's', 'y', 'i', 'p', 5, 's', 's', 'y', 'i', 'h', 3, 's', 's', 'i',\n4, 's', 's', 'i', 'g', 5, 's', 's', 'i', 'g', 'g', 5, 's', 's', 'i', 'g', 's', 4, 's', 's', 'i', 'n', 5, 's', 's', 'i', 'n', 'j', 5, 's', 's', 'i', 'n', 'h',\n4, 's', 's', 'i', 'd', 4, 's', 's', 'i', 'l', 5, 's', 's', 'i', 'l', 'g', 5, 's', 's', 'i', 'l', 'm', 5, 's', 's', 'i', 'l', 'b', 5, 's', 's', 'i', 'l', 's',\n5, 's', 's', 'i', 'l', 't', 5, 's', 's', 'i', 'l', 'p', 5, 's', 's', 'i', 'l', 'h', 4, 's', 's', 'i', 'm', 4, 's', 's', 'i', 'b', 5, 's', 's', 'i', 'b', 's',\n4, 's', 's', 'i', 's', 5, 's', 's', 'i', 's', 's', 5, 's', 's', 'i', 'n', 'g', 4, 's', 's', 'i', 'j', 4, 's', 's', 'i', 'c', 4, 's', 's', 'i', 'k',\n4, 's', 's', 'i', 't', 4, 's', 's', 'i', 'p', 4, 's', 's', 'i', 'h', 1, 'a', 2, 'a', 'g', 3, 'a', 'g', 'g',\n3, 'a', 'g', 's', 2, 'a', 'n', 3, 'a', 'n', 'j', 3, 'a', 'n', 'h', 2, 'a', 'd', 2, 'a', 'l',\n3, 'a', 'l', 'g', 3, 'a', 'l', 'm', 3, 'a', 'l', 'b', 3, 'a', 'l', 's', 3, 'a', 'l', 't', 3, 'a', 'l', 'p',\n3, 'a', 'l', 'h', 2, 'a', 'm', 2, 'a', 'b', 3, 'a', 'b', 's', 2, 'a', 's', 3, 'a', 's', 's',\n3, 'a', 'n', 'g', 2, 'a', 'j', 2, 'a', 'c', 2, 'a', 'k', 2, 'a', 't', 2, 'a', 'p',\n2, 'a', 'h', 2, 'a', 'e', 3, 'a', 'e', 'g', 4, 'a', 'e', 'g', 'g', 4, 'a', 'e', 'g', 's', 3, 'a', 'e', 'n',\n4, 'a', 'e', 'n', 'j', 4, 'a', 'e', 'n', 'h', 3, 'a', 'e', 'd', 3, 'a', 'e', 'l', 4, 'a', 'e', 'l', 'g', 4, 'a', 'e', 'l', 'm',\n4, 'a', 'e', 'l', 'b', 4, 'a', 'e', 'l', 's', 4, 'a', 'e', 'l', 't', 4, 'a', 'e', 'l', 'p', 4, 'a', 'e', 'l', 'h', 3, 'a', 'e', 'm',\n3, 'a', 'e', 'b', 4, 'a', 'e', 'b', 's', 3, 'a', 'e', 's', 4, 'a', 'e', 's', 's', 4, 'a', 'e', 'n', 'g', 3, 'a', 'e', 'j',\n3, 'a', 'e', 'c', 3, 'a', 'e', 'k', 3, 'a', 'e', 't', 3, 'a', 'e', 'p', 3, 'a', 'e', 'h', 2, 'y', 'a',\n3, 'y', 'a', 'g', 4, 'y', 'a', 'g', 'g', 4, 'y', 'a', 'g', 's', 3, 'y', 'a', 'n', 4, 'y', 'a', 'n', 'j', 4, 'y', 'a', 'n', 'h',\n3, 'y', 'a', 'd', 3, 'y', 'a', 'l', 4, 'y', 'a', 'l', 'g', 4, 'y', 'a', 'l', 'm', 4, 'y', 'a', 'l', 'b', 4, 'y', 'a', 'l', 's',\n4, 'y', 'a', 'l', 't', 4, 'y', 'a', 'l', 'p', 4, 'y', 'a', 'l', 'h', 3, 'y', 'a', 'm', 3, 'y', 'a', 'b', 4, 'y', 'a', 'b', 's',\n3, 'y', 'a', 's', 4, 'y', 'a', 's', 's', 4, 'y', 'a', 'n', 'g', 3, 'y', 'a', 'j', 3, 'y', 'a', 'c', 3, 'y', 'a', 'k',\n3, 'y', 'a', 't', 3, 'y', 'a', 'p', 3, 'y', 'a', 'h', 3, 'y', 'a', 'e', 4, 'y', 'a', 'e', 'g', 5, 'y', 'a', 'e', 'g', 'g',\n5, 'y', 'a', 'e', 'g', 's', 4, 'y', 'a', 'e', 'n', 5, 'y', 'a', 'e', 'n', 'j', 5, 'y', 'a', 'e', 'n', 'h', 4, 'y', 'a', 'e', 'd', 4, 'y', 'a', 'e', 'l',\n5, 'y', 'a', 'e', 'l', 'g', 5, 'y', 'a', 'e', 'l', 'm', 5, 'y', 'a', 'e', 'l', 'b', 5, 'y', 'a', 'e', 'l', 's', 5, 'y', 'a', 'e', 'l', 't', 5, 'y', 'a', 'e', 'l', 'p',\n5, 'y', 'a', 'e', 'l', 'h', 4, 'y', 'a', 'e', 'm', 4, 'y', 'a', 'e', 'b', 5, 'y', 'a', 'e', 'b', 's', 4, 'y', 'a', 'e', 's', 5, 'y', 'a', 'e', 's', 's',\n5, 'y', 'a', 'e', 'n', 'g', 4, 'y', 'a', 'e', 'j', 4, 'y', 'a', 'e', 'c', 4, 'y', 'a', 'e', 'k', 4, 'y', 'a', 'e', 't', 4, 'y', 'a', 'e', 'p',\n4, 'y', 'a', 'e', 'h', 2, 'e', 'o', 3, 'e', 'o', 'g', 4, 'e', 'o', 'g', 'g', 4, 'e', 'o', 'g', 's', 3, 'e', 'o', 'n',\n4, 'e', 'o', 'n', 'j', 4, 'e', 'o', 'n', 'h', 3, 'e', 'o', 'd', 3, 'e', 'o', 'l', 4, 'e', 'o', 'l', 'g', 4, 'e', 'o', 'l', 'm',\n4, 'e', 'o', 'l', 'b', 4, 'e', 'o', 'l', 's', 4, 'e', 'o', 'l', 't', 4, 'e', 'o', 'l', 'p', 4, 'e', 'o', 'l', 'h', 3, 'e', 'o', 'm',\n3, 'e', 'o', 'b', 4, 'e', 'o', 'b', 's', 3, 'e', 'o', 's', 4, 'e', 'o', 's', 's', 4, 'e', 'o', 'n', 'g', 3, 'e', 'o', 'j',\n3, 'e', 'o', 'c', 3, 'e', 'o', 'k', 3, 'e', 'o', 't', 3, 'e', 'o', 'p', 3, 'e', 'o', 'h', 1, 'e',\n2, 'e', 'g', 3, 'e', 'g', 'g', 3, 'e', 'g', 's', 2, 'e', 'n', 3, 'e', 'n', 'j', 3, 'e', 'n', 'h',\n2, 'e', 'd', 2, 'e', 'l', 3, 'e', 'l', 'g', 3, 'e', 'l', 'm', 3, 'e', 'l', 'b', 3, 'e', 'l', 's',\n3, 'e', 'l', 't', 3, 'e', 'l', 'p', 3, 'e', 'l', 'h', 2, 'e', 'm', 2, 'e', 'b', 3, 'e', 'b', 's',\n2, 'e', 's', 3, 'e', 's', 's', 3, 'e', 'n', 'g', 2, 'e', 'j', 2, 'e', 'c', 2, 'e', 'k',\n2, 'e', 't', 2, 'e', 'p', 2, 'e', 'h', 3, 'y', 'e', 'o', 4, 'y', 'e', 'o', 'g', 5, 'y', 'e', 'o', 'g', 'g',\n5, 'y', 'e', 'o', 'g', 's', 4, 'y', 'e', 'o', 'n', 5, 'y', 'e', 'o', 'n', 'j', 5, 'y', 'e', 'o', 'n', 'h', 4, 'y', 'e', 'o', 'd', 4, 'y', 'e', 'o', 'l',\n5, 'y', 'e', 'o', 'l', 'g', 5, 'y', 'e', 'o', 'l', 'm', 5, 'y', 'e', 'o', 'l', 'b', 5, 'y', 'e', 'o', 'l', 's', 5, 'y', 'e', 'o', 'l', 't', 5, 'y', 'e', 'o', 'l', 'p',\n5, 'y', 'e', 'o', 'l', 'h', 4, 'y', 'e', 'o', 'm', 4, 'y', 'e', 'o', 'b', 5, 'y', 'e', 'o', 'b', 's', 4, 'y', 'e', 'o', 's', 5, 'y', 'e', 'o', 's', 's',\n5, 'y', 'e', 'o', 'n', 'g', 4, 'y', 'e', 'o', 'j', 4, 'y', 'e', 'o', 'c', 4, 'y', 'e', 'o', 'k', 4, 'y', 'e', 'o', 't', 4, 'y', 'e', 'o', 'p',\n4, 'y', 'e', 'o', 'h', 2, 'y', 'e', 3, 'y', 'e', 'g', 4, 'y', 'e', 'g', 'g', 4, 'y', 'e', 'g', 's', 3, 'y', 'e', 'n',\n4, 'y', 'e', 'n', 'j', 4, 'y', 'e', 'n', 'h', 3, 'y', 'e', 'd', 3, 'y', 'e', 'l', 4, 'y', 'e', 'l', 'g', 4, 'y', 'e', 'l', 'm',\n4, 'y', 'e', 'l', 'b', 4, 'y', 'e', 'l', 's', 4, 'y', 'e', 'l', 't', 4, 'y', 'e', 'l', 'p', 4, 'y', 'e', 'l', 'h', 3, 'y', 'e', 'm',\n3, 'y', 'e', 'b', 4, 'y', 'e', 'b', 's', 3, 'y', 'e', 's', 4, 'y', 'e', 's', 's', 4, 'y', 'e', 'n', 'g', 3, 'y', 'e', 'j',\n3, 'y', 'e', 'c', 3, 'y', 'e', 'k', 3, 'y', 'e', 't', 3, 'y', 'e', 'p', 3, 'y', 'e', 'h', 1, 'o',\n2, 'o', 'g', 3, 'o', 'g', 'g', 3, 'o', 'g', 's', 2, 'o', 'n', 3, 'o', 'n', 'j', 3, 'o', 'n', 'h',\n2, 'o', 'd', 2, 'o', 'l', 3, 'o', 'l', 'g', 3, 'o', 'l', 'm', 3, 'o', 'l', 'b', 3, 'o', 'l', 's',\n3, 'o', 'l', 't', 3, 'o', 'l', 'p', 3, 'o', 'l', 'h', 2, 'o', 'm', 2, 'o', 'b', 3, 'o', 'b', 's',\n2, 'o', 's', 3, 'o', 's', 's', 3, 'o', 'n', 'g', 2, 'o', 'j', 2, 'o', 'c', 2, 'o', 'k',\n2, 'o', 't', 2, 'o', 'p', 2, 'o', 'h', 2, 'w', 'a', 3, 'w', 'a', 'g', 4, 'w', 'a', 'g', 'g',\n4, 'w', 'a', 'g', 's', 3, 'w', 'a', 'n', 4, 'w', 'a', 'n', 'j', 4, 'w', 'a', 'n', 'h', 3, 'w', 'a', 'd', 3, 'w', 'a', 'l',\n4, 'w', 'a', 'l', 'g', 4, 'w', 'a', 'l', 'm', 4, 'w', 'a', 'l', 'b', 4, 'w', 'a', 'l', 's', 4, 'w', 'a', 'l', 't', 4, 'w', 'a', 'l', 'p',\n4, 'w', 'a', 'l', 'h', 3, 'w', 'a', 'm', 3, 'w', 'a', 'b', 4, 'w', 'a', 'b', 's', 3, 'w', 'a', 's', 4, 'w', 'a', 's', 's',\n4, 'w', 'a', 'n', 'g', 3, 'w', 'a', 'j', 3, 'w', 'a', 'c', 3, 'w', 'a', 'k', 3, 'w', 'a', 't', 3, 'w', 'a', 'p',\n3, 'w', 'a', 'h', 3, 'w', 'a', 'e', 4, 'w', 'a', 'e', 'g', 5, 'w', 'a', 'e', 'g', 'g', 5, 'w', 'a', 'e', 'g', 's', 4, 'w', 'a', 'e', 'n',\n5, 'w', 'a', 'e', 'n', 'j', 5, 'w', 'a', 'e', 'n', 'h', 4, 'w', 'a', 'e', 'd', 4, 'w', 'a', 'e', 'l', 5, 'w', 'a', 'e', 'l', 'g', 5, 'w', 'a', 'e', 'l', 'm',\n5, 'w', 'a', 'e', 'l', 'b', 5, 'w', 'a', 'e', 'l', 's', 5, 'w', 'a', 'e', 'l', 't', 5, 'w', 'a', 'e', 'l', 'p', 5, 'w', 'a', 'e', 'l', 'h', 4, 'w', 'a', 'e', 'm',\n4, 'w', 'a', 'e', 'b', 5, 'w', 'a', 'e', 'b', 's', 4, 'w', 'a', 'e', 's', 5, 'w', 'a', 'e', 's', 's', 5, 'w', 'a', 'e', 'n', 'g', 4, 'w', 'a', 'e', 'j',\n4, 'w', 'a', 'e', 'c', 4, 'w', 'a', 'e', 'k', 4, 'w', 'a', 'e', 't', 4, 'w', 'a', 'e', 'p', 4, 'w', 'a', 'e', 'h', 2, 'o', 'e',\n3, 'o', 'e', 'g', 4, 'o', 'e', 'g', 'g', 4, 'o', 'e', 'g', 's', 3, 'o', 'e', 'n', 4, 'o', 'e', 'n', 'j', 4, 'o', 'e', 'n', 'h',\n3, 'o', 'e', 'd', 3, 'o', 'e', 'l', 4, 'o', 'e', 'l', 'g', 4, 'o', 'e', 'l', 'm', 4, 'o', 'e', 'l', 'b', 4, 'o', 'e', 'l', 's',\n4, 'o', 'e', 'l', 't', 4, 'o', 'e', 'l', 'p', 4, 'o', 'e', 'l', 'h', 3, 'o', 'e', 'm', 3, 'o', 'e', 'b', 4, 'o', 'e', 'b', 's',\n3, 'o', 'e', 's', 4, 'o', 'e', 's', 's', 4, 'o', 'e', 'n', 'g', 3, 'o', 'e', 'j', 3, 'o', 'e', 'c', 3, 'o', 'e', 'k',\n3, 'o', 'e', 't', 3, 'o', 'e', 'p', 3, 'o', 'e', 'h', 2, 'y', 'o', 3, 'y', 'o', 'g', 4, 'y', 'o', 'g', 'g',\n4, 'y', 'o', 'g', 's', 3, 'y', 'o', 'n', 4, 'y', 'o', 'n', 'j', 4, 'y', 'o', 'n', 'h', 3, 'y', 'o', 'd', 3, 'y', 'o', 'l',\n4, 'y', 'o', 'l', 'g', 4, 'y', 'o', 'l', 'm', 4, 'y', 'o', 'l', 'b', 4, 'y', 'o', 'l', 's', 4, 'y', 'o', 'l', 't', 4, 'y', 'o', 'l', 'p',\n4, 'y', 'o', 'l', 'h', 3, 'y', 'o', 'm', 3, 'y', 'o', 'b', 4, 'y', 'o', 'b', 's', 3, 'y', 'o', 's', 4, 'y', 'o', 's', 's',\n4, 'y', 'o', 'n', 'g', 3, 'y', 'o', 'j', 3, 'y', 'o', 'c', 3, 'y', 'o', 'k', 3, 'y', 'o', 't', 3, 'y', 'o', 'p',\n3, 'y', 'o', 'h', 1, 'u', 2, 'u', 'g', 3, 'u', 'g', 'g', 3, 'u', 'g', 's', 2, 'u', 'n',\n3, 'u', 'n', 'j', 3, 'u', 'n', 'h', 2, 'u', 'd', 2, 'u', 'l', 3, 'u', 'l', 'g', 3, 'u', 'l', 'm',\n3, 'u', 'l', 'b', 3, 'u', 'l', 's', 3, 'u', 'l', 't', 3, 'u', 'l', 'p', 3, 'u', 'l', 'h', 2, 'u', 'm',\n2, 'u', 'b', 3, 'u', 'b', 's', 2, 'u', 's', 3, 'u', 's', 's', 3, 'u', 'n', 'g', 2, 'u', 'j',\n2, 'u', 'c', 2, 'u', 'k', 2, 'u', 't', 2, 'u', 'p', 2, 'u', 'h', 3, 'w', 'e', 'o',\n4, 'w', 'e', 'o', 'g', 5, 'w', 'e', 'o', 'g', 'g', 5, 'w', 'e', 'o', 'g', 's', 4, 'w', 'e', 'o', 'n', 5, 'w', 'e', 'o', 'n', 'j', 5, 'w', 'e', 'o', 'n', 'h',\n4, 'w', 'e', 'o', 'd', 4, 'w', 'e', 'o', 'l', 5, 'w', 'e', 'o', 'l', 'g', 5, 'w', 'e', 'o', 'l', 'm', 5, 'w', 'e', 'o', 'l', 'b', 5, 'w', 'e', 'o', 'l', 's',\n5, 'w', 'e', 'o', 'l', 't', 5, 'w', 'e', 'o', 'l', 'p', 5, 'w', 'e', 'o', 'l', 'h', 4, 'w', 'e', 'o', 'm', 4, 'w', 'e', 'o', 'b', 5, 'w', 'e', 'o', 'b', 's',\n4, 'w', 'e', 'o', 's', 5, 'w', 'e', 'o', 's', 's', 5, 'w', 'e', 'o', 'n', 'g', 4, 'w', 'e', 'o', 'j', 4, 'w', 'e', 'o', 'c', 4, 'w', 'e', 'o', 'k',\n4, 'w', 'e', 'o', 't', 4, 'w', 'e', 'o', 'p', 4, 'w', 'e', 'o', 'h', 2, 'w', 'e', 3, 'w', 'e', 'g', 4, 'w', 'e', 'g', 'g',\n4, 'w', 'e', 'g', 's', 3, 'w', 'e', 'n', 4, 'w', 'e', 'n', 'j', 4, 'w', 'e', 'n', 'h', 3, 'w', 'e', 'd', 3, 'w', 'e', 'l',\n4, 'w', 'e', 'l', 'g', 4, 'w', 'e', 'l', 'm', 4, 'w', 'e', 'l', 'b', 4, 'w', 'e', 'l', 's', 4, 'w', 'e', 'l', 't', 4, 'w', 'e', 'l', 'p',\n4, 'w', 'e', 'l', 'h', 3, 'w', 'e', 'm', 3, 'w', 'e', 'b', 4, 'w', 'e', 'b', 's', 3, 'w', 'e', 's', 4, 'w', 'e', 's', 's',\n4, 'w', 'e', 'n', 'g', 3, 'w', 'e', 'j', 3, 'w', 'e', 'c', 3, 'w', 'e', 'k', 3, 'w', 'e', 't', 3, 'w', 'e', 'p',\n3, 'w', 'e', 'h', 2, 'w', 'i', 3, 'w', 'i', 'g', 4, 'w', 'i', 'g', 'g', 4, 'w', 'i', 'g', 's', 3, 'w', 'i', 'n',\n4, 'w', 'i', 'n', 'j', 4, 'w', 'i', 'n', 'h', 3, 'w', 'i', 'd', 3, 'w', 'i', 'l', 4, 'w', 'i', 'l', 'g', 4, 'w', 'i', 'l', 'm',\n4, 'w', 'i', 'l', 'b', 4, 'w', 'i', 'l', 's', 4, 'w', 'i', 'l', 't', 4, 'w', 'i', 'l', 'p', 4, 'w', 'i', 'l', 'h', 3, 'w', 'i', 'm',\n3, 'w', 'i', 'b', 4, 'w', 'i', 'b', 's', 3, 'w', 'i', 's', 4, 'w', 'i', 's', 's', 4, 'w', 'i', 'n', 'g', 3, 'w', 'i', 'j',\n3, 'w', 'i', 'c', 3, 'w', 'i', 'k', 3, 'w', 'i', 't', 3, 'w', 'i', 'p', 3, 'w', 'i', 'h', 2, 'y', 'u',\n3, 'y', 'u', 'g', 4, 'y', 'u', 'g', 'g', 4, 'y', 'u', 'g', 's', 3, 'y', 'u', 'n', 4, 'y', 'u', 'n', 'j', 4, 'y', 'u', 'n', 'h',\n3, 'y', 'u', 'd', 3, 'y', 'u', 'l', 4, 'y', 'u', 'l', 'g', 4, 'y', 'u', 'l', 'm', 4, 'y', 'u', 'l', 'b', 4, 'y', 'u', 'l', 's',\n4, 'y', 'u', 'l', 't', 4, 'y', 'u', 'l', 'p', 4, 'y', 'u', 'l', 'h', 3, 'y', 'u', 'm', 3, 'y', 'u', 'b', 4, 'y', 'u', 'b', 's',\n3, 'y', 'u', 's', 4, 'y', 'u', 's', 's', 4, 'y', 'u', 'n', 'g', 3, 'y', 'u', 'j', 3, 'y', 'u', 'c', 3, 'y', 'u', 'k',\n3, 'y', 'u', 't', 3, 'y', 'u', 'p', 3, 'y', 'u', 'h', 2, 'e', 'u', 3, 'e', 'u', 'g', 4, 'e', 'u', 'g', 'g',\n4, 'e', 'u', 'g', 's', 3, 'e', 'u', 'n', 4, 'e', 'u', 'n', 'j', 4, 'e', 'u', 'n', 'h', 3, 'e', 'u', 'd', 3, 'e', 'u', 'l',\n4, 'e', 'u', 'l', 'g', 4, 'e', 'u', 'l', 'm', 4, 'e', 'u', 'l', 'b', 4, 'e', 'u', 'l', 's', 4, 'e', 'u', 'l', 't', 4, 'e', 'u', 'l', 'p',\n4, 'e', 'u', 'l', 'h', 3, 'e', 'u', 'm', 3, 'e', 'u', 'b', 4, 'e', 'u', 'b', 's', 3, 'e', 'u', 's', 4, 'e', 'u', 's', 's',\n4, 'e', 'u', 'n', 'g', 3, 'e', 'u', 'j', 3, 'e', 'u', 'c', 3, 'e', 'u', 'k', 3, 'e', 'u', 't', 3, 'e', 'u', 'p',\n3, 'e', 'u', 'h', 2, 'y', 'i', 3, 'y', 'i', 'g', 4, 'y', 'i', 'g', 'g', 4, 'y', 'i', 'g', 's', 3, 'y', 'i', 'n',\n4, 'y', 'i', 'n', 'j', 4, 'y', 'i', 'n', 'h', 3, 'y', 'i', 'd', 3, 'y', 'i', 'l', 4, 'y', 'i', 'l', 'g', 4, 'y', 'i', 'l', 'm',\n4, 'y', 'i', 'l', 'b', 4, 'y', 'i', 'l', 's', 4, 'y', 'i', 'l', 't', 4, 'y', 'i', 'l', 'p', 4, 'y', 'i', 'l', 'h', 3, 'y', 'i', 'm',\n3, 'y', 'i', 'b', 4, 'y', 'i', 'b', 's', 3, 'y', 'i', 's', 4, 'y', 'i', 's', 's', 4, 'y', 'i', 'n', 'g', 3, 'y', 'i', 'j',\n3, 'y', 'i', 'c', 3, 'y', 'i', 'k', 3, 'y', 'i', 't', 3, 'y', 'i', 'p', 3, 'y', 'i', 'h', 1, 'i',\n2, 'i', 'g', 3, 'i', 'g', 'g', 3, 'i', 'g', 's', 2, 'i', 'n', 3, 'i', 'n', 'j', 3, 'i', 'n', 'h',\n2, 'i', 'd', 2, 'i', 'l', 3, 'i', 'l', 'g', 3, 'i', 'l', 'm', 3, 'i', 'l', 'b', 3, 'i', 'l', 's',\n3, 'i', 'l', 't', 3, 'i', 'l', 'p', 3, 'i', 'l', 'h', 2, 'i', 'm', 2, 'i', 'b', 3, 'i', 'b', 's',\n2, 'i', 's', 3, 'i', 's', 's', 3, 'i', 'n', 'g', 2, 'i', 'j', 2, 'i', 'c', 2, 'i', 'k',\n2, 'i', 't', 2, 'i', 'p', 2, 'i', 'h', 2, 'j', 'a', 3, 'j', 'a', 'g', 4, 'j', 'a', 'g', 'g',\n4, 'j', 'a', 'g', 's', 3, 'j', 'a', 'n', 4, 'j', 'a', 'n', 'j', 4, 'j', 'a', 'n', 'h', 3, 'j', 'a', 'd', 3, 'j', 'a', 'l',\n4, 'j', 'a', 'l', 'g', 4, 'j', 'a', 'l', 'm', 4, 'j', 'a', 'l', 'b', 4, 'j', 'a', 'l', 's', 4, 'j', 'a', 'l', 't', 4, 'j', 'a', 'l', 'p',\n4, 'j', 'a', 'l', 'h', 3, 'j', 'a', 'm', 3, 'j', 'a', 'b', 4, 'j', 'a', 'b', 's', 3, 'j', 'a', 's', 4, 'j', 'a', 's', 's',\n4, 'j', 'a', 'n', 'g', 3, 'j', 'a', 'j', 3, 'j', 'a', 'c', 3, 'j', 'a', 'k', 3, 'j', 'a', 't', 3, 'j', 'a', 'p',\n3, 'j', 'a', 'h', 3, 'j', 'a', 'e', 4, 'j', 'a', 'e', 'g', 5, 'j', 'a', 'e', 'g', 'g', 5, 'j', 'a', 'e', 'g', 's', 4, 'j', 'a', 'e', 'n',\n5, 'j', 'a', 'e', 'n', 'j', 5, 'j', 'a', 'e', 'n', 'h', 4, 'j', 'a', 'e', 'd', 4, 'j', 'a', 'e', 'l', 5, 'j', 'a', 'e', 'l', 'g', 5, 'j', 'a', 'e', 'l', 'm',\n5, 'j', 'a', 'e', 'l', 'b', 5, 'j', 'a', 'e', 'l', 's', 5, 'j', 'a', 'e', 'l', 't', 5, 'j', 'a', 'e', 'l', 'p', 5, 'j', 'a', 'e', 'l', 'h', 4, 'j', 'a', 'e', 'm',\n4, 'j', 'a', 'e', 'b', 5, 'j', 'a', 'e', 'b', 's', 4, 'j', 'a', 'e', 's', 5, 'j', 'a', 'e', 's', 's', 5, 'j', 'a', 'e', 'n', 'g', 4, 'j', 'a', 'e', 'j',\n4, 'j', 'a', 'e', 'c', 4, 'j', 'a', 'e', 'k', 4, 'j', 'a', 'e', 't', 4, 'j', 'a', 'e', 'p', 4, 'j', 'a', 'e', 'h', 3, 'j', 'y', 'a',\n4, 'j', 'y', 'a', 'g', 5, 'j', 'y', 'a', 'g', 'g', 5, 'j', 'y', 'a', 'g', 's', 4, 'j', 'y', 'a', 'n', 5, 'j', 'y', 'a', 'n', 'j', 5, 'j', 'y', 'a', 'n', 'h',\n4, 'j', 'y', 'a', 'd', 4, 'j', 'y', 'a', 'l', 5, 'j', 'y', 'a', 'l', 'g', 5, 'j', 'y', 'a', 'l', 'm', 5, 'j', 'y', 'a', 'l', 'b', 5, 'j', 'y', 'a', 'l', 's',\n5, 'j', 'y', 'a', 'l', 't', 5, 'j', 'y', 'a', 'l', 'p', 5, 'j', 'y', 'a', 'l', 'h', 4, 'j', 'y', 'a', 'm', 4, 'j', 'y', 'a', 'b', 5, 'j', 'y', 'a', 'b', 's',\n4, 'j', 'y', 'a', 's', 5, 'j', 'y', 'a', 's', 's', 5, 'j', 'y', 'a', 'n', 'g', 4, 'j', 'y', 'a', 'j', 4, 'j', 'y', 'a', 'c', 4, 'j', 'y', 'a', 'k',\n4, 'j', 'y', 'a', 't', 4, 'j', 'y', 'a', 'p', 4, 'j', 'y', 'a', 'h', 4, 'j', 'y', 'a', 'e', 5, 'j', 'y', 'a', 'e', 'g', 6, 'j', 'y', 'a', 'e', 'g', 'g',\n6, 'j', 'y', 'a', 'e', 'g', 's', 5, 'j', 'y', 'a', 'e', 'n', 6, 'j', 'y', 'a', 'e', 'n', 'j', 6, 'j', 'y', 'a', 'e', 'n', 'h', 5, 'j', 'y', 'a', 'e', 'd', 5, 'j', 'y', 'a', 'e', 'l',\n6, 'j', 'y', 'a', 'e', 'l', 'g', 6, 'j', 'y', 'a', 'e', 'l', 'm', 6, 'j', 'y', 'a', 'e', 'l', 'b', 6, 'j', 'y', 'a', 'e', 'l', 's', 6, 'j', 'y', 'a', 'e', 'l', 't', 6, 'j', 'y', 'a', 'e', 'l', 'p',\n6, 'j', 'y', 'a', 'e', 'l', 'h', 5, 'j', 'y', 'a', 'e', 'm', 5, 'j', 'y', 'a', 'e', 'b', 6, 'j', 'y', 'a', 'e', 'b', 's', 5, 'j', 'y', 'a', 'e', 's', 6, 'j', 'y', 'a', 'e', 's', 's',\n6, 'j', 'y', 'a', 'e', 'n', 'g', 5, 'j', 'y', 'a', 'e', 'j', 5, 'j', 'y', 'a', 'e', 'c', 5, 'j', 'y', 'a', 'e', 'k', 5, 'j', 'y', 'a', 'e', 't', 5, 'j', 'y', 'a', 'e', 'p',\n5, 'j', 'y', 'a', 'e', 'h', 3, 'j', 'e', 'o', 4, 'j', 'e', 'o', 'g', 5, 'j', 'e', 'o', 'g', 'g', 5, 'j', 'e', 'o', 'g', 's', 4, 'j', 'e', 'o', 'n',\n5, 'j', 'e', 'o', 'n', 'j', 5, 'j', 'e', 'o', 'n', 'h', 4, 'j', 'e', 'o', 'd', 4, 'j', 'e', 'o', 'l', 5, 'j', 'e', 'o', 'l', 'g', 5, 'j', 'e', 'o', 'l', 'm',\n5, 'j', 'e', 'o', 'l', 'b', 5, 'j', 'e', 'o', 'l', 's', 5, 'j', 'e', 'o', 'l', 't', 5, 'j', 'e', 'o', 'l', 'p', 5, 'j', 'e', 'o', 'l', 'h', 4, 'j', 'e', 'o', 'm',\n4, 'j', 'e', 'o', 'b', 5, 'j', 'e', 'o', 'b', 's', 4, 'j', 'e', 'o', 's', 5, 'j', 'e', 'o', 's', 's', 5, 'j', 'e', 'o', 'n', 'g', 4, 'j', 'e', 'o', 'j',\n4, 'j', 'e', 'o', 'c', 4, 'j', 'e', 'o', 'k', 4, 'j', 'e', 'o', 't', 4, 'j', 'e', 'o', 'p', 4, 'j', 'e', 'o', 'h', 2, 'j', 'e',\n3, 'j', 'e', 'g', 4, 'j', 'e', 'g', 'g', 4, 'j', 'e', 'g', 's', 3, 'j', 'e', 'n', 4, 'j', 'e', 'n', 'j', 4, 'j', 'e', 'n', 'h',\n3, 'j', 'e', 'd', 3, 'j', 'e', 'l', 4, 'j', 'e', 'l', 'g', 4, 'j', 'e', 'l', 'm', 4, 'j', 'e', 'l', 'b', 4, 'j', 'e', 'l', 's',\n4, 'j', 'e', 'l', 't', 4, 'j', 'e', 'l', 'p', 4, 'j', 'e', 'l', 'h', 3, 'j', 'e', 'm', 3, 'j', 'e', 'b', 4, 'j', 'e', 'b', 's',\n3, 'j', 'e', 's', 4, 'j', 'e', 's', 's', 4, 'j', 'e', 'n', 'g', 3, 'j', 'e', 'j', 3, 'j', 'e', 'c', 3, 'j', 'e', 'k',\n3, 'j', 'e', 't', 3, 'j', 'e', 'p', 3, 'j', 'e', 'h', 4, 'j', 'y', 'e', 'o', 5, 'j', 'y', 'e', 'o', 'g', 6, 'j', 'y', 'e', 'o', 'g', 'g',\n6, 'j', 'y', 'e', 'o', 'g', 's', 5, 'j', 'y', 'e', 'o', 'n', 6, 'j', 'y', 'e', 'o', 'n', 'j', 6, 'j', 'y', 'e', 'o', 'n', 'h', 5, 'j', 'y', 'e', 'o', 'd', 5, 'j', 'y', 'e', 'o', 'l',\n6, 'j', 'y', 'e', 'o', 'l', 'g', 6, 'j', 'y', 'e', 'o', 'l', 'm', 6, 'j', 'y', 'e', 'o', 'l', 'b', 6, 'j', 'y', 'e', 'o', 'l', 's', 6, 'j', 'y', 'e', 'o', 'l', 't', 6, 'j', 'y', 'e', 'o', 'l', 'p',\n6, 'j', 'y', 'e', 'o', 'l', 'h', 5, 'j', 'y', 'e', 'o', 'm', 5, 'j', 'y', 'e', 'o', 'b', 6, 'j', 'y', 'e', 'o', 'b', 's', 5, 'j', 'y', 'e', 'o', 's', 6, 'j', 'y', 'e', 'o', 's', 's',\n6, 'j', 'y', 'e', 'o', 'n', 'g', 5, 'j', 'y', 'e', 'o', 'j', 5, 'j', 'y', 'e', 'o', 'c', 5, 'j', 'y', 'e', 'o', 'k', 5, 'j', 'y', 'e', 'o', 't', 5, 'j', 'y', 'e', 'o', 'p',\n5, 'j', 'y', 'e', 'o', 'h', 3, 'j', 'y', 'e', 4, 'j', 'y', 'e', 'g', 5, 'j', 'y', 'e', 'g', 'g', 5, 'j', 'y', 'e', 'g', 's', 4, 'j', 'y', 'e', 'n',\n5, 'j', 'y', 'e', 'n', 'j', 5, 'j', 'y', 'e', 'n', 'h', 4, 'j', 'y', 'e', 'd', 4, 'j', 'y', 'e', 'l', 5, 'j', 'y', 'e', 'l', 'g', 5, 'j', 'y', 'e', 'l', 'm',\n5, 'j', 'y', 'e', 'l', 'b', 5, 'j', 'y', 'e', 'l', 's', 5, 'j', 'y', 'e', 'l', 't', 5, 'j', 'y', 'e', 'l', 'p', 5, 'j', 'y', 'e', 'l', 'h', 4, 'j', 'y', 'e', 'm',\n4, 'j', 'y', 'e', 'b', 5, 'j', 'y', 'e', 'b', 's', 4, 'j', 'y', 'e', 's', 5, 'j', 'y', 'e', 's', 's', 5, 'j', 'y', 'e', 'n', 'g', 4, 'j', 'y', 'e', 'j',\n4, 'j', 'y', 'e', 'c', 4, 'j', 'y', 'e', 'k', 4, 'j', 'y', 'e', 't', 4, 'j', 'y', 'e', 'p', 4, 'j', 'y', 'e', 'h', 2, 'j', 'o',\n3, 'j', 'o', 'g', 4, 'j', 'o', 'g', 'g', 4, 'j', 'o', 'g', 's', 3, 'j', 'o', 'n', 4, 'j', 'o', 'n', 'j', 4, 'j', 'o', 'n', 'h',\n3, 'j', 'o', 'd', 3, 'j', 'o', 'l', 4, 'j', 'o', 'l', 'g', 4, 'j', 'o', 'l', 'm', 4, 'j', 'o', 'l', 'b', 4, 'j', 'o', 'l', 's',\n4, 'j', 'o', 'l', 't', 4, 'j', 'o', 'l', 'p', 4, 'j', 'o', 'l', 'h', 3, 'j', 'o', 'm', 3, 'j', 'o', 'b', 4, 'j', 'o', 'b', 's',\n3, 'j', 'o', 's', 4, 'j', 'o', 's', 's', 4, 'j', 'o', 'n', 'g', 3, 'j', 'o', 'j', 3, 'j', 'o', 'c', 3, 'j', 'o', 'k',\n3, 'j', 'o', 't', 3, 'j', 'o', 'p', 3, 'j', 'o', 'h', 3, 'j', 'w', 'a', 4, 'j', 'w', 'a', 'g', 5, 'j', 'w', 'a', 'g', 'g',\n5, 'j', 'w', 'a', 'g', 's', 4, 'j', 'w', 'a', 'n', 5, 'j', 'w', 'a', 'n', 'j', 5, 'j', 'w', 'a', 'n', 'h', 4, 'j', 'w', 'a', 'd', 4, 'j', 'w', 'a', 'l',\n5, 'j', 'w', 'a', 'l', 'g', 5, 'j', 'w', 'a', 'l', 'm', 5, 'j', 'w', 'a', 'l', 'b', 5, 'j', 'w', 'a', 'l', 's', 5, 'j', 'w', 'a', 'l', 't', 5, 'j', 'w', 'a', 'l', 'p',\n5, 'j', 'w', 'a', 'l', 'h', 4, 'j', 'w', 'a', 'm', 4, 'j', 'w', 'a', 'b', 5, 'j', 'w', 'a', 'b', 's', 4, 'j', 'w', 'a', 's', 5, 'j', 'w', 'a', 's', 's',\n5, 'j', 'w', 'a', 'n', 'g', 4, 'j', 'w', 'a', 'j', 4, 'j', 'w', 'a', 'c', 4, 'j', 'w', 'a', 'k', 4, 'j', 'w', 'a', 't', 4, 'j', 'w', 'a', 'p',\n4, 'j', 'w', 'a', 'h', 4, 'j', 'w', 'a', 'e', 5, 'j', 'w', 'a', 'e', 'g', 6, 'j', 'w', 'a', 'e', 'g', 'g', 6, 'j', 'w', 'a', 'e', 'g', 's', 5, 'j', 'w', 'a', 'e', 'n',\n6, 'j', 'w', 'a', 'e', 'n', 'j', 6, 'j', 'w', 'a', 'e', 'n', 'h', 5, 'j', 'w', 'a', 'e', 'd', 5, 'j', 'w', 'a', 'e', 'l', 6, 'j', 'w', 'a', 'e', 'l', 'g', 6, 'j', 'w', 'a', 'e', 'l', 'm',\n6, 'j', 'w', 'a', 'e', 'l', 'b', 6, 'j', 'w', 'a', 'e', 'l', 's', 6, 'j', 'w', 'a', 'e', 'l', 't', 6, 'j', 'w', 'a', 'e', 'l', 'p', 6, 'j', 'w', 'a', 'e', 'l', 'h', 5, 'j', 'w', 'a', 'e', 'm',\n5, 'j', 'w', 'a', 'e', 'b', 6, 'j', 'w', 'a', 'e', 'b', 's', 5, 'j', 'w', 'a', 'e', 's', 6, 'j', 'w', 'a', 'e', 's', 's', 6, 'j', 'w', 'a', 'e', 'n', 'g', 5, 'j', 'w', 'a', 'e', 'j',\n5, 'j', 'w', 'a', 'e', 'c', 5, 'j', 'w', 'a', 'e', 'k', 5, 'j', 'w', 'a', 'e', 't', 5, 'j', 'w', 'a', 'e', 'p', 5, 'j', 'w', 'a', 'e', 'h', 3, 'j', 'o', 'e',\n4, 'j', 'o', 'e', 'g', 5, 'j', 'o', 'e', 'g', 'g', 5, 'j', 'o', 'e', 'g', 's', 4, 'j', 'o', 'e', 'n', 5, 'j', 'o', 'e', 'n', 'j', 5, 'j', 'o', 'e', 'n', 'h',\n4, 'j', 'o', 'e', 'd', 4, 'j', 'o', 'e', 'l', 5, 'j', 'o', 'e', 'l', 'g', 5, 'j', 'o', 'e', 'l', 'm', 5, 'j', 'o', 'e', 'l', 'b', 5, 'j', 'o', 'e', 'l', 's',\n5, 'j', 'o', 'e', 'l', 't', 5, 'j', 'o', 'e', 'l', 'p', 5, 'j', 'o', 'e', 'l', 'h', 4, 'j', 'o', 'e', 'm', 4, 'j', 'o', 'e', 'b', 5, 'j', 'o', 'e', 'b', 's',\n4, 'j', 'o', 'e', 's', 5, 'j', 'o', 'e', 's', 's', 5, 'j', 'o', 'e', 'n', 'g', 4, 'j', 'o', 'e', 'j', 4, 'j', 'o', 'e', 'c', 4, 'j', 'o', 'e', 'k',\n4, 'j', 'o', 'e', 't', 4, 'j', 'o', 'e', 'p', 4, 'j', 'o', 'e', 'h', 3, 'j', 'y', 'o', 4, 'j', 'y', 'o', 'g', 5, 'j', 'y', 'o', 'g', 'g',\n5, 'j', 'y', 'o', 'g', 's', 4, 'j', 'y', 'o', 'n', 5, 'j', 'y', 'o', 'n', 'j', 5, 'j', 'y', 'o', 'n', 'h', 4, 'j', 'y', 'o', 'd', 4, 'j', 'y', 'o', 'l',\n5, 'j', 'y', 'o', 'l', 'g', 5, 'j', 'y', 'o', 'l', 'm', 5, 'j', 'y', 'o', 'l', 'b', 5, 'j', 'y', 'o', 'l', 's', 5, 'j', 'y', 'o', 'l', 't', 5, 'j', 'y', 'o', 'l', 'p',\n5, 'j', 'y', 'o', 'l', 'h', 4, 'j', 'y', 'o', 'm', 4, 'j', 'y', 'o', 'b', 5, 'j', 'y', 'o', 'b', 's', 4, 'j', 'y', 'o', 's', 5, 'j', 'y', 'o', 's', 's',\n5, 'j', 'y', 'o', 'n', 'g', 4, 'j', 'y', 'o', 'j', 4, 'j', 'y', 'o', 'c', 4, 'j', 'y', 'o', 'k', 4, 'j', 'y', 'o', 't', 4, 'j', 'y', 'o', 'p',\n4, 'j', 'y', 'o', 'h', 2, 'j', 'u', 3, 'j', 'u', 'g', 4, 'j', 'u', 'g', 'g', 4, 'j', 'u', 'g', 's', 3, 'j', 'u', 'n',\n4, 'j', 'u', 'n', 'j', 4, 'j', 'u', 'n', 'h', 3, 'j', 'u', 'd', 3, 'j', 'u', 'l', 4, 'j', 'u', 'l', 'g', 4, 'j', 'u', 'l', 'm',\n4, 'j', 'u', 'l', 'b', 4, 'j', 'u', 'l', 's', 4, 'j', 'u', 'l', 't', 4, 'j', 'u', 'l', 'p', 4, 'j', 'u', 'l', 'h', 3, 'j', 'u', 'm',\n3, 'j', 'u', 'b', 4, 'j', 'u', 'b', 's', 3, 'j', 'u', 's', 4, 'j', 'u', 's', 's', 4, 'j', 'u', 'n', 'g', 3, 'j', 'u', 'j',\n3, 'j', 'u', 'c', 3, 'j', 'u', 'k', 3, 'j', 'u', 't', 3, 'j', 'u', 'p', 3, 'j', 'u', 'h', 4, 'j', 'w', 'e', 'o',\n5, 'j', 'w', 'e', 'o', 'g', 6, 'j', 'w', 'e', 'o', 'g', 'g', 6, 'j', 'w', 'e', 'o', 'g', 's', 5, 'j', 'w', 'e', 'o', 'n', 6, 'j', 'w', 'e', 'o', 'n', 'j', 6, 'j', 'w', 'e', 'o', 'n', 'h',\n5, 'j', 'w', 'e', 'o', 'd', 5, 'j', 'w', 'e', 'o', 'l', 6, 'j', 'w', 'e', 'o', 'l', 'g', 6, 'j', 'w', 'e', 'o', 'l', 'm', 6, 'j', 'w', 'e', 'o', 'l', 'b', 6, 'j', 'w', 'e', 'o', 'l', 's',\n6, 'j', 'w', 'e', 'o', 'l', 't', 6, 'j', 'w', 'e', 'o', 'l', 'p', 6, 'j', 'w', 'e', 'o', 'l', 'h', 5, 'j', 'w', 'e', 'o', 'm', 5, 'j', 'w', 'e', 'o', 'b', 6, 'j', 'w', 'e', 'o', 'b', 's',\n5, 'j', 'w', 'e', 'o', 's', 6, 'j', 'w', 'e', 'o', 's', 's', 6, 'j', 'w', 'e', 'o', 'n', 'g', 5, 'j', 'w', 'e', 'o', 'j', 5, 'j', 'w', 'e', 'o', 'c', 5, 'j', 'w', 'e', 'o', 'k',\n5, 'j', 'w', 'e', 'o', 't', 5, 'j', 'w', 'e', 'o', 'p', 5, 'j', 'w', 'e', 'o', 'h', 3, 'j', 'w', 'e', 4, 'j', 'w', 'e', 'g', 5, 'j', 'w', 'e', 'g', 'g',\n5, 'j', 'w', 'e', 'g', 's', 4, 'j', 'w', 'e', 'n', 5, 'j', 'w', 'e', 'n', 'j', 5, 'j', 'w', 'e', 'n', 'h', 4, 'j', 'w', 'e', 'd', 4, 'j', 'w', 'e', 'l',\n5, 'j', 'w', 'e', 'l', 'g', 5, 'j', 'w', 'e', 'l', 'm', 5, 'j', 'w', 'e', 'l', 'b', 5, 'j', 'w', 'e', 'l', 's', 5, 'j', 'w', 'e', 'l', 't', 5, 'j', 'w', 'e', 'l', 'p',\n5, 'j', 'w', 'e', 'l', 'h', 4, 'j', 'w', 'e', 'm', 4, 'j', 'w', 'e', 'b', 5, 'j', 'w', 'e', 'b', 's', 4, 'j', 'w', 'e', 's', 5, 'j', 'w', 'e', 's', 's',\n5, 'j', 'w', 'e', 'n', 'g', 4, 'j', 'w', 'e', 'j', 4, 'j', 'w', 'e', 'c', 4, 'j', 'w', 'e', 'k', 4, 'j', 'w', 'e', 't', 4, 'j', 'w', 'e', 'p',\n4, 'j', 'w', 'e', 'h', 3, 'j', 'w', 'i', 4, 'j', 'w', 'i', 'g', 5, 'j', 'w', 'i', 'g', 'g', 5, 'j', 'w', 'i', 'g', 's', 4, 'j', 'w', 'i', 'n',\n5, 'j', 'w', 'i', 'n', 'j', 5, 'j', 'w', 'i', 'n', 'h', 4, 'j', 'w', 'i', 'd', 4, 'j', 'w', 'i', 'l', 5, 'j', 'w', 'i', 'l', 'g', 5, 'j', 'w', 'i', 'l', 'm',\n5, 'j', 'w', 'i', 'l', 'b', 5, 'j', 'w', 'i', 'l', 's', 5, 'j', 'w', 'i', 'l', 't', 5, 'j', 'w', 'i', 'l', 'p', 5, 'j', 'w', 'i', 'l', 'h', 4, 'j', 'w', 'i', 'm',\n4, 'j', 'w', 'i', 'b', 5, 'j', 'w', 'i', 'b', 's', 4, 'j', 'w', 'i', 's', 5, 'j', 'w', 'i', 's', 's', 5, 'j', 'w', 'i', 'n', 'g', 4, 'j', 'w', 'i', 'j',\n4, 'j', 'w', 'i', 'c', 4, 'j', 'w', 'i', 'k', 4, 'j', 'w', 'i', 't', 4, 'j', 'w', 'i', 'p', 4, 'j', 'w', 'i', 'h', 3, 'j', 'y', 'u',\n4, 'j', 'y', 'u', 'g', 5, 'j', 'y', 'u', 'g', 'g', 5, 'j', 'y', 'u', 'g', 's', 4, 'j', 'y', 'u', 'n', 5, 'j', 'y', 'u', 'n', 'j', 5, 'j', 'y', 'u', 'n', 'h',\n4, 'j', 'y', 'u', 'd', 4, 'j', 'y', 'u', 'l', 5, 'j', 'y', 'u', 'l', 'g', 5, 'j', 'y', 'u', 'l', 'm', 5, 'j', 'y', 'u', 'l', 'b', 5, 'j', 'y', 'u', 'l', 's',\n5, 'j', 'y', 'u', 'l', 't', 5, 'j', 'y', 'u', 'l', 'p', 5, 'j', 'y', 'u', 'l', 'h', 4, 'j', 'y', 'u', 'm', 4, 'j', 'y', 'u', 'b', 5, 'j', 'y', 'u', 'b', 's',\n4, 'j', 'y', 'u', 's', 5, 'j', 'y', 'u', 's', 's', 5, 'j', 'y', 'u', 'n', 'g', 4, 'j', 'y', 'u', 'j', 4, 'j', 'y', 'u', 'c', 4, 'j', 'y', 'u', 'k',\n4, 'j', 'y', 'u', 't', 4, 'j', 'y', 'u', 'p', 4, 'j', 'y', 'u', 'h', 3, 'j', 'e', 'u', 4, 'j', 'e', 'u', 'g', 5, 'j', 'e', 'u', 'g', 'g',\n5, 'j', 'e', 'u', 'g', 's', 4, 'j', 'e', 'u', 'n', 5, 'j', 'e', 'u', 'n', 'j', 5, 'j', 'e', 'u', 'n', 'h', 4, 'j', 'e', 'u', 'd', 4, 'j', 'e', 'u', 'l',\n5, 'j', 'e', 'u', 'l', 'g', 5, 'j', 'e', 'u', 'l', 'm', 5, 'j', 'e', 'u', 'l', 'b', 5, 'j', 'e', 'u', 'l', 's', 5, 'j', 'e', 'u', 'l', 't', 5, 'j', 'e', 'u', 'l', 'p',\n5, 'j', 'e', 'u', 'l', 'h', 4, 'j', 'e', 'u', 'm', 4, 'j', 'e', 'u', 'b', 5, 'j', 'e', 'u', 'b', 's', 4, 'j', 'e', 'u', 's', 5, 'j', 'e', 'u', 's', 's',\n5, 'j', 'e', 'u', 'n', 'g', 4, 'j', 'e', 'u', 'j', 4, 'j', 'e', 'u', 'c', 4, 'j', 'e', 'u', 'k', 4, 'j', 'e', 'u', 't', 4, 'j', 'e', 'u', 'p',\n4, 'j', 'e', 'u', 'h', 3, 'j', 'y', 'i', 4, 'j', 'y', 'i', 'g', 5, 'j', 'y', 'i', 'g', 'g', 5, 'j', 'y', 'i', 'g', 's', 4, 'j', 'y', 'i', 'n',\n5, 'j', 'y', 'i', 'n', 'j', 5, 'j', 'y', 'i', 'n', 'h', 4, 'j', 'y', 'i', 'd', 4, 'j', 'y', 'i', 'l', 5, 'j', 'y', 'i', 'l', 'g', 5, 'j', 'y', 'i', 'l', 'm',\n5, 'j', 'y', 'i', 'l', 'b', 5, 'j', 'y', 'i', 'l', 's', 5, 'j', 'y', 'i', 'l', 't', 5, 'j', 'y', 'i', 'l', 'p', 5, 'j', 'y', 'i', 'l', 'h', 4, 'j', 'y', 'i', 'm',\n4, 'j', 'y', 'i', 'b', 5, 'j', 'y', 'i', 'b', 's', 4, 'j', 'y', 'i', 's', 5, 'j', 'y', 'i', 's', 's', 5, 'j', 'y', 'i', 'n', 'g', 4, 'j', 'y', 'i', 'j',\n4, 'j', 'y', 'i', 'c', 4, 'j', 'y', 'i', 'k', 4, 'j', 'y', 'i', 't', 4, 'j', 'y', 'i', 'p', 4, 'j', 'y', 'i', 'h', 2, 'j', 'i',\n3, 'j', 'i', 'g', 4, 'j', 'i', 'g', 'g', 4, 'j', 'i', 'g', 's', 3, 'j', 'i', 'n', 4, 'j', 'i', 'n', 'j', 4, 'j', 'i', 'n', 'h',\n3, 'j', 'i', 'd', 3, 'j', 'i', 'l', 4, 'j', 'i', 'l', 'g', 4, 'j', 'i', 'l', 'm', 4, 'j', 'i', 'l', 'b', 4, 'j', 'i', 'l', 's',\n4, 'j', 'i', 'l', 't', 4, 'j', 'i', 'l', 'p', 4, 'j', 'i', 'l', 'h', 3, 'j', 'i', 'm', 3, 'j', 'i', 'b', 4, 'j', 'i', 'b', 's',\n3, 'j', 'i', 's', 4, 'j', 'i', 's', 's', 4, 'j', 'i', 'n', 'g', 3, 'j', 'i', 'j', 3, 'j', 'i', 'c', 3, 'j', 'i', 'k',\n3, 'j', 'i', 't', 3, 'j', 'i', 'p', 3, 'j', 'i', 'h', 3, 'j', 'j', 'a', 4, 'j', 'j', 'a', 'g', 5, 'j', 'j', 'a', 'g', 'g',\n5, 'j', 'j', 'a', 'g', 's', 4, 'j', 'j', 'a', 'n', 5, 'j', 'j', 'a', 'n', 'j', 5, 'j', 'j', 'a', 'n', 'h', 4, 'j', 'j', 'a', 'd', 4, 'j', 'j', 'a', 'l',\n5, 'j', 'j', 'a', 'l', 'g', 5, 'j', 'j', 'a', 'l', 'm', 5, 'j', 'j', 'a', 'l', 'b', 5, 'j', 'j', 'a', 'l', 's', 5, 'j', 'j', 'a', 'l', 't', 5, 'j', 'j', 'a', 'l', 'p',\n5, 'j', 'j', 'a', 'l', 'h', 4, 'j', 'j', 'a', 'm', 4, 'j', 'j', 'a', 'b', 5, 'j', 'j', 'a', 'b', 's', 4, 'j', 'j', 'a', 's', 5, 'j', 'j', 'a', 's', 's',\n5, 'j', 'j', 'a', 'n', 'g', 4, 'j', 'j', 'a', 'j', 4, 'j', 'j', 'a', 'c', 4, 'j', 'j', 'a', 'k', 4, 'j', 'j', 'a', 't', 4, 'j', 'j', 'a', 'p',\n4, 'j', 'j', 'a', 'h', 4, 'j', 'j', 'a', 'e', 5, 'j', 'j', 'a', 'e', 'g', 6, 'j', 'j', 'a', 'e', 'g', 'g', 6, 'j', 'j', 'a', 'e', 'g', 's', 5, 'j', 'j', 'a', 'e', 'n',\n6, 'j', 'j', 'a', 'e', 'n', 'j', 6, 'j', 'j', 'a', 'e', 'n', 'h', 5, 'j', 'j', 'a', 'e', 'd', 5, 'j', 'j', 'a', 'e', 'l', 6, 'j', 'j', 'a', 'e', 'l', 'g', 6, 'j', 'j', 'a', 'e', 'l', 'm',\n6, 'j', 'j', 'a', 'e', 'l', 'b', 6, 'j', 'j', 'a', 'e', 'l', 's', 6, 'j', 'j', 'a', 'e', 'l', 't', 6, 'j', 'j', 'a', 'e', 'l', 'p', 6, 'j', 'j', 'a', 'e', 'l', 'h', 5, 'j', 'j', 'a', 'e', 'm',\n5, 'j', 'j', 'a', 'e', 'b', 6, 'j', 'j', 'a', 'e', 'b', 's', 5, 'j', 'j', 'a', 'e', 's', 6, 'j', 'j', 'a', 'e', 's', 's', 6, 'j', 'j', 'a', 'e', 'n', 'g', 5, 'j', 'j', 'a', 'e', 'j',\n5, 'j', 'j', 'a', 'e', 'c', 5, 'j', 'j', 'a', 'e', 'k', 5, 'j', 'j', 'a', 'e', 't', 5, 'j', 'j', 'a', 'e', 'p', 5, 'j', 'j', 'a', 'e', 'h', 4, 'j', 'j', 'y', 'a',\n5, 'j', 'j', 'y', 'a', 'g', 6, 'j', 'j', 'y', 'a', 'g', 'g', 6, 'j', 'j', 'y', 'a', 'g', 's', 5, 'j', 'j', 'y', 'a', 'n', 6, 'j', 'j', 'y', 'a', 'n', 'j', 6, 'j', 'j', 'y', 'a', 'n', 'h',\n5, 'j', 'j', 'y', 'a', 'd', 5, 'j', 'j', 'y', 'a', 'l', 6, 'j', 'j', 'y', 'a', 'l', 'g', 6, 'j', 'j', 'y', 'a', 'l', 'm', 6, 'j', 'j', 'y', 'a', 'l', 'b', 6, 'j', 'j', 'y', 'a', 'l', 's',\n6, 'j', 'j', 'y', 'a', 'l', 't', 6, 'j', 'j', 'y', 'a', 'l', 'p', 6, 'j', 'j', 'y', 'a', 'l', 'h', 5, 'j', 'j', 'y', 'a', 'm', 5, 'j', 'j', 'y', 'a', 'b', 6, 'j', 'j', 'y', 'a', 'b', 's',\n5, 'j', 'j', 'y', 'a', 's', 6, 'j', 'j', 'y', 'a', 's', 's', 6, 'j', 'j', 'y', 'a', 'n', 'g', 5, 'j', 'j', 'y', 'a', 'j', 5, 'j', 'j', 'y', 'a', 'c', 5, 'j', 'j', 'y', 'a', 'k',\n5, 'j', 'j', 'y', 'a', 't', 5, 'j', 'j', 'y', 'a', 'p', 5, 'j', 'j', 'y', 'a', 'h', 5, 'j', 'j', 'y', 'a', 'e', 6, 'j', 'j', 'y', 'a', 'e', 'g', 7, 'j', 'j', 'y', 'a', 'e', 'g', 'g',\n7, 'j', 'j', 'y', 'a', 'e', 'g', 's', 6, 'j', 'j', 'y', 'a', 'e', 'n', 7, 'j', 'j', 'y', 'a', 'e', 'n', 'j', 7, 'j', 'j', 'y', 'a', 'e', 'n', 'h', 6, 'j', 'j', 'y', 'a', 'e', 'd', 6, 'j', 'j', 'y', 'a', 'e', 'l',\n7, 'j', 'j', 'y', 'a', 'e', 'l', 'g', 7, 'j', 'j', 'y', 'a', 'e', 'l', 'm', 7, 'j', 'j', 'y', 'a', 'e', 'l', 'b', 7, 'j', 'j', 'y', 'a', 'e', 'l', 's', 7, 'j', 'j', 'y', 'a', 'e', 'l', 't', 7, 'j', 'j', 'y', 'a', 'e', 'l', 'p',\n7, 'j', 'j', 'y', 'a', 'e', 'l', 'h', 6, 'j', 'j', 'y', 'a', 'e', 'm', 6, 'j', 'j', 'y', 'a', 'e', 'b', 7, 'j', 'j', 'y', 'a', 'e', 'b', 's', 6, 'j', 'j', 'y', 'a', 'e', 's', 7, 'j', 'j', 'y', 'a', 'e', 's', 's',\n7, 'j', 'j', 'y', 'a', 'e', 'n', 'g', 6, 'j', 'j', 'y', 'a', 'e', 'j', 6, 'j', 'j', 'y', 'a', 'e', 'c', 6, 'j', 'j', 'y', 'a', 'e', 'k', 6, 'j', 'j', 'y', 'a', 'e', 't', 6, 'j', 'j', 'y', 'a', 'e', 'p',\n6, 'j', 'j', 'y', 'a', 'e', 'h', 4, 'j', 'j', 'e', 'o', 5, 'j', 'j', 'e', 'o', 'g', 6, 'j', 'j', 'e', 'o', 'g', 'g', 6, 'j', 'j', 'e', 'o', 'g', 's', 5, 'j', 'j', 'e', 'o', 'n',\n6, 'j', 'j', 'e', 'o', 'n', 'j', 6, 'j', 'j', 'e', 'o', 'n', 'h', 5, 'j', 'j', 'e', 'o', 'd', 5, 'j', 'j', 'e', 'o', 'l', 6, 'j', 'j', 'e', 'o', 'l', 'g', 6, 'j', 'j', 'e', 'o', 'l', 'm',\n6, 'j', 'j', 'e', 'o', 'l', 'b', 6, 'j', 'j', 'e', 'o', 'l', 's', 6, 'j', 'j', 'e', 'o', 'l', 't', 6, 'j', 'j', 'e', 'o', 'l', 'p', 6, 'j', 'j', 'e', 'o', 'l', 'h', 5, 'j', 'j', 'e', 'o', 'm',\n5, 'j', 'j', 'e', 'o', 'b', 6, 'j', 'j', 'e', 'o', 'b', 's', 5, 'j', 'j', 'e', 'o', 's', 6, 'j', 'j', 'e', 'o', 's', 's', 6, 'j', 'j', 'e', 'o', 'n', 'g', 5, 'j', 'j', 'e', 'o', 'j',\n5, 'j', 'j', 'e', 'o', 'c', 5, 'j', 'j', 'e', 'o', 'k', 5, 'j', 'j', 'e', 'o', 't', 5, 'j', 'j', 'e', 'o', 'p', 5, 'j', 'j', 'e', 'o', 'h', 3, 'j', 'j', 'e',\n4, 'j', 'j', 'e', 'g', 5, 'j', 'j', 'e', 'g', 'g', 5, 'j', 'j', 'e', 'g', 's', 4, 'j', 'j', 'e', 'n', 5, 'j', 'j', 'e', 'n', 'j', 5, 'j', 'j', 'e', 'n', 'h',\n4, 'j', 'j', 'e', 'd', 4, 'j', 'j', 'e', 'l', 5, 'j', 'j', 'e', 'l', 'g', 5, 'j', 'j', 'e', 'l', 'm', 5, 'j', 'j', 'e', 'l', 'b', 5, 'j', 'j', 'e', 'l', 's',\n5, 'j', 'j', 'e', 'l', 't', 5, 'j', 'j', 'e', 'l', 'p', 5, 'j', 'j', 'e', 'l', 'h', 4, 'j', 'j', 'e', 'm', 4, 'j', 'j', 'e', 'b', 5, 'j', 'j', 'e', 'b', 's',\n4, 'j', 'j', 'e', 's', 5, 'j', 'j', 'e', 's', 's', 5, 'j', 'j', 'e', 'n', 'g', 4, 'j', 'j', 'e', 'j', 4, 'j', 'j', 'e', 'c', 4, 'j', 'j', 'e', 'k',\n4, 'j', 'j', 'e', 't', 4, 'j', 'j', 'e', 'p', 4, 'j', 'j', 'e', 'h', 5, 'j', 'j', 'y', 'e', 'o', 6, 'j', 'j', 'y', 'e', 'o', 'g', 7, 'j', 'j', 'y', 'e', 'o', 'g', 'g',\n7, 'j', 'j', 'y', 'e', 'o', 'g', 's', 6, 'j', 'j', 'y', 'e', 'o', 'n', 7, 'j', 'j', 'y', 'e', 'o', 'n', 'j', 7, 'j', 'j', 'y', 'e', 'o', 'n', 'h', 6, 'j', 'j', 'y', 'e', 'o', 'd', 6, 'j', 'j', 'y', 'e', 'o', 'l',\n7, 'j', 'j', 'y', 'e', 'o', 'l', 'g', 7, 'j', 'j', 'y', 'e', 'o', 'l', 'm', 7, 'j', 'j', 'y', 'e', 'o', 'l', 'b', 7, 'j', 'j', 'y', 'e', 'o', 'l', 's', 7, 'j', 'j', 'y', 'e', 'o', 'l', 't', 7, 'j', 'j', 'y', 'e', 'o', 'l', 'p',\n7, 'j', 'j', 'y', 'e', 'o', 'l', 'h', 6, 'j', 'j', 'y', 'e', 'o', 'm', 6, 'j', 'j', 'y', 'e', 'o', 'b', 7, 'j', 'j', 'y', 'e', 'o', 'b', 's', 6, 'j', 'j', 'y', 'e', 'o', 's', 7, 'j', 'j', 'y', 'e', 'o', 's', 's',\n7, 'j', 'j', 'y', 'e', 'o', 'n', 'g', 6, 'j', 'j', 'y', 'e', 'o', 'j', 6, 'j', 'j', 'y', 'e', 'o', 'c', 6, 'j', 'j', 'y', 'e', 'o', 'k', 6, 'j', 'j', 'y', 'e', 'o', 't', 6, 'j', 'j', 'y', 'e', 'o', 'p',\n6, 'j', 'j', 'y', 'e', 'o', 'h', 4, 'j', 'j', 'y', 'e', 5, 'j', 'j', 'y', 'e', 'g', 6, 'j', 'j', 'y', 'e', 'g', 'g', 6, 'j', 'j', 'y', 'e', 'g', 's', 5, 'j', 'j', 'y', 'e', 'n',\n6, 'j', 'j', 'y', 'e', 'n', 'j', 6, 'j', 'j', 'y', 'e', 'n', 'h', 5, 'j', 'j', 'y', 'e', 'd', 5, 'j', 'j', 'y', 'e', 'l', 6, 'j', 'j', 'y', 'e', 'l', 'g', 6, 'j', 'j', 'y', 'e', 'l', 'm',\n6, 'j', 'j', 'y', 'e', 'l', 'b', 6, 'j', 'j', 'y', 'e', 'l', 's', 6, 'j', 'j', 'y', 'e', 'l', 't', 6, 'j', 'j', 'y', 'e', 'l', 'p', 6, 'j', 'j', 'y', 'e', 'l', 'h', 5, 'j', 'j', 'y', 'e', 'm',\n5, 'j', 'j', 'y', 'e', 'b', 6, 'j', 'j', 'y', 'e', 'b', 's', 5, 'j', 'j', 'y', 'e', 's', 6, 'j', 'j', 'y', 'e', 's', 's', 6, 'j', 'j', 'y', 'e', 'n', 'g', 5, 'j', 'j', 'y', 'e', 'j',\n5, 'j', 'j', 'y', 'e', 'c', 5, 'j', 'j', 'y', 'e', 'k', 5, 'j', 'j', 'y', 'e', 't', 5, 'j', 'j', 'y', 'e', 'p', 5, 'j', 'j', 'y', 'e', 'h', 3, 'j', 'j', 'o',\n4, 'j', 'j', 'o', 'g', 5, 'j', 'j', 'o', 'g', 'g', 5, 'j', 'j', 'o', 'g', 's', 4, 'j', 'j', 'o', 'n', 5, 'j', 'j', 'o', 'n', 'j', 5, 'j', 'j', 'o', 'n', 'h',\n4, 'j', 'j', 'o', 'd', 4, 'j', 'j', 'o', 'l', 5, 'j', 'j', 'o', 'l', 'g', 5, 'j', 'j', 'o', 'l', 'm', 5, 'j', 'j', 'o', 'l', 'b', 5, 'j', 'j', 'o', 'l', 's',\n5, 'j', 'j', 'o', 'l', 't', 5, 'j', 'j', 'o', 'l', 'p', 5, 'j', 'j', 'o', 'l', 'h', 4, 'j', 'j', 'o', 'm', 4, 'j', 'j', 'o', 'b', 5, 'j', 'j', 'o', 'b', 's',\n4, 'j', 'j', 'o', 's', 5, 'j', 'j', 'o', 's', 's', 5, 'j', 'j', 'o', 'n', 'g', 4, 'j', 'j', 'o', 'j', 4, 'j', 'j', 'o', 'c', 4, 'j', 'j', 'o', 'k',\n4, 'j', 'j', 'o', 't', 4, 'j', 'j', 'o', 'p', 4, 'j', 'j', 'o', 'h', 4, 'j', 'j', 'w', 'a', 5, 'j', 'j', 'w', 'a', 'g', 6, 'j', 'j', 'w', 'a', 'g', 'g',\n6, 'j', 'j', 'w', 'a', 'g', 's', 5, 'j', 'j', 'w', 'a', 'n', 6, 'j', 'j', 'w', 'a', 'n', 'j', 6, 'j', 'j', 'w', 'a', 'n', 'h', 5, 'j', 'j', 'w', 'a', 'd', 5, 'j', 'j', 'w', 'a', 'l',\n6, 'j', 'j', 'w', 'a', 'l', 'g', 6, 'j', 'j', 'w', 'a', 'l', 'm', 6, 'j', 'j', 'w', 'a', 'l', 'b', 6, 'j', 'j', 'w', 'a', 'l', 's', 6, 'j', 'j', 'w', 'a', 'l', 't', 6, 'j', 'j', 'w', 'a', 'l', 'p',\n6, 'j', 'j', 'w', 'a', 'l', 'h', 5, 'j', 'j', 'w', 'a', 'm', 5, 'j', 'j', 'w', 'a', 'b', 6, 'j', 'j', 'w', 'a', 'b', 's', 5, 'j', 'j', 'w', 'a', 's', 6, 'j', 'j', 'w', 'a', 's', 's',\n6, 'j', 'j', 'w', 'a', 'n', 'g', 5, 'j', 'j', 'w', 'a', 'j', 5, 'j', 'j', 'w', 'a', 'c', 5, 'j', 'j', 'w', 'a', 'k', 5, 'j', 'j', 'w', 'a', 't', 5, 'j', 'j', 'w', 'a', 'p',\n5, 'j', 'j', 'w', 'a', 'h', 5, 'j', 'j', 'w', 'a', 'e', 6, 'j', 'j', 'w', 'a', 'e', 'g', 7, 'j', 'j', 'w', 'a', 'e', 'g', 'g', 7, 'j', 'j', 'w', 'a', 'e', 'g', 's', 6, 'j', 'j', 'w', 'a', 'e', 'n',\n7, 'j', 'j', 'w', 'a', 'e', 'n', 'j', 7, 'j', 'j', 'w', 'a', 'e', 'n', 'h', 6, 'j', 'j', 'w', 'a', 'e', 'd', 6, 'j', 'j', 'w', 'a', 'e', 'l', 7, 'j', 'j', 'w', 'a', 'e', 'l', 'g', 7, 'j', 'j', 'w', 'a', 'e', 'l', 'm',\n7, 'j', 'j', 'w', 'a', 'e', 'l', 'b', 7, 'j', 'j', 'w', 'a', 'e', 'l', 's', 7, 'j', 'j', 'w', 'a', 'e', 'l', 't', 7, 'j', 'j', 'w', 'a', 'e', 'l', 'p', 7, 'j', 'j', 'w', 'a', 'e', 'l', 'h', 6, 'j', 'j', 'w', 'a', 'e', 'm',\n6, 'j', 'j', 'w', 'a', 'e', 'b', 7, 'j', 'j', 'w', 'a', 'e', 'b', 's', 6, 'j', 'j', 'w', 'a', 'e', 's', 7, 'j', 'j', 'w', 'a', 'e', 's', 's', 7, 'j', 'j', 'w', 'a', 'e', 'n', 'g', 6, 'j', 'j', 'w', 'a', 'e', 'j',\n6, 'j', 'j', 'w', 'a', 'e', 'c', 6, 'j', 'j', 'w', 'a', 'e', 'k', 6, 'j', 'j', 'w', 'a', 'e', 't', 6, 'j', 'j', 'w', 'a', 'e', 'p', 6, 'j', 'j', 'w', 'a', 'e', 'h', 4, 'j', 'j', 'o', 'e',\n5, 'j', 'j', 'o', 'e', 'g', 6, 'j', 'j', 'o', 'e', 'g', 'g', 6, 'j', 'j', 'o', 'e', 'g', 's', 5, 'j', 'j', 'o', 'e', 'n', 6, 'j', 'j', 'o', 'e', 'n', 'j', 6, 'j', 'j', 'o', 'e', 'n', 'h',\n5, 'j', 'j', 'o', 'e', 'd', 5, 'j', 'j', 'o', 'e', 'l', 6, 'j', 'j', 'o', 'e', 'l', 'g', 6, 'j', 'j', 'o', 'e', 'l', 'm', 6, 'j', 'j', 'o', 'e', 'l', 'b', 6, 'j', 'j', 'o', 'e', 'l', 's',\n6, 'j', 'j', 'o', 'e', 'l', 't', 6, 'j', 'j', 'o', 'e', 'l', 'p', 6, 'j', 'j', 'o', 'e', 'l', 'h', 5, 'j', 'j', 'o', 'e', 'm', 5, 'j', 'j', 'o', 'e', 'b', 6, 'j', 'j', 'o', 'e', 'b', 's',\n5, 'j', 'j', 'o', 'e', 's', 6, 'j', 'j', 'o', 'e', 's', 's', 6, 'j', 'j', 'o', 'e', 'n', 'g', 5, 'j', 'j', 'o', 'e', 'j', 5, 'j', 'j', 'o', 'e', 'c', 5, 'j', 'j', 'o', 'e', 'k',\n5, 'j', 'j', 'o', 'e', 't', 5, 'j', 'j', 'o', 'e', 'p', 5, 'j', 'j', 'o', 'e', 'h', 4, 'j', 'j', 'y', 'o', 5, 'j', 'j', 'y', 'o', 'g', 6, 'j', 'j', 'y', 'o', 'g', 'g',\n6, 'j', 'j', 'y', 'o', 'g', 's', 5, 'j', 'j', 'y', 'o', 'n', 6, 'j', 'j', 'y', 'o', 'n', 'j', 6, 'j', 'j', 'y', 'o', 'n', 'h', 5, 'j', 'j', 'y', 'o', 'd', 5, 'j', 'j', 'y', 'o', 'l',\n6, 'j', 'j', 'y', 'o', 'l', 'g', 6, 'j', 'j', 'y', 'o', 'l', 'm', 6, 'j', 'j', 'y', 'o', 'l', 'b', 6, 'j', 'j', 'y', 'o', 'l', 's', 6, 'j', 'j', 'y', 'o', 'l', 't', 6, 'j', 'j', 'y', 'o', 'l', 'p',\n6, 'j', 'j', 'y', 'o', 'l', 'h', 5, 'j', 'j', 'y', 'o', 'm', 5, 'j', 'j', 'y', 'o', 'b', 6, 'j', 'j', 'y', 'o', 'b', 's', 5, 'j', 'j', 'y', 'o', 's', 6, 'j', 'j', 'y', 'o', 's', 's',\n6, 'j', 'j', 'y', 'o', 'n', 'g', 5, 'j', 'j', 'y', 'o', 'j', 5, 'j', 'j', 'y', 'o', 'c', 5, 'j', 'j', 'y', 'o', 'k', 5, 'j', 'j', 'y', 'o', 't', 5, 'j', 'j', 'y', 'o', 'p',\n5, 'j', 'j', 'y', 'o', 'h', 3, 'j', 'j', 'u', 4, 'j', 'j', 'u', 'g', 5, 'j', 'j', 'u', 'g', 'g', 5, 'j', 'j', 'u', 'g', 's', 4, 'j', 'j', 'u', 'n',\n5, 'j', 'j', 'u', 'n', 'j', 5, 'j', 'j', 'u', 'n', 'h', 4, 'j', 'j', 'u', 'd', 4, 'j', 'j', 'u', 'l', 5, 'j', 'j', 'u', 'l', 'g', 5, 'j', 'j', 'u', 'l', 'm',\n5, 'j', 'j', 'u', 'l', 'b', 5, 'j', 'j', 'u', 'l', 's', 5, 'j', 'j', 'u', 'l', 't', 5, 'j', 'j', 'u', 'l', 'p', 5, 'j', 'j', 'u', 'l', 'h', 4, 'j', 'j', 'u', 'm',\n4, 'j', 'j', 'u', 'b', 5, 'j', 'j', 'u', 'b', 's', 4, 'j', 'j', 'u', 's', 5, 'j', 'j', 'u', 's', 's', 5, 'j', 'j', 'u', 'n', 'g', 4, 'j', 'j', 'u', 'j',\n4, 'j', 'j', 'u', 'c', 4, 'j', 'j', 'u', 'k', 4, 'j', 'j', 'u', 't', 4, 'j', 'j', 'u', 'p', 4, 'j', 'j', 'u', 'h', 5, 'j', 'j', 'w', 'e', 'o',\n6, 'j', 'j', 'w', 'e', 'o', 'g', 7, 'j', 'j', 'w', 'e', 'o', 'g', 'g', 7, 'j', 'j', 'w', 'e', 'o', 'g', 's', 6, 'j', 'j', 'w', 'e', 'o', 'n', 7, 'j', 'j', 'w', 'e', 'o', 'n', 'j', 7, 'j', 'j', 'w', 'e', 'o', 'n', 'h',\n6, 'j', 'j', 'w', 'e', 'o', 'd', 6, 'j', 'j', 'w', 'e', 'o', 'l', 7, 'j', 'j', 'w', 'e', 'o', 'l', 'g', 7, 'j', 'j', 'w', 'e', 'o', 'l', 'm', 7, 'j', 'j', 'w', 'e', 'o', 'l', 'b', 7, 'j', 'j', 'w', 'e', 'o', 'l', 's',\n7, 'j', 'j', 'w', 'e', 'o', 'l', 't', 7, 'j', 'j', 'w', 'e', 'o', 'l', 'p', 7, 'j', 'j', 'w', 'e', 'o', 'l', 'h', 6, 'j', 'j', 'w', 'e', 'o', 'm', 6, 'j', 'j', 'w', 'e', 'o', 'b', 7, 'j', 'j', 'w', 'e', 'o', 'b', 's',\n6, 'j', 'j', 'w', 'e', 'o', 's', 7, 'j', 'j', 'w', 'e', 'o', 's', 's', 7, 'j', 'j', 'w', 'e', 'o', 'n', 'g', 6, 'j', 'j', 'w', 'e', 'o', 'j', 6, 'j', 'j', 'w', 'e', 'o', 'c', 6, 'j', 'j', 'w', 'e', 'o', 'k',\n6, 'j', 'j', 'w', 'e', 'o', 't', 6, 'j', 'j', 'w', 'e', 'o', 'p', 6, 'j', 'j', 'w', 'e', 'o', 'h', 4, 'j', 'j', 'w', 'e', 5, 'j', 'j', 'w', 'e', 'g', 6, 'j', 'j', 'w', 'e', 'g', 'g',\n6, 'j', 'j', 'w', 'e', 'g', 's', 5, 'j', 'j', 'w', 'e', 'n', 6, 'j', 'j', 'w', 'e', 'n', 'j', 6, 'j', 'j', 'w', 'e', 'n', 'h', 5, 'j', 'j', 'w', 'e', 'd', 5, 'j', 'j', 'w', 'e', 'l',\n6, 'j', 'j', 'w', 'e', 'l', 'g', 6, 'j', 'j', 'w', 'e', 'l', 'm', 6, 'j', 'j', 'w', 'e', 'l', 'b', 6, 'j', 'j', 'w', 'e', 'l', 's', 6, 'j', 'j', 'w', 'e', 'l', 't', 6, 'j', 'j', 'w', 'e', 'l', 'p',\n6, 'j', 'j', 'w', 'e', 'l', 'h', 5, 'j', 'j', 'w', 'e', 'm', 5, 'j', 'j', 'w', 'e', 'b', 6, 'j', 'j', 'w', 'e', 'b', 's', 5, 'j', 'j', 'w', 'e', 's', 6, 'j', 'j', 'w', 'e', 's', 's',\n6, 'j', 'j', 'w', 'e', 'n', 'g', 5, 'j', 'j', 'w', 'e', 'j', 5, 'j', 'j', 'w', 'e', 'c', 5, 'j', 'j', 'w', 'e', 'k', 5, 'j', 'j', 'w', 'e', 't', 5, 'j', 'j', 'w', 'e', 'p',\n5, 'j', 'j', 'w', 'e', 'h', 4, 'j', 'j', 'w', 'i', 5, 'j', 'j', 'w', 'i', 'g', 6, 'j', 'j', 'w', 'i', 'g', 'g', 6, 'j', 'j', 'w', 'i', 'g', 's', 5, 'j', 'j', 'w', 'i', 'n',\n6, 'j', 'j', 'w', 'i', 'n', 'j', 6, 'j', 'j', 'w', 'i', 'n', 'h', 5, 'j', 'j', 'w', 'i', 'd', 5, 'j', 'j', 'w', 'i', 'l', 6, 'j', 'j', 'w', 'i', 'l', 'g', 6, 'j', 'j', 'w', 'i', 'l', 'm',\n6, 'j', 'j', 'w', 'i', 'l', 'b', 6, 'j', 'j', 'w', 'i', 'l', 's', 6, 'j', 'j', 'w', 'i', 'l', 't', 6, 'j', 'j', 'w', 'i', 'l', 'p', 6, 'j', 'j', 'w', 'i', 'l', 'h', 5, 'j', 'j', 'w', 'i', 'm',\n5, 'j', 'j', 'w', 'i', 'b', 6, 'j', 'j', 'w', 'i', 'b', 's', 5, 'j', 'j', 'w', 'i', 's', 6, 'j', 'j', 'w', 'i', 's', 's', 6, 'j', 'j', 'w', 'i', 'n', 'g', 5, 'j', 'j', 'w', 'i', 'j',\n5, 'j', 'j', 'w', 'i', 'c', 5, 'j', 'j', 'w', 'i', 'k', 5, 'j', 'j', 'w', 'i', 't', 5, 'j', 'j', 'w', 'i', 'p', 5, 'j', 'j', 'w', 'i', 'h', 4, 'j', 'j', 'y', 'u',\n5, 'j', 'j', 'y', 'u', 'g', 6, 'j', 'j', 'y', 'u', 'g', 'g', 6, 'j', 'j', 'y', 'u', 'g', 's', 5, 'j', 'j', 'y', 'u', 'n', 6, 'j', 'j', 'y', 'u', 'n', 'j', 6, 'j', 'j', 'y', 'u', 'n', 'h',\n5, 'j', 'j', 'y', 'u', 'd', 5, 'j', 'j', 'y', 'u', 'l', 6, 'j', 'j', 'y', 'u', 'l', 'g', 6, 'j', 'j', 'y', 'u', 'l', 'm', 6, 'j', 'j', 'y', 'u', 'l', 'b', 6, 'j', 'j', 'y', 'u', 'l', 's',\n6, 'j', 'j', 'y', 'u', 'l', 't', 6, 'j', 'j', 'y', 'u', 'l', 'p', 6, 'j', 'j', 'y', 'u', 'l', 'h', 5, 'j', 'j', 'y', 'u', 'm', 5, 'j', 'j', 'y', 'u', 'b', 6, 'j', 'j', 'y', 'u', 'b', 's',\n5, 'j', 'j', 'y', 'u', 's', 6, 'j', 'j', 'y', 'u', 's', 's', 6, 'j', 'j', 'y', 'u', 'n', 'g', 5, 'j', 'j', 'y', 'u', 'j', 5, 'j', 'j', 'y', 'u', 'c', 5, 'j', 'j', 'y', 'u', 'k',\n5, 'j', 'j', 'y', 'u', 't', 5, 'j', 'j', 'y', 'u', 'p', 5, 'j', 'j', 'y', 'u', 'h', 4, 'j', 'j', 'e', 'u', 5, 'j', 'j', 'e', 'u', 'g', 6, 'j', 'j', 'e', 'u', 'g', 'g',\n6, 'j', 'j', 'e', 'u', 'g', 's', 5, 'j', 'j', 'e', 'u', 'n', 6, 'j', 'j', 'e', 'u', 'n', 'j', 6, 'j', 'j', 'e', 'u', 'n', 'h', 5, 'j', 'j', 'e', 'u', 'd', 5, 'j', 'j', 'e', 'u', 'l',\n6, 'j', 'j', 'e', 'u', 'l', 'g', 6, 'j', 'j', 'e', 'u', 'l', 'm', 6, 'j', 'j', 'e', 'u', 'l', 'b', 6, 'j', 'j', 'e', 'u', 'l', 's', 6, 'j', 'j', 'e', 'u', 'l', 't', 6, 'j', 'j', 'e', 'u', 'l', 'p',\n6, 'j', 'j', 'e', 'u', 'l', 'h', 5, 'j', 'j', 'e', 'u', 'm', 5, 'j', 'j', 'e', 'u', 'b', 6, 'j', 'j', 'e', 'u', 'b', 's', 5, 'j', 'j', 'e', 'u', 's', 6, 'j', 'j', 'e', 'u', 's', 's',\n6, 'j', 'j', 'e', 'u', 'n', 'g', 5, 'j', 'j', 'e', 'u', 'j', 5, 'j', 'j', 'e', 'u', 'c', 5, 'j', 'j', 'e', 'u', 'k', 5, 'j', 'j', 'e', 'u', 't', 5, 'j', 'j', 'e', 'u', 'p',\n5, 'j', 'j', 'e', 'u', 'h', 4, 'j', 'j', 'y', 'i', 5, 'j', 'j', 'y', 'i', 'g', 6, 'j', 'j', 'y', 'i', 'g', 'g', 6, 'j', 'j', 'y', 'i', 'g', 's', 5, 'j', 'j', 'y', 'i', 'n',\n6, 'j', 'j', 'y', 'i', 'n', 'j', 6, 'j', 'j', 'y', 'i', 'n', 'h', 5, 'j', 'j', 'y', 'i', 'd', 5, 'j', 'j', 'y', 'i', 'l', 6, 'j', 'j', 'y', 'i', 'l', 'g', 6, 'j', 'j', 'y', 'i', 'l', 'm',\n6, 'j', 'j', 'y', 'i', 'l', 'b', 6, 'j', 'j', 'y', 'i', 'l', 's', 6, 'j', 'j', 'y', 'i', 'l', 't', 6, 'j', 'j', 'y', 'i', 'l', 'p', 6, 'j', 'j', 'y', 'i', 'l', 'h', 5, 'j', 'j', 'y', 'i', 'm',\n5, 'j', 'j', 'y', 'i', 'b', 6, 'j', 'j', 'y', 'i', 'b', 's', 5, 'j', 'j', 'y', 'i', 's', 6, 'j', 'j', 'y', 'i', 's', 's', 6, 'j', 'j', 'y', 'i', 'n', 'g', 5, 'j', 'j', 'y', 'i', 'j',\n5, 'j', 'j', 'y', 'i', 'c', 5, 'j', 'j', 'y', 'i', 'k', 5, 'j', 'j', 'y', 'i', 't', 5, 'j', 'j', 'y', 'i', 'p', 5, 'j', 'j', 'y', 'i', 'h', 3, 'j', 'j', 'i',\n4, 'j', 'j', 'i', 'g', 5, 'j', 'j', 'i', 'g', 'g', 5, 'j', 'j', 'i', 'g', 's', 4, 'j', 'j', 'i', 'n', 5, 'j', 'j', 'i', 'n', 'j', 5, 'j', 'j', 'i', 'n', 'h',\n4, 'j', 'j', 'i', 'd', 4, 'j', 'j', 'i', 'l', 5, 'j', 'j', 'i', 'l', 'g', 5, 'j', 'j', 'i', 'l', 'm', 5, 'j', 'j', 'i', 'l', 'b', 5, 'j', 'j', 'i', 'l', 's',\n5, 'j', 'j', 'i', 'l', 't', 5, 'j', 'j', 'i', 'l', 'p', 5, 'j', 'j', 'i', 'l', 'h', 4, 'j', 'j', 'i', 'm', 4, 'j', 'j', 'i', 'b', 5, 'j', 'j', 'i', 'b', 's',\n4, 'j', 'j', 'i', 's', 5, 'j', 'j', 'i', 's', 's', 5, 'j', 'j', 'i', 'n', 'g', 4, 'j', 'j', 'i', 'j', 4, 'j', 'j', 'i', 'c', 4, 'j', 'j', 'i', 'k',\n4, 'j', 'j', 'i', 't', 4, 'j', 'j', 'i', 'p', 4, 'j', 'j', 'i', 'h', 2, 'c', 'a', 3, 'c', 'a', 'g', 4, 'c', 'a', 'g', 'g',\n4, 'c', 'a', 'g', 's', 3, 'c', 'a', 'n', 4, 'c', 'a', 'n', 'j', 4, 'c', 'a', 'n', 'h', 3, 'c', 'a', 'd', 3, 'c', 'a', 'l',\n4, 'c', 'a', 'l', 'g', 4, 'c', 'a', 'l', 'm', 4, 'c', 'a', 'l', 'b', 4, 'c', 'a', 'l', 's', 4, 'c', 'a', 'l', 't', 4, 'c', 'a', 'l', 'p',\n4, 'c', 'a', 'l', 'h', 3, 'c', 'a', 'm', 3, 'c', 'a', 'b', 4, 'c', 'a', 'b', 's', 3, 'c', 'a', 's', 4, 'c', 'a', 's', 's',\n4, 'c', 'a', 'n', 'g', 3, 'c', 'a', 'j', 3, 'c', 'a', 'c', 3, 'c', 'a', 'k', 3, 'c', 'a', 't', 3, 'c', 'a', 'p',\n3, 'c', 'a', 'h', 3, 'c', 'a', 'e', 4, 'c', 'a', 'e', 'g', 5, 'c', 'a', 'e', 'g', 'g', 5, 'c', 'a', 'e', 'g', 's', 4, 'c', 'a', 'e', 'n',\n5, 'c', 'a', 'e', 'n', 'j', 5, 'c', 'a', 'e', 'n', 'h', 4, 'c', 'a', 'e', 'd', 4, 'c', 'a', 'e', 'l', 5, 'c', 'a', 'e', 'l', 'g', 5, 'c', 'a', 'e', 'l', 'm',\n5, 'c', 'a', 'e', 'l', 'b', 5, 'c', 'a', 'e', 'l', 's', 5, 'c', 'a', 'e', 'l', 't', 5, 'c', 'a', 'e', 'l', 'p', 5, 'c', 'a', 'e', 'l', 'h', 4, 'c', 'a', 'e', 'm',\n4, 'c', 'a', 'e', 'b', 5, 'c', 'a', 'e', 'b', 's', 4, 'c', 'a', 'e', 's', 5, 'c', 'a', 'e', 's', 's', 5, 'c', 'a', 'e', 'n', 'g', 4, 'c', 'a', 'e', 'j',\n4, 'c', 'a', 'e', 'c', 4, 'c', 'a', 'e', 'k', 4, 'c', 'a', 'e', 't', 4, 'c', 'a', 'e', 'p', 4, 'c', 'a', 'e', 'h', 3, 'c', 'y', 'a',\n4, 'c', 'y', 'a', 'g', 5, 'c', 'y', 'a', 'g', 'g', 5, 'c', 'y', 'a', 'g', 's', 4, 'c', 'y', 'a', 'n', 5, 'c', 'y', 'a', 'n', 'j', 5, 'c', 'y', 'a', 'n', 'h',\n4, 'c', 'y', 'a', 'd', 4, 'c', 'y', 'a', 'l', 5, 'c', 'y', 'a', 'l', 'g', 5, 'c', 'y', 'a', 'l', 'm', 5, 'c', 'y', 'a', 'l', 'b', 5, 'c', 'y', 'a', 'l', 's',\n5, 'c', 'y', 'a', 'l', 't', 5, 'c', 'y', 'a', 'l', 'p', 5, 'c', 'y', 'a', 'l', 'h', 4, 'c', 'y', 'a', 'm', 4, 'c', 'y', 'a', 'b', 5, 'c', 'y', 'a', 'b', 's',\n4, 'c', 'y', 'a', 's', 5, 'c', 'y', 'a', 's', 's', 5, 'c', 'y', 'a', 'n', 'g', 4, 'c', 'y', 'a', 'j', 4, 'c', 'y', 'a', 'c', 4, 'c', 'y', 'a', 'k',\n4, 'c', 'y', 'a', 't', 4, 'c', 'y', 'a', 'p', 4, 'c', 'y', 'a', 'h', 4, 'c', 'y', 'a', 'e', 5, 'c', 'y', 'a', 'e', 'g', 6, 'c', 'y', 'a', 'e', 'g', 'g',\n6, 'c', 'y', 'a', 'e', 'g', 's', 5, 'c', 'y', 'a', 'e', 'n', 6, 'c', 'y', 'a', 'e', 'n', 'j', 6, 'c', 'y', 'a', 'e', 'n', 'h', 5, 'c', 'y', 'a', 'e', 'd', 5, 'c', 'y', 'a', 'e', 'l',\n6, 'c', 'y', 'a', 'e', 'l', 'g', 6, 'c', 'y', 'a', 'e', 'l', 'm', 6, 'c', 'y', 'a', 'e', 'l', 'b', 6, 'c', 'y', 'a', 'e', 'l', 's', 6, 'c', 'y', 'a', 'e', 'l', 't', 6, 'c', 'y', 'a', 'e', 'l', 'p',\n6, 'c', 'y', 'a', 'e', 'l', 'h', 5, 'c', 'y', 'a', 'e', 'm', 5, 'c', 'y', 'a', 'e', 'b', 6, 'c', 'y', 'a', 'e', 'b', 's', 5, 'c', 'y', 'a', 'e', 's', 6, 'c', 'y', 'a', 'e', 's', 's',\n6, 'c', 'y', 'a', 'e', 'n', 'g', 5, 'c', 'y', 'a', 'e', 'j', 5, 'c', 'y', 'a', 'e', 'c', 5, 'c', 'y', 'a', 'e', 'k', 5, 'c', 'y', 'a', 'e', 't', 5, 'c', 'y', 'a', 'e', 'p',\n5, 'c', 'y', 'a', 'e', 'h', 3, 'c', 'e', 'o', 4, 'c', 'e', 'o', 'g', 5, 'c', 'e', 'o', 'g', 'g', 5, 'c', 'e', 'o', 'g', 's', 4, 'c', 'e', 'o', 'n',\n5, 'c', 'e', 'o', 'n', 'j', 5, 'c', 'e', 'o', 'n', 'h', 4, 'c', 'e', 'o', 'd', 4, 'c', 'e', 'o', 'l', 5, 'c', 'e', 'o', 'l', 'g', 5, 'c', 'e', 'o', 'l', 'm',\n5, 'c', 'e', 'o', 'l', 'b', 5, 'c', 'e', 'o', 'l', 's', 5, 'c', 'e', 'o', 'l', 't', 5, 'c', 'e', 'o', 'l', 'p', 5, 'c', 'e', 'o', 'l', 'h', 4, 'c', 'e', 'o', 'm',\n4, 'c', 'e', 'o', 'b', 5, 'c', 'e', 'o', 'b', 's', 4, 'c', 'e', 'o', 's', 5, 'c', 'e', 'o', 's', 's', 5, 'c', 'e', 'o', 'n', 'g', 4, 'c', 'e', 'o', 'j',\n4, 'c', 'e', 'o', 'c', 4, 'c', 'e', 'o', 'k', 4, 'c', 'e', 'o', 't', 4, 'c', 'e', 'o', 'p', 4, 'c', 'e', 'o', 'h', 2, 'c', 'e',\n3, 'c', 'e', 'g', 4, 'c', 'e', 'g', 'g', 4, 'c', 'e', 'g', 's', 3, 'c', 'e', 'n', 4, 'c', 'e', 'n', 'j', 4, 'c', 'e', 'n', 'h',\n3, 'c', 'e', 'd', 3, 'c', 'e', 'l', 4, 'c', 'e', 'l', 'g', 4, 'c', 'e', 'l', 'm', 4, 'c', 'e', 'l', 'b', 4, 'c', 'e', 'l', 's',\n4, 'c', 'e', 'l', 't', 4, 'c', 'e', 'l', 'p', 4, 'c', 'e', 'l', 'h', 3, 'c', 'e', 'm', 3, 'c', 'e', 'b', 4, 'c', 'e', 'b', 's',\n3, 'c', 'e', 's', 4, 'c', 'e', 's', 's', 4, 'c', 'e', 'n', 'g', 3, 'c', 'e', 'j', 3, 'c', 'e', 'c', 3, 'c', 'e', 'k',\n3, 'c', 'e', 't', 3, 'c', 'e', 'p', 3, 'c', 'e', 'h', 4, 'c', 'y', 'e', 'o', 5, 'c', 'y', 'e', 'o', 'g', 6, 'c', 'y', 'e', 'o', 'g', 'g',\n6, 'c', 'y', 'e', 'o', 'g', 's', 5, 'c', 'y', 'e', 'o', 'n', 6, 'c', 'y', 'e', 'o', 'n', 'j', 6, 'c', 'y', 'e', 'o', 'n', 'h', 5, 'c', 'y', 'e', 'o', 'd', 5, 'c', 'y', 'e', 'o', 'l',\n6, 'c', 'y', 'e', 'o', 'l', 'g', 6, 'c', 'y', 'e', 'o', 'l', 'm', 6, 'c', 'y', 'e', 'o', 'l', 'b', 6, 'c', 'y', 'e', 'o', 'l', 's', 6, 'c', 'y', 'e', 'o', 'l', 't', 6, 'c', 'y', 'e', 'o', 'l', 'p',\n6, 'c', 'y', 'e', 'o', 'l', 'h', 5, 'c', 'y', 'e', 'o', 'm', 5, 'c', 'y', 'e', 'o', 'b', 6, 'c', 'y', 'e', 'o', 'b', 's', 5, 'c', 'y', 'e', 'o', 's', 6, 'c', 'y', 'e', 'o', 's', 's',\n6, 'c', 'y', 'e', 'o', 'n', 'g', 5, 'c', 'y', 'e', 'o', 'j', 5, 'c', 'y', 'e', 'o', 'c', 5, 'c', 'y', 'e', 'o', 'k', 5, 'c', 'y', 'e', 'o', 't', 5, 'c', 'y', 'e', 'o', 'p',\n5, 'c', 'y', 'e', 'o', 'h', 3, 'c', 'y', 'e', 4, 'c', 'y', 'e', 'g', 5, 'c', 'y', 'e', 'g', 'g', 5, 'c', 'y', 'e', 'g', 's', 4, 'c', 'y', 'e', 'n',\n5, 'c', 'y', 'e', 'n', 'j', 5, 'c', 'y', 'e', 'n', 'h', 4, 'c', 'y', 'e', 'd', 4, 'c', 'y', 'e', 'l', 5, 'c', 'y', 'e', 'l', 'g', 5, 'c', 'y', 'e', 'l', 'm',\n5, 'c', 'y', 'e', 'l', 'b', 5, 'c', 'y', 'e', 'l', 's', 5, 'c', 'y', 'e', 'l', 't', 5, 'c', 'y', 'e', 'l', 'p', 5, 'c', 'y', 'e', 'l', 'h', 4, 'c', 'y', 'e', 'm',\n4, 'c', 'y', 'e', 'b', 5, 'c', 'y', 'e', 'b', 's', 4, 'c', 'y', 'e', 's', 5, 'c', 'y', 'e', 's', 's', 5, 'c', 'y', 'e', 'n', 'g', 4, 'c', 'y', 'e', 'j',\n4, 'c', 'y', 'e', 'c', 4, 'c', 'y', 'e', 'k', 4, 'c', 'y', 'e', 't', 4, 'c', 'y', 'e', 'p', 4, 'c', 'y', 'e', 'h', 2, 'c', 'o',\n3, 'c', 'o', 'g', 4, 'c', 'o', 'g', 'g', 4, 'c', 'o', 'g', 's', 3, 'c', 'o', 'n', 4, 'c', 'o', 'n', 'j', 4, 'c', 'o', 'n', 'h',\n3, 'c', 'o', 'd', 3, 'c', 'o', 'l', 4, 'c', 'o', 'l', 'g', 4, 'c', 'o', 'l', 'm', 4, 'c', 'o', 'l', 'b', 4, 'c', 'o', 'l', 's',\n4, 'c', 'o', 'l', 't', 4, 'c', 'o', 'l', 'p', 4, 'c', 'o', 'l', 'h', 3, 'c', 'o', 'm', 3, 'c', 'o', 'b', 4, 'c', 'o', 'b', 's',\n3, 'c', 'o', 's', 4, 'c', 'o', 's', 's', 4, 'c', 'o', 'n', 'g', 3, 'c', 'o', 'j', 3, 'c', 'o', 'c', 3, 'c', 'o', 'k',\n3, 'c', 'o', 't', 3, 'c', 'o', 'p', 3, 'c', 'o', 'h', 3, 'c', 'w', 'a', 4, 'c', 'w', 'a', 'g', 5, 'c', 'w', 'a', 'g', 'g',\n5, 'c', 'w', 'a', 'g', 's', 4, 'c', 'w', 'a', 'n', 5, 'c', 'w', 'a', 'n', 'j', 5, 'c', 'w', 'a', 'n', 'h', 4, 'c', 'w', 'a', 'd', 4, 'c', 'w', 'a', 'l',\n5, 'c', 'w', 'a', 'l', 'g', 5, 'c', 'w', 'a', 'l', 'm', 5, 'c', 'w', 'a', 'l', 'b', 5, 'c', 'w', 'a', 'l', 's', 5, 'c', 'w', 'a', 'l', 't', 5, 'c', 'w', 'a', 'l', 'p',\n5, 'c', 'w', 'a', 'l', 'h', 4, 'c', 'w', 'a', 'm', 4, 'c', 'w', 'a', 'b', 5, 'c', 'w', 'a', 'b', 's', 4, 'c', 'w', 'a', 's', 5, 'c', 'w', 'a', 's', 's',\n5, 'c', 'w', 'a', 'n', 'g', 4, 'c', 'w', 'a', 'j', 4, 'c', 'w', 'a', 'c', 4, 'c', 'w', 'a', 'k', 4, 'c', 'w', 'a', 't', 4, 'c', 'w', 'a', 'p',\n4, 'c', 'w', 'a', 'h', 4, 'c', 'w', 'a', 'e', 5, 'c', 'w', 'a', 'e', 'g', 6, 'c', 'w', 'a', 'e', 'g', 'g', 6, 'c', 'w', 'a', 'e', 'g', 's', 5, 'c', 'w', 'a', 'e', 'n',\n6, 'c', 'w', 'a', 'e', 'n', 'j', 6, 'c', 'w', 'a', 'e', 'n', 'h', 5, 'c', 'w', 'a', 'e', 'd', 5, 'c', 'w', 'a', 'e', 'l', 6, 'c', 'w', 'a', 'e', 'l', 'g', 6, 'c', 'w', 'a', 'e', 'l', 'm',\n6, 'c', 'w', 'a', 'e', 'l', 'b', 6, 'c', 'w', 'a', 'e', 'l', 's', 6, 'c', 'w', 'a', 'e', 'l', 't', 6, 'c', 'w', 'a', 'e', 'l', 'p', 6, 'c', 'w', 'a', 'e', 'l', 'h', 5, 'c', 'w', 'a', 'e', 'm',\n5, 'c', 'w', 'a', 'e', 'b', 6, 'c', 'w', 'a', 'e', 'b', 's', 5, 'c', 'w', 'a', 'e', 's', 6, 'c', 'w', 'a', 'e', 's', 's', 6, 'c', 'w', 'a', 'e', 'n', 'g', 5, 'c', 'w', 'a', 'e', 'j',\n5, 'c', 'w', 'a', 'e', 'c', 5, 'c', 'w', 'a', 'e', 'k', 5, 'c', 'w', 'a', 'e', 't', 5, 'c', 'w', 'a', 'e', 'p', 5, 'c', 'w', 'a', 'e', 'h', 3, 'c', 'o', 'e',\n4, 'c', 'o', 'e', 'g', 5, 'c', 'o', 'e', 'g', 'g', 5, 'c', 'o', 'e', 'g', 's', 4, 'c', 'o', 'e', 'n', 5, 'c', 'o', 'e', 'n', 'j', 5, 'c', 'o', 'e', 'n', 'h',\n4, 'c', 'o', 'e', 'd', 4, 'c', 'o', 'e', 'l', 5, 'c', 'o', 'e', 'l', 'g', 5, 'c', 'o', 'e', 'l', 'm', 5, 'c', 'o', 'e', 'l', 'b', 5, 'c', 'o', 'e', 'l', 's',\n5, 'c', 'o', 'e', 'l', 't', 5, 'c', 'o', 'e', 'l', 'p', 5, 'c', 'o', 'e', 'l', 'h', 4, 'c', 'o', 'e', 'm', 4, 'c', 'o', 'e', 'b', 5, 'c', 'o', 'e', 'b', 's',\n4, 'c', 'o', 'e', 's', 5, 'c', 'o', 'e', 's', 's', 5, 'c', 'o', 'e', 'n', 'g', 4, 'c', 'o', 'e', 'j', 4, 'c', 'o', 'e', 'c', 4, 'c', 'o', 'e', 'k',\n4, 'c', 'o', 'e', 't', 4, 'c', 'o', 'e', 'p', 4, 'c', 'o', 'e', 'h', 3, 'c', 'y', 'o', 4, 'c', 'y', 'o', 'g', 5, 'c', 'y', 'o', 'g', 'g',\n5, 'c', 'y', 'o', 'g', 's', 4, 'c', 'y', 'o', 'n', 5, 'c', 'y', 'o', 'n', 'j', 5, 'c', 'y', 'o', 'n', 'h', 4, 'c', 'y', 'o', 'd', 4, 'c', 'y', 'o', 'l',\n5, 'c', 'y', 'o', 'l', 'g', 5, 'c', 'y', 'o', 'l', 'm', 5, 'c', 'y', 'o', 'l', 'b', 5, 'c', 'y', 'o', 'l', 's', 5, 'c', 'y', 'o', 'l', 't', 5, 'c', 'y', 'o', 'l', 'p',\n5, 'c', 'y', 'o', 'l', 'h', 4, 'c', 'y', 'o', 'm', 4, 'c', 'y', 'o', 'b', 5, 'c', 'y', 'o', 'b', 's', 4, 'c', 'y', 'o', 's', 5, 'c', 'y', 'o', 's', 's',\n5, 'c', 'y', 'o', 'n', 'g', 4, 'c', 'y', 'o', 'j', 4, 'c', 'y', 'o', 'c', 4, 'c', 'y', 'o', 'k', 4, 'c', 'y', 'o', 't', 4, 'c', 'y', 'o', 'p',\n4, 'c', 'y', 'o', 'h', 2, 'c', 'u', 3, 'c', 'u', 'g', 4, 'c', 'u', 'g', 'g', 4, 'c', 'u', 'g', 's', 3, 'c', 'u', 'n',\n4, 'c', 'u', 'n', 'j', 4, 'c', 'u', 'n', 'h', 3, 'c', 'u', 'd', 3, 'c', 'u', 'l', 4, 'c', 'u', 'l', 'g', 4, 'c', 'u', 'l', 'm',\n4, 'c', 'u', 'l', 'b', 4, 'c', 'u', 'l', 's', 4, 'c', 'u', 'l', 't', 4, 'c', 'u', 'l', 'p', 4, 'c', 'u', 'l', 'h', 3, 'c', 'u', 'm',\n3, 'c', 'u', 'b', 4, 'c', 'u', 'b', 's', 3, 'c', 'u', 's', 4, 'c', 'u', 's', 's', 4, 'c', 'u', 'n', 'g', 3, 'c', 'u', 'j',\n3, 'c', 'u', 'c', 3, 'c', 'u', 'k', 3, 'c', 'u', 't', 3, 'c', 'u', 'p', 3, 'c', 'u', 'h', 4, 'c', 'w', 'e', 'o',\n5, 'c', 'w', 'e', 'o', 'g', 6, 'c', 'w', 'e', 'o', 'g', 'g', 6, 'c', 'w', 'e', 'o', 'g', 's', 5, 'c', 'w', 'e', 'o', 'n', 6, 'c', 'w', 'e', 'o', 'n', 'j', 6, 'c', 'w', 'e', 'o', 'n', 'h',\n5, 'c', 'w', 'e', 'o', 'd', 5, 'c', 'w', 'e', 'o', 'l', 6, 'c', 'w', 'e', 'o', 'l', 'g', 6, 'c', 'w', 'e', 'o', 'l', 'm', 6, 'c', 'w', 'e', 'o', 'l', 'b', 6, 'c', 'w', 'e', 'o', 'l', 's',\n6, 'c', 'w', 'e', 'o', 'l', 't', 6, 'c', 'w', 'e', 'o', 'l', 'p', 6, 'c', 'w', 'e', 'o', 'l', 'h', 5, 'c', 'w', 'e', 'o', 'm', 5, 'c', 'w', 'e', 'o', 'b', 6, 'c', 'w', 'e', 'o', 'b', 's',\n5, 'c', 'w', 'e', 'o', 's', 6, 'c', 'w', 'e', 'o', 's', 's', 6, 'c', 'w', 'e', 'o', 'n', 'g', 5, 'c', 'w', 'e', 'o', 'j', 5, 'c', 'w', 'e', 'o', 'c', 5, 'c', 'w', 'e', 'o', 'k',\n5, 'c', 'w', 'e', 'o', 't', 5, 'c', 'w', 'e', 'o', 'p', 5, 'c', 'w', 'e', 'o', 'h', 3, 'c', 'w', 'e', 4, 'c', 'w', 'e', 'g', 5, 'c', 'w', 'e', 'g', 'g',\n5, 'c', 'w', 'e', 'g', 's', 4, 'c', 'w', 'e', 'n', 5, 'c', 'w', 'e', 'n', 'j', 5, 'c', 'w', 'e', 'n', 'h', 4, 'c', 'w', 'e', 'd', 4, 'c', 'w', 'e', 'l',\n5, 'c', 'w', 'e', 'l', 'g', 5, 'c', 'w', 'e', 'l', 'm', 5, 'c', 'w', 'e', 'l', 'b', 5, 'c', 'w', 'e', 'l', 's', 5, 'c', 'w', 'e', 'l', 't', 5, 'c', 'w', 'e', 'l', 'p',\n5, 'c', 'w', 'e', 'l', 'h', 4, 'c', 'w', 'e', 'm', 4, 'c', 'w', 'e', 'b', 5, 'c', 'w', 'e', 'b', 's', 4, 'c', 'w', 'e', 's', 5, 'c', 'w', 'e', 's', 's',\n5, 'c', 'w', 'e', 'n', 'g', 4, 'c', 'w', 'e', 'j', 4, 'c', 'w', 'e', 'c', 4, 'c', 'w', 'e', 'k', 4, 'c', 'w', 'e', 't', 4, 'c', 'w', 'e', 'p',\n4, 'c', 'w', 'e', 'h', 3, 'c', 'w', 'i', 4, 'c', 'w', 'i', 'g', 5, 'c', 'w', 'i', 'g', 'g', 5, 'c', 'w', 'i', 'g', 's', 4, 'c', 'w', 'i', 'n',\n5, 'c', 'w', 'i', 'n', 'j', 5, 'c', 'w', 'i', 'n', 'h', 4, 'c', 'w', 'i', 'd', 4, 'c', 'w', 'i', 'l', 5, 'c', 'w', 'i', 'l', 'g', 5, 'c', 'w', 'i', 'l', 'm',\n5, 'c', 'w', 'i', 'l', 'b', 5, 'c', 'w', 'i', 'l', 's', 5, 'c', 'w', 'i', 'l', 't', 5, 'c', 'w', 'i', 'l', 'p', 5, 'c', 'w', 'i', 'l', 'h', 4, 'c', 'w', 'i', 'm',\n4, 'c', 'w', 'i', 'b', 5, 'c', 'w', 'i', 'b', 's', 4, 'c', 'w', 'i', 's', 5, 'c', 'w', 'i', 's', 's', 5, 'c', 'w', 'i', 'n', 'g', 4, 'c', 'w', 'i', 'j',\n4, 'c', 'w', 'i', 'c', 4, 'c', 'w', 'i', 'k', 4, 'c', 'w', 'i', 't', 4, 'c', 'w', 'i', 'p', 4, 'c', 'w', 'i', 'h', 3, 'c', 'y', 'u',\n4, 'c', 'y', 'u', 'g', 5, 'c', 'y', 'u', 'g', 'g', 5, 'c', 'y', 'u', 'g', 's', 4, 'c', 'y', 'u', 'n', 5, 'c', 'y', 'u', 'n', 'j', 5, 'c', 'y', 'u', 'n', 'h',\n4, 'c', 'y', 'u', 'd', 4, 'c', 'y', 'u', 'l', 5, 'c', 'y', 'u', 'l', 'g', 5, 'c', 'y', 'u', 'l', 'm', 5, 'c', 'y', 'u', 'l', 'b', 5, 'c', 'y', 'u', 'l', 's',\n5, 'c', 'y', 'u', 'l', 't', 5, 'c', 'y', 'u', 'l', 'p', 5, 'c', 'y', 'u', 'l', 'h', 4, 'c', 'y', 'u', 'm', 4, 'c', 'y', 'u', 'b', 5, 'c', 'y', 'u', 'b', 's',\n4, 'c', 'y', 'u', 's', 5, 'c', 'y', 'u', 's', 's', 5, 'c', 'y', 'u', 'n', 'g', 4, 'c', 'y', 'u', 'j', 4, 'c', 'y', 'u', 'c', 4, 'c', 'y', 'u', 'k',\n4, 'c', 'y', 'u', 't', 4, 'c', 'y', 'u', 'p', 4, 'c', 'y', 'u', 'h', 3, 'c', 'e', 'u', 4, 'c', 'e', 'u', 'g', 5, 'c', 'e', 'u', 'g', 'g',\n5, 'c', 'e', 'u', 'g', 's', 4, 'c', 'e', 'u', 'n', 5, 'c', 'e', 'u', 'n', 'j', 5, 'c', 'e', 'u', 'n', 'h', 4, 'c', 'e', 'u', 'd', 4, 'c', 'e', 'u', 'l',\n5, 'c', 'e', 'u', 'l', 'g', 5, 'c', 'e', 'u', 'l', 'm', 5, 'c', 'e', 'u', 'l', 'b', 5, 'c', 'e', 'u', 'l', 's', 5, 'c', 'e', 'u', 'l', 't', 5, 'c', 'e', 'u', 'l', 'p',\n5, 'c', 'e', 'u', 'l', 'h', 4, 'c', 'e', 'u', 'm', 4, 'c', 'e', 'u', 'b', 5, 'c', 'e', 'u', 'b', 's', 4, 'c', 'e', 'u', 's', 5, 'c', 'e', 'u', 's', 's',\n5, 'c', 'e', 'u', 'n', 'g', 4, 'c', 'e', 'u', 'j', 4, 'c', 'e', 'u', 'c', 4, 'c', 'e', 'u', 'k', 4, 'c', 'e', 'u', 't', 4, 'c', 'e', 'u', 'p',\n4, 'c', 'e', 'u', 'h', 3, 'c', 'y', 'i', 4, 'c', 'y', 'i', 'g', 5, 'c', 'y', 'i', 'g', 'g', 5, 'c', 'y', 'i', 'g', 's', 4, 'c', 'y', 'i', 'n',\n5, 'c', 'y', 'i', 'n', 'j', 5, 'c', 'y', 'i', 'n', 'h', 4, 'c', 'y', 'i', 'd', 4, 'c', 'y', 'i', 'l', 5, 'c', 'y', 'i', 'l', 'g', 5, 'c', 'y', 'i', 'l', 'm',\n5, 'c', 'y', 'i', 'l', 'b', 5, 'c', 'y', 'i', 'l', 's', 5, 'c', 'y', 'i', 'l', 't', 5, 'c', 'y', 'i', 'l', 'p', 5, 'c', 'y', 'i', 'l', 'h', 4, 'c', 'y', 'i', 'm',\n4, 'c', 'y', 'i', 'b', 5, 'c', 'y', 'i', 'b', 's', 4, 'c', 'y', 'i', 's', 5, 'c', 'y', 'i', 's', 's', 5, 'c', 'y', 'i', 'n', 'g', 4, 'c', 'y', 'i', 'j',\n4, 'c', 'y', 'i', 'c', 4, 'c', 'y', 'i', 'k', 4, 'c', 'y', 'i', 't', 4, 'c', 'y', 'i', 'p', 4, 'c', 'y', 'i', 'h', 2, 'c', 'i',\n3, 'c', 'i', 'g', 4, 'c', 'i', 'g', 'g', 4, 'c', 'i', 'g', 's', 3, 'c', 'i', 'n', 4, 'c', 'i', 'n', 'j', 4, 'c', 'i', 'n', 'h',\n3, 'c', 'i', 'd', 3, 'c', 'i', 'l', 4, 'c', 'i', 'l', 'g', 4, 'c', 'i', 'l', 'm', 4, 'c', 'i', 'l', 'b', 4, 'c', 'i', 'l', 's',\n4, 'c', 'i', 'l', 't', 4, 'c', 'i', 'l', 'p', 4, 'c', 'i', 'l', 'h', 3, 'c', 'i', 'm', 3, 'c', 'i', 'b', 4, 'c', 'i', 'b', 's',\n3, 'c', 'i', 's', 4, 'c', 'i', 's', 's', 4, 'c', 'i', 'n', 'g', 3, 'c', 'i', 'j', 3, 'c', 'i', 'c', 3, 'c', 'i', 'k',\n3, 'c', 'i', 't', 3, 'c', 'i', 'p', 3, 'c', 'i', 'h', 2, 'k', 'a', 3, 'k', 'a', 'g', 4, 'k', 'a', 'g', 'g',\n4, 'k', 'a', 'g', 's', 3, 'k', 'a', 'n', 4, 'k', 'a', 'n', 'j', 4, 'k', 'a', 'n', 'h', 3, 'k', 'a', 'd', 3, 'k', 'a', 'l',\n4, 'k', 'a', 'l', 'g', 4, 'k', 'a', 'l', 'm', 4, 'k', 'a', 'l', 'b', 4, 'k', 'a', 'l', 's', 4, 'k', 'a', 'l', 't', 4, 'k', 'a', 'l', 'p',\n4, 'k', 'a', 'l', 'h', 3, 'k', 'a', 'm', 3, 'k', 'a', 'b', 4, 'k', 'a', 'b', 's', 3, 'k', 'a', 's', 4, 'k', 'a', 's', 's',\n4, 'k', 'a', 'n', 'g', 3, 'k', 'a', 'j', 3, 'k', 'a', 'c', 3, 'k', 'a', 'k', 3, 'k', 'a', 't', 3, 'k', 'a', 'p',\n3, 'k', 'a', 'h', 3, 'k', 'a', 'e', 4, 'k', 'a', 'e', 'g', 5, 'k', 'a', 'e', 'g', 'g', 5, 'k', 'a', 'e', 'g', 's', 4, 'k', 'a', 'e', 'n',\n5, 'k', 'a', 'e', 'n', 'j', 5, 'k', 'a', 'e', 'n', 'h', 4, 'k', 'a', 'e', 'd', 4, 'k', 'a', 'e', 'l', 5, 'k', 'a', 'e', 'l', 'g', 5, 'k', 'a', 'e', 'l', 'm',\n5, 'k', 'a', 'e', 'l', 'b', 5, 'k', 'a', 'e', 'l', 's', 5, 'k', 'a', 'e', 'l', 't', 5, 'k', 'a', 'e', 'l', 'p', 5, 'k', 'a', 'e', 'l', 'h', 4, 'k', 'a', 'e', 'm',\n4, 'k', 'a', 'e', 'b', 5, 'k', 'a', 'e', 'b', 's', 4, 'k', 'a', 'e', 's', 5, 'k', 'a', 'e', 's', 's', 5, 'k', 'a', 'e', 'n', 'g', 4, 'k', 'a', 'e', 'j',\n4, 'k', 'a', 'e', 'c', 4, 'k', 'a', 'e', 'k', 4, 'k', 'a', 'e', 't', 4, 'k', 'a', 'e', 'p', 4, 'k', 'a', 'e', 'h', 3, 'k', 'y', 'a',\n4, 'k', 'y', 'a', 'g', 5, 'k', 'y', 'a', 'g', 'g', 5, 'k', 'y', 'a', 'g', 's', 4, 'k', 'y', 'a', 'n', 5, 'k', 'y', 'a', 'n', 'j', 5, 'k', 'y', 'a', 'n', 'h',\n4, 'k', 'y', 'a', 'd', 4, 'k', 'y', 'a', 'l', 5, 'k', 'y', 'a', 'l', 'g', 5, 'k', 'y', 'a', 'l', 'm', 5, 'k', 'y', 'a', 'l', 'b', 5, 'k', 'y', 'a', 'l', 's',\n5, 'k', 'y', 'a', 'l', 't', 5, 'k', 'y', 'a', 'l', 'p', 5, 'k', 'y', 'a', 'l', 'h', 4, 'k', 'y', 'a', 'm', 4, 'k', 'y', 'a', 'b', 5, 'k', 'y', 'a', 'b', 's',\n4, 'k', 'y', 'a', 's', 5, 'k', 'y', 'a', 's', 's', 5, 'k', 'y', 'a', 'n', 'g', 4, 'k', 'y', 'a', 'j', 4, 'k', 'y', 'a', 'c', 4, 'k', 'y', 'a', 'k',\n4, 'k', 'y', 'a', 't', 4, 'k', 'y', 'a', 'p', 4, 'k', 'y', 'a', 'h', 4, 'k', 'y', 'a', 'e', 5, 'k', 'y', 'a', 'e', 'g', 6, 'k', 'y', 'a', 'e', 'g', 'g',\n6, 'k', 'y', 'a', 'e', 'g', 's', 5, 'k', 'y', 'a', 'e', 'n', 6, 'k', 'y', 'a', 'e', 'n', 'j', 6, 'k', 'y', 'a', 'e', 'n', 'h', 5, 'k', 'y', 'a', 'e', 'd', 5, 'k', 'y', 'a', 'e', 'l',\n6, 'k', 'y', 'a', 'e', 'l', 'g', 6, 'k', 'y', 'a', 'e', 'l', 'm', 6, 'k', 'y', 'a', 'e', 'l', 'b', 6, 'k', 'y', 'a', 'e', 'l', 's', 6, 'k', 'y', 'a', 'e', 'l', 't', 6, 'k', 'y', 'a', 'e', 'l', 'p',\n6, 'k', 'y', 'a', 'e', 'l', 'h', 5, 'k', 'y', 'a', 'e', 'm', 5, 'k', 'y', 'a', 'e', 'b', 6, 'k', 'y', 'a', 'e', 'b', 's', 5, 'k', 'y', 'a', 'e', 's', 6, 'k', 'y', 'a', 'e', 's', 's',\n6, 'k', 'y', 'a', 'e', 'n', 'g', 5, 'k', 'y', 'a', 'e', 'j', 5, 'k', 'y', 'a', 'e', 'c', 5, 'k', 'y', 'a', 'e', 'k', 5, 'k', 'y', 'a', 'e', 't', 5, 'k', 'y', 'a', 'e', 'p',\n5, 'k', 'y', 'a', 'e', 'h', 3, 'k', 'e', 'o', 4, 'k', 'e', 'o', 'g', 5, 'k', 'e', 'o', 'g', 'g', 5, 'k', 'e', 'o', 'g', 's', 4, 'k', 'e', 'o', 'n',\n5, 'k', 'e', 'o', 'n', 'j', 5, 'k', 'e', 'o', 'n', 'h', 4, 'k', 'e', 'o', 'd', 4, 'k', 'e', 'o', 'l', 5, 'k', 'e', 'o', 'l', 'g', 5, 'k', 'e', 'o', 'l', 'm',\n5, 'k', 'e', 'o', 'l', 'b', 5, 'k', 'e', 'o', 'l', 's', 5, 'k', 'e', 'o', 'l', 't', 5, 'k', 'e', 'o', 'l', 'p', 5, 'k', 'e', 'o', 'l', 'h', 4, 'k', 'e', 'o', 'm',\n4, 'k', 'e', 'o', 'b', 5, 'k', 'e', 'o', 'b', 's', 4, 'k', 'e', 'o', 's', 5, 'k', 'e', 'o', 's', 's', 5, 'k', 'e', 'o', 'n', 'g', 4, 'k', 'e', 'o', 'j',\n4, 'k', 'e', 'o', 'c', 4, 'k', 'e', 'o', 'k', 4, 'k', 'e', 'o', 't', 4, 'k', 'e', 'o', 'p', 4, 'k', 'e', 'o', 'h', 2, 'k', 'e',\n3, 'k', 'e', 'g', 4, 'k', 'e', 'g', 'g', 4, 'k', 'e', 'g', 's', 3, 'k', 'e', 'n', 4, 'k', 'e', 'n', 'j', 4, 'k', 'e', 'n', 'h',\n3, 'k', 'e', 'd', 3, 'k', 'e', 'l', 4, 'k', 'e', 'l', 'g', 4, 'k', 'e', 'l', 'm', 4, 'k', 'e', 'l', 'b', 4, 'k', 'e', 'l', 's',\n4, 'k', 'e', 'l', 't', 4, 'k', 'e', 'l', 'p', 4, 'k', 'e', 'l', 'h', 3, 'k', 'e', 'm', 3, 'k', 'e', 'b', 4, 'k', 'e', 'b', 's',\n3, 'k', 'e', 's', 4, 'k', 'e', 's', 's', 4, 'k', 'e', 'n', 'g', 3, 'k', 'e', 'j', 3, 'k', 'e', 'c', 3, 'k', 'e', 'k',\n3, 'k', 'e', 't', 3, 'k', 'e', 'p', 3, 'k', 'e', 'h', 4, 'k', 'y', 'e', 'o', 5, 'k', 'y', 'e', 'o', 'g', 6, 'k', 'y', 'e', 'o', 'g', 'g',\n6, 'k', 'y', 'e', 'o', 'g', 's', 5, 'k', 'y', 'e', 'o', 'n', 6, 'k', 'y', 'e', 'o', 'n', 'j', 6, 'k', 'y', 'e', 'o', 'n', 'h', 5, 'k', 'y', 'e', 'o', 'd', 5, 'k', 'y', 'e', 'o', 'l',\n6, 'k', 'y', 'e', 'o', 'l', 'g', 6, 'k', 'y', 'e', 'o', 'l', 'm', 6, 'k', 'y', 'e', 'o', 'l', 'b', 6, 'k', 'y', 'e', 'o', 'l', 's', 6, 'k', 'y', 'e', 'o', 'l', 't', 6, 'k', 'y', 'e', 'o', 'l', 'p',\n6, 'k', 'y', 'e', 'o', 'l', 'h', 5, 'k', 'y', 'e', 'o', 'm', 5, 'k', 'y', 'e', 'o', 'b', 6, 'k', 'y', 'e', 'o', 'b', 's', 5, 'k', 'y', 'e', 'o', 's', 6, 'k', 'y', 'e', 'o', 's', 's',\n6, 'k', 'y', 'e', 'o', 'n', 'g', 5, 'k', 'y', 'e', 'o', 'j', 5, 'k', 'y', 'e', 'o', 'c', 5, 'k', 'y', 'e', 'o', 'k', 5, 'k', 'y', 'e', 'o', 't', 5, 'k', 'y', 'e', 'o', 'p',\n5, 'k', 'y', 'e', 'o', 'h', 3, 'k', 'y', 'e', 4, 'k', 'y', 'e', 'g', 5, 'k', 'y', 'e', 'g', 'g', 5, 'k', 'y', 'e', 'g', 's', 4, 'k', 'y', 'e', 'n',\n5, 'k', 'y', 'e', 'n', 'j', 5, 'k', 'y', 'e', 'n', 'h', 4, 'k', 'y', 'e', 'd', 4, 'k', 'y', 'e', 'l', 5, 'k', 'y', 'e', 'l', 'g', 5, 'k', 'y', 'e', 'l', 'm',\n5, 'k', 'y', 'e', 'l', 'b', 5, 'k', 'y', 'e', 'l', 's', 5, 'k', 'y', 'e', 'l', 't', 5, 'k', 'y', 'e', 'l', 'p', 5, 'k', 'y', 'e', 'l', 'h', 4, 'k', 'y', 'e', 'm',\n4, 'k', 'y', 'e', 'b', 5, 'k', 'y', 'e', 'b', 's', 4, 'k', 'y', 'e', 's', 5, 'k', 'y', 'e', 's', 's', 5, 'k', 'y', 'e', 'n', 'g', 4, 'k', 'y', 'e', 'j',\n4, 'k', 'y', 'e', 'c', 4, 'k', 'y', 'e', 'k', 4, 'k', 'y', 'e', 't', 4, 'k', 'y', 'e', 'p', 4, 'k', 'y', 'e', 'h', 2, 'k', 'o',\n3, 'k', 'o', 'g', 4, 'k', 'o', 'g', 'g', 4, 'k', 'o', 'g', 's', 3, 'k', 'o', 'n', 4, 'k', 'o', 'n', 'j', 4, 'k', 'o', 'n', 'h',\n3, 'k', 'o', 'd', 3, 'k', 'o', 'l', 4, 'k', 'o', 'l', 'g', 4, 'k', 'o', 'l', 'm', 4, 'k', 'o', 'l', 'b', 4, 'k', 'o', 'l', 's',\n4, 'k', 'o', 'l', 't', 4, 'k', 'o', 'l', 'p', 4, 'k', 'o', 'l', 'h', 3, 'k', 'o', 'm', 3, 'k', 'o', 'b', 4, 'k', 'o', 'b', 's',\n3, 'k', 'o', 's', 4, 'k', 'o', 's', 's', 4, 'k', 'o', 'n', 'g', 3, 'k', 'o', 'j', 3, 'k', 'o', 'c', 3, 'k', 'o', 'k',\n3, 'k', 'o', 't', 3, 'k', 'o', 'p', 3, 'k', 'o', 'h', 3, 'k', 'w', 'a', 4, 'k', 'w', 'a', 'g', 5, 'k', 'w', 'a', 'g', 'g',\n5, 'k', 'w', 'a', 'g', 's', 4, 'k', 'w', 'a', 'n', 5, 'k', 'w', 'a', 'n', 'j', 5, 'k', 'w', 'a', 'n', 'h', 4, 'k', 'w', 'a', 'd', 4, 'k', 'w', 'a', 'l',\n5, 'k', 'w', 'a', 'l', 'g', 5, 'k', 'w', 'a', 'l', 'm', 5, 'k', 'w', 'a', 'l', 'b', 5, 'k', 'w', 'a', 'l', 's', 5, 'k', 'w', 'a', 'l', 't', 5, 'k', 'w', 'a', 'l', 'p',\n5, 'k', 'w', 'a', 'l', 'h', 4, 'k', 'w', 'a', 'm', 4, 'k', 'w', 'a', 'b', 5, 'k', 'w', 'a', 'b', 's', 4, 'k', 'w', 'a', 's', 5, 'k', 'w', 'a', 's', 's',\n5, 'k', 'w', 'a', 'n', 'g', 4, 'k', 'w', 'a', 'j', 4, 'k', 'w', 'a', 'c', 4, 'k', 'w', 'a', 'k', 4, 'k', 'w', 'a', 't', 4, 'k', 'w', 'a', 'p',\n4, 'k', 'w', 'a', 'h', 4, 'k', 'w', 'a', 'e', 5, 'k', 'w', 'a', 'e', 'g', 6, 'k', 'w', 'a', 'e', 'g', 'g', 6, 'k', 'w', 'a', 'e', 'g', 's', 5, 'k', 'w', 'a', 'e', 'n',\n6, 'k', 'w', 'a', 'e', 'n', 'j', 6, 'k', 'w', 'a', 'e', 'n', 'h', 5, 'k', 'w', 'a', 'e', 'd', 5, 'k', 'w', 'a', 'e', 'l', 6, 'k', 'w', 'a', 'e', 'l', 'g', 6, 'k', 'w', 'a', 'e', 'l', 'm',\n6, 'k', 'w', 'a', 'e', 'l', 'b', 6, 'k', 'w', 'a', 'e', 'l', 's', 6, 'k', 'w', 'a', 'e', 'l', 't', 6, 'k', 'w', 'a', 'e', 'l', 'p', 6, 'k', 'w', 'a', 'e', 'l', 'h', 5, 'k', 'w', 'a', 'e', 'm',\n5, 'k', 'w', 'a', 'e', 'b', 6, 'k', 'w', 'a', 'e', 'b', 's', 5, 'k', 'w', 'a', 'e', 's', 6, 'k', 'w', 'a', 'e', 's', 's', 6, 'k', 'w', 'a', 'e', 'n', 'g', 5, 'k', 'w', 'a', 'e', 'j',\n5, 'k', 'w', 'a', 'e', 'c', 5, 'k', 'w', 'a', 'e', 'k', 5, 'k', 'w', 'a', 'e', 't', 5, 'k', 'w', 'a', 'e', 'p', 5, 'k', 'w', 'a', 'e', 'h', 3, 'k', 'o', 'e',\n4, 'k', 'o', 'e', 'g', 5, 'k', 'o', 'e', 'g', 'g', 5, 'k', 'o', 'e', 'g', 's', 4, 'k', 'o', 'e', 'n', 5, 'k', 'o', 'e', 'n', 'j', 5, 'k', 'o', 'e', 'n', 'h',\n4, 'k', 'o', 'e', 'd', 4, 'k', 'o', 'e', 'l', 5, 'k', 'o', 'e', 'l', 'g', 5, 'k', 'o', 'e', 'l', 'm', 5, 'k', 'o', 'e', 'l', 'b', 5, 'k', 'o', 'e', 'l', 's',\n5, 'k', 'o', 'e', 'l', 't', 5, 'k', 'o', 'e', 'l', 'p', 5, 'k', 'o', 'e', 'l', 'h', 4, 'k', 'o', 'e', 'm', 4, 'k', 'o', 'e', 'b', 5, 'k', 'o', 'e', 'b', 's',\n4, 'k', 'o', 'e', 's', 5, 'k', 'o', 'e', 's', 's', 5, 'k', 'o', 'e', 'n', 'g', 4, 'k', 'o', 'e', 'j', 4, 'k', 'o', 'e', 'c', 4, 'k', 'o', 'e', 'k',\n4, 'k', 'o', 'e', 't', 4, 'k', 'o', 'e', 'p', 4, 'k', 'o', 'e', 'h', 3, 'k', 'y', 'o', 4, 'k', 'y', 'o', 'g', 5, 'k', 'y', 'o', 'g', 'g',\n5, 'k', 'y', 'o', 'g', 's', 4, 'k', 'y', 'o', 'n', 5, 'k', 'y', 'o', 'n', 'j', 5, 'k', 'y', 'o', 'n', 'h', 4, 'k', 'y', 'o', 'd', 4, 'k', 'y', 'o', 'l',\n5, 'k', 'y', 'o', 'l', 'g', 5, 'k', 'y', 'o', 'l', 'm', 5, 'k', 'y', 'o', 'l', 'b', 5, 'k', 'y', 'o', 'l', 's', 5, 'k', 'y', 'o', 'l', 't', 5, 'k', 'y', 'o', 'l', 'p',\n5, 'k', 'y', 'o', 'l', 'h', 4, 'k', 'y', 'o', 'm', 4, 'k', 'y', 'o', 'b', 5, 'k', 'y', 'o', 'b', 's', 4, 'k', 'y', 'o', 's', 5, 'k', 'y', 'o', 's', 's',\n5, 'k', 'y', 'o', 'n', 'g', 4, 'k', 'y', 'o', 'j', 4, 'k', 'y', 'o', 'c', 4, 'k', 'y', 'o', 'k', 4, 'k', 'y', 'o', 't', 4, 'k', 'y', 'o', 'p',\n4, 'k', 'y', 'o', 'h', 2, 'k', 'u', 3, 'k', 'u', 'g', 4, 'k', 'u', 'g', 'g', 4, 'k', 'u', 'g', 's', 3, 'k', 'u', 'n',\n4, 'k', 'u', 'n', 'j', 4, 'k', 'u', 'n', 'h', 3, 'k', 'u', 'd', 3, 'k', 'u', 'l', 4, 'k', 'u', 'l', 'g', 4, 'k', 'u', 'l', 'm',\n4, 'k', 'u', 'l', 'b', 4, 'k', 'u', 'l', 's', 4, 'k', 'u', 'l', 't', 4, 'k', 'u', 'l', 'p', 4, 'k', 'u', 'l', 'h', 3, 'k', 'u', 'm',\n3, 'k', 'u', 'b', 4, 'k', 'u', 'b', 's', 3, 'k', 'u', 's', 4, 'k', 'u', 's', 's', 4, 'k', 'u', 'n', 'g', 3, 'k', 'u', 'j',\n3, 'k', 'u', 'c', 3, 'k', 'u', 'k', 3, 'k', 'u', 't', 3, 'k', 'u', 'p', 3, 'k', 'u', 'h', 4, 'k', 'w', 'e', 'o',\n5, 'k', 'w', 'e', 'o', 'g', 6, 'k', 'w', 'e', 'o', 'g', 'g', 6, 'k', 'w', 'e', 'o', 'g', 's', 5, 'k', 'w', 'e', 'o', 'n', 6, 'k', 'w', 'e', 'o', 'n', 'j', 6, 'k', 'w', 'e', 'o', 'n', 'h',\n5, 'k', 'w', 'e', 'o', 'd', 5, 'k', 'w', 'e', 'o', 'l', 6, 'k', 'w', 'e', 'o', 'l', 'g', 6, 'k', 'w', 'e', 'o', 'l', 'm', 6, 'k', 'w', 'e', 'o', 'l', 'b', 6, 'k', 'w', 'e', 'o', 'l', 's',\n6, 'k', 'w', 'e', 'o', 'l', 't', 6, 'k', 'w', 'e', 'o', 'l', 'p', 6, 'k', 'w', 'e', 'o', 'l', 'h', 5, 'k', 'w', 'e', 'o', 'm', 5, 'k', 'w', 'e', 'o', 'b', 6, 'k', 'w', 'e', 'o', 'b', 's',\n5, 'k', 'w', 'e', 'o', 's', 6, 'k', 'w', 'e', 'o', 's', 's', 6, 'k', 'w', 'e', 'o', 'n', 'g', 5, 'k', 'w', 'e', 'o', 'j', 5, 'k', 'w', 'e', 'o', 'c', 5, 'k', 'w', 'e', 'o', 'k',\n5, 'k', 'w', 'e', 'o', 't', 5, 'k', 'w', 'e', 'o', 'p', 5, 'k', 'w', 'e', 'o', 'h', 3, 'k', 'w', 'e', 4, 'k', 'w', 'e', 'g', 5, 'k', 'w', 'e', 'g', 'g',\n5, 'k', 'w', 'e', 'g', 's', 4, 'k', 'w', 'e', 'n', 5, 'k', 'w', 'e', 'n', 'j', 5, 'k', 'w', 'e', 'n', 'h', 4, 'k', 'w', 'e', 'd', 4, 'k', 'w', 'e', 'l',\n5, 'k', 'w', 'e', 'l', 'g', 5, 'k', 'w', 'e', 'l', 'm', 5, 'k', 'w', 'e', 'l', 'b', 5, 'k', 'w', 'e', 'l', 's', 5, 'k', 'w', 'e', 'l', 't', 5, 'k', 'w', 'e', 'l', 'p',\n5, 'k', 'w', 'e', 'l', 'h', 4, 'k', 'w', 'e', 'm', 4, 'k', 'w', 'e', 'b', 5, 'k', 'w', 'e', 'b', 's', 4, 'k', 'w', 'e', 's', 5, 'k', 'w', 'e', 's', 's',\n5, 'k', 'w', 'e', 'n', 'g', 4, 'k', 'w', 'e', 'j', 4, 'k', 'w', 'e', 'c', 4, 'k', 'w', 'e', 'k', 4, 'k', 'w', 'e', 't', 4, 'k', 'w', 'e', 'p',\n4, 'k', 'w', 'e', 'h', 3, 'k', 'w', 'i', 4, 'k', 'w', 'i', 'g', 5, 'k', 'w', 'i', 'g', 'g', 5, 'k', 'w', 'i', 'g', 's', 4, 'k', 'w', 'i', 'n',\n5, 'k', 'w', 'i', 'n', 'j', 5, 'k', 'w', 'i', 'n', 'h', 4, 'k', 'w', 'i', 'd', 4, 'k', 'w', 'i', 'l', 5, 'k', 'w', 'i', 'l', 'g', 5, 'k', 'w', 'i', 'l', 'm',\n5, 'k', 'w', 'i', 'l', 'b', 5, 'k', 'w', 'i', 'l', 's', 5, 'k', 'w', 'i', 'l', 't', 5, 'k', 'w', 'i', 'l', 'p', 5, 'k', 'w', 'i', 'l', 'h', 4, 'k', 'w', 'i', 'm',\n4, 'k', 'w', 'i', 'b', 5, 'k', 'w', 'i', 'b', 's', 4, 'k', 'w', 'i', 's', 5, 'k', 'w', 'i', 's', 's', 5, 'k', 'w', 'i', 'n', 'g', 4, 'k', 'w', 'i', 'j',\n4, 'k', 'w', 'i', 'c', 4, 'k', 'w', 'i', 'k', 4, 'k', 'w', 'i', 't', 4, 'k', 'w', 'i', 'p', 4, 'k', 'w', 'i', 'h', 3, 'k', 'y', 'u',\n4, 'k', 'y', 'u', 'g', 5, 'k', 'y', 'u', 'g', 'g', 5, 'k', 'y', 'u', 'g', 's', 4, 'k', 'y', 'u', 'n', 5, 'k', 'y', 'u', 'n', 'j', 5, 'k', 'y', 'u', 'n', 'h',\n4, 'k', 'y', 'u', 'd', 4, 'k', 'y', 'u', 'l', 5, 'k', 'y', 'u', 'l', 'g', 5, 'k', 'y', 'u', 'l', 'm', 5, 'k', 'y', 'u', 'l', 'b', 5, 'k', 'y', 'u', 'l', 's',\n5, 'k', 'y', 'u', 'l', 't', 5, 'k', 'y', 'u', 'l', 'p', 5, 'k', 'y', 'u', 'l', 'h', 4, 'k', 'y', 'u', 'm', 4, 'k', 'y', 'u', 'b', 5, 'k', 'y', 'u', 'b', 's',\n4, 'k', 'y', 'u', 's', 5, 'k', 'y', 'u', 's', 's', 5, 'k', 'y', 'u', 'n', 'g', 4, 'k', 'y', 'u', 'j', 4, 'k', 'y', 'u', 'c', 4, 'k', 'y', 'u', 'k',\n4, 'k', 'y', 'u', 't', 4, 'k', 'y', 'u', 'p', 4, 'k', 'y', 'u', 'h', 3, 'k', 'e', 'u', 4, 'k', 'e', 'u', 'g', 5, 'k', 'e', 'u', 'g', 'g',\n5, 'k', 'e', 'u', 'g', 's', 4, 'k', 'e', 'u', 'n', 5, 'k', 'e', 'u', 'n', 'j', 5, 'k', 'e', 'u', 'n', 'h', 4, 'k', 'e', 'u', 'd', 4, 'k', 'e', 'u', 'l',\n5, 'k', 'e', 'u', 'l', 'g', 5, 'k', 'e', 'u', 'l', 'm', 5, 'k', 'e', 'u', 'l', 'b', 5, 'k', 'e', 'u', 'l', 's', 5, 'k', 'e', 'u', 'l', 't', 5, 'k', 'e', 'u', 'l', 'p',\n5, 'k', 'e', 'u', 'l', 'h', 4, 'k', 'e', 'u', 'm', 4, 'k', 'e', 'u', 'b', 5, 'k', 'e', 'u', 'b', 's', 4, 'k', 'e', 'u', 's', 5, 'k', 'e', 'u', 's', 's',\n5, 'k', 'e', 'u', 'n', 'g', 4, 'k', 'e', 'u', 'j', 4, 'k', 'e', 'u', 'c', 4, 'k', 'e', 'u', 'k', 4, 'k', 'e', 'u', 't', 4, 'k', 'e', 'u', 'p',\n4, 'k', 'e', 'u', 'h', 3, 'k', 'y', 'i', 4, 'k', 'y', 'i', 'g', 5, 'k', 'y', 'i', 'g', 'g', 5, 'k', 'y', 'i', 'g', 's', 4, 'k', 'y', 'i', 'n',\n5, 'k', 'y', 'i', 'n', 'j', 5, 'k', 'y', 'i', 'n', 'h', 4, 'k', 'y', 'i', 'd', 4, 'k', 'y', 'i', 'l', 5, 'k', 'y', 'i', 'l', 'g', 5, 'k', 'y', 'i', 'l', 'm',\n5, 'k', 'y', 'i', 'l', 'b', 5, 'k', 'y', 'i', 'l', 's', 5, 'k', 'y', 'i', 'l', 't', 5, 'k', 'y', 'i', 'l', 'p', 5, 'k', 'y', 'i', 'l', 'h', 4, 'k', 'y', 'i', 'm',\n4, 'k', 'y', 'i', 'b', 5, 'k', 'y', 'i', 'b', 's', 4, 'k', 'y', 'i', 's', 5, 'k', 'y', 'i', 's', 's', 5, 'k', 'y', 'i', 'n', 'g', 4, 'k', 'y', 'i', 'j',\n4, 'k', 'y', 'i', 'c', 4, 'k', 'y', 'i', 'k', 4, 'k', 'y', 'i', 't', 4, 'k', 'y', 'i', 'p', 4, 'k', 'y', 'i', 'h', 2, 'k', 'i',\n3, 'k', 'i', 'g', 4, 'k', 'i', 'g', 'g', 4, 'k', 'i', 'g', 's', 3, 'k', 'i', 'n', 4, 'k', 'i', 'n', 'j', 4, 'k', 'i', 'n', 'h',\n3, 'k', 'i', 'd', 3, 'k', 'i', 'l', 4, 'k', 'i', 'l', 'g', 4, 'k', 'i', 'l', 'm', 4, 'k', 'i', 'l', 'b', 4, 'k', 'i', 'l', 's',\n4, 'k', 'i', 'l', 't', 4, 'k', 'i', 'l', 'p', 4, 'k', 'i', 'l', 'h', 3, 'k', 'i', 'm', 3, 'k', 'i', 'b', 4, 'k', 'i', 'b', 's',\n3, 'k', 'i', 's', 4, 'k', 'i', 's', 's', 4, 'k', 'i', 'n', 'g', 3, 'k', 'i', 'j', 3, 'k', 'i', 'c', 3, 'k', 'i', 'k',\n3, 'k', 'i', 't', 3, 'k', 'i', 'p', 3, 'k', 'i', 'h', 2, 't', 'a', 3, 't', 'a', 'g', 4, 't', 'a', 'g', 'g',\n4, 't', 'a', 'g', 's', 3, 't', 'a', 'n', 4, 't', 'a', 'n', 'j', 4, 't', 'a', 'n', 'h', 3, 't', 'a', 'd', 3, 't', 'a', 'l',\n4, 't', 'a', 'l', 'g', 4, 't', 'a', 'l', 'm', 4, 't', 'a', 'l', 'b', 4, 't', 'a', 'l', 's', 4, 't', 'a', 'l', 't', 4, 't', 'a', 'l', 'p',\n4, 't', 'a', 'l', 'h', 3, 't', 'a', 'm', 3, 't', 'a', 'b', 4, 't', 'a', 'b', 's', 3, 't', 'a', 's', 4, 't', 'a', 's', 's',\n4, 't', 'a', 'n', 'g', 3, 't', 'a', 'j', 3, 't', 'a', 'c', 3, 't', 'a', 'k', 3, 't', 'a', 't', 3, 't', 'a', 'p',\n3, 't', 'a', 'h', 3, 't', 'a', 'e', 4, 't', 'a', 'e', 'g', 5, 't', 'a', 'e', 'g', 'g', 5, 't', 'a', 'e', 'g', 's', 4, 't', 'a', 'e', 'n',\n5, 't', 'a', 'e', 'n', 'j', 5, 't', 'a', 'e', 'n', 'h', 4, 't', 'a', 'e', 'd', 4, 't', 'a', 'e', 'l', 5, 't', 'a', 'e', 'l', 'g', 5, 't', 'a', 'e', 'l', 'm',\n5, 't', 'a', 'e', 'l', 'b', 5, 't', 'a', 'e', 'l', 's', 5, 't', 'a', 'e', 'l', 't', 5, 't', 'a', 'e', 'l', 'p', 5, 't', 'a', 'e', 'l', 'h', 4, 't', 'a', 'e', 'm',\n4, 't', 'a', 'e', 'b', 5, 't', 'a', 'e', 'b', 's', 4, 't', 'a', 'e', 's', 5, 't', 'a', 'e', 's', 's', 5, 't', 'a', 'e', 'n', 'g', 4, 't', 'a', 'e', 'j',\n4, 't', 'a', 'e', 'c', 4, 't', 'a', 'e', 'k', 4, 't', 'a', 'e', 't', 4, 't', 'a', 'e', 'p', 4, 't', 'a', 'e', 'h', 3, 't', 'y', 'a',\n4, 't', 'y', 'a', 'g', 5, 't', 'y', 'a', 'g', 'g', 5, 't', 'y', 'a', 'g', 's', 4, 't', 'y', 'a', 'n', 5, 't', 'y', 'a', 'n', 'j', 5, 't', 'y', 'a', 'n', 'h',\n4, 't', 'y', 'a', 'd', 4, 't', 'y', 'a', 'l', 5, 't', 'y', 'a', 'l', 'g', 5, 't', 'y', 'a', 'l', 'm', 5, 't', 'y', 'a', 'l', 'b', 5, 't', 'y', 'a', 'l', 's',\n5, 't', 'y', 'a', 'l', 't', 5, 't', 'y', 'a', 'l', 'p', 5, 't', 'y', 'a', 'l', 'h', 4, 't', 'y', 'a', 'm', 4, 't', 'y', 'a', 'b', 5, 't', 'y', 'a', 'b', 's',\n4, 't', 'y', 'a', 's', 5, 't', 'y', 'a', 's', 's', 5, 't', 'y', 'a', 'n', 'g', 4, 't', 'y', 'a', 'j', 4, 't', 'y', 'a', 'c', 4, 't', 'y', 'a', 'k',\n4, 't', 'y', 'a', 't', 4, 't', 'y', 'a', 'p', 4, 't', 'y', 'a', 'h', 4, 't', 'y', 'a', 'e', 5, 't', 'y', 'a', 'e', 'g', 6, 't', 'y', 'a', 'e', 'g', 'g',\n6, 't', 'y', 'a', 'e', 'g', 's', 5, 't', 'y', 'a', 'e', 'n', 6, 't', 'y', 'a', 'e', 'n', 'j', 6, 't', 'y', 'a', 'e', 'n', 'h', 5, 't', 'y', 'a', 'e', 'd', 5, 't', 'y', 'a', 'e', 'l',\n6, 't', 'y', 'a', 'e', 'l', 'g', 6, 't', 'y', 'a', 'e', 'l', 'm', 6, 't', 'y', 'a', 'e', 'l', 'b', 6, 't', 'y', 'a', 'e', 'l', 's', 6, 't', 'y', 'a', 'e', 'l', 't', 6, 't', 'y', 'a', 'e', 'l', 'p',\n6, 't', 'y', 'a', 'e', 'l', 'h', 5, 't', 'y', 'a', 'e', 'm', 5, 't', 'y', 'a', 'e', 'b', 6, 't', 'y', 'a', 'e', 'b', 's', 5, 't', 'y', 'a', 'e', 's', 6, 't', 'y', 'a', 'e', 's', 's',\n6, 't', 'y', 'a', 'e', 'n', 'g', 5, 't', 'y', 'a', 'e', 'j', 5, 't', 'y', 'a', 'e', 'c', 5, 't', 'y', 'a', 'e', 'k', 5, 't', 'y', 'a', 'e', 't', 5, 't', 'y', 'a', 'e', 'p',\n5, 't', 'y', 'a', 'e', 'h', 3, 't', 'e', 'o', 4, 't', 'e', 'o', 'g', 5, 't', 'e', 'o', 'g', 'g', 5, 't', 'e', 'o', 'g', 's', 4, 't', 'e', 'o', 'n',\n5, 't', 'e', 'o', 'n', 'j', 5, 't', 'e', 'o', 'n', 'h', 4, 't', 'e', 'o', 'd', 4, 't', 'e', 'o', 'l', 5, 't', 'e', 'o', 'l', 'g', 5, 't', 'e', 'o', 'l', 'm',\n5, 't', 'e', 'o', 'l', 'b', 5, 't', 'e', 'o', 'l', 's', 5, 't', 'e', 'o', 'l', 't', 5, 't', 'e', 'o', 'l', 'p', 5, 't', 'e', 'o', 'l', 'h', 4, 't', 'e', 'o', 'm',\n4, 't', 'e', 'o', 'b', 5, 't', 'e', 'o', 'b', 's', 4, 't', 'e', 'o', 's', 5, 't', 'e', 'o', 's', 's', 5, 't', 'e', 'o', 'n', 'g', 4, 't', 'e', 'o', 'j',\n4, 't', 'e', 'o', 'c', 4, 't', 'e', 'o', 'k', 4, 't', 'e', 'o', 't', 4, 't', 'e', 'o', 'p', 4, 't', 'e', 'o', 'h', 2, 't', 'e',\n3, 't', 'e', 'g', 4, 't', 'e', 'g', 'g', 4, 't', 'e', 'g', 's', 3, 't', 'e', 'n', 4, 't', 'e', 'n', 'j', 4, 't', 'e', 'n', 'h',\n3, 't', 'e', 'd', 3, 't', 'e', 'l', 4, 't', 'e', 'l', 'g', 4, 't', 'e', 'l', 'm', 4, 't', 'e', 'l', 'b', 4, 't', 'e', 'l', 's',\n4, 't', 'e', 'l', 't', 4, 't', 'e', 'l', 'p', 4, 't', 'e', 'l', 'h', 3, 't', 'e', 'm', 3, 't', 'e', 'b', 4, 't', 'e', 'b', 's',\n3, 't', 'e', 's', 4, 't', 'e', 's', 's', 4, 't', 'e', 'n', 'g', 3, 't', 'e', 'j', 3, 't', 'e', 'c', 3, 't', 'e', 'k',\n3, 't', 'e', 't', 3, 't', 'e', 'p', 3, 't', 'e', 'h', 4, 't', 'y', 'e', 'o', 5, 't', 'y', 'e', 'o', 'g', 6, 't', 'y', 'e', 'o', 'g', 'g',\n6, 't', 'y', 'e', 'o', 'g', 's', 5, 't', 'y', 'e', 'o', 'n', 6, 't', 'y', 'e', 'o', 'n', 'j', 6, 't', 'y', 'e', 'o', 'n', 'h', 5, 't', 'y', 'e', 'o', 'd', 5, 't', 'y', 'e', 'o', 'l',\n6, 't', 'y', 'e', 'o', 'l', 'g', 6, 't', 'y', 'e', 'o', 'l', 'm', 6, 't', 'y', 'e', 'o', 'l', 'b', 6, 't', 'y', 'e', 'o', 'l', 's', 6, 't', 'y', 'e', 'o', 'l', 't', 6, 't', 'y', 'e', 'o', 'l', 'p',\n6, 't', 'y', 'e', 'o', 'l', 'h', 5, 't', 'y', 'e', 'o', 'm', 5, 't', 'y', 'e', 'o', 'b', 6, 't', 'y', 'e', 'o', 'b', 's', 5, 't', 'y', 'e', 'o', 's', 6, 't', 'y', 'e', 'o', 's', 's',\n6, 't', 'y', 'e', 'o', 'n', 'g', 5, 't', 'y', 'e', 'o', 'j', 5, 't', 'y', 'e', 'o', 'c', 5, 't', 'y', 'e', 'o', 'k', 5, 't', 'y', 'e', 'o', 't', 5, 't', 'y', 'e', 'o', 'p',\n5, 't', 'y', 'e', 'o', 'h', 3, 't', 'y', 'e', 4, 't', 'y', 'e', 'g', 5, 't', 'y', 'e', 'g', 'g', 5, 't', 'y', 'e', 'g', 's', 4, 't', 'y', 'e', 'n',\n5, 't', 'y', 'e', 'n', 'j', 5, 't', 'y', 'e', 'n', 'h', 4, 't', 'y', 'e', 'd', 4, 't', 'y', 'e', 'l', 5, 't', 'y', 'e', 'l', 'g', 5, 't', 'y', 'e', 'l', 'm',\n5, 't', 'y', 'e', 'l', 'b', 5, 't', 'y', 'e', 'l', 's', 5, 't', 'y', 'e', 'l', 't', 5, 't', 'y', 'e', 'l', 'p', 5, 't', 'y', 'e', 'l', 'h', 4, 't', 'y', 'e', 'm',\n4, 't', 'y', 'e', 'b', 5, 't', 'y', 'e', 'b', 's', 4, 't', 'y', 'e', 's', 5, 't', 'y', 'e', 's', 's', 5, 't', 'y', 'e', 'n', 'g', 4, 't', 'y', 'e', 'j',\n4, 't', 'y', 'e', 'c', 4, 't', 'y', 'e', 'k', 4, 't', 'y', 'e', 't', 4, 't', 'y', 'e', 'p', 4, 't', 'y', 'e', 'h', 2, 't', 'o',\n3, 't', 'o', 'g', 4, 't', 'o', 'g', 'g', 4, 't', 'o', 'g', 's', 3, 't', 'o', 'n', 4, 't', 'o', 'n', 'j', 4, 't', 'o', 'n', 'h',\n3, 't', 'o', 'd', 3, 't', 'o', 'l', 4, 't', 'o', 'l', 'g', 4, 't', 'o', 'l', 'm', 4, 't', 'o', 'l', 'b', 4, 't', 'o', 'l', 's',\n4, 't', 'o', 'l', 't', 4, 't', 'o', 'l', 'p', 4, 't', 'o', 'l', 'h', 3, 't', 'o', 'm', 3, 't', 'o', 'b', 4, 't', 'o', 'b', 's',\n3, 't', 'o', 's', 4, 't', 'o', 's', 's', 4, 't', 'o', 'n', 'g', 3, 't', 'o', 'j', 3, 't', 'o', 'c', 3, 't', 'o', 'k',\n3, 't', 'o', 't', 3, 't', 'o', 'p', 3, 't', 'o', 'h', 3, 't', 'w', 'a', 4, 't', 'w', 'a', 'g', 5, 't', 'w', 'a', 'g', 'g',\n5, 't', 'w', 'a', 'g', 's', 4, 't', 'w', 'a', 'n', 5, 't', 'w', 'a', 'n', 'j', 5, 't', 'w', 'a', 'n', 'h', 4, 't', 'w', 'a', 'd', 4, 't', 'w', 'a', 'l',\n5, 't', 'w', 'a', 'l', 'g', 5, 't', 'w', 'a', 'l', 'm', 5, 't', 'w', 'a', 'l', 'b', 5, 't', 'w', 'a', 'l', 's', 5, 't', 'w', 'a', 'l', 't', 5, 't', 'w', 'a', 'l', 'p',\n5, 't', 'w', 'a', 'l', 'h', 4, 't', 'w', 'a', 'm', 4, 't', 'w', 'a', 'b', 5, 't', 'w', 'a', 'b', 's', 4, 't', 'w', 'a', 's', 5, 't', 'w', 'a', 's', 's',\n5, 't', 'w', 'a', 'n', 'g', 4, 't', 'w', 'a', 'j', 4, 't', 'w', 'a', 'c', 4, 't', 'w', 'a', 'k', 4, 't', 'w', 'a', 't', 4, 't', 'w', 'a', 'p',\n4, 't', 'w', 'a', 'h', 4, 't', 'w', 'a', 'e', 5, 't', 'w', 'a', 'e', 'g', 6, 't', 'w', 'a', 'e', 'g', 'g', 6, 't', 'w', 'a', 'e', 'g', 's', 5, 't', 'w', 'a', 'e', 'n',\n6, 't', 'w', 'a', 'e', 'n', 'j', 6, 't', 'w', 'a', 'e', 'n', 'h', 5, 't', 'w', 'a', 'e', 'd', 5, 't', 'w', 'a', 'e', 'l', 6, 't', 'w', 'a', 'e', 'l', 'g', 6, 't', 'w', 'a', 'e', 'l', 'm',\n6, 't', 'w', 'a', 'e', 'l', 'b', 6, 't', 'w', 'a', 'e', 'l', 's', 6, 't', 'w', 'a', 'e', 'l', 't', 6, 't', 'w', 'a', 'e', 'l', 'p', 6, 't', 'w', 'a', 'e', 'l', 'h', 5, 't', 'w', 'a', 'e', 'm',\n5, 't', 'w', 'a', 'e', 'b', 6, 't', 'w', 'a', 'e', 'b', 's', 5, 't', 'w', 'a', 'e', 's', 6, 't', 'w', 'a', 'e', 's', 's', 6, 't', 'w', 'a', 'e', 'n', 'g', 5, 't', 'w', 'a', 'e', 'j',\n5, 't', 'w', 'a', 'e', 'c', 5, 't', 'w', 'a', 'e', 'k', 5, 't', 'w', 'a', 'e', 't', 5, 't', 'w', 'a', 'e', 'p', 5, 't', 'w', 'a', 'e', 'h', 3, 't', 'o', 'e',\n4, 't', 'o', 'e', 'g', 5, 't', 'o', 'e', 'g', 'g', 5, 't', 'o', 'e', 'g', 's', 4, 't', 'o', 'e', 'n', 5, 't', 'o', 'e', 'n', 'j', 5, 't', 'o', 'e', 'n', 'h',\n4, 't', 'o', 'e', 'd', 4, 't', 'o', 'e', 'l', 5, 't', 'o', 'e', 'l', 'g', 5, 't', 'o', 'e', 'l', 'm', 5, 't', 'o', 'e', 'l', 'b', 5, 't', 'o', 'e', 'l', 's',\n5, 't', 'o', 'e', 'l', 't', 5, 't', 'o', 'e', 'l', 'p', 5, 't', 'o', 'e', 'l', 'h', 4, 't', 'o', 'e', 'm', 4, 't', 'o', 'e', 'b', 5, 't', 'o', 'e', 'b', 's',\n4, 't', 'o', 'e', 's', 5, 't', 'o', 'e', 's', 's', 5, 't', 'o', 'e', 'n', 'g', 4, 't', 'o', 'e', 'j', 4, 't', 'o', 'e', 'c', 4, 't', 'o', 'e', 'k',\n4, 't', 'o', 'e', 't', 4, 't', 'o', 'e', 'p', 4, 't', 'o', 'e', 'h', 3, 't', 'y', 'o', 4, 't', 'y', 'o', 'g', 5, 't', 'y', 'o', 'g', 'g',\n5, 't', 'y', 'o', 'g', 's', 4, 't', 'y', 'o', 'n', 5, 't', 'y', 'o', 'n', 'j', 5, 't', 'y', 'o', 'n', 'h', 4, 't', 'y', 'o', 'd', 4, 't', 'y', 'o', 'l',\n5, 't', 'y', 'o', 'l', 'g', 5, 't', 'y', 'o', 'l', 'm', 5, 't', 'y', 'o', 'l', 'b', 5, 't', 'y', 'o', 'l', 's', 5, 't', 'y', 'o', 'l', 't', 5, 't', 'y', 'o', 'l', 'p',\n5, 't', 'y', 'o', 'l', 'h', 4, 't', 'y', 'o', 'm', 4, 't', 'y', 'o', 'b', 5, 't', 'y', 'o', 'b', 's', 4, 't', 'y', 'o', 's', 5, 't', 'y', 'o', 's', 's',\n5, 't', 'y', 'o', 'n', 'g', 4, 't', 'y', 'o', 'j', 4, 't', 'y', 'o', 'c', 4, 't', 'y', 'o', 'k', 4, 't', 'y', 'o', 't', 4, 't', 'y', 'o', 'p',\n4, 't', 'y', 'o', 'h', 2, 't', 'u', 3, 't', 'u', 'g', 4, 't', 'u', 'g', 'g', 4, 't', 'u', 'g', 's', 3, 't', 'u', 'n',\n4, 't', 'u', 'n', 'j', 4, 't', 'u', 'n', 'h', 3, 't', 'u', 'd', 3, 't', 'u', 'l', 4, 't', 'u', 'l', 'g', 4, 't', 'u', 'l', 'm',\n4, 't', 'u', 'l', 'b', 4, 't', 'u', 'l', 's', 4, 't', 'u', 'l', 't', 4, 't', 'u', 'l', 'p', 4, 't', 'u', 'l', 'h', 3, 't', 'u', 'm',\n3, 't', 'u', 'b', 4, 't', 'u', 'b', 's', 3, 't', 'u', 's', 4, 't', 'u', 's', 's', 4, 't', 'u', 'n', 'g', 3, 't', 'u', 'j',\n3, 't', 'u', 'c', 3, 't', 'u', 'k', 3, 't', 'u', 't', 3, 't', 'u', 'p', 3, 't', 'u', 'h', 4, 't', 'w', 'e', 'o',\n5, 't', 'w', 'e', 'o', 'g', 6, 't', 'w', 'e', 'o', 'g', 'g', 6, 't', 'w', 'e', 'o', 'g', 's', 5, 't', 'w', 'e', 'o', 'n', 6, 't', 'w', 'e', 'o', 'n', 'j', 6, 't', 'w', 'e', 'o', 'n', 'h',\n5, 't', 'w', 'e', 'o', 'd', 5, 't', 'w', 'e', 'o', 'l', 6, 't', 'w', 'e', 'o', 'l', 'g', 6, 't', 'w', 'e', 'o', 'l', 'm', 6, 't', 'w', 'e', 'o', 'l', 'b', 6, 't', 'w', 'e', 'o', 'l', 's',\n6, 't', 'w', 'e', 'o', 'l', 't', 6, 't', 'w', 'e', 'o', 'l', 'p', 6, 't', 'w', 'e', 'o', 'l', 'h', 5, 't', 'w', 'e', 'o', 'm', 5, 't', 'w', 'e', 'o', 'b', 6, 't', 'w', 'e', 'o', 'b', 's',\n5, 't', 'w', 'e', 'o', 's', 6, 't', 'w', 'e', 'o', 's', 's', 6, 't', 'w', 'e', 'o', 'n', 'g', 5, 't', 'w', 'e', 'o', 'j', 5, 't', 'w', 'e', 'o', 'c', 5, 't', 'w', 'e', 'o', 'k',\n5, 't', 'w', 'e', 'o', 't', 5, 't', 'w', 'e', 'o', 'p', 5, 't', 'w', 'e', 'o', 'h', 3, 't', 'w', 'e', 4, 't', 'w', 'e', 'g', 5, 't', 'w', 'e', 'g', 'g',\n5, 't', 'w', 'e', 'g', 's', 4, 't', 'w', 'e', 'n', 5, 't', 'w', 'e', 'n', 'j', 5, 't', 'w', 'e', 'n', 'h', 4, 't', 'w', 'e', 'd', 4, 't', 'w', 'e', 'l',\n5, 't', 'w', 'e', 'l', 'g', 5, 't', 'w', 'e', 'l', 'm', 5, 't', 'w', 'e', 'l', 'b', 5, 't', 'w', 'e', 'l', 's', 5, 't', 'w', 'e', 'l', 't', 5, 't', 'w', 'e', 'l', 'p',\n5, 't', 'w', 'e', 'l', 'h', 4, 't', 'w', 'e', 'm', 4, 't', 'w', 'e', 'b', 5, 't', 'w', 'e', 'b', 's', 4, 't', 'w', 'e', 's', 5, 't', 'w', 'e', 's', 's',\n5, 't', 'w', 'e', 'n', 'g', 4, 't', 'w', 'e', 'j', 4, 't', 'w', 'e', 'c', 4, 't', 'w', 'e', 'k', 4, 't', 'w', 'e', 't', 4, 't', 'w', 'e', 'p',\n4, 't', 'w', 'e', 'h', 3, 't', 'w', 'i', 4, 't', 'w', 'i', 'g', 5, 't', 'w', 'i', 'g', 'g', 5, 't', 'w', 'i', 'g', 's', 4, 't', 'w', 'i', 'n',\n5, 't', 'w', 'i', 'n', 'j', 5, 't', 'w', 'i', 'n', 'h', 4, 't', 'w', 'i', 'd', 4, 't', 'w', 'i', 'l', 5, 't', 'w', 'i', 'l', 'g', 5, 't', 'w', 'i', 'l', 'm',\n5, 't', 'w', 'i', 'l', 'b', 5, 't', 'w', 'i', 'l', 's', 5, 't', 'w', 'i', 'l', 't', 5, 't', 'w', 'i', 'l', 'p', 5, 't', 'w', 'i', 'l', 'h', 4, 't', 'w', 'i', 'm',\n4, 't', 'w', 'i', 'b', 5, 't', 'w', 'i', 'b', 's', 4, 't', 'w', 'i', 's', 5, 't', 'w', 'i', 's', 's', 5, 't', 'w', 'i', 'n', 'g', 4, 't', 'w', 'i', 'j',\n4, 't', 'w', 'i', 'c', 4, 't', 'w', 'i', 'k', 4, 't', 'w', 'i', 't', 4, 't', 'w', 'i', 'p', 4, 't', 'w', 'i', 'h', 3, 't', 'y', 'u',\n4, 't', 'y', 'u', 'g', 5, 't', 'y', 'u', 'g', 'g', 5, 't', 'y', 'u', 'g', 's', 4, 't', 'y', 'u', 'n', 5, 't', 'y', 'u', 'n', 'j', 5, 't', 'y', 'u', 'n', 'h',\n4, 't', 'y', 'u', 'd', 4, 't', 'y', 'u', 'l', 5, 't', 'y', 'u', 'l', 'g', 5, 't', 'y', 'u', 'l', 'm', 5, 't', 'y', 'u', 'l', 'b', 5, 't', 'y', 'u', 'l', 's',\n5, 't', 'y', 'u', 'l', 't', 5, 't', 'y', 'u', 'l', 'p', 5, 't', 'y', 'u', 'l', 'h', 4, 't', 'y', 'u', 'm', 4, 't', 'y', 'u', 'b', 5, 't', 'y', 'u', 'b', 's',\n4, 't', 'y', 'u', 's', 5, 't', 'y', 'u', 's', 's', 5, 't', 'y', 'u', 'n', 'g', 4, 't', 'y', 'u', 'j', 4, 't', 'y', 'u', 'c', 4, 't', 'y', 'u', 'k',\n4, 't', 'y', 'u', 't', 4, 't', 'y', 'u', 'p', 4, 't', 'y', 'u', 'h', 3, 't', 'e', 'u', 4, 't', 'e', 'u', 'g', 5, 't', 'e', 'u', 'g', 'g',\n5, 't', 'e', 'u', 'g', 's', 4, 't', 'e', 'u', 'n', 5, 't', 'e', 'u', 'n', 'j', 5, 't', 'e', 'u', 'n', 'h', 4, 't', 'e', 'u', 'd', 4, 't', 'e', 'u', 'l',\n5, 't', 'e', 'u', 'l', 'g', 5, 't', 'e', 'u', 'l', 'm', 5, 't', 'e', 'u', 'l', 'b', 5, 't', 'e', 'u', 'l', 's', 5, 't', 'e', 'u', 'l', 't', 5, 't', 'e', 'u', 'l', 'p',\n5, 't', 'e', 'u', 'l', 'h', 4, 't', 'e', 'u', 'm', 4, 't', 'e', 'u', 'b', 5, 't', 'e', 'u', 'b', 's', 4, 't', 'e', 'u', 's', 5, 't', 'e', 'u', 's', 's',\n5, 't', 'e', 'u', 'n', 'g', 4, 't', 'e', 'u', 'j', 4, 't', 'e', 'u', 'c', 4, 't', 'e', 'u', 'k', 4, 't', 'e', 'u', 't', 4, 't', 'e', 'u', 'p',\n4, 't', 'e', 'u', 'h', 3, 't', 'y', 'i', 4, 't', 'y', 'i', 'g', 5, 't', 'y', 'i', 'g', 'g', 5, 't', 'y', 'i', 'g', 's', 4, 't', 'y', 'i', 'n',\n5, 't', 'y', 'i', 'n', 'j', 5, 't', 'y', 'i', 'n', 'h', 4, 't', 'y', 'i', 'd', 4, 't', 'y', 'i', 'l', 5, 't', 'y', 'i', 'l', 'g', 5, 't', 'y', 'i', 'l', 'm',\n5, 't', 'y', 'i', 'l', 'b', 5, 't', 'y', 'i', 'l', 's', 5, 't', 'y', 'i', 'l', 't', 5, 't', 'y', 'i', 'l', 'p', 5, 't', 'y', 'i', 'l', 'h', 4, 't', 'y', 'i', 'm',\n4, 't', 'y', 'i', 'b', 5, 't', 'y', 'i', 'b', 's', 4, 't', 'y', 'i', 's', 5, 't', 'y', 'i', 's', 's', 5, 't', 'y', 'i', 'n', 'g', 4, 't', 'y', 'i', 'j',\n4, 't', 'y', 'i', 'c', 4, 't', 'y', 'i', 'k', 4, 't', 'y', 'i', 't', 4, 't', 'y', 'i', 'p', 4, 't', 'y', 'i', 'h', 2, 't', 'i',\n3, 't', 'i', 'g', 4, 't', 'i', 'g', 'g', 4, 't', 'i', 'g', 's', 3, 't', 'i', 'n', 4, 't', 'i', 'n', 'j', 4, 't', 'i', 'n', 'h',\n3, 't', 'i', 'd', 3, 't', 'i', 'l', 4, 't', 'i', 'l', 'g', 4, 't', 'i', 'l', 'm', 4, 't', 'i', 'l', 'b', 4, 't', 'i', 'l', 's',\n4, 't', 'i', 'l', 't', 4, 't', 'i', 'l', 'p', 4, 't', 'i', 'l', 'h', 3, 't', 'i', 'm', 3, 't', 'i', 'b', 4, 't', 'i', 'b', 's',\n3, 't', 'i', 's', 4, 't', 'i', 's', 's', 4, 't', 'i', 'n', 'g', 3, 't', 'i', 'j', 3, 't', 'i', 'c', 3, 't', 'i', 'k',\n3, 't', 'i', 't', 3, 't', 'i', 'p', 3, 't', 'i', 'h', 2, 'p', 'a', 3, 'p', 'a', 'g', 4, 'p', 'a', 'g', 'g',\n4, 'p', 'a', 'g', 's', 3, 'p', 'a', 'n', 4, 'p', 'a', 'n', 'j', 4, 'p', 'a', 'n', 'h', 3, 'p', 'a', 'd', 3, 'p', 'a', 'l',\n4, 'p', 'a', 'l', 'g', 4, 'p', 'a', 'l', 'm', 4, 'p', 'a', 'l', 'b', 4, 'p', 'a', 'l', 's', 4, 'p', 'a', 'l', 't', 4, 'p', 'a', 'l', 'p',\n4, 'p', 'a', 'l', 'h', 3, 'p', 'a', 'm', 3, 'p', 'a', 'b', 4, 'p', 'a', 'b', 's', 3, 'p', 'a', 's', 4, 'p', 'a', 's', 's',\n4, 'p', 'a', 'n', 'g', 3, 'p', 'a', 'j', 3, 'p', 'a', 'c', 3, 'p', 'a', 'k', 3, 'p', 'a', 't', 3, 'p', 'a', 'p',\n3, 'p', 'a', 'h', 3, 'p', 'a', 'e', 4, 'p', 'a', 'e', 'g', 5, 'p', 'a', 'e', 'g', 'g', 5, 'p', 'a', 'e', 'g', 's', 4, 'p', 'a', 'e', 'n',\n5, 'p', 'a', 'e', 'n', 'j', 5, 'p', 'a', 'e', 'n', 'h', 4, 'p', 'a', 'e', 'd', 4, 'p', 'a', 'e', 'l', 5, 'p', 'a', 'e', 'l', 'g', 5, 'p', 'a', 'e', 'l', 'm',\n5, 'p', 'a', 'e', 'l', 'b', 5, 'p', 'a', 'e', 'l', 's', 5, 'p', 'a', 'e', 'l', 't', 5, 'p', 'a', 'e', 'l', 'p', 5, 'p', 'a', 'e', 'l', 'h', 4, 'p', 'a', 'e', 'm',\n4, 'p', 'a', 'e', 'b', 5, 'p', 'a', 'e', 'b', 's', 4, 'p', 'a', 'e', 's', 5, 'p', 'a', 'e', 's', 's', 5, 'p', 'a', 'e', 'n', 'g', 4, 'p', 'a', 'e', 'j',\n4, 'p', 'a', 'e', 'c', 4, 'p', 'a', 'e', 'k', 4, 'p', 'a', 'e', 't', 4, 'p', 'a', 'e', 'p', 4, 'p', 'a', 'e', 'h', 3, 'p', 'y', 'a',\n4, 'p', 'y', 'a', 'g', 5, 'p', 'y', 'a', 'g', 'g', 5, 'p', 'y', 'a', 'g', 's', 4, 'p', 'y', 'a', 'n', 5, 'p', 'y', 'a', 'n', 'j', 5, 'p', 'y', 'a', 'n', 'h',\n4, 'p', 'y', 'a', 'd', 4, 'p', 'y', 'a', 'l', 5, 'p', 'y', 'a', 'l', 'g', 5, 'p', 'y', 'a', 'l', 'm', 5, 'p', 'y', 'a', 'l', 'b', 5, 'p', 'y', 'a', 'l', 's',\n5, 'p', 'y', 'a', 'l', 't', 5, 'p', 'y', 'a', 'l', 'p', 5, 'p', 'y', 'a', 'l', 'h', 4, 'p', 'y', 'a', 'm', 4, 'p', 'y', 'a', 'b', 5, 'p', 'y', 'a', 'b', 's',\n4, 'p', 'y', 'a', 's', 5, 'p', 'y', 'a', 's', 's', 5, 'p', 'y', 'a', 'n', 'g', 4, 'p', 'y', 'a', 'j', 4, 'p', 'y', 'a', 'c', 4, 'p', 'y', 'a', 'k',\n4, 'p', 'y', 'a', 't', 4, 'p', 'y', 'a', 'p', 4, 'p', 'y', 'a', 'h', 4, 'p', 'y', 'a', 'e', 5, 'p', 'y', 'a', 'e', 'g', 6, 'p', 'y', 'a', 'e', 'g', 'g',\n6, 'p', 'y', 'a', 'e', 'g', 's', 5, 'p', 'y', 'a', 'e', 'n', 6, 'p', 'y', 'a', 'e', 'n', 'j', 6, 'p', 'y', 'a', 'e', 'n', 'h', 5, 'p', 'y', 'a', 'e', 'd', 5, 'p', 'y', 'a', 'e', 'l',\n6, 'p', 'y', 'a', 'e', 'l', 'g', 6, 'p', 'y', 'a', 'e', 'l', 'm', 6, 'p', 'y', 'a', 'e', 'l', 'b', 6, 'p', 'y', 'a', 'e', 'l', 's', 6, 'p', 'y', 'a', 'e', 'l', 't', 6, 'p', 'y', 'a', 'e', 'l', 'p',\n6, 'p', 'y', 'a', 'e', 'l', 'h', 5, 'p', 'y', 'a', 'e', 'm', 5, 'p', 'y', 'a', 'e', 'b', 6, 'p', 'y', 'a', 'e', 'b', 's', 5, 'p', 'y', 'a', 'e', 's', 6, 'p', 'y', 'a', 'e', 's', 's',\n6, 'p', 'y', 'a', 'e', 'n', 'g', 5, 'p', 'y', 'a', 'e', 'j', 5, 'p', 'y', 'a', 'e', 'c', 5, 'p', 'y', 'a', 'e', 'k', 5, 'p', 'y', 'a', 'e', 't', 5, 'p', 'y', 'a', 'e', 'p',\n5, 'p', 'y', 'a', 'e', 'h', 3, 'p', 'e', 'o', 4, 'p', 'e', 'o', 'g', 5, 'p', 'e', 'o', 'g', 'g', 5, 'p', 'e', 'o', 'g', 's', 4, 'p', 'e', 'o', 'n',\n5, 'p', 'e', 'o', 'n', 'j', 5, 'p', 'e', 'o', 'n', 'h', 4, 'p', 'e', 'o', 'd', 4, 'p', 'e', 'o', 'l', 5, 'p', 'e', 'o', 'l', 'g', 5, 'p', 'e', 'o', 'l', 'm',\n5, 'p', 'e', 'o', 'l', 'b', 5, 'p', 'e', 'o', 'l', 's', 5, 'p', 'e', 'o', 'l', 't', 5, 'p', 'e', 'o', 'l', 'p', 5, 'p', 'e', 'o', 'l', 'h', 4, 'p', 'e', 'o', 'm',\n4, 'p', 'e', 'o', 'b', 5, 'p', 'e', 'o', 'b', 's', 4, 'p', 'e', 'o', 's', 5, 'p', 'e', 'o', 's', 's', 5, 'p', 'e', 'o', 'n', 'g', 4, 'p', 'e', 'o', 'j',\n4, 'p', 'e', 'o', 'c', 4, 'p', 'e', 'o', 'k', 4, 'p', 'e', 'o', 't', 4, 'p', 'e', 'o', 'p', 4, 'p', 'e', 'o', 'h', 2, 'p', 'e',\n3, 'p', 'e', 'g', 4, 'p', 'e', 'g', 'g', 4, 'p', 'e', 'g', 's', 3, 'p', 'e', 'n', 4, 'p', 'e', 'n', 'j', 4, 'p', 'e', 'n', 'h',\n3, 'p', 'e', 'd', 3, 'p', 'e', 'l', 4, 'p', 'e', 'l', 'g', 4, 'p', 'e', 'l', 'm', 4, 'p', 'e', 'l', 'b', 4, 'p', 'e', 'l', 's',\n4, 'p', 'e', 'l', 't', 4, 'p', 'e', 'l', 'p', 4, 'p', 'e', 'l', 'h', 3, 'p', 'e', 'm', 3, 'p', 'e', 'b', 4, 'p', 'e', 'b', 's',\n3, 'p', 'e', 's', 4, 'p', 'e', 's', 's', 4, 'p', 'e', 'n', 'g', 3, 'p', 'e', 'j', 3, 'p', 'e', 'c', 3, 'p', 'e', 'k',\n3, 'p', 'e', 't', 3, 'p', 'e', 'p', 3, 'p', 'e', 'h', 4, 'p', 'y', 'e', 'o', 5, 'p', 'y', 'e', 'o', 'g', 6, 'p', 'y', 'e', 'o', 'g', 'g',\n6, 'p', 'y', 'e', 'o', 'g', 's', 5, 'p', 'y', 'e', 'o', 'n', 6, 'p', 'y', 'e', 'o', 'n', 'j', 6, 'p', 'y', 'e', 'o', 'n', 'h', 5, 'p', 'y', 'e', 'o', 'd', 5, 'p', 'y', 'e', 'o', 'l',\n6, 'p', 'y', 'e', 'o', 'l', 'g', 6, 'p', 'y', 'e', 'o', 'l', 'm', 6, 'p', 'y', 'e', 'o', 'l', 'b', 6, 'p', 'y', 'e', 'o', 'l', 's', 6, 'p', 'y', 'e', 'o', 'l', 't', 6, 'p', 'y', 'e', 'o', 'l', 'p',\n6, 'p', 'y', 'e', 'o', 'l', 'h', 5, 'p', 'y', 'e', 'o', 'm', 5, 'p', 'y', 'e', 'o', 'b', 6, 'p', 'y', 'e', 'o', 'b', 's', 5, 'p', 'y', 'e', 'o', 's', 6, 'p', 'y', 'e', 'o', 's', 's',\n6, 'p', 'y', 'e', 'o', 'n', 'g', 5, 'p', 'y', 'e', 'o', 'j', 5, 'p', 'y', 'e', 'o', 'c', 5, 'p', 'y', 'e', 'o', 'k', 5, 'p', 'y', 'e', 'o', 't', 5, 'p', 'y', 'e', 'o', 'p',\n5, 'p', 'y', 'e', 'o', 'h', 3, 'p', 'y', 'e', 4, 'p', 'y', 'e', 'g', 5, 'p', 'y', 'e', 'g', 'g', 5, 'p', 'y', 'e', 'g', 's', 4, 'p', 'y', 'e', 'n',\n5, 'p', 'y', 'e', 'n', 'j', 5, 'p', 'y', 'e', 'n', 'h', 4, 'p', 'y', 'e', 'd', 4, 'p', 'y', 'e', 'l', 5, 'p', 'y', 'e', 'l', 'g', 5, 'p', 'y', 'e', 'l', 'm',\n5, 'p', 'y', 'e', 'l', 'b', 5, 'p', 'y', 'e', 'l', 's', 5, 'p', 'y', 'e', 'l', 't', 5, 'p', 'y', 'e', 'l', 'p', 5, 'p', 'y', 'e', 'l', 'h', 4, 'p', 'y', 'e', 'm',\n4, 'p', 'y', 'e', 'b', 5, 'p', 'y', 'e', 'b', 's', 4, 'p', 'y', 'e', 's', 5, 'p', 'y', 'e', 's', 's', 5, 'p', 'y', 'e', 'n', 'g', 4, 'p', 'y', 'e', 'j',\n4, 'p', 'y', 'e', 'c', 4, 'p', 'y', 'e', 'k', 4, 'p', 'y', 'e', 't', 4, 'p', 'y', 'e', 'p', 4, 'p', 'y', 'e', 'h', 2, 'p', 'o',\n3, 'p', 'o', 'g', 4, 'p', 'o', 'g', 'g', 4, 'p', 'o', 'g', 's', 3, 'p', 'o', 'n', 4, 'p', 'o', 'n', 'j', 4, 'p', 'o', 'n', 'h',\n3, 'p', 'o', 'd', 3, 'p', 'o', 'l', 4, 'p', 'o', 'l', 'g', 4, 'p', 'o', 'l', 'm', 4, 'p', 'o', 'l', 'b', 4, 'p', 'o', 'l', 's',\n4, 'p', 'o', 'l', 't', 4, 'p', 'o', 'l', 'p', 4, 'p', 'o', 'l', 'h', 3, 'p', 'o', 'm', 3, 'p', 'o', 'b', 4, 'p', 'o', 'b', 's',\n3, 'p', 'o', 's', 4, 'p', 'o', 's', 's', 4, 'p', 'o', 'n', 'g', 3, 'p', 'o', 'j', 3, 'p', 'o', 'c', 3, 'p', 'o', 'k',\n3, 'p', 'o', 't', 3, 'p', 'o', 'p', 3, 'p', 'o', 'h', 3, 'p', 'w', 'a', 4, 'p', 'w', 'a', 'g', 5, 'p', 'w', 'a', 'g', 'g',\n5, 'p', 'w', 'a', 'g', 's', 4, 'p', 'w', 'a', 'n', 5, 'p', 'w', 'a', 'n', 'j', 5, 'p', 'w', 'a', 'n', 'h', 4, 'p', 'w', 'a', 'd', 4, 'p', 'w', 'a', 'l',\n5, 'p', 'w', 'a', 'l', 'g', 5, 'p', 'w', 'a', 'l', 'm', 5, 'p', 'w', 'a', 'l', 'b', 5, 'p', 'w', 'a', 'l', 's', 5, 'p', 'w', 'a', 'l', 't', 5, 'p', 'w', 'a', 'l', 'p',\n5, 'p', 'w', 'a', 'l', 'h', 4, 'p', 'w', 'a', 'm', 4, 'p', 'w', 'a', 'b', 5, 'p', 'w', 'a', 'b', 's', 4, 'p', 'w', 'a', 's', 5, 'p', 'w', 'a', 's', 's',\n5, 'p', 'w', 'a', 'n', 'g', 4, 'p', 'w', 'a', 'j', 4, 'p', 'w', 'a', 'c', 4, 'p', 'w', 'a', 'k', 4, 'p', 'w', 'a', 't', 4, 'p', 'w', 'a', 'p',\n4, 'p', 'w', 'a', 'h', 4, 'p', 'w', 'a', 'e', 5, 'p', 'w', 'a', 'e', 'g', 6, 'p', 'w', 'a', 'e', 'g', 'g', 6, 'p', 'w', 'a', 'e', 'g', 's', 5, 'p', 'w', 'a', 'e', 'n',\n6, 'p', 'w', 'a', 'e', 'n', 'j', 6, 'p', 'w', 'a', 'e', 'n', 'h', 5, 'p', 'w', 'a', 'e', 'd', 5, 'p', 'w', 'a', 'e', 'l', 6, 'p', 'w', 'a', 'e', 'l', 'g', 6, 'p', 'w', 'a', 'e', 'l', 'm',\n6, 'p', 'w', 'a', 'e', 'l', 'b', 6, 'p', 'w', 'a', 'e', 'l', 's', 6, 'p', 'w', 'a', 'e', 'l', 't', 6, 'p', 'w', 'a', 'e', 'l', 'p', 6, 'p', 'w', 'a', 'e', 'l', 'h', 5, 'p', 'w', 'a', 'e', 'm',\n5, 'p', 'w', 'a', 'e', 'b', 6, 'p', 'w', 'a', 'e', 'b', 's', 5, 'p', 'w', 'a', 'e', 's', 6, 'p', 'w', 'a', 'e', 's', 's', 6, 'p', 'w', 'a', 'e', 'n', 'g', 5, 'p', 'w', 'a', 'e', 'j',\n5, 'p', 'w', 'a', 'e', 'c', 5, 'p', 'w', 'a', 'e', 'k', 5, 'p', 'w', 'a', 'e', 't', 5, 'p', 'w', 'a', 'e', 'p', 5, 'p', 'w', 'a', 'e', 'h', 3, 'p', 'o', 'e',\n4, 'p', 'o', 'e', 'g', 5, 'p', 'o', 'e', 'g', 'g', 5, 'p', 'o', 'e', 'g', 's', 4, 'p', 'o', 'e', 'n', 5, 'p', 'o', 'e', 'n', 'j', 5, 'p', 'o', 'e', 'n', 'h',\n4, 'p', 'o', 'e', 'd', 4, 'p', 'o', 'e', 'l', 5, 'p', 'o', 'e', 'l', 'g', 5, 'p', 'o', 'e', 'l', 'm', 5, 'p', 'o', 'e', 'l', 'b', 5, 'p', 'o', 'e', 'l', 's',\n5, 'p', 'o', 'e', 'l', 't', 5, 'p', 'o', 'e', 'l', 'p', 5, 'p', 'o', 'e', 'l', 'h', 4, 'p', 'o', 'e', 'm', 4, 'p', 'o', 'e', 'b', 5, 'p', 'o', 'e', 'b', 's',\n4, 'p', 'o', 'e', 's', 5, 'p', 'o', 'e', 's', 's', 5, 'p', 'o', 'e', 'n', 'g', 4, 'p', 'o', 'e', 'j', 4, 'p', 'o', 'e', 'c', 4, 'p', 'o', 'e', 'k',\n4, 'p', 'o', 'e', 't', 4, 'p', 'o', 'e', 'p', 4, 'p', 'o', 'e', 'h', 3, 'p', 'y', 'o', 4, 'p', 'y', 'o', 'g', 5, 'p', 'y', 'o', 'g', 'g',\n5, 'p', 'y', 'o', 'g', 's', 4, 'p', 'y', 'o', 'n', 5, 'p', 'y', 'o', 'n', 'j', 5, 'p', 'y', 'o', 'n', 'h', 4, 'p', 'y', 'o', 'd', 4, 'p', 'y', 'o', 'l',\n5, 'p', 'y', 'o', 'l', 'g', 5, 'p', 'y', 'o', 'l', 'm', 5, 'p', 'y', 'o', 'l', 'b', 5, 'p', 'y', 'o', 'l', 's', 5, 'p', 'y', 'o', 'l', 't', 5, 'p', 'y', 'o', 'l', 'p',\n5, 'p', 'y', 'o', 'l', 'h', 4, 'p', 'y', 'o', 'm', 4, 'p', 'y', 'o', 'b', 5, 'p', 'y', 'o', 'b', 's', 4, 'p', 'y', 'o', 's', 5, 'p', 'y', 'o', 's', 's',\n5, 'p', 'y', 'o', 'n', 'g', 4, 'p', 'y', 'o', 'j', 4, 'p', 'y', 'o', 'c', 4, 'p', 'y', 'o', 'k', 4, 'p', 'y', 'o', 't', 4, 'p', 'y', 'o', 'p',\n4, 'p', 'y', 'o', 'h', 2, 'p', 'u', 3, 'p', 'u', 'g', 4, 'p', 'u', 'g', 'g', 4, 'p', 'u', 'g', 's', 3, 'p', 'u', 'n',\n4, 'p', 'u', 'n', 'j', 4, 'p', 'u', 'n', 'h', 3, 'p', 'u', 'd', 3, 'p', 'u', 'l', 4, 'p', 'u', 'l', 'g', 4, 'p', 'u', 'l', 'm',\n4, 'p', 'u', 'l', 'b', 4, 'p', 'u', 'l', 's', 4, 'p', 'u', 'l', 't', 4, 'p', 'u', 'l', 'p', 4, 'p', 'u', 'l', 'h', 3, 'p', 'u', 'm',\n3, 'p', 'u', 'b', 4, 'p', 'u', 'b', 's', 3, 'p', 'u', 's', 4, 'p', 'u', 's', 's', 4, 'p', 'u', 'n', 'g', 3, 'p', 'u', 'j',\n3, 'p', 'u', 'c', 3, 'p', 'u', 'k', 3, 'p', 'u', 't', 3, 'p', 'u', 'p', 3, 'p', 'u', 'h', 4, 'p', 'w', 'e', 'o',\n5, 'p', 'w', 'e', 'o', 'g', 6, 'p', 'w', 'e', 'o', 'g', 'g', 6, 'p', 'w', 'e', 'o', 'g', 's', 5, 'p', 'w', 'e', 'o', 'n', 6, 'p', 'w', 'e', 'o', 'n', 'j', 6, 'p', 'w', 'e', 'o', 'n', 'h',\n5, 'p', 'w', 'e', 'o', 'd', 5, 'p', 'w', 'e', 'o', 'l', 6, 'p', 'w', 'e', 'o', 'l', 'g', 6, 'p', 'w', 'e', 'o', 'l', 'm', 6, 'p', 'w', 'e', 'o', 'l', 'b', 6, 'p', 'w', 'e', 'o', 'l', 's',\n6, 'p', 'w', 'e', 'o', 'l', 't', 6, 'p', 'w', 'e', 'o', 'l', 'p', 6, 'p', 'w', 'e', 'o', 'l', 'h', 5, 'p', 'w', 'e', 'o', 'm', 5, 'p', 'w', 'e', 'o', 'b', 6, 'p', 'w', 'e', 'o', 'b', 's',\n5, 'p', 'w', 'e', 'o', 's', 6, 'p', 'w', 'e', 'o', 's', 's', 6, 'p', 'w', 'e', 'o', 'n', 'g', 5, 'p', 'w', 'e', 'o', 'j', 5, 'p', 'w', 'e', 'o', 'c', 5, 'p', 'w', 'e', 'o', 'k',\n5, 'p', 'w', 'e', 'o', 't', 5, 'p', 'w', 'e', 'o', 'p', 5, 'p', 'w', 'e', 'o', 'h', 3, 'p', 'w', 'e', 4, 'p', 'w', 'e', 'g', 5, 'p', 'w', 'e', 'g', 'g',\n5, 'p', 'w', 'e', 'g', 's', 4, 'p', 'w', 'e', 'n', 5, 'p', 'w', 'e', 'n', 'j', 5, 'p', 'w', 'e', 'n', 'h', 4, 'p', 'w', 'e', 'd', 4, 'p', 'w', 'e', 'l',\n5, 'p', 'w', 'e', 'l', 'g', 5, 'p', 'w', 'e', 'l', 'm', 5, 'p', 'w', 'e', 'l', 'b', 5, 'p', 'w', 'e', 'l', 's', 5, 'p', 'w', 'e', 'l', 't', 5, 'p', 'w', 'e', 'l', 'p',\n5, 'p', 'w', 'e', 'l', 'h', 4, 'p', 'w', 'e', 'm', 4, 'p', 'w', 'e', 'b', 5, 'p', 'w', 'e', 'b', 's', 4, 'p', 'w', 'e', 's', 5, 'p', 'w', 'e', 's', 's',\n5, 'p', 'w', 'e', 'n', 'g', 4, 'p', 'w', 'e', 'j', 4, 'p', 'w', 'e', 'c', 4, 'p', 'w', 'e', 'k', 4, 'p', 'w', 'e', 't', 4, 'p', 'w', 'e', 'p',\n4, 'p', 'w', 'e', 'h', 3, 'p', 'w', 'i', 4, 'p', 'w', 'i', 'g', 5, 'p', 'w', 'i', 'g', 'g', 5, 'p', 'w', 'i', 'g', 's', 4, 'p', 'w', 'i', 'n',\n5, 'p', 'w', 'i', 'n', 'j', 5, 'p', 'w', 'i', 'n', 'h', 4, 'p', 'w', 'i', 'd', 4, 'p', 'w', 'i', 'l', 5, 'p', 'w', 'i', 'l', 'g', 5, 'p', 'w', 'i', 'l', 'm',\n5, 'p', 'w', 'i', 'l', 'b', 5, 'p', 'w', 'i', 'l', 's', 5, 'p', 'w', 'i', 'l', 't', 5, 'p', 'w', 'i', 'l', 'p', 5, 'p', 'w', 'i', 'l', 'h', 4, 'p', 'w', 'i', 'm',\n4, 'p', 'w', 'i', 'b', 5, 'p', 'w', 'i', 'b', 's', 4, 'p', 'w', 'i', 's', 5, 'p', 'w', 'i', 's', 's', 5, 'p', 'w', 'i', 'n', 'g', 4, 'p', 'w', 'i', 'j',\n4, 'p', 'w', 'i', 'c', 4, 'p', 'w', 'i', 'k', 4, 'p', 'w', 'i', 't', 4, 'p', 'w', 'i', 'p', 4, 'p', 'w', 'i', 'h', 3, 'p', 'y', 'u',\n4, 'p', 'y', 'u', 'g', 5, 'p', 'y', 'u', 'g', 'g', 5, 'p', 'y', 'u', 'g', 's', 4, 'p', 'y', 'u', 'n', 5, 'p', 'y', 'u', 'n', 'j', 5, 'p', 'y', 'u', 'n', 'h',\n4, 'p', 'y', 'u', 'd', 4, 'p', 'y', 'u', 'l', 5, 'p', 'y', 'u', 'l', 'g', 5, 'p', 'y', 'u', 'l', 'm', 5, 'p', 'y', 'u', 'l', 'b', 5, 'p', 'y', 'u', 'l', 's',\n5, 'p', 'y', 'u', 'l', 't', 5, 'p', 'y', 'u', 'l', 'p', 5, 'p', 'y', 'u', 'l', 'h', 4, 'p', 'y', 'u', 'm', 4, 'p', 'y', 'u', 'b', 5, 'p', 'y', 'u', 'b', 's',\n4, 'p', 'y', 'u', 's', 5, 'p', 'y', 'u', 's', 's', 5, 'p', 'y', 'u', 'n', 'g', 4, 'p', 'y', 'u', 'j', 4, 'p', 'y', 'u', 'c', 4, 'p', 'y', 'u', 'k',\n4, 'p', 'y', 'u', 't', 4, 'p', 'y', 'u', 'p', 4, 'p', 'y', 'u', 'h', 3, 'p', 'e', 'u', 4, 'p', 'e', 'u', 'g', 5, 'p', 'e', 'u', 'g', 'g',\n5, 'p', 'e', 'u', 'g', 's', 4, 'p', 'e', 'u', 'n', 5, 'p', 'e', 'u', 'n', 'j', 5, 'p', 'e', 'u', 'n', 'h', 4, 'p', 'e', 'u', 'd', 4, 'p', 'e', 'u', 'l',\n5, 'p', 'e', 'u', 'l', 'g', 5, 'p', 'e', 'u', 'l', 'm', 5, 'p', 'e', 'u', 'l', 'b', 5, 'p', 'e', 'u', 'l', 's', 5, 'p', 'e', 'u', 'l', 't', 5, 'p', 'e', 'u', 'l', 'p',\n5, 'p', 'e', 'u', 'l', 'h', 4, 'p', 'e', 'u', 'm', 4, 'p', 'e', 'u', 'b', 5, 'p', 'e', 'u', 'b', 's', 4, 'p', 'e', 'u', 's', 5, 'p', 'e', 'u', 's', 's',\n5, 'p', 'e', 'u', 'n', 'g', 4, 'p', 'e', 'u', 'j', 4, 'p', 'e', 'u', 'c', 4, 'p', 'e', 'u', 'k', 4, 'p', 'e', 'u', 't', 4, 'p', 'e', 'u', 'p',\n4, 'p', 'e', 'u', 'h', 3, 'p', 'y', 'i', 4, 'p', 'y', 'i', 'g', 5, 'p', 'y', 'i', 'g', 'g', 5, 'p', 'y', 'i', 'g', 's', 4, 'p', 'y', 'i', 'n',\n5, 'p', 'y', 'i', 'n', 'j', 5, 'p', 'y', 'i', 'n', 'h', 4, 'p', 'y', 'i', 'd', 4, 'p', 'y', 'i', 'l', 5, 'p', 'y', 'i', 'l', 'g', 5, 'p', 'y', 'i', 'l', 'm',\n5, 'p', 'y', 'i', 'l', 'b', 5, 'p', 'y', 'i', 'l', 's', 5, 'p', 'y', 'i', 'l', 't', 5, 'p', 'y', 'i', 'l', 'p', 5, 'p', 'y', 'i', 'l', 'h', 4, 'p', 'y', 'i', 'm',\n4, 'p', 'y', 'i', 'b', 5, 'p', 'y', 'i', 'b', 's', 4, 'p', 'y', 'i', 's', 5, 'p', 'y', 'i', 's', 's', 5, 'p', 'y', 'i', 'n', 'g', 4, 'p', 'y', 'i', 'j',\n4, 'p', 'y', 'i', 'c', 4, 'p', 'y', 'i', 'k', 4, 'p', 'y', 'i', 't', 4, 'p', 'y', 'i', 'p', 4, 'p', 'y', 'i', 'h', 2, 'p', 'i',\n3, 'p', 'i', 'g', 4, 'p', 'i', 'g', 'g', 4, 'p', 'i', 'g', 's', 3, 'p', 'i', 'n', 4, 'p', 'i', 'n', 'j', 4, 'p', 'i', 'n', 'h',\n3, 'p', 'i', 'd', 3, 'p', 'i', 'l', 4, 'p', 'i', 'l', 'g', 4, 'p', 'i', 'l', 'm', 4, 'p', 'i', 'l', 'b', 4, 'p', 'i', 'l', 's',\n4, 'p', 'i', 'l', 't', 4, 'p', 'i', 'l', 'p', 4, 'p', 'i', 'l', 'h', 3, 'p', 'i', 'm', 3, 'p', 'i', 'b', 4, 'p', 'i', 'b', 's',\n3, 'p', 'i', 's', 4, 'p', 'i', 's', 's', 4, 'p', 'i', 'n', 'g', 3, 'p', 'i', 'j', 3, 'p', 'i', 'c', 3, 'p', 'i', 'k',\n3, 'p', 'i', 't', 3, 'p', 'i', 'p', 3, 'p', 'i', 'h', 2, 'h', 'a', 3, 'h', 'a', 'g', 4, 'h', 'a', 'g', 'g',\n4, 'h', 'a', 'g', 's', 3, 'h', 'a', 'n', 4, 'h', 'a', 'n', 'j', 4, 'h', 'a', 'n', 'h', 3, 'h', 'a', 'd', 3, 'h', 'a', 'l',\n4, 'h', 'a', 'l', 'g', 4, 'h', 'a', 'l', 'm', 4, 'h', 'a', 'l', 'b', 4, 'h', 'a', 'l', 's', 4, 'h', 'a', 'l', 't', 4, 'h', 'a', 'l', 'p',\n4, 'h', 'a', 'l', 'h', 3, 'h', 'a', 'm', 3, 'h', 'a', 'b', 4, 'h', 'a', 'b', 's', 3, 'h', 'a', 's', 4, 'h', 'a', 's', 's',\n4, 'h', 'a', 'n', 'g', 3, 'h', 'a', 'j', 3, 'h', 'a', 'c', 3, 'h', 'a', 'k', 3, 'h', 'a', 't', 3, 'h', 'a', 'p',\n3, 'h', 'a', 'h', 3, 'h', 'a', 'e', 4, 'h', 'a', 'e', 'g', 5, 'h', 'a', 'e', 'g', 'g', 5, 'h', 'a', 'e', 'g', 's', 4, 'h', 'a', 'e', 'n',\n5, 'h', 'a', 'e', 'n', 'j', 5, 'h', 'a', 'e', 'n', 'h', 4, 'h', 'a', 'e', 'd', 4, 'h', 'a', 'e', 'l', 5, 'h', 'a', 'e', 'l', 'g', 5, 'h', 'a', 'e', 'l', 'm',\n5, 'h', 'a', 'e', 'l', 'b', 5, 'h', 'a', 'e', 'l', 's', 5, 'h', 'a', 'e', 'l', 't', 5, 'h', 'a', 'e', 'l', 'p', 5, 'h', 'a', 'e', 'l', 'h', 4, 'h', 'a', 'e', 'm',\n4, 'h', 'a', 'e', 'b', 5, 'h', 'a', 'e', 'b', 's', 4, 'h', 'a', 'e', 's', 5, 'h', 'a', 'e', 's', 's', 5, 'h', 'a', 'e', 'n', 'g', 4, 'h', 'a', 'e', 'j',\n4, 'h', 'a', 'e', 'c', 4, 'h', 'a', 'e', 'k', 4, 'h', 'a', 'e', 't', 4, 'h', 'a', 'e', 'p', 4, 'h', 'a', 'e', 'h', 3, 'h', 'y', 'a',\n4, 'h', 'y', 'a', 'g', 5, 'h', 'y', 'a', 'g', 'g', 5, 'h', 'y', 'a', 'g', 's', 4, 'h', 'y', 'a', 'n', 5, 'h', 'y', 'a', 'n', 'j', 5, 'h', 'y', 'a', 'n', 'h',\n4, 'h', 'y', 'a', 'd', 4, 'h', 'y', 'a', 'l', 5, 'h', 'y', 'a', 'l', 'g', 5, 'h', 'y', 'a', 'l', 'm', 5, 'h', 'y', 'a', 'l', 'b', 5, 'h', 'y', 'a', 'l', 's',\n5, 'h', 'y', 'a', 'l', 't', 5, 'h', 'y', 'a', 'l', 'p', 5, 'h', 'y', 'a', 'l', 'h', 4, 'h', 'y', 'a', 'm', 4, 'h', 'y', 'a', 'b', 5, 'h', 'y', 'a', 'b', 's',\n4, 'h', 'y', 'a', 's', 5, 'h', 'y', 'a', 's', 's', 5, 'h', 'y', 'a', 'n', 'g', 4, 'h', 'y', 'a', 'j', 4, 'h', 'y', 'a', 'c', 4, 'h', 'y', 'a', 'k',\n4, 'h', 'y', 'a', 't', 4, 'h', 'y', 'a', 'p', 4, 'h', 'y', 'a', 'h', 4, 'h', 'y', 'a', 'e', 5, 'h', 'y', 'a', 'e', 'g', 6, 'h', 'y', 'a', 'e', 'g', 'g',\n6, 'h', 'y', 'a', 'e', 'g', 's', 5, 'h', 'y', 'a', 'e', 'n', 6, 'h', 'y', 'a', 'e', 'n', 'j', 6, 'h', 'y', 'a', 'e', 'n', 'h', 5, 'h', 'y', 'a', 'e', 'd', 5, 'h', 'y', 'a', 'e', 'l',\n6, 'h', 'y', 'a', 'e', 'l', 'g', 6, 'h', 'y', 'a', 'e', 'l', 'm', 6, 'h', 'y', 'a', 'e', 'l', 'b', 6, 'h', 'y', 'a', 'e', 'l', 's', 6, 'h', 'y', 'a', 'e', 'l', 't', 6, 'h', 'y', 'a', 'e', 'l', 'p',\n6, 'h', 'y', 'a', 'e', 'l', 'h', 5, 'h', 'y', 'a', 'e', 'm', 5, 'h', 'y', 'a', 'e', 'b', 6, 'h', 'y', 'a', 'e', 'b', 's', 5, 'h', 'y', 'a', 'e', 's', 6, 'h', 'y', 'a', 'e', 's', 's',\n6, 'h', 'y', 'a', 'e', 'n', 'g', 5, 'h', 'y', 'a', 'e', 'j', 5, 'h', 'y', 'a', 'e', 'c', 5, 'h', 'y', 'a', 'e', 'k', 5, 'h', 'y', 'a', 'e', 't', 5, 'h', 'y', 'a', 'e', 'p',\n5, 'h', 'y', 'a', 'e', 'h', 3, 'h', 'e', 'o', 4, 'h', 'e', 'o', 'g', 5, 'h', 'e', 'o', 'g', 'g', 5, 'h', 'e', 'o', 'g', 's', 4, 'h', 'e', 'o', 'n',\n5, 'h', 'e', 'o', 'n', 'j', 5, 'h', 'e', 'o', 'n', 'h', 4, 'h', 'e', 'o', 'd', 4, 'h', 'e', 'o', 'l', 5, 'h', 'e', 'o', 'l', 'g', 5, 'h', 'e', 'o', 'l', 'm',\n5, 'h', 'e', 'o', 'l', 'b', 5, 'h', 'e', 'o', 'l', 's', 5, 'h', 'e', 'o', 'l', 't', 5, 'h', 'e', 'o', 'l', 'p', 5, 'h', 'e', 'o', 'l', 'h', 4, 'h', 'e', 'o', 'm',\n4, 'h', 'e', 'o', 'b', 5, 'h', 'e', 'o', 'b', 's', 4, 'h', 'e', 'o', 's', 5, 'h', 'e', 'o', 's', 's', 5, 'h', 'e', 'o', 'n', 'g', 4, 'h', 'e', 'o', 'j',\n4, 'h', 'e', 'o', 'c', 4, 'h', 'e', 'o', 'k', 4, 'h', 'e', 'o', 't', 4, 'h', 'e', 'o', 'p', 4, 'h', 'e', 'o', 'h', 2, 'h', 'e',\n3, 'h', 'e', 'g', 4, 'h', 'e', 'g', 'g', 4, 'h', 'e', 'g', 's', 3, 'h', 'e', 'n', 4, 'h', 'e', 'n', 'j', 4, 'h', 'e', 'n', 'h',\n3, 'h', 'e', 'd', 3, 'h', 'e', 'l', 4, 'h', 'e', 'l', 'g', 4, 'h', 'e', 'l', 'm', 4, 'h', 'e', 'l', 'b', 4, 'h', 'e', 'l', 's',\n4, 'h', 'e', 'l', 't', 4, 'h', 'e', 'l', 'p', 4, 'h', 'e', 'l', 'h', 3, 'h', 'e', 'm', 3, 'h', 'e', 'b', 4, 'h', 'e', 'b', 's',\n3, 'h', 'e', 's', 4, 'h', 'e', 's', 's', 4, 'h', 'e', 'n', 'g', 3, 'h', 'e', 'j', 3, 'h', 'e', 'c', 3, 'h', 'e', 'k',\n3, 'h', 'e', 't', 3, 'h', 'e', 'p', 3, 'h', 'e', 'h', 4, 'h', 'y', 'e', 'o', 5, 'h', 'y', 'e', 'o', 'g', 6, 'h', 'y', 'e', 'o', 'g', 'g',\n6, 'h', 'y', 'e', 'o', 'g', 's', 5, 'h', 'y', 'e', 'o', 'n', 6, 'h', 'y', 'e', 'o', 'n', 'j', 6, 'h', 'y', 'e', 'o', 'n', 'h', 5, 'h', 'y', 'e', 'o', 'd', 5, 'h', 'y', 'e', 'o', 'l',\n6, 'h', 'y', 'e', 'o', 'l', 'g', 6, 'h', 'y', 'e', 'o', 'l', 'm', 6, 'h', 'y', 'e', 'o', 'l', 'b', 6, 'h', 'y', 'e', 'o', 'l', 's', 6, 'h', 'y', 'e', 'o', 'l', 't', 6, 'h', 'y', 'e', 'o', 'l', 'p',\n6, 'h', 'y', 'e', 'o', 'l', 'h', 5, 'h', 'y', 'e', 'o', 'm', 5, 'h', 'y', 'e', 'o', 'b', 6, 'h', 'y', 'e', 'o', 'b', 's', 5, 'h', 'y', 'e', 'o', 's', 6, 'h', 'y', 'e', 'o', 's', 's',\n6, 'h', 'y', 'e', 'o', 'n', 'g', 5, 'h', 'y', 'e', 'o', 'j', 5, 'h', 'y', 'e', 'o', 'c', 5, 'h', 'y', 'e', 'o', 'k', 5, 'h', 'y', 'e', 'o', 't', 5, 'h', 'y', 'e', 'o', 'p',\n5, 'h', 'y', 'e', 'o', 'h', 3, 'h', 'y', 'e', 4, 'h', 'y', 'e', 'g', 5, 'h', 'y', 'e', 'g', 'g', 5, 'h', 'y', 'e', 'g', 's', 4, 'h', 'y', 'e', 'n',\n5, 'h', 'y', 'e', 'n', 'j', 5, 'h', 'y', 'e', 'n', 'h', 4, 'h', 'y', 'e', 'd', 4, 'h', 'y', 'e', 'l', 5, 'h', 'y', 'e', 'l', 'g', 5, 'h', 'y', 'e', 'l', 'm',\n5, 'h', 'y', 'e', 'l', 'b', 5, 'h', 'y', 'e', 'l', 's', 5, 'h', 'y', 'e', 'l', 't', 5, 'h', 'y', 'e', 'l', 'p', 5, 'h', 'y', 'e', 'l', 'h', 4, 'h', 'y', 'e', 'm',\n4, 'h', 'y', 'e', 'b', 5, 'h', 'y', 'e', 'b', 's', 4, 'h', 'y', 'e', 's', 5, 'h', 'y', 'e', 's', 's', 5, 'h', 'y', 'e', 'n', 'g', 4, 'h', 'y', 'e', 'j',\n4, 'h', 'y', 'e', 'c', 4, 'h', 'y', 'e', 'k', 4, 'h', 'y', 'e', 't', 4, 'h', 'y', 'e', 'p', 4, 'h', 'y', 'e', 'h', 2, 'h', 'o',\n3, 'h', 'o', 'g', 4, 'h', 'o', 'g', 'g', 4, 'h', 'o', 'g', 's', 3, 'h', 'o', 'n', 4, 'h', 'o', 'n', 'j', 4, 'h', 'o', 'n', 'h',\n3, 'h', 'o', 'd', 3, 'h', 'o', 'l', 4, 'h', 'o', 'l', 'g', 4, 'h', 'o', 'l', 'm', 4, 'h', 'o', 'l', 'b', 4, 'h', 'o', 'l', 's',\n4, 'h', 'o', 'l', 't', 4, 'h', 'o', 'l', 'p', 4, 'h', 'o', 'l', 'h', 3, 'h', 'o', 'm', 3, 'h', 'o', 'b', 4, 'h', 'o', 'b', 's',\n3, 'h', 'o', 's', 4, 'h', 'o', 's', 's', 4, 'h', 'o', 'n', 'g', 3, 'h', 'o', 'j', 3, 'h', 'o', 'c', 3, 'h', 'o', 'k',\n3, 'h', 'o', 't', 3, 'h', 'o', 'p', 3, 'h', 'o', 'h', 3, 'h', 'w', 'a', 4, 'h', 'w', 'a', 'g', 5, 'h', 'w', 'a', 'g', 'g',\n5, 'h', 'w', 'a', 'g', 's', 4, 'h', 'w', 'a', 'n', 5, 'h', 'w', 'a', 'n', 'j', 5, 'h', 'w', 'a', 'n', 'h', 4, 'h', 'w', 'a', 'd', 4, 'h', 'w', 'a', 'l',\n5, 'h', 'w', 'a', 'l', 'g', 5, 'h', 'w', 'a', 'l', 'm', 5, 'h', 'w', 'a', 'l', 'b', 5, 'h', 'w', 'a', 'l', 's', 5, 'h', 'w', 'a', 'l', 't', 5, 'h', 'w', 'a', 'l', 'p',\n5, 'h', 'w', 'a', 'l', 'h', 4, 'h', 'w', 'a', 'm', 4, 'h', 'w', 'a', 'b', 5, 'h', 'w', 'a', 'b', 's', 4, 'h', 'w', 'a', 's', 5, 'h', 'w', 'a', 's', 's',\n5, 'h', 'w', 'a', 'n', 'g', 4, 'h', 'w', 'a', 'j', 4, 'h', 'w', 'a', 'c', 4, 'h', 'w', 'a', 'k', 4, 'h', 'w', 'a', 't', 4, 'h', 'w', 'a', 'p',\n4, 'h', 'w', 'a', 'h', 4, 'h', 'w', 'a', 'e', 5, 'h', 'w', 'a', 'e', 'g', 6, 'h', 'w', 'a', 'e', 'g', 'g', 6, 'h', 'w', 'a', 'e', 'g', 's', 5, 'h', 'w', 'a', 'e', 'n',\n6, 'h', 'w', 'a', 'e', 'n', 'j', 6, 'h', 'w', 'a', 'e', 'n', 'h', 5, 'h', 'w', 'a', 'e', 'd', 5, 'h', 'w', 'a', 'e', 'l', 6, 'h', 'w', 'a', 'e', 'l', 'g', 6, 'h', 'w', 'a', 'e', 'l', 'm',\n6, 'h', 'w', 'a', 'e', 'l', 'b', 6, 'h', 'w', 'a', 'e', 'l', 's', 6, 'h', 'w', 'a', 'e', 'l', 't', 6, 'h', 'w', 'a', 'e', 'l', 'p', 6, 'h', 'w', 'a', 'e', 'l', 'h', 5, 'h', 'w', 'a', 'e', 'm',\n5, 'h', 'w', 'a', 'e', 'b', 6, 'h', 'w', 'a', 'e', 'b', 's', 5, 'h', 'w', 'a', 'e', 's', 6, 'h', 'w', 'a', 'e', 's', 's', 6, 'h', 'w', 'a', 'e', 'n', 'g', 5, 'h', 'w', 'a', 'e', 'j',\n5, 'h', 'w', 'a', 'e', 'c', 5, 'h', 'w', 'a', 'e', 'k', 5, 'h', 'w', 'a', 'e', 't', 5, 'h', 'w', 'a', 'e', 'p', 5, 'h', 'w', 'a', 'e', 'h', 3, 'h', 'o', 'e',\n4, 'h', 'o', 'e', 'g', 5, 'h', 'o', 'e', 'g', 'g', 5, 'h', 'o', 'e', 'g', 's', 4, 'h', 'o', 'e', 'n', 5, 'h', 'o', 'e', 'n', 'j', 5, 'h', 'o', 'e', 'n', 'h',\n4, 'h', 'o', 'e', 'd', 4, 'h', 'o', 'e', 'l', 5, 'h', 'o', 'e', 'l', 'g', 5, 'h', 'o', 'e', 'l', 'm', 5, 'h', 'o', 'e', 'l', 'b', 5, 'h', 'o', 'e', 'l', 's',\n5, 'h', 'o', 'e', 'l', 't', 5, 'h', 'o', 'e', 'l', 'p', 5, 'h', 'o', 'e', 'l', 'h', 4, 'h', 'o', 'e', 'm', 4, 'h', 'o', 'e', 'b', 5, 'h', 'o', 'e', 'b', 's',\n4, 'h', 'o', 'e', 's', 5, 'h', 'o', 'e', 's', 's', 5, 'h', 'o', 'e', 'n', 'g', 4, 'h', 'o', 'e', 'j', 4, 'h', 'o', 'e', 'c', 4, 'h', 'o', 'e', 'k',\n4, 'h', 'o', 'e', 't', 4, 'h', 'o', 'e', 'p', 4, 'h', 'o', 'e', 'h', 3, 'h', 'y', 'o', 4, 'h', 'y', 'o', 'g', 5, 'h', 'y', 'o', 'g', 'g',\n5, 'h', 'y', 'o', 'g', 's', 4, 'h', 'y', 'o', 'n', 5, 'h', 'y', 'o', 'n', 'j', 5, 'h', 'y', 'o', 'n', 'h', 4, 'h', 'y', 'o', 'd', 4, 'h', 'y', 'o', 'l',\n5, 'h', 'y', 'o', 'l', 'g', 5, 'h', 'y', 'o', 'l', 'm', 5, 'h', 'y', 'o', 'l', 'b', 5, 'h', 'y', 'o', 'l', 's', 5, 'h', 'y', 'o', 'l', 't', 5, 'h', 'y', 'o', 'l', 'p',\n5, 'h', 'y', 'o', 'l', 'h', 4, 'h', 'y', 'o', 'm', 4, 'h', 'y', 'o', 'b', 5, 'h', 'y', 'o', 'b', 's', 4, 'h', 'y', 'o', 's', 5, 'h', 'y', 'o', 's', 's',\n5, 'h', 'y', 'o', 'n', 'g', 4, 'h', 'y', 'o', 'j', 4, 'h', 'y', 'o', 'c', 4, 'h', 'y', 'o', 'k', 4, 'h', 'y', 'o', 't', 4, 'h', 'y', 'o', 'p',\n4, 'h', 'y', 'o', 'h', 2, 'h', 'u', 3, 'h', 'u', 'g', 4, 'h', 'u', 'g', 'g', 4, 'h', 'u', 'g', 's', 3, 'h', 'u', 'n',\n4, 'h', 'u', 'n', 'j', 4, 'h', 'u', 'n', 'h', 3, 'h', 'u', 'd', 3, 'h', 'u', 'l', 4, 'h', 'u', 'l', 'g', 4, 'h', 'u', 'l', 'm',\n4, 'h', 'u', 'l', 'b', 4, 'h', 'u', 'l', 's', 4, 'h', 'u', 'l', 't', 4, 'h', 'u', 'l', 'p', 4, 'h', 'u', 'l', 'h', 3, 'h', 'u', 'm',\n3, 'h', 'u', 'b', 4, 'h', 'u', 'b', 's', 3, 'h', 'u', 's', 4, 'h', 'u', 's', 's', 4, 'h', 'u', 'n', 'g', 3, 'h', 'u', 'j',\n3, 'h', 'u', 'c', 3, 'h', 'u', 'k', 3, 'h', 'u', 't', 3, 'h', 'u', 'p', 3, 'h', 'u', 'h', 4, 'h', 'w', 'e', 'o',\n5, 'h', 'w', 'e', 'o', 'g', 6, 'h', 'w', 'e', 'o', 'g', 'g', 6, 'h', 'w', 'e', 'o', 'g', 's', 5, 'h', 'w', 'e', 'o', 'n', 6, 'h', 'w', 'e', 'o', 'n', 'j', 6, 'h', 'w', 'e', 'o', 'n', 'h',\n5, 'h', 'w', 'e', 'o', 'd', 5, 'h', 'w', 'e', 'o', 'l', 6, 'h', 'w', 'e', 'o', 'l', 'g', 6, 'h', 'w', 'e', 'o', 'l', 'm', 6, 'h', 'w', 'e', 'o', 'l', 'b', 6, 'h', 'w', 'e', 'o', 'l', 's',\n6, 'h', 'w', 'e', 'o', 'l', 't', 6, 'h', 'w', 'e', 'o', 'l', 'p', 6, 'h', 'w', 'e', 'o', 'l', 'h', 5, 'h', 'w', 'e', 'o', 'm', 5, 'h', 'w', 'e', 'o', 'b', 6, 'h', 'w', 'e', 'o', 'b', 's',\n5, 'h', 'w', 'e', 'o', 's', 6, 'h', 'w', 'e', 'o', 's', 's', 6, 'h', 'w', 'e', 'o', 'n', 'g', 5, 'h', 'w', 'e', 'o', 'j', 5, 'h', 'w', 'e', 'o', 'c', 5, 'h', 'w', 'e', 'o', 'k',\n5, 'h', 'w', 'e', 'o', 't', 5, 'h', 'w', 'e', 'o', 'p', 5, 'h', 'w', 'e', 'o', 'h', 3, 'h', 'w', 'e', 4, 'h', 'w', 'e', 'g', 5, 'h', 'w', 'e', 'g', 'g',\n5, 'h', 'w', 'e', 'g', 's', 4, 'h', 'w', 'e', 'n', 5, 'h', 'w', 'e', 'n', 'j', 5, 'h', 'w', 'e', 'n', 'h', 4, 'h', 'w', 'e', 'd', 4, 'h', 'w', 'e', 'l',\n5, 'h', 'w', 'e', 'l', 'g', 5, 'h', 'w', 'e', 'l', 'm', 5, 'h', 'w', 'e', 'l', 'b', 5, 'h', 'w', 'e', 'l', 's', 5, 'h', 'w', 'e', 'l', 't', 5, 'h', 'w', 'e', 'l', 'p',\n5, 'h', 'w', 'e', 'l', 'h', 4, 'h', 'w', 'e', 'm', 4, 'h', 'w', 'e', 'b', 5, 'h', 'w', 'e', 'b', 's', 4, 'h', 'w', 'e', 's', 5, 'h', 'w', 'e', 's', 's',\n5, 'h', 'w', 'e', 'n', 'g', 4, 'h', 'w', 'e', 'j', 4, 'h', 'w', 'e', 'c', 4, 'h', 'w', 'e', 'k', 4, 'h', 'w', 'e', 't', 4, 'h', 'w', 'e', 'p',\n4, 'h', 'w', 'e', 'h', 3, 'h', 'w', 'i', 4, 'h', 'w', 'i', 'g', 5, 'h', 'w', 'i', 'g', 'g', 5, 'h', 'w', 'i', 'g', 's', 4, 'h', 'w', 'i', 'n',\n5, 'h', 'w', 'i', 'n', 'j', 5, 'h', 'w', 'i', 'n', 'h', 4, 'h', 'w', 'i', 'd', 4, 'h', 'w', 'i', 'l', 5, 'h', 'w', 'i', 'l', 'g', 5, 'h', 'w', 'i', 'l', 'm',\n5, 'h', 'w', 'i', 'l', 'b', 5, 'h', 'w', 'i', 'l', 's', 5, 'h', 'w', 'i', 'l', 't', 5, 'h', 'w', 'i', 'l', 'p', 5, 'h', 'w', 'i', 'l', 'h', 4, 'h', 'w', 'i', 'm',\n4, 'h', 'w', 'i', 'b', 5, 'h', 'w', 'i', 'b', 's', 4, 'h', 'w', 'i', 's', 5, 'h', 'w', 'i', 's', 's', 5, 'h', 'w', 'i', 'n', 'g', 4, 'h', 'w', 'i', 'j',\n4, 'h', 'w', 'i', 'c', 4, 'h', 'w', 'i', 'k', 4, 'h', 'w', 'i', 't', 4, 'h', 'w', 'i', 'p', 4, 'h', 'w', 'i', 'h', 3, 'h', 'y', 'u',\n4, 'h', 'y', 'u', 'g', 5, 'h', 'y', 'u', 'g', 'g', 5, 'h', 'y', 'u', 'g', 's', 4, 'h', 'y', 'u', 'n', 5, 'h', 'y', 'u', 'n', 'j', 5, 'h', 'y', 'u', 'n', 'h',\n4, 'h', 'y', 'u', 'd', 4, 'h', 'y', 'u', 'l', 5, 'h', 'y', 'u', 'l', 'g', 5, 'h', 'y', 'u', 'l', 'm', 5, 'h', 'y', 'u', 'l', 'b', 5, 'h', 'y', 'u', 'l', 's',\n5, 'h', 'y', 'u', 'l', 't', 5, 'h', 'y', 'u', 'l', 'p', 5, 'h', 'y', 'u', 'l', 'h', 4, 'h', 'y', 'u', 'm', 4, 'h', 'y', 'u', 'b', 5, 'h', 'y', 'u', 'b', 's',\n4, 'h', 'y', 'u', 's', 5, 'h', 'y', 'u', 's', 's', 5, 'h', 'y', 'u', 'n', 'g', 4, 'h', 'y', 'u', 'j', 4, 'h', 'y', 'u', 'c', 4, 'h', 'y', 'u', 'k',\n4, 'h', 'y', 'u', 't', 4, 'h', 'y', 'u', 'p', 4, 'h', 'y', 'u', 'h', 3, 'h', 'e', 'u', 4, 'h', 'e', 'u', 'g', 5, 'h', 'e', 'u', 'g', 'g',\n5, 'h', 'e', 'u', 'g', 's', 4, 'h', 'e', 'u', 'n', 5, 'h', 'e', 'u', 'n', 'j', 5, 'h', 'e', 'u', 'n', 'h', 4, 'h', 'e', 'u', 'd', 4, 'h', 'e', 'u', 'l',\n5, 'h', 'e', 'u', 'l', 'g', 5, 'h', 'e', 'u', 'l', 'm', 5, 'h', 'e', 'u', 'l', 'b', 5, 'h', 'e', 'u', 'l', 's', 5, 'h', 'e', 'u', 'l', 't', 5, 'h', 'e', 'u', 'l', 'p',\n5, 'h', 'e', 'u', 'l', 'h', 4, 'h', 'e', 'u', 'm', 4, 'h', 'e', 'u', 'b', 5, 'h', 'e', 'u', 'b', 's', 4, 'h', 'e', 'u', 's', 5, 'h', 'e', 'u', 's', 's',\n5, 'h', 'e', 'u', 'n', 'g', 4, 'h', 'e', 'u', 'j', 4, 'h', 'e', 'u', 'c', 4, 'h', 'e', 'u', 'k', 4, 'h', 'e', 'u', 't', 4, 'h', 'e', 'u', 'p',\n4, 'h', 'e', 'u', 'h', 3, 'h', 'y', 'i', 4, 'h', 'y', 'i', 'g', 5, 'h', 'y', 'i', 'g', 'g', 5, 'h', 'y', 'i', 'g', 's', 4, 'h', 'y', 'i', 'n',\n5, 'h', 'y', 'i', 'n', 'j', 5, 'h', 'y', 'i', 'n', 'h', 4, 'h', 'y', 'i', 'd', 4, 'h', 'y', 'i', 'l', 5, 'h', 'y', 'i', 'l', 'g', 5, 'h', 'y', 'i', 'l', 'm',\n5, 'h', 'y', 'i', 'l', 'b', 5, 'h', 'y', 'i', 'l', 's', 5, 'h', 'y', 'i', 'l', 't', 5, 'h', 'y', 'i', 'l', 'p', 5, 'h', 'y', 'i', 'l', 'h', 4, 'h', 'y', 'i', 'm',\n4, 'h', 'y', 'i', 'b', 5, 'h', 'y', 'i', 'b', 's', 4, 'h', 'y', 'i', 's', 5, 'h', 'y', 'i', 's', 's', 5, 'h', 'y', 'i', 'n', 'g', 4, 'h', 'y', 'i', 'j',\n4, 'h', 'y', 'i', 'c', 4, 'h', 'y', 'i', 'k', 4, 'h', 'y', 'i', 't', 4, 'h', 'y', 'i', 'p', 4, 'h', 'y', 'i', 'h', 2, 'h', 'i',\n3, 'h', 'i', 'g', 4, 'h', 'i', 'g', 'g', 4, 'h', 'i', 'g', 's', 3, 'h', 'i', 'n', 4, 'h', 'i', 'n', 'j', 4, 'h', 'i', 'n', 'h',\n3, 'h', 'i', 'd', 3, 'h', 'i', 'l', 4, 'h', 'i', 'l', 'g', 4, 'h', 'i', 'l', 'm', 4, 'h', 'i', 'l', 'b', 4, 'h', 'i', 'l', 's',\n4, 'h', 'i', 'l', 't', 4, 'h', 'i', 'l', 'p', 4, 'h', 'i', 'l', 'h', 3, 'h', 'i', 'm', 3, 'h', 'i', 'b', 4, 'h', 'i', 'b', 's',\n3, 'h', 'i', 's', 4, 'h', 'i', 's', 's', 4, 'h', 'i', 'n', 'g', 3, 'h', 'i', 'j', 3, 'h', 'i', 'c', 3, 'h', 'i', 'k',\n3, 'h', 'i', 't', 3, 'h', 'i', 'p', 3, 'h', 'i', 'h', 4, 'K', 'a', 'y', ' ', 6, 'K', 'a', 'y', 'n', 'g', ' ', 3, 'K', 'e', ' ',\n3, 'K', 'o', ' ', 4, 'K', 'o', 'l', ' ', 4, 'K', 'o', 'c', ' ', 4, 'K', 'w', 'i', ' ', 4, 'K', 'w', 'i', ' ', 5, 'K', 'y', 'u', 'n', ' ',\n4, 'K', 'u', 'l', ' ', 4, 'K', 'u', 'm', ' ', 3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 3, 'L', 'a', ' ',\n3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 3, 'N', 'a', ' ', 4, 'N', 'a', 'k', ' ',\n4, 'N', 'a', 'k', ' ', 4, 'N', 'a', 'k', ' ', 4, 'N', 'a', 'k', ' ', 4, 'N', 'a', 'k', ' ', 4, 'N', 'a', 'k', ' ', 4, 'N', 'a', 'k', ' ',\n4, 'N', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ', 4, 'N', 'a', 'n', ' ',\n4, 'N', 'a', 'm', ' ', 4, 'N', 'a', 'm', ' ', 4, 'N', 'a', 'm', ' ', 4, 'N', 'a', 'm', ' ', 4, 'N', 'a', 'p', ' ', 4, 'N', 'a', 'p', ' ',\n4, 'N', 'a', 'p', ' ', 5, 'N', 'a', 'n', 'g', ' ', 5, 'N', 'a', 'n', 'g', ' ', 5, 'N', 'a', 'n', 'g', ' ', 5, 'N', 'a', 'n', 'g', ' ', 5, 'N', 'a', 'n', 'g', ' ',\n4, 'N', 'a', 'y', ' ', 6, 'N', 'a', 'y', 'n', 'g', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ',\n3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 3, 'N', 'o', ' ',\n3, 'N', 'o', ' ', 3, 'N', 'o', ' ', 4, 'N', 'o', 'k', ' ', 4, 'N', 'o', 'k', ' ', 4, 'N', 'o', 'k', ' ', 4, 'N', 'o', 'k', ' ',\n4, 'N', 'o', 'k', ' ', 4, 'N', 'o', 'k', ' ', 4, 'N', 'o', 'n', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'N', 'o', 'n', 'g', ' ', 5, 'N', 'o', 'n', 'g', ' ',\n5, 'N', 'o', 'n', 'g', ' ', 4, 'N', 'o', 'y', ' ', 4, 'N', 'o', 'y', ' ', 4, 'N', 'o', 'y', ' ', 4, 'N', 'o', 'y', ' ', 4, 'N', 'w', 'u', ' ',\n4, 'N', 'w', 'u', ' ', 4, 'N', 'w', 'u', ' ', 4, 'N', 'w', 'u', ' ', 4, 'N', 'w', 'u', ' ', 4, 'N', 'w', 'u', ' ', 4, 'N', 'w', 'u', ' ',\n4, 'N', 'w', 'u', ' ', 4, 'N', 'u', 'k', ' ', 4, 'N', 'u', 'k', ' ', 4, 'N', 'u', 'm', ' ', 5, 'N', 'u', 'n', 'g', ' ', 5, 'N', 'u', 'n', 'g', ' ',\n5, 'N', 'u', 'n', 'g', ' ', 5, 'N', 'u', 'n', 'g', ' ', 5, 'N', 'u', 'n', 'g', ' ', 4, 'T', 'w', 'u', ' ', 3, 'L', 'a', ' ', 4, 'L', 'a', 'k', ' ',\n4, 'L', 'a', 'k', ' ', 4, 'L', 'a', 'n', ' ', 6, 'L', 'y', 'e', 'n', 'g', ' ', 3, 'L', 'o', ' ', 5, 'L', 'y', 'u', 'l', ' ', 3, 'L', 'i', ' ',\n4, 'P', 'e', 'y', ' ', 4, 'P', 'e', 'n', ' ', 5, 'P', 'y', 'e', 'n', ' ', 4, 'P', 'w', 'u', ' ', 5, 'P', 'w', 'u', 'l', ' ', 3, 'P', 'i', ' ',\n4, 'S', 'a', 'k', ' ', 4, 'S', 'a', 'k', ' ', 4, 'S', 'a', 'm', ' ', 5, 'S', 'a', 'y', 'k', ' ', 6, 'S', 'a', 'y', 'n', 'g', ' ', 4, 'S', 'e', 'p', ' ',\n4, 'S', 'e', 'y', ' ', 5, 'S', 'w', 'a', 'y', ' ', 4, 'S', 'i', 'n', ' ', 4, 'S', 'i', 'm', ' ', 4, 'S', 'i', 'p', ' ', 3, 'Y', 'a', ' ',\n4, 'Y', 'a', 'k', ' ', 4, 'Y', 'a', 'k', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ',\n5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 5, 'Y', 'a', 'n', 'g', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ',\n3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ',\n3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 3, 'Y', 'e', ' ', 4, 'Y', 'e', 'k', ' ', 4, 'Y', 'e', 'k', ' ', 4, 'Y', 'e', 'k', ' ',\n4, 'Y', 'e', 'k', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ',\n4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ',\n4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'n', ' ', 4, 'Y', 'e', 'l', ' ', 4, 'Y', 'e', 'l', ' ', 4, 'Y', 'e', 'l', ' ',\n4, 'Y', 'e', 'l', ' ', 4, 'Y', 'e', 'l', ' ', 4, 'Y', 'e', 'l', ' ', 4, 'Y', 'e', 'm', ' ', 4, 'Y', 'e', 'm', ' ', 4, 'Y', 'e', 'm', ' ',\n4, 'Y', 'e', 'm', ' ', 4, 'Y', 'e', 'm', ' ', 4, 'Y', 'e', 'p', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ',\n5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ',\n5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 5, 'Y', 'e', 'n', 'g', ' ', 4, 'Y', 'e', 'y', ' ', 4, 'Y', 'e', 'y', ' ',\n4, 'Y', 'e', 'y', ' ', 4, 'Y', 'e', 'y', ' ', 2, 'O', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ',\n3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ', 3, 'Y', 'o', ' ',\n3, 'Y', 'o', ' ', 5, 'Y', 'o', 'n', 'g', ' ', 4, 'W', 'u', 'n', ' ', 4, 'W', 'e', 'n', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ',\n3, 'Y', 'u', ' ', 3, 'Y', 'u', ' ', 4, 'Y', 'u', 'k', ' ', 4, 'Y', 'u', 'k', ' ', 4, 'Y', 'u', 'k', ' ', 4, 'Y', 'u', 'n', ' ',\n4, 'Y', 'u', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Y', 'u', 'n', ' ', 4, 'Y', 'u', 'l', ' ', 4, 'Y', 'u', 'l', ' ', 4, 'Y', 'u', 'l', ' ',\n4, 'Y', 'u', 'l', ' ', 5, 'Y', 'u', 'n', 'g', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ',\n2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ',\n2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 2, 'I', ' ', 3, 'I', 'k', ' ', 3, 'I', 'k', ' ',\n3, 'I', 'n', ' ', 3, 'I', 'n', ' ', 3, 'I', 'n', ' ', 3, 'I', 'n', ' ', 3, 'I', 'n', ' ', 3, 'I', 'n', ' ',\n3, 'I', 'n', ' ', 3, 'I', 'm', ' ', 3, 'I', 'm', ' ', 3, 'I', 'm', ' ', 3, 'I', 'p', ' ', 3, 'I', 'p', ' ',\n3, 'I', 'p', ' ', 5, 'C', 'a', 'n', 'g', ' ', 4, 'C', 'e', 'k', ' ', 3, 'C', 'i', ' ', 4, 'C', 'i', 'p', ' ', 4, 'C', 'h', 'a', ' ',\n5, 'C', 'h', 'e', 'k', ' ', 5, 'C', 'h', 'e', 'y', ' ', 5, 'T', 'h', 'a', 'k', ' ', 5, 'T', 'h', 'a', 'k', ' ', 6, 'T', 'h', 'a', 'n', 'g', ' ', 6, 'T', 'h', 'a', 'y', 'k', ' ',\n6, 'T', 'h', 'o', 'n', 'g', ' ', 4, 'P', 'h', 'o', ' ', 5, 'P', 'h', 'o', 'k', ' ', 5, 'H', 'a', 'n', 'g', ' ', 5, 'H', 'a', 'n', 'g', ' ', 5, 'H', 'y', 'e', 'n', ' ',\n5, 'H', 'w', 'a', 'k', ' ', 3, 'W', 'u', ' ', 4, 'H', 'u', 'o', ' ', 6, 'Z', 'h', 'o', 'n', 'g', ' ', 5, 'Q', 'i', 'n', 'g', ' ', 3, 'X', 'i', ' ',\n4, 'Z', 'h', 'u', ' ', 3, 'Y', 'i', ' ', 3, 'L', 'i', ' ', 5, 'S', 'h', 'e', 'n', ' ', 6, 'X', 'i', 'a', 'n', 'g', ' ', 3, 'F', 'u', ' ',\n5, 'J', 'i', 'n', 'g', ' ', 5, 'J', 'i', 'n', 'g', ' ', 3, 'Y', 'u', ' ', 5, 'H', 'a', 'g', 'i', ' ', 4, 'Z', 'h', 'u', ' ', 3, 'Y', 'i', ' ',\n3, 'D', 'u', ' ', 4, 'F', 'a', 'n', ' ', 3, 'S', 'i', ' ', 5, 'G', 'u', 'a', 'n', ' ', 2, 'f', 'f', 2, 'f', 'i',\n2, 'f', 'l', 3, 'f', 'f', 'i', 3, 'f', 'f', 'l', 2, 's', 't', 2, 's', 't', 2, 'm', 'n',\n2, 'm', 'e', 2, 'm', 'i', 2, 'v', 'n', 3, 'm', 'k', 'h', 1, 'i', 2, 'A', 'Y',\n1, '`', 1, 'A', 1, 'd', 1, 'h', 2, 'K', 'H', 1, 'l',\n1, 'm', 1, 'r', 1, 't', 1, '+', 2, 'S', 'H', 1, 'S',\n2, 'S', 'H', 1, 'S', 1, 'a', 1, 'a', 1, 'A', 1, 'b',\n1, 'g', 1, 'd', 1, 'h', 1, 'v', 1, 'z', 1, 't',\n1, 'y', 2, 'K', 'H', 2, 'K', 'H', 1, 'l', 1, 'm', 1, 'n',\n1, 's', 1, 'p', 1, 'p', 2, 'T', 'S', 1, 'k', 1, 'r',\n2, 'S', 'H', 1, 't', 1, 'o', 1, 'v', 2, 'K', 'H', 1, 'f',\n2, 'E', 'L', 1, '~', 2, '.', '.', 2, '-', '-', 1, '-', 1, '_',\n1, '_', 1, '(', 2, ')', ' ', 1, '{', 2, '}', ' ', 1, '[',\n2, ']', ' ', 2, '[', '(', 3, ')', ']', ' ', 2, '<', '<', 3, '>', '>', ' ', 1, '<',\n2, '>', ' ', 1, '[', 2, ']', ' ', 1, '{', 1, '}', 1, ',',\n1, ',', 1, '.', 1, ';', 1, ':', 1, '?', 1, '!',\n1, '-', 1, '(', 1, ')', 1, '{', 1, '}', 1, '{',\n1, '}', 1, '#', 1, '&', 1, '*', 1, '+', 1, '-',\n1, '<', 1, '>', 1, '=', 1, '\\\\', 1, '$', 1, '%',\n1, '@', 1, '!', 1, '\\\"', 1, '#', 1, '$', 1, '%',\n1, '&', 1, '\\'', 1, '(', 1, ')', 1, '*', 1, '+',\n1, ',', 1, '-', 1, '.', 1, '/', 1, '0', 1, '1',\n1, '2', 1, '3', 1, '4', 1, '5', 1, '6', 1, '7',\n1, '8', 1, '9', 1, ':', 1, ';', 1, '<', 1, '=',\n1, '>', 1, '?', 1, '@', 1, 'A', 1, 'B', 1, 'C',\n1, 'D', 1, 'E', 1, 'F', 1, 'G', 1, 'H', 1, 'I',\n1, 'J', 1, 'K', 1, 'L', 1, 'M', 1, 'N', 1, 'O',\n1, 'P', 1, 'Q', 1, 'R', 1, 'S', 1, 'T', 1, 'U',\n1, 'V', 1, 'W', 1, 'X', 1, 'Y', 1, 'Z', 1, '[',\n1, '\\\\', 1, ']', 1, '^', 1, '_', 1, '`', 1, 'a',\n1, 'b', 1, 'c', 1, 'd', 1, 'e', 1, 'f', 1, 'g',\n1, 'h', 1, 'i', 1, 'j', 1, 'k', 1, 'l', 1, 'm',\n1, 'n', 1, 'o', 1, 'p', 1, 'q', 1, 'r', 1, 's',\n1, 't', 1, 'u', 1, 'v', 1, 'w', 1, 'x', 1, 'y',\n1, 'z', 1, '{', 1, '|', 1, '}', 1, '~', 1, '.',\n1, '[', 1, ']', 1, ',', 1, '*', 2, 'w', 'o', 1, 'a',\n1, 'i', 1, 'u', 1, 'e', 1, 'o', 2, 'y', 'a', 2, 'y', 'u',\n2, 'y', 'o', 2, 't', 'u', 1, '+', 1, 'a', 1, 'i', 1, 'u',\n1, 'e', 1, 'o', 2, 'k', 'a', 2, 'k', 'i', 2, 'k', 'u', 2, 'k', 'e',\n2, 'k', 'o', 2, 's', 'a', 2, 's', 'i', 2, 's', 'u', 2, 's', 'e', 2, 's', 'o',\n2, 't', 'a', 2, 't', 'i', 2, 't', 'u', 2, 't', 'e', 2, 't', 'o', 2, 'n', 'a',\n2, 'n', 'i', 2, 'n', 'u', 2, 'n', 'e', 2, 'n', 'o', 2, 'h', 'a', 2, 'h', 'i',\n2, 'h', 'u', 2, 'h', 'e', 2, 'h', 'o', 2, 'm', 'a', 2, 'm', 'i', 2, 'm', 'u',\n2, 'm', 'e', 2, 'm', 'o', 2, 'y', 'a', 2, 'y', 'u', 2, 'y', 'o', 2, 'r', 'a',\n2, 'r', 'i', 2, 'r', 'u', 2, 'r', 'e', 2, 'r', 'o', 2, 'w', 'a', 1, 'n',\n1, ':', 1, ';', 1, 'g', 2, 'g', 'g', 2, 'g', 's', 1, 'n',\n2, 'n', 'j', 2, 'n', 'h', 1, 'd', 2, 'd', 'd', 1, 'r', 2, 'l', 'g',\n2, 'l', 'm', 2, 'l', 'b', 2, 'l', 's', 2, 'l', 't', 2, 'l', 'p', 2, 'r', 'h',\n1, 'm', 1, 'b', 2, 'b', 'b', 2, 'b', 's', 1, 's', 2, 's', 's',\n1, 'j', 2, 'j', 'j', 1, 'c', 1, 'k', 1, 't', 1, 'p',\n1, 'h', 1, 'a', 2, 'a', 'e', 2, 'y', 'a', 3, 'y', 'a', 'e', 2, 'e', 'o',\n1, 'e', 3, 'y', 'e', 'o', 2, 'y', 'e', 1, 'o', 2, 'w', 'a', 3, 'w', 'a', 'e',\n2, 'o', 'e', 2, 'y', 'o', 1, 'u', 3, 'w', 'e', 'o', 2, 'w', 'e', 2, 'w', 'i',\n2, 'y', 'u', 2, 'e', 'u', 2, 'y', 'i', 1, 'i', 2, '/', 'C', 2, 'P', 'S',\n1, '!', 1, '-', 1, '|', 2, 'Y', '=', 2, 'W', '=', 1, '|',\n1, '-', 1, '|', 1, '-', 1, '|', 1, '#', 1, 'O',\n1, '{', 1, '|', 1, '}', };\n\nconst int Data::tranlitIndexMap[] = {\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 0, 2, 4, 7, 10, 13, 16, 18,\n21, 23, 27, 29, 32, -1, 34, 38, 40, 44,\n47, 49, 51, 53, 55, 57, 59, 61, 63, 65,\n68, 74, 80, 86, 88, 90, 92, 94, 96, 98,\n100, 103, 105, 107, 109, 111, 113, 115, 117, 119,\n121, 123, 125, 127, 129, 131, 133, 135, 137, 139,\n141, 143, 145, 147, 149, 152, 155, 157, 159, 161,\n163, 165, 167, 170, 172, 174, 176, 178, 180, 182,\n184, 186, 188, 190, 192, 194, 196, 198, 200, 202,\n204, 206, 208, 210, 212, 214, 216, 219, 221, 223,\n225, 227, 229, 231, 233, 235, 237, 239, 241, 243,\n245, 247, 249, 251, 253, 255, 257, 259, 261, 263,\n265, 267, 269, 271, 273, 275, 277, 279, 281, 283,\n285, 287, 289, 291, 293, 295, 297, 299, 301, 303,\n305, 307, 309, 311, 313, 315, 317, 319, 321, 324,\n327, 329, 331, 333, 335, 337, 339, 341, 343, 345,\n347, 349, 351, 353, 355, 357, 359, 361, 363, 365,\n367, 369, 372, 375, 378, 380, 382, 384, 386, 388,\n390, 393, 396, 398, 400, 402, 404, 406, 408, 410,\n412, 414, 416, 418, 420, 422, 424, 426, 428, 430,\n432, 434, 436, 438, 440, 442, 444, 446, 448, 450,\n452, 454, 456, 458, 460, 462, 464, 466, 468, 470,\n472, 474, 476, 478, 480, 482, 484, 486, 488, 490,\n492, 494, 496, 498, 500, 502, 504, 506, 508, 510,\n512, 514, 516, 518, 520, 522, 524, 526, 529, 531,\n533, 535, 537, 539, 541, 543, 545, 547, 549, 551,\n553, 556, 559, 561, 563, 566, 568, 570, 573, 576,\n578, 580, 582, 584, 586, 588, 590, 592, 594, 596,\n598, 600, 603, 606, 609, 612, 614, 616, 618, 621,\n623, 625, 628, 631, 633, 636, 639, 642, 645, 648,\n651, 654, 657, 660, 662, 664, 666, 668, 670, 672,\n674, 676, 678, 680, 682, 684, 686, 688, 690, 692,\n694, 696, 698, 700, 702, 705, 708, 710, 712, 714,\n716, 718, 720, 722, 724, 726, 728, 731, 734, 736,\n739, 742, 745, 747, 749, 752, 754, 756, 758, 760,\n762, 765, 768, 770, 772, 774, 776, 778, 780, 782,\n784, 786, 788, 790, 792, 794, 796, 798, 800, 802,\n804, 806, 808, 810, 812, 814, 816, 818, 820, 822,\n824, 826, 828, 830, 832, 834, 836, 838, 840, 843,\n846, 848, 850, 852, 854, 856, 858, 860, 862, 864,\n866, 868, 870, 872, 874, 876, 878, 880, 882, 884,\n886, 889, 892, 894, 896, 898, 900, 902, 904, -1,\n-1, 906, 908, 910, 912, 914, 916, 918, 920, 922,\n924, 926, 928, 930, 932, 934, 936, 938, 940, 942,\n944, 946, 948, 950, 952, 954, 956, 958, 960, 962,\n964, 966, 968, 970, 972, 974, 976, 978, 980, 982,\n984, 986, 988, 990, 992, 995, 997, 999, 1001, 1003,\n1005, 1007, 1009, 1012, 1014, 1016, 1018, 1020, 1022, 1024,\n1026, 1028, 1030, 1032, 1034, 1036, 1038, 1040, 1042, 1044,\n1046, 1048, 1050, 1052, 1054, 1056, 1058, 1060, 1062, 1064,\n1066, 1068, 1070, 1072, 1074, 1076, 1078, 1080, 1082, 1084,\n1086, 1088, 1090, 1092, 1094, 1096, 1098, 1100, 1103, 1106,\n1109, 1112, 1115, 1118, 1121, 1124, 1127, 1130, 1133, 1135,\n1137, 1139, 1141, 1143, 1145, 1147, 1149, 1151, 1153, 1155,\n1157, 1159, 1161, 1163, 1165, 1167, 1169, 1171, 1173, 1175,\n1177, 1179, 1181, 1183, 1185, 1187, 1189, 1191, 1193, 1195,\n1197, 1199, 1201, 1203, 1205, 1207, 1209, 1211, 1213, 1215,\n1217, 1219, 1221, 1223, 1225, 1227, 1229, 1231, 1233, 1235,\n1237, 1239, 1241, -1, -1, -1, -1, -1, -1, -1,\n1243, 1245, 1247, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, 1249,\n1251, 1253, 1255, 1257, 1259, 1261, 1263, 1265, 1267, 1269,\n1271, 1273, -1, -1, -1, -1, 1275, 1277, -1, -1,\n-1, -1, -1, -1, -1, -1, 1279, -1, -1, -1,\n-1, -1, -1, -1, 1281, 1283, 1285, 1287, 1289, -1,\n1291, -1, 1293, 1295, 1297, 1299, 1301, 1303, 1305, 1307,\n1309, 1311, 1313, 1316, 1318, 1320, 1322, 1324, 1326, 1329,\n1331, 1333, -1, 1335, 1337, 1339, 1341, 1344, 1347, 1350,\n1352, 1354, 1356, 1358, 1360, 1362, 1364, 1366, 1368, 1370,\n1372, 1374, 1376, 1378, 1380, 1383, 1385, 1387, 1389, 1391,\n1393, 1395, 1397, 1399, 1401, 1403, 1405, 1407, 1409, 1412,\n1415, 1418, 1420, 1422, 1424, 1426, 1428, -1, 1430, 1432,\n1435, 1437, 1439, 1441, 1444, 1446, -1, -1, 1448, 1451,\n1454, 1456, 1458, 1460, 1462, 1465, 1468, 1471, 1474, 1476,\n1478, 1481, 1484, 1486, 1488, 1490, 1492, 1495, 1498, 1501,\n1504, 1506, 1508, 1510, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 1512, 1515, 1518, 1521,\n1524, 1527, 1530, 1532, 1535, 1537, 1540, 1543, 1547, 1550,\n1552, 1554, 1558, 1560, 1562, 1564, 1566, 1568, 1570, 1573,\n1575, 1577, 1579, 1581, 1583, 1585, 1587, 1589, 1591, 1593,\n1595, 1597, 1599, 1601, 1604, 1607, 1610, 1613, 1618, 1620,\n1622, 1624, 1626, 1629, 1632, 1634, 1636, 1638, 1640, 1642,\n1644, 1647, 1649, 1651, 1653, 1655, 1657, 1659, 1661, 1663,\n1665, 1667, 1669, 1671, 1673, 1675, 1678, 1681, 1684, 1687,\n1692, 1694, 1696, 1698, 1700, 1703, 1706, 1709, 1712, 1715,\n1718, 1721, 1724, 1726, 1729, 1731, 1734, 1737, 1741, 1744,\n1746, 1748, 1752, 1754, 1756, 1758, 1760, 1763, 1766, 1768,\n1770, 1773, 1776, 1778, 1780, 1783, 1786, 1789, 1792, 1795,\n1798, 1800, 1802, 1804, 1806, 1808, 1810, 1812, 1814, 1816,\n1818, 1820, 1822, 1825, 1828, 1830, 1832, -1, -1, -1,\n-1, -1, 1839, 1849, -1, -1, 1861, 1863, 1865, 1868,\n1871, 1874, 1877, 1880, 1883, 1886, 1889, 1893, 1897, 1900,\n1903, 1906, 1909, 1912, 1915, 1918, 1921, 1924, 1927, 1930,\n1933, 1936, 1939, 1942, 1945, 1948, 1951, 1954, 1957, 1960,\n1963, 1965, 1967, 1970, 1973, 1977, 1981, 1985, 1989, 1993,\n1997, 2001, 2005, 2007, 2009, 2012, 2015, 2019, 2023, 2025,\n2028, 2031, 2034, -1, -1, 2037, 2040, -1, -1, 2043,\n2046, -1, -1, -1, 2049, 2051, 2053, 2055, 2057, 2060,\n2063, 2066, 2069, 2071, 2073, 2075, 2077, 2080, 2083, 2085,\n2087, 2090, 2093, 2095, 2097, 2099, 2101, 2103, 2105, 2107,\n2109, 2111, 2113, 2115, 2117, 2119, 2121, 2123, 2125, 2127,\n2129, 2132, -1, -1, 2135, 2137, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 2139, 2141, 2143, 2145, 2147, 2149, 2151, 2153, 2155,\n2158, 2161, 2163, 2165, 2168, 2171, 2173, 2175, 2178, 2181,\n2184, 2186, 2188, 2190, 2193, 2195, 2199, 2201, 2203, 2206,\n2208, 2210, 2212, 2214, 2218, 2220, 2223, 2226, 2228, -1,\n-1, 2230, 2232, 2234, 2236, 2238, 2240, 2242, -1, 2244,\n2246, 2248, 2250, 2252, 2254, 2256, 2258, 2260, 2263, 2266,\n2268, 2270, 2273, 2276, 2278, 2280, 2283, 2286, 2289, 2291,\n2293, 2295, 2298, 2300, 2304, 2306, 2308, 2311, 2313, 2315,\n2317, 2319, 2323, 2325, 2328, 2331, 2333, 2335, -1, 2338,\n2340, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, 2342,\n2344, 2346, 2348, 2350, 2352, 2354, 2356, 2358, 2360, 2362,\n-1, -1, 2364, -1, 2366, -1, -1, 2368, -1, -1,\n2370, 2372, -1, -1, -1, -1, -1, -1, -1, -1,\n2374, 2376, 2378, 2380, 2382, 2384, 2386, 2388, 2390, 2392,\n2394, 2397, 2400, 2402, 2404, 2406, 2408, 2410, 2412, 2414,\n2416, 2418, 2421, 2424, 2426, 2428, 2431, -1, -1, -1,\n-1, 2433, 2437, 2439, 2442, 2445, 2447, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n2449, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 2451, -1, -1, -1, 2453,\n-1, -1, 2455, 2457, 2459, -1, 2462, -1, 2465, 2467,\n2469, 2471, 2474, 2476, 2478, 2481, 2483, 2486, 2488, 2490,\n2492, 2495, 2497, 2499, 2501, 2503, 2505, -1, -1, -1,\n-1, -1, -1, 2507, 2509, 2511, 2513, 2515, 2517, 2519,\n2521, 2523, 2525, 2527, 2530, 2533, 2536, 2538, 2540, 2542,\n-1, -1, 2544, 2546, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 2548, 2550, 2552, 2554, 2556, 2558,\n2560, 2562, 2564, 2566, 2568, 2570, 2572, 2574, -1, -1,\n-1, 2576, 2578, 2580, -1, 2582, 2584, 2587, 2590, 2593,\n2596, 2600, 2602, 2604, 2606, 2608, 2611, 2614, 2617, 2619,\n2622, 2625, 2627, 2630, 2634, 2637, 2639, 2641, 2644, 2647,\n2651, 2653, 2655, 2657, 2660, 2662, 2664, 2666, 2668, 2670,\n2672, 2674, 2676, 2678, 2680, 2682, 2684, 2686, 2688, 2691,\n2693, 2695, 2697, 2699, 2701, 2704, 2706, 2708, 2711, 2713,\n2715, 2717, 2720, 2722, 2724, 2726, 2728, 2730, 2732, 2734,\n2736, 2738, 2740, 2742, 2744, 2746, 2748, 2750, 2752, 2754,\n2757, 2760, 2762, 2764, 2766, 2768, 2771, 2774, 2776, 2779,\n2782, 2784, 2786, 2788, 2790, 2792, -1, -1, 2794, 2796,\n2799, 2801, -1, -1, -1, -1, -1, -1, -1, 2804,\n2806, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 2808, -1, -1, -1, -1, -1, -1, 2810, 2812,\n2814, 2816, 2818, 2820, 2822, 2824, 2826, 2828, 2830, 2833,\n2835, 2838, 2840, -1, 2843, 2846, 2848, 2850, 2852, 2854,\n2856, 2858, 2860, 2862, 2864, 2866, 2868, 2870, -1, -1,\n2872, -1, 2874, 2876, 2878, 2880, 2882, 2884, 2886, 2888,\n2890, 2892, 2894, 2896, 2898, 2901, 2903, 2905, 2907, 2909,\n2911, 2913, 2915, 2917, 2919, 2921, 2923, 2925, 2928, -1,\n-1, -1, 2930, 2932, 2934, 2936, 2938, 2940, 2942, 2944,\n2946, 2948, 2950, 2952, 2954, 2956, 2958, 2960, -1, 2962,\n2964, -1, -1, 2966, 2968, 2970, 2972, 2974, 2976, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 2978, 2980, 2983, 2985, 2987, 2989, 2991, 2993,\n2995, 2997, 2999, 3001, 3004, 3007, 3009, 3011, 3014, 3016,\n3018, 3020, 3022, 3024, 3026, 3028, 3031, 3034, 3037, 3040,\n3043, 3045, 3048, 3050, 3052, 3054, 3056, 3058, 3061, 3063,\n3065, 3067, 3070, 3072, 3075, 3077, 3080, 3082, 3085, 3087,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, 3090, 3092, 3094,\n-1, 3096, 3098, 3101, 3103, 3106, 3108, 3111, 3113, 3115,\n3118, 3120, 3122, 3125, 3128, 3130, 3132, 3135, 3137, 3140,\n3142, 3145, 3148, 3150, 3153, 3155, 3158, 3161, 3164, 3168,\n3171, 3175, 3178, 3180, 3183, 3185, 3188, 3190, 3194, 3196,\n3199, 3201, 3204, 3206, 3208, 3210, 3213, 3215, 3217, 3221,\n3223, 3226, 3229, 3231, -1, -1, 3233, 3235, 3237, 3240,\n3242, 3245, 3247, 3250, 3252, 3255, 3258, 3260, 3262, 3265,\n3268, 3270, 3272, -1, -1, -1, 3275, 3279, 3281, 3283,\n3285, -1, -1, -1, 3287, 3289, 3293, 3297, 3299, 3304,\n3307, 3309, 3312, 3315, 3318, 3320, 3323, 3327, 3332, 3334,\n3336, 3338, 3340, 3342, 3344, 3346, 3348, 3350, 3352, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 3354, 3356, 3358, -1, 3360,\n3362, 3365, 3367, 3370, 3372, 3375, 3377, -1, -1, 3380,\n3382, -1, -1, 3385, 3387, 3390, 3392, 3395, 3397, 3400,\n3403, 3405, 3408, 3410, 3413, 3416, 3419, 3423, 3426, 3430,\n3433, 3435, 3438, 3440, 3443, -1, 3445, 3447, 3450, 3452,\n3455, 3457, 3459, -1, 3461, -1, -1, -1, 3463, 3466,\n3469, 3471, -1, -1, 3473, -1, 3475, 3478, 3480, 3483,\n3485, 3488, 3490, -1, -1, 3493, 3495, -1, -1, 3498,\n3500, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 3503, -1, -1, -1, -1, 3505, 3508, -1, 3511,\n3514, 3517, 3520, 3522, -1, -1, 3525, 3527, 3529, 3531,\n3533, 3535, 3537, 3539, 3541, 3543, 3545, 3548, 3551, 3554,\n3557, 3560, 3563, 3566, 3569, 3577, -1, -1, -1, -1,\n-1, -1, -1, -1, 3581, -1, -1, 3583, 3585, 3588,\n3590, 3593, 3595, -1, -1, -1, -1, 3598, 3601, -1,\n-1, 3604, 3607, 3610, 3612, 3615, 3617, 3620, 3623, 3625,\n3628, 3630, 3633, 3636, 3639, 3643, 3646, 3650, 3653, 3655,\n3658, 3660, 3663, -1, 3665, 3667, 3670, 3672, 3675, 3677,\n3679, -1, 3681, 3683, -1, 3686, 3688, -1, 3691, 3693,\n-1, -1, 3695, -1, 3697, 3700, 3702, 3705, 3707, -1,\n-1, -1, -1, 3710, 3713, -1, -1, 3716, 3719, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 3722, 3726, 3730, 3732, -1, 3735, -1, -1, -1,\n-1, -1, -1, -1, 3737, 3739, 3741, 3743, 3745, 3747,\n3749, 3751, 3753, 3755, 3757, 3759, -1, -1, 3761, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 3768, 3770, 3772, -1, 3774, 3776, 3779, 3781, 3784,\n3786, 3789, -1, 3791, -1, 3794, 3796, 3799, -1, 3802,\n3804, 3807, 3809, 3812, 3814, 3817, 3820, 3822, 3825, 3827,\n3830, 3833, 3836, 3840, 3843, 3847, 3850, 3852, 3855, 3857,\n3860, -1, 3862, 3864, 3867, 3869, 3872, 3874, 3877, -1,\n3879, 3881, -1, 3884, 3886, 3889, 3892, 3894, -1, -1,\n3896, 3898, 3900, 3903, 3905, 3908, 3910, 3913, 3915, 3918,\n-1, 3921, 3923, 3926, -1, 3929, 3931, -1, -1, -1,\n3934, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 3938, -1, -1, -1,\n-1, -1, 3941, 3943, 3945, 3947, 3949, 3951, 3953, 3955,\n3957, 3959, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, 3961,\n3963, 3965, -1, 3967, 3969, 3972, 3974, 3977, 3979, 3982,\n3984, -1, -1, 3986, 3988, -1, -1, 3991, 3993, 3996,\n3998, 4001, 4003, 4006, 4009, 4011, 4014, 4016, 4019, 4022,\n4025, 4029, 4032, 4036, 4039, 4041, 4044, 4046, 4049, -1,\n4051, 4053, 4056, 4058, 4061, 4063, 4065, -1, 4067, 4069,\n-1, -1, 4072, 4075, 4078, 4080, -1, -1, 4082, 4084,\n4086, 4089, 4091, 4094, 4096, 4099, -1, -1, -1, 4101,\n4103, -1, -1, 4106, 4108, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 4111, 4113, -1, -1, -1, -1,\n4115, 4118, -1, 4121, 4124, 4127, -1, -1, -1, -1,\n4130, 4132, 4134, 4136, 4138, 4140, 4142, 4144, 4146, 4148,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 4150, 4152,\n-1, 4154, 4156, 4159, 4161, 4164, 4166, -1, -1, -1,\n4169, 4171, 4174, -1, 4177, 4179, 4182, 4185, -1, -1,\n-1, 4187, 4190, -1, 4192, -1, 4194, 4197, -1, -1,\n-1, 4200, 4203, -1, -1, -1, 4205, 4207, 4211, -1,\n-1, -1, 4213, 4215, 4217, 4219, 4222, 4224, 4227, 4231,\n-1, 4233, 4236, 4238, -1, -1, -1, -1, 4240, 4243,\n4245, 4248, 4250, -1, -1, -1, 4253, 4255, 4258, -1,\n4261, 4263, 4266, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, 4269, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 4271, 4273,\n4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, 4291, 4296,\n4302, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 4309, 4311, 4313, -1, 4315,\n4317, 4320, 4322, 4325, 4327, 4330, 4332, -1, 4334, 4336,\n4339, -1, 4342, 4344, 4347, 4350, 4352, 4355, 4357, 4360,\n4363, 4365, 4368, 4370, 4373, 4376, 4379, 4383, 4386, 4390,\n4393, 4395, 4398, 4400, 4403, -1, 4405, 4407, 4410, 4412,\n4415, 4417, 4419, 4421, 4424, 4426, -1, 4429, 4431, 4434,\n4437, 4439, -1, -1, -1, -1, 4441, 4444, 4446, 4449,\n4451, 4454, 4456, -1, 4459, 4461, 4464, -1, 4467, 4469,\n4472, -1, -1, -1, -1, -1, -1, -1, -1, 4475,\n4477, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n4479, 4482, -1, -1, -1, -1, 4485, 4487, 4489, 4491,\n4493, 4495, 4497, 4499, 4501, 4503, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 4505, 4507, -1, 4509, 4511, 4514,\n4516, 4519, 4521, 4524, 4526, -1, 4528, 4530, 4533, -1,\n4536, 4538, 4541, 4544, 4546, 4549, 4551, 4554, 4557, 4559,\n4562, 4564, 4567, 4570, 4573, 4577, 4580, 4584, 4587, 4589,\n4592, 4594, 4597, -1, 4599, 4601, 4604, 4606, 4609, 4611,\n4613, 4615, 4618, 4620, -1, 4623, 4625, 4628, 4631, 4633,\n-1, -1, -1, -1, 4635, 4638, 4640, 4643, 4645, 4648,\n4650, -1, 4653, 4655, 4658, -1, 4661, 4663, 4666, -1,\n-1, -1, -1, -1, -1, -1, -1, 4669, 4671, -1,\n-1, -1, -1, -1, -1, -1, 4673, -1, 4677, 4680,\n-1, -1, -1, -1, 4683, 4685, 4687, 4689, 4691, 4693,\n4695, 4697, 4699, 4701, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 4703, 4705, -1, 4707, 4709, 4712, 4714, 4717,\n4719, 4722, 4724, -1, 4726, 4728, 4731, -1, 4734, 4736,\n4739, 4742, 4744, 4747, 4749, 4752, 4755, 4757, 4760, 4762,\n4765, 4768, 4771, 4775, 4778, 4782, 4785, 4787, 4790, 4792,\n4795, -1, 4797, 4799, 4802, 4804, 4807, 4809, 4811, 4813,\n4816, 4818, 4821, 4825, 4827, 4830, 4833, 4835, -1, -1,\n-1, -1, 4837, 4840, 4842, 4845, 4847, 4850, -1, -1,\n4852, 4854, 4857, -1, 4860, 4862, 4865, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, 4868, -1, -1,\n-1, -1, -1, -1, -1, -1, 4870, 4873, -1, -1,\n-1, -1, 4876, 4878, 4880, 4882, 4884, 4886, 4888, 4890,\n4892, 4894, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n4896, 4898, -1, 4900, 4902, 4905, 4908, 4912, 4914, 4917,\n4919, 4922, 4924, 4927, 4929, 4932, 4934, 4937, 4940, 4942,\n4945, -1, -1, -1, 4948, 4950, 4953, 4955, 4958, 4961,\n4965, 4967, 4970, 4972, 4975, 4978, 4982, 4986, 4989, 4993,\n4996, 5000, 5003, 5008, 5010, 5013, 5015, 5018, -1, 5020,\n5023, 5025, 5028, 5030, 5033, 5035, 5038, 5040, -1, 5042,\n-1, -1, 5044, 5046, 5049, 5052, 5054, 5056, 5059, -1,\n-1, -1, -1, -1, -1, -1, -1, 5061, 5064, 5067,\n5071, 5073, 5076, -1, 5078, -1, 5081, 5083, 5085, 5088,\n5091, 5093, 5096, 5099, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 5101, 5104, 5107, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, 5111, 5113, 5116,\n5119, 5122, 5125, 5128, 5131, 5135, 5138, 5141, 5144, 5147,\n5149, 5151, 5153, 5156, 5159, 5162, 5164, 5166, 5168, 5171,\n5174, 5177, 5179, 5181, 5183, 5186, 5188, 5191, 5193, 5196,\n5198, 5200, 5202, 5204, 5206, 5208, 5210, 5212, 5214, 5216,\n5218, 5220, 5222, 5224, 5226, 5228, 5230, 5233, 5236, 5238,\n5241, 5244, 5248, 5250, 5253, -1, -1, -1, -1, 5255,\n5259, 5261, 5264, 5266, 5269, 5272, 5275, -1, -1, -1,\n-1, -1, -1, 5277, -1, 5279, 5283, 5285, 5287, 5289,\n5291, 5293, 5295, 5297, 5299, 5301, 5303, 5308, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 5314, 5316, -1, 5319, -1,\n-1, 5322, 5325, -1, 5328, -1, -1, 5330, -1, -1,\n-1, -1, -1, -1, 5333, 5335, 5337, 5340, -1, 5343,\n5345, 5347, 5349, 5352, 5354, 5357, -1, 5359, 5361, 5363,\n-1, 5365, -1, 5367, -1, -1, 5369, 5371, -1, 5373,\n-1, 5375, 5377, -1, 5379, 5382, 5385, 5387, 5390, 5392,\n5395, 5397, -1, 5400, 5402, 5404, -1, -1, 5407, 5409,\n5412, 5414, 5417, -1, 5420, -1, -1, -1, -1, -1,\n-1, 5422, -1, -1, 5424, 5426, 5428, 5430, 5432, 5434,\n5436, 5438, 5440, 5442, -1, -1, 5444, 5447, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 5450, -1, -1, -1, -1, -1, -1, -1,\n5454, 5459, -1, 5463, 5465, 5469, 5473, 5478, 5483, 5488,\n5493, 5500, 5506, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 5509, 5511, 5513, 5515, 5517, 5519,\n5521, 5523, 5525, 5527, 5529, 5532, 5536, 5540, 5544, 5548,\n5552, 5556, 5560, 5564, 5568, 5570, 5572, 5574, -1, 5576,\n-1, 5578, 5580, 5583, -1, -1, 5586, 5588, 5591, 5593,\n5596, 5599, 5601, 5604, -1, 5606, 5609, 5612, 5616, 5619,\n5623, 5626, 5628, 5631, 5633, 5636, 5638, 5640, 5643, 5645,\n5648, 5650, 5653, 5657, 5660, 5664, 5666, 5669, 5671, 5673,\n5675, 5677, 5679, 5682, 5686, 5688, 5690, 5692, 5696, -1,\n-1, -1, -1, -1, -1, 5698, 5701, 5703, 5706, 5708,\n5711, 5713, 5716, 5718, 5721, 5723, 5726, 5728, 5731, 5733,\n5735, 5737, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 5740, 5742, 5745, 5747,\n5750, 5753, 5755, 5758, -1, 5760, 5763, 5766, 5770, 5773,\n5777, 5780, 5782, 5785, 5787, 5790, 5792, 5794, 5797, 5799,\n5802, 5804, 5807, 5811, 5814, 5818, 5820, 5823, 5825, 5827,\n5829, 5831, 5833, 5836, 5839, 5841, 5843, 5845, 5849, 5851,\n5853, -1, 5855, 5857, 5863, 5869, 5875, 5881, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 5887, 5889,\n5892, 5894, 5897, 5900, 5902, 5905, 5907, 5910, 5913, 5917,\n5920, 5924, 5927, 5931, 5934, 5937, 5940, 5942, 5945, 5947,\n5949, 5952, 5954, 5957, 5959, 5961, 5963, 5965, 5967, 5969,\n5971, 5974, -1, 5976, 5978, 5981, 5983, 5986, -1, 5988,\n5990, -1, 5993, 5996, 5998, 6001, 6003, 6006, 6008, -1,\n-1, -1, 6011, 6013, 6015, -1, -1, -1, -1, -1,\n-1, -1, 6017, 6019, 6021, 6023, 6025, 6027, 6029, 6031,\n6033, 6035, 6037, 6041, 6046, 6049, 6052, 6055, 6058, 6061,\n6064, 6066, 6069, 6071, 6074, 6076, 6079, 6081, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 6084, 6086,\n6088, 6090, 6092, 6094, 6096, 6098, 6101, 6103, 6105, 6107,\n6109, 6111, 6113, 6115, 6118, 6120, 6122, 6124, 6126, 6129,\n6132, 6135, 6137, 6140, 6144, 6147, 6150, 6152, 6155, 6157,\n6159, 6161, 6163, 6165, 6167, 6170, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 6173, 6175, 6177, 6179,\n6181, 6183, 6185, 6187, 6190, 6192, 6194, 6196, 6198, 6200,\n6202, 6204, 6207, 6209, 6211, 6213, 6215, 6218, 6221, 6224,\n6226, 6229, 6233, 6236, 6239, 6241, 6244, 6246, 6248, 6250,\n6252, 6254, 6256, 6259, 6262, -1, -1, -1, -1, 6264,\n-1, -1, -1, -1, 6269, 6271, 6274, 6276, 6278, 6281,\n6283, 6285, 6287, 6290, 6292, -1, 6295, 6297, 6300, 6302,\n6304, 6306, 6308, 6310, 6313, 6316, 6319, 6322, 6325, 6328,\n6331, 6334, 6337, 6340, 6343, 6346, -1, 6349, 6352, 6356,\n6360, 6364, 6368, 6372, 6375, 6378, 6381, 6384, 6387, 6391,\n6394, 6397, 6400, 6403, 6406, 6409, 6413, 6417, 6419, 6422,\n6425, 6428, 6431, 6434, -1, -1, -1, -1, 6437, 6439,\n6441, 6443, 6445, 6447, 6449, -1, 6451, 6453, 6455, 6457,\n6459, 6461, -1, -1, -1, -1, 6463, 6466, -1, -1,\n6469, 6472, 6475, 6478, -1, -1, -1, -1, -1, -1,\n-1, 6480, 6482, 6485, 6488, 6492, 6495, 6497, 6501, 6504,\n6506, 6509, 6513, 6516, 6519, 6521, 6525, 6528, 6531, 6534,\n6537, 6540, 6542, 6546, 6550, 6555, 6561, 6566, 6571, 6577,\n6583, 6589, 6594, 6598, 6603, 6607, 6611, 6617, 6624, 6631,\n6636, 6641, 6645, 6650, 6658, 6663, 6667, 6672, 6678, 6683,\n6690, 6696, 6701, 6706, 6711, 6717, 6722, 6726, 6731, 6735,\n6739, 6744, 6748, 6750, 6755, 6759, 6763, -1, -1, -1,\n-1, -1, 6766, 6768, 6771, 6774, 6776, 6779, 6782, 6784,\n6786, 6789, 6792, 6795, 6798, 6801, 6804, 6807, 6809, 6811,\n6814, 6816, 6819, 6822, 6824, 6826, 6828, 6830, 6832, 6834,\n6837, 6841, 6844, 6847, 6850, 6853, 6856, 6859, 6862, 6866,\n6869, 6872, 6876, 6879, 6883, 6887, 6891, 6895, 6899, 6903,\n6906, 6909, 6912, 6915, 6918, 6921, 6924, 6928, 6931, 6934,\n6937, 6940, 6943, 6946, 6949, 6952, 6955, 6958, 6961, 6964,\n6966, 6968, -1, 6971, 6974, 6976, 6979, 6982, 6985, 6988,\n6991, 6994, 6997, 7000, -1, -1, -1, -1, -1, -1,\n7002, 7005, 7008, 7011, 7015, 7019, 7022, -1, 7025, 7028,\n7031, 7034, 7038, 7042, 7045, 7048, 7052, 7056, 7060, 7064,\n7069, 7074, 7078, 7082, 7087, 7090, 7093, 7096, 7100, 7104,\n7107, 7110, 7114, 7118, 7122, 7126, 7131, 7136, 7140, 7144,\n7149, 7152, 7155, 7158, 7162, 7166, 7169, 7172, 7176, 7179,\n7182, 7185, 7189, 7193, 7196, 7199, 7203, 7207, 7211, 7215,\n7220, 7225, 7229, 7233, 7238, 7241, 7244, 7247, 7251, 7255,\n7258, -1, 7261, -1, 7265, 7269, 7274, 7279, -1, -1,\n7283, 7287, 7291, 7295, 7300, 7305, 7309, -1, 7313, -1,\n7318, 7323, 7329, 7335, -1, -1, 7340, 7343, 7346, 7349,\n7353, 7357, 7360, 7363, 7367, 7370, 7373, 7376, 7380, 7384,\n7387, 7390, 7394, 7397, 7400, 7403, 7407, 7411, 7414, 7417,\n7421, 7424, 7427, 7430, 7434, 7438, 7441, 7444, 7448, 7451,\n7454, 7457, 7461, 7465, 7468, -1, 7471, -1, 7475, 7479,\n7484, 7489, -1, -1, 7493, 7496, 7499, 7502, 7506, 7510,\n7513, 7516, 7520, 7524, 7528, 7532, 7537, 7542, 7546, 7550,\n7555, 7558, -1, 7561, 7565, 7569, 7572, 7575, 7579, 7582,\n7585, 7588, 7592, 7596, 7599, -1, 7602, -1, 7606, 7610,\n7615, 7620, -1, -1, 7624, 7628, 7632, 7636, 7641, 7646,\n7650, -1, 7654, -1, 7659, 7664, 7670, 7676, -1, -1,\n7681, 7684, 7687, 7690, 7694, 7698, 7701, -1, 7704, 7707,\n7710, 7713, 7717, 7721, 7724, -1, 7727, 7730, 7733, 7736,\n7740, 7744, 7747, 7750, 7754, 7758, 7762, 7766, 7771, 7776,\n7780, 7784, 7789, 7792, 7795, 7798, 7802, 7806, 7809, -1,\n7812, 7815, 7818, 7821, 7825, 7829, 7832, 7835, 7839, 7843,\n7847, 7851, 7856, 7861, 7865, 7869, 7874, 7877, 7880, 7883,\n7887, 7891, 7894, 7897, 7901, 7904, 7907, 7910, 7914, 7918,\n7921, -1, 7924, -1, 7928, 7932, 7937, 7942, -1, -1,\n7946, 7950, 7954, 7958, 7963, 7968, 7972, -1, 7976, 7980,\n7984, 7988, 7993, 7998, 8002, 8006, 8011, 8015, 8019, 8023,\n8028, 8033, 8037, 8041, 8046, 8050, 8054, 8058, 8063, 8068,\n8072, 8076, 8081, 8085, 8089, 8093, 8098, 8103, 8107, 8111,\n8116, 8120, 8124, 8128, 8133, 8138, 8142, -1, 8146, 8149,\n8152, 8155, 8159, 8163, 8166, 8169, 8173, 8176, 8179, 8182,\n8186, 8190, 8193, 8196, 8200, 8204, 8208, -1, -1, -1,\n-1, -1, -1, 8212, 8214, 8216, 8218, 8220, 8222, 8226,\n8228, 8231, 8233, 8235, 8237, 8239, 8241, 8243, 8245, 8247,\n8249, 8253, 8257, 8261, 8265, 8269, 8273, 8277, 8281, 8285,\n8290, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 8298, 8300, 8302, 8304,\n8306, 8308, 8310, 8313, 8316, 8319, 8322, 8325, 8328, 8331,\n8334, 8337, 8340, 8343, 8346, 8349, 8352, 8355, 8358, 8361,\n8364, 8367, 8370, 8373, 8376, 8379, 8382, 8385, 8389, 8393,\n8396, 8399, 8402, 8405, 8408, 8412, 8416, 8420, 8424, 8428,\n8432, 8435, 8437, 8440, 8443, 8446, 8449, 8452, 8455, 8458,\n8461, 8464, 8467, 8470, 8473, 8476, 8479, 8483, 8487, 8491,\n8495, 8499, 8503, 8507, 8511, 8515, 8519, 8523, 8527, 8531,\n8534, 8537, 8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561,\n8564, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, 8567, 8569, 8573, 8575, 8578, 8580, 8583,\n8586, 8589, 8591, 8593, 8596, 8599, 8602, 8605, 8608, 8612,\n8616, 8619, 8622, 8626, 8630, 8634, 8637, 8640, 8644, 8648,\n8652, 8655, 8657, 8659, 8661, 8663, 8666, 8668, 8670, 8672,\n-1, 8674, 8676, 8678, 8680, 8682, 8685, 8688, 8691, 8694,\n8697, 8702, 8705, 8709, 8712, 8716, 8720, 8724, 8727, 8730,\n8734, 8738, 8742, 8746, 8750, 8755, 8760, 8764, 8768, 8773,\n8778, 8782, 8786, 8791, 8796, 8801, 8803, 8805, 8807, 8810,\n8815, 8818, 8822, 8825, 8829, 8833, 8837, 8840, 8843, 8847,\n8851, 8855, 8859, 8863, 8868, 8873, 8877, 8881, 8886, 8891,\n8895, 8899, 8904, 8909, 8914, 8916, 8920, 8924, 8928, 8932,\n8935, 8940, 8943, 8947, 8950, 8954, 8958, 8961, 8965, 8969,\n8973, 8977, 8981, 8986, 8991, 8995, 8999, 9004, 9009, 9013,\n9017, 9022, 9027, 9032, 9034, 9037, 9041, 9045, 9049, 9053,\n9056, 9061, 9064, 9068, 9071, 9075, 9079, 9082, 9086, 9090,\n9094, 9098, 9102, 9107, 9112, 9116, 9120, 9125, 9130, 9134,\n9138, 9143, 9148, 9153, 9155, 9158, 9161, 9166, 9169, 9173,\n9176, 9180, 9184, 9187, 9191, 9195, 9199, 9203, 9207, 9212,\n9217, 9221, 9225, 9230, 9235, 9239, 9243, 9248, 9253, 9258,\n9260, 9262, 9265, 9267, 9269, 9272, 9277, 9280, 9284, 9287,\n9291, 9295, 9298, 9302, 9306, 9310, 9314, 9318, 9323, 9328,\n9333, 9335, 9338, 9341, 9344, 9349, 9352, 9356, 9359, 9363,\n9367, 9370, 9374, 9378, 9382, 9386, 9390, 9395, 9400, 9404,\n9408, 9413, 9418, 9422, 9426, 9431, 9436, 9438, 9440, 9442,\n9445, 9450, 9453, 9457, 9460, 9464, 9468, 9471, 9475, 9479,\n9483, 9487, 9491, 9496, 9501, 9505, 9509, 9514, 9519, 9523,\n9527, 9532, 9537, 9542, 9544, 9546, 9549, 9551, 9554, 9558,\n9561, 9566, 9571, 9576, 9581, 9585, 9589, 9594, 9598, 9603,\n9607, 9612, 9617, 9622, 9627, 9632, 9638, 9644, 9649, 9654,\n9660, 9666, 9671, 9676, 9682, 9688, 9691, 9694, 9699, 9702,\n9706, 9709, 9713, 9717, 9720, 9724, 9728, 9732, 9736, 9740,\n9745, 9750, 9754, 9758, 9763, 9768, 9772, 9776, 9781, 9786,\n9791, 9793, 9795, 9797, 9800, 9803, 9806, 9809, 9814, 9817,\n9821, 9824, 9828, 9831, 9834, 9838, 9841, 9846, 9851, 9853,\n9855, 9857, 9860, 9865, 9868, 9872, 9875, 9879, 9882, 9886,\n9891, 9896, 9898, 9902, 9906, 9910, 9914, 9919, 9924, 9928,\n9933, 9937, 9942, 9948, 9954, 9957, 9962, 9967, 9972, 9977,\n9981, 9985, 9989, 9993, 9997, 10000, 10003, 10007, 10010, 10014,\n10017, 10021, 10023, 10025, 10028, 10033, 10036, 10040, 10043, 10047,\n10050, 10054, 10056, 10061, 10066, 10071, 10076, 10079, 10082, 10085,\n10088, 10094, 10098, 10103, 10107, 10112, 10116, 10121, 10124, 10128,\n10132, 10136, 10140, 10144, 10148, 10152, 10156, 10160, 10163, 10167,\n10172, 10176, 10181, 10185, 10190, 10193, 10197, 10201, 10206, 10210,\n10215, 10219, 10224, 10227, 10229, 10231, 10233, 10235, 10237, 10240,\n10243, 10246, 10249, 10252, 10255, 10258, 10261, 10264, 10267, 10270,\n10273, 10276, 10279, 10282, 10285, 10289, 10293, 10297, 10302, 10306,\n10310, 10313, 10316, 10319, 10323, 10326, 10329, 10332, 10335, 10338,\n10342, 10345, 10348, 10352, 10356, 10360, 10365, 10369, 10373, 10377,\n10381, 10385, 10390, 10394, 10398, 10402, 10406, 10410, 10415, 10419,\n10423, 10426, 10429, 10432, 10436, 10439, 10442, 10444, 10447, 10450,\n10453, 10457, 10460, 10463, 10467, 10471, 10475, 10480, 10484, 10488,\n10492, 10496, 10500, 10505, 10509, 10513, 10516, 10519, 10522, 10525,\n10529, 10532, 10535, 10538, 10541, 10544, 10548, 10551, 10554, 10557,\n10560, 10563, 10567, 10570, 10573, 10576, 10579, 10582, 10585, 10589,\n10592, 10595, 10598, 10602, 10606, 10610, 10615, 10619, 10623, 10626,\n10629, 10632, 10636, 10639, 10642, 10646, 10650, 10654, 10659, 10663,\n10667, 10671, 10675, 10679, 10684, 10688, 10692, 10697, 10702, 10707,\n10713, 10718, 10723, 10727, 10731, 10735, 10740, 10744, 10748, 10751,\n10754, 10757, 10761, 10764, 10767, 10769, 10771, 10775, 10779, 10783,\n10788, 10792, 10796, 10799, 10802, 10805, 10809, 10812, 10815, 10819,\n10823, 10827, 10832, 10836, 10840, 10843, 10847, 10851, 10855, 10860,\n10864, 10868, 10872, 10876, 10880, 10885, 10889, 10893, 10898, 10903,\n10908, 10914, 10919, 10924, 10926, 10928, 10932, 10937, 10942, 10948,\n10953, 10959, 10964, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 10970, 10972, 10974, 10976, 10978, 10980, 10982, 10984,\n10986, 10988, 10990, 10992, 10994, 10996, 10999, 11001, 11003, 11005,\n11007, 11009, 11011, 11013, 11016, 11019, 11022, 11024, 11026, 11028,\n11030, -1, -1, -1, 11032, 11034, 11036, 11038, 11041, 11043,\n11045, 11048, 11051, 11053, 11055, 11058, 11061, 11063, 11065, 11067,\n11070, 11073, 11075, 11077, 11079, 11081, 11083, 11086, 11088, 11090,\n11092, 11094, 11096, 11098, 11100, 11102, 11104, 11106, 11108, 11110,\n11112, 11114, 11117, 11119, 11122, 11124, 11126, 11128, 11130, 11132,\n11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 11152,\n11154, 11156, 11158, 11160, 11162, 11165, 11168, 11170, 11172, 11176,\n11180, 11183, 11186, 11189, 11191, 11194, 11197, 11200, 11202, 11204,\n11206, 11208, 11210, 11213, 11216, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 11219, 11221,\n11224, 11226, 11229, 11232, 11234, 11237, 11239, 11242, 11245, 11247,\n11251, 11253, 11257, 11260, 11262, 11265, 11267, 11270, 11272, 11274,\n11277, 11279, 11282, 11284, 11286, 11288, 11290, 11292, 11295, 11298,\n11300, 11302, 11304, 11306, 11308, 11311, 11313, 11316, 11318, 11321,\n11324, 11328, 11331, 11335, 11338, 11342, 11344, 11347, 11350, 11353,\n11356, 11358, 11361, 11364, 11366, 11369, 11371, 11374, 11376, 11379,\n11382, 11385, 11388, 11391, 11393, 11396, 11399, 11402, 11405, 11407,\n11409, -1, -1, -1, 11412, -1, 11414, -1, -1, -1,\n-1, -1, 11416, 11418, 11423, 11425, 11427, 11430, 11434, 11440,\n11443, -1, -1, -1, 11445, 11447, 11449, 11451, 11453, 11455,\n11457, 11459, 11461, 11463, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 11465, 11469, 11475, 11478,\n11481, 11484, -1, 11489, 11491, 11494, -1, -1, -1, -1,\n-1, -1, 11497, 11499, 11501, 11503, 11505, 11507, 11509, 11511,\n11513, 11515, -1, -1, -1, -1, -1, -1, 11517, 11519,\n11521, 11523, 11525, 11527, 11529, 11531, 11534, 11536, 11539, 11541,\n11543, 11545, 11547, 11549, 11551, 11553, 11556, 11558, 11560, 11563,\n11565, 11567, 11569, 11571, 11573, 11575, 11579, 11582, 11584, 11586,\n11589, 11592, 11595, 11598, 11600, 11602, 11604, 11606, 11608, 11610,\n11612, 11615, 11617, 11619, 11621, 11623, 11625, 11627, 11629, 11632,\n11634, 11637, 11639, 11641, 11643, 11645, 11647, 11650, 11653, 11656,\n11658, 11660, 11663, 11665, 11667, 11670, 11672, 11674, 11676, 11678,\n11681, 11683, 11685, 11687, 11689, 11691, 11693, 11696, 11698, 11700,\n11703, 11706, 11708, 11710, 11712, 11714, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 11717, 11719, 11721, 11723, 11725,\n11729, 11735, 11737, 11739, 11741, 11744, 11746, 11749, 11753, 11756,\n11759, 11761, 11763, 11765, 11768, 11771, 11774, 11776, 11778, 11780,\n11783, 11786, 11789, 11791, 11794, 11798, 11802, 11804, 11807, 11810,\n11813, 11816, 11818, 11820, 11822, 11825, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 11827, 11829, 11832, 11835,\n11837, 11839, 11841, 11843, 11845, 11847, 11849, 11851, 11853, 11855,\n11857, 11859, -1, 11861, -1, 11863, 11865, 11868, -1, -1,\n11871, 11873, 11875, 11877, 11879, 11881, 11883, 11885, 11887, 11889,\n11891, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n11893, 11895, 11898, 11900, 11902, 11904, 11906, 11908, 11910, 11912,\n11914, 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11931, 11933,\n11935, 11937, 11939, 11941, 11943, 11945, 11947, 11950, 11952, 11954,\n-1, 11956, 11958, 11960, 11962, 11964, 11966, -1, 11968, -1,\n-1, -1, 11970, 11972, 11974, 11976, 11978, 11980, -1, 11982,\n11984, 11986, 11988, -1, 11990, 11992, 11994, 11996, 11998, 12000,\n12002, 12004, -1, -1, 12006, 12008, 12010, 12012, 12014, 12016,\n12018, 12020, 12022, 12024, 12026, 12028, -1, -1, -1, -1,\n-1, 12030, -1, -1, 12032, 12034, 12036, 12038, 12040, 12042,\n12044, 12046, 12048, 12050, 12052, -1, 12054, 12056, 12058, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 12060, 12062, 12064, 12066, 12068, 12070, 12072, 12074,\n12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, 12092, 12094,\n12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, 12112, 12114,\n12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, 12132, 12134,\n12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, 12152, 12154,\n12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, 12172, 12174,\n12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, 12192, 12194,\n12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, 12212, 12214,\n12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, 12232, 12234,\n12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, 12252, 12254,\n12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, 12272, 12274,\n12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, 12292, 12294,\n12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, 12312, 12314,\n12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, 12332, 12334,\n12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 12352, 12354,\n12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, -1, -1,\n12372, -1, 12375, 12377, 12379, 12381, 12383, 12385, 12387, 12389,\n12391, 12393, 12395, 12397, 12399, 12401, 12403, 12405, 12407, 12409,\n12411, 12413, 12415, 12417, 12419, 12421, 12423, 12425, 12427, 12429,\n12431, 12433, 12435, 12437, 12439, 12441, 12443, 12445, 12447, 12449,\n12451, 12453, 12455, 12457, 12459, 12461, 12463, 12465, 12467, 12469,\n12471, 12473, 12475, 12477, 12479, 12481, 12483, 12485, 12487, 12489,\n12491, 12493, 12495, 12497, 12499, 12501, 12503, 12505, 12507, 12509,\n12511, 12513, 12515, 12517, 12519, 12521, 12523, 12525, 12527, 12529,\n12531, 12533, 12535, 12537, 12539, 12541, 12543, 12545, 12547, 12549,\n12551, 12553, -1, -1, -1, -1, -1, -1, 12555, 12557,\n12559, 12561, 12563, 12565, 12567, 12569, 12571, 12573, 12575, 12577,\n12579, 12581, 12583, 12585, 12587, 12589, 12591, 12593, 12595, 12597,\n-1, -1, 12599, 12601, 12603, 12605, 12607, 12609, -1, -1,\n12611, 12613, 12615, 12617, 12619, 12621, 12623, 12625, 12627, 12629,\n12631, 12633, 12635, 12637, 12639, 12641, 12643, 12645, 12647, 12649,\n12651, 12653, 12655, 12657, 12659, 12661, 12663, 12665, 12667, 12669,\n12671, 12673, 12675, 12677, 12679, 12681, 12683, 12685, -1, -1,\n12687, 12689, 12691, 12693, 12695, 12697, -1, -1, 12699, 12701,\n12703, 12705, 12707, 12709, 12711, 12713, -1, 12715, -1, 12717,\n-1, 12719, -1, 12721, 12723, 12725, 12727, 12729, 12731, 12733,\n12735, 12737, 12739, 12741, 12743, 12745, 12747, 12749, 12751, 12753,\n12755, 12757, 12759, 12761, 12763, 12765, 12767, 12769, 12771, 12773,\n12775, 12777, 12779, 12781, -1, -1, 12783, 12785, 12787, 12789,\n12791, 12793, 12795, 12797, 12799, 12801, 12803, 12805, 12807, 12809,\n12811, 12813, 12815, 12817, 12819, 12821, 12823, 12825, 12827, 12829,\n12831, 12833, 12835, 12837, 12839, 12841, 12843, 12845, 12847, 12849,\n12851, 12853, 12855, 12857, 12859, 12861, 12863, 12865, 12867, 12869,\n12871, 12873, 12875, 12877, 12879, 12881, 12883, 12885, 12887, -1,\n12889, 12891, 12893, 12895, 12897, 12899, 12901, 12903, 12905, 12907,\n12909, 12911, 12914, 12916, 12918, -1, 12920, 12922, 12924, 12926,\n12928, 12930, 12932, 12934, 12937, 12940, 12943, 12945, 12947, 12949,\n-1, -1, 12951, 12953, 12955, 12957, 12959, 12961, -1, 12963,\n12966, 12969, 12972, 12974, 12976, 12978, 12980, 12982, 12984, 12986,\n12988, 12990, 12992, 12994, 12996, 12998, 13001, 13004, -1, -1,\n13006, 13008, 13010, -1, 13012, 13014, 13016, 13018, 13020, 13022,\n13024, 13026, 13028, -1, 13030, 13032, 13034, 13036, 13038, 13040,\n13042, 13044, 13046, 13048, 13050, 13052, -1, -1, -1, -1,\n13054, 13056, 13058, 13060, 13062, 13065, 13068, 13071, 13073, 13075,\n13077, 13079, 13081, 13083, 13085, 13088, 13090, 13092, 13095, 13097,\n13100, 13102, 13105, 13109, 13111, 13113, -1, -1, -1, -1,\n-1, 13116, 13118, 13121, 13125, 13127, 13130, 13134, 13136, 13139,\n13143, 13145, 13147, 13149, 13151, 13154, 13157, 13159, 13161, 13163,\n13165, 13169, 13172, 13174, 13177, 13180, 13183, 13186, 13189, 13191,\n13194, 13197, 13200, -1, -1, -1, 13202, 13204, -1, -1,\n-1, 13206, -1, -1, -1, -1, -1, -1, -1, 13211,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 13213, 13215, -1, -1,\n13217, 13219, 13221, 13223, 13225, 13227, 13229, 13231, 13233, 13235,\n13237, 13239, 13241, 13243, 13245, 13247, 13249, 13251, 13253, 13255,\n13257, 13259, 13261, 13263, 13265, 13267, 13269, -1, 13271, 13273,\n13275, 13277, -1, 13279, 13281, 13283, 13285, 13287, 13289, 13291,\n13293, -1, -1, -1, 13295, 13299, 13302, 13305, 13308, 13310,\n13314, 13316, 13320, 13323, 13325, 13328, 13330, 13334, 13336, 13338,\n13341, 13344, 13346, 13348, 13350, 13354, 13357, 13359, 13362, 13364,\n13367, 13369, 13371, 13373, 13375, 13377, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n13381, 13387, 13393, -1, -1, 13395, 13401, -1, -1, -1,\n13407, 13409, 13411, 13413, 13415, -1, 13417, 13419, 13421, 13423,\n-1, 13425, 13427, -1, -1, 13432, 13434, 13436, 13438, 13440,\n-1, -1, 13442, 13447, 13451, -1, 13456, -1, -1, -1,\n13458, -1, 13460, 13462, 13464, 13466, 13468, 13470, 13472, 13474,\n13476, 13478, 13480, -1, -1, -1, -1, 13482, -1, 13484,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, 13488,\n13490, 13492, 13494, 13496, -1, -1, -1, -1, 13498, -1,\n13500, 13506, 13512, 13519, 13525, 13531, 13537, 13543, 13549, 13555,\n13561, 13567, 13573, 13579, 13585, 13591, 13595, 13597, 13600, 13604,\n13607, 13609, 13612, 13616, 13621, 13624, 13626, 13629, 13633, 13635,\n13637, 13639, 13641, 13643, 13646, 13650, 13653, 13655, 13658, 13662,\n13667, 13670, 13672, 13675, 13679, 13681, 13683, 13685, 13687, 13690,\n13693, 13699, -1, -1, -1, -1, -1, 13701, -1, -1,\n-1, -1, -1, -1, 13707, 13709, 13711, 13713, 13715, 13717,\n13719, 13721, 13723, 13725, 13727, 13729, 13731, 13733, 13735, 13737,\n13739, 13741, 13743, 13745, 13747, 13749, 13751, 13753, 13755, 13757,\n13759, 13761, 13763, 13765, 13767, 13769, 13771, 13773, 13775, 13777,\n13779, 13781, 13783, 13785, 13787, 13789, 13791, 13793, 13795, 13797,\n13799, 13801, 13803, 13805, 13807, 13809, 13811, 13813, 13815, 13817,\n13819, 13821, 13823, 13825, 13827, 13829, 13831, 13833, 13835, 13837,\n13839, 13841, 13843, 13845, 13847, 13849, 13851, 13853, 13855, 13857,\n13859, 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877,\n13879, 13881, 13883, 13885, 13887, 13889, 13891, 13893, 13895, 13897,\n13899, 13901, 13903, 13905, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 13907, -1, -1, 13909, 13911, 13913,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 13915, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n13917, -1, -1, -1, -1, -1, 13919, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 13921, 13924, 13927, 13930,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 13933, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, 13935, 13937, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 13940, 13942, 13944, 13946, 13948, 13950,\n13952, 13954, 13956, 13958, 13961, 13964, 13967, 13970, 13973, 13976,\n13979, 13982, 13985, 13988, 13991, 13995, 13999, 14003, 14007, 14011,\n14015, 14019, 14023, 14027, 14032, 14037, 14042, 14047, 14052, 14057,\n14062, 14067, 14072, 14077, 14082, 14085, 14088, 14091, 14094, 14097,\n14100, 14103, 14106, 14109, 14113, 14117, 14121, 14125, 14129, 14133,\n14137, 14141, 14145, 14149, 14153, 14157, 14161, 14165, 14169, 14173,\n14177, 14181, 14185, 14189, 14193, 14197, 14201, 14205, 14209, 14213,\n14217, 14221, 14225, 14229, 14233, 14237, 14241, 14245, 14249, 14253,\n14257, 14259, 14261, 14263, 14265, 14267, 14269, 14271, 14273, 14275,\n14277, 14279, 14281, 14283, 14285, 14287, 14289, 14291, 14293, 14295,\n14297, 14299, 14301, 14303, 14305, 14307, 14309, 14311, 14313, 14315,\n14317, 14319, 14321, 14323, 14325, 14327, 14329, 14331, 14333, 14335,\n14337, 14339, 14341, 14343, 14345, 14347, 14349, 14351, 14353, 14355,\n14357, 14359, 14361, 14363, 14366, 14369, 14372, 14375, 14378, 14381,\n14384, 14387, 14390, 14393, 14395, 14397, 14399, 14401, 14403, 14405,\n14407, 14409, 14411, 14414, 14416, 14418, 14420, 14422, 14424, 14426,\n14428, 14430, 14432, 14434, 14436, 14438, 14440, 14442, 14444, 14446,\n14448, 14450, 14452, 14454, 14456, 14458, 14460, 14462, 14464, 14466,\n14468, 14470, 14472, 14474, 14476, 14478, 14480, 14482, 14484, 14486,\n14488, 14490, 14492, 14494, 14496, 14498, 14500, 14502, 14504, 14506,\n14508, 14510, 14512, 14514, 14516, 14518, 14520, 14522, 14524, 14526,\n14528, 14530, 14532, 14534, 14536, 14538, 14540, 14542, 14544, 14546,\n14548, 14550, 14552, 14554, 14556, 14558, 14560, 14562, 14564, 14566,\n14568, 14570, 14572, 14574, 14576, 14578, 14580, 14582, 14584, 14586,\n14588, 14590, 14592, 14594, 14596, 14598, 14600, 14602, 14604, 14606,\n14608, 14610, 14612, 14614, 14616, 14618, 14620, 14622, 14624, 14626,\n14628, 14630, 14632, 14634, 14636, 14638, 14640, 14642, 14644, 14646,\n14648, 14650, 14652, 14654, 14656, 14658, 14660, 14662, 14664, 14666,\n14668, 14670, 14672, 14674, 14676, 14678, 14680, 14682, 14684, 14686,\n14688, 14690, 14692, 14694, 14696, 14698, 14700, 14702, 14704, 14706,\n14708, 14710, 14712, 14714, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 14716, 14718, 14720, 14722, 14724, 14726,\n14728, 14730, 14732, 14734, 14736, 14738, 14740, 14742, 14744, 14746,\n14748, 14750, 14752, 14754, 14756, 14758, 14760, 14762, 14764, 14766,\n14768, 14770, 14772, 14774, 14776, 14778, 14780, 14782, 14784, 14786,\n14788, 14790, 14792, 14794, 14796, 14798, 14800, 14802, 14804, 14806,\n14808, 14810, 14812, 14814, 14816, 14818, 14820, 14822, 14824, 14826,\n14828, 14830, 14832, 14834, 14836, 14838, 14840, 14842, 14844, 14846,\n14848, 14850, 14852, 14854, 14856, 14858, 14860, 14862, 14864, 14866,\n14868, 14870, 14872, 14874, 14876, 14878, 14880, 14882, 14884, 14886,\n14888, 14890, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 14892, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, 14894, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 14896, -1, -1, -1, 14898, 14900,\n14902, 14904, 14906, -1, 14909, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 14911, -1, 14913, 14915,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 14918, 14920, 14922, 14924, 14926, 14928, 14930, 14932,\n14934, 14936, 14938, 14940, 14942, 14944, 14946, 14948, 14950, 14952,\n14954, 14956, 14958, 14960, 14962, 14964, 14966, 14968, 14970, 14972,\n14974, 14976, 14978, 14980, 14982, 14984, 14986, 14988, 14990, 14992,\n14994, 14996, 14998, 15000, 15002, 15004, 15006, 15008, 15010, 15012,\n15014, 15016, 15018, 15020, 15022, 15024, 15026, 15028, 15030, 15032,\n15034, 15036, 15038, 15040, 15042, 15044, 15046, 15051, 15057, 15063,\n15070, 15076, 15083, 15090, 15098, 15104, 15111, 15118, 15126, 15133,\n15141, 15149, 15158, 15164, 15171, 15178, 15186, 15193, 15201, 15209,\n15218, 15225, 15233, 15241, 15250, 15258, 15267, 15276, 15286, 15292,\n15299, 15306, 15314, 15321, 15329, 15337, 15346, 15353, 15361, 15369,\n15378, 15386, 15395, 15404, 15414, 15421, 15429, 15437, 15446, 15454,\n15463, 15472, 15482, 15490, 15499, 15508, 15518, 15527, 15537, 15547,\n15558, 15563, 15569, 15575, 15582, 15588, 15595, 15602, 15610, 15616,\n15623, 15630, 15638, 15645, 15653, 15661, 15670, 15676, 15683, 15690,\n15698, 15705, 15713, 15721, 15730, 15737, 15745, 15753, 15762, 15770,\n15779, 15788, 15798, 15804, 15811, 15818, 15826, 15833, 15841, 15849,\n15858, 15865, 15873, 15881, 15890, 15898, 15907, 15916, 15926, 15933,\n15941, 15949, 15958, 15966, 15975, 15984, 15994, 16002, 16011, 16020,\n16030, 16039, 16049, 16059, 16070, 16076, 16083, 16090, 16098, 16105,\n16113, 16121, 16130, 16137, 16145, 16153, 16162, 16170, 16179, 16188,\n16198, 16205, 16213, 16221, 16230, 16238, 16247, 16256, 16266, 16274,\n16283, 16292, 16302, 16311, 16321, 16331, 16342, 16349, 16357, 16365,\n16374, 16382, 16391, 16400, 16410, 16418, 16427, 16436, 16446, 16455,\n16465, 16475, 16486, 16494, 16503, 16512, 16522, 16531, 16541, 16551,\n16562, 16571, 16581, 16591, 16602, 16612, 16623, 16634, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, 16646,\n16648, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n16651, 16655, 16658, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 16662, 16664, 16666, 16668, 16670, 16672, 16674, 16676,\n16678, 16680, 16682, 16684, 16686, -1, 16688, 16690, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 16692, 16694,\n-1, -1, -1, -1, 16697, 16699, -1, 16702, -1, 16704,\n16707, 16709, -1, 16711, -1, -1, 16714, 16716, -1, -1,\n16718, 16720, -1, 16722, 16724, 16726, 16728, 16730, 16732, 16734,\n16736, 16739, -1, -1, -1, -1, 16742, 16745, 16748, 16751,\n-1, -1, 16754, -1, 16757, 16759, 16761, 16763, 16765, 16767,\n16769, 16771, -1, -1, -1, -1, 16773, 16778, 16785, 16787,\n-1, -1, 16789, 16791, 16793, 16795, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n16799, 16801, 16804, 16807, 16809, 16815, 16817, 16819, 16821, 16823,\n16826, 16829, 16833, 16835, 16838, 16840, 16843, 16846, 16850, 16852,\n16855, 16857, 16860, 16863, 16867, 16870, 16874, 16877, 16881, 16884,\n16887, 16890, 16893, 16895, 16897, 16899, 16901, 16903, 16905, 16907,\n16909, 16911, -1, -1, -1, -1, -1, -1, 16913, 16915,\n16917, 16919, 16921, -1, 16923, 16925, 16930, 16935, 16940, -1,\n-1, -1, -1, -1, -1, 16945, 16947, 16949, 16951, 16953,\n16955, 16957, 16959, 16961, 16963, 16965, 16968, 16971, 16974, 16977,\n16980, 16983, 16986, 16989, 16992, 16995, 16998, 17001, 17005, 17008,\n17011, 17014, 17017, 17020, 17023, 17026, 17029, 17032, 17036, 17039,\n17043, 17047, 17050, 17053, 17056, 17059, 17062, 17065, 17068, 17071,\n17074, 17077, 17080, 17083, 17086, 17089, 17092, 17095, 17098, 17101,\n17104, 17107, 17110, 17113, 17116, 17119, 17122, 17125, 17128, 17131,\n17134, 17137, 17140, 17143, 17146, 17149, 17152, 17155, 17158, 17161,\n17164, 17167, 17170, 17173, 17176, 17179, 17182, 17185, 17187, -1,\n-1, -1, -1, -1, -1, -1, -1, 17190, 17192, -1,\n-1, 17194, 17196, 17198, 17200, 17202, 17204, 17206, 17208, 17210,\n17212, 17214, 17217, 17220, 17223, 17226, 17229, 17232, 17235, 17238,\n17241, 17244, 17247, 17250, 17254, 17257, 17260, 17263, 17266, 17269,\n17272, 17275, 17278, 17281, 17285, 17288, 17292, 17296, 17299, 17302,\n17305, 17308, 17311, 17314, 17317, 17320, 17323, 17326, 17329, 17332,\n17335, 17338, 17341, 17344, 17347, 17350, 17353, 17356, 17359, 17362,\n17365, 17368, 17371, 17374, 17377, 17380, 17383, 17386, 17389, 17392,\n17395, 17398, 17401, 17404, 17407, 17410, 17413, 17416, 17419, 17422,\n17425, 17428, 17431, 17434, 17436, 17439, 17442, 17445, 17448, 17451,\n17454, -1, -1, 17457, 17459, -1, -1, -1, -1, -1,\n-1, 17461, 17463, 17465, 17467, 17469, 17471, 17473, 17475, 17477,\n17479, 17481, 17483, 17485, 17487, 17489, 17492, 17495, 17498, 17500,\n17502, 17504, 17506, 17508, 17510, 17512, 17515, 17518, 17521, 17524,\n17527, 17530, 17533, 17537, 17541, 17544, 17546, 17548, 17551, 17553,\n17556, -1, -1, -1, -1, 17559, 17561, 17564, 17567, 17569,\n17572, 17575, 17577, 17580, 17582, 17585, 17588, 17591, 17594, 17597,\n17600, 17603, 17605, 17607, 17610, 17613, 17615, -1, 17618, 17620,\n17623, 17625, 17627, 17629, 17631, 17633, 17635, 17638, 17641, 17645,\n17648, 17650, 17654, 17657, 17659, 17662, 17666, 17669, 17672, 17674,\n17678, 17681, 17684, 17687, 17690, 17693, -1, 17695, 17698, 17701,\n17704, 17707, 17711, 17714, 17718, 17721, 17724, 17727, 17730, 17733,\n17736, -1, 17739, 17743, 17747, 17750, 17753, 17756, 17760, 17763,\n17766, 17769, 17772, 17775, -1, 17777, 17779, 17782, 17785, 17788,\n17791, 17793, 17799, 17806, 17811, 17818, 17824, 17829, 17831, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 17835, 17838, 17841, 17844,\n17847, 17850, 17854, 17857, 17861, 17864, 17868, 17872, 17876, 17879,\n17883, 17888, 17893, 17896, 17899, 17903, 17908, 17910, 17912, 17914,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 17916, 17920, 17924, 17928, 17932, 17936, 17940, 17944,\n17947, 17951, 17955, 17959, 17963, 17967, 17971, 17976, 17981, 17986,\n17991, 17996, 18001, 18006, 18010, 18015, 18020, 18025, 18030, 18035,\n18040, -1, -1, -1, 18045, 18050, 18055, 18060, 18065, 18070,\n18075, 18080, 18085, 18090, 18096, 18103, 18110, 18118, 18124, 18131,\n18137, 18143, 18150, 18157, 18164, 18172, 18178, 18185, 18192, 18199,\n18206, 18212, 18219, 18227, 18233, 18239, 18246, 18252, 18259, 18262,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, 18265, 18268, 18271, 18274, 18277, 18280, 18283,\n18286, 18289, 18292, 18295, 18298, 18301, 18304, 18307, 18310, 18314,\n18318, 18322, 18326, 18330, 18334, 18338, 18341, 18345, 18349, 18353,\n18357, 18361, 18365, 18370, 18375, 18380, 18385, 18390, 18395, 18400,\n18404, 18409, 18414, 18419, 18424, 18429, -1, -1, -1, 18434,\n18439, 18444, 18449, 18454, 18459, 18464, 18469, 18474, 18479, 18484,\n18490, 18497, 18504, 18512, 18518, 18525, 18531, 18537, 18544, 18551,\n18558, 18566, 18572, 18579, 18586, 18593, 18599, 18606, 18612, 18619,\n18626, 18633, 18640, 18649, 18656, 18663, 18672, 18681, 18690, 18697,\n18704, 18711, 18717, 18725, 18732, 18740, 18746, 18752, 18759, 18765,\n18768, 18771, 18774, 18777, 18780, 18783, 18786, 18789, 18792, 18795,\n18798, 18801, 18804, 18807, 18810, 18813, 18816, 18819, 18822, 18825,\n18828, 18831, 18834, 18837, 18841, 18845, 18849, 18852, 18856, 18859,\n18863, 18865, 18867, 18869, 18871, 18873, 18876, 18879, 18882, 18885,\n18888, 18891, 18894, 18897, 18900, 18903, 18906, 18909, 18912, 18915,\n18918, 18921, 18924, 18927, 18930, 18933, 18936, 18939, 18942, 18945,\n18948, 18951, 18954, 18957, 18960, 18963, 18966, 18969, 18972, 18975,\n18978, 18981, 18984, 18987, 18990, 18993, 18996, -1, 18999, 19009,\n19015, 19022, 19026, 19033, 19038, 19042, 19049, 19054, 19060, 19064,\n19071, 19077, 19085, 19092, 19098, 19103, 19110, 19116, 19124, 19129,\n19138, 19148, 19157, 19162, 19171, 19180, 19186, 19191, 19198, 19204,\n19210, 19218, 19227, 19233, 19238, 19244, 19249, 19256, 19260, 19265,\n19270, 19278, 19286, 19292, 19299, 19307, 19313, 19318, 19327, 19333,\n19338, 19345, 19351, 19359, 19364, 19372, 19378, 19384, 19389, 19394,\n19400, 19405, 19409, 19415, 19420, 19425, 19431, 19436, 19441, 19446,\n19454, 19461, 19467, 19476, 19481, 19489, 19495, 19500, 19505, 19510,\n19516, 19521, 19527, 19533, 19537, 19546, 19551, 19554, 19557, 19560,\n19563, 19566, 19569, 19572, 19575, 19578, 19581, 19585, 19589, 19593,\n19597, 19601, 19605, 19609, 19613, 19617, 19621, 19625, 19629, 19633,\n19637, 19641, 19645, 19648, 19651, 19655, 19658, 19661, 19664, 19669,\n19674, 19677, 19684, 19691, 19699, 19705, 19710, 19713, 19716, 19719,\n19722, 19725, 19728, 19731, 19734, 19738, 19743, 19746, 19749, 19752,\n19755, 19758, 19761, 19764, 19768, 19772, 19776, 19780, 19783, 19786,\n19789, 19792, 19795, 19798, 19801, 19804, 19807, 19810, 19815, 19820,\n19824, 19829, 19834, 19839, 19843, 19848, 19852, 19858, 19861, 19865,\n19869, 19873, 19877, 19883, 19891, 19894, 19897, 19900, 19903, 19906,\n19909, 19912, 19915, 19918, 19921, 19924, 19927, 19930, 19933, 19936,\n19939, 19944, 19949, 19954, 19957, 19960, 19963, 19968, 19972, 19975,\n19978, 19981, 19984, 19987, 19992, 19995, 19998, 20001, 20004, 20008,\n20011, 20014, 20018, 20022, 20025, 20030, 20034, 20037, 20040, 20043,\n20046, 20050, 20054, 20057, 20060, 20063, 20066, 20069, 20072, 20075,\n20078, 20081, 20085, 20089, 20093, 20097, 20101, 20105, 20109, 20113,\n20117, 20121, 20125, 20129, 20133, 20137, 20141, 20145, 20149, 20153,\n20157, 20161, 20165, 20169, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n20173, 20177, 20183, 20188, 20192, 20199, -1, 20204, 20208, 20215,\n20220, 20227, 20232, 20236, 20240, 20244, 20250, 20255, 20261, 20267,\n20274, 20279, 20283, 20288, 20293, 20298, 20304, 20308, 20314, 20320,\n20324, 20331, 20336, 20341, 20348, 20353, 20358, 20365, 20370, 20376,\n20382, 20387, 20392, 20396, 20400, 20407, 20414, 20418, 20423, 20429,\n20435, 20442, 20448, 20453, 20459, 20464, 20468, 20473, 20478, 20483,\n20488, 20494, 20498, 20502, 20507, 20511, 20515, 20519, 20524, 20531,\n20536, 20541, 20546, 20551, -1, 20555, 20560, 20564, 20569, 20573,\n20577, 20581, 20588, 20594, 20600, 20606, 20610, 20616, 20623, 20630,\n20634, -1, 20639, 20644, 20649, 20653, 20657, 20661, 20668, 20673,\n20678, -1, 20683, 20688, 20694, 20699, 20703, 20709, 20714, 20719,\n-1, 20724, 20728, 20733, 20739, 20744, 20748, 20753, 20758, 20762,\n20767, 20771, 20776, 20781, 20785, -1, 20791, 20796, 20801, 20806,\n20811, 20817, 20822, 20826, 20831, 20837, 20841, 20845, 20852, 20857,\n20862, 20866, 20871, 20875, 20879, 20883, 20888, 20892, 20896, 20900,\n20906, 20910, 20915, 20920, 20925, 20929, 20934, 20938, 20942, 20946,\n20950, 20955, 20961, 20967, 20971, 20977, 20982, 20986, 20992, 20998,\n-1, 21002, 21009, 21015, 21021, 21028, 21035, 21041, 21045, 21050,\n21054, 21059, 21064, 21069, 21075, 21080, 21085, 21090, 21095, 21099,\n21103, 21109, 21113, 21118, 21123, 21127, 21133, 21137, 21142, 21146,\n21152, 21156, 21163, 21168, 21173, 21179, 21185, 21191, 21195, 21200,\n21205, 21210, 21216, 21220, 21225, 21229, 21236, 21240, 21246, 21252,\n21257, 21263, 21269, 21274, 21280, 21285, 21289, 21293, 21298, 21304,\n21308, 21314, 21321, -1, 21325, 21329, 21333, 21338, 21343, 21348,\n21354, 21360, 21366, 21373, 21377, 21382, 21386, 21392, 21397, 21402,\n21408, 21414, 21419, 21425, 21430, 21434, 21440, 21447, 21451, 21456,\n21460, 21466, 21471, 21476, 21480, 21485, 21491, 21495, 21499, 21503,\n21507, 21511, 21515, 21519, 21524, 21529, 21534, 21539, 21543, 21549,\n21556, 21561, 21566, 21571, 21575, 21580, 21587, 21592, 21597, 21604,\n21609, 21613, 21619, 21626, 21633, 21638, 21644, 21649, 21654, 21659,\n-1, 21664, 21670, 21674, 21678, 21682, 21686, 21690, 21695, 21700,\n21704, 21710, 21716, 21722, 21726, 21730, 21736, 21740, 21745, 21749,\n21753, 21757, 21761, 21768, 21774, 21779, 21784, 21789, 21794, 21798,\n21802, 21806, 21812, 21816, 21821, 21825, 21830, 21835, 21840, 21846,\n21850, 21856, 21860, 21864, 21869, 21874, 21878, 21882, 21886, 21891,\n21896, 21902, 21908, 21912, 21918, 21922, 21928, 21932, -1, 21938,\n-1, 21942, 21947, 21953, 21957, 21962, 21969, 21973, 21979, 21984,\n21988, 21994, 21999, 22003, 22009, 22013, 22018, 22023, 22028, 22034,\n22040, 22046, 22050, 22054, 22059, 22065, 22071, 22076, 22081, 22086,\n22091, 22096, 22100, 22105, 22110, 22117, 22121, 22126, 22131, 22135,\n22140, 22144, 22149, 22153, 22157, 22162, 22166, 22171, 22177, 22182,\n22187, 22192, 22198, 22204, 22208, 22212, 22218, 22223, 22228, 22233,\n22237, 22241, 22247, 22253, 22257, 22263, 22269, 22275, 22281, 22287,\n22292, 22296, 22301, 22308, 22315, 22321, 22326, 22332, 22337, 22341,\n22345, 22350, 22356, 22362, 22367, 22371, 22376, 22381, 22387, 22392,\n22396, 22400, 22404, 22407, 22412, 22416, 22423, 22427, 22431, 22436,\n22440, 22444, 22450, 22454, 22460, 22464, 22470, 22475, 22481, 22487,\n22492, 22497, 22501, 22505, 22509, 22513, 22517, 22523, 22528, 22532,\n22536, 22541, 22546, 22551, 22555, 22559, 22564, -1, 22570, 22575,\n22580, 22584, -1, 22589, 22595, 22600, 22604, 22608, 22612, 22618,\n22623, 22629, 22635, 22640, 22645, 22651, 22655, 22659, 22664, 22668,\n22673, 22677, 22683, 22690, 22695, 22701, 22706, 22711, 22716, 22721,\n22726, 22731, 22737, 22743, 22747, 22753, 22758, 22764, 22769, 22774,\n22779, 22784, 22789, 22794, 22800, 22806, 22812, 22818, 22823, 22827,\n22831, 22835, 22840, 22846, 22851, 22856, 22863, 22868, 22874, 22879,\n22885, 22891, 22897, 22901, 22907, 22911, 22916, 22922, 22927, 22932,\n22938, 22944, 22949, 22955, 22959, 22964, 22968, 22972, 22977, 22982,\n22988, 22994, 22998, 23003, 23008, -1, 23014, 23020, 23027, 23033,\n23038, 23044, 23051, 23057, 23062, 23067, 23072, 23076, 23082, 23087,\n23091, 23096, 23102, 23107, 23113, 23119, 23123, 23126, 23131, 23136,\n23143, 23148, 23152, 23157, 23162, 23168, 23173, 23177, 23184, 23189,\n23195, 23201, 23206, 23211, 23217, 23221, 23226, 23230, 23234, 23238,\n23243, 23249, 23255, 23259, 23263, 23268, 23273, 23277, 23283, 23287,\n23293, 23297, 23302, 23307, 23312, 23316, 23320, 23325, 23330, 23335,\n23342, 23347, 23352, 23357, 23361, 23366, 23370, 23376, 23382, 23386,\n23390, 23395, 23400, 23404, 23410, 23416, 23422, 23427, 23432, 23436,\n23442, 23448, 23453, 23459, 23464, 23469, 23474, 23480, 23486, 23491,\n23496, 23501, 23507, 23511, 23517, 23522, 23527, 23532, -1, 23538,\n23543, 23548, 23553, 23558, 23563, 23568, 23574, 23579, 23585, 23591,\n23597, 23601, 23608, 23612, 23618, 23623, 23630, 23637, 23643, 23648,\n23653, 23658, 23665, 23671, 23676, 23680, 23684, 23688, 23693, 23699,\n23704, 23710, 23714, 23719, 23725, 23731, 23736, 23742, 23748, 23755,\n23762, 23768, 23774, 23781, 23786, 23791, 23795, 23799, 23804, 23811,\n23818, 23824, 23828, 23834, 23840, 23845, 23849, 23854, 23859, 23866,\n23872, 23877, 23883, 23888, 23894, 23899, 23905, 23910, 23913, 23919,\n23925, 23931, 23936, 23940, -1, 23944, 23948, 23954, 23961, 23966,\n23970, 23975, 23980, 23986, 23990, 23996, 24002, 24006, 24011, 24015,\n24020, 24026, 24032, 24036, 24042, 24048, 24054, 24060, 24066, 24071,\n24076, 24082, 24087, -1, 24092, 24097, 24101, 24105, 24110, 24116,\n24122, 24127, 24131, 24136, 24142, 24148, 24152, 24158, 24165, 24169,\n24176, 24181, 24186, 24190, 24197, 24202, 24206, 24212, 24217, 24222,\n24226, 24231, 24236, 24242, 24248, 24252, 24258, 24263, 24269, 24274,\n24280, 24286, 24291, 24296, 24300, 24305, 24310, 24315, 24321, 24326,\n24331, 24337, 24341, 24345, 24350, 24355, 24361, 24368, 24375, 24381,\n24388, 24394, 24401, 24406, 24410, 24415, 24421, 24425, 24432, 24436,\n24441, 24445, 24450, 24454, 24458, 24463, 24468, 24473, 24478, 24484,\n24490, 24495, 24500, 24505, 24511, 24516, 24521, 24527, 24531, 24538,\n24542, 24548, 24553, 24559, 24566, 24570, 24574, 24580, 24585, -1,\n24589, 24594, 24600, 24606, 24612, 24618, 24624, 24628, 24632, 24638,\n24642, 24649, 24655, 24661, 24667, 24671, 24675, 24679, 24685, 24692,\n24697, 24702, 24707, 24713, 24718, 24724, 24729, 24733, 24740, 24744,\n24749, 24754, 24761, 24766, 24772, 24777, 24782, 24786, 24792, 24796,\n24802, 24807, 24812, 24817, 24822, 24828, 24832, 24836, 24841, 24847,\n24853, 24860, 24864, 24870, 24876, 24881, 24886, 24890, 24895, 24899,\n24905, 24911, 24916, 24922, 24928, 24934, 24938, 24945, 24950, 24954,\n24961, 24965, 24971, 24976, 24980, 24985, 24991, 24997, 25002, 25007,\n25013, 25019, 25024, 25029, 25033, 25037, 25041, 25047, 25053, 25059,\n25066, 25072, 25078, 25084, 25090, 25095, 25101, 25106, 25111, 25115,\n25119, 25125, 25131, 25138, 25143, 25147, 25152, 25157, 25162, 25167,\n25173, 25177, 25181, 25185, 25190, 25195, 25200, 25206, 25210, 25215,\n25221, 25227, 25232, 25236, 25240, 25246, 25252, 25258, 25263, 25270,\n25275, 25280, 25286, 25292, 25296, 25303, 25309, 25313, 25317, 25322,\n25326, 25332, 25337, 25342, 25347, 25352, 25358, 25363, 25368, 25373,\n25381, 25386, 25391, 25395, 25399, 25404, 25410, 25415, 25420, 25425,\n25429, 25434, 25440, 25445, 25450, 25455, 25459, 25464, 25469, 25474,\n25478, 25484, 25492, 25496, 25501, 25505, 25509, 25515, 25520, 25526,\n25533, 25538, 25543, 25548, 25553, 25558, 25562, 25568, 25573, 25579,\n25585, 25590, 25595, 25600, 25608, 25613, 25617, 25622, 25626, 25631,\n25637, 25643, 25648, 25652, 25656, 25661, 25666, 25670, 25675, 25680,\n25685, 25689, 25693, 25699, 25704, 25709, 25713, 25719, 25724, 25729,\n25733, 25737, 25743, 25748, 25756, 25761, 25767, 25772, 25776, 25780,\n25785, 25790, 25796, 25800, 25808, 25812, 25818, 25823, 25827, 25831,\n25836, 25842, 25847, 25853, 25859, 25863, 25867, 25872, 25876, 25881,\n25888, 25894, 25899, 25905, 25909, 25914, 25918, 25925, 25931, 25935,\n25940, 25945, 25953, 25959, 25965, 25971, 25975, 25979, 25984, 25990,\n25996, 26001, 26007, 26012, 26018, 26023, 26028, 26033, 26039, 26045,\n26049, 26053, 26058, 26063, 26069, 26074, 26080, 26086, 26092, 26097,\n26101, 26107, 26111, 26117, 26122, 26128, 26134, 26138, 26142, 26147,\n26151, 26155, 26161, 26166, 26172, 26177, 26181, 26186, 26191, 26196,\n26202, 26207, 26212, 26218, 26223, 26227, 26232, 26236, 26242, 26246,\n26251, 26257, 26261, 26267, 26272, 26277, 26283, 26288, 26294, 26298,\n26304, 26309, 26316, 26321, 26326, 26330, 26335, 26339, 26345, 26350,\n26354, 26359, 26364, 26370, 26376, 26382, 26388, 26392, 26397, 26403,\n26409, 26413, 26418, 26424, 26429, 26433, 26438, 26444, 26450, 26454,\n26458, 26463, 26467, 26471, 26476, 26482, 26489, 26494, 26498, 26502,\n26508, 26513, 26517, 26522, 26529, 26535, 26541, 26547, 26551, 26556,\n26561, 26567, 26573, 26577, 26582, 26587, 26592, 26597, 26602, 26606,\n26610, 26615, 26621, 26627, 26632, 26638, 26643, 26648, 26653, 26658,\n26662, 26667, 26673, 26678, 26683, 26688, 26693, -1, 26699, 26706,\n26712, 26716, 26721, 26725, 26729, 26733, 26738, 26742, 26748, 26752,\n26757, 26764, 26768, 26773, 26778, 26783, 26788, 26794, 26799, 26803,\n26807, 26814, 26820, 26827, 26834, 26838, 26843, 26847, 26853, 26858,\n26863, 26869, 26876, 26881, 26885, 26890, 26895, 26900, 26905, 26910,\n26915, 26921, 26927, 26933, 26937, 26942, 26946, 26950, 26954, 26958,\n26962, 26967, 26972, 26978, 26982, 26986, 26991, 26996, 27002, 27008,\n27012, 27016, 27023, 27027, 27032, 27037, 27042, 27046, 27051, 27056,\n27061, 27066, 27071, 27075, 27081, 27086, 27091, 27096, 27101, 27106,\n27110, 27114, 27121, 27125, 27132, 27138, 27142, 27148, 27153, 27157,\n27162, 27166, 27170, 27175, 27179, 27184, 27189, 27194, 27199, 27204,\n27211, 27216, 27221, 27226, 27231, 27237, 27241, 27246, 27252, 27257,\n27263, 27268, 27272, 27277, 27282, 27286, 27290, 27293, 27299, -1,\n27303, 27308, 27314, 27317, 27323, 27327, 27332, 27337, 27341, 27345,\n27349, 27354, 27359, 27364, 27369, -1, 27375, 27379, 27383, 27388,\n27392, 27398, 27402, 27406, 27411, 27416, 27422, 27427, 27432, 27437,\n27443, 27447, 27453, 27460, 27465, 27469, 27474, 27479, 27485, 27490,\n27495, 27500, 27504, 27509, 27514, 27518, 27522, 27529, 27534, 27538,\n27543, 27548, 27554, 27558, 27564, 27569, 27574, 27578, 27582, 27586,\n27591, 27595, 27601, 27608, 27613, 27618, 27623, 27628, 27633, 27637,\n27642, 27647, 27652, 27656, 27661, 27669, 27674, 27680, 27686, 27690,\n27694, 27699, 27704, 27709, 27715, 27719, 27725, 27731, 27735, 27740,\n27745, 27750, 27755, 27760, 27765, 27770, 27775, 27781, 27786, 27790,\n27794, 27800, 27805, 27810, 27815, 27820, 27826, 27832, 27836, 27842,\n27846, 27851, 27856, 27861, 27866, 27871, 27875, 27880, 27885, 27889,\n27894, 27899, 27903, 27909, -1, 27913, 27919, 27924, 27928, 27934,\n27939, 27943, 27949, 27954, 27958, 27962, 27966, 27972, 27977, 27983,\n27989, 27994, 27998, 28002, 28009, 28014, 28019, 28023, 28027, 28030,\n28034, 28038, 28043, 28047, 28052, 28058, 28063, 28068, 28073, 28078,\n28082, 28087, 28092, 28097, 28101, 28106, 28110, 28115, 28120, 28123,\n28128, 28134, 28140, 28146, 28150, 28156, 28161, 28167, 28171, 28175,\n28181, 28185, 28190, 28194, 28200, 28205, 28210, 28215, 28219, 28223,\n28228, 28232, 28237, 28241, 28244, 28248, 28253, 28257, 28261, 28268,\n28272, 28277, 28281, 28287, 28293, 28298, 28305, 28309, 28314, 28318,\n28322, 28327, 28331, 28335, 28340, 28346, -1, 28352, 28359, 28363,\n28366, 28371, 28377, 28382, 28387, 28391, 28394, 28400, 28405, 28410,\n28414, 28420, 28425, 28431, 28436, 28440, 28444, 28448, 28454, 28458,\n28462, 28466, 28471, 28475, 28479, 28484, 28489, 28494, 28498, 28504,\n28510, 28514, 28520, 28524, 28528, 28532, 28537, 28541, 28546, 28551,\n28556, 28561, 28565, 28569, 28575, 28579, 28584, 28588, 28593, 28598,\n28604, 28608, 28613, 28619, 28623, 28627, 28631, 28635, 28640, 28644,\n28650, 28656, 28662, 28667, 28671, 28677, 28682, 28686, 28690, 28693,\n28700, 28705, 28709, 28713, 28718, 28722, 28727, 28731, 28736, 28741,\n28745, 28751, 28755, 28762, 28767, 28773, 28777, 28782, 28787, 28793,\n28798, 28804, 28807, 28813, 28818, 28823, 28828, 28833, 28837, 28841,\n28846, 28852, 28858, 28864, 28871, 28876, 28880, 28884, 28889, 28893,\n28897, 28902, 28909, 28913, 28918, 28925, 28929, 28933, 28939, 28943,\n-1, 28948, 28953, 28960, 28966, -1, 28971, 28975, 28981, 28986,\n28990, 28995, 29001, 29007, 29012, 29018, 29022, 29025, 29030, 29036,\n29040, 29044, 29048, 29052, 29056, 29062, 29068, 29073, 29077, 29082,\n29087, 29094, 29098, 29103, 29107, 29112, 29117, 29121, 29126, 29132,\n29138, 29144, 29148, 29153, 29158, 29162, 29166, 29171, 29176, 29181,\n29187, 29191, 29195, 29200, 29204, 29210, 29216, 29220, 29224, 29230,\n29235, 29240, 29245, 29249, 29254, 29258, 29263, 29267, 29271, 29276,\n29280, 29285, 29291, 29296, 29301, 29306, 29313, 29318, 29323, 29329,\n29335, 29340, 29344, 29349, 29353, 29359, 29364, 29368, 29372, 29378,\n29383, 29389, 29396, 29400, 29404, 29411, 29415, 29420, 29424, 29430,\n29434, 29440, 29445, 29450, 29454, 29459, 29463, 29467, 29473, 29478,\n29483, 29489, 29495, 29502, 29506, 29512, 29517, 29520, 29526, 29533,\n29538, 29542, 29547, 29552, 29557, 29561, 29565, 29569, 29574, 29579,\n29584, 29588, 29592, 29596, 29601, 29607, 29611, 29615, 29619, 29624,\n29629, 29636, 29642, 29646, 29651, 29655, 29659, 29665, 29670, 29674,\n29679, 29683, 29690, 29695, 29700, 29705, 29710, 29714, 29720, 29725,\n29729, 29735, 29741, -1, 29747, 29753, 29758, 29762, 29766, 29771,\n29776, 29780, 29786, 29791, 29796, 29802, 29806, 29811, 29815, 29820,\n29825, 29830, 29835, 29841, 29847, 29852, 29856, 29860, 29865, 29870,\n29875, 29879, 29885, 29889, 29894, 29901, 29906, 29912, 29918, 29922,\n29926, 29930, 29935, 29942, 29947, 29952, 29956, 29963, 29967, 29972,\n29978, 29985, 29989, 29995, 30000, 30006, 30011, 30016, 30021, 30026,\n30030, 30034, 30039, 30044, 30050, 30056, 30061, 30067, 30072, 30076,\n30080, 30085, 30090, 30094, 30099, 30104, 30108, 30113, 30117, 30120,\n30125, 30132, 30136, 30142, 30146, 30152, 30157, 30161, 30166, 30170,\n30175, 30180, 30184, 30188, 30194, 30200, 30204, 30209, 30213, 30217,\n30223, 30227, 30233, 30238, 30242, 30246, 30251, 30256, 30262, 30266,\n30270, 30275, 30280, 30285, 30290, 30295, 30300, 30305, 30310, 30314,\n30319, 30324, 30328, 30332, 30336, 30341, -1, 30345, 30351, 30355,\n30359, 30363, 30369, 30374, 30379, 30383, 30388, 30393, 30398, 30402,\n30406, 30412, 30419, 30425, 30430, 30435, 30440, 30445, 30450, 30454,\n30460, 30466, 30471, 30475, 30479, 30485, 30489, 30494, 30499, 30503,\n30509, 30513, 30520, 30524, 30528, 30532, 30536, 30540, 30544, 30549,\n30553, 30557, 30563, 30567, 30573, 30579, 30585, 30591, 30595, 30601,\n30606, 30611, 30616, 30621, 30627, 30632, 30638, 30642, 30647, 30653,\n30658, 30663, 30669, 30673, 30678, 30682, 30688, 30694, 30698, 30703,\n30708, 30713, 30717, 30722, 30725, 30730, 30735, 30740, 30745, 30750,\n30758, 30762, 30767, 30771, 30776, 30783, 30789, 30793, 30797, 30801,\n30806, 30812, 30816, 30822, 30827, 30832, 30836, 30841, 30846, 30851,\n30856, 30860, 30864, 30869, 30875, 30879, 30884, 30888, 30894, 30899,\n30905, 30910, 30915, 30919, 30922, 30927, 30931, 30936, 30942, 30948,\n30952, 30958, 30963, 30969, 30973, 30978, 30983, 30987, 30992, 30997,\n31003, 31008, 31013, 31017, 31021, 31026, 31031, 31037, 31041, 31046,\n31050, 31055, 31059, 31064, 31069, 31073, 31078, 31082, 31088, 31092,\n31097, 31102, 31106, -1, -1, 31113, 31117, 31121, 31125, 31130,\n31134, 31139, 31144, 31149, 31153, 31157, 31164, 31169, 31173, 31178,\n31184, 31190, 31196, 31200, 31205, 31209, 31213, 31219, 31223, 31228,\n31234, 31239, 31243, 31250, 31255, 31259, 31263, 31268, 31272, 31277,\n31283, 31289, 31295, 31301, 31305, 31309, 31315, 31321, 31327, 31333,\n31338, 31345, 31350, 31356, 31360, 31364, 31370, 31376, 31380, 31384,\n31389, 31395, 31400, 31404, 31408, 31412, 31418, 31422, 31427, 31432,\n31437, -1, -1, 31443, 31448, 31453, 31458, 31463, 31467, 31472,\n31478, 31483, 31488, 31493, 31498, 31504, 31510, 31515, 31521, 31527,\n31534, 31540, 31545, 31551, 31555, 31560, 31566, 31571, 31576, 31581,\n31587, 31592, 31596, 31601, 31606, 31611, 31616, 31620, 31626, 31630,\n31635, 31640, 31645, 31649, 31654, 31659, 31664, 31669, 31673, 31677,\n31682, 31688, 31693, 31699, 31703, 31709, 31714, 31721, 31726, 31732,\n31738, 31742, 31746, 31752, 31758, 31761, 31765, 31769, 31773, 31779,\n31784, 31789, 31793, 31799, 31805, 31811, 31815, 31819, 31823, 31829,\n31836, 31840, 31844, 31849, 31853, 31858, 31863, 31867, 31871, 31875,\n31880, 31884, 31888, 31892, 31898, 31904, 31910, 31916, 31922, 31927,\n31935, 31941, 31948, 31955, 31959, 31964, 31968, 31972, 31977, 31982,\n31987, 31992, 31997, 32002, 32007, 32012, 32017, 32023, 32028, 32034,\n32039, 32044, 32049, 32054, 32058, 32063, 32069, 32073, 32079, 32083,\n32089, 32093, 32099, 32103, 32109, 32115, 32120, 32124, 32128, 32132,\n32137, 32143, 32147, 32152, 32158, 32163, 32167, 32172, 32177, 32182,\n32187, 32193, 32199, 32204, 32208, 32213, 32217, 32224, 32230, 32234,\n32238, 32243, 32248, 32252, 32256, 32261, 32266, 32270, 32275, 32280,\n32286, 32291, 32295, 32299, 32304, 32310, 32314, 32320, 32326, 32330,\n32334, 32339, -1, 32344, 32350, 32356, 32360, 32364, 32368, 32372,\n32377, 32382, 32387, 32392, 32397, 32402, 32408, 32412, 32419, 32424,\n32429, 32434, 32439, 32444, 32450, 32455, 32459, 32464, 32470, 32475,\n32480, 32485, 32492, 32498, 32501, 32505, 32511, 32517, 32521, -1,\n32526, 32531, 32537, 32542, 32548, 32553, 32557, 32563, 32569, 32575,\n32581, 32586, 32590, 32594, 32599, 32604, 32608, 32614, 32619, 32625,\n32629, 32635, 32641, 32646, 32652, 32657, 32662, 32666, 32671, 32677,\n32683, 32690, 32695, 32700, 32705, 32710, 32715, 32719, 32726, 32732,\n32736, 32741, 32746, 32751, 32758, 32762, 32768, 32772, 32776, 32780,\n32784, 32790, 32795, 32799, 32806, 32811, 32815, 32820, 32827, 32833,\n32840, 32846, 32851, 32856, 32860, 32865, 32870, 32876, 32881, 32886,\n32891, 32895, 32900, 32904, 32909, 32913, 32919, 32923, 32928, 32932,\n32936, 32940, 32944, 32950, 32955, 32959, 32965, 32970, 32975, 32981,\n32985, 32988, 32994, 32998, 33002, -1, 33008, 33012, -1, 33018,\n-1, 33022, 33027, 33032, 33036, 33043, 33048, 33053, 33057, 33063,\n33068, 33073, 33080, 33085, 33090, 33095, 33099, 33103, 33108, 33113,\n33119, 33122, 33128, 33133, 33139, 33143, 33150, 33153, 33158, 33163,\n33168, 33172, 33177, 33184, 33188, 33193, 33198, 33204, 33211, 33216,\n33222, 33228, 33234, 33241, 33247, 33254, 33262, 33269, 33276, 33282,\n-1, 33288, 33294, 33298, 33302, 33308, 33314, 33318, 33325, 33331,\n33336, 33340, 33344, 33349, 33353, 33357, 33363, 33370, 33374, 33380,\n33385, 33392, 33396, 33402, 33408, 33413, 33419, 33424, 33430, 33434,\n33441, 33446, 33450, 33456, 33460, 33466, 33471, 33476, 33482, 33488,\n33493, 33498, 33503, 33508, 33514, 33521, 33527, 33533, 33539, 33543,\n33547, 33551, 33557, 33562, 33566, 33573, 33581, 33586, 33591, 33596,\n33601, 33607, 33613, 33617, 33622, 33626, 33633, 33638, 33644, 33650,\n33656, 33661, 33665, 33670, 33677, 33682, 33686, 33693, 33697, 33702,\n33707, 33711, 33717, 33721, 33728, -1, 33735, 33741, 33747, 33753,\n33757, 33763, 33769, 33773, 33777, 33783, 33789, 33794, 33799, 33803,\n33808, 33813, 33818, 33822, 33829, 33834, 33839, 33844, 33850, 33854,\n33859, 33866, 33871, 33875, 33879, 33884, 33890, 33894, 33901, 33905,\n33911, 33916, 33920, 33924, 33928, 33934, 33941, 33945, 33951, 33955,\n33960, 33965, 33969, 33975, 33981, 33987, 33993, 33998, 34003, 34007,\n34011, 34015, 34019, 34024, 34029, 34035, 34041, 34046, 34053, 34057,\n34062, 34067, 34072, 34078, 34084, 34090, 34095, 34099, 34104, 34110,\n34115, 34120, 34125, 34130, -1, 34134, 34139, -1, 34144, 34152,\n34160, 34167, 34171, 34176, 34180, 34185, 34193, 34197, 34201, 34206,\n34210, 34214, 34218, 34223, 34229, 34235, 34240, 34246, 34250, 34255,\n34259, 34264, 34271, 34277, 34282, 34287, 34293, 34298, 34303, 34309,\n34313, 34318, 34323, -1, 34330, 34335, 34340, 34345, 34349, 34354,\n34360, 34365, 34369, 34374, 34379, 34383, 34389, 34394, 34399, 34404,\n34408, 34414, 34420, 34425, 34430, 34436, 34440, 34444, 34450, 34455,\n34459, 34465, 34470, 34476, 34482, 34487, 34492, 34497, 34502, 34507,\n34512, 34516, 34520, 34525, 34530, 34535, 34540, 34547, 34552, 34557,\n34561, 34565, 34571, 34577, 34581, 34586, 34591, 34597, 34601, 34606,\n34612, 34617, 34622, -1, 34628, 34633, 34638, 34644, 34648, 34653,\n34658, 34663, 34667, 34674, 34679, 34685, 34690, 34694, 34701, 34706,\n34712, 34717, 34723, 34729, 34733, 34738, 34744, 34749, 34753, 34757,\n34761, 34768, 34774, 34779, 34784, 34791, 34796, 34801, 34806, 34810,\n34816, 34821, 34825, 34829, 34835, 34840, 34846, 34852, 34856, 34861,\n34866, 34871, 34876, 34882, 34887, 34891, 34897, 34901, 34906, 34912,\n34918, 34926, 34930, 34934, 34939, 34944, 34948, 34954, 34959, 34964,\n34969, 34976, 34980, 34984, 34988, 34994, 35001, 35006, 35011, 35016,\n35022, 35027, 35032, 35037, 35045, 35050, 35055, 35059, 35064, 35069,\n35073, 35077, 35082, 35088, 35094, 35100, 35104, 35108, 35113, 35117,\n35121, 35125, 35131, 35137, 35143, 35147, 35152, 35158, 35163, 35169,\n35174, 35177, 35182, 35186, 35190, 35194, 35200, 35205, 35208, 35212,\n35216, 35220, 35227, 35232, 35237, 35241, 35245, 35251, 35255, 35259,\n35264, 35269, 35275, 35281, 35286, 35291, 35295, 35299, 35305, 35310,\n35314, 35318, 35324, 35329, 35334, 35339, 35345, 35352, 35357, 35361,\n35366, 35373, 35378, 35384, 35390, 35395, 35399, 35405, 35411, 35415,\n35421, 35426, 35430, 35434, 35440, 35446, 35453, 35458, 35463, 35468,\n35474, 35479, 35484, 35489, 35494, 35499, 35504, 35510, 35515, 35520,\n35525, 35531, 35535, 35541, 35546, 35552, 35556, 35561, 35565, 35570,\n35576, 35582, 35588, 35594, 35600, 35604, 35611, 35617, 35623, 35627,\n35632, 35636, 35641, 35645, 35650, 35656, 35662, 35669, 35675, 35680,\n35684, 35689, 35694, 35699, 35705, 35711, 35716, 35721, 35725, 35733,\n35736, 35741, 35746, 35751, 35757, 35761, 35766, 35770, 35774, 35779,\n35783, 35787, 35791, -1, 35795, 35801, 35805, 35809, 35815, 35819,\n35825, 35831, 35837, 35844, 35848, 35852, 35855, 35858, 35863, 35869,\n35875, 35880, 35884, 35888, 35893, 35899, 35904, 35910, 35916, 35921,\n35925, 35930, 35934, 35937, 35941, 35946, 35951, 35956, 35961, 35967,\n35971, 35977, 35983, 35988, 35994, 36000, 36006, 36012, 36016, 36020,\n36025, 36029, 36034, 36040, 36046, 36050, 36056, 36061, 36066, 36071,\n36076, 36081, 36085, 36089, 36093, 36099, 36105, 36110, 36115, 36121,\n36127, 36133, 36139, 36145, 36150, 36154, 36159, 36164, 36169, 36174,\n36178, 36182, 36187, 36191, 36196, 36201, 36206, 36212, 36217, 36222,\n36226, 36232, 36238, 36243, 36247, 36252, 36258, 36262, 36269, 36274,\n36281, 36287, 36291, 36297, 36303, 36308, 36313, 36318, 36324, 36330,\n36335, 36339, 36344, 36349, 36355, 36360, 36365, 36369, 36375, 36380,\n36384, 36389, 36393, -1, 36397, 36402, 36406, 36411, 36416, 36421,\n36426, 36430, 36434, 36440, 36446, 36452, 36456, 36461, 36466, 36471,\n36476, 36480, 36484, 36489, 36494, 36499, 36504, 36509, 36515, 36521,\n36526, 36532, 36538, 36544, 36548, 36552, 36558, 36564, 36569, 36575,\n36581, 36586, 36591, 36595, 36599, 36604, 36608, 36614, 36618, 36623,\n36629, 36634, 36638, 36645, 36651, 36657, 36661, 36665, 36669, 36674,\n36679, 36684, 36691, 36698, 36702, 36707, 36712, 36717, 36721, 36726,\n36730, 36734, 36738, 36743, 36750, 36754, 36759, 36763, 36767, 36773,\n36778, 36784, 36789, 36795, 36801, 36805, 36811, 36817, 36822, 36827,\n36833, 36838, 36842, 36846, 36851, 36855, 36860, 36865, 36869, 36874,\n36880, 36886, 36891, 36896, 36901, 36907, 36911, 36916, 36922, 36926,\n36931, 36935, 36941, 36946, 36953, 36959, 36965, 36970, 36976, 36982,\n36986, 36991, 36995, 37002, 37008, 37012, 37018, 37024, 37029, 37033,\n37037, 37042, 37048, 37052, 37057, 37062, 37067, 37073, 37078, 37084,\n37088, 37094, 37100, 37106, 37110, 37116, 37122, 37126, 37130, 37135,\n37141, 37146, 37151, 37159, 37165, 37171, 37178, 37183, 37189, 37195,\n37203, 37210, 37216, 37220, 37224, 37230, 37235, 37240, 37245, 37249,\n37254, 37259, 37264, 37270, 37275, 37279, 37283, 37288, 37293, 37297,\n37302, 37306, 37312, 37317, 37323, 37327, 37332, 37337, 37341, 37345,\n37349, -1, 37354, 37361, 37366, 37372, 37377, 37383, 37388, 37394,\n37400, 37405, 37411, 37415, 37419, 37423, 37427, 37431, 37435, 37440,\n37444, 37448, 37453, 37458, 37463, 37469, 37475, 37481, 37486, 37492,\n37496, 37501, 37507, 37514, 37518, 37524, 37528, 37532, 37538, 37543,\n37548, 37553, 37559, 37563, 37569, 37575, 37579, 37584, 37590, 37596,\n37602, 37608, 37614, 37620, 37625, 37629, 37634, 37639, 37644, 37651,\n37657, 37661, 37667, 37672, 37677, 37683, 37687, 37693, 37698, 37704,\n37710, 37717, 37722, 37728, 37734, 37739, 37744, 37749, 37754, 37759,\n37765, 37770, 37776, 37782, 37788, 37795, 37799, 37804, 37810, 37815,\n37819, 37824, 37829, 37833, 37839, 37843, 37848, 37852, 37857, 37863,\n37868, 37874, 37880, 37884, 37890, 37896, 37902, 37907, 37912, 37917,\n37921, 37926, 37932, 37937, 37943, 37948, 37952, 37957, 37963, 37969,\n37974, 37978, 37983, 37987, 37992, 37997, 38001, 38005, 38011, 38016,\n38021, 38027, 38033, 38038, 38043, 38049, 38054, 38060, 38065, 38071,\n38075, 38079, 38084, 38089, 38096, 38101, 38107, 38112, 38117, 38121,\n38126, 38131, 38135, 38140, 38146, 38150, 38156, 38163, 38167, 38172,\n38176, 38183, 38190, 38197, 38202, 38207, 38212, 38217, 38222, 38227,\n38233, 38237, 38243, 38247, 38251, 38255, 38259, 38265, 38270, 38276,\n38283, 38290, 38294, 38298, 38305, 38311, 38317, -1, 38323, 38329,\n38335, 38340, 38346, 38352, 38357, 38363, 38369, 38375, 38381, 38385,\n38390, 38395, 38400, 38407, 38412, 38417, 38421, 38426, 38431, 38436,\n38441, 38446, 38451, 38456, 38461, 38465, 38470, 38475, 38481, 38485,\n38489, 38495, 38499, 38503, 38507, 38512, 38518, 38522, 38526, 38531,\n38535, 38541, 38546, 38551, 38557, 38561, 38566, 38572, 38576, 38580,\n38586, -1, 38590, 38595, 38598, 38603, 38609, 38613, 38618, 38623,\n38628, 38632, 38636, 38640, 38644, 38650, 38654, 38658, 38663, 38667,\n38672, 38678, 38683, 38688, 38692, 38697, 38702, 38706, -1, 38712,\n38718, 38722, 38727, -1, 38733, 38739, 38743, 38747, 38752, 38756,\n38761, 38767, 38771, 38776, 38781, -1, 38785, 38790, 38795, 38800,\n38805, 38809, 38813, 38818, 38821, 38825, 38831, 38836, 38842, 38846,\n38851, 38857, 38861, 38866, 38871, 38875, 38881, 38887, 38891, 38896,\n38901, 38905, 38910, 38915, 38921, 38925, 38931, 38935, 38940, 38945,\n38950, 38954, 38960, 38964, 38969, 38973, 38978, 38983, 38989, 38994,\n38999, 39004, 39009, 39016, 39021, 39025, 39029, 39033, 39038, 39042,\n39048, 39054, 39059, 39065, 39071, 39076, 39081, 39086, 39091, 39097,\n39102, 39106, 39112, 39116, 39120, 39125, 39128, 39132, 39137, 39142,\n39146, 39150, 39154, 39159, 39165, 39171, 39175, 39179, 39184, 39188,\n39193, 39197, 39202, 39206, 39210, 39214, 39220, 39225, 39230, 39236,\n39241, 39245, 39250, 39256, 39263, 39269, 39275, 39278, 39281, 39285,\n39289, 39293, 39299, 39304, 39310, 39316, 39321, 39325, 39330, 39336,\n39342, 39347, 39353, 39360, 39364, 39370, 39375, 39380, 39385, 39390,\n39394, 39400, 39405, 39410, 39415, 39421, 39426, 39432, 39439, 39446,\n39450, 39455, 39460, 39464, 39469, 39473, 39478, 39483, 39488, 39492,\n39496, 39501, 39505, 39509, 39515, 39520, 39525, 39531, 39536, 39541,\n39548, 39553, 39558, 39564, 39569, 39576, 39581, 39586, 39590, 39595,\n39601, 39606, 39612, 39616, 39621, 39627, 39633, 39637, -1, 39642,\n39646, 39653, 39657, 39662, 39668, 39674, 39679, 39684, 39688, 39692,\n39697, 39702, 39707, 39712, 39715, 39720, 39725, 39729, 39734, 39739,\n39744, 39748, 39752, 39758, 39764, 39771, 39776, 39782, 39786, 39790,\n39796, 39801, 39806, 39811, 39816, 39821, 39827, 39832, 39837, 39843,\n39854, 39859, 39863, 39873, 39878, 39882, 39887, 39891, 39897, 39903,\n39909, 39915, 39920, 39924, 39929, 39933, 39939, 39945, 39949, 39954,\n39960, 39966, 39971, 39977, 39983, 39988, 39993, -1, 39997, 40002,\n40008, 40014, 40021, 40027, 40033, 40039, 40044, 40049, 40055, 40059,\n40064, 40071, 40077, 40083, 40087, 40092, 40096, 40103, 40108, 40113,\n40118, 40123, 40127, 40131, 40135, 40141, 40148, 40154, 40158, 40163,\n40169, 40174, 40179, 40185, 40190, 40196, 40202, 40207, 40213, 40218,\n40223, 40229, 40234, 40239, 40245, 40250, 40255, 40261, 40265, 40270,\n40275, 40279, 40283, 40287, 40290, 40296, 40300, 40305, 40309, 40313,\n40317, 40321, -1, 40326, 40330, 40336, 40341, 40347, 40351, 40355,\n40360, -1, 40365, 40370, 40374, 40379, 40385, 40391, 40397, 40403,\n40407, 40411, 40417, 40423, 40428, 40433, 40438, 40443, 40449, 40455,\n40461, 40467, 40473, -1, 40479, 40484, 40489, 40494, 40499, 40504,\n40511, 40516, 40523, 40529, 40536, 40542, 40547, 40553, 40559, 40564,\n40570, 40575, 40581, 40585, 40591, 40596, 40600, 40605, 40610, 40616,\n40621, 40626, 40630, 40634, 40638, 40642, 40647, 40653, 40660, 40664,\n40669, 40674, 40680, 40686, 40691, 40696, 40700, 40704, 40708, 40713,\n40717, 40723, 40730, 40735, 40740, 40745, 40750, 40754, 40759, 40763,\n40767, 40772, 40777, 40784, 40790, 40795, 40799, 40804, 40808, 40813,\n40817, 40823, 40828, 40834, 40838, 40843, 40847, 40851, 40855, 40859,\n40865, 40870, 40876, 40880, 40887, 40892, 40899, 40905, 40911, 40917,\n40922, 40927, 40931, 40937, 40942, 40947, 40953, 40959, 40966, 40971,\n40976, 40981, 40986, 40993, 40998, 41002, 41006, 41011, 41016, 41020,\n41025, 41032, 41036, 41040, 41045, 41049, 41053, 41057, 41063, 41069,\n41077, 41083, 41088, 41095, 41100, 41104, 41109, 41115, 41120, 41127,\n41133, 41138, 41142, 41148, 41153, 41157, 41161, 41167, 41174, 41181,\n41187, 41191, 41196, 41200, 41205, 41213, 41217, -1, 41222, 41226,\n41232, 41238, 41243, 41249, 41255, 41261, 41266, 41271, 41276, 41282,\n41287, 41292, 41298, 41304, 41310, 41316, 41322, 41328, 41333, 41338,\n41344, 41349, 41354, 41358, 41363, 41367, 41373, 41377, 41384, 41392,\n41396, 41402, 41406, 41411, 41416, 41424, 41429, 41433, 41438, 41443,\n41447, 41451, -1, 41455, 41459, 41465, 41469, 41474, 41480, 41484,\n41490, 41496, 41500, 41504, 41510, 41516, 41521, 41528, 41532, 41537,\n41543, 41548, 41553, 41557, 41562, 41568, 41572, 41577, 41581, 41587,\n41593, 41598, 41602, 41608, 41615, 41620, 41625, 41629, 41633, 41638,\n41644, 41650, 41655, 41661, 41666, 41672, 41676, 41680, 41686, 41691,\n41695, 41702, 41707, 41712, 41716, 41721, 41726, 41731, 41737, 41743,\n41748, 41754, 41759, 41765, 41770, 41775, 41780, 41784, 41789, 41794,\n41799, 41805, 41810, 41814, 41818, 41823, 41829, 41833, 41837, 41842,\n41848, 41855, 41859, 41864, 41871, 41876, 41882, 41886, 41893, 41898,\n41903, 41908, 41914, -1, 41918, 41924, 41930, 41936, 41942, 41946,\n41952, 41957, 41962, 41967, 41973, 41977, 41981, 41987, 41992, 41997,\n42002, 42008, 42014, 42019, 42025, 42029, 42033, 42039, 42044, 42048,\n42053, 42057, 42063, 42067, 42071, 42075, 42079, 42084, 42089, 42093,\n42098, 42103, 42109, 42115, 42120, 42124, 42128, 42134, 42138, 42143,\n42148, 42155, 42159, 42165, 42169, 42176, 42181, 42186, 42190, 42194,\n42198, 42204, 42208, 42214, 42218, 42224, 42230, 42234, 42238, 42244,\n42249, 42255, 42260, 42266, 42272, 42277, 42284, 42291, 42298, 42304,\n42309, 42316, 42320, 42324, 42329, 42334, 42340, 42345, 42350, 42354,\n42358, 42363, 42369, 42374, 42380, 42385, 42390, 42397, 42403, 42407,\n42412, 42417, 42422, 42426, 42430, 42435, 42441, 42445, 42449, 42455,\n42460, 42465, 42470, 42475, 42479, 42483, 42487, 42491, 42496, 42501,\n42507, 42513, 42518, 42524, 42529, 42534, 42538, 42543, 42548, 42554,\n42560, 42565, 42571, 42577, 42583, 42590, 42596, 42601, 42606, 42612,\n42617, 42621, 42627, 42634, 42638, 42644, 42649, 42653, 42658, 42664,\n42668, 42674, 42681, 42685, 42691, 42697, 42702, 42706, 42711, 42716,\n42722, 42728, 42732, 42737, 42741, 42748, 42753, 42757, 42763, 42767,\n-1, 42773, 42778, 42784, 42788, 42793, -1, 42797, 42801, 42808,\n42813, 42819, 42825, 42830, 42834, 42839, 42844, 42850, 42855, 42860,\n42866, 42873, 42877, 42882, 42887, 42893, 42898, 42903, 42907, 42914,\n42920, 42925, 42929, 42936, 42943, 42948, 42952, 42959, 42964, 42970,\n42975, 42981, 42986, 42991, 42997, 43004, 43009, 43013, 43018, 43023,\n43027, 43031, 43035, 43040, 43045, 43051, 43056, 43060, 43065, 43070,\n43076, 43081, 43085, 43089, 43094, 43098, 43103, 43108, 43113, 43119,\n43125, 43129, 43134, 43140, 43146, 43151, 43156, 43163, 43170, 43174,\n43178, 43182, 43186, 43190, 43195, 43200, 43206, 43213, 43219, 43223,\n43229, 43234, 43238, 43243, 43249, 43254, 43259, 43265, 43271, 43276,\n43283, 43288, 43294, 43300, 43305, 43311, 43315, 43320, 43325, 43331,\n43336, 43342, 43346, 43350, 43357, 43365, 43369, 43373, 43378, 43384,\n43389, 43394, 43399, 43404, 43410, 43415, 43420, 43424, 43429, 43436,\n43440, 43444, 43449, 43453, 43457, 43461, 43465, 43471, 43475, 43481,\n43485, 43490, 43494, 43498, 43503, 43507, 43511, 43517, 43523, 43529,\n43533, 43539, 43543, 43547, 43551, 43556, 43561, 43567, 43573, 43579,\n43586, 43590, 43595, 43599, 43603, 43607, 43612, 43621, 43627, -1,\n43632, 43636, 43640, 43645, 43650, 43655, 43660, 43664, 43669, 43675,\n43682, 43686, 43691, 43696, 43702, 43708, 43715, 43720, 43725, 43731,\n43736, 43742, 43746, 43752, 43757, 43760, 43765, 43770, 43776, 43781,\n43786, 43791, 43796, 43800, 43807, 43813, 43818, 43823, 43827, 43831,\n43836, 43843, 43847, 43852, 43856, 43860, 43866, 43872, 43878, 43884,\n43888, 43893, 43898, 43904, 43909, 43913, 43918, 43921, 43927, 43933,\n43938, 43943, 43947, 43952, 43957, 43963, 43969, 43975, 43981, 43985,\n43990, 43996, 44001, 44005, 44009, 44014, 44018, 44023, 44028, 44032,\n44037, 44042, 44047, 44051, 44055, 44059, 44065, 44070, 44074, 44079,\n44084, 44088, 44094, 44100, 44106, 44113, 44118, 44122, 44126, 44131,\n44135, 44142, 44148, 44154, 44158, 44163, 44167, 44172, 44177, 44180,\n44185, 44191, 44197, 44201, 44206, 44212, 44217, 44222, 44227, 44232,\n44239, 44244, 44248, 44252, 44258, 44264, 44270, 44275, 44279, 44285,\n44291, 44296, 44300, 44305, 44310, 44314, 44320, 44326, 44331, 44336,\n44342, 44349, 44354, 44360, 44365, 44369, 44374, 44378, 44383, 44387,\n44393, 44398, 44402, 44406, 44411, 44417, 44423, 44427, 44432, 44436,\n44442, 44447, 44452, 44457, 44460, 44465, 44471, 44477, 44483, 44489,\n44493, 44498, 44505, 44509, 44514, 44519, 44524, 44529, 44535, 44540,\n44545, 44550, 44557, 44563, 44568, 44575, 44581, 44588, 44592, 44598,\n44602, 44608, 44613, 44619, 44623, 44629, 44635, 44640, 44646, 44651,\n44655, 44661, 44666, 44670, 44674, 44678, 44684, 44690, 44695, 44699,\n44703, 44709, 44715, 44720, 44726, 44731, 44734, 44740, 44745, 44749,\n44753, 44757, 44761, 44766, 44771, 44776, 44781, 44786, 44792, 44797,\n44803, -1, 44808, 44813, 44818, 44823, 44829, 44834, 44838, 44842,\n44846, 44851, 44857, 44864, 44868, 44872, 44876, 44884, 44888, 44893,\n44898, 44905, 44911, 44916, 44921, 44927, 44931, 44936, 44942, 44947,\n44952, 44958, 44964, 44968, 44973, 44978, 44983, 44987, 44991, 44997,\n45002, 45009, 45014, 45020, -1, 45026, 45031, 45037, 45043, 45047,\n45051, 45056, 45061, 45066, 45071, 45076, 45081, 45086, 45090, 45097,\n45103, 45107, 45115, 45120, 45126, 45131, 45136, 45141, 45146, 45151,\n45157, 45161, 45167, 45172, 45177, 45181, 45188, 45193, 45199, 45204,\n45210, 45215, 45221, 45227, 45233, 45237, 45242, 45247, 45253, 45257,\n45261, 45265, 45271, 45277, 45283, 45288, 45295, 45300, 45306, 45313,\n45317, 45321, 45327, 45332, 45337, 45343, 45349, 45355, 45360, 45366,\n45372, 45377, 45382, 45388, 45395, 45400, 45405, 45409, 45413, 45418,\n45423, 45428, 45433, 45438, 45442, 45447, 45451, 45457, 45462, 45467,\n45472, 45477, 45484, 45489, 45493, 45499, 45504, 45510, 45516, 45520,\n45525, 45530, 45534, 45540, 45545, 45552, 45556, 45560, 45565, 45571,\n45576, 45581, 45586, 45592, 45598, 45603, 45609, 45614, 45620, 45626,\n45631, 45636, 45640, 45645, 45650, 45655, 45661, 45665, 45670, 45674,\n45679, 45683, 45688, 45694, 45699, 45704, 45708, 45713, 45718, 45723,\n45728, 45733, 45737, 45742, 45747, 45753, 45757, 45763, 45768, 45772,\n45776, 45781, 45786, 45792, 45797, 45802, 45807, 45812, 45818, 45822,\n45827, 45834, 45841, 45846, 45850, 45855, 45860, -1, 45867, 45873,\n45879, 45884, 45890, 45896, 45902, 45908, 45912, 45916, 45922, 45927,\n45931, 45937, 45942, 45946, 45952, 45957, 45963, 45969, 45975, 45979,\n45984, 45988, 45994, 45998, 46003, 46009, 46013, 46020, 46024, 46029,\n46033, 46039, 46046, 46051, 46058, 46064, 46070, 46074, 46079, 46084,\n46089, 46094, 46098, 46103, 46108, 46112, 46117, 46122, 46128, 46134,\n46142, 46146, 46152, 46157, 46161, 46167, 46172, 46176, 46180, 46186,\n46190, 46194, 46200, 46205, 46209, 46213, 46217, 46221, 46224, 46229,\n46233, 46238, 46242, 46246, 46252, 46257, 46263, 46269, 46276, 46283,\n46287, 46291, 46297, 46301, 46306, 46311, 46317, 46320, 46325, 46330,\n46335, 46339, 46343, 46347, 46351, 46357, 46361, 46369, 46374, 46379,\n46386, 46392, 46398, 46402, 46406, 46411, 46417, 46422, 46426, 46430,\n46435, 46439, 46444, 46450, 46455, 46460, 46465, 46470, 46475, 46481,\n46486, 46491, 46496, 46501, 46505, 46511, 46516, 46521, 46525, 46529,\n46533, 46537, 46541, 46546, 46550, 46553, 46558, 46564, 46571, 46575,\n46580, 46587, 46593, 46599, 46603, 46608, 46612, 46617, 46622, 46626,\n46631, 46637, 46644, 46649, 46654, 46658, 46662, 46667, 46673, 46678,\n46683, 46688, 46694, 46699, 46704, 46708, 46713, 46717, 46721, 46725,\n46731, 46736, 46741, -1, 46748, 46752, 46757, 46763, 46768, 46774,\n46779, 46783, 46787, 46792, 46797, 46803, 46808, 46814, 46819, 46823,\n46827, 46831, 46835, 46840, 46844, 46848, 46852, 46856, 46862, 46866,\n46872, 46876, 46881, 46886, 46891, 46895, 46901, 46906, 46911, 46917,\n46921, 46927, 46931, 46935, 46940, 46945, 46950, 46956, 46960, 46966,\n46972, 46976, 46981, 46985, 46990, 46995, 46999, 47003, 47009, 47014,\n47020, 47025, 47030, 47034, 47038, 47042, 47047, 47053, -1, 47059,\n47065, 47070, 47076, 47080, 47084, 47090, 47095, 47100, 47105, 47110,\n47117, 47122, 47128, 47134, 47140, 47147, 47152, 47157, 47162, 47167,\n47172, 47176, 47181, 47186, 47193, 47198, 47202, 47206, 47211, 47216,\n47221, 47226, 47231, 47236, 47241, 47246, 47250, 47256, 47262, 47266,\n47272, 47276, 47282, 47286, 47292, 47297, 47302, 47306, 47311, 47315,\n47320, 47329, 47333, 47338, 47344, 47348, 47354, 47358, 47363, 47368,\n47374, 47380, 47387, 47391, 47396, 47401, 47405, 47409, 47414, 47419,\n47424, 47428, 47434, 47438, 47444, 47451, 47456, 47461, 47467, 47472,\n47478, 47482, 47488, 47494, 47498, 47504, 47510, 47515, 47520, 47525,\n47530, 47536, 47542, 47546, 47551, 47556, 47562, 47567, 47572, 47576,\n47582, 47587, 47591, 47595, 47600, 47606, 47611, 47617, 47621, 47627,\n47631, 47636, 47640, 47646, 47650, 47655, 47659, 47665, 47669, 47674,\n47679, 47684, 47689, 47695, 47701, 47707, -1, 47712, 47717, 47722,\n47728, 47733, 47738, 47743, 47748, 47752, 47757, 47761, 47766, 47770,\n47774, 47780, 47785, 47791, 47797, 47803, 47808, 47812, 47817, 47821,\n47827, 47832, 47836, 47840, 47844, 47850, 47857, 47863, 47868, 47873,\n47879, 47885, 47890, 47896, 47902, 47907, 47911, 47918, 47923, 47927,\n47932, 47937, 47941, 47946, 47951, 47957, 47963, 47967, 47971, 47976,\n47983, 47990, 47995, 47999, 48004, 48010, 48017, 48022, 48027, 48032,\n48037, 48043, 48048, 48052, 48058, 48063, 48068, 48073, 48078, 48082,\n48088, 48094, 48099, 48104, 48110, 48115, 48119, 48124, -1, 48130,\n48135, 48140, 48146, 48152, 48157, 48163, 48169, 48175, 48180, 48186,\n48192, 48197, 48203, 48207, 48212, 48217, 48222, 48228, 48233, 48237,\n48242, 48247, 48252, 48258, 48264, 48268, 48273, 48278, 48283, 48289,\n48295, 48299, 48305, 48311, 48317, 48323, 48329, 48334, 48340, 48344,\n48348, 48352, 48356, 48360, 48367, 48371, 48375, 48379, 48383, 48390,\n48395, 48400, 48405, 48409, 48414, 48419, 48425, 48432, 48438, 48443,\n48448, 48454, 48460, 48464, 48469, 48474, 48479, -1, -1, 48484,\n48489, 48494, 48499, 48505, 48509, 48514, 48520, 48526, 48532, 48537,\n48542, 48548, 48553, 48559, 48564, 48570, 48575, 48580, 48584, 48589,\n48595, 48601, 48606, 48611, 48615, 48620, 48625, 48630, 48634, 48639,\n48645, 48650, 48655, 48660, 48666, 48672, 48678, 48683, 48688, 48691,\n48697, 48702, 48708, 48712, 48717, 48723, 48728, 48733, 48737, 48741,\n48746, 48750, 48755, 48759, 48764, 48770, 48775, 48782, 48788, 48794,\n48797, 48801, 48806, 48812, 48817, 48822, 48826, 48830, 48834, 48839,\n48845, 48850, 48855, 48860, 48865, 48870, 48875, 48880, 48884, 48890,\n48895, 48901, 48908, 48916, 48921, 48927, 48933, 48940, 48944, 48948,\n48953, 48959, 48965, 48971, 48976, 48982, 48986, 48991, 48996, 49002,\n49007, 49011, 49016, 49024, 49030, 49035, 49040, 49045, 49049, 49056,\n49061, 49067, 49072, 49076, 49081, 49086, 49091, 49097, 49102, 49107,\n49112, 49118, 49124, 49128, 49132, 49137, 49143, 49149, 49155, 49162,\n49167, 49172, 49178, 49183, 49187, 49193, 49198, 49203, 49208, 49213,\n49218, 49224, 49230, 49235, 49240, 49244, 49249, 49256, 49263, 49267,\n49272, 49278, 49282, 49288, 49295, 49299, 49304, 49310, 49315, 49322,\n49327, 49335, 49341, 49345, 49350, 49355, 49360, 49365, 49369, 49374,\n49379, 49385, 49391, 49396, 49400, 49406, 49410, 49415, 49421, 49428,\n49433, 49437, 49442, 49447, -1, 49453, 49458, 49462, 49468, 49474,\n49478, 49483, 49489, 49495, 49501, 49506, 49512, 49517, 49522, 49526,\n49532, 49538, 49542, 49546, 49552, 49556, 49562, 49567, 49572, 49578,\n49584, 49590, 49595, 49600, 49606, 49611, 49615, 49619, 49623, 49627,\n49631, 49635, -1, 49639, 49645, 49650, 49654, 49658, 49663, 49669,\n49674, 49680, 49685, 49689, 49693, 49697, 49701, 49705, 49709, 49713,\n49717, 49721, 49726, 49732, 49736, 49741, 49746, 49751, 49755, 49761,\n49766, 49771, 49776, 49781, 49786, 49790, 49795, 49800, 49805, 49810,\n49816, 49821, 49825, 49830, 49835, 49841, 49847, 49852, 49857, 49861,\n49865, 49870, 49876, 49880, 49886, 49892, 49898, 49903, 49909, 49914,\n49919, 49925, 49930, 49936, -1, 49942, 49948, 49952, 49957, 49962,\n49967, 49971, 49975, 49980, 49986, 49991, 49997, 50001, 50007, 50011,\n50017, 50023, 50028, 50033, 50037, 50043, 50048, 50053, 50058, 50062,\n50067, 50071, 50076, 50082, 50087, 50092, 50097, 50101, 50107, 50112,\n50117, 50123, 50130, 50134, 50140, 50145, 50150, 50154, 50158, 50162,\n50166, 50172, 50176, 50181, 50185, 50189, 50193, 50199, 50204, 50210,\n50215, 50221, 50226, 50230, 50235, 50239, 50244, 50248, 50254, 50259,\n50265, 50270, 50274, 50281, 50287, 50292, 50296, 50301, 50306, 50310,\n50315, 50320, 50324, 50329, 50335, 50340, 50346, 50352, 50358, 50363,\n50368, 50373, 50377, 50383, 50387, 50394, 50398, 50404, 50408, 50413,\n50419, 50423, 50430, 50434, 50440, 50445, 50451, 50457, 50461, 50467,\n50471, 50475, 50481, 50487, 50492, 50497, 50501, 50505, 50511, 50516,\n50521, -1, 50527, 50532, 50537, 50542, 50547, 50551, 50556, 50561,\n50566, 50573, 50579, 50584, 50588, 50593, 50598, 50602, 50608, 50614,\n50618, 50623, 50628, 50633, 50638, 50643, 50647, 50654, 50660, 50664,\n50670, 50676, 50682, 50688, 50692, 50697, 50703, 50709, 50714, 50719,\n50725, 50730, 50736, 50741, 50747, 50752, 50758, 50762, 50767, 50772,\n50777, 50782, 50788, 50792, 50798, 50803, 50807, 50812, 50816, 50821,\n50825, 50831, 50837, 50843, 50849, 50853, 50857, 50863, 50867, 50872,\n50878, 50884, 50888, 50892, 50896, 50901, 50906, 50912, 50917, 50923,\n50929, 50934, 50938, 50942, 50946, 50950, 50954, 50959, 50963, 50968,\n50973, 50978, 50983, 50988, 50994, 50999, 51003, 51007, 51011, 51016,\n51021, 51026, 51030, 51034, 51040, 51045, 51052, 51058, 51063, 51069,\n51074, 51079, 51084, 51090, 51094, 51099, 51104, 51109, 51113, 51118,\n51123, 51128, 51135, 51139, 51145, 51150, 51155, 51162, 51168, 51174,\n51179, 51184, 51189, 51193, 51197, 51201, 51206, 51211, 51215, 51221,\n51226, 51232, 51236, 51242, 51247, 51253, 51259, 51265, 51271, 51276,\n51282, 51288, 51294, 51299, 51304, 51309, 51313, 51319, 51323, 51328,\n51334, 51340, 51345, 51350, 51354, 51359, 51364, 51369, 51373, 51380,\n51385, 51391, 51395, 51401, 51406, 51412, 51418, 51424, 51431, 51437,\n51443, 51448, 51455, 51462, 51468, 51473, 51477, 51483, 51488, 51493,\n51498, 51505, 51511, 51517, 51522, 51527, 51534, 51540, 51546, 51550,\n51555, 51560, 51565, 51570, 51575, 51580, 51586, 51591, 51597, 51601,\n51608, 51615, 51619, 51624, 51629, 51633, 51638, 51643, 51648, 51654,\n51659, 51665, 51671, 51676, 51682, 51686, 51692, 51696, 51702, 51706,\n51710, 51716, 51720, 51726, 51731, 51737, 51741, 51746, 51750, 51755,\n51760, 51767, 51774, 51780, 51786, 51791, 51795, 51801, 51807, 51811,\n51816, 51821, 51826, 51830, 51835, 51840, 51844, 51850, 51854, 51859,\n51864, 51870, 51875, 51880, 51886, 51892, 51896, 51902, 51908, 51913,\n51918, 51923, 51929, 51935, 51940, 51945, 51951, 51958, 51962, 51967,\n51972, 51976, 51980, 51984, 51989, 51994, 51999, 52004, 52009, 52013,\n52017, 52023, 52027, 52034, 52039, 52044, 52049, 52055, 52062, 52068,\n52074, 52079, 52085, 52090, 52095, 52100, 52104, 52108, 52112, 52119,\n52124, 52128, 52132, 52136, 52141, 52147, 52153, 52158, 52163, 52169,\n52174, 52178, 52185, 52191, 52196, 52202, 52207, 52213, 52219, 52223,\n52227, 52231, 52236, 52242, 52247, 52252, 52256, 52260, 52266, 52273,\n-1, 52278, 52283, 52288, 52292, 52296, 52302, 52308, 52314, 52319,\n52325, 52331, 52337, 52342, 52347, 52352, 52357, 52361, 52365, 52371,\n52375, 52379, 52383, 52388, 52393, 52398, 52406, 52411, 52417, 52423,\n52427, 52432, 52437, 52441, 52446, 52451, 52456, 52461, 52465, 52470,\n52475, 52481, 52487, 52492, 52496, 52502, 52507, -1, 52511, 52515,\n52521, 52527, 52533, 52539, 52545, 52551, 52557, 52564, 52570, 52575,\n52581, 52585, 52589, 52595, 52601, 52607, 52613, -1, 52619, 52625,\n52631, 52635, 52641, 52646, 52650, 52655, 52660, 52665, -1, 52670,\n52675, 52680, 52684, 52688, 52693, 52698, 52703, 52707, 52712, 52716,\n52721, 52725, 52730, 52736, 52740, 52745, 52752, 52756, 52762, 52768,\n52772, 52777, 52781, 52786, 52792, 52797, 52802, 52806, 52810, 52814,\n52820, 52825, 52830, 52835, 52841, 52846, 52850, 52857, 52863, 52868,\n52872, 52876, 52882, 52886, 52890, 52894, 52899, 52905, 52911, 52917,\n52923, 52930, 52935, 52941, 52947, 52953, 52957, 52963, 52967, 52973,\n52979, 52984, 52989, 52994, 53000, 53005, 53010, 53016, 53021, 53026,\n53030, 53035, 53040, 53045, 53051, 53056, 53062, 53068, 53073, 53079,\n53083, 53088, 53093, 53098, 53102, 53107, 53111, 53115, 53121, 53126,\n53132, 53137, 53141, 53145, 53150, 53154, 53158, 53162, 53167, 53172,\n53178, 53183, 53188, 53193, 53196, 53201, 53207, 53212, 53217, 53223,\n53228, 53234, 53239, 53244, -1, 53249, 53253, 53259, 53265, 53272,\n53279, 53286, 53292, 53297, 53303, 53309, 53313, 53319, 53323, 53327,\n53332, 53338, 53344, 53349, 53354, 53359, 53363, 53367, 53371, 53375,\n53379, 53384, 53389, 53393, 53398, 53402, 53408, 53414, 53418, 53422,\n53426, 53431, 53436, 53443, 53448, 53452, 53458, 53462, 53466, 53471,\n53476, 53480, 53485, 53490, 53495, 53501, 53507, 53512, 53517, 53522,\n53528, 53532, 53537, 53542, 53547, 53553, 53559, 53563, 53568, 53573,\n53578, 53583, 53587, 53591, 53596, 53600, 53604, 53610, 53614, 53619,\n53623, 53628, 53633, 53637, 53642, 53648, 53653, 53657, 53662, 53667,\n53672, 53678, 53683, 53688, 53693, 53698, 53703, 53708, 53713, 53718,\n53723, 53729, -1, 53734, 53740, 53746, 53751, 53757, 53763, 53767,\n53774, 53778, 53783, 53789, 53794, 53799, 53806, 53810, 53816, 53820,\n53824, 53828, 53835, 53841, 53845, 53849, 53854, 53859, 53865, 53870,\n53876, 53880, 53885, 53891, 53895, 53901, 53905, 53910, 53914, 53919,\n53925, 53930, 53934, 53938, 53943, 53947, 53953, 53958, 53963, 53969,\n53973, 53978, 53984, 53988, 53993, 53998, 54003, 54007, 54012, 54018,\n54022, 54027, 54033, 54038, 54043, 54050, 54055, 54062, 54066, 54070,\n54074, 54080, 54084, 54090, 54094, 54099, 54106, 54112, 54118, 54124,\n54130, 54135, 54140, 54145, 54150, 54156, 54160, 54165, 54172, 54178,\n-1, 54184, 54190, 54194, 54199, 54205, 54211, 54215, 54221, 54226,\n54232, 54239, 54247, 54252, 54257, 54262, 54268, 54273, 54279, 54284,\n54290, 54294, 54299, 54303, 54308, 54314, 54319, 54323, 54329, 54334,\n54340, 54344, 54349, 54354, 54359, 54363, 54370, 54375, 54381, 54386,\n54391, 54397, 54403, 54409, 54417, 54421, 54427, 54431, 54436, 54440,\n54444, 54448, 54452, 54457, 54461, 54466, 54471, 54476, 54482, 54488,\n54494, 54499, 54504, 54509, 54515, 54519, 54525, 54529, 54535, 54541,\n54546, 54551, 54557, 54563, 54567, 54571, 54575, 54580, 54585, 54591,\n54596, 54600, 54604, 54609, 54614, 54620, 54625, 54631, 54636, 54641,\n54647, 54651, 54657, 54665, 54674, 54679, 54684, 54689, 54695, 54701,\n54707, 54713, 54717, 54721, 54727, 54733, 54739, 54745, 54751, 54755,\n54759, 54764, 54769, 54775, 54779, 54784, 54789, 54795, 54800, 54805,\n54811, 54818, 54823, 54827, 54831, 54837, 54841, 54845, 54849, 54854,\n54860, 54866, 54872, 54878, 54882, 54886, 54891, 54898, 54904, 54908,\n54914, 54919, 54923, 54929, 54933, 54938, 54943, 54949, 54955, 54959,\n54965, 54969, 54973, 54978, 54983, 54988, 54994, 55000, 55005, 55010,\n55016, 55023, 55028, 55033, 55038, 55042, 55047, 55052, 55056, 55062,\n55066, 55070, 55077, 55082, 55089, 55096, 55101, 55107, 55111, 55115,\n55120, 55126, 55132, 55136, 55141, 55147, 55153, 55158, 55165, 55173,\n55181, 55187, 55192, 55196, 55200, 55206, 55214, 55220, 55227, 55232,\n55237, 55242, 55249, -1, 55255, 55261, -1, 55267, 55272, 55277,\n55282, 55286, 55291, 55296, 55301, 55307, 55312, 55318, 55324, 55328,\n55334, 55338, 55343, 55348, 55355, 55361, 55367, 55371, 55375, 55380,\n55384, 55390, 55394, 55399, 55404, 55408, 55413, 55419, 55423, 55428,\n55433, 55438, 55443, 55448, 55453, 55457, 55463, 55468, 55473, 55478,\n55484, 55488, 55493, 55498, 55502, 55506, 55512, 55518, 55524, 55529,\n55533, 55538, 55543, 55549, 55555, 55561, 55567, 55573, 55579, 55583,\n55587, 55592, 55596, 55601, 55607, 55611, 55616, 55621, 55626, 55630,\n55634, 55639, 55644, 55649, 55655, 55660, 55666, 55671, 55675, 55682,\n55691, 55696, 55702, 55707, 55712, 55717, 55722, 55726, 55732, 55736,\n55740, -1, 55748, 55752, 55757, 55762, 55766, 55772, 55776, 55781,\n55785, 55791, 55797, 55801, 55807, 55811, 55815, 55820, 55826, 55832,\n55837, 55843, 55847, 55853, 55857, 55862, 55867, 55872, 55879, 55884,\n55889, 55894, 55900, 55904, 55909, 55915, 55920, 55926, 55931, 55936,\n55941, 55946, 55952, 55957, 55963, 55969, 55974, 55980, 55984, 55991,\n55995, 55999, 56003, 56007, 56011, 56016, 56021, 56026, 56031, 56036,\n56040, 56045, 56051, 56056, 56060, 56066, 56071, 56077, 56084, 56089,\n56095, 56101, 56106, 56110, 56116, 56121, 56127, 56132, 56139, 56145,\n56151, 56156, 56162, 56167, 56174, 56179, 56184, -1, 56189, 56193,\n56197, 56203, 56208, 56214, 56220, 56225, 56230, 56235, 56241, 56246,\n56250, 56255, 56260, 56266, 56271, 56275, 56282, 56286, 56292, 56297,\n56301, 56306, 56311, 56317, 56322, 56327, 56332, 56337, 56342, 56346,\n56354, 56358, 56364, 56370, 56376, 56380, 56385, 56391, 56399, 56404,\n56410, 56416, 56420, 56425, 56430, 56434, 56441, 56445, 56450, 56456,\n56460, 56464, 56469, 56475, 56481, 56485, 56490, 56495, 56500, 56505,\n56512, 56517, 56521, 56527, 56533, 56539, 56545, 56550, 56555, 56559,\n56565, 56571, 56577, -1, 56583, 56591, 56598, 56604, 56610, 56614,\n56619, 56624, 56630, 56635, 56641, 56645, 56650, 56655, 56660, 56666,\n56671, 56676, 56682, 56686, 56691, 56697, 56701, 56706, 56710, 56714,\n56720, 56725, 56730, 56735, 56741, 56747, 56752, 56757, 56763, 56768,\n56773, 56778, 56784, 56789, 56796, 56802, 56808, 56812, 56819, 56823,\n56828, 56833, 56838, 56843, 56847, 56852, 56859, 56864, 56870, 56875,\n56880, 56888, 56894, 56899, 56906, 56911, 56917, 56922, 56926, 56931,\n56936, 56941, 56946, 56952, 56958, 56962, 56967, 56971, 56976, 56982,\n-1, -1, 56986, 56992, 56996, 57001, 57008, 57013, 57018, 57024,\n57029, 57033, 57038, 57044, 57049, 57055, 57062, 57067, 57071, 57076,\n57080, 57085, 57089, 57094, 57099, 57105, 57110, 57116, 57120, 57125,\n57129, 57133, 57139, 57144, 57150, 57156, 57160, 57165, 57170, 57176,\n57181, 57187, 57194, 57199, 57203, 57209, 57215, 57220, 57225, 57233,\n57238, 57244, 57249, 57254, 57259, 57265, 57269, 57275, 57280, 57285,\n57289, 57295, 57299, 57305, 57309, 57314, 57320, 57325, 57329, 57335,\n57340, 57344, 57348, 57354, 57359, 57365, 57369, 57374, 57378, 57384,\n-1, 57389, 57395, 57400, 57405, 57412, 57418, 57423, 57428, 57432,\n57436, 57440, 57446, 57450, 57455, 57460, 57464, 57468, 57473, 57478,\n57482, 57488, 57492, 57497, 57503, 57508, 57514, 57520, -1, 57525,\n57530, 57534, 57539, 57543, 57548, 57554, 57559, 57562, 57566, 57572,\n57577, 57581, 57587, -1, 57592, 57598, 57603, 57607, 57613, 57619,\n57625, 57631, 57636, 57641, 57647, 57654, 57660, 57664, 57670, 57675,\n57679, 57687, 57692, 57697, 57703, 57709, 57713, -1, 57719, 57723,\n57728, 57732, 57737, 57743, 57749, 57754, 57758, 57763, 57768, 57773,\n57778, 57782, 57786, 57792, 57796, 57802, 57809, 57815, 57819, 57825,\n57830, 57834, 57838, 57844, 57848, 57852, 57858, 57863, 57868, 57873,\n57877, 57882, 57886, 57890, 57895, 57899, 57905, 57911, 57917, 57923,\n57927, 57931, 57935, 57939, 57943, 57948, 57953, 57959, 57964, 57970,\n57975, 57982, 57987, 57992, 57997, 58002, 58007, 58011, 58017, 58023,\n58027, 58031, 58035, 58040, 58045, 58049, 58053, 58057, 58063, 58067,\n58072, 58076, 58082, 58086, 58090, 58095, 58101, 58106, 58110, 58115,\n58119, 58125, 58131, 58136, 58143, 58147, 58151, 58155, 58159, 58163,\n58167, 58172, 58176, 58182, 58187, 58191, 58196, 58200, 58207, 58212,\n58217, 58221, 58226, 58230, 58234, 58239, 58244, 58249, 58253, 58259,\n58264, 58268, 58272, 58277, 58281, 58285, 58291, 58297, 58304, 58309,\n58316, 58320, 58325, 58330, 58335, 58340, 58346, 58351, 58356, 58360,\n58366, 58371, 58377, 58381, 58386, 58391, 58395, 58400, 58405, 58410,\n58414, 58418, 58424, 58429, 58434, 58440, 58445, 58449, 58454, 58461,\n58466, 58472, 58476, 58481, 58487, 58491, 58496, 58500, 58507, 58513,\n58518, 58522, 58531, 58537, 58542, 58546, 58552, 58557, 58562, 58568,\n58572, 58577, 58582, 58586, 58591, 58596, 58602, 58607, 58612, 58616,\n58621, 58625, 58629, 58633, 58638, 58644, 58648, 58654, 58658, 58664,\n58668, 58673, 58678, 58682, 58687, 58691, 58695, 58699, 58703, 58707,\n58711, 58715, 58719, 58725, -1, -1, 58730, 58734, 58743, 58748,\n58754, 58759, 58763, 58768, 58773, 58777, 58783, 58789, 58793, 58797,\n58802, 58807, 58812, 58821, 58826, 58831, 58835, 58840, 58845, 58849,\n-1, 58854, 58859, 58864, 58868, 58872, 58877, 58881, 58887, 58891,\n58896, 58900, 58904, 58908, 58914, 58920, 58927, 58931, 58936, 58942,\n58947, 58953, 58959, 58964, 58968, 58973, 58978, 58982, 58987, 58992,\n58998, 59002, 59007, 59012, 59016, 59021, 59027, 59034, 59039, 59043,\n-1, 59048, 59052, 59058, 59064, 59070, 59074, 59079, 59083, 59088,\n59094, 59098, 59102, 59106, 59112, 59116, 59122, 59127, 59131, 59137,\n59143, 59148, 59153, 59159, 59164, 59171, 59177, 59183, 59189, 59200,\n59204, 59208, 59213, 59218, 59223, 59229, 59234, 59239, 59244, 59248,\n59254, 59260, 59265, 59271, 59275, 59280, 59286, 59293, 59298, 59303,\n59308, 59312, 59317, 59323, 59328, 59332, 59338, 59343, 59348, 59354,\n59358, 59362, 59367, 59371, 59375, 59381, 59388, 59393, 59397, -1,\n59405, 59411, 59416, 59421, 59427, 59431, 59435, 59441, 59447, 59453,\n59458, 59463, 59469, 59474, 59480, 59484, 59490, 59496, 59501, 59506,\n59513, 59519, 59526, 59531, 59537, 59543, 59547, 59552, 59556, 59560,\n59565, 59569, 59573, 59578, 59584, 59590, 59595, 59601, 59607, 59612,\n59617, 59622, 59626, 59631, 59636, 59640, 59645, 59650, 59654, 59660,\n59664, 59671, 59677, 59681, 59686, 59691, 59696, 59701, 59707, 59711,\n59716, 59721, 59726, 59730, 59736, 59740, 59744, 59749, 59755, 59761,\n59766, 59770, 59774, 59779, 59784, 59788, 59793, 59798, 59803, 59808,\n59812, 59816, 59820, 59824, 59828, 59833, 59838, 59844, 59849, 59855,\n59859, 59865, 59870, 59874, 59881, 59888, 59892, 59897, 59902, 59906,\n59911, 59918, 59924, 59928, 59933, 59937, 59942, 59948, 59953, 59957,\n59962, 59966, 59972, 59977, 59981, 59986, 59990, 59994, 60000, 60004,\n60009, 60014, 60018, 60024, 60031, 60037, 60042, 60046, 60050, 60054,\n60058, 60062, 60067, 60072, 60079, 60084, 60090, 60095, 60099, 60104,\n60109, 60114, 60120, 60124, 60130, 60136, 60142, 60147, 60153, -1,\n60157, 60161, 60166, 60170, 60174, 60180, 60185, 60191, 60195, 60199,\n60204, 60209, 60214, 60221, 60226, 60231, 60236, 60242, 60248, 60253,\n60257, 60261, 60265, 60271, 60275, 60279, 60284, 60289, 60294, 60298,\n60302, 60307, 60312, 60319, -1, 60324, 60328, 60334, 60338, 60343,\n60348, 60352, 60356, 60362, 60367, 60371, 60376, 60382, 60387, 60393,\n60397, 60403, 60410, 60415, 60420, 60424, 60428, 60434, 60438, 60444,\n60449, 60456, 60461, 60468, 60474, 60480, 60485, 60489, 60494, 60499,\n60503, 60507, 60512, 60516, 60521, 60527, 60533, 60540, 60546, 60553,\n60558, 60564, 60568, 60573, 60579, 60583, 60588, 60594, 60599, 60603,\n60609, 60614, 60619, 60624, 60629, 60634, 60639, 60644, 60649, 60655,\n60661, 60667, 60672, 60676, 60680, 60685, 60690, 60696, 60700, 60704,\n60710, 60715, 60720, 60726, 60731, 60735, 60741, 60745, 60749, 60755,\n60761, 60767, 60771, 60775, 60781, 60786, 60791, 60796, 60801, 60808,\n60814, 60819, 60824, 60831, 60836, 60842, 60848, 60852, 60857, 60862,\n60867, 60872, 60878, 60884, 60889, 60895, 60899, 60905, 60911, 60917,\n60923, 60926, 60930, 60935, 60941, 60946, 60950, 60954, 60960, 60964,\n60969, 60975, 60980, 60984, 60989, 60994, 61000, 61005, 61009, 61014,\n61020, -1, 61024, 61029, 61035, 61042, 61046, 61050, 61056, 61062,\n61068, 61075, 61079, 61085, 61092, 61096, 61102, 61106, 61111, 61116,\n61122, 61126, 61130, 61134, 61139, 61146, 61151, 61155, 61161, 61167,\n61172, 61176, 61182, 61186, 61190, 61195, 61199, 61203, 61208, 61213,\n61218, 61224, 61230, 61236, 61241, 61248, 61253, 61257, 61263, 61268,\n61272, 61277, 61281, 61286, 61292, 61297, 61302, 61308, 61313, 61319,\n61325, 61329, 61334, 61338, 61342, 61346, 61350, 61355, 61359, 61365,\n61371, 61376, 61381, 61386, 61390, 61396, 61400, 61406, 61412, 61418,\n61424, 61428, 61434, 61439, 61444, 61450, 61455, 61461, 61467, 61473,\n61478, 61483, 61487, 61492, 61498, 61503, 61507, 61512, 61518, 61524,\n61528, 61532, 61537, 61543, 61551, 61555, 61559, -1, 61563, 61569,\n61574, 61578, 61584, 61588, 61594, 61600, 61606, 61611, 61617, 61622,\n61628, 61634, 61638, 61643, 61649, 61653, 61657, 61663, 61668, 61672,\n61676, 61680, 61684, 61689, 61694, 61698, 61703, 61707, 61712, 61716,\n61722, 61727, 61733, 61739, 61743, 61747, 61752, 61758, 61763, 61768,\n61774, 61780, 61786, 61791, 61796, 61801, 61806, 61811, 61816, 61819,\n61824, 61829, 61835, 61839, 61843, 61848, 61854, 61859, 61864, 61869,\n61875, 61881, 61886, 61890, 61894, 61898, 61903, 61909, 61915, 61919,\n61925, 61932, 61936, 61941, 61947, 61952, 61957, 61964, 61971, 61976,\n61980, 61984, 61989, 61994, 61998, 62005, 62011, 62015, 62022, 62028,\n62033, 62039, 62045, 62050, 62056, 62062, 62067, 62073, 62078, 62083,\n62088, 62094, 62100, 62107, 62113, 62118, 62124, 62129, 62133, 62138,\n62143, 62148, 62154, 62161, -1, 62166, 62172, 62176, 62180, 62185,\n-1, -1, 62190, 62194, 62199, 62204, 62210, 62216, 62221, 62227,\n62233, 62238, 62244, 62250, 62257, 62261, 62266, 62270, 62274, 62279,\n62284, 62289, 62295, 62300, 62305, 62309, 62314, 62318, 62322, 62327,\n62331, 62336, 62340, 62344, 62349, 62356, 62360, 62365, 62369, 62373,\n62379, 62384, 62389, 62394, 62399, 62405, 62410, 62414, 62418, 62422,\n62426, 62431, 62435, 62440, 62445, 62450, 62455, 62461, 62467, 62473,\n62478, 62482, 62488, 62493, 62500, 62504, 62508, 62512, 62517, 62523,\n62527, 62532, 62537, 62541, 62545, 62550, 62556, 62561, 62565, 62571,\n62576, 62581, 62586, 62591, 62597, 62602, 62607, 62612, 62617, 62623,\n62629, 62633, 62638, -1, 62644, 62649, 62654, 62658, 62663, 62667,\n62671, 62677, 62682, 62689, 62694, 62700, 62707, 62711, 62715, 62719,\n62723, 62727, 62731, 62736, 62742, 62747, 62753, 62758, 62763, 62769,\n62773, 62779, 62783, 62787, 62793, 62797, 62801, 62805, 62809, 62813,\n62819, 62824, 62829, 62835, 62840, 62845, 62850, 62857, 62861, 62866,\n62871, 62877, 62883, 62888, 62894, 62898, 62904, 62908, 62912, 62916,\n62922, 62926, 62933, 62938, 62944, 62949, 62953, 62957, 62963, 62969,\n62975, 62979, 62984, 62988, 62994, 63000, 63005, 63011, 63016, 63023,\n63030, 63037, 63041, 63047, 63052, 63058, 63063, 63071, 63077, 63082,\n63086, 63092, 63099, 63105, 63111, 63117, 63122, 63127, 63133, 63139,\n-1, -1, 63145, 63149, 63155, 63160, 63165, 63169, 63174, 63180,\n63184, 63190, 63195, 63200, 63204, 63208, 63212, 63217, 63222, 63228,\n63234, 63240, 63244, 63248, 63252, 63258, 63263, 63270, 63275, 63280,\n63284, 63290, 63296, 63303, 63307, 63311, 63316, 63321, 63326, 63332,\n63337, 63342, 63347, 63353, 63357, 63362, 63367, 63372, 63376, 63382,\n63388, 63394, 63399, 63405, 63409, 63414, 63419, 63423, 63427, 63434,\n63441, 63448, 63453, 63459, 63464, 63469, 63474, 63479, 63485, 63489,\n63494, 63500, 63505, 63510, 63515, 63521, 63525, 63530, 63534, 63540,\n63546, 63552, 63556, -1, 63561, -1, 63566, 63570, 63575, 63580,\n63585, 63591, 63596, 63600, 63605, 63609, 63613, 63618, 63623, 63629,\n63634, 63638, 63644, 63650, 63655, 63661, 63667, 63671, 63675, 63681,\n63687, 63693, 63698, 63703, 63708, 63712, 63717, 63721, 63725, 63729,\n63734, 63738, 63744, 63750, 63756, 63761, 63766, 63771, 63775, 63779,\n63784, 63789, 63794, 63798, 63804, -1, 63810, 63815, 63820, 63825,\n63831, 63835, 63840, 63845, 63849, 63855, 63861, 63867, 63873, 63878,\n63882, 63886, 63890, 63895, 63899, 63904, 63908, 63913, 63918, 63923,\n63928, 63932, 63937, 63943, 63948, 63953, 63957, 63961, 63967, 63972,\n63977, 63981, 63987, 63993, 63999, 64004, -1, 64009, 64015, 64021,\n64026, 64031, 64036, 64040, 64044, 64049, 64055, 64059, 64063, 64068,\n64074, 64078, 64084, 64089, 64094, 64099, 64105, 64111, 64117, 64121,\n64126, 64132, 64136, 64140, 64147, 64151, 64156, 64161, 64167, 64171,\n64176, 64181, 64187, 64193, 64197, 64203, 64209, 64215, 64220, 64225,\n64230, 64236, 64241, 64246, 64252, 64257, 64262, 64267, 64271, -1,\n-1, 64276, 64282, 64286, 64290, 64296, 64302, 64308, 64313, 64318,\n64322, 64328, 64333, 64339, 64344, 64350, 64356, 64361, 64366, 64374,\n64380, 64386, 64392, 64397, 64402, 64407, 64413, 64417, 64423, 64429,\n64433, 64439, 64444, 64449, 64454, 64461, 64465, 64470, 64476, 64481,\n64485, 64489, 64495, 64500, 64506, 64512, -1, 64518, 64523, 64527,\n64532, 64537, 64542, 64548, 64553, 64559, 64564, 64570, 64575, 64580,\n64585, 64589, 64594, 64598, 64603, 64610, 64616, 64621, 64627, 64633,\n64637, 64643, 64649, 64654, 64661, 64666, 64671, 64676, 64681, 64687,\n64692, 64697, 64702, 64708, 64712, 64719, 64724, 64729, 64736, 64741,\n64745, 64749, 64753, 64759, 64763, 64768, 64773, 64778, 64783, 64789,\n64793, 64799, 64805, 64810, 64816, 64821, 64828, 64833, 64838, 64845,\n64852, 64857, -1, 64864, 64868, 64873, 64880, 64885, 64889, 64895,\n64899, 64903, 64908, 64913, 64919, 64925, 64931, 64935, 64940, 64945,\n64952, 64957, 64962, 64967, 64973, 64979, 64985, 64990, 64995, 65000,\n65006, 65011, 65016, 65022, 65027, -1, 65034, 65038, 65044, 65049,\n65055, 65061, 65065, 65071, 65077, 65082, 65088, 65094, 65100, 65105,\n65111, 65116, 65120, 65126, 65131, 65136, 65141, 65147, 65152, 65157,\n65162, 65168, 65173, 65178, 65183, 65189, 65196, 65200, 65205, 65210,\n65217, 65222, 65227, -1, 65232, 65237, 65243, 65247, -1, 65252,\n65258, 65263, -1, 65267, 65271, 65275, 65282, 65287, 65291, 65297,\n65303, 65309, 65314, 65319, 65325, 65331, 65337, 65341, 65347, 65352,\n65358, 65362, 65366, 65371, 65375, 65380, 65384, 65389, 65395, 65399,\n65404, 65409, 65417, 65422, 65426, 65431, 65435, -1, -1, 65439,\n65444, 65449, 65455, 65460, 65464, 65470, 65475, 65480, 65485, 65490,\n65495, 65500, 65504, 65509, 65513, 65519, 65523, 65527, 65531, 65537,\n65543, 65549, 65555, 65562, 65567, 65571, 65578, 65583, 65589, 65594,\n65599, 65603, 65608, 65612, 65618, 65623, 65627, -1, 65631, 65638,\n65645, -1, -1, -1, -1, 65651, 65657, 65661, 65666, 65673,\n65679, 65684, 65689, 65695, 65701, 65707, 65713, 65720, 65726, 65732,\n65736, 65742, 65747, 65752, 65758, 65764, 65768, 65774, 65780, 65786,\n65791, 65798, 65805, 65809, 65814, 65819, 65824, 65828, 65833, 65840,\n65845, 65850, 65856, 65860, 65866, 65871, 65876, 65881, 65886, 65892,\n65897, 65902, 65907, 65912, 65917, 65922, 65926, 65931, -1, -1,\n65936, 65942, 65947, 65952, 65958, 65964, 65970, 65973, 65977, 65984,\n65989, 65993, 65997, 66001, 66006, 66010, 66014, 66018, 66023, 66030,\n66035, 66041, 66048, 66053, 66058, 66062, 66068, 66074, 66079, 66085,\n-1, 66094, 66101, 66106, 66110, 66114, 66120, 66126, 66130, 66136,\n66142, 66146, 66151, 66157, 66162, 66166, 66172, 66177, 66183, 66188,\n66192, 66196, 66201, 66205, 66210, 66216, 66221, 66225, 66229, 66236,\n-1, 66241, 66248, 66254, 66260, 66266, 66270, 66274, 66278, 66282,\n66288, 66293, 66300, 66306, 66310, 66316, 66321, 66326, 66332, 66338,\n66343, 66349, 66354, 66360, 66366, 66371, 66375, 66381, 66385, 66390,\n66396, 66402, 66407, 66412, 66417, 66422, 66427, 66432, 66438, 66442,\n66448, -1, -1, 66453, 66459, 66463, 66467, 66472, 66477, 66482,\n66487, 66492, 66497, 66501, 66506, 66512, 66518, 66523, 66528, 66533,\n66539, 66544, 66548, 66553, 66559, 66564, 66571, 66577, 66582, 66586,\n66592, 66597, 66602, 66607, 66613, 66619, 66624, 66628, 66633, 66639,\n66645, 66649, 66653, 66658, 66663, 66667, 66671, 66675, 66680, 66687,\n-1, 66693, 66697, 66701, 66706, 66712, 66717, 66721, 66726, 66732,\n-1, 66736, 66742, 66747, 66752, 66758, 66763, 66769, -1, 66775,\n66780, 66784, 66790, 66795, -1, 66800, 66806, 66812, 66816, 66822,\n66836, 66840, 66847, 66852, 66859, 66865, 66869, -1, 66874, 66879,\n66884, 66888, 66892, 66896, 66901, 66905, 66910, 66914, 66922, 66926,\n66933, 66941, 66945, 66951, 66956, 66963, 66969, 66976, 66982, 66987,\n66992, 66998, 67004, 67009, 67013, 67021, 67026, 67031, 67037, 67042,\n67048, 67052, 67060, -1, 67065, 67069, 67073, 67080, 67085, 67094,\n67099, 67104, 67109, 67114, 67118, 67123, 67128, 67134, 67140, 67145,\n67149, 67155, 67159, 67164, 67168, 67173, 67177, 67183, 67187, 67192,\n67196, 67203, 67207, 67211, 67217, 67223, 67229, 67233, 67237, 67241,\n67247, 67253, 67259, 67263, 67267, 67271, 67275, 67279, 67284, 67288,\n67294, 67299, 67304, 67310, 67315, 67319, 67323, 67328, 67334, 67340,\n67346, 67350, 67354, 67359, 67364, 67368, 67373, 67378, 67383, 67387,\n67392, 67397, 67401, 67406, -1, 67412, 67419, 67427, 67431, 67435,\n67440, 67444, 67450, 67455, 67459, 67465, 67470, 67475, 67481, 67487,\n67492, 67496, 67501, 67506, 67510, 67515, 67521, 67525, 67530, 67538,\n67545, 67549, 67554, 67560, 67564, 67569, 67573, 67578, 67584, 67592,\n67597, 67604, 67609, 67613, 67619, 67626, 67630, 67635, 67639, 67643,\n67647, 67654, 67659, 67664, 67669, 67673, 67679, 67684, 67688, 67692,\n67696, 67701, 67706, 67711, 67715, 67720, 67724, 67728, 67734, 67740,\n67746, 67751, 67757, 67761, 67767, 67771, 67776, 67782, 67786, 67792,\n67798, 67804, 67809, 67813, 67818, 67823, 67828, 67835, 67839, 67844,\n67848, 67852, 67858, 67862, 67868, 67872, 67877, 67882, 67888, 67894,\n67899, 67904, 67909, 67914, 67918, 67923, 67929, 67935, 67940, 67945,\n67950, 67954, 67958, 67962, 67968, 67973, 67978, 67982, 67988, 67995,\n68000, 68005, 68010, 68016, 68020, 68027, 68031, 68036, 68043, 68047,\n68053, 68058, 68062, 68067, 68073, 68078, 68083, 68087, 68093, 68097,\n68102, 68108, 68112, 68118, 68124, 68129, 68134, 68139, 68145, 68151,\n68157, 68161, 68166, 68171, 68176, 68181, 68187, 68192, 68197, 68202,\n68207, 68212, 68217, 68221, 68227, 68232, 68238, 68243, 68247, 68253,\n68258, 68262, 68267, -1, 68272, 68276, 68282, 68290, 68295, 68300,\n68306, 68313, 68317, 68324, 68330, 68334, 68338, 68343, 68348, 68353,\n68358, 68362, 68366, 68373, 68377, 68382, 68386, 68392, 68397, 68403,\n68409, 68415, 68420, 68425, 68429, 68433, 68439, 68443, 68448, 68454,\n68460, 68465, 68469, 68475, 68480, 68486, 68491, 68496, 68501, 68507,\n68512, 68517, 68524, 68530, 68534, 68538, 68544, 68548, 68554, 68560,\n68565, 68570, 68576, 68580, 68585, 68591, 68597, 68601, 68605, 68609,\n68613, 68617, 68623, 68628, 68632, 68638, 68642, 68646, 68650, 68656,\n68660, 68666, 68671, 68676, 68680, 68684, 68688, 68694, 68698, 68704,\n68708, 68712, 68717, 68722, 68726, 68731, 68737, 68743, 68748, 68753,\n68758, 68763, 68768, 68774, 68779, 68784, 68788, 68793, 68799, 68805,\n68812, 68818, 68823, 68827, 68831, 68837, 68843, 68847, 68853, 68857,\n68861, 68865, 68870, 68875, 68881, 68885, 68889, 68893, 68898, 68905,\n68911, 68915, 68919, 68924, 68929, 68935, 68940, 68944, 68950, 68956,\n68961, 68965, 68971, 68976, 68982, 68988, 68992, 68999, 69005, 69011,\n69017, 69022, 69027, 69033, 69037, 69042, 69046, 69051, 69056, 69061,\n69066, 69071, 69075, 69082, 69087, 69092, 69098, 69103, 69110, 69114,\n69119, -1, 69124, 69130, 69134, 69139, 69144, 69147, 69154, 69158,\n69162, 69166, 69173, 69178, 69183, 69188, 69194, 69200, 69206, 69211,\n69217, 69222, 69227, 69233, 69239, 69243, 69248, 69252, 69257, 69261,\n69265, 69271, 69275, 69280, 69286, 69291, -1, 69300, 69305, 69311,\n69316, 69322, 69327, 69332, 69336, 69340, 69346, 69351, 69356, 69363,\n69368, 69374, 69379, 69385, 69390, 69397, 69401, 69405, 69408, 69413,\n69420, 69424, 69430, 69435, 69439, 69445, 69451, 69456, 69462, 69467,\n69472, 69477, 69481, 69485, 69490, 69496, 69501, -1, 69505, 69512,\n69516, 69521, 69526, 69530, 69535, 69540, 69546, 69552, 69556, 69562,\n69567, 69572, 69577, 69583, 69588, 69594, 69600, 69605, 69612, 69618,\n69625, 69631, 69637, 69643, 69648, 69654, 69660, 69664, 69669, 69673,\n69679, 69683, 69690, 69695, 69699, 69704, 69709, 69715, 69720, 69725,\n69730, 69734, 69739, 69744, 69750, 69754, 69759, 69764, 69770, 69774,\n69780, 69785, 69791, 69798, 69803, 69808, 69814, 69819, 69823, 69828,\n69832, 69839, 69844, 69851, 69857, 69862, 69866, 69871, 69877, 69881,\n69885, 69891, 69896, 69901, 69907, 69911, 69917, 69922, 69929, -1,\n69934, 69940, 69945, 69949, 69953, 69959, 69965, 69971, 69976, 69980,\n69986, 69991, 69997, 70004, 70008, 70015, 70020, 70024, 70030, 70035,\n70040, 70045, -1, 70049, 70055, 70059, 70063, 70068, 70072, 70077,\n70083, 70089, 70094, 70099, 70104, 70110, 70114, 70119, -1, 70125,\n70129, 70134, 70138, 70143, 70149, 70154, 70159, 70164, 70168, 70172,\n70178, 70184, 70189, 70194, 70199, 70203, 70207, 70212, 70217, 70221,\n70226, 70233, 70238, 70243, 70248, 70252, 70258, 70262, 70266, 70271,\n70276, 70282, 70286, 70293, 70297, 70303, 70308, 70313, 70319, 70324,\n70328, 70333, 70338, 70342, 70347, 70353, 70358, 70364, 70368, 70372,\n70384, 70391, 70397, 70402, 70407, 70413, 70418, 70424, 70428, 70441,\n70453, 70459, 70463, 70469, 70473, 70479, 70483, 70495, 70501, 70508,\n70513, 70521, 70527, 70533, 70538, 70544, 70550, 70556, 70562, 70568,\n70580, 70584, 70590, 70594, 70600, 70605, 70609, 70613, 70619, 70626,\n70632, 70637, 70643, 70647, 70651, 70656, 70662, 70668, 70673, 70678,\n70683, 70689, 70695, 70701, 70706, 70713, 70720, 70726, 70733, 70739,\n70745, 70750, 70757, 70761, 70766, 70772, 70779, 70783, 70787, 70793,\n70799, 70805, 70811, 70817, 70822, 70827, 70833, 70838, 70844, 70848,\n70853, 70859, 70865, 70871, 70876, 70882, 70888, 70892, 70898, 70902,\n70906, 70911, 70916, 70921, 70928, 70932, 70937, 70942, 70946, 70952,\n70958, 70963, 70968, 70974, 70979, 70983, 70989, 70993, 70998, 71003,\n71010, 71014, 71018, 71023, 71028, 71033, 71039, 71044, 71048, 71052,\n71056, 71061, 71066, 71070, 71074, 71079, 71084, 71088, 71093, 71098,\n71104, 71109, 71114, 71118, 71122, 71126, 71131, 71135, 71140, 71144,\n71149, 71155, 71160, 71166, 71172, 71176, 71181, 71188, 71195, 71202,\n71208, 71213, 71217, 71222, 71227, 71235, 71241, 71246, 71253, 71260,\n71266, 71270, 71275, 71280, 71284, 71289, 71294, 71299, 71304, 71309,\n71313, 71321, 71326, 71332, 71336, 71341, 71347, 71353, 71357, 71362,\n71368, 71373, 71379, 71383, 71388, 71392, 71398, 71404, 71409, 71413,\n71418, 71423, 71428, 71433, 71438, 71442, 71446, 71450, 71456, 71464,\n71470, 71475, 71480, 71484, 71489, 71493, 71497, 71502, 71506, 71511,\n71517, 71521, 71526, 71532, 71536, 71540, 71545, 71549, 71555, 71560,\n71566, 71571, 71577, 71581, 71588, 71594, 71600, 71606, 71613, 71619,\n71623, 71628, 71633, 71638, 71643, 71649, 71654, 71659, 71664, 71668,\n71673, 71678, 71684, 71690, 71696, 71700, 71706, 71710, 71716, 71722,\n71726, 71730, 71735, 71740, 71745, 71749, 71754, 71759, 71765, 71771,\n71777, 71781, 71787, 71794, 71800, 71805, 71810, 71814, 71819, 71824,\n71828, 71834, 71838, 71843, 71847, 71852, 71857, 71861, 71866, 71869,\n71874, 71878, 71883, 71887, 71892, 71896, 71901, 71907, 71914, 71918,\n71922, 71927, 71933, 71937, 71943, 71949, 71953, 71957, 71962, 71967,\n71973, 71977, 71982, 71987, 71991, 71995, 72000, 72005, 72010, 72014,\n72020, 72024, 72029, 72033, 72041, 72046, 72051, 72056, 72062, 72068,\n72073, 72079, 72083, 72088, 72093, 72100, 72106, 72112, 72116, 72121,\n72125, 72131, 72137, 72144, 72150, 72155, 72160, 72165, 72171, 72176,\n72180, 72184, 72189, 72194, 72200, 72207, 72211, 72217, 72223, 72229,\n72234, 72239, 72245, 72250, 72255, 72260, 72264, 72269, 72274, 72280,\n72286, 72292, 72298, 72302, 72307, 72311, 72317, 72321, 72326, 72330,\n72335, 72340, 72345, 72351, 72356, 72361, 72366, 72370, 72375, 72381,\n72387, 72392, -1, 72399, 72403, 72408, 72413, 72420, 72426, 72432,\n72438, 72443, 72447, 72453, 72458, 72464, 72469, 72475, 72481, -1,\n72485, 72490, 72494, 72498, 72504, 72508, 72513, 72518, 72523, 72527,\n72532, 72537, 72542, 72546, 72550, 72555, 72562, 72567, 72571, 72577,\n72582, 72586, 72590, 72596, 72602, 72607, 72611, 72614, 72619, 72624,\n72628, 72633, 72639, 72645, 72649, 72653, 72660, 72665, 72672, 72677,\n72681, 72686, 72691, 72697, 72701, 72705, 72710, 72716, 72720, 72726,\n72733, 72737, 72743, 72747, 72753, 72757, 72762, 72767, 72773, 72778,\n72783, 72788, 72793, 72798, 72802, 72807, 72812, 72818, 72823, 72827,\n72833, 72837, 72842, 72846, 72852, 72856, 72861, 72867, 72874, 72879,\n72883, 72889, 72893, 72897, 72901, 72906, 72910, 72915, 72921, 72926,\n72932, 72936, 72940, 72945, 72950, 72955, 72960, 72965, 72969, 72974,\n72981, 72986, 72990, 72996, 73002, 73006, 73011, 73015, 73021, 73026,\n73032, 73036, 73040, 73045, 73051, 73057, 73061, 73065, 73069, 73073,\n73080, 73085, 73089, 73095, 73101, 73106, 73110, 73116, 73122, 73129,\n73134, 73139, 73143, 73148, 73154, 73159, 73164, 73170, 73177, 73182,\n73187, 73193, 73198, 73204, 73210, 73215, 73220, 73225, 73230, 73236,\n73240, 73245, 73251, 73258, 73263, 73269, 73274, 73278, 73284, 73291,\n73295, 73301, 73306, 73313, 73318, 73322, 73327, 73333, 73339, 73345,\n73349, 73355, 73360, 73364, 73368, 73372, 73378, 73383, 73389, 73395,\n73399, 73405, 73410, 73416, 73420, 73425, 73429, 73433, 73439, 73445,\n73450, 73457, 73463, 73468, 73474, 73480, 73486, 73491, 73495, 73502,\n73507, 73513, 73520, 73525, 73530, 73536, 73541, 73547, 73551, 73558,\n73563, 73569, 73572, 73577, 73583, 73587, 73592, 73597, 73603, 73609,\n73615, 73620, 73625, 73631, 73636, 73643, 73648, 73653, 73659, 73666,\n73670, 73675, 73680, 73686, 73692, 73697, 73701, 73705, 73709, 73713,\n73718, 73722, 73726, 73730, 73735, 73740, 73746, 73750, 73755, 73759,\n73764, 73770, 73774, 73779, 73784, 73790, 73796, 73801, 73805, 73810,\n73816, 73820, 73825, 73830, 73835, 73840, 73844, 73848, 73853, 73859,\n73865, 73870, 73874, 73880, 73885, 73891, 73897, 73901, 73906, 73911,\n73918, 73923, 73929, 73934, 73940, 73944, 73951, 73955, 73961, 73965,\n73969, 73975, 73981, 73986, 73991, 73996, 74002, 74009, 74013, -1,\n74019, 74024, 74029, 74033, 74039, 74043, 74048, 74054, 74060, 74066,\n74072, 74077, 74083, 74088, 74092, 74096, 74102, 74107, 74112, 74117,\n74123, 74127, 74131, 74136, 74142, 74148, 74152, 74158, 74162, 74167,\n74173, 74178, 74184, 74189, 74194, 74199, 74205, 74211, 74216, 74222,\n74226, 74233, 74238, 74244, 74250, 74255, 74259, 74265, 74271, 74277,\n74282, 74286, 74291, 74297, 74302, 74307, 74312, 74317, 74322, 74326,\n74332, 74336, 74341, 74346, 74350, 74356, 74361, 74366, 74372, 74378,\n74382, 74388, 74394, 74399, 74405, 74409, 74415, 74421, 74426, 74431,\n74436, 74442, 74446, 74450, 74454, 74459, 74463, 74468, 74472, 74479,\n74483, 74488, 74495, 74501, 74505, 74510, 74515, 74520, 74524, 74528,\n74533, 74538, 74543, 74549, 74554, 74558, 74563, 74568, 74573, 74576,\n74580, 74584, 74589, 74594, 74599, 74606, 74611, 74616, 74621, -1,\n74626, 74632, 74636, 74640, 74645, 74649, 74653, 74658, 74663, 74668,\n74672, 74678, 74684, 74688, 74693, 74697, 74702, 74706, 74712, 74716,\n74722, 74728, 74734, 74739, 74743, 74747, 74751, 74755, 74761, 74765,\n74770, 74774, 74780, -1, 74786, 74790, 74799, 74804, 74810, 74816,\n74821, 74828, 74833, 74836, 74841, 74846, 74850, 74855, 74859, 74864,\n74869, 74875, 74880, 74886, 74892, -1, 74896, 74902, 74908, 74913,\n-1, 74919, 74924, -1, 74930, 74936, 74942, 74947, 74953, 74959,\n74965, 74969, 74975, 74980, 74986, 74992, 74998, 75003, 75008, 75011,\n75016, 75022, 75028, 75033, 75038, 75043, 75048, -1, 75052, 75058,\n75062, 75068, 75074, 75079, 75085, 75091, 75097, 75103, 75108, 75114,\n75120, 75126, 75130, 75136, 75142, 75147, 75152, 75156, 75162, 75167,\n75173, 75179, 75183, 75187, 75191, 75196, 75201, 75207, 75212, 75217,\n75222, 75226, 75230, 75235, 75240, 75246, 75252, 75257, 75261, 75267,\n75273, 75278, 75283, 75289, 75293, 75298, 75303, 75309, 75315, 75319,\n75323, 75328, 75334, 75340, 75346, 75351, 75357, 75361, 75366, 75372,\n75378, 75382, 75387, 75392, 75398, -1, 75402, 75408, 75414, 75419,\n75424, 75428, 75434, 75440, 75444, 75447, 75451, 75456, 75460, 75466,\n75472, 75477, 75481, 75486, 75492, 75497, 75502, 75508, 75513, 75517,\n75523, 75528, 75533, 75538, 75543, 75548, 75552, -1, 75556, 75562,\n75567, 75574, 75580, 75584, 75588, 75594, 75598, 75602, 75607, 75614,\n75620, 75625, 75630, 75636, 75640, 75644, 75648, 75653, 75659, 75665,\n-1, 75671, 75675, 75681, 75686, 75690, 75696, 75702, 75708, 75712,\n75717, 75723, 75729, 75736, 75741, 75745, 75751, 75755, 75759, 75765,\n-1, 75771, 75778, 75784, 75789, 75795, 75799, 75805, 75809, 75814,\n75820, 75825, 75829, 75834, 75838, 75843, 75849, 75853, 75860, 75864,\n75868, 75872, 75877, 75881, 75885, 75890, 75896, 75900, 75906, 75912,\n75917, -1, -1, 75921, 75926, 75930, 75936, 75943, 75948, 75953,\n75958, 75962, 75966, 75971, 75976, 75981, 75987, 75991, 75997, 76003,\n76007, 76011, 76019, 76025, 76030, 76035, 76040, 76045, 76050, 76054,\n76060, 76065, 76070, 76074, 76078, 76082, 76086, 76091, 76097, 76103,\n76108, 76112, 76117, 76123, 76128, -1, 76135, 76139, 76144, 76149,\n76154, 76160, 76164, 76168, 76172, 76176, 76181, 76187, 76192, 76197,\n76201, 76205, 76210, 76216, 76221, 76225, 76231, 76235, 76239, 76243,\n76250, 76254, 76260, 76266, 76271, 76276, 76281, 76286, 76290, 76295,\n76301, 76306, 76312, 76317, 76323, 76328, 76333, 76337, 76342, 76347,\n76352, 76356, 76360, 76366, 76371, 76377, 76381, 76387, 76392, 76397,\n76402, 76406, 76412, 76417, 76422, 76427, 76432, 76436, 76441, 76445,\n76450, 76456, 76460, 76466, 76470, 76476, 76482, 76486, 76490, 76495,\n76499, -1, 76503, 76509, 76515, 76521, 76525, 76530, 76536, 76540,\n76544, -1, 76548, 76554, 76558, 76562, 76566, 76570, 76574, 76580,\n76585, 76591, 76596, 76600, 76606, 76610, 76615, 76619, 76625, 76630,\n76634, 76639, 76644, 76649, 76653, 76657, 76662, 76667, 76672, 76676,\n76680, 76685, 76689, 76694, 76698, 76702, 76707, 76712, 76716, 76722,\n76728, 76734, 76739, 76744, 76751, 76756, 76761, 76766, 76770, 76776,\n76781, 76787, 76791, 76796, 76800, 76804, 76808, 76813, 76817, 76821,\n76825, 76830, 76834, 76838, 76842, 76848, 76852, 76859, 76865, 76870,\n76876, 76881, 76886, 76891, 76896, 76900, 76904, 76909, 76913, 76920,\n76926, 76931, 76936, 76940, 76945, 76949, 76954, 76959, 76964, 76968,\n76972, 76977, 76982, 76988, 76992, 76996, 77001, 77007, 77011, 77015,\n77021, 77025, 77030, 77035, 77041, 77045, 77052, 77056, 77062, 77068,\n77072, 77077, 77081, 77085, 77090, 77095, 77101, 77107, 77112, 77116,\n77121, 77126, 77131, 77137, 77143, 77147, 77153, 77159, 77163, 77167,\n77171, -1, 77176, 77180, 77184, 77190, 77194, 77198, 77202, 77207,\n77212, 77219, 77225, 77229, 77236, 77241, 77246, 77252, 77256, 77260,\n77264, 77268, 77274, 77279, 77284, 77289, 77293, 77298, 77303, 77307,\n77313, 77318, 77323, 77327, 77333, 77337, 77343, 77348, 77353, 77357,\n77361, 77365, 77369, 77375, 77380, 77385, -1, 77389, 77393, 77400,\n77405, 77409, 77414, 77420, 77424, 77430, 77436, 77442, 77447, 77451,\n77456, 77462, 77466, 77471, 77477, 77482, 77486, 77491, 77495, 77500,\n77505, 77512, 77517, 77523, 77527, -1, 77533, 77539, 77545, 77549,\n77554, 77559, 77563, 77568, 77575, 77579, 77586, 77592, 77596, 77601,\n77607, 77612, 77619, 77625, 77629, 77634, 77639, 77645, 77650, 77656,\n77661, 77666, 77672, 77676, 77681, 77687, 77693, 77699, 77703, 77708,\n77713, 77718, 77726, 77731, 77737, 77743, 77751, 77758, 77764, 77771,\n77776, 77782, 77786, 77791, 77795, 77799, 77805, 77809, 77813, 77819,\n77824, -1, 77829, 77834, 77838, 77842, 77846, 77850, 77854, 77861,\n77866, 77871, 77877, 77883, 77887, 77893, 77899, 77903, 77909, 77913,\n77917, 77922, 77930, -1, 77936, 77942, 77948, 77955, 77960, 77966,\n77971, 77977, 77983, 77990, 77995, 78000, 78006, 78011, 78015, 78020,\n78025, 78030, 78036, 78041, 78047, 78051, 78057, 78063, 78068, 78073,\n78079, 78083, 78089, 78094, 78100, 78106, 78112, 78118, 78124, 78131,\n78135, 78139, 78144, 78150, 78156, 78162, 78168, 78174, 78178, 78183,\n78189, 78193, 78198, 78204, 78210, 78216, 78223, 78229, 78235, 78240,\n78246, 78252, 78257, 78263, 78268, 78273, 78277, 78283, 78287, 78292,\n78297, 78303, 78308, 78316, 78320, 78324, 78330, 78334, 78340, 78344,\n78350, 78356, 78361, 78365, 78371, 78377, 78381, 78387, 78393, 78398,\n78402, 78406, 78412, 78416, 78422, 78428, 78435, 78440, 78444, 78449,\n78453, 78458, 78462, 78466, 78471, 78476, 78481, 78487, 78491, 78495,\n78499, 78504, 78509, 78513, 78517, 78521, 78527, 78531, 78535, 78539,\n78544, 78549, 78554, 78558, 78563, 78568, 78573, 78577, 78582, 78588,\n78595, 78601, 78608, 78614, 78619, 78624, 78628, 78633, 78638, 78643,\n78649, 78653, 78660, 78665, 78671, 78677, 78682, 78688, 78693, 78697,\n78701, 78708, 78713, 78719, 78723, 78727, 78733, 78737, 78744, 78749,\n78754, 78758, 78764, 78770, 78777, 78781, 78785, 78790, 78794, 78798,\n78802, 78808, 78812, 78818, 78824, 78829, 78835, 78840, 78845, 78852,\n78858, 78863, 78868, 78873, 78879, 78885, 78891, 78895, 78900, 78905,\n78911, 78916, 78922, 78928, 78934, 78939, 78942, 78948, 78954, 78960,\n78964, 78969, 78974, 78978, 78982, 78986, 78990, 78995, 79001, 79005,\n79011, 79017, 79021, 79026, 79033, 79039, 79044, 79050, 79054, 79058,\n79062, 79067, 79073, 79078, 79082, 79087, 79091, 79097, 79103, 79109,\n79114, 79120, 79126, 79132, 79136, 79140, 79144, 79148, 79153, 79158,\n79163, 79168, 79174, 79179, 79185, 79191, 79197, 79202, 79209, 79215,\n79221, 79227, 79234, 79238, 79243, 79248, 79253, 79259, 79263, 79267,\n79273, 79279, 79283, 79288, 79295, 79301, 79306, 79311, 79317, 79324,\n79330, 79336, 79341, 79347, 79352, 79357, 79362, 79368, -1, 79374,\n79379, 79384, 79389, 79394, 79398, 79404, 79409, 79415, 79420, 79425,\n79430, 79437, 79442, 79447, 79453, 79459, 79465, 79471, 79477, 79481,\n79485, 79489, 79495, 79500, 79506, 79511, 79516, 79523, 79529, 79534,\n79540, 79544, 79548, 79553, 79557, 79561, 79567, 79572, 79578, 79583,\n79590, 79595, 79601, 79606, 79610, 79615, 79622, 79626, 79630, 79635,\n79639, 79643, 79649, 79654, 79658, 79664, 79670, 79674, 79679, 79683,\n79688, 79693, 79697, 79703, 79708, 79714, 79722, 79727, 79731, 79737,\n79743, 79749, 79753, 79757, 79761, 79767, 79773, 79778, 79784, 79788,\n79794, 79799, 79804, 79809, 79815, 79821, 79828, 79833, 79838, 79843,\n79849, 79853, 79858, -1, 79863, 79868, 79874, 79879, 79884, 79888,\n79892, 79896, 79901, 79905, 79911, 79916, 79920, 79926, 79932, 79938,\n79942, 79948, -1, 79953, 79958, 79963, 79967, 79972, 79977, 79983,\n79988, 79992, 79996, 80002, -1, 80006, 80012, 80018, 80025, 80031,\n80036, 80041, 80047, 80053, 80059, 80065, 80069, 80073, 80079, 80084,\n80090, 80094, 80099, 80105, 80114, 80120, 80125, 80131, 80136, 80143,\n80147, 80153, 80159, 80165, 80171, 80175, 80179, 80184, 80190, 80195,\n80201, 80205, 80209, 80213, 80218, 80224, 80229, 80235, 80239, 80244,\n80249, 80255, 80259, 80263, -1, 80268, 80274, 80280, 80284, 80289,\n80293, 80298, 80304, 80309, 80314, 80318, -1, 80323, 80327, 80332,\n80342, 80346, 80350, 80354, 80359, 80363, 80367, 80371, 80375, 80381,\n80387, 80391, 80395, 80401, 80405, 80409, 80413, 80419, 80425, 80429,\n80433, 80438, 80444, 80449, 80457, -1, 80462, 80467, -1, 80471,\n80479, 80486, 80492, 80496, 80503, 80508, 80514, 80518, 80523, 80527,\n80531, 80535, 80540, 80545, 80552, 80557, 80563, 80569, 80574, 80581,\n80586, 80591, 80597, 80603, 80608, 80614, 80619, 80623, 80629, 80633,\n80639, 80644, 80648, 80652, 80657, 80661, 80665, 80670, 80674, 80679,\n80684, 80690, 80695, 80703, 80708, 80716, 80722, 80726, 80731, 80736,\n80741, 80747, 80754, 80758, 80763, 80768, 80773, 80777, 80784, 80791,\n80797, 80801, -1, 80807, 80813, 80819, 80824, 80830, 80835, 80839,\n80844, 80848, 80853, 80859, 80864, 80868, 80874, 80879, 80883, 80889,\n80896, 80901, 80906, 80910, 80915, 80921, 80926, 80931, 80937, 80941,\n80945, 80950, 80955, 80960, 80965, 80970, 80974, 80978, 80983, 80988,\n80993, 80998, 81003, 81009, 81013, 81018, 81023, 81029, 81034, 81038,\n81043, 81048, 81053, 81058, 81063, 81067, 81073, 81078, 81083, 81088,\n81093, 81099, 81104, 81108, 81113, 81117, 81121, 81127, 81133, 81138,\n81143, 81147, 81151, 81156, 81162, 81167, 81172, 81176, 81182, 81187,\n81193, 81198, 81204, 81208, 81213, 81219, 81224, 81230, 81235, 81242,\n81248, 81252, 81259, 81264, 81268, 81272, 81277, 81282, 81288, 81294,\n81299, 81305, 81310, 81315, 81320, 81326, 81331, 81336, 81341, 81348,\n81352, 81356, 81362, 81368, 81373, 81378, 81382, 81388, 81394, 81399,\n81404, 81410, 81416, 81422, 81426, 81431, 81437, 81443, 81449, 81454,\n81459, 81464, 81470, 81474, 81479, 81484, 81490, 81494, 81501, 81508,\n81513, 81518, 81523, 81529, 81535, 81540, 81546, 81552, 81556, 81563,\n81568, 81573, 81579, 81585, 81591, 81596, 81601, 81607, 81612, 81616,\n81621, 81626, 81632, 81636, 81640, 81646, 81651, 81656, 81661, 81665,\n81671, 81675, 81680, 81685, 81692, 81698, 81702, 81707, 81713, 81719,\n81724, 81729, 81733, 81737, 81744, 81750, 81756, 81762, 81766, 81770,\n81776, 81780, 81785, 81791, 81797, 81803, 81808, 81812, 81817, 81822,\n81828, 81834, 81840, 81846, 81851, 81856, 81861, 81866, 81871, 81875,\n81881, 81886, 81892, 81898, 81904, 81908, 81913, 81918, 81924, 81929,\n81934, 81938, 81942, 81948, 81955, 81960, 81965, 81970, 81975, 81979,\n81985, 81990, 81994, 81998, 82005, 82012, 82020, 82024, 82031, 82037,\n82041, 82047, 82053, 82059, 82063, 82069, 82076, 82080, 82085, 82091,\n82097, 82102, 82107, 82111, 82116, 82122, 82128, 82134, 82140, 82146,\n82151, 82155, 82160, 82164, 82169, 82175, 82180, 82186, 82192, 82198,\n82203, 82208, 82212, 82217, 82222, 82227, 82234, 82240, 82245, 82250,\n82256, 82262, 82266, 82272, 82280, 82286, 82291, 82297, 82302, 82306,\n82312, 82316, 82322, 82326, 82331, 82337, 82343, 82348, 82354, 82362,\n82367, 82372, 82379, 82383, 82389, 82394, 82398, 82403, 82409, 82414,\n82418, 82422, 82427, 82433, 82439, 82443, 82449, 82455, 82460, 82466,\n82471, 82475, 82481, 82485, 82489, 82494, 82499, 82503, 82509, 82514,\n82521, 82527, 82532, 82537, 82541, 82545, 82551, 82557, 82561, 82567,\n82573, 82577, 82583, 82588, 82593, 82600, 82606, 82610, 82615, 82620,\n82626, 82633, 82638, 82643, 82647, 82653, 82658, 82663, 82669, 82674,\n82680, 82686, 82691, 82696, 82702, 82707, 82712, 82716, 82721, 82727,\n82733, 82738, 82744, 82749, 82755, 82760, 82765, 82770, 82775, 82781,\n82785, 82792, 82796, 82800, 82807, 82812, 82816, 82820, 82826, 82833,\n82839, 82844, 82850, 82855, 82861, 82865, 82871, 82875, 82880, 82885,\n82889, 82895, 82899, 82903, 82908, 82914, 82919, 82923, 82928, 82934,\n82938, 82944, 82948, 82952, 82957, 82962, 82968, 82975, 82980, 82984,\n82989, 82995, 83001, 83006, 83010, 83016, 83022, 83027, 83034, 83040,\n83045, 83051, 83056, 83060, 83065, 83070, 83075, 83081, 83085, 83090,\n83094, 83100, 83106, 83112, 83116, 83121, 83125, 83130, 83137, 83141,\n83146, 83151, 83156, 83162, 83168, 83172, 83177, 83183, 83187, 83192,\n83198, 83203, 83208, 83213, 83218, 83224, 83229, 83234, 83239, 83244,\n83250, 83255, 83260, 83264, 83270, 83274, 83280, 83284, 83289, 83296,\n83302, 83307, 83311, 83317, 83323, 83327, 83333, 83338, 83344, 83350,\n83355, 83359, 83364, 83369, 83375, 83380, 83385, 83391, 83398, 83403,\n83408, 83414, 83420, 83426, 83432, 83438, 83443, 83447, 83452, 83457,\n83461, 83465, 83469, 83473, -1, 83479, 83483, 83487, 83492, 83498,\n83505, 83510, 83517, 83522, 83528, 83534, 83540, 83546, 83551, 83556,\n83562, 83568, 83574, 83579, 83583, 83589, 83593, 83597, 83604, 83610,\n83616, 83621, 83625, 83631, 83635, 83640, 83645, 83649, 83654, 83660,\n83666, 83672, 83677, 83683, 83689, 83693, 83697, 83703, 83708, 83714,\n83719, 83723, 83727, 83733, 83739, 83746, 83751, 83757, 83761, 83765,\n83771, 83776, 83782, 83787, 83792, 83798, 83803, 83808, 83813, 83818,\n83824, 83830, 83836, 83843, 83849, 83854, 83860, 83866, 83872, 83877,\n83882, 83888, 83893, 83898, 83903, 83912, 83916, 83922, -1, 83927,\n83933, 83939, 83945, 83951, 83956, 83962, 83967, 83972, 83979, 83983,\n83989, 83995, 84000, 84005, 84009, 84015, 84021, 84027, 84033, 84039,\n-1, 84044, 84049, 84053, 84057, 84061, 84065, 84070, 84074, 84079,\n84083, 84088, 84094, 84098, 84103, 84107, 84113, 84117, 84122, 84127,\n84133, 84138, 84143, 84149, 84153, 84158, 84162, 84166, 84171, 84176,\n84180, 84184, 84188, 84193, 84197, 84201, 84205, 84211, 84216, 84220,\n84224, 84230, 84236, 84241, 84245, 84251, 84255, 84261, 84266, 84270,\n84274, 84278, 84284, 84290, 84295, 84302, 84306, 84311, 84317, 84322,\n84327, 84332, 84336, 84341, 84347, 84351, 84358, 84364, 84369, 84375,\n84379, 84384, 84388, 84393, 84399, 84403, 84409, 84415, 84420, 84425,\n84431, 84437, 84442, 84448, 84452, 84462, 84469, 84475, 84479, 84485,\n84490, 84496, 84502, 84506, 84511, 84517, 84522, 84528, 84534, 84539,\n84545, 84550, 84557, 84563, 84567, 84573, 84577, 84584, 84590, 84595,\n84601, 84606, 84611, 84616, 84620, 84625, 84630, 84634, 84638, 84642,\n84646, 84652, 84657, 84662, 84666, 84670, 84675, 84682, 84686, 84690,\n84694, 84700, 84705, 84710, 84716, 84720, 84726, 84733, 84737, 84742,\n84747, 84752, 84757, 84762, 84767, 84773, 84779, 84784, 84790, 84796,\n84801, 84806, 84811, 84815, 84819, 84824, 84828, 84834, 84838, 84844,\n-1, 84848, 84853, 84858, 84864, 84868, 84873, 84877, 84882, 84888,\n84893, 84898, -1, 84903, 84908, 84913, 84918, 84922, 84927, 84932,\n84937, 84942, 84947, 84951, 84957, 84963, 84967, 84972, 84979, 84984,\n84990, 84994, 85000, 85006, 85011, 85016, 85020, 85024, 85029, 85033,\n85038, 85043, 85047, 85051, 85056, 85061, 85066, 85070, 85076, 85080,\n85085, 85090, 85095, 85101, 85105, 85110, 85114, 85119, 85124, 85129,\n85133, 85139, 85143, 85148, 85154, 85158, 85162, 85168, 85173, 85178,\n85183, 85188, 85193, 85199, 85205, -1, 85210, 85215, 85220, 85226,\n85231, 85237, 85244, 85249, 85253, 85259, 85265, 85270, 85276, 85282,\n85286, 85290, 85295, -1, 85300, 85306, 85311, 85318, 85323, 85328,\n85334, 85338, 85342, 85346, 85351, 85356, 85360, 85366, 85372, -1,\n85381, 85387, 85391, 85397, 85402, 85413, 85418, 85424, 85430, 85436,\n85441, 85447, 85453, 85459, 85463, 85470, 85476, 85482, 85487, 85492,\n85497, 85502, 85508, 85513, 85517, 85523, 85529, 85535, 85539, 85543,\n85549, 85553, 85557, 85561, 85565, 85569, 85575, 85581, 85586, 85590,\n85594, 85598, 85603, 85608, 85613, 85617, 85621, 85627, 85634, 85638,\n85643, 85649, 85653, 85659, 85665, 85669, 85675, 85681, 85686, 85691,\n85695, 85702, 85706, 85711, 85716, 85720, 85725, 85730, 85735, 85741,\n85747, 85753, 85759, 85764, 85768, 85774, 85779, 85784, 85790, 85794,\n85799, 85804, 85809, 85813, 85819, 85823, 85827, 85832, 85837, 85843,\n85848, 85854, 85861, 85868, 85873, 85879, 85884, 85890, 85895, 85900,\n85905, 85909, 85913, 85917, 85923, 85928, 85933, 85938, 85942, 85946,\n85951, 85955, 85961, 85965, 85969, 85975, 85981, 85987, 85992, 85997,\n86002, 86009, 86014, 86019, 86023, 86027, 86031, 86035, 86039, 86044,\n86048, 86054, 86060, 86066, 86070, 86074, 86080, 86084, 86089, 86095,\n86100, 86104, 86111, 86116, 86120, 86126, 86131, 86137, 86144, 86151,\n86155, 86158, 86164, 86170, 86176, 86180, 86185, 86192, 86198, 86203,\n86208, 86213, 86218, 86223, 86228, 86232, 86237, 86241, -1, 86253,\n86259, 86263, 86269, 86273, 86278, 86282, 86288, 86294, 86299, 86303,\n86308, 86314, 86319, 86325, 86331, 86336, 86342, 86347, 86352, 86358,\n86364, 86369, 86375, 86381, 86386, 86390, 86395, 86399, 86404, 86409,\n86414, 86419, 86426, 86431, 86435, 86440, 86445, 86451, 86456, 86460,\n86464, 86469, 86473, 86479, 86486, 86491, 86496, 86503, 86509, 86513,\n86519, 86524, 86530, 86535, 86540, 86546, 86551, 86557, 86562, 86568,\n86573, 86577, 86581, 86585, 86590, 86596, 86602, 86606, 86610, 86614,\n86619, 86626, 86631, 86637, 86641, 86646, 86652, 86658, 86662, 86667,\n86673, 86680, 86685, 86690, 86695, 86699, 86703, 86707, 86713, 86718,\n86722, 86729, 86734, 86739, 86746, 86751, 86754, 86759, 86763, 86768,\n86774, 86779, 86785, 86789, 86794, 86800, 86804, 86811, 86815, 86821,\n86825, 86831, 86835, 86841, 86846, 86852, 86858, 86862, 86866, 86871,\n86877, 86881, 86887, 86891, 86895, 86899, 86905, 86909, 86913, 86918,\n86923, 86927, 86932, 86936, 86943, 86947, 86952, 86958, 86965, 86971,\n86978, 86982, 86988, 86992, 86996, 87003, 87007, 87013, 87019, 87023,\n87028, 87034, 87040, 87046, 87052, 87058, 87062, 87067, 87073, 87078,\n87083, 87089, 87095, 87100, 87105, 87111, 87117, 87121, 87126, 87131,\n87138, 87143, 87148, 87154, 87159, 87165, 87170, 87176, 87182, 87187,\n87193, 87197, 87203, 87208, 87213, 87217, 87223, 87227, 87233, 87238,\n87243, 87247, 87251, 87256, 87261, 87266, 87270, 87275, 87281, 87287,\n87293, 87299, 87305, 87309, 87314, 87318, 87323, 87329, 87334, 87338,\n87344, 87350, 87354, 87360, 87366, 87372, 87376, 87383, 87389, 87394,\n87401, 87405, 87411, 87416, 87422, 87426, 87431, 87437, 87443, 87448,\n87453, 87458, 87462, 87468, 87473, 87478, 87483, 87488, 87494, 87499,\n87505, 87509, 87514, 87519, 87523, 87530, 87534, 87538, 87543, 87547,\n87551, 87557, 87561, 87566, 87571, 87576, 87581, 87589, 87594, 87599,\n87604, 87609, 87614, 87620, 87625, 87629, 87633, 87639, 87644, 87649,\n87656, 87662, 87667, 87671, 87677, 87682, 87688, 87694, -1, 87698,\n87702, 87707, 87712, 87717, 87724, 87730, 87736, 87741, 87746, 87754,\n87761, 87767, 87773, 87779, 87784, 87788, 87793, 87797, 87803, 87807,\n87814, 87819, 87823, 87829, 87835, -1, 87839, 87843, 87848, 87854,\n87858, 87864, 87868, 87874, -1, 87880, 87885, 87889, 87895, 87901,\n87905, 87912, 87918, 87924, 87930, 87935, -1, 87940, 87946, 87951,\n87955, 87960, 87966, 87971, 87976, 87981, 87987, 87992, 87998, 88006,\n88012, 88017, 88021, 88025, 88030, 88036, 88041, 88047, 88051, 88055,\n88059, 88065, 88073, 88078, 88085, 88091, 88097, 88101, 88106, 88110,\n88116, 88121, 88126, 88131, 88136, 88140, 88144, 88150, 88155, 88159,\n88164, 88170, 88176, 88181, 88187, 88192, 88196, 88202, 88208, 88213,\n88218, 88224, 88228, 88232, 88238, 88245, 88249, 88254, 88258, 88264,\n88268, 88273, 88278, 88283, 88290, 88294, 88298, 88303, 88308, 88312,\n88317, 88321, 88327, 88332, 88338, 88343, 88348, 88353, 88358, 88362,\n88366, 88370, 88375, 88379, 88385, 88390, 88394, 88399, 88404, 88408,\n88413, 88418, 88424, 88428, 88433, 88438, 88443, 88448, 88453, 88457,\n88462, 88467, 88471, 88476, 88482, 88488, 88494, 88499, 88504, 88510,\n88514, 88520, 88525, 88529, 88533, 88536, 88542, 88549, 88555, 88561,\n88565, 88569, 88575, 88580, 88586, 88591, 88597, 88601, 88607, 88614,\n88618, 88624, 88628, 88632, 88637, 88642, 88647, 88652, 88656, 88660,\n88664, 88668, 88673, 88677, 88682, 88686, 88690, 88696, 88702, 88707,\n88712, 88718, 88723, 88729, 88735, 88740, 88746, 88750, 88755, 88760,\n88765, 88769, 88775, 88780, 88784, 88791, 88795, 88799, 88804, 88808,\n88814, 88819, 88824, 88829, 88834, 88839, 88843, 88847, 88851, 88855,\n88859, 88864, 88868, 88874, -1, 88880, -1, 88886, 88891, 88897,\n88904, 88908, 88914, 88918, 88924, 88929, 88934, 88940, 88946, 88952,\n88956, 88961, 88965, 88970, 88974, 88978, 88983, 88987, 88994, 88998,\n89003, 89010, 89016, 89021, 89027, 89033, 89037, 89041, 89046, 89050,\n89057, 89062, 89067, 89072, 89076, 89082, 89086, 89093, 89099, 89105,\n-1, 89112, 89117, 89122, 89128, 89133, 89139, 89144, 89148, 89154,\n89160, 89166, 89171, 89177, 89181, 89185, 89191, 89196, 89201, 89207,\n89211, 89218, 89224, 89228, 89233, 89238, 89243, 89251, 89255, 89260,\n89265, 89269, 89273, 89279, 89284, 89288, -1, 89294, 89300, 89305,\n89311, 89316, 89322, 89327, 89332, 89337, 89342, 89347, 89353, 89359,\n89364, 89368, 89373, 89378, 89383, 89387, 89392, 89397, 89401, 89405,\n89409, 89414, 89418, 89422, 89427, 89432, 89439, 89445, 89449, 89454,\n89458, 89464, 89468, 89472, 89477, 89481, 89485, 89493, 89497, 89502,\n89507, 89512, 89517, 89523, 89529, 89533, 89538, 89544, 89550, 89556,\n89561, 89566, 89571, 89576, 89582, 89588, 89593, 89598, 89603, 89608,\n89613, 89618, 89624, 89629, 89634, 89640, 89646, 89652, 89656, 89659,\n89663, 89668, 89673, 89678, 89682, 89687, 89692, 89698, 89703, 89707,\n89714, 89720, 89725, 89730, 89736, 89742, 89747, 89753, 89759, 89765,\n89769, 89774, 89780, 89784, 89788, 89794, 89800, 89805, 89809, 89813,\n89817, 89821, 89826, 89831, 89836, 89841, 89845, 89849, 89853, 89858,\n89863, 89867, 89872, 89879, 89885, 89891, 89897, 89903, 89908, 89913,\n89917, 89921, 89925, 89929, 89934, 89939, 89944, 89950, 89954, 89959,\n89963, 89968, 89972, 89978, 89983, 89989, 89994, 90000, 90005, 90009,\n90015, 90020, 90025, 90029, 90035, 90041, 90047, 90052, 90056, 90062,\n90067, 90072, 90077, 90083, 90088, 90092, 90096, 90100, 90105, 90110,\n90116, 90121, 90128, 90134, 90139, 90144, 90148, 90154, 90160, 90165,\n90170, 90175, 90181, 90186, 90190, 90196, 90200, 90205, 90209, 90214,\n90226, 90231, 90236, 90241, -1, -1, 90246, -1, 90252, -1,\n90258, 90264, 90270, 90276, 90282, 90286, 90291, 90295, 90302, 90307,\n90311, 90315, 90319, 90325, 90331, 90337, 90342, 90346, 90350, 90356,\n90362, 90366, 90372, 90377, 90381, 90384, 90389, 90395, 90400, 90405,\n90412, 90418, 90423, 90428, 90432, 90437, 90442, 90446, 90451, 90455,\n90459, 90465, 90469, 90473, 90479, 90484, 90490, 90496, 90502, 90507,\n90512, 90516, 90521, 90525, 90532, 90538, 90542, 90547, 90553, 90557,\n90564, 90570, 90574, 90579, 90585, 90591, 90597, 90602, 90606, 90611,\n90615, 90619, 90623, 90629, 90634, 90640, 90645, 90650, 90656, 90662,\n90667, 90673, 90678, 90684, 90689, 90693, 90698, 90702, 90707, 90713,\n90718, 90724, 90729, 90734, 90739, 90743, 90750, 90756, 90764, 90769,\n90775, 90780, -1, 90785, 90792, 90797, 90802, -1, 90807, 90812,\n90817, 90822, 90828, 90833, 90838, 90844, 90850, 90854, 90860, 90864,\n90869, 90875, 90881, 90885, 90889, 90893, 90899, 90904, 90908, 90912,\n90917, 90921, 90927, 90933, 90937, 90941, 90946, 90952, 90957, 90961,\n90967, 90972, 90976, 90980, 90984, 90990, 90994, 90999, 91004, 91011,\n91017, 91021, 91026, 91032, 91036, 91040, 91045, 91050, 91056, 91062,\n91067, 91071, 91076, 91080, 91084, 91090, 91096, 91102, 91107, 91112,\n91117, 91123, 91128, 91132, 91137, 91143, 91148, 91153, 91158, 91162,\n91168, 91173, 91177, 91182, 91186, 91191, -1, 91196, 91200, 91204,\n91209, 91215, -1, 91219, 91225, 91229, 91235, 91241, 91246, 91252,\n91257, 91263, 91267, 91273, 91279, 91283, 91289, 91294, 91299, 91305,\n91310, 91315, 91320, 91325, 91329, 91333, 91337, 91343, 91347, 91351,\n91355, 91359, 91366, 91371, 91378, 91383, 91388, 91394, 91398, 91404,\n91409, 91414, 91418, 91422, 91426, 91431, 91438, 91442, 91447, 91452,\n91457, 91461, 91465, 91470, 91475, 91480, 91486, 91491, 91495, 91499,\n91503, 91508, 91512, 91519, 91524, 91528, 91535, 91539, 91545, 91551,\n91556, 91561, 91566, 91572, 91577, 91582, 91587, 91592, 91598, 91602,\n91607, 91612, 91618, 91622, 91628, 91636, 91643, 91648, 91654, 91659,\n91664, 91668, 91672, 91676, 91681, 91685, 91690, 91697, 91702, 91708,\n91712, 91718, 91724, 91729, 91735, 91740, 91745, 91750, 91754, 91760,\n91765, 91770, 91776, 91781, 91786, 91791, 91796, 91800, 91804, 91809,\n91814, 91817, 91823, 91828, 91833, 91838, 91842, 91846, 91851, 91856,\n91862, 91867, 91871, 91875, 91879, 91884, 91890, 91894, 91900, 91904,\n91910, 91914, 91920, -1, 91925, 91929, 91935, 91940, 91945, 91951,\n91955, 91960, 91966, 91970, 91976, 91980, 91986, 91991, 91997, 92002,\n92006, 92010, 92015, 92019, 92024, 92028, 92033, 92038, 92043, 92047,\n92051, 92058, 92064, 92069, 92073, 92079, 92086, 92091, 92097, 92104,\n92110, 92114, 92120, 92124, 92128, 92134, 92139, 92143, 92149, 92154,\n92160, 92165, 92171, 92176, 92180, 92185, 92190, 92196, 92201, 92207,\n92211, 92216, 92221, 92226, 92231, 92236, 92241, 92246, 92251, 92256,\n92261, 92267, 92273, 92278, 92282, 92288, 92293, 92297, 92302, 92308,\n92314, 92318, 92322, 92328, 92333, 92339, 92345, 92349, 92353, 92359,\n92363, 92368, 92373, 92379, 92385, 92389, 92394, 92399, 92405, 92411,\n92418, 92423, -1, 92429, 92433, 92439, 92443, 92447, 92451, 92455,\n92460, 92464, 92468, 92472, 92477, 92483, 92487, 92492, 92497, 92503,\n92508, 92512, 92518, 92524, 92529, 92534, 92539, 92544, 92551, 92557,\n92562, 92567, -1, 92572, 92577, -1, 92582, 92586, 92591, 92596,\n92600, 92605, 92610, 92616, 92622, 92627, 92632, 92637, 92641, 92646,\n92651, 92655, 92661, 92665, 92669, 92674, 92680, 92685, 92690, 92694,\n92699, 92703, 92710, 92716, 92720, 92726, 92730, -1, 92737, 92742,\n92746, 92752, 92756, 92762, 92766, 92770, 92776, 92782, 92787, 92794,\n92800, 92806, 92812, 92817, 92822, 92828, 92832, 92837, 92842, 92846,\n92851, 92856, 92861, 92865, 92871, 92880, 92885, 92890, 92895, 92901,\n92906, 92911, 92916, 92922, 92928, 92932, 92936, 92940, 92945, 92951,\n92956, 92960, 92965, 92969, 92975, -1, 92980, 92985, 92991, 92997,\n93001, 93007, 93012, 93017, 93021, 93025, 93029, 93034, 93038, 93042,\n93048, 93054, 93059, 93063, 93067, 93072, 93076, 93080, 93084, 93088,\n93092, 93096, 93101, 93107, 93111, 93116, 93121, 93126, 93132, 93138,\n93143, 93148, 93152, 93157, 93164, 93169, 93175, 93179, 93184, 93191,\n-1, 93196, 93200, 93205, 93210, 93214, 93219, 93223, 93229, 93234,\n93240, 93244, 93249, 93254, 93260, 93265, 93269, 93273, 93280, 93286,\n93289, 93293, 93298, 93304, 93309, 93314, 93319, 93325, 93329, 93334,\n93339, 93344, 93348, 93353, 93358, 93362, 93368, 93374, 93379, 93384,\n93389, 93393, 93400, 93404, 93408, 93412, 93418, 93423, 93428, 93434,\n93440, 93445, 93449, 93454, 93459, 93463, 93468, 93473, 93479, 93485,\n93489, 93493, 93498, 93503, 93508, 93514, 93519, 93524, 93528, 93533,\n93537, 93541, 93545, 93550, 93555, 93560, 93564, 93568, 93574, 93579,\n93585, 93590, 93596, 93600, 93605, 93609, 93614, 93619, 93625, 93629,\n93634, 93638, 93644, 93648, 93655, 93659, 93664, 93668, 93672, 93677,\n93682, 93688, 93692, 93698, 93702, 93707, 93712, 93716, 93722, 93727,\n93733, 93737, 93741, 93747, 93751, 93755, 93760, 93764, 93770, 93774,\n93781, 93786, 93791, 93797, 93802, 93807, 93812, 93817, 93822, 93827,\n93831, 93835, 93841, 93846, 93851, 93857, 93863, 93868, 93874, 93879,\n93884, 93887, 93892, 93897, 93903, 93909, 93915, 93921, 93925, 93931,\n93936, 93940, 93944, 93948, 93954, 93958, 93963, 93969, 93974, 93979,\n93984, 93989, 93995, 94001, 94007, 94012, 94017, 94022, 94028, 94033,\n94037, 94041, 94045, 94049, 94053, 94058, 94063, 94069, 94076, 94080,\n94084, 94089, 94093, 94098, 94104, 94109, 94114, 94119, 94124, 94128,\n94134, 94139, 94143, 94148, 94153, 94157, 94163, 94167, 94173, 94179,\n94184, 94188, 94194, 94199, 94206, 94211, 94216, 94222, 94225, 94230,\n94234, 94240, 94245, 94251, 94257, 94262, -1, 94268, 94272, 94276,\n94280, 94284, 94290, 94295, 94299, 94305, 94309, 94314, 94319, 94325,\n94332, 94337, 94343, 94348, 94353, 94357, 94363, 94368, 94373, 94377,\n94383, 94388, 94393, 94398, 94403, 94408, 94414, 94419, 94426, 94432,\n94437, 94443, 94447, 94451, 94457, 94462, 94468, 94472, 94476, 94480,\n94485, 94490, 94494, 94499, 94504, 94508, 94513, 94518, 94523, 94529,\n94535, -1, 94542, 94548, 94554, 94558, 94562, 94566, 94570, 94576,\n94582, 94588, 94593, 94598, 94604, 94610, 94614, 94618, 94623, 94628,\n94633, 94637, 94641, 94646, 94652, 94656, 94660, 94665, 94669, 94673,\n94678, 94682, 94688, 94692, 94697, 94703, 94709, 94713, 94719, 94723,\n94728, -1, 94733, 94740, 94745, 94750, 94755, 94759, 94763, 94767,\n94772, 94777, 94783, 94789, 94795, 94799, 94803, 94807, 94813, 94818,\n94823, 94828, 94835, 94840, 94847, 94854, 94859, 94865, 94870, 94875,\n94880, 94884, 94888, 94893, 94898, 94903, 94907, 94913, 94917, 94922,\n94928, 94938, 94945, 94951, 94958, 94962, 94967, 94971, 94976, 94980,\n94985, 94991, 94997, 95003, 95007, 95012, 95018, 95023, 95028, 95032,\n95036, 95043, 95050, 95055, 95060, 95065, 95070, 95075, 95080, 95086,\n95092, 95098, 95103, 95109, 95114, 95121, 95126, -1, 95130, 95137,\n95143, 95147, 95152, 95158, 95162, 95168, 95172, 95178, 95182, 95186,\n95193, 95198, 95203, 95208, 95214, 95220, 95224, 95228, 95234, 95240,\n95245, 95249, 95254, 95260, 95265, 95269, 95275, 95281, 95287, 95292,\n95298, 95303, 95309, 95314, 95319, 95323, 95328, 95333, 95338, 95343,\n95347, 95351, 95355, 95361, 95365, 95370, 95375, 95379, 95383, 95389,\n95394, 95400, 95404, 95410, 95416, 95420, 95426, 95433, 95437, 95443,\n-1, 95449, 95453, 95458, 95462, 95468, 95472, 95477, 95482, 95487,\n95492, 95497, 95502, 95507, 95514, 95519, 95524, 95528, 95533, 95540,\n95544, 95548, 95552, 95557, 95561, 95567, 95572, 95577, -1, 95583,\n95589, 95595, 95600, 95606, 95612, 95618, 95623, 95629, 95633, 95637,\n95642, 95647, 95654, 95659, 95664, 95670, 95676, 95680, 95684, 95688,\n95692, 95697, 95701, 95707, 95712, 95716, 95722, 95728, 95732, 95737,\n95742, 95749, 95754, 95758, 95765, 95770, 95774, 95781, 95788, 95793,\n95797, 95802, 95807, 95812, 95817, 95822, 95827, 95832, 95838, 95843,\n95849, 95853, 95859, 95864, 95869, 95874, 95879, 95885, 95890, 95895,\n95900, 95905, 95910, 95914, 95920, 95925, 95929, 95933, 95938, 95943,\n95949, 95953, 95957, 95961, 95965, 95969, 95973, 95978, 95983, 95988,\n95993, 95998, 96002, 96007, 96012, 96016, 96021, 96027, 96033, 96037,\n96042, 96047, 96051, 96055, 96059, 96065, 96069, 96073, 96078, 96082,\n96087, 96094, 96099, 96104, 96108, 96113, 96117, 96122, 96126, 96131,\n96136, 96141, 96146, 96151, 96162, 96168, 96176, -1, 96182, 96187,\n96192, 96198, 96203, 96208, 96213, 96220, 96224, 96230, 96236, 96241,\n96245, 96249, 96253, 96259, 96264, 96269, 96274, 96278, 96282, 96286,\n96294, 96300, 96305, 96310, 96314, 96320, 96326, 96330, 96336, 96341,\n96347, 96351, 96356, 96361, 96367, 96373, 96378, 96385, 96391, 96396,\n96402, 96409, 96416, 96421, 96426, 96431, 96437, 96442, 96447, 96452,\n96456, 96460, 96465, 96469, 96473, 96477, 96482, 96487, 96492, 96497,\n96501, 96505, 96509, 96516, 96521, 96527, 96532, 96537, 96543, 96548,\n96553, 96557, 96563, 96568, 96573, 96577, 96581, 96587, 96592, 96597,\n96602, 96607, 96611, 96616, 96623, 96628, 96632, 96637, 96641, 96647,\n96653, 96659, 96663, 96668, 96675, 96680, 96685, 96690, 96695, 96701,\n96707, 96713, 96718, 96724, 96730, 96734, 96740, 96745, 96749, 96754,\n96759, 96763, 96767, 96772, 96777, 96783, 96788, 96794, 96799, 96803,\n96810, 96815, 96820, 96827, 96836, 96840, 96846, 96853, 96859, 96864,\n96868, 96873, 96877, 96882, 96886, 96893, 96898, 96903, 96908, 96913,\n96918, 96922, 96927, 96932, 96937, 96942, 96948, 96954, 96960, 96964,\n96969, 96975, 96980, 96985, 96989, 96994, 96998, 97002, -1, 97007,\n97012, 97016, 97021, 97026, 97031, 97035, 97041, 97046, 97052, 97056,\n97062, 97067, 97072, 97077, 97085, 97090, 97095, 97101, 97106, 97110,\n97115, 97119, 97123, 97127, 97132, 97138, -1, 97143, 97149, 97153,\n97157, 97161, 97165, 97169, 97175, 97181, 97187, 97192, 97197, 97202,\n97208, 97213, 97217, 97221, 97226, 97231, 97235, 97241, 97246, 97251,\n97255, 97261, 97267, 97272, 97277, 97282, 97286, 97292, 97297, 97301,\n97307, 97311, 97316, 97319, 97323, 97328, 97334, 97338, 97344, 97350,\n97355, 97359, 97365, 97370, 97376, 97382, 97388, 97393, 97397, 97403,\n97408, 97413, 97417, 97422, 97427, 97433, 97437, 97443, 97449, 97455,\n97460, 97465, 97469, 97474, 97480, 97485, 97490, 97494, 97498, 97502,\n97508, 97512, 97517, 97522, 97526, 97532, 97537, 97542, 97546, 97551,\n97556, 97562, 97566, 97570, 97575, 97580, 97584, 97591, 97596, 97602,\n97606, 97611, 97616, 97621, 97627, 97633, 97638, 97643, 97648, 97654,\n97658, 97662, 97666, 97670, 97675, 97680, 97684, 97690, 97694, 97701,\n97707, 97712, 97717, 97722, 97726, 97730, 97734, 97739, 97743, 97748,\n97752, 97757, 97762, 97768, 97772, 97777, 97782, 97788, 97794, 97798,\n97803, 97808, 97814, 97820, 97825, 97830, 97834, 97839, 97843, 97848,\n97853, 97858, 97864, 97868, 97873, 97877, 97882, 97887, 97890, 97895,\n97899, 97904, 97910, 97916, 97921, 97926, 97931, 97937, 97941, 97947,\n97952, 97957, 97964, 97970, 97975, 97981, 97986, 97992, 97997, 98002,\n98006, 98010, 98014, 98018, 98023, 98027, 98033, 98037, 98041, 98047,\n98052, 98059, 98064, 98068, 98072, 98078, 98082, 98086, 98092, 98097,\n98103, 98107, 98113, 98117, 98122, 98127, 98133, 98138, 98142, 98146,\n98150, 98155, 98160, 98164, 98168, 98174, 98180, 98184, 98191, 98195,\n98199, 98203, 98207, 98212, 98217, 98221, 98226, 98232, 98236, 98241,\n98245, 98252, 98256, 98261, 98266, 98272, 98277, 98282, 98287, 98292,\n98297, 98303, 98308, 98313, 98318, 98323, 98330, 98335, 98341, 98347,\n98353, 98357, 98363, 98369, 98372, 98377, 98382, 98389, 98394, 98398,\n98404, 98410, 98415, 98420, 98425, 98432, 98437, 98441, 98445, 98451,\n98455, 98460, 98465, 98469, 98475, 98478, 98485, 98488, 98493, 98499,\n98504, 98508, 98514, 98519, 98525, 98531, 98536, 98542, 98546, 98550,\n98556, 98563, 98568, 98574, 98578, 98582, 98587, 98593, 98597, 98602,\n98608, 98614, 98620, 98626, 98630, 98639, 98646, 98652, 98657, 98661,\n98665, 98671, 98677, 98682, 98688, 98694, 98699, 98704, 98708, 98712,\n98716, 98721, 98727, 98731, 98737, 98743, 98749, 98755, 98759, 98763,\n98768, 98774, 98779, 98783, 98789, 98795, 98802, 98806, 98811, 98817,\n98823, 98830, 98836, 98841, 98846, 98851, 98857, 98863, 98869, 98875,\n98879, 98884, 98888, 98894, 98899, 98905, 98910, 98915, 98920, 98923,\n98930, 98934, 98939, 98943, 98947, 98953, 98959, 98963, 98967, 98971,\n98978, 98982, 98987, 98992, 98996, 99002, 99007, 99013, 99019, 99024,\n99030, 99035, 99041, 99047, 99051, 99056, 99060, 99065, 99069, -1,\n99074, 99080, 99085, 99091, 99097, 99101, 99105, 99112, 99117, 99121,\n99127, 99131, 99137, 99141, 99145, 99152, 99158, 99163, 99167, 99171,\n99177, 99182, 99188, 99193, 99200, 99206, 99211, 99216, 99221, 99226,\n-1, 99231, 99235, 99241, 99247, 99253, 99257, 99261, 99265, 99272,\n99277, 99282, 99288, 99292, 99297, 99303, 99308, 99313, 99317, 99323,\n99327, 99333, 99337, 99341, 99346, 99351, 99355, 99359, 99366, 99371,\n99377, 99382, 99387, 99393, 99397, 99403, 99407, 99411, 99416, 99421,\n99428, 99433, 99438, 99441, 99447, 99452, 99456, 99461, 99467, 99471,\n99476, 99483, 99487, 99492, 99497, 99502, 99508, 99513, 99518, 99522,\n99529, 99535, 99540, 99545, 99551, 99556, 99562, 99566, 99572, 99578,\n99584, 99589, 99593, 99597, 99603, 99607, 99612, 99617, 99621, 99625,\n99631, 99637, 99642, 99648, 99654, 99658, 99662, 99668, 99673, 99677,\n99683, 99689, 99693, 99699, 99704, 99708, 99713, 99719, 99724, 99729,\n99735, 99740, 99746, 99750, 99754, 99760, 99765, 99770, 99773, 99779,\n99784, 99790, 99795, 99801, 99807, 99812, 99817, 99823, 99828, 99833,\n99839, 99844, 99848, 99854, 99860, 99865, 99869, 99874, 99878, 99884,\n99888, 99893, 99897, 99902, 99908, 99913, 99919, 99925, 99929, 99934,\n99939, 99943, 99948, 99952, 99957, 99964, 99969, 99973, 99977, 99981,\n99985, 99989, 99992, 99997, 100004, 100010, 100016, 100021, 100027, 100032,\n100039, 100043, 100047, 100053, 100057, 100062, 100069, 100074, 100078, 100084,\n100088, 100093, 100097, 100101, 100107, 100111, 100115, 100119, 100126, 100131,\n100136, 100141, 100146, 100151, 100156, 100163, 100168, 100174, 100179, 100184,\n100189, 100195, 100200, 100205, 100209, 100216, 100221, 100228, 100233, 100238,\n100242, 100248, 100253, 100257, 100261, 100267, 100271, 100276, 100281, 100286,\n100293, 100299, 100305, 100309, 100315, 100320, 100325, 100330, 100334, 100340,\n100345, 100349, 100354, 100358, 100364, 100370, 100376, 100382, 100389, 100395,\n100400, 100405, 100411, 100415, 100420, 100426, 100431, 100438, 100444, 100449,\n100454, 100458, 100463, 100466, 100470, 100476, 100482, 100486, 100490, 100495,\n100499, 100503, 100509, 100513, 100517, 100523, 100527, 100532, 100537, 100543,\n100548, 100554, 100558, 100563, 100568, 100573, 100579, 100584, 100589, 100594,\n100600, 100605, 100609, 100614, 100619, 100625, 100631, 100637, 100641, 100647,\n100653, 100658, 100663, 100669, 100674, 100680, 100684, 100688, 100693, 100699,\n100704, 100708, 100714, 100719, 100726, 100730, 100735, 100739, 100745, 100750,\n100754, 100759, 100765, 100771, 100776, 100781, 100786, 100791, 100796, 100801,\n100806, 100811, 100815, 100820, 100824, 100830, 100834, 100839, 100842, 100846,\n100853, 100859, 100865, 100870, 100875, 100879, 100883, 100887, 100892, 100897,\n100901, 100906, -1, 100911, 100915, 100919, 100924, 100930, 100935, 100939,\n100945, 100950, 100954, 100959, 100964, 100970, 100975, 100979, 100983, 100987,\n100992, 100996, 101001, 101007, 101011, 101015, 101020, 101026, 101031, 101035,\n101039, 101043, 101048, 101053, 101057, 101061, 101065, 101069, 101074, 101080,\n101085, 101089, 101093, 101096, 101100, 101104, 101109, 101114, 101120, 101125,\n101130, 101136, 101142, 101146, 101151, 101157, 101161, 101165, 101171, 101176,\n101181, 101186, 101191, 101196, 101202, 101206, 101211, 101215, 101220, 101225,\n101229, 101233, 101237, 101242, 101248, 101254, 101259, 101264, 101271, 101278,\n101283, 101288, 101292, 101297, 101302, 101306, 101310, 101314, 101319, 101324,\n101329, 101335, 101339, 101344, 101348, 101353, 101359, 101364, 101370, 101376,\n101382, 101387, 101393, 101398, 101403, 101408, 101413, 101418, 101425, 101431,\n101437, 101442, 101447, 101451, 101457, 101464, 101470, 101475, 101481, 101487,\n101492, 101498, 101503, 101507, 101512, 101518, 101524, 101529, 101533, 101540,\n101544, 101549, 101556, 101562, 101567, 101572, 101577, 101582, 101588, 101594,\n101598, 101605, 101609, 101616, 101620, 101625, 101630, 101634, 101640, 101645,\n101650, 101656, 101663, 101668, 101674, 101680, 101685, 101691, 101696, 101701,\n-1, 101706, 101712, 101717, 101723, 101728, 101733, 101739, 101745, 101749,\n101753, 101758, -1, 101763, 101769, 101775, 101780, 101786, 101791, 101797,\n101801, 101807, 101813, 101818, 101822, 101828, 101833, 101840, 101845, 101850,\n101855, 101860, 101865, 101871, 101876, 101881, 101887, 101891, 101897, 101901,\n101906, 101911, 101916, 101923, 101928, 101933, 101938, 101942, 101946, 101951,\n101956, 101961, 101966, 101970, 101975, 101979, 101985, 101989, 101994, 101999,\n102004, 102010, 102015, 102020, 102024, 102028, 102032, 102037, 102044, 102048,\n102052, 102058, 102064, 102069, 102074, 102079, 102085, 102091, 102095, 102102,\n102107, 102111, 102116, 102121, 102126, 102132, 102138, 102144, 102149, 102154,\n102158, 102163, 102168, 102175, 102179, 102186, 102190, 102197, 102202, 102207,\n102213, 102218, 102223, 102227, 102232, 102236, 102242, 102247, 102251, 102257,\n102264, 102269, 102275, 102279, 102284, 102289, 102294, 102298, 102304, 102310,\n102315, 102319, 102325, 102329, 102333, 102339, 102344, 102349, 102353, 102358,\n102363, 102368, 102373, 102378, 102382, 102388, 102393, 102398, 102403, 102408,\n102412, 102416, 102422, 102426, 102431, 102435, 102441, 102446, 102452, 102458,\n102463, 102467, 102471, 102477, 102482, 102486, 102490, 102494, 102499, 102506,\n102512, 102518, 102523, 102528, -1, 102532, 102537, 102542, 102546, 102550,\n102555, 102559, 102563, 102568, 102573, 102577, 102583, 102589, 102595, 102600,\n102604, 102609, 102613, 102617, 102622, 102629, 102634, 102639, 102643, 102649,\n102655, 102660, 102664, 102669, 102673, 102678, 102683, 102687, 102692, 102697,\n102702, 102706, 102711, 102716, 102720, 102725, 102729, 102735, 102739, 102743,\n102747, 102751, 102756, 102760, 102764, 102769, 102775, 102781, 102786, 102791,\n102798, 102803, 102810, 102815, 102822, 102827, 102834, 102839, 102843, 102849,\n102854, 102859, 102865, 102870, 102876, 102880, 102886, 102890, 102896, 102901,\n102905, 102909, 102913, 102918, 102922, 102927, 102933, 102938, 102944, 102948,\n102953, 102958, 102963, 102968, 102974, 102980, 102986, 102992, -1, 102998,\n103002, 103008, 103012, 103016, 103021, 103027, 103032, 103036, 103041, 103045,\n103049, 103054, 103058, 103064, 103070, 103074, 103079, 103084, 103090, 103094,\n103098, 103102, 103107, 103111, 103115, 103121, 103126, 103132, 103138, 103143,\n103150, 103156, 103161, 103165, 103170, 103175, 103181, 103187, 103194, 103198,\n103203, 103209, 103216, 103222, 103227, 103233, 103237, 103241, 103245, 103250,\n103256, 103261, 103266, 103270, 103275, 103280, 103286, 103291, 103296, 103300,\n103304, 103311, 103317, 103323, 103327, 103331, 103336, 103341, 103346, 103352,\n103356, 103363, 103367, 103373, 103377, 103383, 103388, 103393, 103397, 103402,\n103406, 103411, 103418, 103422, 103427, 103433, 103439, 103445, 103450, 103456,\n103461, 103466, 103470, 103476, 103482, 103488, 103493, 103498, 103505, 103510,\n103514, 103518, 103522, 103527, 103532, 103537, 103541, 103547, 103553, 103557,\n103563, 103568, 103574, 103581, 103586, 103590, 103594, 103598, 103603, 103607,\n103612, 103618, 103623, 103629, 103633, 103637, 103642, 103648, 103653, 103658,\n103663, 103667, 103672, 103678, 103683, 103689, 103694, 103700, 103705, 103711,\n103716, 103722, 103727, 103732, 103738, 103743, 103748, 103752, 103756, 103761,\n103767, 103773, 103777, 103782, 103787, 103792, 103798, 103804, 103809, 103817,\n103821, 103825, 103830, 103835, 103841, 103847, 103854, 103859, 103863, 103867,\n103871, 103877, -1, 103885, 103890, 103900, 103906, 103910, 103915, 103920,\n103925, 103930, 103938, 103942, 103947, 103955, 103959, 103964, 103968, 103973,\n103978, 103983, 103988, 103993, 103997, 104003, 104008, 104013, 104019, 104026,\n104031, 104036, 104042, 104047, 104050, 104054, 104058, 104063, 104069, 104074,\n104079, 104086, 104092, 104096, 104100, 104107, 104111, 104117, 104122, 104126,\n104132, 104137, 104144, 104149, 104155, 104160, 104164, 104168, 104173, 104178,\n104184, 104187, 104191, 104197, 104202, 104207, 104211, 104215, 104221, 104226,\n104232, 104236, 104243, 104247, 104253, 104260, 104264, 104269, 104275, 104281,\n104286, 104291, 104296, 104303, 104307, 104313, 104318, 104324, 104329, 104334,\n104339, 104343, 104349, 104355, 104359, 104365, 104370, 104376, 104383, 104387,\n104392, 104398, 104404, 104409, 104414, 104418, 104424, 104430, 104435, 104441,\n104447, 104453, 104458, 104463, 104468, 104475, 104481, 104486, 104490, 104496,\n104502, 104509, 104514, 104519, 104523, 104528, 104534, 104539, 104543, 104547,\n104551, 104556, 104561, 104567, 104571, 104576, 104581, 104585, 104591, 104596,\n104602, 104606, 104611, 104617, 104624, 104629, 104634, 104640, 104645, 104651,\n104657, 104661, 104666, 104671, 104676, 104681, 104685, 104689, 104694, 104700,\n104704, 104708, 104713, 104717, 104721, 104727, 104733, 104738, 104743, 104747,\n104751, 104755, 104760, 104765, 104769, 104774, 104780, 104784, 104789, 104796,\n104799, 104804, 104810, 104816, 104820, 104824, 104828, 104834, 104839, 104843,\n104847, 104853, 104857, 104862, 104868, 104873, 104878, 104883, 104889, 104895,\n104901, 104905, 104911, 104916, 104920, 104927, 104933, 104938, 104943, 104948,\n104954, 104961, 104967, 104971, 104976, 104980, 104984, 104989, 104994, 104999,\n105005, 105010, 105016, 105020, 105025, 105030, 105035, 105039, 105043, 105047,\n105051, 105056, 105062, 105066, 105070, 105074, 105079, 105084, 105090, 105096,\n-1, 105102, 105108, 105113, 105117, 105123, 105129, 105135, 105139, 105145,\n105151, 105157, 105163, 105169, 105177, 105183, 105189, 105195, 105200, 105204,\n105210, 105214, 105220, 105225, 105231, 105235, 105239, 105243, 105248, 105252,\n105257, 105262, 105266, 105270, 105276, 105281, 105287, 105293, 105297, 105302,\n105307, 105313, 105317, 105322, 105326, 105330, 105333, 105339, 105344, 105352,\n105357, 105363, 105368, 105374, 105379, 105384, 105388, 105394, 105399, 105403,\n105410, 105415, 105421, 105426, 105430, 105434, 105438, 105444, 105449, 105453,\n105458, 105463, 105468, 105473, 105479, 105484, 105490, 105495, 105499, 105505,\n105509, 105514, 105518, 105523, 105529, 105534, 105539, 105544, 105550, 105555,\n105560, 105566, 105571, 105575, 105580, 105587, 105593, 105598, 105602, 105607,\n105613, 105618, 105623, 105628, 105633, 105637, 105641, 105645, 105651, 105655,\n105660, 105664, 105669, 105675, 105682, 105686, 105691, 105698, 105702, 105707,\n105712, 105718, 105724, 105729, 105734, 105738, 105744, 105749, 105754, 105759,\n105764, 105770, 105776, 105781, 105785, 105790, 105796, 105801, 105805, 105811,\n105816, 105821, 105825, 105829, 105833, 105839, 105844, 105848, 105853, 105857,\n105863, 105868, 105873, 105878, 105883, 105890, 105895, 105899, 105903, 105908,\n105914, 105919, 105924, 105927, 105933, 105938, 105941, 105946, 105953, 105958,\n105963, 105967, 105972, 105980, 105984, 105989, 105994, 105999, 106004, 106009,\n106013, 106017, 106022, 106028, 106032, 106036, -1, 106042, 106047, 106053,\n106060, 106064, 106069, 106073, 106078, 106082, 106087, 106092, 106097, 106101,\n106106, 106111, 106116, 106121, 106126, 106131, 106137, 106143, 106147, 106151,\n106155, 106161, 106165, 106170, 106174, 106179, 106184, 106189, 106194, 106200,\n106206, 106212, 106216, 106222, 106228, 106234, 106238, 106242, 106248, 106253,\n106258, 106262, 106266, 106272, 106278, 106282, 106288, 106294, 106299, 106303,\n106309, 106313, -1, 106320, 106327, 106331, 106337, 106342, 106348, 106354,\n106358, 106363, 106369, 106375, 106381, 106386, 106391, 106396, 106402, 106406,\n106410, 106415, 106420, 106425, 106430, 106434, 106439, 106445, 106451, 106456,\n106460, 106464, 106469, 106473, 106478, 106485, 106490, 106495, 106500, 106504,\n106508, 106513, 106517, 106521, 106526, 106530, 106535, 106540, 106546, 106552,\n106556, 106561, 106566, 106572, 106577, 106583, 106590, 106597, 106602, 106607,\n106614, 106619, 106624, 106628, 106632, 106636, 106640, 106645, 106650, 106656,\n106661, 106667, 106672, 106678, 106682, 106686, 106691, 106695, 106700, 106704,\n106710, 106714, 106718, 106724, 106729, 106735, 106740, 106745, 106751, 106756,\n106760, 106766, 106771, 106775, 106782, 106787, 106791, 106797, 106803, 106807,\n106811, 106816, 106821, 106826, 106831, 106834, 106838, 106844, 106848, 106853,\n106858, 106863, 106870, 106877, 106882, 106888, 106894, 106898, 106902, 106907,\n106911, 106916, 106920, 106924, 106931, 106936, 106941, 106947, 106951, 106955,\n106961, 106965, 106971, 106976, 106983, 106987, 106993, 106998, 107005, 107010,\n107016, 107020, 107026, 107030, 107035, 107039, 107045, 107050, 107057, 107062,\n107068, 107073, 107077, 107082, 107088, 107092, 107097, 107103, 107109, 107115,\n107120, 107127, 107133, 107138, 107144, 107149, 107153, 107158, 107164, 107169,\n107175, 107181, 107185, 107191, 107196, 107200, 107205, 107211, 107216, 107222,\n107227, 107233, 107237, 107243, 107247, 107252, 107257, 107262, 107267, 107272,\n107276, 107281, 107287, 107292, -1, 107304, 107309, 107314, 107320, 107325,\n107330, 107335, 107340, 107344, 107348, 107352, 107358, 107363, 107369, 107374,\n107380, 107386, 107391, 107397, 107402, 107408, 107415, 107422, 107427, 107431,\n107437, 107442, 107446, 107452, 107457, 107461, 107466, 107471, 107476, 107480,\n107487, 107492, 107496, 107501, 107506, 107511, 107516, 107522, 107528, 107533,\n107538, 107544, 107548, 107553, 107557, 107563, 107567, 107571, 107575, 107581,\n107586, 107591, 107597, 107602, 107606, 107610, 107615, 107619, 107625, 107631,\n107636, 107641, 107647, 107652, 107657, 107662, 107668, 107675, 107681, 107687,\n107691, 107695, 107700, 107705, 107709, 107716, 107720, 107726, 107730, 107735,\n107739, 107745, 107749, 107753, 107757, 107763, 107767, 107774, 107778, 107783,\n107789, 107794, 107800, 107804, 107808, 107815, 107820, 107826, 107830, 107834,\n107839, 107845, 107850, 107855, 107860, 107865, 107870, 107874, 107881, 107885,\n107892, 107896, 107901, 107906, 107911, 107915, 107921, 107926, 107932, 107938,\n107942, 107947, 107951, 107955, 107961, 107966, 107970, 107976, 107980, 107985,\n107991, 107997, 108003, 108008, 108015, 108019, 108024, 108028, 108033, 108038,\n108044, 108048, 108054, 108058, 108062, 108066, 108070, 108074, 108080, 108085,\n108089, 108093, 108097, 108103, 108113, 108119, 108123, 108127, 108132, 108136,\n108142, 108148, 108154, 108159, 108164, 108169, 108173, 108177, 108181, 108186,\n108189, 108194, 108199, 108204, 108209, 108215, 108220, 108224, 108229, 108235,\n108240, 108245, 108250, 108254, 108259, 108263, 108268, 108274, 108279, 108284,\n108289, 108293, 108300, 108305, 108310, 108314, 108319, 108324, 108330, 108338,\n108345, -1, 108352, 108357, 108361, 108365, 108369, 108374, 108379, 108383,\n108386, 108392, 108398, 108402, 108406, 108410, 108414, 108418, 108422, 108427,\n108431, 108436, 108442, 108447, 108453, 108458, 108463, 108468, 108472, 108478,\n108483, 108488, 108494, 108500, 108505, 108509, 108513, 108520, 108525, 108530,\n108534, 108539, 108544, 108548, 108552, 108558, 108564, 108568, 108574, 108579,\n108585, 108589, 108593, 108598, 108602, 108608, 108613, 108617, 108622, 108627,\n108632, 108639, 108643, 108647, 108652, 108656, 108661, 108665, 108670, 108676,\n108680, 108684, 108691, 108695, 108700, 108706, 108712, 108718, 108724, 108730,\n108735, 108739, 108743, 108749, 108754, 108759, 108764, 108769, 108774, 108780,\n108787, 108794, 108800, 108804, 108809, 108813, 108817, 108821, 108826, 108831,\n108836, 108843, 108849, 108854, 108860, 108866, 108872, 108876, 108881, 108886,\n108891, 108897, 108902, 108907, 108913, 108919, 108924, 108929, 108934, 108939,\n108943, 108947, 108951, 108955, 108959, 108964, 108971, 108975, 108981, 108986,\n108990, 108995, 109001, 109007, 109016, 109020, 109026, 109031, 109036, 109041,\n109047, 109052, 109058, 109063, 109068, 109074, 109078, 109083, 109088, 109094,\n109101, 109106, 109110, 109115, 109121, 109126, 109131, 109136, 109141, 109145,\n109149, 109153, 109159, 109165, 109169, 109174, 109179, 109185, 109191, 109197,\n109203, 109208, 109213, 109217, 109223, 109227, 109231, 109237, 109243, 109249,\n109254, 109260, 109266, 109272, 109277, 109282, 109287, 109292, 109299, 109303,\n109309, 109314, 109320, 109324, 109328, 109333, 109338, 109345, 109350, 109354,\n109358, 109365, -1, 109370, 109374, 109379, 109384, 109388, 109395, 109401,\n109407, 109413, 109419, 109424, 109431, 109436, 109441, 109447, 109452, 109456,\n109460, 109467, 109472, 109478, 109483, 109488, 109494, 109498, 109502, 109508,\n109512, 109518, 109523, 109526, 109532, 109536, 109541, 109545, 109550, 109556,\n109560, 109567, 109572, 109577, 109583, 109588, 109593, 109599, 109603, 109609,\n109615, 109619, 109623, 109628, 109634, 109639, 109646, 109652, 109656, 109662,\n109667, 109671, 109676, 109681, 109687, 109691, 109697, 109701, 109706, 109712,\n109716, 109721, 109726, 109734, 109738, 109743, 109748, -1, 109753, 109757,\n-1, 109763, 109768, -1, 109775, 109780, 109785, 109791, 109795, 109801,\n109806, 109812, 109816, 109820, 109825, 109831, 109835, 109840, 109844, 109847,\n109852, 109858, 109862, 109867, 109873, 109879, 109885, 109890, 109894, 109900,\n109906, 109913, 109918, 109922, 109928, 109933, 109938, 109943, 109949, 109954,\n109960, 109965, 109971, 109977, 109982, 109987, 109993, 109999, 110003, 110008,\n110014, 110020, 110026, 110032, 110037, 110041, 110047, 110052, 110057, 110063,\n110069, 110076, 110080, 110085, 110089, 110094, 110099, 110103, -1, 110108,\n110113, 110119, 110123, 110129, 110134, 110140, 110145, 110149, 110154, 110158,\n110162, 110167, 110173, 110179, 110185, 110190, 110197, 110201, 110207, 110213,\n110217, 110222, 110226, 110230, 110236, 110242, 110246, 110250, 110256, 110263,\n110269, 110274, 110279, 110284, 110289, 110294, 110299, 110304, 110310, 110316,\n110321, 110325, 110331, 110337, 110342, 110346, 110351, 110355, 110359, 110365,\n110374, 110382, -1, -1, -1, 110387, 110391, 110395, 110400, 110404,\n110408, 110414, 110419, 110425, 110431, 110437, 110443, 110447, 110452, 110456,\n110461, 110465, 110470, 110475, 110479, 110485, 110491, 110495, 110499, 110503,\n110509, 110516, 110521, 110525, 110532, 110538, 110543, 110549, 110555, 110561,\n110567, 110573, 110578, 110583, 110588, 110594, 110600, 110605, 110611, 110616,\n110620, 110625, 110629, -1, 110635, -1, -1, 110641, 110648, 110652,\n110657, 110661, 110665, 110670, 110677, 110681, 110686, 110691, 110696, 110701,\n110708, 110713, 110717, 110722, 110727, 110733, 110738, 110743, 110748, 110754,\n110760, 110766, 110772, 110779, 110784, 110790, 110795, 110801, 110806, 110811,\n110816, 110821, 110826, 110830, 110836, 110843, 110849, 110853, 110859, 110864,\n110869, 110874, 110878, 110882, -1, -1, 110887, 110893, 110899, 110904,\n110910, 110915, 110920, 110924, 110930, 110935, 110939, 110945, 110951, 110957,\n110963, 110969, 110974, 110978, 110983, 110989, 110993, 110998, 111003, 111009,\n111013, 111018, 111022, 111027, 111031, 111035, 111041, 111046, 111052, 111057,\n111063, 111069, 111073, 111078, 111082, 111087, 111093, 111098, 111104, 111109,\n111115, 111119, 111125, 111131, 111137, 111142, 111147, 111152, 111156, 111161,\n111165, 111171, 111178, 111185, 111191, 111195, 111199, 111205, 111211, 111215,\n111221, 111226, -1, -1, 111230, 111236, 111239, 111243, 111248, 111254,\n111259, 111263, 111269, 111274, 111280, 111287, 111293, 111297, 111303, 111309,\n111314, 111319, 111325, 111329, 111334, 111339, 111345, 111351, 111356, 111361,\n111366, 111372, 111377, 111382, 111387, 111392, 111396, 111402, 111408, 111414,\n111418, 111424, 111428, 111434, 111441, 111447, 111451, 111456, 111462, 111467,\n111471, 111475, 111481, 111487, 111492, 111496, 111501, 111505, 111510, 111516,\n111523, 111527, 111532, 111538, 111543, 111549, 111554, 111559, 111564, 111568,\n111573, 111579, 111585, 111590, 111595, 111600, 111604, 111608, 111614, 111621,\n111627, 111631, 111635, 111638, 111642, 111646, 111650, 111655, 111661, 111665,\n111670, 111675, 111681, 111686, 111691, 111695, 111701, 111707, 111713, 111718,\n111723, 111728, 111734, 111739, 111743, 111747, 111751, 111756, 111762, 111767,\n111772, 111776, 111782, 111786, 111791, 111798, 111803, 111807, 111812, 111817,\n111823, 111829, 111833, 111839, 111844, 111849, 111854, 111859, 111865, 111871,\n111876, 111882, 111887, 111893, 111898, 111903, 111908, 111912, 111918, 111925,\n111929, 111935, 111939, 111945, 111952, 111958, 111962, 111967, 111971, 111976,\n111981, 111985, 111989, 111994, 111998, 112004, 112010, 112016, 112021, 112025,\n112032, 112037, 112042, 112047, 112052, 112057, 112062, 112067, 112073, 112078,\n112083, 112088, 112094, 112099, 112103, 112109, 112115, 112119, 112122, 112129,\n112134, 112140, 112145, 112150, 112155, 112159, 112163, 112168, 112173, 112180,\n112184, 112188, 112193, 112199, 112205, 112210, 112215, 112221, 112227, 112232,\n112237, 112242, 112248, 112254, 112258, 112264, 112268, 112273, 112279, 112284,\n112291, 112297, 112300, 112305, 112311, 112318, 112324, 112329, 112336, 112342,\n112346, 112350, 112355, 112360, 112364, 112369, 112374, 112378, 112384, 112388,\n112392, 112397, 112403, 112409, 112414, 112418, 112423, 112428, 112434, 112438,\n112443, 112448, 112454, 112460, 112466, 112471, 112476, 112482, 112488, 112494,\n112498, 112502, 112508, 112513, 112518, 112523, 112529, 112533, 112537, 112542,\n112547, 112551, 112557, 112564, 112570, 112575, 112580, 112586, 112592, 112598,\n112602, 112607, 112613, 112617, 112623, 112630, 112637, 112644, 112649, 112653,\n112658, 112662, 112668, 112672, 112679, 112684, 112688, 112695, 112701, 112706,\n112711, 112716, 112720, 112725, 112729, 112734, 112739, 112745, 112751, 112757,\n112762, 112767, 112773, 112779, 112785, 112790, 112795, 112801, 112806, 112811,\n112816, 112822, 112828, 112833, 112839, 112845, 112849, 112854, 112858, 112864,\n112868, 112872, 112876, 112881, 112887, 112892, 112897, 112901, 112906, 112912,\n112916, 112922, 112927, 112931, 112936, 112941, 112947, 112951, 112956, 112963,\n112969, 112974, 112979, 112984, 112989, 112992, 112997, 113001, 113006, 113013,\n113018, 113025, 113029, 113034, 113039, 113044, 113048, 113053, 113058, 113063,\n113068, 113073, -1, 113077, 113085, 113091, 113096, 113100, 113105, 113109,\n113114, 113122, 113128, 113133, 113137, 113142, 113148, 113154, 113160, 113165,\n113169, 113174, 113180, 113184, 113190, 113196, 113200, -1, 113205, 113210,\n113217, 113223, 113228, 113233, 113237, 113242, 113250, 113255, 113260, 113266,\n113272, 113278, 113283, 113289, 113294, 113299, 113304, 113309, 113314, 113318,\n113323, 113327, 113332, 113336, 113340, 113344, 113349, 113354, 113359, 113365,\n113369, 113373, 113378, 113385, 113389, 113394, 113399, 113404, 113407, 113413,\n113418, 113422, 113427, 113432, 113437, 113441, 113447, 113451, 113456, 113461,\n113467, 113471, 113475, 113479, 113484, 113489, 113495, 113499, 113503, 113508,\n113513, 113519, 113524, 113527, 113534, 113539, 113544, 113550, 113555, 113561,\n113566, 113570, 113576, 113582, 113588, 113593, 113599, 113604, 113611, 113614,\n113618, 113622, 113626, 113631, 113637, 113643, 113646, 113651, 113656, 113660,\n113666, 113670, 113674, 113678, 113684, 113690, 113696, 113701, 113706, 113710,\n113717, 113722, 113727, 113733, 113737, 113742, 113746, 113751, 113757, 113762,\n113768, 113774, 113780, 113784, 113788, 113793, 113799, 113806, 113811, 113815,\n113820, 113826, 113832, 113837, 113843, 113848, 113853, 113858, 113864, 113869,\n113874, 113879, 113883, 113888, 113893, 113898, 113902, 113908, 113914, 113918,\n113924, 113929, 113935, 113939, 113946, 113952, 113957, 113962, 113968, 113974,\n113980, 113987, 113992, 113997, 114001, 114005, 114009, 114015, 114020, 114025,\n114030, 114035, 114040, 114044, 114051, 114056, 114061, 114066, 114071, 114076,\n114081, 114085, 114090, 114094, 114099, 114103, 114107, 114113, 114117, 114124,\n114129, 114133, 114137, -1, 114142, 114147, 114152, 114157, 114163, 114167,\n114172, 114177, 114181, 114187, 114192, 114196, 114200, 114204, 114209, 114213,\n114218, 114221, 114226, 114232, 114236, 114240, 114244, 114248, 114254, 114258,\n114263, 114269, 114274, 114279, 114283, 114288, 114293, 114299, 114303, 114310,\n114314, 114318, 114322, 114328, 114333, 114338, 114343, 114347, 114353, 114357,\n114362, 114366, 114370, 114375, 114379, 114385, 114391, 114396, 114401, 114406,\n114414, 114420, 114425, 114429, 114435, 114439, 114443, 114449, 114454, 114458,\n114463, 114468, 114472, 114476, 114480, 114484, 114488, 114493, 114497, 114502,\n114506, 114510, 114515, 114520, 114526, 114531, 114535, 114539, 114544, 114550,\n114555, 114559, 114564, 114570, 114576, 114582, 114588, 114592, 114598, 114602,\n114606, 114610, 114616, 114622, 114627, 114633, 114639, 114644, 114649, 114655,\n114659, 114665, 114670, 114675, 114680, 114686, 114692, 114697, 114701, 114707,\n114712, -1, 114717, 114723, 114729, 114733, 114739, 114747, 114753, 114758,\n114764, 114769, 114773, 114778, 114783, 114788, 114794, 114799, 114803, 114808,\n114813, 114818, 114822, 114826, 114830, 114835, 114841, 114847, 114851, 114855,\n114861, 114866, 114870, 114876, 114882, 114886, 114890, -1, 114895, 114899,\n114903, 114908, 114914, 114920, 114925, 114929, 114934, 114938, 114943, 114948,\n114954, 114960, 114964, 114970, 114974, -1, 114979, 114983, 114987, 114993,\n114999, 115005, 115011, 115017, 115023, 115029, 115036, 115042, 115048, 115054,\n115060, 115066, 115072, 115077, 115082, 115087, 115091, 115097, 115103, 115108,\n115112, 115118, 115123, 115127, 115131, 115137, 115142, 115148, 115153, 115157,\n115161, 115165, 115170, 115175, 115180, 115185, 115190, 115194, 115199, 115203,\n115207, 115211, 115215, 115219, 115224, 115228, 115233, 115238, 115243, 115248,\n115254, 115259, 115265, 115271, 115276, 115281, 115286, 115290, 115295, 115299,\n115303, 115308, 115314, 115322, 115326, 115332, 115338, 115343, 115349, 115354,\n115360, 115366, 115372, 115378, 115384, 115388, 115395, 115401, 115406, 115410,\n115414, 115419, 115424, 115430, 115434, 115439, 115444, 115448, 115454, 115458,\n115462, 115468, 115474, 115478, 115484, 115488, 115493, 115498, 115502, 115507,\n115512, 115517, 115521, 115525, 115530, 115536, 115541, 115546, 115552, 115557,\n115561, 115567, 115574, 115580, 115584, 115589, 115595, 115601, 115605, 115609,\n115615, 115620, 115625, 115630, 115634, 115639, 115645, 115649, 115654, 115660,\n115665, -1, 115672, 115677, 115682, 115687, 115692, 115696, 115701, 115706,\n115711, -1, 115716, 115720, 115725, 115730, 115734, 115738, 115742, 115747,\n115752, 115756, 115761, 115766, 115771, 115776, 115781, 115786, 115792, 115797,\n115803, 115807, 115812, 115816, 115821, 115827, 115831, 115837, 115843, 115849,\n115854, 115860, 115865, 115870, 115877, 115881, 115885, 115891, 115897, 115902,\n115909, 115915, 115920, 115924, 115928, 115932, 115936, 115942, 115947, 115951,\n115957, 115961, 115966, 115971, 115976, 115980, 115985, 115990, 115994, 116000,\n116004, 116010, 116015, 116019, 116025, 116028, 116031, 116036, 116041, 116046,\n116052, 116056, 116062, 116067, 116072, 116078, 116084, 116089, 116093, 116098,\n116103, 116108, 116113, 116118, 116122, 116128, 116135, 116141, 116146, 116150,\n116155, 116161, 116166, 116171, 116176, 116181, 116186, 116190, 116194, 116200,\n116206, 116211, 116216, 116221, 116227, 116231, 116236, 116243, 116248, 116252,\n116257, 116261, 116264, 116267, 116272, 116277, 116282, 116288, 116295, 116300,\n116306, 116311, 116315, 116321, 116327, 116333, 116339, 116346, 116350, 116355,\n116361, 116367, 116371, 116376, 116380, 116385, 116390, 116396, 116400, 116405,\n116411, 116416, 116422, 116426, 116432, 116437, 116443, 116448, 116452, 116457,\n116462, 116468, 116472, 116478, 116484, 116489, 116496, 116502, 116506, 116510,\n116515, 116519, 116524, 116528, 116533, 116539, 116545, 116549, 116553, 116559,\n116563, 116569, 116574, 116579, 116585, 116590, 116596, 116603, 116608, 116612,\n116617, 116622, 116627, 116632, 116638, 116644, 116648, 116652, 116658, 116661,\n116668, 116673, 116676, 116681, 116686, 116692, 116698, 116703, 116708, 116714,\n116718, 116723, 116729, 116735, 116741, 116749, 116753, 116758, 116764, 116770,\n116774, 116778, 116783, 116788, 116793, 116799, 116805, 116809, 116813, 116817,\n116822, 116828, 116833, 116838, 116843, 116848, 116853, 116858, 116862, 116868,\n116874, 116880, 116885, 116891, 116897, 116903, -1, 116909, 116913, 116919,\n116925, 116931, 116937, 116943, 116949, 116953, 116957, 116961, 116966, 116971,\n116976, 116982, 116988, 116994, 116999, 117004, 117009, 117014, 117019, 117024,\n117029, 117033, 117039, 117043, 117048, 117054, 117059, 117066, 117071, 117076,\n117080, 117086, 117091, 117096, 117101, 117106, 117111, 117116, 117121, 117125,\n117131, 117135, 117140, 117145, 117150, 117154, 117159, 117163, 117168, 117173,\n117178, 117183, 117188, 117194, 117200, 117205, 117211, 117216, 117222, 117226,\n117233, 117239, 117245, 117249, 117254, 117258, 117262, 117267, 117271, 117276,\n117279, 117283, 117288, 117293, 117297, 117301, 117306, 117311, 117316, 117321,\n117326, 117332, 117338, 117344, 117350, 117354, 117358, 117363, 117368, 117375,\n117380, 117386, 117389, 117395, 117400, 117404, 117411, 117416, 117421, 117427,\n117432, 117436, 117442, 117447, 117452, 117456, 117461, 117467, 117473, 117477,\n117482, 117486, 117491, 117496, 117501, 117506, 117510, 117515, 117519, 117525,\n117530, 117534, 117538, 117543, 117548, 117553, 117558, 117565, 117571, 117576,\n117581, 117585, 117589, 117594, 117601, 117607, 117612, 117617, 117624, 117630,\n117635, 117640, 117646, 117651, 117655, 117661, 117668, 117673, 117679, 117685,\n117690, 117696, 117700, 117705, 117711, 117716, 117720, 117725, 117729, 117734,\n117739, 117744, 117750, 117755, 117760, 117764, 117769, 117773, 117777, 117782,\n117789, 117794, 117798, 117804, 117808, 117814, 117818, 117823, 117826, 117830,\n117835, 117840, 117845, 117850, 117856, 117862, 117867, 117872, 117876, 117881,\n117887, 117891, 117895, 117899, 117904, 117909, 117914, 117919, 117924, 117931,\n117937, 117943, 117948, 117953, 117960, 117965, 117969, 117973, 117977, 117981,\n117985, 117990, 117995, 118001, 118005, 118009, 118013, 118019, 118024, 118029,\n118034, 118039, 118045, 118049, 118053, 118059, 118064, 118068, 118073, 118078,\n118083, 118088, 118093, 118098, 118103, 118108, 118112, 118116, 118121, 118126,\n118131, 118136, 118140, 118145, 118149, 118154, 118160, 118165, 118169, -1,\n118173, 118177, 118184, 118188, 118194, 118200, 118206, 118212, 118216, 118221,\n118225, 118229, 118233, 118239, 118244, 118250, 118256, 118261, 118265, 118271,\n118276, 118280, 118285, 118290, 118294, 118299, 118303, 118309, 118314, 118319,\n118325, 118331, 118337, 118342, 118348, 118354, 118361, 118365, 118370, 118374,\n118379, 118384, 118389, 118395, 118400, 118405, 118410, 118414, 118420, 118425,\n118431, 118438, 118443, 118447, 118453, 118458, 118463, 118466, 118473, 118478,\n118482, 118486, 118492, 118498, 118503, 118509, 118514, 118519, 118524, 118530,\n118534, 118538, 118542, 118547, 118552, 118557, 118562, 118567, 118572, 118576,\n118582, 118588, 118594, 118600, 118605, 118612, 118618, 118623, 118627, 118631,\n118637, 118642, 118648, 118653, 118658, 118662, 118667, 118672, 118677, 118682,\n118688, 118695, 118700, 118705, 118711, 118717, 118721, 118726, 118730, 118735,\n118741, 118746, 118751, 118757, 118761, 118766, 118774, 118778, 118782, 118787,\n118794, 118798, 118802, 118807, 118813, 118819, 118823, 118827, 118832, 118836,\n118840, 118845, 118849, 118853, 118859, 118864, 118870, 118875, 118880, 118885,\n118891, 118896, 118902, 118907, 118912, 118917, 118923, 118929, 118933, 118937,\n118942, 118947, 118952, 118957, 118963, 118967, 118973, 118980, 118984, 118992,\n118996, 119000, 119006, 119010, 119016, 119020, 119024, 119029, 119034, 119039,\n119043, 119047, 119051, 119055, 119061, 119066, 119070, 119074, 119078, 119083,\n119088, 119093, 119097, 119102, 119106, 119111, 119117, 119121, 119126, 119132,\n119137, 119142, 119147, 119153, 119159, 119163, 119170, 119175, 119180, 119185,\n119190, 119194, 119198, 119202, 119208, 119214, 119218, 119223, 119229, 119234,\n119239, 119244, 119248, 119252, 119257, 119263, 119269, 119275, 119280, 119286,\n119292, 119297, 119301, 119309, 119316, 119320, 119325, 119330, 119335, 119339,\n119344, 119348, 119353, 119358, 119363, 119368, 119372, 119377, 119381, 119385,\n119389, 119394, 119400, 119405, 119410, 119414, 119419, 119425, 119431, 119435,\n119439, 119443, 119447, 119452, 119457, 119461, 119467, 119473, 119477, 119481,\n119487, 119492, 119496, 119502, 119507, 119512, 119516, 119522, 119527, 119531,\n119536, 119542, 119546, 119551, 119556, 119562, 119567, 119573, 119578, 119583,\n119589, 119594, 119599, 119603, 119609, 119614, 119619, 119624, 119629, 119634,\n119639, 119643, 119649, 119655, 119659, 119663, 119668, 119672, 119677, 119681,\n119686, 119690, 119694, 119700, 119704, 119710, 119715, 119720, 119724, 119730,\n119736, 119742, 119747, 119751, 119755, 119760, 119766, 119770, 119776, 119782,\n119789, 119795, 119801, 119807, 119813, 119818, 119822, 119826, 119831, 119835,\n119841, 119847, 119852, 119858, 119862, 119867, 119872, 119877, 119883, 119887,\n119892, 119898, 119904, 119910, 119916, 119922, 119928, 119933, 119938, 119944,\n119949, 119954, 119959, 119965, 119969, 119974, 119979, 119984, 119989, 119994,\n120001, 120005, 120009, 120013, 120019, 120023, 120029, 120034, 120040, 120045,\n120050, 120057, 120061, 120066, 120071, 120075, 120079, 120084, 120089, 120094,\n120098, 120102, 120107, 120111, 120116, 120122, 120129, 120133, 120138, 120142,\n120148, 120155, 120160, 120166, 120171, 120177, 120181, 120185, 120189, 120193,\n120199, 120204, 120210, 120214, 120219, 120224, 120228, 120233, 120239, 120244,\n120250, 120254, 120258, 120261, 120264, 120269, 120275, 120280, 120284, 120289,\n120295, 120300, 120306, 120310, 120314, 120319, 120323, 120327, 120331, 120337,\n120342, 120346, 120351, 120359, 120365, 120369, 120374, 120378, 120383, 120387,\n120393, 120398, 120402, 120407, 120413, 120417, 120421, 120425, 120430, 120434,\n120440, 120444, 120449, 120454, 120458, 120464, 120470, 120475, 120480, 120484,\n120489, 120493, 120497, 120505, -1, 120511, 120515, 120520, 120525, 120530,\n120537, 120541, 120545, 120550, 120556, 120561, 120566, 120571, 120576, 120582,\n120586, 120590, 120596, 120601, 120607, 120611, 120616, 120622, 120626, 120631,\n120637, 120643, 120648, 120654, 120659, 120664, 120668, 120673, 120679, 120683,\n120688, 120693, 120697, 120702, 120707, 120712, 120718, 120722, 120726, 120731,\n120737, 120741, 120746, 120751, 120755, 120760, 120765, 120770, 120776, 120782,\n120789, 120800, 120810, 120816, 120820, 120824, 120828, 120834, 120841, 120846,\n120852, 120856, 120862, 120867, 120871, 120877, 120883, 120888, 120893, 120897,\n120901, 120906, 120910, 120915, 120922, 120928, 120933, 120939, 120944, 120948,\n120954, 120960, 120965, 120971, 120979, 120986, 120995, 121000, 121006, 121011,\n121016, 121021, 121027, 121032, 121036, 121042, 121046, 121052, 121058, 121064,\n121070, 121074, 121079, 121084, 121088, 121093, 121098, 121103, 121110, 121116,\n121121, 121126, 121131, 121137, 121141, 121144, 121150, 121154, 121159, 121165,\n121170, 121175, 121179, 121188, 121193, 121201, 121206, 121212, 121217, 121221,\n121227, 121232, 121237, 121241, 121246, 121251, 121256, 121259, 121265, 121269,\n121274, 121278, 121284, 121290, 121294, 121299, 121304, 121314, 121320, 121324,\n121328, 121333, 121338, 121342, 121348, 121352, 121358, 121363, 121368, 121372,\n121377, 121383, 121387, 121391, 121396, 121403, 121408, 121415, 121421, 121428,\n121434, 121439, 121444, 121449, 121453, 121460, 121464, 121470, 121475, 121479,\n121486, 121491, 121497, 121503, 121508, 121513, 121518, 121523, 121529, 121533,\n121538, 121544, 121549, 121555, 121560, 121566, 121571, 121576, 121582, 121587,\n121592, 121599, 121603, 121610, 121620, 121628, 121635, 121639, 121643, 121647,\n121652, 121660, 121664, 121669, 121673, 121678, 121684, 121691, 121694, 121698,\n121704, 121708, 121714, 121718, 121723, 121727, 121732, 121737, 121741, 121747,\n121751, 121755, 121759, 121765, 121771, 121775, 121780, 121785, 121789, 121793,\n121798, 121803, 121807, 121812, 121817, 121822, 121827, 121832, 121836, 121842,\n121846, 121851, 121857, 121861, 121867, 121873, 121877, 121884, 121889, 121895,\n121899, 121905, 121911, 121915, 121920, 121926, 121931, 121936, 121941, 121946,\n121950, 121956, 121962, 121968, 121972, 121977, 121982, 121987, 121994, 121998,\n122002, 122008, 122014, 122020, 122026, 122031, 122035, 122040, 122045, 122049,\n122056, 122061, 122066, 122071, 122076, 122079, 122084, 122088, 122095, 122101,\n122108, 122114, 122119, 122123, 122127, 122131, 122136, 122141, 122147, 122153,\n122157, 122163, 122168, 122173, 122178, 122183, 122189, 122194, 122198, 122203,\n122209, 122214, 122219, 122224, 122229, 122233, 122239, 122245, 122251, 122255,\n122259, 122263, 122268, 122272, 122277, 122281, 122287, 122291, 122297, 122302,\n122307, 122312, 122318, 122324, 122329, 122335, 122340, 122344, 122349, 122353,\n122358, 122363, 122369, 122374, 122378, 122383, 122389, 122394, 122399, 122403,\n122409, 122415, 122420, 122425, 122429, 122436, 122442, 122448, 122453, 122457,\n122461, 122466, 122470, 122476, 122481, 122485, 122490, 122495, 122499, 122505,\n122510, 122514, 122520, 122524, 122528, 122534, 122539, 122544, 122548, 122553,\n122557, 122564, 122568, 122574, 122580, 122584, 122589, 122593, 122600, 122606,\n122612, 122616, 122620, 122625, 122629, 122634, 122639, 122645, 122651, 122655,\n122660, 122665, 122670, 122674, 122680, 122685, 122689, 122694, 122698, 122703,\n122709, 122714, 122720, 122725, 122730, 122739, 122745, 122750, 122756, 122761,\n122765, 122769, 122775, 122780, 122784, 122788, 122794, 122798, 122802, 122807,\n122812, 122816, 122820, 122825, 122829, 122833, 122839, 122843, 122846, 122849,\n122856, 122860, 122864, 122870, 122875, 122884, 122892, 122896, 122902, 122907,\n122911, 122915, 122921, 122927, 122932, 122938, 122943, 122949, 122953, 122958,\n122964, 122968, 122972, 122976, 122982, 122986, 122990, 122994, 123000, 123006,\n123012, 123017, 123024, 123028, 123034, 123038, 123042, 123048, 123052, 123057,\n123063, 123067, 123073, 123079, 123083, 123087, 123094, 123107, 123111, -1,\n123116, 123121, 123127, 123132, 123136, 123141, 123145, 123149, 123153, 123156,\n123161, 123166, 123170, 123176, 123180, 123185, 123189, 123195, 123201, 123206,\n123211, 123215, 123221, 123226, 123230, 123234, 123243, 123249, 123255, 123259,\n123265, 123271, 123277, 123283, 123288, 123292, 123297, 123303, 123308, 123313,\n123318, 123322, 123326, 123332, 123338, 123343, 123347, 123351, 123355, 123360,\n123365, 123369, 123373, 123379, 123384, 123388, 123392, 123396, 123400, 123404,\n123410, 123415, 123421, 123427, 123431, 123438, 123443, 123447, 123452, 123456,\n123460, 123465, 123470, 123476, 123482, 123487, 123491, 123499, 123505, 123509,\n123513, 123518, 123523, 123529, 123533, 123539, 123543, 123548, 123552, 123558,\n123562, 123569, 123574, 123580, 123586, 123591, 123596, 123601, 123607, 123613,\n123617, 123622, 123627, 123631, 123637, 123641, 123647, 123653, 123658, 123662,\n123666, 123671, 123676, 123680, 123684, 123688, 123693, 123697, 123703, 123707,\n123713, 123717, 123723, 123728, 123732, 123738, 123744, 123748, 123753, 123757,\n123762, 123767, 123771, 123775, 123781, 123789, 123794, 123800, 123806, 123810,\n123814, 123820, 123826, 123831, 123835, 123841, 123847, 123852, 123856, 123860,\n123866, 123871, 123877, 123881, 123887, 123891, 123895, 123901, 123907, 123913,\n123918, 123922, 123928, 123933, 123938, 123942, 123947, 123951, 123956, 123961,\n123967, 123973, 123977, 123983, 123989, 123993, 123997, 124001, 124007, 124011,\n124014, 124018, 124024, 124028, 124032, 124037, 124043, 124047, 124052, 124057,\n124063, 124069, 124075, 124081, 124087, 124091, 124095, 124099, 124102, 124106,\n124111, 124115, 124120, 124124, 124128, 124133, 124139, 124144, 124148, 124152,\n124158, 124162, 124166, 124172, 124177, 124183, 124189, 124195, 124200, 124204,\n124208, 124214, 124220, 124226, 124231, 124237, 124243, 124251, 124255, 124260,\n124266, 124272, 124278, 124283, 124289, 124295, 124300, 124305, 124309, 124314,\n124318, 124322, 124328, 124332, 124338, 124343, 124348, 124353, 124359, 124363,\n124367, 124371, 124376, 124382, 124387, 124392, 124396, 124400, 124404, 124409,\n124414, 124420, 124424, 124431, 124436, 124441, 124445, 124449, 124454, 124461,\n124466, 124472, 124476, 124482, 124487, 124491, 124496, 124501, 124505, 124511,\n124515, 124521, 124527, 124531, 124536, 124540, 124544, 124549, 124553, 124559,\n124564, 124568, -1, 124574, 124580, 124584, 124588, 124594, 124598, 124602,\n124606, 124611, 124615, 124620, 124625, 124630, 124637, 124644, 124649, 124656,\n124662, 124667, 124673, 124677, 124684, 124690, 124695, 124699, 124705, 124710,\n124715, 124720, 124724, 124730, 124735, 124739, 124745, 124749, 124753, 124759,\n124764, 124769, 124774, 124780, 124784, 124789, 124794, 124798, 124803, 124808,\n124814, 124818, 124822, 124828, 124832, 124837, 124842, 124846, 124851, 124856,\n124860, 124866, 124871, 124876, 124880, 124885, 124890, 124895, 124899, 124903,\n124908, 124913, 124917, 124921, 124926, 124931, 124937, 124941, 124945, 124951,\n124955, 124960, 124965, 124971, 124975, 124980, 124985, 124989, 124995, 125001,\n125006, 125012, 125016, 125021, 125027, 125031, 125035, 125039, 125045, 125050,\n125055, 125061, 125065, 125072, 125077, 125081, 125087, 125093, 125099, 125104,\n125109, 125114, 125119, 125124, 125128, 125134, 125139, 125145, 125149, 125156,\n125161, 125166, 125171, 125177, 125181, 125187, 125193, 125198, 125202, 125207,\n125211, 125215, 125219, 125225, 125230, 125235, 125239, 125244, 125249, 125254,\n125258, 125262, 125267, 125271, 125275, 125280, 125285, 125291, 125296, 125302,\n125308, 125312, 125318, 125322, 125326, 125330, 125334, 125338, 125342, 125347,\n125353, 125359, 125363, 125367, 125372, 125377, 125382, 125387, 125392, 125396,\n125401, 125407, 125411, 125417, 125423, 125429, 125434, 125440, 125445, 125450,\n125455, 125460, 125465, 125471, 125476, 125480, 125485, 125489, 125493, 125498,\n125503, 125507, 125512, 125518, 125522, 125525, 125529, 125533, 125539, 125544,\n125550, 125555, 125560, 125564, 125569, 125575, 125579, 125584, 125588, 125594,\n125599, 125605, 125609, 125614, 125618, 125624, 125628, 125632, 125638, 125644,\n125650, 125656, 125661, 125667, 125673, 125679, 125684, 125688, 125694, 125698,\n125704, 125710, 125715, 125720, 125725, 125730, 125735, 125740, 125746, 125750,\n125755, 125760, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, 125764, 125767, 125770, 125772, 125775, 125779, 125783, 125786,\n125790, 125793, 125796, 125798, 125801, 125805, 125808, 125812, 125815, 125818,\n125820, 125823, 125826, 125828, 125831, 125835, 125839, 125842, 125846, 125851,\n125856, 125860, 125865, 125869, 125873, 125876, 125880, 125885, 125889, 125894,\n125898, 125902, 125905, 125909, 125913, 125916, 125920, 125924, 125928, 125931,\n125935, 125940, 125944, 125948, 125952, 125955, 125959, 125964, 125968, 125972,\n125976, 125979, 125983, 125988, 125992, 125997, 126001, 126005, 126008, 126012,\n126017, 126021, 126026, 126030, 126034, 126037, 126041, 126045, 126049, 126052,\n126056, 126061, 126065, 126069, 126073, 126076, 126080, 126085, 126089, 126094,\n126099, 126103, 126108, 126114, 126120, 126125, 126131, 126136, 126141, 126145,\n126150, 126156, 126161, 126167, 126172, 126177, 126181, 126186, 126191, 126195,\n126200, 126205, 126210, 126214, 126219, 126225, 126230, 126235, 126240, 126244,\n126249, 126254, 126259, 126263, 126268, 126274, 126279, 126285, 126290, 126295,\n126299, 126304, 126309, 126314, 126318, 126323, 126328, 126333, 126337, 126342,\n126348, 126353, 126358, 126363, 126367, 126372, 126378, 126383, 126388, 126393,\n126397, 126402, 126408, 126413, 126419, 126424, 126429, 126433, 126438, 126444,\n126449, 126455, 126460, 126465, 126469, 126474, 126479, 126484, 126488, 126493,\n126499, 126504, 126509, 126513, 126518, 126524, 126529, 126533, 126537, 126540,\n126544, 126549, 126553, 126558, 126562, 126566, 126569, 126573, 126578, 126583,\n126587, 126592, 126596, 126600, 126603, 126607, 126611, 126614, 126618, 126622,\n126625, 126629, 126634, 126638, 126642, 126646, 126649, 126653, 126657, 126661,\n126664, 126668, 126672, 126676, 126679, 126683, 126687, 126690, 126694, 126698,\n126702, 126705, 126709, 126714, 126718, 126722, 126726, 126729, 126733, 126737,\n126741, 126744, 126748, 126753, 126758, 126762, 126767, 126771, 126775, 126778,\n126782, 126786, 126790, 126793, 126797, 126801, 126805, 126809, 126813, 126816,\n126820, 126825, 126829, 126833, 126837, 126840, 126844, 126849, 126853, 126857,\n126861, 126864, 126868, 126873, 126877, 126882, 126886, 126890, 126893, 126897,\n126902, 126906, 126910, 126914, 126917, 126921, 126925, 126928, 126932, 126936,\n126940, 126943, 126947, 126952, 126956, 126960, 126964, 126967, 126971, 126976,\n126980, 126985, 126989, 126993, 126996, 127000, 127005, 127010, 127014, 127019,\n127023, 127027, 127030, 127034, 127038, 127041, 127045, 127049, 127053, 127056,\n127060, 127065, 127069, 127074, 127079, 127083, 127088, 127094, 127099, 127105,\n127110, 127115, 127119, 127124, 127130, 127135, 127141, 127146, 127151, 127155,\n127160, 127165, 127169, 127174, 127179, 127184, 127188, 127193, 127199, 127204,\n127209, 127214, 127218, 127223, 127229, 127234, 127239, 127244, 127248, 127253,\n127258, 127263, 127267, 127272, 127277, 127281, 127286, 127291, 127296, 127300,\n127305, 127311, 127316, 127321, 127326, 127330, 127335, 127341, 127347, 127352,\n127358, 127363, 127368, 127372, 127377, 127383, 127388, 127393, 127398, 127403,\n127408, 127412, 127417, 127422, 127426, 127430, 127433, 127437, 127442, 127446,\n127451, 127455, 127458, 127462, 127467, 127471, 127476, 127480, 127484, 127487,\n127491, 127495, 127498, 127502, 127506, 127510, 127513, 127517, 127522, 127526,\n127531, 127536, 127540, 127545, 127551, 127556, 127562, 127567, 127572, 127576,\n127581, 127587, 127592, 127598, 127603, 127607, 127612, 127617, 127621, 127626,\n127631, 127636, 127640, 127645, 127651, 127656, 127661, 127666, 127670, 127675,\n127681, 127686, 127690, 127694, 127697, 127701, 127706, 127711, 127715, 127720,\n127724, 127728, 127731, 127735, 127740, 127745, 127749, 127754, 127758, 127762,\n127765, 127769, 127773, 127776, 127780, 127784, 127788, 127791, 127795, 127800,\n127804, 127808, 127812, 127815, 127819, 127824, 127828, 127832, 127836, 127839,\n127843, 127848, 127853, 127857, 127862, 127866, 127870, 127873, 127877, 127882,\n127887, 127891, 127896, 127900, 127904, 127907, 127911, 127915, 127919, 127922,\n127926, 127930, 127934, 127937, 127941, 127946, 127950, 127954, 127958, 127961,\n127965, 127970, 127974, 127979, 127983, 127987, 127990, 127994, 127999, 128003,\n128008, 128012, 128016, 128019, 128023, 128027, 128031, 128034, 128038, 128042,\n128046, 128049, 128053, 128058, 128062, 128067, 128072, 128076, 128082, 128087,\n128093, 128098, 128103, 128107, 128112, 128118, 128124, 128129, 128135, 128140,\n128145, 128149, 128154, 128159, 128164, 128168, 128173, 128178, 128183, 128187,\n128192, 128198, 128203, 128209, 128214, 128219, 128224, 128228, 128233, 128239,\n128244, 128250, 128255, 128260, 128264, 128269, 128274, 128278, 128283, 128288,\n128293, 128297, 128302, 128308, 128313, 128318, 128323, 128327, 128332, 128338,\n128344, 128349, 128355, 128360, 128365, 128369, 128374, 128380, 128386, 128391,\n128397, 128402, 128407, 128411, 128416, 128421, 128425, 128430, 128436, 128441,\n128447, 128452, 128457, 128461, 128466, 128472, 128478, 128483, 128488, 128493,\n128497, 128502, 128507, 128511, 128516, 128520, 128525, 128529, 128533, 128537,\n128540, 128544, 128549, 128554, 128558, 128563, 128567, 128571, 128574, 128578,\n128582, 128585, 128589, 128593, 128597, 128600, 128604, 128609, 128613, 128618,\n128622, 128625, 128629, 128633, 128636, 128640, 128644, 128648, 128651, 128655,\n128660, 128664, 128669, 128673, 128677, 128680, 128684, 128689, 128693, 128698,\n128702, 128706, 128709, 128713, 128717, 128720, 128724, 128728, 128732, 128735,\n128739, 128744, 128748, 128752, 128756, 128759, 128763, 128768, 128772, 128776,\n128780, 128783, 128787, 128792, 128797, 128801, 128806, 128810, 128814, 128817,\n128821, 128826, 128830, 128835, 128839, 128843, 128846, 128850, 128854, 128857,\n128861, 128865, 128869, 128872, 128876, 128881, 128885, 128889, 128893, 128896,\n128900, 128905, 128909, 128914, 128919, 128923, 128928, 128934, 128940, 128945,\n128951, 128956, 128961, 128965, 128970, 128975, 128979, 128984, 128989, 128993,\n128998, 129003, 129007, 129012, 129018, 129023, 129028, 129033, 129037, 129042,\n129048, 129053, 129058, 129063, 129067, 129072, 129078, 129083, 129089, 129094,\n129099, 129103, 129108, 129114, 129119, 129124, 129129, 129134, 129138, 129143,\n129147, 129152, 129158, 129163, 129168, 129173, 129177, 129182, 129188, 129193,\n129197, 129201, 129204, 129208, 129213, 129217, 129222, 129226, 129230, 129233,\n129237, 129242, 129246, 129251, 129255, 129259, 129262, 129266, 129270, 129273,\n129277, 129281, 129285, 129288, 129292, 129297, 129301, 129305, 129309, 129312,\n129316, 129321, 129325, 129330, 129335, 129339, 129344, 129350, 129355, 129361,\n129366, 129371, 129375, 129380, 129385, 129390, 129394, 129399, 129404, 129408,\n129413, 129418, 129423, 129427, 129432, 129437, 129442, 129446, 129451, 129457,\n129462, 129467, 129472, 129476, 129481, 129487, 129492, 129498, 129503, 129508,\n129512, 129517, 129522, 129527, 129531, 129536, 129541, 129546, 129550, 129555,\n129561, 129566, 129571, 129576, 129580, 129585, 129591, 129596, 129601, 129606,\n129610, 129615, 129621, 129627, 129632, 129638, 129643, 129648, 129652, 129657,\n129662, 129667, 129671, 129676, 129681, 129685, 129690, 129696, 129701, 129706,\n129711, 129715, 129720, 129726, 129731, 129736, 129740, 129746, 129751, 129756,\n129761, 129765, 129770, 129775, 129780, 129784, 129789, 129794, 129799, 129803,\n129808, 129814, 129819, 129824, 129829, 129833, 129838, 129844, 129849, 129854,\n129859, 129863, 129868, 129873, 129877, 129882, 129887, 129892, 129896, 129901,\n129906, 129911, 129915, 129920, 129926, 129931, 129936, 129941, 129945, 129950,\n129956, 129961, 129966, 129971, 129975, 129980, 129986, 129991, 129997, 130002,\n130007, 130011, 130016, 130021, 130026, 130030, 130035, 130040, 130045, 130049,\n130054, 130060, 130065, 130070, 130075, 130079, 130084, 130090, 130095, 130099,\n130103, 130106, 130110, 130115, 130119, 130124, 130128, 130132, 130135, 130139,\n130143, 130146, 130150, 130154, 130158, 130161, 130165, 130170, 130174, 130178,\n130182, 130185, 130189, 130194, 130198, 130202, 130206, 130209, 130213, 130218,\n130223, 130227, 130232, 130237, 130242, 130246, 130251, 130255, 130259, 130262,\n130266, 130270, 130274, 130277, 130281, 130286, 130290, 130294, 130298, 130301,\n130305, 130310, 130314, 130318, 130322, 130325, 130329, 130334, 130339, 130343,\n130348, 130353, 130358, 130362, 130367, 130371, 130375, 130378, 130382, 130386,\n130390, 130393, 130397, 130402, 130406, 130410, 130414, 130417, 130421, 130426,\n130430, 130435, 130440, 130444, 130449, 130455, 130461, 130466, 130472, 130478,\n130483, 130489, 130494, 130499, 130503, 130508, 130513, 130518, 130522, 130527,\n130533, 130538, 130543, 130548, 130552, 130557, 130562, 130567, 130571, 130576,\n130582, 130588, 130593, 130599, 130605, 130610, 130615, 130620, 130624, 130629,\n130634, 130638, 130643, 130649, 130654, 130659, 130664, 130668, 130673, 130679,\n130684, 130689, 130694, 130698, 130703, 130709, 130715, 130720, 130726, 130732,\n130737, 130743, 130748, 130753, 130757, 130762, 130767, 130772, 130776, 130781,\n130785, 130789, 130792, 130796, 130801, 130806, 130810, 130815, 130820, 130824,\n130828, 130832, 130835, 130839, 130843, 130847, 130850, 130854, 130859, 130863,\n130867, 130871, 130874, 130878, 130883, 130888, 130892, 130897, 130902, 130907,\n130911, 130916, 130920, 130924, 130927, 130931, 130935, 130939, 130942, 130946,\n130951, 130955, 130959, 130963, 130966, 130970, 130975, -1, -1, -1,\n130979, 130983, 130986, 130990, 130995, 130999, 131003, 131008, 131012, 131015,\n131020, 131024, 131029, 131033, 131036, 131040, 131045, 131049, -1, -1,\n131052, 131057, 131061, 131066, 131071, 131074, 131077, 131082, 131086, 131090,\n131094, 131098, 131102, 131106, 131110, 131113, -1, 131116, 131120, 131124,\n131129, 131132, 131135, 131140, 131144, 131147, 131152, 131156, 131161, -1,\n131166, 131171, 131175, -1, 131181, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 131184, 131187, 131191, 131196, 131201, 131205,\n131210, 131215, 131219, 131223, 131228, 131233, 131238, 131243, 131248, 131253,\n131258, 131262, 131266, 131271, 131275, 131280, 131285, 131289, 131293, 131297,\n131301, 131305, 131309, 131313, 131318, 131324, 131330, 131335, 131341, 131347,\n131352, 131357, 131363, 131369, 131375, 131381, 131387, 131393, 131399, 131404,\n131409, 131415, 131420, 131426, 131432, 131437, 131442, 131447, 131452, 131457,\n131462, 131466, 131471, 131477, 131483, 131488, 131494, 131500, 131505, 131510,\n131516, 131522, 131528, 131534, 131540, 131546, 131552, 131557, 131562, 131568,\n131573, 131579, 131585, 131590, 131595, 131600, 131605, 131610, 131615, 131620,\n131626, 131633, 131640, 131646, 131653, 131660, 131666, 131672, 131679, 131686,\n131693, 131700, 131707, 131714, 131721, 131727, 131733, 131740, 131746, 131753,\n131760, 131766, 131772, 131778, 131784, 131790, 131796, 131800, 131805, 131811,\n131817, 131822, 131828, 131834, 131839, 131844, 131850, 131856, 131862, 131868,\n131874, 131880, 131886, 131891, 131896, 131902, 131907, 131913, 131919, 131924,\n131929, 131934, 131939, 131944, 131949, 131952, 131956, 131961, 131966, 131970,\n131975, 131980, 131984, 131988, 131993, 131998, 132003, 132008, 132013, 132018,\n132023, 132027, 132031, 132036, 132040, 132045, 132050, 132054, 132058, 132062,\n132066, 132070, 132074, 132079, 132085, 132092, 132099, 132105, 132112, 132119,\n132125, 132131, 132138, 132145, 132152, 132159, 132166, 132173, 132180, 132186,\n132192, 132199, 132205, 132212, 132219, 132225, 132231, 132237, 132243, 132249,\n132255, 132259, 132264, 132270, 132276, 132281, 132287, 132293, 132298, 132303,\n132309, 132315, 132321, 132327, 132333, 132339, 132345, 132350, 132355, 132361,\n132366, 132372, 132378, 132383, 132388, 132393, 132398, 132403, 132408, 132411,\n132415, 132420, 132425, 132429, 132434, 132439, 132443, 132447, 132452, 132457,\n132462, 132467, 132472, 132477, 132482, 132486, 132490, 132495, 132499, 132504,\n132509, 132513, 132517, 132521, 132525, 132529, 132533, 132537, 132542, 132548,\n132554, 132559, 132565, 132571, 132576, 132581, 132587, 132593, 132599, 132605,\n132611, 132617, 132623, 132628, 132633, 132639, 132644, 132650, 132656, 132661,\n132666, 132671, 132676, 132681, 132686, 132691, 132697, 132704, 132711, 132717,\n132724, 132731, 132737, 132743, 132750, 132757, 132764, 132771, 132778, 132785,\n132792, 132798, 132804, 132811, 132817, 132824, 132831, 132837, 132843, 132849,\n132855, 132861, 132867, 132871, 132876, 132882, 132888, 132893, 132899, 132905,\n132910, 132915, 132921, 132927, 132933, 132939, 132945, 132951, 132957, 132962,\n132967, 132973, 132978, 132984, 132990, 132995, 133000, 133005, 133010, 133015,\n133020, 133024, 133029, 133035, 133041, 133046, 133052, 133058, 133063, 133068,\n133074, 133080, 133086, 133092, 133098, 133104, 133110, 133115, 133120, 133126,\n133131, 133137, 133143, 133148, 133153, 133158, 133163, 133168, 133173, 133176,\n133180, 133185, 133190, 133194, 133199, 133204, 133208, 133212, 133217, 133222,\n133227, 133232, 133237, 133242, 133247, 133251, 133255, 133260, 133264, 133269,\n133274, 133278, 133282, 133286, 133290, 133294, 133298, 133303, 133309, 133316,\n133323, 133329, 133336, 133343, 133349, 133355, 133362, 133369, 133376, 133383,\n133390, 133397, 133404, 133410, 133416, 133423, 133429, 133436, 133443, 133449,\n133455, 133461, 133467, 133473, 133479, 133483, 133488, 133494, 133500, 133505,\n133511, 133517, 133522, 133527, 133533, 133539, 133545, 133551, 133557, 133563,\n133569, 133574, 133579, 133585, 133590, 133596, 133602, 133607, 133612, 133617,\n133622, 133627, 133632, 133636, 133641, 133647, 133653, 133658, 133664, 133670,\n133675, 133680, 133686, 133692, 133698, 133704, 133710, 133716, 133722, 133727,\n133732, 133738, 133743, 133749, 133755, 133760, 133765, 133770, 133775, 133780,\n133785, 133789, 133794, 133800, 133806, 133811, 133817, 133823, 133828, 133833,\n133839, 133845, 133851, 133857, 133863, 133869, 133875, 133880, 133885, 133891,\n133896, 133902, 133908, 133913, 133918, 133923, 133928, 133933, 133938, 133942,\n133947, 133953, 133959, 133964, 133970, 133976, 133981, 133986, 133992, 133998,\n134004, 134010, 134016, 134022, 134028, 134033, 134038, 134044, 134049, 134055,\n134061, 134066, 134071, 134076, 134081, 134086, 134091, 134095, 134100, 134106,\n134112, 134117, 134123, 134129, 134134, 134139, 134145, 134151, 134157, 134163,\n134169, 134175, 134181, 134186, 134191, 134197, 134202, 134208, 134214, 134219,\n134224, 134229, 134234, 134239, 134244, 134247, 134251, 134256, 134261, 134265,\n134270, 134275, 134279, 134283, 134288, 134293, 134298, 134303, 134308, 134313,\n134318, 134322, 134326, 134331, 134335, 134340, 134345, 134349, 134353, 134357,\n134361, 134365, 134369, 134373, 134378, 134384, 134390, 134395, 134401, 134407,\n134412, 134417, 134423, 134429, 134435, 134441, 134447, 134453, 134459, 134464,\n134469, 134475, 134480, 134486, 134492, 134497, 134502, 134507, 134512, 134517,\n134522, 134527, 134533, 134540, 134547, 134553, 134560, 134567, 134573, 134579,\n134586, 134593, 134600, 134607, 134614, 134621, 134628, 134634, 134640, 134647,\n134653, 134660, 134667, 134673, 134679, 134685, 134691, 134697, 134703, 134708,\n134714, 134721, 134728, 134734, 134741, 134748, 134754, 134760, 134767, 134774,\n134781, 134788, 134795, 134802, 134809, 134815, 134821, 134828, 134834, 134841,\n134848, 134854, 134860, 134866, 134872, 134878, 134884, 134890, 134897, 134905,\n134913, 134920, 134928, 134936, 134943, 134950, 134958, 134966, 134974, 134982,\n134990, 134998, 135006, 135013, 135020, 135028, 135035, 135043, 135051, 135058,\n135065, 135072, 135079, 135086, 135093, 135098, 135104, 135111, 135118, 135124,\n135131, 135138, 135144, 135150, 135157, 135164, 135171, 135178, 135185, 135192,\n135199, 135205, 135211, 135218, 135224, 135231, 135238, 135244, 135250, 135256,\n135262, 135268, 135274, 135278, 135283, 135289, 135295, 135300, 135306, 135312,\n135317, 135322, 135328, 135334, 135340, 135346, 135352, 135358, 135364, 135369,\n135374, 135380, 135385, 135391, 135397, 135402, 135407, 135412, 135417, 135422,\n135427, 135433, 135440, 135448, 135456, 135463, 135471, 135479, 135486, 135493,\n135501, 135509, 135517, 135525, 135533, 135541, 135549, 135556, 135563, 135571,\n135578, 135586, 135594, 135601, 135608, 135615, 135622, 135629, 135636, 135641,\n135647, 135654, 135661, 135667, 135674, 135681, 135687, 135693, 135700, 135707,\n135714, 135721, 135728, 135735, 135742, 135748, 135754, 135761, 135767, 135774,\n135781, 135787, 135793, 135799, 135805, 135811, 135817, 135821, 135826, 135832,\n135838, 135843, 135849, 135855, 135860, 135865, 135871, 135877, 135883, 135889,\n135895, 135901, 135907, 135912, 135917, 135923, 135928, 135934, 135940, 135945,\n135950, 135955, 135960, 135965, 135970, 135975, 135981, 135988, 135995, 136001,\n136008, 136015, 136021, 136027, 136034, 136041, 136048, 136055, 136062, 136069,\n136076, 136082, 136088, 136095, 136101, 136108, 136115, 136121, 136127, 136133,\n136139, 136145, 136151, 136157, 136164, 136172, 136180, 136187, 136195, 136203,\n136210, 136217, 136225, 136233, 136241, 136249, 136257, 136265, 136273, 136280,\n136287, 136295, 136302, 136310, 136318, 136325, 136332, 136339, 136346, 136353,\n136360, 136365, 136371, 136378, 136385, 136391, 136398, 136405, 136411, 136417,\n136424, 136431, 136438, 136445, 136452, 136459, 136466, 136472, 136478, 136485,\n136491, 136498, 136505, 136511, 136517, 136523, 136529, 136535, 136541, 136546,\n136552, 136559, 136566, 136572, 136579, 136586, 136592, 136598, 136605, 136612,\n136619, 136626, 136633, 136640, 136647, 136653, 136659, 136666, 136672, 136679,\n136686, 136692, 136698, 136704, 136710, 136716, 136722, 136726, 136731, 136737,\n136743, 136748, 136754, 136760, 136765, 136770, 136776, 136782, 136788, 136794,\n136800, 136806, 136812, 136817, 136822, 136828, 136833, 136839, 136845, 136850,\n136855, 136860, 136865, 136870, 136875, 136881, 136888, 136896, 136904, 136911,\n136919, 136927, 136934, 136941, 136949, 136957, 136965, 136973, 136981, 136989,\n136997, 137004, 137011, 137019, 137026, 137034, 137042, 137049, 137056, 137063,\n137070, 137077, 137084, 137089, 137095, 137102, 137109, 137115, 137122, 137129,\n137135, 137141, 137148, 137155, 137162, 137169, 137176, 137183, 137190, 137196,\n137202, 137209, 137215, 137222, 137229, 137235, 137241, 137247, 137253, 137259,\n137265, 137270, 137276, 137283, 137290, 137296, 137303, 137310, 137316, 137322,\n137329, 137336, 137343, 137350, 137357, 137364, 137371, 137377, 137383, 137390,\n137396, 137403, 137410, 137416, 137422, 137428, 137434, 137440, 137446, 137451,\n137457, 137464, 137471, 137477, 137484, 137491, 137497, 137503, 137510, 137517,\n137524, 137531, 137538, 137545, 137552, 137558, 137564, 137571, 137577, 137584,\n137591, 137597, 137603, 137609, 137615, 137621, 137627, 137632, 137638, 137645,\n137652, 137658, 137665, 137672, 137678, 137684, 137691, 137698, 137705, 137712,\n137719, 137726, 137733, 137739, 137745, 137752, 137758, 137765, 137772, 137778,\n137784, 137790, 137796, 137802, 137808, 137813, 137819, 137826, 137833, 137839,\n137846, 137853, 137859, 137865, 137872, 137879, 137886, 137893, 137900, 137907,\n137914, 137920, 137926, 137933, 137939, 137946, 137953, 137959, 137965, 137971,\n137977, 137983, 137989, 137993, 137998, 138004, 138010, 138015, 138021, 138027,\n138032, 138037, 138043, 138049, 138055, 138061, 138067, 138073, 138079, 138084,\n138089, 138095, 138100, 138106, 138112, 138117, 138122, 138127, 138132, 138137,\n138142, 138145, 138149, 138154, 138159, 138163, 138168, 138173, 138177, 138181,\n138186, 138191, 138196, 138201, 138206, 138211, 138216, 138220, 138224, 138229,\n138233, 138238, 138243, 138247, 138251, 138255, 138259, 138263, 138267, 138271,\n138276, 138282, 138288, 138293, 138299, 138305, 138310, 138315, 138321, 138327,\n138333, 138339, 138345, 138351, 138357, 138362, 138367, 138373, 138378, 138384,\n138390, 138395, 138400, 138405, 138410, 138415, 138420, 138424, 138429, 138435,\n138441, 138446, 138452, 138458, 138463, 138468, 138474, 138480, 138486, 138492,\n138498, 138504, 138510, 138515, 138520, 138526, 138531, 138537, 138543, 138548,\n138553, 138558, 138563, 138568, 138573, 138578, 138584, 138591, 138598, 138604,\n138611, 138618, 138624, 138630, 138637, 138644, 138651, 138658, 138665, 138672,\n138679, 138685, 138691, 138698, 138704, 138711, 138718, 138724, 138730, 138736,\n138742, 138748, 138754, 138758, 138763, 138769, 138775, 138780, 138786, 138792,\n138797, 138802, 138808, 138814, 138820, 138826, 138832, 138838, 138844, 138849,\n138854, 138860, 138865, 138871, 138877, 138882, 138887, 138892, 138897, 138902,\n138907, 138910, 138914, 138919, 138924, 138928, 138933, 138938, 138942, 138946,\n138951, 138956, 138961, 138966, 138971, 138976, 138981, 138985, 138989, 138994,\n138998, 139003, 139008, 139012, 139016, 139020, 139024, 139028, 139032, 139037,\n139043, 139050, 139057, 139063, 139070, 139077, 139083, 139089, 139096, 139103,\n139110, 139117, 139124, 139131, 139138, 139144, 139150, 139157, 139163, 139170,\n139177, 139183, 139189, 139195, 139201, 139207, 139213, 139217, 139222, 139228,\n139234, 139239, 139245, 139251, 139256, 139261, 139267, 139273, 139279, 139285,\n139291, 139297, 139303, 139308, 139313, 139319, 139324, 139330, 139336, 139341,\n139346, 139351, 139356, 139361, 139366, 139369, 139373, 139378, 139383, 139387,\n139392, 139397, 139401, 139405, 139410, 139415, 139420, 139425, 139430, 139435,\n139440, 139444, 139448, 139453, 139457, 139462, 139467, 139471, 139475, 139479,\n139483, 139487, 139491, 139495, 139500, 139506, 139512, 139517, 139523, 139529,\n139534, 139539, 139545, 139551, 139557, 139563, 139569, 139575, 139581, 139586,\n139591, 139597, 139602, 139608, 139614, 139619, 139624, 139629, 139634, 139639,\n139644, 139649, 139655, 139662, 139669, 139675, 139682, 139689, 139695, 139701,\n139708, 139715, 139722, 139729, 139736, 139743, 139750, 139756, 139762, 139769,\n139775, 139782, 139789, 139795, 139801, 139807, 139813, 139819, 139825, 139829,\n139834, 139840, 139846, 139851, 139857, 139863, 139868, 139873, 139879, 139885,\n139891, 139897, 139903, 139909, 139915, 139920, 139925, 139931, 139936, 139942,\n139948, 139953, 139958, 139963, 139968, 139973, 139978, 139982, 139987, 139993,\n139999, 140004, 140010, 140016, 140021, 140026, 140032, 140038, 140044, 140050,\n140056, 140062, 140068, 140073, 140078, 140084, 140089, 140095, 140101, 140106,\n140111, 140116, 140121, 140126, 140131, 140134, 140138, 140143, 140148, 140152,\n140157, 140162, 140166, 140170, 140175, 140180, 140185, 140190, 140195, 140200,\n140205, 140209, 140213, 140218, 140222, 140227, 140232, 140236, 140240, 140244,\n140248, 140252, 140256, 140261, 140267, 140274, 140281, 140287, 140294, 140301,\n140307, 140313, 140320, 140327, 140334, 140341, 140348, 140355, 140362, 140368,\n140374, 140381, 140387, 140394, 140401, 140407, 140413, 140419, 140425, 140431,\n140437, 140441, 140446, 140452, 140458, 140463, 140469, 140475, 140480, 140485,\n140491, 140497, 140503, 140509, 140515, 140521, 140527, 140532, 140537, 140543,\n140548, 140554, 140560, 140565, 140570, 140575, 140580, 140585, 140590, 140594,\n140599, 140605, 140611, 140616, 140622, 140628, 140633, 140638, 140644, 140650,\n140656, 140662, 140668, 140674, 140680, 140685, 140690, 140696, 140701, 140707,\n140713, 140718, 140723, 140728, 140733, 140738, 140743, 140747, 140752, 140758,\n140764, 140769, 140775, 140781, 140786, 140791, 140797, 140803, 140809, 140815,\n140821, 140827, 140833, 140838, 140843, 140849, 140854, 140860, 140866, 140871,\n140876, 140881, 140886, 140891, 140896, 140900, 140905, 140911, 140917, 140922,\n140928, 140934, 140939, 140944, 140950, 140956, 140962, 140968, 140974, 140980,\n140986, 140991, 140996, 141002, 141007, 141013, 141019, 141024, 141029, 141034,\n141039, 141044, 141049, 141053, 141058, 141064, 141070, 141075, 141081, 141087,\n141092, 141097, 141103, 141109, 141115, 141121, 141127, 141133, 141139, 141144,\n141149, 141155, 141160, 141166, 141172, 141177, 141182, 141187, 141192, 141197,\n141202, 141205, 141209, 141214, 141219, 141223, 141228, 141233, 141237, 141241,\n141246, 141251, 141256, 141261, 141266, 141271, 141276, 141280, 141284, 141289,\n141293, 141298, 141303, 141307, 141311, 141315, 141319, 141323, 141327, 141330,\n141334, 141339, 141344, 141348, 141353, 141358, 141362, 141366, 141371, 141376,\n141381, 141386, 141391, 141396, 141401, 141405, 141409, 141414, 141418, 141423,\n141428, 141432, 141436, 141440, 141444, 141448, 141452, 141456, 141461, 141467,\n141473, 141478, 141484, 141490, 141495, 141500, 141506, 141512, 141518, 141524,\n141530, 141536, 141542, 141547, 141552, 141558, 141563, 141569, 141575, 141580,\n141585, 141590, 141595, 141600, 141605, 141609, 141614, 141620, 141626, 141631,\n141637, 141643, 141648, 141653, 141659, 141665, 141671, 141677, 141683, 141689,\n141695, 141700, 141705, 141711, 141716, 141722, 141728, 141733, 141738, 141743,\n141748, 141753, 141758, 141763, 141769, 141776, 141783, 141789, 141796, 141803,\n141809, 141815, 141822, 141829, 141836, 141843, 141850, 141857, 141864, 141870,\n141876, 141883, 141889, 141896, 141903, 141909, 141915, 141921, 141927, 141933,\n141939, 141943, 141948, 141954, 141960, 141965, 141971, 141977, 141982, 141987,\n141993, 141999, 142005, 142011, 142017, 142023, 142029, 142034, 142039, 142045,\n142050, 142056, 142062, 142067, 142072, 142077, 142082, 142087, 142092, 142095,\n142099, 142104, 142109, 142113, 142118, 142123, 142127, 142131, 142136, 142141,\n142146, 142151, 142156, 142161, 142166, 142170, 142174, 142179, 142183, 142188,\n142193, 142197, 142201, 142205, 142209, 142213, 142217, 142222, 142228, 142235,\n142242, 142248, 142255, 142262, 142268, 142274, 142281, 142288, 142295, 142302,\n142309, 142316, 142323, 142329, 142335, 142342, 142348, 142355, 142362, 142368,\n142374, 142380, 142386, 142392, 142398, 142402, 142407, 142413, 142419, 142424,\n142430, 142436, 142441, 142446, 142452, 142458, 142464, 142470, 142476, 142482,\n142488, 142493, 142498, 142504, 142509, 142515, 142521, 142526, 142531, 142536,\n142541, 142546, 142551, 142554, 142558, 142563, 142568, 142572, 142577, 142582,\n142586, 142590, 142595, 142600, 142605, 142610, 142615, 142620, 142625, 142629,\n142633, 142638, 142642, 142647, 142652, 142656, 142660, 142664, 142668, 142672,\n142676, 142680, 142685, 142691, 142697, 142702, 142708, 142714, 142719, 142724,\n142730, 142736, 142742, 142748, 142754, 142760, 142766, 142771, 142776, 142782,\n142787, 142793, 142799, 142804, 142809, 142814, 142819, 142824, 142829, 142834,\n142840, 142847, 142854, 142860, 142867, 142874, 142880, 142886, 142893, 142900,\n142907, 142914, 142921, 142928, 142935, 142941, 142947, 142954, 142960, 142967,\n142974, 142980, 142986, 142992, 142998, 143004, 143010, 143014, 143019, 143025,\n143031, 143036, 143042, 143048, 143053, 143058, 143064, 143070, 143076, 143082,\n143088, 143094, 143100, 143105, 143110, 143116, 143121, 143127, 143133, 143138,\n143143, 143148, 143153, 143158, 143163, 143167, 143172, 143178, 143184, 143189,\n143195, 143201, 143206, 143211, 143217, 143223, 143229, 143235, 143241, 143247,\n143253, 143258, 143263, 143269, 143274, 143280, 143286, 143291, 143296, 143301,\n143306, 143311, 143316, 143319, 143323, 143328, 143333, 143337, 143342, 143347,\n143351, 143355, 143360, 143365, 143370, 143375, 143380, 143385, 143390, 143394,\n143398, 143403, 143407, 143412, 143417, 143421, 143425, 143429, 143433, 143437,\n143441, 143446, 143452, 143459, 143466, 143472, 143479, 143486, 143492, 143498,\n143505, 143512, 143519, 143526, 143533, 143540, 143547, 143553, 143559, 143566,\n143572, 143579, 143586, 143592, 143598, 143604, 143610, 143616, 143622, 143626,\n143631, 143637, 143643, 143648, 143654, 143660, 143665, 143670, 143676, 143682,\n143688, 143694, 143700, 143706, 143712, 143717, 143722, 143728, 143733, 143739,\n143745, 143750, 143755, 143760, 143765, 143770, 143775, 143779, 143784, 143790,\n143796, 143801, 143807, 143813, 143818, 143823, 143829, 143835, 143841, 143847,\n143853, 143859, 143865, 143870, 143875, 143881, 143886, 143892, 143898, 143903,\n143908, 143913, 143918, 143923, 143928, 143932, 143937, 143943, 143949, 143954,\n143960, 143966, 143971, 143976, 143982, 143988, 143994, 144000, 144006, 144012,\n144018, 144023, 144028, 144034, 144039, 144045, 144051, 144056, 144061, 144066,\n144071, 144076, 144081, 144085, 144090, 144096, 144102, 144107, 144113, 144119,\n144124, 144129, 144135, 144141, 144147, 144153, 144159, 144165, 144171, 144176,\n144181, 144187, 144192, 144198, 144204, 144209, 144214, 144219, 144224, 144229,\n144234, 144238, 144243, 144249, 144255, 144260, 144266, 144272, 144277, 144282,\n144288, 144294, 144300, 144306, 144312, 144318, 144324, 144329, 144334, 144340,\n144345, 144351, 144357, 144362, 144367, 144372, 144377, 144382, 144387, 144390,\n144394, 144399, 144404, 144408, 144413, 144418, 144422, 144426, 144431, 144436,\n144441, 144446, 144451, 144456, 144461, 144465, 144469, 144474, 144478, 144483,\n144488, 144492, 144496, 144500, 144504, 144508, 144512, 144516, 144521, 144527,\n144533, 144538, 144544, 144550, 144555, 144560, 144566, 144572, 144578, 144584,\n144590, 144596, 144602, 144607, 144612, 144618, 144623, 144629, 144635, 144640,\n144645, 144650, 144655, 144660, 144665, 144670, 144676, 144683, 144690, 144696,\n144703, 144710, 144716, 144722, 144729, 144736, 144743, 144750, 144757, 144764,\n144771, 144777, 144783, 144790, 144796, 144803, 144810, 144816, 144822, 144828,\n144834, 144840, 144846, 144851, 144857, 144864, 144871, 144877, 144884, 144891,\n144897, 144903, 144910, 144917, 144924, 144931, 144938, 144945, 144952, 144958,\n144964, 144971, 144977, 144984, 144991, 144997, 145003, 145009, 145015, 145021,\n145027, 145033, 145040, 145048, 145056, 145063, 145071, 145079, 145086, 145093,\n145101, 145109, 145117, 145125, 145133, 145141, 145149, 145156, 145163, 145171,\n145178, 145186, 145194, 145201, 145208, 145215, 145222, 145229, 145236, 145241,\n145247, 145254, 145261, 145267, 145274, 145281, 145287, 145293, 145300, 145307,\n145314, 145321, 145328, 145335, 145342, 145348, 145354, 145361, 145367, 145374,\n145381, 145387, 145393, 145399, 145405, 145411, 145417, 145421, 145426, 145432,\n145438, 145443, 145449, 145455, 145460, 145465, 145471, 145477, 145483, 145489,\n145495, 145501, 145507, 145512, 145517, 145523, 145528, 145534, 145540, 145545,\n145550, 145555, 145560, 145565, 145570, 145576, 145583, 145591, 145599, 145606,\n145614, 145622, 145629, 145636, 145644, 145652, 145660, 145668, 145676, 145684,\n145692, 145699, 145706, 145714, 145721, 145729, 145737, 145744, 145751, 145758,\n145765, 145772, 145779, 145784, 145790, 145797, 145804, 145810, 145817, 145824,\n145830, 145836, 145843, 145850, 145857, 145864, 145871, 145878, 145885, 145891,\n145897, 145904, 145910, 145917, 145924, 145930, 145936, 145942, 145948, 145954,\n145960, 145964, 145969, 145975, 145981, 145986, 145992, 145998, 146003, 146008,\n146014, 146020, 146026, 146032, 146038, 146044, 146050, 146055, 146060, 146066,\n146071, 146077, 146083, 146088, 146093, 146098, 146103, 146108, 146113, 146118,\n146124, 146131, 146138, 146144, 146151, 146158, 146164, 146170, 146177, 146184,\n146191, 146198, 146205, 146212, 146219, 146225, 146231, 146238, 146244, 146251,\n146258, 146264, 146270, 146276, 146282, 146288, 146294, 146300, 146307, 146315,\n146323, 146330, 146338, 146346, 146353, 146360, 146368, 146376, 146384, 146392,\n146400, 146408, 146416, 146423, 146430, 146438, 146445, 146453, 146461, 146468,\n146475, 146482, 146489, 146496, 146503, 146508, 146514, 146521, 146528, 146534,\n146541, 146548, 146554, 146560, 146567, 146574, 146581, 146588, 146595, 146602,\n146609, 146615, 146621, 146628, 146634, 146641, 146648, 146654, 146660, 146666,\n146672, 146678, 146684, 146689, 146695, 146702, 146709, 146715, 146722, 146729,\n146735, 146741, 146748, 146755, 146762, 146769, 146776, 146783, 146790, 146796,\n146802, 146809, 146815, 146822, 146829, 146835, 146841, 146847, 146853, 146859,\n146865, 146869, 146874, 146880, 146886, 146891, 146897, 146903, 146908, 146913,\n146919, 146925, 146931, 146937, 146943, 146949, 146955, 146960, 146965, 146971,\n146976, 146982, 146988, 146993, 146998, 147003, 147008, 147013, 147018, 147024,\n147031, 147039, 147047, 147054, 147062, 147070, 147077, 147084, 147092, 147100,\n147108, 147116, 147124, 147132, 147140, 147147, 147154, 147162, 147169, 147177,\n147185, 147192, 147199, 147206, 147213, 147220, 147227, 147232, 147238, 147245,\n147252, 147258, 147265, 147272, 147278, 147284, 147291, 147298, 147305, 147312,\n147319, 147326, 147333, 147339, 147345, 147352, 147358, 147365, 147372, 147378,\n147384, 147390, 147396, 147402, 147408, 147413, 147419, 147426, 147433, 147439,\n147446, 147453, 147459, 147465, 147472, 147479, 147486, 147493, 147500, 147507,\n147514, 147520, 147526, 147533, 147539, 147546, 147553, 147559, 147565, 147571,\n147577, 147583, 147589, 147594, 147600, 147607, 147614, 147620, 147627, 147634,\n147640, 147646, 147653, 147660, 147667, 147674, 147681, 147688, 147695, 147701,\n147707, 147714, 147720, 147727, 147734, 147740, 147746, 147752, 147758, 147764,\n147770, 147775, 147781, 147788, 147795, 147801, 147808, 147815, 147821, 147827,\n147834, 147841, 147848, 147855, 147862, 147869, 147876, 147882, 147888, 147895,\n147901, 147908, 147915, 147921, 147927, 147933, 147939, 147945, 147951, 147956,\n147962, 147969, 147976, 147982, 147989, 147996, 148002, 148008, 148015, 148022,\n148029, 148036, 148043, 148050, 148057, 148063, 148069, 148076, 148082, 148089,\n148096, 148102, 148108, 148114, 148120, 148126, 148132, 148136, 148141, 148147,\n148153, 148158, 148164, 148170, 148175, 148180, 148186, 148192, 148198, 148204,\n148210, 148216, 148222, 148227, 148232, 148238, 148243, 148249, 148255, 148260,\n148265, 148270, 148275, 148280, 148285, 148288, 148292, 148297, 148302, 148306,\n148311, 148316, 148320, 148324, 148329, 148334, 148339, 148344, 148349, 148354,\n148359, 148363, 148367, 148372, 148376, 148381, 148386, 148390, 148394, 148398,\n148402, 148406, 148410, 148414, 148419, 148425, 148431, 148436, 148442, 148448,\n148453, 148458, 148464, 148470, 148476, 148482, 148488, 148494, 148500, 148505,\n148510, 148516, 148521, 148527, 148533, 148538, 148543, 148548, 148553, 148558,\n148563, 148567, 148572, 148578, 148584, 148589, 148595, 148601, 148606, 148611,\n148617, 148623, 148629, 148635, 148641, 148647, 148653, 148658, 148663, 148669,\n148674, 148680, 148686, 148691, 148696, 148701, 148706, 148711, 148716, 148721,\n148727, 148734, 148741, 148747, 148754, 148761, 148767, 148773, 148780, 148787,\n148794, 148801, 148808, 148815, 148822, 148828, 148834, 148841, 148847, 148854,\n148861, 148867, 148873, 148879, 148885, 148891, 148897, 148901, 148906, 148912,\n148918, 148923, 148929, 148935, 148940, 148945, 148951, 148957, 148963, 148969,\n148975, 148981, 148987, 148992, 148997, 149003, 149008, 149014, 149020, 149025,\n149030, 149035, 149040, 149045, 149050, 149053, 149057, 149062, 149067, 149071,\n149076, 149081, 149085, 149089, 149094, 149099, 149104, 149109, 149114, 149119,\n149124, 149128, 149132, 149137, 149141, 149146, 149151, 149155, 149159, 149163,\n149167, 149171, 149175, 149180, 149186, 149193, 149200, 149206, 149213, 149220,\n149226, 149232, 149239, 149246, 149253, 149260, 149267, 149274, 149281, 149287,\n149293, 149300, 149306, 149313, 149320, 149326, 149332, 149338, 149344, 149350,\n149356, 149360, 149365, 149371, 149377, 149382, 149388, 149394, 149399, 149404,\n149410, 149416, 149422, 149428, 149434, 149440, 149446, 149451, 149456, 149462,\n149467, 149473, 149479, 149484, 149489, 149494, 149499, 149504, 149509, 149512,\n149516, 149521, 149526, 149530, 149535, 149540, 149544, 149548, 149553, 149558,\n149563, 149568, 149573, 149578, 149583, 149587, 149591, 149596, 149600, 149605,\n149610, 149614, 149618, 149622, 149626, 149630, 149634, 149638, 149643, 149649,\n149655, 149660, 149666, 149672, 149677, 149682, 149688, 149694, 149700, 149706,\n149712, 149718, 149724, 149729, 149734, 149740, 149745, 149751, 149757, 149762,\n149767, 149772, 149777, 149782, 149787, 149792, 149798, 149805, 149812, 149818,\n149825, 149832, 149838, 149844, 149851, 149858, 149865, 149872, 149879, 149886,\n149893, 149899, 149905, 149912, 149918, 149925, 149932, 149938, 149944, 149950,\n149956, 149962, 149968, 149972, 149977, 149983, 149989, 149994, 150000, 150006,\n150011, 150016, 150022, 150028, 150034, 150040, 150046, 150052, 150058, 150063,\n150068, 150074, 150079, 150085, 150091, 150096, 150101, 150106, 150111, 150116,\n150121, 150125, 150130, 150136, 150142, 150147, 150153, 150159, 150164, 150169,\n150175, 150181, 150187, 150193, 150199, 150205, 150211, 150216, 150221, 150227,\n150232, 150238, 150244, 150249, 150254, 150259, 150264, 150269, 150274, 150277,\n150281, 150286, 150291, 150295, 150300, 150305, 150309, 150313, 150318, 150323,\n150328, 150333, 150338, 150343, 150348, 150352, 150356, 150361, 150365, 150370,\n150375, 150379, 150383, 150387, 150391, 150395, 150399, 150404, 150410, 150417,\n150424, 150430, 150437, 150444, 150450, 150456, 150463, 150470, 150477, 150484,\n150491, 150498, 150505, 150511, 150517, 150524, 150530, 150537, 150544, 150550,\n150556, 150562, 150568, 150574, 150580, 150584, 150589, 150595, 150601, 150606,\n150612, 150618, 150623, 150628, 150634, 150640, 150646, 150652, 150658, 150664,\n150670, 150675, 150680, 150686, 150691, 150697, 150703, 150708, 150713, 150718,\n150723, 150728, 150733, 150737, 150742, 150748, 150754, 150759, 150765, 150771,\n150776, 150781, 150787, 150793, 150799, 150805, 150811, 150817, 150823, 150828,\n150833, 150839, 150844, 150850, 150856, 150861, 150866, 150871, 150876, 150881,\n150886, 150890, 150895, 150901, 150907, 150912, 150918, 150924, 150929, 150934,\n150940, 150946, 150952, 150958, 150964, 150970, 150976, 150981, 150986, 150992,\n150997, 151003, 151009, 151014, 151019, 151024, 151029, 151034, 151039, 151043,\n151048, 151054, 151060, 151065, 151071, 151077, 151082, 151087, 151093, 151099,\n151105, 151111, 151117, 151123, 151129, 151134, 151139, 151145, 151150, 151156,\n151162, 151167, 151172, 151177, 151182, 151187, 151192, 151196, 151201, 151207,\n151213, 151218, 151224, 151230, 151235, 151240, 151246, 151252, 151258, 151264,\n151270, 151276, 151282, 151287, 151292, 151298, 151303, 151309, 151315, 151320,\n151325, 151330, 151335, 151340, 151345, 151348, 151352, 151357, 151362, 151366,\n151371, 151376, 151380, 151384, 151389, 151394, 151399, 151404, 151409, 151414,\n151419, 151423, 151427, 151432, 151436, 151441, 151446, 151450, 151454, 151458,\n151462, 151466, 151470, 151473, 151477, 151482, 151487, 151491, 151496, 151501,\n151505, 151509, 151514, 151519, 151524, 151529, 151534, 151539, 151544, 151548,\n151552, 151557, 151561, 151566, 151571, 151575, 151579, 151583, 151587, 151591,\n151595, 151599, 151604, 151610, 151616, 151621, 151627, 151633, 151638, 151643,\n151649, 151655, 151661, 151667, 151673, 151679, 151685, 151690, 151695, 151701,\n151706, 151712, 151718, 151723, 151728, 151733, 151738, 151743, 151748, 151752,\n151757, 151763, 151769, 151774, 151780, 151786, 151791, 151796, 151802, 151808,\n151814, 151820, 151826, 151832, 151838, 151843, 151848, 151854, 151859, 151865,\n151871, 151876, 151881, 151886, 151891, 151896, 151901, 151906, 151912, 151919,\n151926, 151932, 151939, 151946, 151952, 151958, 151965, 151972, 151979, 151986,\n151993, 152000, 152007, 152013, 152019, 152026, 152032, 152039, 152046, 152052,\n152058, 152064, 152070, 152076, 152082, 152086, 152091, 152097, 152103, 152108,\n152114, 152120, 152125, 152130, 152136, 152142, 152148, 152154, 152160, 152166,\n152172, 152177, 152182, 152188, 152193, 152199, 152205, 152210, 152215, 152220,\n152225, 152230, 152235, 152238, 152242, 152247, 152252, 152256, 152261, 152266,\n152270, 152274, 152279, 152284, 152289, 152294, 152299, 152304, 152309, 152313,\n152317, 152322, 152326, 152331, 152336, 152340, 152344, 152348, 152352, 152356,\n152360, 152365, 152371, 152378, 152385, 152391, 152398, 152405, 152411, 152417,\n152424, 152431, 152438, 152445, 152452, 152459, 152466, 152472, 152478, 152485,\n152491, 152498, 152505, 152511, 152517, 152523, 152529, 152535, 152541, 152545,\n152550, 152556, 152562, 152567, 152573, 152579, 152584, 152589, 152595, 152601,\n152607, 152613, 152619, 152625, 152631, 152636, 152641, 152647, 152652, 152658,\n152664, 152669, 152674, 152679, 152684, 152689, 152694, 152697, 152701, 152706,\n152711, 152715, 152720, 152725, 152729, 152733, 152738, 152743, 152748, 152753,\n152758, 152763, 152768, 152772, 152776, 152781, 152785, 152790, 152795, 152799,\n152803, 152807, 152811, 152815, 152819, 152823, 152828, 152834, 152840, 152845,\n152851, 152857, 152862, 152867, 152873, 152879, 152885, 152891, 152897, 152903,\n152909, 152914, 152919, 152925, 152930, 152936, 152942, 152947, 152952, 152957,\n152962, 152967, 152972, 152977, 152983, 152990, 152997, 153003, 153010, 153017,\n153023, 153029, 153036, 153043, 153050, 153057, 153064, 153071, 153078, 153084,\n153090, 153097, 153103, 153110, 153117, 153123, 153129, 153135, 153141, 153147,\n153153, 153157, 153162, 153168, 153174, 153179, 153185, 153191, 153196, 153201,\n153207, 153213, 153219, 153225, 153231, 153237, 153243, 153248, 153253, 153259,\n153264, 153270, 153276, 153281, 153286, 153291, 153296, 153301, 153306, 153310,\n153315, 153321, 153327, 153332, 153338, 153344, 153349, 153354, 153360, 153366,\n153372, 153378, 153384, 153390, 153396, 153401, 153406, 153412, 153417, 153423,\n153429, 153434, 153439, 153444, 153449, 153454, 153459, 153462, 153466, 153471,\n153476, 153480, 153485, 153490, 153494, 153498, 153503, 153508, 153513, 153518,\n153523, 153528, 153533, 153537, 153541, 153546, 153550, 153555, 153560, 153564,\n153568, 153572, 153576, 153580, 153584, 153589, 153595, 153602, 153609, 153615,\n153622, 153629, 153635, 153641, 153648, 153655, 153662, 153669, 153676, 153683,\n153690, 153696, 153702, 153709, 153715, 153722, 153729, 153735, 153741, 153747,\n153753, 153759, 153765, 153769, 153774, 153780, 153786, 153791, 153797, 153803,\n153808, 153813, 153819, 153825, 153831, 153837, 153843, 153849, 153855, 153860,\n153865, 153871, 153876, 153882, 153888, 153893, 153898, 153903, 153908, 153913,\n153918, 153922, 153927, 153933, 153939, 153944, 153950, 153956, 153961, 153966,\n153972, 153978, 153984, 153990, 153996, 154002, 154008, 154013, 154018, 154024,\n154029, 154035, 154041, 154046, 154051, 154056, 154061, 154066, 154071, 154075,\n154080, 154086, 154092, 154097, 154103, 154109, 154114, 154119, 154125, 154131,\n154137, 154143, 154149, 154155, 154161, 154166, 154171, 154177, 154182, 154188,\n154194, 154199, 154204, 154209, 154214, 154219, 154224, 154228, 154233, 154239,\n154245, 154250, 154256, 154262, 154267, 154272, 154278, 154284, 154290, 154296,\n154302, 154308, 154314, 154319, 154324, 154330, 154335, 154341, 154347, 154352,\n154357, 154362, 154367, 154372, 154377, 154381, 154386, 154392, 154398, 154403,\n154409, 154415, 154420, 154425, 154431, 154437, 154443, 154449, 154455, 154461,\n154467, 154472, 154477, 154483, 154488, 154494, 154500, 154505, 154510, 154515,\n154520, 154525, 154530, 154533, 154537, 154542, 154547, 154551, 154556, 154561,\n154565, 154569, 154574, 154579, 154584, 154589, 154594, 154599, 154604, 154608,\n154612, 154617, 154621, 154626, 154631, 154635, 154639, 154643, 154647, 154651,\n154655, 154658, 154662, 154667, 154672, 154676, 154681, 154686, 154690, 154694,\n154699, 154704, 154709, 154714, 154719, 154724, 154729, 154733, 154737, 154742,\n154746, 154751, 154756, 154760, 154764, 154768, 154772, 154776, 154780, 154784,\n154789, 154795, 154801, 154806, 154812, 154818, 154823, 154828, 154834, 154840,\n154846, 154852, 154858, 154864, 154870, 154875, 154880, 154886, 154891, 154897,\n154903, 154908, 154913, 154918, 154923, 154928, 154933, 154937, 154942, 154948,\n154954, 154959, 154965, 154971, 154976, 154981, 154987, 154993, 154999, 155005,\n155011, 155017, 155023, 155028, 155033, 155039, 155044, 155050, 155056, 155061,\n155066, 155071, 155076, 155081, 155086, 155091, 155097, 155104, 155111, 155117,\n155124, 155131, 155137, 155143, 155150, 155157, 155164, 155171, 155178, 155185,\n155192, 155198, 155204, 155211, 155217, 155224, 155231, 155237, 155243, 155249,\n155255, 155261, 155267, 155271, 155276, 155282, 155288, 155293, 155299, 155305,\n155310, 155315, 155321, 155327, 155333, 155339, 155345, 155351, 155357, 155362,\n155367, 155373, 155378, 155384, 155390, 155395, 155400, 155405, 155410, 155415,\n155420, 155423, 155427, 155432, 155437, 155441, 155446, 155451, 155455, 155459,\n155464, 155469, 155474, 155479, 155484, 155489, 155494, 155498, 155502, 155507,\n155511, 155516, 155521, 155525, 155529, 155533, 155537, 155541, 155545, 155550,\n155556, 155563, 155570, 155576, 155583, 155590, 155596, 155602, 155609, 155616,\n155623, 155630, 155637, 155644, 155651, 155657, 155663, 155670, 155676, 155683,\n155690, 155696, 155702, 155708, 155714, 155720, 155726, 155730, 155735, 155741,\n155747, 155752, 155758, 155764, 155769, 155774, 155780, 155786, 155792, 155798,\n155804, 155810, 155816, 155821, 155826, 155832, 155837, 155843, 155849, 155854,\n155859, 155864, 155869, 155874, 155879, 155882, 155886, 155891, 155896, 155900,\n155905, 155910, 155914, 155918, 155923, 155928, 155933, 155938, 155943, 155948,\n155953, 155957, 155961, 155966, 155970, 155975, 155980, 155984, 155988, 155992,\n155996, 156000, 156004, 156008, 156013, 156019, 156025, 156030, 156036, 156042,\n156047, 156052, 156058, 156064, 156070, 156076, 156082, 156088, 156094, 156099,\n156104, 156110, 156115, 156121, 156127, 156132, 156137, 156142, 156147, 156152,\n156157, 156162, 156168, 156175, 156182, 156188, 156195, 156202, 156208, 156214,\n156221, 156228, 156235, 156242, 156249, 156256, 156263, 156269, 156275, 156282,\n156288, 156295, 156302, 156308, 156314, 156320, 156326, 156332, 156338, 156342,\n156347, 156353, 156359, 156364, 156370, 156376, 156381, 156386, 156392, 156398,\n156404, 156410, 156416, 156422, 156428, 156433, 156438, 156444, 156449, 156455,\n156461, 156466, 156471, 156476, 156481, 156486, 156491, 156495, 156500, 156506,\n156512, 156517, 156523, 156529, 156534, 156539, 156545, 156551, 156557, 156563,\n156569, 156575, 156581, 156586, 156591, 156597, 156602, 156608, 156614, 156619,\n156624, 156629, 156634, 156639, 156644, 156647, 156651, 156656, 156661, 156665,\n156670, 156675, 156679, 156683, 156688, 156693, 156698, 156703, 156708, 156713,\n156718, 156722, 156726, 156731, 156735, 156740, 156745, 156749, 156753, 156757,\n156761, 156765, 156769, 156774, 156780, 156787, 156794, 156800, 156807, 156814,\n156820, 156826, 156833, 156840, 156847, 156854, 156861, 156868, 156875, 156881,\n156887, 156894, 156900, 156907, 156914, 156920, 156926, 156932, 156938, 156944,\n156950, 156954, 156959, 156965, 156971, 156976, 156982, 156988, 156993, 156998,\n157004, 157010, 157016, 157022, 157028, 157034, 157040, 157045, 157050, 157056,\n157061, 157067, 157073, 157078, 157083, 157088, 157093, 157098, 157103, 157107,\n157112, 157118, 157124, 157129, 157135, 157141, 157146, 157151, 157157, 157163,\n157169, 157175, 157181, 157187, 157193, 157198, 157203, 157209, 157214, 157220,\n157226, 157231, 157236, 157241, 157246, 157251, 157256, 157260, 157265, 157271,\n157277, 157282, 157288, 157294, 157299, 157304, 157310, 157316, 157322, 157328,\n157334, 157340, 157346, 157351, 157356, 157362, 157367, 157373, 157379, 157384,\n157389, 157394, 157399, 157404, 157409, 157413, 157418, 157424, 157430, 157435,\n157441, 157447, 157452, 157457, 157463, 157469, 157475, 157481, 157487, 157493,\n157499, 157504, 157509, 157515, 157520, 157526, 157532, 157537, 157542, 157547,\n157552, 157557, 157562, 157566, 157571, 157577, 157583, 157588, 157594, 157600,\n157605, 157610, 157616, 157622, 157628, 157634, 157640, 157646, 157652, 157657,\n157662, 157668, 157673, 157679, 157685, 157690, 157695, 157700, 157705, 157710,\n157715, 157718, 157722, 157727, 157732, 157736, 157741, 157746, 157750, 157754,\n157759, 157764, 157769, 157774, 157779, 157784, 157789, 157793, 157797, 157802,\n157806, 157811, 157816, 157820, 157824, 157828, 157832, 157836, 157840, 157844,\n157849, 157855, 157861, 157866, 157872, 157878, 157883, 157888, 157894, 157900,\n157906, 157912, 157918, 157924, 157930, 157935, 157940, 157946, 157951, 157957,\n157963, 157968, 157973, 157978, 157983, 157988, 157993, 157998, 158004, 158011,\n158018, 158024, 158031, 158038, 158044, 158050, 158057, 158064, 158071, 158078,\n158085, 158092, 158099, 158105, 158111, 158118, 158124, 158131, 158138, 158144,\n158150, 158156, 158162, 158168, 158174, 158179, 158185, 158192, 158199, 158205,\n158212, 158219, 158225, 158231, 158238, 158245, 158252, 158259, 158266, 158273,\n158280, 158286, 158292, 158299, 158305, 158312, 158319, 158325, 158331, 158337,\n158343, 158349, 158355, 158361, 158368, 158376, 158384, 158391, 158399, 158407,\n158414, 158421, 158429, 158437, 158445, 158453, 158461, 158469, 158477, 158484,\n158491, 158499, 158506, 158514, 158522, 158529, 158536, 158543, 158550, 158557,\n158564, 158569, 158575, 158582, 158589, 158595, 158602, 158609, 158615, 158621,\n158628, 158635, 158642, 158649, 158656, 158663, 158670, 158676, 158682, 158689,\n158695, 158702, 158709, 158715, 158721, 158727, 158733, 158739, 158745, 158749,\n158754, 158760, 158766, 158771, 158777, 158783, 158788, 158793, 158799, 158805,\n158811, 158817, 158823, 158829, 158835, 158840, 158845, 158851, 158856, 158862,\n158868, 158873, 158878, 158883, 158888, 158893, 158898, 158904, 158911, 158919,\n158927, 158934, 158942, 158950, 158957, 158964, 158972, 158980, 158988, 158996,\n159004, 159012, 159020, 159027, 159034, 159042, 159049, 159057, 159065, 159072,\n159079, 159086, 159093, 159100, 159107, 159112, 159118, 159125, 159132, 159138,\n159145, 159152, 159158, 159164, 159171, 159178, 159185, 159192, 159199, 159206,\n159213, 159219, 159225, 159232, 159238, 159245, 159252, 159258, 159264, 159270,\n159276, 159282, 159288, 159292, 159297, 159303, 159309, 159314, 159320, 159326,\n159331, 159336, 159342, 159348, 159354, 159360, 159366, 159372, 159378, 159383,\n159388, 159394, 159399, 159405, 159411, 159416, 159421, 159426, 159431, 159436,\n159441, 159446, 159452, 159459, 159466, 159472, 159479, 159486, 159492, 159498,\n159505, 159512, 159519, 159526, 159533, 159540, 159547, 159553, 159559, 159566,\n159572, 159579, 159586, 159592, 159598, 159604, 159610, 159616, 159622, 159628,\n159635, 159643, 159651, 159658, 159666, 159674, 159681, 159688, 159696, 159704,\n159712, 159720, 159728, 159736, 159744, 159751, 159758, 159766, 159773, 159781,\n159789, 159796, 159803, 159810, 159817, 159824, 159831, 159836, 159842, 159849,\n159856, 159862, 159869, 159876, 159882, 159888, 159895, 159902, 159909, 159916,\n159923, 159930, 159937, 159943, 159949, 159956, 159962, 159969, 159976, 159982,\n159988, 159994, 160000, 160006, 160012, 160017, 160023, 160030, 160037, 160043,\n160050, 160057, 160063, 160069, 160076, 160083, 160090, 160097, 160104, 160111,\n160118, 160124, 160130, 160137, 160143, 160150, 160157, 160163, 160169, 160175,\n160181, 160187, 160193, 160197, 160202, 160208, 160214, 160219, 160225, 160231,\n160236, 160241, 160247, 160253, 160259, 160265, 160271, 160277, 160283, 160288,\n160293, 160299, 160304, 160310, 160316, 160321, 160326, 160331, 160336, 160341,\n160346, 160352, 160359, 160367, 160375, 160382, 160390, 160398, 160405, 160412,\n160420, 160428, 160436, 160444, 160452, 160460, 160468, 160475, 160482, 160490,\n160497, 160505, 160513, 160520, 160527, 160534, 160541, 160548, 160555, 160560,\n160566, 160573, 160580, 160586, 160593, 160600, 160606, 160612, 160619, 160626,\n160633, 160640, 160647, 160654, 160661, 160667, 160673, 160680, 160686, 160693,\n160700, 160706, 160712, 160718, 160724, 160730, 160736, 160741, 160747, 160754,\n160761, 160767, 160774, 160781, 160787, 160793, 160800, 160807, 160814, 160821,\n160828, 160835, 160842, 160848, 160854, 160861, 160867, 160874, 160881, 160887,\n160893, 160899, 160905, 160911, 160917, 160922, 160928, 160935, 160942, 160948,\n160955, 160962, 160968, 160974, 160981, 160988, 160995, 161002, 161009, 161016,\n161023, 161029, 161035, 161042, 161048, 161055, 161062, 161068, 161074, 161080,\n161086, 161092, 161098, 161103, 161109, 161116, 161123, 161129, 161136, 161143,\n161149, 161155, 161162, 161169, 161176, 161183, 161190, 161197, 161204, 161210,\n161216, 161223, 161229, 161236, 161243, 161249, 161255, 161261, 161267, 161273,\n161279, 161284, 161290, 161297, 161304, 161310, 161317, 161324, 161330, 161336,\n161343, 161350, 161357, 161364, 161371, 161378, 161385, 161391, 161397, 161404,\n161410, 161417, 161424, 161430, 161436, 161442, 161448, 161454, 161460, 161464,\n161469, 161475, 161481, 161486, 161492, 161498, 161503, 161508, 161514, 161520,\n161526, 161532, 161538, 161544, 161550, 161555, 161560, 161566, 161571, 161577,\n161583, 161588, 161593, 161598, 161603, 161608, 161613, 161616, 161620, 161625,\n161630, 161634, 161639, 161644, 161648, 161652, 161657, 161662, 161667, 161672,\n161677, 161682, 161687, 161691, 161695, 161700, 161704, 161709, 161714, 161718,\n161722, 161726, 161730, 161734, 161738, 161742, 161747, 161753, 161759, 161764,\n161770, 161776, 161781, 161786, 161792, 161798, 161804, 161810, 161816, 161822,\n161828, 161833, 161838, 161844, 161849, 161855, 161861, 161866, 161871, 161876,\n161881, 161886, 161891, 161895, 161900, 161906, 161912, 161917, 161923, 161929,\n161934, 161939, 161945, 161951, 161957, 161963, 161969, 161975, 161981, 161986,\n161991, 161997, 162002, 162008, 162014, 162019, 162024, 162029, 162034, 162039,\n162044, 162049, 162055, 162062, 162069, 162075, 162082, 162089, 162095, 162101,\n162108, 162115, 162122, 162129, 162136, 162143, 162150, 162156, 162162, 162169,\n162175, 162182, 162189, 162195, 162201, 162207, 162213, 162219, 162225, 162229,\n162234, 162240, 162246, 162251, 162257, 162263, 162268, 162273, 162279, 162285,\n162291, 162297, 162303, 162309, 162315, 162320, 162325, 162331, 162336, 162342,\n162348, 162353, 162358, 162363, 162368, 162373, 162378, 162381, 162385, 162390,\n162395, 162399, 162404, 162409, 162413, 162417, 162422, 162427, 162432, 162437,\n162442, 162447, 162452, 162456, 162460, 162465, 162469, 162474, 162479, 162483,\n162487, 162491, 162495, 162499, 162503, 162508, 162514, 162521, 162528, 162534,\n162541, 162548, 162554, 162560, 162567, 162574, 162581, 162588, 162595, 162602,\n162609, 162615, 162621, 162628, 162634, 162641, 162648, 162654, 162660, 162666,\n162672, 162678, 162684, 162688, 162693, 162699, 162705, 162710, 162716, 162722,\n162727, 162732, 162738, 162744, 162750, 162756, 162762, 162768, 162774, 162779,\n162784, 162790, 162795, 162801, 162807, 162812, 162817, 162822, 162827, 162832,\n162837, 162840, 162844, 162849, 162854, 162858, 162863, 162868, 162872, 162876,\n162881, 162886, 162891, 162896, 162901, 162906, 162911, 162915, 162919, 162924,\n162928, 162933, 162938, 162942, 162946, 162950, 162954, 162958, 162962, 162966,\n162971, 162977, 162983, 162988, 162994, 163000, 163005, 163010, 163016, 163022,\n163028, 163034, 163040, 163046, 163052, 163057, 163062, 163068, 163073, 163079,\n163085, 163090, 163095, 163100, 163105, 163110, 163115, 163120, 163126, 163133,\n163140, 163146, 163153, 163160, 163166, 163172, 163179, 163186, 163193, 163200,\n163207, 163214, 163221, 163227, 163233, 163240, 163246, 163253, 163260, 163266,\n163272, 163278, 163284, 163290, 163296, 163300, 163305, 163311, 163317, 163322,\n163328, 163334, 163339, 163344, 163350, 163356, 163362, 163368, 163374, 163380,\n163386, 163391, 163396, 163402, 163407, 163413, 163419, 163424, 163429, 163434,\n163439, 163444, 163449, 163453, 163458, 163464, 163470, 163475, 163481, 163487,\n163492, 163497, 163503, 163509, 163515, 163521, 163527, 163533, 163539, 163544,\n163549, 163555, 163560, 163566, 163572, 163577, 163582, 163587, 163592, 163597,\n163602, 163605, 163609, 163614, 163619, 163623, 163628, 163633, 163637, 163641,\n163646, 163651, 163656, 163661, 163666, 163671, 163676, 163680, 163684, 163689,\n163693, 163698, 163703, 163707, 163711, 163715, 163719, 163723, 163727, 163732,\n163738, 163745, 163752, 163758, 163765, 163772, 163778, 163784, 163791, 163798,\n163805, 163812, 163819, 163826, 163833, 163839, 163845, 163852, 163858, 163865,\n163872, 163878, 163884, 163890, 163896, 163902, 163908, 163912, 163917, 163923,\n163929, 163934, 163940, 163946, 163951, 163956, 163962, 163968, 163974, 163980,\n163986, 163992, 163998, 164003, 164008, 164014, 164019, 164025, 164031, 164036,\n164041, 164046, 164051, 164056, 164061, 164065, 164070, 164076, 164082, 164087,\n164093, 164099, 164104, 164109, 164115, 164121, 164127, 164133, 164139, 164145,\n164151, 164156, 164161, 164167, 164172, 164178, 164184, 164189, 164194, 164199,\n164204, 164209, 164214, 164218, 164223, 164229, 164235, 164240, 164246, 164252,\n164257, 164262, 164268, 164274, 164280, 164286, 164292, 164298, 164304, 164309,\n164314, 164320, 164325, 164331, 164337, 164342, 164347, 164352, 164357, 164362,\n164367, 164371, 164376, 164382, 164388, 164393, 164399, 164405, 164410, 164415,\n164421, 164427, 164433, 164439, 164445, 164451, 164457, 164462, 164467, 164473,\n164478, 164484, 164490, 164495, 164500, 164505, 164510, 164515, 164520, 164524,\n164529, 164535, 164541, 164546, 164552, 164558, 164563, 164568, 164574, 164580,\n164586, 164592, 164598, 164604, 164610, 164615, 164620, 164626, 164631, 164637,\n164643, 164648, 164653, 164658, 164663, 164668, 164673, 164676, 164680, 164685,\n164690, 164694, 164699, 164704, 164708, 164712, 164717, 164722, 164727, 164732,\n164737, 164742, 164747, 164751, 164755, 164760, 164764, 164769, 164774, 164778,\n164782, 164786, 164790, 164794, 164798, 164802, 164807, 164813, 164819, 164824,\n164830, 164836, 164841, 164846, 164852, 164858, 164864, 164870, 164876, 164882,\n164888, 164893, 164898, 164904, 164909, 164915, 164921, 164926, 164931, 164936,\n164941, 164946, 164951, 164956, 164962, 164969, 164976, 164982, 164989, 164996,\n165002, 165008, 165015, 165022, 165029, 165036, 165043, 165050, 165057, 165063,\n165069, 165076, 165082, 165089, 165096, 165102, 165108, 165114, 165120, 165126,\n165132, 165137, 165143, 165150, 165157, 165163, 165170, 165177, 165183, 165189,\n165196, 165203, 165210, 165217, 165224, 165231, 165238, 165244, 165250, 165257,\n165263, 165270, 165277, 165283, 165289, 165295, 165301, 165307, 165313, 165319,\n165326, 165334, 165342, 165349, 165357, 165365, 165372, 165379, 165387, 165395,\n165403, 165411, 165419, 165427, 165435, 165442, 165449, 165457, 165464, 165472,\n165480, 165487, 165494, 165501, 165508, 165515, 165522, 165527, 165533, 165540,\n165547, 165553, 165560, 165567, 165573, 165579, 165586, 165593, 165600, 165607,\n165614, 165621, 165628, 165634, 165640, 165647, 165653, 165660, 165667, 165673,\n165679, 165685, 165691, 165697, 165703, 165707, 165712, 165718, 165724, 165729,\n165735, 165741, 165746, 165751, 165757, 165763, 165769, 165775, 165781, 165787,\n165793, 165798, 165803, 165809, 165814, 165820, 165826, 165831, 165836, 165841,\n165846, 165851, 165856, 165862, 165869, 165877, 165885, 165892, 165900, 165908,\n165915, 165922, 165930, 165938, 165946, 165954, 165962, 165970, 165978, 165985,\n165992, 166000, 166007, 166015, 166023, 166030, 166037, 166044, 166051, 166058,\n166065, 166070, 166076, 166083, 166090, 166096, 166103, 166110, 166116, 166122,\n166129, 166136, 166143, 166150, 166157, 166164, 166171, 166177, 166183, 166190,\n166196, 166203, 166210, 166216, 166222, 166228, 166234, 166240, 166246, 166250,\n166255, 166261, 166267, 166272, 166278, 166284, 166289, 166294, 166300, 166306,\n166312, 166318, 166324, 166330, 166336, 166341, 166346, 166352, 166357, 166363,\n166369, 166374, 166379, 166384, 166389, 166394, 166399, 166404, 166410, 166417,\n166424, 166430, 166437, 166444, 166450, 166456, 166463, 166470, 166477, 166484,\n166491, 166498, 166505, 166511, 166517, 166524, 166530, 166537, 166544, 166550,\n166556, 166562, 166568, 166574, 166580, 166586, 166593, 166601, 166609, 166616,\n166624, 166632, 166639, 166646, 166654, 166662, 166670, 166678, 166686, 166694,\n166702, 166709, 166716, 166724, 166731, 166739, 166747, 166754, 166761, 166768,\n166775, 166782, 166789, 166794, 166800, 166807, 166814, 166820, 166827, 166834,\n166840, 166846, 166853, 166860, 166867, 166874, 166881, 166888, 166895, 166901,\n166907, 166914, 166920, 166927, 166934, 166940, 166946, 166952, 166958, 166964,\n166970, 166975, 166981, 166988, 166995, 167001, 167008, 167015, 167021, 167027,\n167034, 167041, 167048, 167055, 167062, 167069, 167076, 167082, 167088, 167095,\n167101, 167108, 167115, 167121, 167127, 167133, 167139, 167145, 167151, 167155,\n167160, 167166, 167172, 167177, 167183, 167189, 167194, 167199, 167205, 167211,\n167217, 167223, 167229, 167235, 167241, 167246, 167251, 167257, 167262, 167268,\n167274, 167279, 167284, 167289, 167294, 167299, 167304, 167310, 167317, 167325,\n167333, 167340, 167348, 167356, 167363, 167370, 167378, 167386, 167394, 167402,\n167410, 167418, 167426, 167433, 167440, 167448, 167455, 167463, 167471, 167478,\n167485, 167492, 167499, 167506, 167513, 167518, 167524, 167531, 167538, 167544,\n167551, 167558, 167564, 167570, 167577, 167584, 167591, 167598, 167605, 167612,\n167619, 167625, 167631, 167638, 167644, 167651, 167658, 167664, 167670, 167676,\n167682, 167688, 167694, 167699, 167705, 167712, 167719, 167725, 167732, 167739,\n167745, 167751, 167758, 167765, 167772, 167779, 167786, 167793, 167800, 167806,\n167812, 167819, 167825, 167832, 167839, 167845, 167851, 167857, 167863, 167869,\n167875, 167880, 167886, 167893, 167900, 167906, 167913, 167920, 167926, 167932,\n167939, 167946, 167953, 167960, 167967, 167974, 167981, 167987, 167993, 168000,\n168006, 168013, 168020, 168026, 168032, 168038, 168044, 168050, 168056, 168061,\n168067, 168074, 168081, 168087, 168094, 168101, 168107, 168113, 168120, 168127,\n168134, 168141, 168148, 168155, 168162, 168168, 168174, 168181, 168187, 168194,\n168201, 168207, 168213, 168219, 168225, 168231, 168237, 168242, 168248, 168255,\n168262, 168268, 168275, 168282, 168288, 168294, 168301, 168308, 168315, 168322,\n168329, 168336, 168343, 168349, 168355, 168362, 168368, 168375, 168382, 168388,\n168394, 168400, 168406, 168412, 168418, 168422, 168427, 168433, 168439, 168444,\n168450, 168456, 168461, 168466, 168472, 168478, 168484, 168490, 168496, 168502,\n168508, 168513, 168518, 168524, 168529, 168535, 168541, 168546, 168551, 168556,\n168561, 168566, 168571, 168573, 168576, 168580, 168584, 168587, 168591, 168595,\n168598, 168601, 168605, 168609, 168613, 168617, 168621, 168625, 168629, 168632,\n168635, 168639, 168642, 168646, 168650, 168653, 168656, 168659, 168662, 168665,\n168668, 168671, 168675, 168680, 168685, 168689, 168694, 168699, 168703, 168707,\n168712, 168717, 168722, 168727, 168732, 168737, 168742, 168746, 168750, 168755,\n168759, 168764, 168769, 168773, 168777, 168781, 168785, 168789, 168793, 168796,\n168800, 168805, 168810, 168814, 168819, 168824, 168828, 168832, 168837, 168842,\n168847, 168852, 168857, 168862, 168867, 168871, 168875, 168880, 168884, 168889,\n168894, 168898, 168902, 168906, 168910, 168914, 168918, 168922, 168927, 168933,\n168939, 168944, 168950, 168956, 168961, 168966, 168972, 168978, 168984, 168990,\n168996, 169002, 169008, 169013, 169018, 169024, 169029, 169035, 169041, 169046,\n169051, 169056, 169061, 169066, 169071, 169074, 169078, 169083, 169088, 169092,\n169097, 169102, 169106, 169110, 169115, 169120, 169125, 169130, 169135, 169140,\n169145, 169149, 169153, 169158, 169162, 169167, 169172, 169176, 169180, 169184,\n169188, 169192, 169196, 169198, 169201, 169205, 169209, 169212, 169216, 169220,\n169223, 169226, 169230, 169234, 169238, 169242, 169246, 169250, 169254, 169257,\n169260, 169264, 169267, 169271, 169275, 169278, 169281, 169284, 169287, 169290,\n169293, 169297, 169302, 169308, 169314, 169319, 169325, 169331, 169336, 169341,\n169347, 169353, 169359, 169365, 169371, 169377, 169383, 169388, 169393, 169399,\n169404, 169410, 169416, 169421, 169426, 169431, 169436, 169441, 169446, 169449,\n169453, 169458, 169463, 169467, 169472, 169477, 169481, 169485, 169490, 169495,\n169500, 169505, 169510, 169515, 169520, 169524, 169528, 169533, 169537, 169542,\n169547, 169551, 169555, 169559, 169563, 169567, 169571, 169573, 169576, 169580,\n169584, 169587, 169591, 169595, 169598, 169601, 169605, 169609, 169613, 169617,\n169621, 169625, 169629, 169632, 169635, 169639, 169642, 169646, 169650, 169653,\n169656, 169659, 169662, 169665, 169668, 169671, 169675, 169680, 169685, 169689,\n169694, 169699, 169703, 169707, 169712, 169717, 169722, 169727, 169732, 169737,\n169742, 169746, 169750, 169755, 169759, 169764, 169769, 169773, 169777, 169781,\n169785, 169789, 169793, 169797, 169802, 169808, 169814, 169819, 169825, 169831,\n169836, 169841, 169847, 169853, 169859, 169865, 169871, 169877, 169883, 169888,\n169893, 169899, 169904, 169910, 169916, 169921, 169926, 169931, 169936, 169941,\n169946, 169949, 169953, 169958, 169963, 169967, 169972, 169977, 169981, 169985,\n169990, 169995, 170000, 170005, 170010, 170015, 170020, 170024, 170028, 170033,\n170037, 170042, 170047, 170051, 170055, 170059, 170063, 170067, 170071, 170074,\n170078, 170083, 170088, 170092, 170097, 170102, 170106, 170110, 170115, 170120,\n170125, 170130, 170135, 170140, 170145, 170149, 170153, 170158, 170162, 170167,\n170172, 170176, 170180, 170184, 170188, 170192, 170196, 170198, 170201, 170205,\n170209, 170212, 170216, 170220, 170223, 170226, 170230, 170234, 170238, 170242,\n170246, 170250, 170254, 170257, 170260, 170264, 170267, 170271, 170275, 170278,\n170281, 170284, 170287, 170290, 170293, 170297, 170302, 170308, 170314, 170319,\n170325, 170331, 170336, 170341, 170347, 170353, 170359, 170365, 170371, 170377,\n170383, 170388, 170393, 170399, 170404, 170410, 170416, 170421, 170426, 170431,\n170436, 170441, 170446, 170449, 170453, 170458, 170463, 170467, 170472, 170477,\n170481, 170485, 170490, 170495, 170500, 170505, 170510, 170515, 170520, 170524,\n170528, 170533, 170537, 170542, 170547, 170551, 170555, 170559, 170563, 170567,\n170571, 170574, 170578, 170583, 170588, 170592, 170597, 170602, 170606, 170610,\n170615, 170620, 170625, 170630, 170635, 170640, 170645, 170649, 170653, 170658,\n170662, 170667, 170672, 170676, 170680, 170684, 170688, 170692, 170696, 170699,\n170703, 170708, 170713, 170717, 170722, 170727, 170731, 170735, 170740, 170745,\n170750, 170755, 170760, 170765, 170770, 170774, 170778, 170783, 170787, 170792,\n170797, 170801, 170805, 170809, 170813, 170817, 170821, 170824, 170828, 170833,\n170838, 170842, 170847, 170852, 170856, 170860, 170865, 170870, 170875, 170880,\n170885, 170890, 170895, 170899, 170903, 170908, 170912, 170917, 170922, 170926,\n170930, 170934, 170938, 170942, 170946, 170949, 170953, 170958, 170963, 170967,\n170972, 170977, 170981, 170985, 170990, 170995, 171000, 171005, 171010, 171015,\n171020, 171024, 171028, 171033, 171037, 171042, 171047, 171051, 171055, 171059,\n171063, 171067, 171071, 171073, 171076, 171080, 171084, 171087, 171091, 171095,\n171098, 171101, 171105, 171109, 171113, 171117, 171121, 171125, 171129, 171132,\n171135, 171139, 171142, 171146, 171150, 171153, 171156, 171159, 171162, 171165,\n171168, 171171, 171175, 171180, 171185, 171189, 171194, 171199, 171203, 171207,\n171212, 171217, 171222, 171227, 171232, 171237, 171242, 171246, 171250, 171255,\n171259, 171264, 171269, 171273, 171277, 171281, 171285, 171289, 171293, 171297,\n171302, 171308, 171314, 171319, 171325, 171331, 171336, 171341, 171347, 171353,\n171359, 171365, 171371, 171377, 171383, 171388, 171393, 171399, 171404, 171410,\n171416, 171421, 171426, 171431, 171436, 171441, 171446, 171450, 171455, 171461,\n171467, 171472, 171478, 171484, 171489, 171494, 171500, 171506, 171512, 171518,\n171524, 171530, 171536, 171541, 171546, 171552, 171557, 171563, 171569, 171574,\n171579, 171584, 171589, 171594, 171599, 171604, 171610, 171617, 171624, 171630,\n171637, 171644, 171650, 171656, 171663, 171670, 171677, 171684, 171691, 171698,\n171705, 171711, 171717, 171724, 171730, 171737, 171744, 171750, 171756, 171762,\n171768, 171774, 171780, 171784, 171789, 171795, 171801, 171806, 171812, 171818,\n171823, 171828, 171834, 171840, 171846, 171852, 171858, 171864, 171870, 171875,\n171880, 171886, 171891, 171897, 171903, 171908, 171913, 171918, 171923, 171928,\n171933, 171936, 171940, 171945, 171950, 171954, 171959, 171964, 171968, 171972,\n171977, 171982, 171987, 171992, 171997, 172002, 172007, 172011, 172015, 172020,\n172024, 172029, 172034, 172038, 172042, 172046, 172050, 172054, 172058, 172063,\n172069, 172076, 172083, 172089, 172096, 172103, 172109, 172115, 172122, 172129,\n172136, 172143, 172150, 172157, 172164, 172170, 172176, 172183, 172189, 172196,\n172203, 172209, 172215, 172221, 172227, 172233, 172239, 172243, 172248, 172254,\n172260, 172265, 172271, 172277, 172282, 172287, 172293, 172299, 172305, 172311,\n172317, 172323, 172329, 172334, 172339, 172345, 172350, 172356, 172362, 172367,\n172372, 172377, 172382, 172387, 172392, 172395, 172399, 172404, 172409, 172413,\n172418, 172423, 172427, 172431, 172436, 172441, 172446, 172451, 172456, 172461,\n172466, 172470, 172474, 172479, 172483, 172488, 172493, 172497, 172501, 172505,\n172509, 172513, 172517, 172521, 172526, 172532, 172538, 172543, 172549, 172555,\n172560, 172565, 172571, 172577, 172583, 172589, 172595, 172601, 172607, 172612,\n172617, 172623, 172628, 172634, 172640, 172645, 172650, 172655, 172660, 172665,\n172670, 172675, 172681, 172688, 172695, 172701, 172708, 172715, 172721, 172727,\n172734, 172741, 172748, 172755, 172762, 172769, 172776, 172782, 172788, 172795,\n172801, 172808, 172815, 172821, 172827, 172833, 172839, 172845, 172851, 172855,\n172860, 172866, 172872, 172877, 172883, 172889, 172894, 172899, 172905, 172911,\n172917, 172923, 172929, 172935, 172941, 172946, 172951, 172957, 172962, 172968,\n172974, 172979, 172984, 172989, 172994, 172999, 173004, 173008, 173013, 173019,\n173025, 173030, 173036, 173042, 173047, 173052, 173058, 173064, 173070, 173076,\n173082, 173088, 173094, 173099, 173104, 173110, 173115, 173121, 173127, 173132,\n173137, 173142, 173147, 173152, 173157, 173160, 173164, 173169, 173174, 173178,\n173183, 173188, 173192, 173196, 173201, 173206, 173211, 173216, 173221, 173226,\n173231, 173235, 173239, 173244, 173248, 173253, 173258, 173262, 173266, 173270,\n173274, 173278, 173282, 173287, 173293, 173300, 173307, 173313, 173320, 173327,\n173333, 173339, 173346, 173353, 173360, 173367, 173374, 173381, 173388, 173394,\n173400, 173407, 173413, 173420, 173427, 173433, 173439, 173445, 173451, 173457,\n173463, 173467, 173472, 173478, 173484, 173489, 173495, 173501, 173506, 173511,\n173517, 173523, 173529, 173535, 173541, 173547, 173553, 173558, 173563, 173569,\n173574, 173580, 173586, 173591, 173596, 173601, 173606, 173611, 173616, 173620,\n173625, 173631, 173637, 173642, 173648, 173654, 173659, 173664, 173670, 173676,\n173682, 173688, 173694, 173700, 173706, 173711, 173716, 173722, 173727, 173733,\n173739, 173744, 173749, 173754, 173759, 173764, 173769, 173773, 173778, 173784,\n173790, 173795, 173801, 173807, 173812, 173817, 173823, 173829, 173835, 173841,\n173847, 173853, 173859, 173864, 173869, 173875, 173880, 173886, 173892, 173897,\n173902, 173907, 173912, 173917, 173922, 173926, 173931, 173937, 173943, 173948,\n173954, 173960, 173965, 173970, 173976, 173982, 173988, 173994, 174000, 174006,\n174012, 174017, 174022, 174028, 174033, 174039, 174045, 174050, 174055, 174060,\n174065, 174070, 174075, 174079, 174084, 174090, 174096, 174101, 174107, 174113,\n174118, 174123, 174129, 174135, 174141, 174147, 174153, 174159, 174165, 174170,\n174175, 174181, 174186, 174192, 174198, 174203, 174208, 174213, 174218, 174223,\n174228, 174231, 174235, 174240, 174245, 174249, 174254, 174259, 174263, 174267,\n174272, 174277, 174282, 174287, 174292, 174297, 174302, 174306, 174310, 174315,\n174319, 174324, 174329, 174333, 174337, 174341, 174345, 174349, 174353, 174357,\n174362, 174368, 174374, 174379, 174385, 174391, 174396, 174401, 174407, 174413,\n174419, 174425, 174431, 174437, 174443, 174448, 174453, 174459, 174464, 174470,\n174476, 174481, 174486, 174491, 174496, 174501, 174506, 174511, 174517, 174524,\n174531, 174537, 174544, 174551, 174557, 174563, 174570, 174577, 174584, 174591,\n174598, 174605, 174612, 174618, 174624, 174631, 174637, 174644, 174651, 174657,\n174663, 174669, 174675, 174681, 174687, 174692, 174698, 174705, 174712, 174718,\n174725, 174732, 174738, 174744, 174751, 174758, 174765, 174772, 174779, 174786,\n174793, 174799, 174805, 174812, 174818, 174825, 174832, 174838, 174844, 174850,\n174856, 174862, 174868, 174874, 174881, 174889, 174897, 174904, 174912, 174920,\n174927, 174934, 174942, 174950, 174958, 174966, 174974, 174982, 174990, 174997,\n175004, 175012, 175019, 175027, 175035, 175042, 175049, 175056, 175063, 175070,\n175077, 175082, 175088, 175095, 175102, 175108, 175115, 175122, 175128, 175134,\n175141, 175148, 175155, 175162, 175169, 175176, 175183, 175189, 175195, 175202,\n175208, 175215, 175222, 175228, 175234, 175240, 175246, 175252, 175258, 175262,\n175267, 175273, 175279, 175284, 175290, 175296, 175301, 175306, 175312, 175318,\n175324, 175330, 175336, 175342, 175348, 175353, 175358, 175364, 175369, 175375,\n175381, 175386, 175391, 175396, 175401, 175406, 175411, 175417, 175424, 175432,\n175440, 175447, 175455, 175463, 175470, 175477, 175485, 175493, 175501, 175509,\n175517, 175525, 175533, 175540, 175547, 175555, 175562, 175570, 175578, 175585,\n175592, 175599, 175606, 175613, 175620, 175625, 175631, 175638, 175645, 175651,\n175658, 175665, 175671, 175677, 175684, 175691, 175698, 175705, 175712, 175719,\n175726, 175732, 175738, 175745, 175751, 175758, 175765, 175771, 175777, 175783,\n175789, 175795, 175801, 175805, 175810, 175816, 175822, 175827, 175833, 175839,\n175844, 175849, 175855, 175861, 175867, 175873, 175879, 175885, 175891, 175896,\n175901, 175907, 175912, 175918, 175924, 175929, 175934, 175939, 175944, 175949,\n175954, 175959, 175965, 175972, 175979, 175985, 175992, 175999, 176005, 176011,\n176018, 176025, 176032, 176039, 176046, 176053, 176060, 176066, 176072, 176079,\n176085, 176092, 176099, 176105, 176111, 176117, 176123, 176129, 176135, 176141,\n176148, 176156, 176164, 176171, 176179, 176187, 176194, 176201, 176209, 176217,\n176225, 176233, 176241, 176249, 176257, 176264, 176271, 176279, 176286, 176294,\n176302, 176309, 176316, 176323, 176330, 176337, 176344, 176349, 176355, 176362,\n176369, 176375, 176382, 176389, 176395, 176401, 176408, 176415, 176422, 176429,\n176436, 176443, 176450, 176456, 176462, 176469, 176475, 176482, 176489, 176495,\n176501, 176507, 176513, 176519, 176525, 176530, 176536, 176543, 176550, 176556,\n176563, 176570, 176576, 176582, 176589, 176596, 176603, 176610, 176617, 176624,\n176631, 176637, 176643, 176650, 176656, 176663, 176670, 176676, 176682, 176688,\n176694, 176700, 176706, 176710, 176715, 176721, 176727, 176732, 176738, 176744,\n176749, 176754, 176760, 176766, 176772, 176778, 176784, 176790, 176796, 176801,\n176806, 176812, 176817, 176823, 176829, 176834, 176839, 176844, 176849, 176854,\n176859, 176865, 176872, 176880, 176888, 176895, 176903, 176911, 176918, 176925,\n176933, 176941, 176949, 176957, 176965, 176973, 176981, 176988, 176995, 177003,\n177010, 177018, 177026, 177033, 177040, 177047, 177054, 177061, 177068, 177073,\n177079, 177086, 177093, 177099, 177106, 177113, 177119, 177125, 177132, 177139,\n177146, 177153, 177160, 177167, 177174, 177180, 177186, 177193, 177199, 177206,\n177213, 177219, 177225, 177231, 177237, 177243, 177249, 177254, 177260, 177267,\n177274, 177280, 177287, 177294, 177300, 177306, 177313, 177320, 177327, 177334,\n177341, 177348, 177355, 177361, 177367, 177374, 177380, 177387, 177394, 177400,\n177406, 177412, 177418, 177424, 177430, 177435, 177441, 177448, 177455, 177461,\n177468, 177475, 177481, 177487, 177494, 177501, 177508, 177515, 177522, 177529,\n177536, 177542, 177548, 177555, 177561, 177568, 177575, 177581, 177587, 177593,\n177599, 177605, 177611, 177616, 177622, 177629, 177636, 177642, 177649, 177656,\n177662, 177668, 177675, 177682, 177689, 177696, 177703, 177710, 177717, 177723,\n177729, 177736, 177742, 177749, 177756, 177762, 177768, 177774, 177780, 177786,\n177792, 177797, 177803, 177810, 177817, 177823, 177830, 177837, 177843, 177849,\n177856, 177863, 177870, 177877, 177884, 177891, 177898, 177904, 177910, 177917,\n177923, 177930, 177937, 177943, 177949, 177955, 177961, 177967, 177973, 177977,\n177982, 177988, 177994, 177999, 178005, 178011, 178016, 178021, 178027, 178033,\n178039, 178045, 178051, 178057, 178063, 178068, 178073, 178079, 178084, 178090,\n178096, 178101, 178106, 178111, 178116, 178121, 178126, 178129, 178133, 178138,\n178143, 178147, 178152, 178157, 178161, 178165, 178170, 178175, 178180, 178185,\n178190, 178195, 178200, 178204, 178208, 178213, 178217, 178222, 178227, 178231,\n178235, 178239, 178243, 178247, 178251, 178255, 178260, 178266, 178272, 178277,\n178283, 178289, 178294, 178299, 178305, 178311, 178317, 178323, 178329, 178335,\n178341, 178346, 178351, 178357, 178362, 178368, 178374, 178379, 178384, 178389,\n178394, 178399, 178404, 178408, 178413, 178419, 178425, 178430, 178436, 178442,\n178447, 178452, 178458, 178464, 178470, 178476, 178482, 178488, 178494, 178499,\n178504, 178510, 178515, 178521, 178527, 178532, 178537, 178542, 178547, 178552,\n178557, 178562, 178568, 178575, 178582, 178588, 178595, 178602, 178608, 178614,\n178621, 178628, 178635, 178642, 178649, 178656, 178663, 178669, 178675, 178682,\n178688, 178695, 178702, 178708, 178714, 178720, 178726, 178732, 178738, 178742,\n178747, 178753, 178759, 178764, 178770, 178776, 178781, 178786, 178792, 178798,\n178804, 178810, 178816, 178822, 178828, 178833, 178838, 178844, 178849, 178855,\n178861, 178866, 178871, 178876, 178881, 178886, 178891, 178894, 178898, 178903,\n178908, 178912, 178917, 178922, 178926, 178930, 178935, 178940, 178945, 178950,\n178955, 178960, 178965, 178969, 178973, 178978, 178982, 178987, 178992, 178996,\n179000, 179004, 179008, 179012, 179016, 179021, 179027, 179034, 179041, 179047,\n179054, 179061, 179067, 179073, 179080, 179087, 179094, 179101, 179108, 179115,\n179122, 179128, 179134, 179141, 179147, 179154, 179161, 179167, 179173, 179179,\n179185, 179191, 179197, 179201, 179206, 179212, 179218, 179223, 179229, 179235,\n179240, 179245, 179251, 179257, 179263, 179269, 179275, 179281, 179287, 179292,\n179297, 179303, 179308, 179314, 179320, 179325, 179330, 179335, 179340, 179345,\n179350, 179353, 179357, 179362, 179367, 179371, 179376, 179381, 179385, 179389,\n179394, 179399, 179404, 179409, 179414, 179419, 179424, 179428, 179432, 179437,\n179441, 179446, 179451, 179455, 179459, 179463, 179467, 179471, 179475, 179479,\n179484, 179490, 179496, 179501, 179507, 179513, 179518, 179523, 179529, 179535,\n179541, 179547, 179553, 179559, 179565, 179570, 179575, 179581, 179586, 179592,\n179598, 179603, 179608, 179613, 179618, 179623, 179628, 179633, 179639, 179646,\n179653, 179659, 179666, 179673, 179679, 179685, 179692, 179699, 179706, 179713,\n179720, 179727, 179734, 179740, 179746, 179753, 179759, 179766, 179773, 179779,\n179785, 179791, 179797, 179803, 179809, 179813, 179818, 179824, 179830, 179835,\n179841, 179847, 179852, 179857, 179863, 179869, 179875, 179881, 179887, 179893,\n179899, 179904, 179909, 179915, 179920, 179926, 179932, 179937, 179942, 179947,\n179952, 179957, 179962, 179966, 179971, 179977, 179983, 179988, 179994, 180000,\n180005, 180010, 180016, 180022, 180028, 180034, 180040, 180046, 180052, 180057,\n180062, 180068, 180073, 180079, 180085, 180090, 180095, 180100, 180105, 180110,\n180115, 180118, 180122, 180127, 180132, 180136, 180141, 180146, 180150, 180154,\n180159, 180164, 180169, 180174, 180179, 180184, 180189, 180193, 180197, 180202,\n180206, 180211, 180216, 180220, 180224, 180228, 180232, 180236, 180240, 180245,\n180251, 180258, 180265, 180271, 180278, 180285, 180291, 180297, 180304, 180311,\n180318, 180325, 180332, 180339, 180346, 180352, 180358, 180365, 180371, 180378,\n180385, 180391, 180397, 180403, 180409, 180415, 180421, 180425, 180430, 180436,\n180442, 180447, 180453, 180459, 180464, 180469, 180475, 180481, 180487, 180493,\n180499, 180505, 180511, 180516, 180521, 180527, 180532, 180538, 180544, 180549,\n180554, 180559, 180564, 180569, 180574, 180578, 180583, 180589, 180595, 180600,\n180606, 180612, 180617, 180622, 180628, 180634, 180640, 180646, 180652, 180658,\n180664, 180669, 180674, 180680, 180685, 180691, 180697, 180702, 180707, 180712,\n180717, 180722, 180727, 180731, 180736, 180742, 180748, 180753, 180759, 180765,\n180770, 180775, 180781, 180787, 180793, 180799, 180805, 180811, 180817, 180822,\n180827, 180833, 180838, 180844, 180850, 180855, 180860, 180865, 180870, 180875,\n180880, 180884, 180889, 180895, 180901, 180906, 180912, 180918, 180923, 180928,\n180934, 180940, 180946, 180952, 180958, 180964, 180970, 180975, 180980, 180986,\n180991, 180997, 181003, 181008, 181013, 181018, 181023, 181028, 181033, 181037,\n181042, 181048, 181054, 181059, 181065, 181071, 181076, 181081, 181087, 181093,\n181099, 181105, 181111, 181117, 181123, 181128, 181133, 181139, 181144, 181150,\n181156, 181161, 181166, 181171, 181176, 181181, 181186, 181189, 181193, 181198,\n181203, 181207, 181212, 181217, 181221, 181225, 181230, 181235, 181240, 181245,\n181250, 181255, 181260, 181264, 181268, 181273, 181277, 181282, 181287, 181291,\n181295, 181299, 181303, 181307, 181311, 181314, 181318, 181323, 181328, 181332,\n181337, 181342, 181346, 181350, 181355, 181360, 181365, 181370, 181375, 181380,\n181385, 181389, 181393, 181398, 181402, 181407, 181412, 181416, 181420, 181424,\n181428, 181432, 181436, 181440, 181445, 181451, 181457, 181462, 181468, 181474,\n181479, 181484, 181490, 181496, 181502, 181508, 181514, 181520, 181526, 181531,\n181536, 181542, 181547, 181553, 181559, 181564, 181569, 181574, 181579, 181584,\n181589, 181593, 181598, 181604, 181610, 181615, 181621, 181627, 181632, 181637,\n181643, 181649, 181655, 181661, 181667, 181673, 181679, 181684, 181689, 181695,\n181700, 181706, 181712, 181717, 181722, 181727, 181732, 181737, 181742, 181747,\n181753, 181760, 181767, 181773, 181780, 181787, 181793, 181799, 181806, 181813,\n181820, 181827, 181834, 181841, 181848, 181854, 181860, 181867, 181873, 181880,\n181887, 181893, 181899, 181905, 181911, 181917, 181923, 181927, 181932, 181938,\n181944, 181949, 181955, 181961, 181966, 181971, 181977, 181983, 181989, 181995,\n182001, 182007, 182013, 182018, 182023, 182029, 182034, 182040, 182046, 182051,\n182056, 182061, 182066, 182071, 182076, 182079, 182083, 182088, 182093, 182097,\n182102, 182107, 182111, 182115, 182120, 182125, 182130, 182135, 182140, 182145,\n182150, 182154, 182158, 182163, 182167, 182172, 182177, 182181, 182185, 182189,\n182193, 182197, 182201, 182206, 182212, 182219, 182226, 182232, 182239, 182246,\n182252, 182258, 182265, 182272, 182279, 182286, 182293, 182300, 182307, 182313,\n182319, 182326, 182332, 182339, 182346, 182352, 182358, 182364, 182370, 182376,\n182382, 182386, 182391, 182397, 182403, 182408, 182414, 182420, 182425, 182430,\n182436, 182442, 182448, 182454, 182460, 182466, 182472, 182477, 182482, 182488,\n182493, 182499, 182505, 182510, 182515, 182520, 182525, 182530, 182535, 182538,\n182542, 182547, 182552, 182556, 182561, 182566, 182570, 182574, 182579, 182584,\n182589, 182594, 182599, 182604, 182609, 182613, 182617, 182622, 182626, 182631,\n182636, 182640, 182644, 182648, 182652, 182656, 182660, 182664, 182669, 182675,\n182681, 182686, 182692, 182698, 182703, 182708, 182714, 182720, 182726, 182732,\n182738, 182744, 182750, 182755, 182760, 182766, 182771, 182777, 182783, 182788,\n182793, 182798, 182803, 182808, 182813, 182818, 182824, 182831, 182838, 182844,\n182851, 182858, 182864, 182870, 182877, 182884, 182891, 182898, 182905, 182912,\n182919, 182925, 182931, 182938, 182944, 182951, 182958, 182964, 182970, 182976,\n182982, 182988, 182994, 182998, 183003, 183009, 183015, 183020, 183026, 183032,\n183037, 183042, 183048, 183054, 183060, 183066, 183072, 183078, 183084, 183089,\n183094, 183100, 183105, 183111, 183117, 183122, 183127, 183132, 183137, 183142,\n183147, 183151, 183156, 183162, 183168, 183173, 183179, 183185, 183190, 183195,\n183201, 183207, 183213, 183219, 183225, 183231, 183237, 183242, 183247, 183253,\n183258, 183264, 183270, 183275, 183280, 183285, 183290, 183295, 183300, 183303,\n183307, 183312, 183317, 183321, 183326, 183331, 183335, 183339, 183344, 183349,\n183354, 183359, 183364, 183369, 183374, 183378, 183382, 183387, 183391, 183396,\n183401, 183405, 183409, 183413, 183417, 183421, 183425, 183430, 183436, 183443,\n183450, 183456, 183463, 183470, 183476, 183482, 183489, 183496, 183503, 183510,\n183517, 183524, 183531, 183537, 183543, 183550, 183556, 183563, 183570, 183576,\n183582, 183588, 183594, 183600, 183606, 183610, 183615, 183621, 183627, 183632,\n183638, 183644, 183649, 183654, 183660, 183666, 183672, 183678, 183684, 183690,\n183696, 183701, 183706, 183712, 183717, 183723, 183729, 183734, 183739, 183744,\n183749, 183754, 183759, 183763, 183768, 183774, 183780, 183785, 183791, 183797,\n183802, 183807, 183813, 183819, 183825, 183831, 183837, 183843, 183849, 183854,\n183859, 183865, 183870, 183876, 183882, 183887, 183892, 183897, 183902, 183907,\n183912, 183916, 183921, 183927, 183933, 183938, 183944, 183950, 183955, 183960,\n183966, 183972, 183978, 183984, 183990, 183996, 184002, 184007, 184012, 184018,\n184023, 184029, 184035, 184040, 184045, 184050, 184055, 184060, 184065, 184069,\n184074, 184080, 184086, 184091, 184097, 184103, 184108, 184113, 184119, 184125,\n184131, 184137, 184143, 184149, 184155, 184160, 184165, 184171, 184176, 184182,\n184188, 184193, 184198, 184203, 184208, 184213, 184218, 184222, 184227, 184233,\n184239, 184244, 184250, 184256, 184261, 184266, 184272, 184278, 184284, 184290,\n184296, 184302, 184308, 184313, 184318, 184324, 184329, 184335, 184341, 184346,\n184351, 184356, 184361, 184366, 184371, 184374, 184378, 184383, 184388, 184392,\n184397, 184402, 184406, 184410, 184415, 184420, 184425, 184430, 184435, 184440,\n184445, 184449, 184453, 184458, 184462, 184467, 184472, 184476, 184480, 184484,\n184488, 184492, 184496, 184499, 184503, 184508, 184513, 184517, 184522, 184527,\n184531, 184535, 184540, 184545, 184550, 184555, 184560, 184565, 184570, 184574,\n184578, 184583, 184587, 184592, 184597, 184601, 184605, 184609, 184613, 184617,\n184621, 184625, 184630, 184636, 184642, 184647, 184653, 184659, 184664, 184669,\n184675, 184681, 184687, 184693, 184699, 184705, 184711, 184716, 184721, 184727,\n184732, 184738, 184744, 184749, 184754, 184759, 184764, 184769, 184774, 184778,\n184783, 184789, 184795, 184800, 184806, 184812, 184817, 184822, 184828, 184834,\n184840, 184846, 184852, 184858, 184864, 184869, 184874, 184880, 184885, 184891,\n184897, 184902, 184907, 184912, 184917, 184922, 184927, 184932, 184938, 184945,\n184952, 184958, 184965, 184972, 184978, 184984, 184991, 184998, 185005, 185012,\n185019, 185026, 185033, 185039, 185045, 185052, 185058, 185065, 185072, 185078,\n185084, 185090, 185096, 185102, 185108, 185112, 185117, 185123, 185129, 185134,\n185140, 185146, 185151, 185156, 185162, 185168, 185174, 185180, 185186, 185192,\n185198, 185203, 185208, 185214, 185219, 185225, 185231, 185236, 185241, 185246,\n185251, 185256, 185261, 185264, 185268, 185273, 185278, 185282, 185287, 185292,\n185296, 185300, 185305, 185310, 185315, 185320, 185325, 185330, 185335, 185339,\n185343, 185348, 185352, 185357, 185362, 185366, 185370, 185374, 185378, 185382,\n185386, 185391, 185397, 185404, 185411, 185417, 185424, 185431, 185437, 185443,\n185450, 185457, 185464, 185471, 185478, 185485, 185492, 185498, 185504, 185511,\n185517, 185524, 185531, 185537, 185543, 185549, 185555, 185561, 185567, 185571,\n185576, 185582, 185588, 185593, 185599, 185605, 185610, 185615, 185621, 185627,\n185633, 185639, 185645, 185651, 185657, 185662, 185667, 185673, 185678, 185684,\n185690, 185695, 185700, 185705, 185710, 185715, 185720, 185723, 185727, 185732,\n185737, 185741, 185746, 185751, 185755, 185759, 185764, 185769, 185774, 185779,\n185784, 185789, 185794, 185798, 185802, 185807, 185811, 185816, 185821, 185825,\n185829, 185833, 185837, 185841, 185845, 185849, 185854, 185860, 185866, 185871,\n185877, 185883, 185888, 185893, 185899, 185905, 185911, 185917, 185923, 185929,\n185935, 185940, 185945, 185951, 185956, 185962, 185968, 185973, 185978, 185983,\n185988, 185993, 185998, 186003, 186009, 186016, 186023, 186029, 186036, 186043,\n186049, 186055, 186062, 186069, 186076, 186083, 186090, 186097, 186104, 186110,\n186116, 186123, 186129, 186136, 186143, 186149, 186155, 186161, 186167, 186173,\n186179, 186183, 186188, 186194, 186200, 186205, 186211, 186217, 186222, 186227,\n186233, 186239, 186245, 186251, 186257, 186263, 186269, 186274, 186279, 186285,\n186290, 186296, 186302, 186307, 186312, 186317, 186322, 186327, 186332, 186336,\n186341, 186347, 186353, 186358, 186364, 186370, 186375, 186380, 186386, 186392,\n186398, 186404, 186410, 186416, 186422, 186427, 186432, 186438, 186443, 186449,\n186455, 186460, 186465, 186470, 186475, 186480, 186485, 186488, 186492, 186497,\n186502, 186506, 186511, 186516, 186520, 186524, 186529, 186534, 186539, 186544,\n186549, 186554, 186559, 186563, 186567, 186572, 186576, 186581, 186586, 186590,\n186594, 186598, 186602, 186606, 186610, 186615, 186621, 186628, 186635, 186641,\n186648, 186655, 186661, 186667, 186674, 186681, 186688, 186695, 186702, 186709,\n186716, 186722, 186728, 186735, 186741, 186748, 186755, 186761, 186767, 186773,\n186779, 186785, 186791, 186795, 186800, 186806, 186812, 186817, 186823, 186829,\n186834, 186839, 186845, 186851, 186857, 186863, 186869, 186875, 186881, 186886,\n186891, 186897, 186902, 186908, 186914, 186919, 186924, 186929, 186934, 186939,\n186944, 186948, 186953, 186959, 186965, 186970, 186976, 186982, 186987, 186992,\n186998, 187004, 187010, 187016, 187022, 187028, 187034, 187039, 187044, 187050,\n187055, 187061, 187067, 187072, 187077, 187082, 187087, 187092, 187097, 187101,\n187106, 187112, 187118, 187123, 187129, 187135, 187140, 187145, 187151, 187157,\n187163, 187169, 187175, 187181, 187187, 187192, 187197, 187203, 187208, 187214,\n187220, 187225, 187230, 187235, 187240, 187245, 187250, 187254, 187259, 187265,\n187271, 187276, 187282, 187288, 187293, 187298, 187304, 187310, 187316, 187322,\n187328, 187334, 187340, 187345, 187350, 187356, 187361, 187367, 187373, 187378,\n187383, 187388, 187393, 187398, 187403, 187407, 187412, 187418, 187424, 187429,\n187435, 187441, 187446, 187451, 187457, 187463, 187469, 187475, 187481, 187487,\n187493, 187498, 187503, 187509, 187514, 187520, 187526, 187531, 187536, 187541,\n187546, 187551, 187556, 187559, 187563, 187568, 187573, 187577, 187582, 187587,\n187591, 187595, 187600, 187605, 187610, 187615, 187620, 187625, 187630, 187634,\n187638, 187643, 187647, 187652, 187657, 187661, 187665, 187669, 187673, 187677,\n187681, 187684, 187688, 187693, 187698, 187702, 187707, 187712, 187716, 187720,\n187725, 187730, 187735, 187740, 187745, 187750, 187755, 187759, 187763, 187768,\n187772, 187777, 187782, 187786, 187790, 187794, 187798, 187802, 187806, 187810,\n187815, 187821, 187827, 187832, 187838, 187844, 187849, 187854, 187860, 187866,\n187872, 187878, 187884, 187890, 187896, 187901, 187906, 187912, 187917, 187923,\n187929, 187934, 187939, 187944, 187949, 187954, 187959, 187963, 187968, 187974,\n187980, 187985, 187991, 187997, 188002, 188007, 188013, 188019, 188025, 188031,\n188037, 188043, 188049, 188054, 188059, 188065, 188070, 188076, 188082, 188087,\n188092, 188097, 188102, 188107, 188112, 188117, 188123, 188130, 188137, 188143,\n188150, 188157, 188163, 188169, 188176, 188183, 188190, 188197, 188204, 188211,\n188218, 188224, 188230, 188237, 188243, 188250, 188257, 188263, 188269, 188275,\n188281, 188287, 188293, 188297, 188302, 188308, 188314, 188319, 188325, 188331,\n188336, 188341, 188347, 188353, 188359, 188365, 188371, 188377, 188383, 188388,\n188393, 188399, 188404, 188410, 188416, 188421, 188426, 188431, 188436, 188441,\n188446, 188449, 188453, 188458, 188463, 188467, 188472, 188477, 188481, 188485,\n188490, 188495, 188500, 188505, 188510, 188515, 188520, 188524, 188528, 188533,\n188537, 188542, 188547, 188551, 188555, 188559, 188563, 188567, 188571, 188576,\n188582, 188589, 188596, 188602, 188609, 188616, 188622, 188628, 188635, 188642,\n188649, 188656, 188663, 188670, 188677, 188683, 188689, 188696, 188702, 188709,\n188716, 188722, 188728, 188734, 188740, 188746, 188752, 188756, 188761, 188767,\n188773, 188778, 188784, 188790, 188795, 188800, 188806, 188812, 188818, 188824,\n188830, 188836, 188842, 188847, 188852, 188858, 188863, 188869, 188875, 188880,\n188885, 188890, 188895, 188900, 188905, 188908, 188912, 188917, 188922, 188926,\n188931, 188936, 188940, 188944, 188949, 188954, 188959, 188964, 188969, 188974,\n188979, 188983, 188987, 188992, 188996, 189001, 189006, 189010, 189014, 189018,\n189022, 189026, 189030, 189034, 189039, 189045, 189051, 189056, 189062, 189068,\n189073, 189078, 189084, 189090, 189096, 189102, 189108, 189114, 189120, 189125,\n189130, 189136, 189141, 189147, 189153, 189158, 189163, 189168, 189173, 189178,\n189183, 189188, 189194, 189201, 189208, 189214, 189221, 189228, 189234, 189240,\n189247, 189254, 189261, 189268, 189275, 189282, 189289, 189295, 189301, 189308,\n189314, 189321, 189328, 189334, 189340, 189346, 189352, 189358, 189364, 189368,\n189373, 189379, 189385, 189390, 189396, 189402, 189407, 189412, 189418, 189424,\n189430, 189436, 189442, 189448, 189454, 189459, 189464, 189470, 189475, 189481,\n189487, 189492, 189497, 189502, 189507, 189512, 189517, 189521, 189526, 189532,\n189538, 189543, 189549, 189555, 189560, 189565, 189571, 189577, 189583, 189589,\n189595, 189601, 189607, 189612, 189617, 189623, 189628, 189634, 189640, 189645,\n189650, 189655, 189660, 189665, 189670, 189673, 189677, 189682, 189687, 189691,\n189696, 189701, 189705, 189709, 189714, 189719, 189724, 189729, 189734, 189739,\n189744, 189748, 189752, 189757, 189761, 189766, 189771, 189775, 189779, 189783,\n189787, 189791, 189795, 189800, 189806, 189813, 189820, 189826, 189833, 189840,\n189846, 189852, 189859, 189866, 189873, 189880, 189887, 189894, 189901, 189907,\n189913, 189920, 189926, 189933, 189940, 189946, 189952, 189958, 189964, 189970,\n189976, 189980, 189985, 189991, 189997, 190002, 190008, 190014, 190019, 190024,\n190030, 190036, 190042, 190048, 190054, 190060, 190066, 190071, 190076, 190082,\n190087, 190093, 190099, 190104, 190109, 190114, 190119, 190124, 190129, 190133,\n190138, 190144, 190150, 190155, 190161, 190167, 190172, 190177, 190183, 190189,\n190195, 190201, 190207, 190213, 190219, 190224, 190229, 190235, 190240, 190246,\n190252, 190257, 190262, 190267, 190272, 190277, 190282, 190286, 190291, 190297,\n190303, 190308, 190314, 190320, 190325, 190330, 190336, 190342, 190348, 190354,\n190360, 190366, 190372, 190377, 190382, 190388, 190393, 190399, 190405, 190410,\n190415, 190420, 190425, 190430, 190435, 190439, 190444, 190450, 190456, 190461,\n190467, 190473, 190478, 190483, 190489, 190495, 190501, 190507, 190513, 190519,\n190525, 190530, 190535, 190541, 190546, 190552, 190558, 190563, 190568, 190573,\n190578, 190583, 190588, 190592, 190597, 190603, 190609, 190614, 190620, 190626,\n190631, 190636, 190642, 190648, 190654, 190660, 190666, 190672, 190678, 190683,\n190688, 190694, 190699, 190705, 190711, 190716, 190721, 190726, 190731, 190736,\n190741, 190744, 190748, 190753, 190758, 190762, 190767, 190772, 190776, 190780,\n190785, 190790, 190795, 190800, 190805, 190810, 190815, 190819, 190823, 190828,\n190832, 190837, 190842, 190846, 190850, 190854, 190858, 190862, 190866, 190869,\n190873, 190878, 190883, 190887, 190892, 190897, 190901, 190905, 190910, 190915,\n190920, 190925, 190930, 190935, 190940, 190944, 190948, 190953, 190957, 190962,\n190967, 190971, 190975, 190979, 190983, 190987, 190991, 190995, 191000, 191006,\n191012, 191017, 191023, 191029, 191034, 191039, 191045, 191051, 191057, 191063,\n191069, 191075, 191081, 191086, 191091, 191097, 191102, 191108, 191114, 191119,\n191124, 191129, 191134, 191139, 191144, 191148, 191153, 191159, 191165, 191170,\n191176, 191182, 191187, 191192, 191198, 191204, 191210, 191216, 191222, 191228,\n191234, 191239, 191244, 191250, 191255, 191261, 191267, 191272, 191277, 191282,\n191287, 191292, 191297, 191302, 191308, 191315, 191322, 191328, 191335, 191342,\n191348, 191354, 191361, 191368, 191375, 191382, 191389, 191396, 191403, 191409,\n191415, 191422, 191428, 191435, 191442, 191448, 191454, 191460, 191466, 191472,\n191478, 191482, 191487, 191493, 191499, 191504, 191510, 191516, 191521, 191526,\n191532, 191538, 191544, 191550, 191556, 191562, 191568, 191573, 191578, 191584,\n191589, 191595, 191601, 191606, 191611, 191616, 191621, 191626, 191631, 191634,\n191638, 191643, 191648, 191652, 191657, 191662, 191666, 191670, 191675, 191680,\n191685, 191690, 191695, 191700, 191705, 191709, 191713, 191718, 191722, 191727,\n191732, 191736, 191740, 191744, 191748, 191752, 191756, 191761, 191767, 191774,\n191781, 191787, 191794, 191801, 191807, 191813, 191820, 191827, 191834, 191841,\n191848, 191855, 191862, 191868, 191874, 191881, 191887, 191894, 191901, 191907,\n191913, 191919, 191925, 191931, 191937, 191941, 191946, 191952, 191958, 191963,\n191969, 191975, 191980, 191985, 191991, 191997, 192003, 192009, 192015, 192021,\n192027, 192032, 192037, 192043, 192048, 192054, 192060, 192065, 192070, 192075,\n192080, 192085, 192090, 192093, 192097, 192102, 192107, 192111, 192116, 192121,\n192125, 192129, 192134, 192139, 192144, 192149, 192154, 192159, 192164, 192168,\n192172, 192177, 192181, 192186, 192191, 192195, 192199, 192203, 192207, 192211,\n192215, 192219, 192224, 192230, 192236, 192241, 192247, 192253, 192258, 192263,\n192269, 192275, 192281, 192287, 192293, 192299, 192305, 192310, 192315, 192321,\n192326, 192332, 192338, 192343, 192348, 192353, 192358, 192363, 192368, 192373,\n192379, 192386, 192393, 192399, 192406, 192413, 192419, 192425, 192432, 192439,\n192446, 192453, 192460, 192467, 192474, 192480, 192486, 192493, 192499, 192506,\n192513, 192519, 192525, 192531, 192537, 192543, 192549, 192553, 192558, 192564,\n192570, 192575, 192581, 192587, 192592, 192597, 192603, 192609, 192615, 192621,\n192627, 192633, 192639, 192644, 192649, 192655, 192660, 192666, 192672, 192677,\n192682, 192687, 192692, 192697, 192702, 192706, 192711, 192717, 192723, 192728,\n192734, 192740, 192745, 192750, 192756, 192762, 192768, 192774, 192780, 192786,\n192792, 192797, 192802, 192808, 192813, 192819, 192825, 192830, 192835, 192840,\n192845, 192850, 192855, 192858, 192862, 192867, 192872, 192876, 192881, 192886,\n192890, 192894, 192899, 192904, 192909, 192914, 192919, 192924, 192929, 192933,\n192937, 192942, 192946, 192951, 192956, 192960, 192964, 192968, 192972, 192976,\n192980, 192985, 192991, 192998, 193005, 193011, 193018, 193025, 193031, 193037,\n193044, 193051, 193058, 193065, 193072, 193079, 193086, 193092, 193098, 193105,\n193111, 193118, 193125, 193131, 193137, 193143, 193149, 193155, 193161, 193165,\n193170, 193176, 193182, 193187, 193193, 193199, 193204, 193209, 193215, 193221,\n193227, 193233, 193239, 193245, 193251, 193256, 193261, 193267, 193272, 193278,\n193284, 193289, 193294, 193299, 193304, 193309, 193314, 193318, 193323, 193329,\n193335, 193340, 193346, 193352, 193357, 193362, 193368, 193374, 193380, 193386,\n193392, 193398, 193404, 193409, 193414, 193420, 193425, 193431, 193437, 193442,\n193447, 193452, 193457, 193462, 193467, 193471, 193476, 193482, 193488, 193493,\n193499, 193505, 193510, 193515, 193521, 193527, 193533, 193539, 193545, 193551,\n193557, 193562, 193567, 193573, 193578, 193584, 193590, 193595, 193600, 193605,\n193610, 193615, 193620, 193624, 193629, 193635, 193641, 193646, 193652, 193658,\n193663, 193668, 193674, 193680, 193686, 193692, 193698, 193704, 193710, 193715,\n193720, 193726, 193731, 193737, 193743, 193748, 193753, 193758, 193763, 193768,\n193773, 193777, 193782, 193788, 193794, 193799, 193805, 193811, 193816, 193821,\n193827, 193833, 193839, 193845, 193851, 193857, 193863, 193868, 193873, 193879,\n193884, 193890, 193896, 193901, 193906, 193911, 193916, 193921, 193926, 193929,\n193933, 193938, 193943, 193947, 193952, 193957, 193961, 193965, 193970, 193975,\n193980, 193985, 193990, 193995, 194000, 194004, 194008, 194013, 194017, 194022,\n194027, 194031, 194035, 194039, 194043, 194047, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 194051, 194056, 194063, 194067,\n194071, 194076, 194081, 194086, 194091, 194097, 194102, 194107, 194111, 194115,\n194119, 194123, 194127, 194131, 194135, 194139, 194143, 194148, 194153, 194158,\n194163, 194168, 194173, 194178, 194183, 194188, 194193, 194198, 194203, 194208,\n194213, 194218, 194223, 194228, 194233, 194238, 194243, 194249, 194255, 194261,\n194267, 194273, 194278, 194285, 194289, 194293, 194297, 194301, 194305, 194309,\n194313, 194317, 194321, 194325, 194329, 194333, 194338, 194343, 194348, 194353,\n194358, 194363, 194368, 194374, 194380, 194386, 194392, 194397, 194402, 194407,\n194412, 194417, 194422, 194427, 194432, 194437, 194442, 194447, 194452, 194457,\n194462, 194467, 194473, 194479, 194485, 194491, 194497, 194502, 194506, 194511,\n194516, 194521, 194528, 194532, 194538, 194542, 194547, 194552, 194558, 194563,\n194569, 194573, 194578, 194583, 194588, 194594, 194601, 194606, 194611, 194617,\n194622, 194627, 194632, 194636, 194641, 194646, 194652, 194658, 194664, 194670,\n194676, 194682, 194688, 194694, 194698, 194702, 194706, 194710, 194714, 194718,\n194722, 194726, 194730, 194734, 194738, 194743, 194748, 194753, 194758, 194763,\n194768, 194773, 194778, 194783, 194788, 194793, 194798, 194803, 194808, 194813,\n194818, 194823, 194828, 194833, 194838, 194843, 194848, 194853, 194858, 194863,\n194868, 194873, 194878, 194883, 194888, 194894, 194900, 194906, 194912, 194918,\n194924, 194930, 194936, 194942, 194948, 194954, 194960, 194966, 194971, 194976,\n194981, 194986, 194989, 194993, 194997, 195001, 195005, 195009, 195013, 195017,\n195021, 195025, 195029, 195035, 195040, 195045, 195049, 195053, 195057, 195061,\n195065, 195069, 195073, 195077, 195081, 195085, 195090, 195095, 195100, 195105,\n195110, 195115, 195120, 195125, 195130, 195135, 195140, 195146, 195149, 195152,\n195155, 195158, 195161, 195164, 195167, 195170, 195173, 195176, 195179, 195182,\n195185, 195188, 195192, 195196, 195200, 195204, 195208, 195212, 195216, 195220,\n195224, 195228, 195232, 195236, 195240, 195244, 195248, 195254, 195259, 195263,\n195268, 195273, 195279, 195285, 195291, 195297, 195304, 195311, 195318, 195323,\n195329, 195335, 195341, 195347, 195353, 195357, -1, -1, 195362, -1,\n195369, -1, -1, 195375, 195379, 195384, 195388, 195392, 195398, 195405,\n195409, 195415, 195421, -1, 195425, -1, 195431, -1, -1, 195436,\n195440, -1, -1, -1, 195444, 195449, 195453, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, 195459, 195462,\n195465, 195468, 195472, 195476, 195479, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, 195482, 195485, 195488,\n195491, 195494, -1, -1, -1, -1, -1, 195498, -1, 195500,\n195503, 195505, 195507, 195509, 195511, 195514, 195516, 195518, 195520, 195522,\n195524, 195527, 195529, 195532, 195534, 195536, 195538, 195540, 195542, 195544,\n195546, 195548, 195550, -1, 195552, 195554, 195556, 195559, 195562, -1,\n195564, -1, 195566, 195568, -1, 195570, 195572, -1, 195574, 195577,\n195579, 195581, 195584, 195586, 195588, 195590, 195593, 195595, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 195598, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, 195600, 195603, 195606, 195608, 195610, 195612,\n195614, 195617, 195619, 195622, 195624, 195627, 195630, 195634, 195637, 195641,\n195643, 195646, 195648, 195651, 195653, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, 195655, 195657, 195659, -1,\n195661, 195663, 195665, 195667, 195669, 195671, 195673, 195675, 195677, 195679,\n195681, 195683, 195685, 195687, 195689, 195691, 195693, 195695, 195697, -1,\n195699, 195701, 195703, 195705, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, -1, -1, 195707, 195709, 195711, 195713, 195715, 195717, 195719,\n195721, 195723, 195725, 195727, 195729, 195731, 195733, 195735, 195737, 195739,\n195741, 195743, 195745, 195747, 195749, 195751, 195753, 195755, 195757, 195759,\n195761, 195763, 195765, 195767, 195769, 195771, 195773, 195775, 195777, 195779,\n195781, 195783, 195785, 195787, 195789, 195791, 195793, 195795, 195797, 195799,\n195801, 195803, 195805, 195807, 195809, 195811, 195813, 195815, 195817, 195819,\n195821, 195823, 195825, 195827, 195829, 195831, 195833, 195835, 195837, 195839,\n195841, 195843, 195845, 195847, 195849, 195851, 195853, 195855, 195857, 195859,\n195861, 195863, 195865, 195867, 195869, 195871, 195873, 195875, 195877, 195879,\n195881, 195883, 195885, 195887, 195889, 195891, 195893, -1, -1, 195895,\n195897, 195899, 195901, 195903, 195905, 195908, 195910, 195912, 195914, 195916,\n195918, 195921, 195924, 195927, 195930, 195932, 195934, 195936, 195938, 195940,\n195942, 195945, 195948, 195951, 195954, 195957, 195960, 195963, 195966, 195969,\n195972, 195975, 195978, 195981, 195984, 195987, 195990, 195993, 195996, 195999,\n196002, 196005, 196008, 196011, 196014, 196017, 196020, 196023, 196026, 196029,\n196032, 196035, 196038, 196041, 196044, 196047, 196050, 196053, 196056, 196059,\n196061, 196063, -1, 196065, 196067, 196070, 196073, 196075, 196078, 196081,\n196083, 196086, 196088, 196091, 196094, 196097, 196100, 196103, 196106, 196109,\n196111, 196113, 196116, 196119, 196121, -1, 196124, 196126, 196129, 196131,\n196133, 196135, 196137, -1, -1, -1, 196139, 196141, 196144, 196147,\n196151, 196154, -1, -1, 196156, 196160, 196163, 196165, 196168, 196172,\n-1, -1, 196175, 196178, 196180, 196184, 196187, 196190, -1, -1,\n196193, 196196, 196199, -1, -1, -1, 196201, 196204, 196207, 196209,\n196211, 196213, 196216, -1, 196219, 196221, 196223, 196225, 196227, 196229,\n196231, -1, -1, -1, -1, -1, -1, -1, -1, -1,\n-1, 196233, 196235, 196237, -1, -1, -1, };\n\nQString Data::removeAccents(const QString &input)\n{\n    FCT_IDENTIFICATION;\n\n    // Based on iconv algorithm.\n    // However, I don't want to use iconv here, because the library is too complex for what I actually need\n\n    if ( input.isEmpty() )\n        return QString();\n\n    QString ret;\n    for ( const QChar &character : input )\n    {\n        const char16_t charInt = character.unicode();\n\n        // skip the non-printable chars\n        if ( charInt < 32 )\n            continue;\n\n        // basic ASCII are mapped 1:1\n        if ( charInt < 128 )\n        {\n            ret.append(character);\n        }\n        else // the rest is mapped based on translitTab\n        {\n            const int offset = charInt - 128;\n            const int maxIndex = static_cast<int>(sizeof(tranlitIndexMap) / sizeof(tranlitIndexMap[0]));\n            if ( offset < maxIndex )\n            {\n                const int index = tranlitIndexMap[offset];\n                if ( index >= 0 )\n                {\n                    const char size = translitTab[index];\n                    if ( size > 0 )\n                    {\n                        for (ushort i = 0; i < size; i++)\n                            ret.append(translitTab[index + 1 + i]);\n                    }\n                    else\n                    {\n                        ret.append(\"?\");\n                    }\n                }\n                else\n                {\n                    ret.append(\"?\");\n                }\n            }\n            else\n            {\n                ret.append(\"?\");\n            }\n        }\n    }\n\n    /* If stripped string is empty then QString to store NULL value do DB */\n    if ( ret.isEmpty() )\n        return QString();\n\n    return ret;\n}\n"
  },
  {
    "path": "data/ActivityProfile.cpp",
    "content": "#include \"ActivityProfile.h\"\n#include \"core/debug.h\"\n#include \"data/ProfileManager.h\"\n#include \"data/AntProfile.h\"\n#include \"data/MainLayoutProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/RotProfile.h\"\n#include \"data/StationProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.activityprofile\");\n\n// a compilation issue under 20.04 Ubuntu because qt 5.12 does not\n// support >> for QHash but it is not used now.\n\n// QDataStream& operator<<(QDataStream& out, const ActivityProfile& v)\n// {\n//     out << v.profileName\n//         << v.profiles\n//         << v.fieldValues;\n\n//     return out;\n// }\n\n// QDataStream& operator<<(QDataStream& out, const ActivityProfile::ProfileRecord& v)\n// {\n//     out << v.name\n//         << v.params;\n\n//     return out;\n// }\n\n// QDataStream& operator>>(QDataStream& in, ActivityProfile& v)\n// {\n//     in >> v.profileName;\n//     in >> v.profiles;\n//     in >> v.fieldValues;\n\n//     return in;\n// }\n\n// QDataStream& operator>>(QDataStream& in, ActivityProfile::ProfileRecord& v)\n// {\n//     in >> v.name;\n//     in >> v.params;\n\n//     return in;\n// }\n\nActivityProfile::ActivityProfile(const QString &name, const QJsonDocument &config)\n{\n    /* Config example\n     * {\n     *    \"activityName\" = \"name\",\n     *    \"profiles\" = [\n     *                 { \"profileType\" = 1,\n     *                   \"name\" = \"name\",\n     *                   \"params\" = [\n     *                                {\n     *                                   \"name\" = \"connect\"\n     *                                   \"value\" : true\n     *                                }\n     *                              ]\n     *                 }\n     *                 ]\n     *     \"fieldValues\" = [\n     *                   { \"fieldID\" = 12,\n     *                     \"value\" = \"Contest\"\n     *                   }\n     *                ]\n     * }\n     */\n\n    if ( config.isEmpty() )\n        return;\n\n    profileName = name;\n    const QJsonArray &profilesArray = config[\"profiles\"].toArray();\n\n    for ( const QJsonValue &value : profilesArray )\n    {\n        const QJsonObject &obj = value.toObject();\n        ActivityProfile::ProfileRecord profileRec;\n\n        profileRec.name = obj[\"name\"].toString();\n\n        const QJsonArray &profilesParamsArray = value[\"params\"].toArray();\n        for ( const QJsonValue &paramValue : profilesParamsArray )\n        {\n            const QJsonObject &inner = paramValue.toObject();\n            profileRec.params[getParamID(inner[\"name\"].toString())] = inner[\"value\"].toVariant();\n        }\n\n        profiles[static_cast<ActivityProfile::ProfileType>(obj[\"profileType\"].toInt())] = profileRec;\n    }\n\n    const QJsonArray &fieldValuesArray = config[\"fieldValues\"].toArray();\n    for ( const QJsonValue &fieldValue : fieldValuesArray )\n    {\n        const QJsonObject &obj = fieldValue.toObject();\n        fieldValues[obj[\"fieldID\"].toInt()] = obj[\"value\"].toString();\n    }\n}\n\nQByteArray ActivityProfile::toJson() const\n{\n    /* Config example\n     * {\n     *    \"activityName\" = \"name\",\n     *    \"profiles\" = [\n     *                 { \"profileType\" = 1,\n     *                   \"name\" = \"name\",\n     *                   \"params\" = [\n     *                                {\n     *                                   \"name\" = \"connect\"\n     *                                   \"value\" : true\n     *                                }\n     *                              ]\n     *                 }\n     *                 ]\n     *     \"fieldValues\" = [\n     *                   { \"fieldID\" = 12,\n     *                     \"value\" = \"Contest\"\n     *                   }\n     *                ]\n     * }\n     */\n\n    QJsonObject activityObject;\n\n    activityObject[\"activityName\"] = profileName;\n\n    if ( !profiles.isEmpty() )\n    {\n        QJsonArray profilesArray;\n        for (auto i = profiles.begin(); i != profiles.end(); ++i)\n        {\n            QJsonObject profileObject;\n            profileObject[\"profileType\"] = i.key();\n            profileObject[\"name\"] = i.value().name;\n\n            if ( !i.value().params.isEmpty() )\n            {\n                QJsonArray paramsArray;\n\n                for (auto j = i.value().params.begin(); j != i.value().params.end(); ++j )\n                {\n                    QJsonObject profileParamObject;\n                    profileParamObject[\"name\"] = getParamName(j.key());\n                    profileParamObject[\"value\"] = j.value().toJsonValue();\n                    paramsArray.push_back(profileParamObject);\n                }\n                profileObject[\"params\"] = paramsArray;\n            }\n            profilesArray.push_back(profileObject);\n        }\n        activityObject[\"profiles\"] = profilesArray;\n    }\n\n    if ( !fieldValues.isEmpty() )\n    {\n        QJsonArray fieldValuesArray;\n        for (auto i = fieldValues.begin(); i != fieldValues.end(); i++ )\n        {\n            QJsonObject fieldObject;\n            fieldObject[\"fieldID\"] = i.key();\n            fieldObject[\"value\"] = i.value().toJsonValue();\n            fieldValuesArray.push_back(fieldObject);\n        }\n        activityObject[\"fieldValues\"] = fieldValuesArray;\n    }\n    QJsonDocument doc(activityObject);\n    return doc.toJson();\n}\n\nbool ActivityProfile::operator==(const ActivityProfile &profile)\n{\n    return ( profile.profileName == this->profileName\n             && profile.profiles == this->profiles\n             && profile.fieldValues == this->fieldValues\n            );\n}\n\nbool ActivityProfile::operator!=(const ActivityProfile &profile)\n{\n    return !operator==(profile);\n}\n\nvoid ActivityProfilesManager::setAllProfiles()\n{\n    ActivityProfile currActivity = getCurProfile1();\n\n    if (currActivity == ActivityProfile() )\n        return;\n\n    for( auto i = currActivity.profiles.begin(); i != currActivity.profiles.end(); i++ )\n    {\n        qCDebug(runtime) << i.key() << i.value().name;\n        switch ( i.key() )\n        {\n        case ActivityProfile::ANTENNA_PROFILE:\n            AntProfilesManager::instance()->setCurProfile1(i.value().name);\n            break;\n        case ActivityProfile::STATION_PROFILE:\n            StationProfilesManager::instance()->setCurProfile1(i.value().name);\n            break;\n        case ActivityProfile::RIG_PROFILE:\n            RigProfilesManager::instance()->setCurProfile1(i.value().name);\n            break;\n        case ActivityProfile::ROT_PROFILE:\n            RotProfilesManager::instance()->setCurProfile1(i.value().name);\n            break;\n        case ActivityProfile::MAIN_LAYOUT_PROFILE:\n            MainLayoutProfilesManager::instance()->setCurProfile1(i.value().name);\n            break;\n        default:\n            qWarning() << \"Unknown Activity profile\" << i.key();\n        }\n    }\n    emit changeFinished(currActivity.profileName);\n}\n\nActivityProfilesManager::ActivityProfilesManager() :\n    ProfileManagerSQL<ActivityProfile>(\"activity_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, config FROM activity_profiles\") )\n        qWarning()<< \"Cannot prepare select\";\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            ActivityProfile profileDB(profileQuery.value(0).toString(),\n                                      QJsonDocument::fromJson(profileQuery.value(1).toByteArray()));\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n        qInfo() << \"Activity Profile DB select error \" << profileQuery.lastError().text();\n\n    connect (this, &ActivityProfilesManager::profileChanged,\n             this, &ActivityProfilesManager::setAllProfiles);\n}\n\nvoid ActivityProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM activity_profiles\") )\n    {\n        qWarning() << \"cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO activity_profiles(profile_name, config) \"\n                               \"VALUES (:profile_name, :config)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const ActivityProfile &activityProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":config\", activityProfile.toJson());\n\n            if ( ! insertQuery.exec() )\n                qInfo() << \"Station Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n        }\n    }\n    else\n        qInfo() << \"Activity Profile DB delete error \" << deleteQuery.lastError().text();\n\n    saveCurProfile1();\n}\n"
  },
  {
    "path": "data/ActivityProfile.h",
    "content": "#ifndef Q_LOG_DATA_ACTIVITYPROFILE_H\n#define Q_LOG_DATA_ACTIVITYPROFILE_H\n\n#include <QHash>\n#include \"data/ProfileManager.h\"\n\nclass ActivityProfile\n{\npublic:\n\n    enum ProfileType\n    {\n        ANTENNA_PROFILE = 0,\n        STATION_PROFILE = 1,\n        RIG_PROFILE = 2,\n        ROT_PROFILE = 3,\n        MAIN_LAYOUT_PROFILE = 4\n    };\n\n    enum ProfileParamType\n    {\n        CONNECT = 0,\n    };\n\n    struct ProfileRecord\n    {\n        QString name;\n        QHash<ProfileParamType, QVariant> params;\n\n        bool operator==(const ProfileRecord &other) const\n        {\n            return name == other.name && params == other.params;\n        }\n    };\n\n    ActivityProfile()  {};\n    ActivityProfile(const QString &name, const QJsonDocument &config);\n    QByteArray toJson() const;\n\n    QString profileName;\n    QHash<ProfileType, ProfileRecord> profiles;\n    QHash<int, QVariant> fieldValues;\n\n    QVariant getProfileParam(ProfileType profileType, ProfileParamType profileParam) const\n    {\n        return profiles.value(profileType).params.value(profileParam);\n    };\n\n    bool operator== (const ActivityProfile &profile);\n    bool operator!= (const ActivityProfile &profile);\n\nprivate:\n    // friend QDataStream& operator<<(QDataStream& out, const ActivityProfile& v);\n    // friend QDataStream& operator<<(QDataStream& out, const ActivityProfile::ProfileRecord& v);\n\n    // friend QDataStream& operator>>(QDataStream& in, ActivityProfile& v);\n    // friend QDataStream& operator>>(QDataStream& in, ActivityProfile::ProfileRecord& v);\n\n    QString getParamName(ProfileParamType id) const  { return profileParamsNameMapping.value(id);} ;\n    ProfileParamType getParamID(const QString &paramName) const { return profileParamsNameMapping.key(paramName);};\n    QHash<ProfileParamType, QString> profileParamsNameMapping = {{CONNECT, \"connect\"}};\n};\n\nQ_DECLARE_METATYPE(ActivityProfile);\n\nclass ActivityProfilesManager : public ProfileManagerSQL<ActivityProfile>\n{\n    Q_OBJECT\n\nsignals:\n    void changeFinished(const QString &name);\n\npublic slots:\n    void setAllProfiles();\n\npublic:\n\n    explicit ActivityProfilesManager();\n    ~ActivityProfilesManager() { };\n\n    static ActivityProfilesManager* instance()\n    {\n        static ActivityProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n\n#endif // Q_LOG_DATA_ACTIVITYPROFILE_H\n"
  },
  {
    "path": "data/AntProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n#include <QVariant>\n\n#include \"AntProfile.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.antprofile\");\n\nQDataStream& operator<<(QDataStream& out, const AntProfile& v)\n{\n\n    out << v.profileName << v.description << v.azimuthBeamWidth << v.azimuthOffset;\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, AntProfile& v)\n{\n    in >> v.profileName;\n    in >> v.description;\n    in >> v.azimuthBeamWidth;\n    in >> v.azimuthOffset;\n\n    return in;\n}\n\nAntProfilesManager::AntProfilesManager() :\n    ProfileManagerSQL<AntProfile>(\"ant_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, desc, azimuth_beamwidth, azimuth_offset FROM ant_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            AntProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.description =  profileQuery.value(1).toString();\n            profileDB.azimuthBeamWidth = profileQuery.value(2).toDouble();\n            profileDB.azimuthOffset = profileQuery.value(3).toDouble();\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid AntProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM ant_profiles\") )\n    {\n        qWarning() << \"cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO ant_profiles(profile_name, desc, azimuth_beamwidth, azimuth_offset) \"\n                        \"VALUES (:profile_name, :desc, :azimuth_beamwidth, :azimuth_offset)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const AntProfile &antProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":desc\", antProfile.description);\n            insertQuery.bindValue(\":azimuth_beamwidth\", antProfile.azimuthBeamWidth);\n            insertQuery.bindValue(\":azimuth_offset\", antProfile.azimuthOffset);\n\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"Station Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n\n}\n\nbool AntProfile::operator==(const AntProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.description == this->description\n            && profile.azimuthBeamWidth == this->azimuthBeamWidth\n            && profile.azimuthOffset == this->azimuthOffset);\n}\n\nbool AntProfile::operator!=(const AntProfile &profile)\n{\n   return !operator==(profile);\n}\n"
  },
  {
    "path": "data/AntProfile.h",
    "content": "#ifndef QLOG_DATA_ANTPROFILE_H\n#define QLOG_DATA_ANTPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n\n#include \"data/ProfileManager.h\"\n\n\n#define DEFAULT_ROT_MODEL 1\n\nclass AntProfile\n{\npublic:\n    AntProfile() : azimuthBeamWidth(0.0), azimuthOffset(0.0) {};\n    QString profileName;\n    QString description;\n    double azimuthBeamWidth;\n    double azimuthOffset;\n\n    bool operator== (const AntProfile &profile);\n    bool operator!= (const AntProfile &profile);\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const AntProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, AntProfile& v);\n};\n\nQ_DECLARE_METATYPE(AntProfile)\n\nclass AntProfilesManager : public ProfileManagerSQL<AntProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit AntProfilesManager();\n    ~AntProfilesManager() { };\n\n    static AntProfilesManager *instance()\n    {\n        static AntProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n\n\n#endif // QLOG_DATA_ANTPROFILE_H\n"
  },
  {
    "path": "data/Band.h",
    "content": "#ifndef QLOG_DATA_BAND_H\n#define QLOG_DATA_BAND_H\n\n#include <QtCore>\n\nclass Band {\npublic:\n    QString name;\n    double start;\n    double end;\n    QString satDesignator;\n    bool operator==(const Band &band) const\n    {\n        return ( this->name == band.name\n                 && this->start == band.start\n                 && this->end == band.end\n                 && this->satDesignator == band.satDesignator );\n    }\n};\n\nQ_DECLARE_METATYPE(Band);\n\n#endif // QLOG_DATA_BAND_H\n"
  },
  {
    "path": "data/BandPlan.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"BandPlan.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.bandplan\");\n\nstruct BandModeRange {\n    double start;\n    double end;\n    BandPlan::BandPlanMode mode;\n};\n\n// currectly only IARU Region 1 is implemented\n// https://www.iaru-r1.org/wp-content/uploads/2019/08/hf_r1_bandplan.pdf\n// https://www.oevsv.at/export/shared/.content/.galleries/pdf-Downloads/OVSV-Bandplan_05-2019.pdf\nstatic const BandModeRange r1BandModeTable[] =\n{\n    // 2200m\n    {0.1357, 0.1378, BandPlan::BAND_MODE_CW},\n\n    // 630m\n    {0.472, 0.475, BandPlan::BAND_MODE_CW},\n    {0.475, 0.479, BandPlan::BAND_MODE_DIGITAL},\n\n    // 160m\n    {1.800, 1.838, BandPlan::BAND_MODE_CW},\n    {1.838, 1.840, BandPlan::BAND_MODE_DIGITAL},\n    {1.840, 1.843, BandPlan::BAND_MODE_FT8},\n    {1.843, 2.000, BandPlan::BAND_MODE_LSB},\n\n    // 80m\n    {3.500, 3.570, BandPlan::BAND_MODE_CW},\n    {3.570, 3.573, BandPlan::BAND_MODE_DIGITAL},\n    {3.573, 3.576, BandPlan::BAND_MODE_FT8},\n    {3.576, 3.579, BandPlan::BAND_MODE_FT4},\n    {3.579, 3.600, BandPlan::BAND_MODE_DIGITAL},\n    {3.600, 4.000, BandPlan::BAND_MODE_LSB},\n\n    // 60m\n    {5.3515, 5.356, BandPlan::BAND_MODE_CW},\n    {5.356, 5.361, BandPlan::BAND_MODE_FT8},\n    {5.361, 5.500, BandPlan::BAND_MODE_LSB},\n\n    // 40m\n    {7.000, 7.040, BandPlan::BAND_MODE_CW},\n    {7.040, 7.047, BandPlan::BAND_MODE_DIGITAL},\n    {7.047, 7.050, BandPlan::BAND_MODE_FT4},\n    {7.050, 7.060, BandPlan::BAND_MODE_DIGITAL},\n    {7.060, 7.074, BandPlan::BAND_MODE_LSB},\n    {7.074, 7.077, BandPlan::BAND_MODE_FT8},\n    {7.077, 7.300, BandPlan::BAND_MODE_LSB},\n\n    // 30m\n    {10.100, 10.130, BandPlan::BAND_MODE_CW},\n    {10.130, 10.136, BandPlan::BAND_MODE_DIGITAL},\n    {10.136, 10.139, BandPlan::BAND_MODE_FT8},\n    {10.139, 10.140, BandPlan::BAND_MODE_DIGITAL},\n    {10.140, 10.143, BandPlan::BAND_MODE_FT4},\n    {10.143, 10.150, BandPlan::BAND_MODE_DIGITAL},\n\n    // 20m\n    {14.000, 14.070, BandPlan::BAND_MODE_CW},\n    {14.070, 14.074, BandPlan::BAND_MODE_DIGITAL},\n    {14.074, 14.080, BandPlan::BAND_MODE_FT8},\n    {14.080, 14.083, BandPlan::BAND_MODE_FT4},\n    {14.083, 14.099, BandPlan::BAND_MODE_DIGITAL},\n    {14.099, 14.101, BandPlan::BAND_MODE_CW},\n    {14.101, 14.350, BandPlan::BAND_MODE_USB},\n\n    // 17m\n    {18.068, 18.095, BandPlan::BAND_MODE_CW},\n    {18.095, 18.100, BandPlan::BAND_MODE_DIGITAL},\n    {18.100, 18.103, BandPlan::BAND_MODE_FT8},\n    {18.103, 18.106, BandPlan::BAND_MODE_FT4},\n    {18.106, 18.109, BandPlan::BAND_MODE_DIGITAL},\n    {18.109, 18.111, BandPlan::BAND_MODE_CW},\n    {18.111, 18.168, BandPlan::BAND_MODE_USB},\n\n    // 15m\n    {21.000, 21.070, BandPlan::BAND_MODE_CW},\n    {21.070, 21.074, BandPlan::BAND_MODE_DIGITAL},\n    {21.074, 21.077, BandPlan::BAND_MODE_FT8},\n    {21.077, 21.140, BandPlan::BAND_MODE_DIGITAL},\n    {21.140, 21.143, BandPlan::BAND_MODE_FT4},\n    {21.143, 21.149, BandPlan::BAND_MODE_DIGITAL},\n    {21.149, 21.151, BandPlan::BAND_MODE_CW},\n    {21.151, 21.450, BandPlan::BAND_MODE_USB},\n\n    // 12m\n    {24.890, 24.915, BandPlan::BAND_MODE_CW},\n    {24.915, 24.919, BandPlan::BAND_MODE_FT8},\n    {24.919, 24.922, BandPlan::BAND_MODE_FT4},\n    {24.922, 24.929, BandPlan::BAND_MODE_DIGITAL},\n    {24.929, 24.931, BandPlan::BAND_MODE_CW},\n    {24.931, 24.990, BandPlan::BAND_MODE_USB},\n\n    // 10m\n    {28.000, 28.070, BandPlan::BAND_MODE_CW},\n    {28.070, 28.074, BandPlan::BAND_MODE_DIGITAL},\n    {28.074, 28.077, BandPlan::BAND_MODE_FT8},\n    {28.077, 28.180, BandPlan::BAND_MODE_DIGITAL},\n    {28.180, 28.183, BandPlan::BAND_MODE_FT4},\n    {28.183, 28.190, BandPlan::BAND_MODE_DIGITAL},\n    {28.190, 28.225, BandPlan::BAND_MODE_CW},\n    {28.225, 29.700, BandPlan::BAND_MODE_USB},\n\n    // 6m\n    {50.000, 50.100, BandPlan::BAND_MODE_CW},\n    {50.100, 50.313, BandPlan::BAND_MODE_USB},\n    {50.313, 50.318, BandPlan::BAND_MODE_FT8},\n    {50.318, 50.321, BandPlan::BAND_MODE_FT4},\n    {50.321, 50.400, BandPlan::BAND_MODE_DIGITAL},\n    {50.400, 50.500, BandPlan::BAND_MODE_CW},\n    {50.500, 54.000, BandPlan::BAND_MODE_PHONE},\n\n    // 4m\n    {70.000, 70.100, BandPlan::BAND_MODE_CW},\n    {70.100, 70.102, BandPlan::BAND_MODE_FT8},\n    {70.102, 70.500, BandPlan::BAND_MODE_USB},\n\n    // 2m\n    {144.000, 144.100, BandPlan::BAND_MODE_CW},\n    {144.100, 144.120, BandPlan::BAND_MODE_USB},\n    {144.120, 144.123, BandPlan::BAND_MODE_FT4},\n    {144.123, 144.174, BandPlan::BAND_MODE_USB},\n    {144.174, 144.176, BandPlan::BAND_MODE_FT8},\n    {144.176, 144.360, BandPlan::BAND_MODE_USB},\n    {144.360, 144.400, BandPlan::BAND_MODE_DIGITAL},\n    {144.400, 144.491, BandPlan::BAND_MODE_CW},\n    {144.491, 144.975, BandPlan::BAND_MODE_DIGITAL},\n    {144.975, 148.000, BandPlan::BAND_MODE_USB},\n\n    // 1.25m\n    {222.000, 222.150, BandPlan::BAND_MODE_CW},\n    {222.150, 225.000, BandPlan::BAND_MODE_USB},\n\n    // 70cm\n    {430.000, 432.000, BandPlan::BAND_MODE_USB},\n    {432.000, 432.065, BandPlan::BAND_MODE_CW},\n    {432.065, 432.067, BandPlan::BAND_MODE_FT8},\n    {432.067, 432.100, BandPlan::BAND_MODE_CW},\n    {432.100, 440.000, BandPlan::BAND_MODE_USB},\n\n    // 33cm\n    {902.000, 928.000, BandPlan::BAND_MODE_USB},\n\n    // 23cm\n    {1240.000, 1296.150, BandPlan::BAND_MODE_USB},\n    {1296.150, 1296.400, BandPlan::BAND_MODE_CW},\n    {1296.400, 1300.000, BandPlan::BAND_MODE_PHONE},\n\n    // 3cm QO100\n    // at the moment there is no other satellite that would be used, so we can afford it.\n    // It will not affect tropo operation, because it is in the lower part of the band.\n    {10489.505, 10489.540, BandPlan::BAND_MODE_CW},\n    {10489.540, 10489.580, BandPlan::BAND_MODE_FT8},\n    {10489.580, 10489.650, BandPlan::BAND_MODE_DIGITAL},\n    {10489.650, 10489.745, BandPlan::BAND_MODE_USB},\n    {10489.755, 10489.850, BandPlan::BAND_MODE_USB},\n    {10489.850, 10489.990, BandPlan::BAND_MODE_PHONE}\n};\n\nstatic int bandModeTableSize = sizeof(r1BandModeTable) / sizeof(r1BandModeTable[0]);\n\nBandPlan::BandPlanMode BandPlan::freq2BandMode(const double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq;\n\n    int left = 0;\n    int right = bandModeTableSize - 1;\n\n    while ( left <= right )\n    {\n        int mid = (left + right) / 2;\n        const BandModeRange &range = r1BandModeTable[mid];\n\n        if (freq < range.start) right = mid - 1;\n        else if (freq >= range.end) left = mid + 1;\n        else return range.mode;\n    }\n    // fallback\n    return BandPlan::BAND_MODE_PHONE;\n}\n\nconst QString BandPlan::bandMode2BandModeGroupString(const BandPlanMode &bandPlanMode)\n{\n    FCT_IDENTIFICATION;\n\n    switch ( bandPlanMode )\n    {\n    case BAND_MODE_CW: return BandPlan::MODE_GROUP_STRING_CW;\n\n    case BAND_MODE_DIGITAL: return BandPlan::MODE_GROUP_STRING_DIGITAL;\n\n    case BAND_MODE_FT8:\n    case BAND_MODE_FT4:\n    case BAND_MODE_FT2:\n        return BandPlan::MODE_GROUP_STRING_FTx;\n\n    case BAND_MODE_PHONE:\n    case BAND_MODE_LSB:\n    case BAND_MODE_USB:\n        return BandPlan::MODE_GROUP_STRING_PHONE;\n\n    case BAND_MODE_UNKNOWN:\n        return QString();\n    }\n    return QString();\n}\n\nconst QString BandPlan::freq2BandModeGroupString(const double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq;\n\n    return bandMode2BandModeGroupString(freq2BandMode(freq));\n}\n\nconst QString BandPlan::bandPlanMode2ExpectedMode(const BandPlanMode &bandPlanMode,\n                                                  QString &submode)\n{\n    FCT_IDENTIFICATION;\n\n    submode = QString();\n\n    switch ( bandPlanMode )\n    {\n    case BAND_MODE_CW: {submode = QString(); return \"CW\";}\n    case BAND_MODE_LSB: {submode = \"LSB\"; return \"SSB\";}\n    case BAND_MODE_USB: {submode = \"USB\"; return \"SSB\";}\n    case BAND_MODE_FT8: {return \"FT8\";}\n    case BAND_MODE_FT4: {submode = \"FT4\";return \"MFSK\";}\n    case BAND_MODE_FT2: // not currently specified - use USB\n    case BAND_MODE_DIGITAL: {submode = \"USB\"; return \"SSB\";} // imprecise, but let's try this\n    //case BAND_MODE_PHONE: // it can be FM, SSB, AM - no Mode Change\n    default:\n        submode = QString();\n    }\n\n    return QString();\n}\n\nconst QString BandPlan::freq2ExpectedMode(const double freq, QString &submode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq;\n\n    return bandPlanMode2ExpectedMode(freq2BandMode(freq), submode);\n}\n\nconst Band BandPlan::freq2Band(double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq;\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT name, start_freq, end_freq, sat_designator \"\n                         \"FROM bands \"\n                         \"WHERE :freq BETWEEN start_freq AND end_freq\") )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return Band();\n    }\n\n    query.bindValue(0, freq);\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute select statement\" << query.lastError();\n        return Band();\n    }\n\n    if ( query.next() )\n    {\n        Band band;\n        band.name = query.value(0).toString();\n        band.start = query.value(1).toDouble();\n        band.end = query.value(2).toDouble();\n        band.satDesignator  = query.value(3).toString();\n        return band;\n    }\n\n    return Band();\n}\n\nconst Band BandPlan::bandName2Band(const QString &name)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << name;\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT name, start_freq, end_freq, sat_designator \"\n                       \"FROM bands \"\n                       \"WHERE name = :name LIMIT 1\") )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return Band();\n    }\n\n    query.bindValue(0, name.toLower());\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute select statement\" << query.lastError();\n        return Band();\n    }\n\n    if ( query.next() )\n    {\n        Band band;\n        band.name = query.value(0).toString();\n        band.start = query.value(1).toDouble();\n        band.end = query.value(2).toDouble();\n        band.satDesignator  = query.value(3).toString();\n        return band;\n    }\n\n    return Band();\n}\n\nconst QList<Band> BandPlan::bandsList(const bool onlyDXCCBands,\n                                      const bool onlyEnabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << onlyDXCCBands << onlyEnabled;\n\n    QSqlQuery query;\n    QList<Band> ret;\n\n    QString stmt(QLatin1String(\"SELECT name, start_freq, end_freq, sat_designator \"\n                               \"FROM bands WHERE 1 = 1 \"));\n\n    if ( onlyEnabled )\n        stmt.append(\"AND enabled = 1 \");\n\n    if ( onlyDXCCBands )\n    {\n        stmt.append(\"AND ((1.9 between start_freq and end_freq) \"\n                    \"      OR (3.6 between start_freq and end_freq) \"\n                    \"      OR (7.1 between start_freq and end_freq) \"\n                    \"      OR (10.1 between start_freq and end_freq) \"\n                    \"      OR (14.1 between start_freq and end_freq) \"\n                    \"      OR (18.1 between start_freq and end_freq) \"\n                    \"      OR (21.1 between start_freq and end_freq) \"\n                    \"      OR (24.9 between start_freq and end_freq) \"\n                    \"      OR (28.1 between start_freq and end_freq) \"\n                    \"      OR (50.1 between start_freq and end_freq) \"\n                    \"      OR (145.1 between start_freq and end_freq) \"\n                    \"      OR (421.1 between start_freq and end_freq) \"\n                    \"      OR (1241.0 between start_freq and end_freq) \"\n                    \"      OR (2301.0 between start_freq and end_freq) \"\n                    \"      OR (10001.0 between start_freq and end_freq)) \");\n    }\n\n    stmt.append(\"ORDER BY start_freq \");\n\n    qCDebug(runtime) << stmt;\n\n    if ( ! query.prepare(stmt) )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return ret;\n    }\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute select statement\" << query.lastError();\n        return ret;\n    }\n\n    while ( query.next() )\n    {\n        Band band;\n        band.name = query.value(0).toString();\n        band.start = query.value(1).toDouble();\n        band.end = query.value(2).toDouble();\n        band.satDesignator = query.value(3).toString();\n        ret << band;\n    }\n\n    return ret;\n}\n\nconst QString BandPlan::modeToDXCCModeGroup(const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode;\n\n    if ( mode.isEmpty() ) return QString();\n\n    QSqlQuery query;\n\n    if ( !query.prepare(\"SELECT modes.dxcc \"\n                        \"FROM modes \"\n                        \"WHERE modes.name = :mode LIMIT 1\"))\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return QString();\n    }\n\n    query.bindValue(0, mode);\n\n    if ( query.exec() )\n    {\n        QString ret;\n        query.next();\n        ret = query.value(0).toString();\n        return ret;\n    }\n\n    return QString();\n}\n\nconst QString BandPlan::modeToModeGroup(const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    return isFTxMode(mode) ? BandPlan::MODE_GROUP_STRING_FTx\n                           : BandPlan::modeToDXCCModeGroup(mode);\n}\n\nbool BandPlan::isFTxMode(const QString &mode)\n{\n    return mode == \"FT8\"\n        || mode == \"FT4\"\n        || mode == \"FT2\";\n}\n\nbool BandPlan::isFTxBandMode(BandPlanMode mode)\n{\n    return mode == BAND_MODE_FT8\n        || mode == BAND_MODE_FT4\n        || mode == BAND_MODE_FT2;\n}\n\nBandPlan::BandPlan()\n{\n    FCT_IDENTIFICATION;\n}\n\nconst QString BandPlan::MODE_GROUP_STRING_CW = \"CW\";\nconst QString BandPlan::MODE_GROUP_STRING_DIGITAL = \"DIGITAL\";\nconst QString BandPlan::MODE_GROUP_STRING_FTx = \"FTx\";\nconst QString BandPlan::MODE_GROUP_STRING_PHONE = \"PHONE\";\n"
  },
  {
    "path": "data/BandPlan.h",
    "content": "#ifndef QLOG_DATA_BANDPLAN_H\n#define QLOG_DATA_BANDPLAN_H\n\n#include <QtCore>\n#include \"Band.h\"\n\nclass BandPlan\n{\npublic:\n\n    static const QString MODE_GROUP_STRING_CW;\n    static const QString MODE_GROUP_STRING_DIGITAL;\n    static const QString MODE_GROUP_STRING_FTx;\n    static const QString MODE_GROUP_STRING_PHONE;\n\n    enum BandPlanMode\n    {\n        BAND_MODE_UNKNOWN,\n        BAND_MODE_CW,\n        BAND_MODE_DIGITAL,\n        BAND_MODE_FT8,\n        BAND_MODE_FT4,\n        BAND_MODE_FT2,\n        BAND_MODE_LSB,\n        BAND_MODE_USB,\n        BAND_MODE_PHONE\n    };\n\n    static BandPlanMode freq2BandMode(const double freq);\n    static const QString bandMode2BandModeGroupString(const BandPlan::BandPlanMode &bandPlanMode);\n    static const QString freq2BandModeGroupString(const double freq);\n    static const QString bandPlanMode2ExpectedMode(const BandPlan::BandPlanMode &bandPlanMode,\n                                                   QString &submode);\n    static const QString freq2ExpectedMode(const double freq,\n                                     QString &submode);\n    static const Band freq2Band(double freq);\n    static const Band bandName2Band(const QString& name);\n    static const QList<Band> bandsList(const bool onlyDXCCBands = false,\n                                       const bool onlyEnabled = false);\n    static const QString modeToDXCCModeGroup(const QString &mode);\n    static const QString modeToModeGroup(const QString &mode);\n    static bool isFTxMode(const QString &mode);\n    static bool isFTxBandMode(BandPlanMode mode);\n    BandPlan();\n};\n\nQ_DECLARE_METATYPE(BandPlan::BandPlanMode);\n\n#endif // QLOG_DATA_BANDPLAN_H\n"
  },
  {
    "path": "data/CWKeyProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"CWKeyProfile.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.cwkeyprofile\");\n\nQDataStream& operator<<(QDataStream& out, const CWKeyProfile& v)\n{\n\n    out << v.profileName\n        << v.model\n        << v.defaultSpeed\n        << v.keyMode\n        << v.portPath\n        << v.baudrate\n        << v.hostname\n        << v.netport\n        << v.paddleSwap\n        << v.paddleOnlySidetone\n        << v.sidetoneFrequency;\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, CWKeyProfile& v)\n{\n    in >> v.profileName;\n    in >> v.model;\n    in >> v.defaultSpeed;\n    in >> v.keyMode;\n    in >> v.portPath;\n    in >> v.baudrate;\n    in >> v.hostname;\n    in >> v.netport;\n    in >> v.paddleSwap;\n    in >> v.paddleOnlySidetone;\n    in >> v.sidetoneFrequency;\n\n    return in;\n}\n\nCWKeyProfilesManager::CWKeyProfilesManager() :\n    ProfileManagerSQL<CWKeyProfile>(\"cwkey_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, model, default_speed, \"\n                                \"       key_mode, port_pathname, baudrate, hostname, netport, paddle_swap, paddle_only_sidetone, sidetone_frequency \"\n                                \"FROM cwkey_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            CWKeyProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.model =  CWKey::intToTypeID(profileQuery.value(1).toInt());\n            profileDB.defaultSpeed = profileQuery.value(2).toInt();\n            profileDB.keyMode = CWKey::intToModeID(profileQuery.value(3).toInt());\n            profileDB.portPath =  profileQuery.value(4).toString();\n            profileDB.baudrate =  profileQuery.value(5).toUInt();\n            profileDB.hostname =  profileQuery.value(6).toString();\n            profileDB.netport =  profileQuery.value(7).toUInt();\n            profileDB.paddleSwap = profileQuery.value(8).toBool();\n            profileDB.paddleOnlySidetone = profileQuery.value(9).toBool();\n            profileDB.sidetoneFrequency = profileQuery.value(10).toInt();\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"CW Key Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid CWKeyProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM cwkey_profiles\") )\n    {\n        qWarning() << \"Cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO cwkey_profiles(profile_name, model, default_speed, key_mode, port_pathname, baudrate, hostname, netport, paddle_swap, paddle_only_sidetone, sidetone_frequency) \"\n                        \"VALUES (:profile_name, :model, :default_speed, :key_mode, :port_pathname, :baudrate, :hostname, :netport, :paddle_swap, :paddle_only_sidetone, :sidetone_frequency)\") )\n    {\n        qWarning() << \"Cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const CWKeyProfile &cwKeyProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":model\", cwKeyProfile.model);\n            insertQuery.bindValue(\":default_speed\", cwKeyProfile.defaultSpeed);\n            insertQuery.bindValue(\":key_mode\", cwKeyProfile.keyMode);\n            insertQuery.bindValue(\":port_pathname\", cwKeyProfile.portPath);\n            insertQuery.bindValue(\":baudrate\", cwKeyProfile.baudrate);\n            insertQuery.bindValue(\":hostname\", cwKeyProfile.hostname);\n            insertQuery.bindValue(\":netport\", cwKeyProfile.netport);\n            insertQuery.bindValue(\":paddle_swap\", cwKeyProfile.paddleSwap);\n            insertQuery.bindValue(\":paddle_only_sidetone\", cwKeyProfile.paddleOnlySidetone);\n            insertQuery.bindValue(\":sidetone_frequency\", cwKeyProfile.sidetoneFrequency);\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"CW Key Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"CW Key Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\nbool CWKeyProfile::operator==(const CWKeyProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.model == this->model\n            && profile.defaultSpeed == this->defaultSpeed\n            && profile.keyMode == this->keyMode\n            && profile.portPath == this->portPath\n            && profile.baudrate == this->baudrate\n            && profile.hostname == this->hostname\n            && profile.netport == this->netport\n            && profile.paddleSwap == this->paddleSwap\n            && profile.paddleOnlySidetone == this->paddleOnlySidetone\n            && profile.sidetoneFrequency == this->sidetoneFrequency);\n}\n\nbool CWKeyProfile::operator!=(const CWKeyProfile &profile)\n{\n    return !operator==(profile);\n}\n"
  },
  {
    "path": "data/CWKeyProfile.h",
    "content": "#ifndef QLOG_DATA_CWKEYPROFILE_H\n#define QLOG_DATA_CWKEYPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n\n#include \"data/ProfileManager.h\"\n#include \"cwkey/drivers/CWKey.h\"\n\n#define DEFAULT_CWKEY_MODEL 0\n\n// this is a hack. We have non-empty text to set empty value in Setting dialog->Rig's Assigned CW Key combo\n// therefore QLog use one space as a profile that meams no CW is assigned to Rig\n#define EMPTY_PROFILE_NAME \" \"\n\nclass CWKeyProfile\n{\npublic:\n    CWKeyProfile() : model(CWKey::DUMMY_KEYER),\n                     keyMode(CWKey::IAMBIC_B)\n    {\n        defaultSpeed = 0;\n        baudrate = 0;\n        netport = 0;\n        paddleSwap = false;\n        paddleOnlySidetone = false;\n        sidetoneFrequency = 800;\n    };\n\n    QString profileName;\n    CWKey::CWKeyTypeID model;\n    qint32 defaultSpeed;\n    CWKey::CWKeyModeID keyMode;\n    QString portPath;\n    quint32 baudrate;\n    QString hostname;\n    quint16 netport;\n    bool paddleSwap;\n    bool paddleOnlySidetone;\n    qint32 sidetoneFrequency;\n\n    bool operator== (const CWKeyProfile &profile);\n    bool operator!= (const CWKeyProfile &profile);\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const CWKeyProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, CWKeyProfile& v);\n\n};\n\nQ_DECLARE_METATYPE(CWKeyProfile);\n\nclass CWKeyProfilesManager : public ProfileManagerSQL<CWKeyProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit CWKeyProfilesManager();\n    ~CWKeyProfilesManager() { };\n\n    static CWKeyProfilesManager* instance()\n    {\n        static CWKeyProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n#endif // QLOG_DATA_CWKEYPROFILE_H\n"
  },
  {
    "path": "data/CWShortcutProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"CWShortcutProfile.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.cwshortcutprofile\");\n\nQDataStream& operator<<(QDataStream& out, const CWShortcutProfile& v)\n{\n\n    out << v.profileName;\n\n    for( int i = 0; i < v.shortDescs.size(); i++ )\n    {\n        out << v.shortDescs[i];\n    }\n\n    for( int i = 0; i < v.macros.size(); i++ )\n    {\n        out << v.macros[i];\n    }\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, CWShortcutProfile& v)\n{\n    in >> v.profileName;\n\n    for( int i = 0; i < v.shortDescs.size(); i++ )\n    {\n        in >> v.shortDescs[i];\n    }\n\n    for( int i = 0; i < v.macros.size(); i++ )\n    {\n        in >> v.macros[i];\n    }\n\n    return in;\n}\n\nCWShortcutProfilesManager::CWShortcutProfilesManager() :\n    ProfileManagerSQL<CWShortcutProfile>(\"cwshortcut_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, f1_short, f1_macro, f2_short, f2_macro, \"\n                                \"f3_short, f3_macro, f4_short, f4_macro, f5_short, f5_macro, \"\n                                \"f6_short, f6_macro, f7_short, f7_macro FROM cwshortcut_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            CWShortcutProfile profileDB;\n\n            int column = 0;\n            profileDB.profileName = profileQuery.value(column++).toString();\n\n            for ( int i = 0; i < profileDB.shortDescs.size(); i++ )\n            {\n                profileDB.shortDescs[i] = profileQuery.value(column++).toString();\n                profileDB.macros[i] = profileQuery.value(column++).toString();\n            }\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"CW Shortcut Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid CWShortcutProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM cwshortcut_profiles\") )\n    {\n        qWarning() << \"Cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO cwshortcut_profiles(profile_name, f1_short, f1_macro, f2_short, f2_macro,\"\n                               \"f3_short, f3_macro, f4_short, f4_macro, f5_short, f5_macro,\"\n                               \"f6_short, f6_macro, f7_short, f7_macro)\"\n                        \"VALUES (:profile_name, :f1_short, :f1_macro, :f2_short, :f2_macro,\"\n                               \":f3_short, :f3_macro, :f4_short, :f4_macro, :f5_short, :f5_macro,\"\n                               \":f6_short, :f6_macro, :f7_short, :f7_macro)\") )\n    {\n        qWarning() << \"Cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const CWShortcutProfile &cwShortcutProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            for ( int i = 0; i < cwShortcutProfile.shortDescs.size(); i++ )\n            {\n                insertQuery.bindValue(QString(\":f%1_short\").arg(i+1), cwShortcutProfile.shortDescs[i]);\n            }\n\n            for ( int i = 0; i < cwShortcutProfile.macros.size(); i++ )\n            {\n                insertQuery.bindValue(QString(\":f%1_macro\").arg(i+1), cwShortcutProfile.macros[i]);\n            }\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"CW Shortcut Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"CW Shortcut Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\nbool CWShortcutProfile::operator==(const CWShortcutProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.shortDescs == this->shortDescs\n            && profile.macros == this->macros);\n}\n\nbool CWShortcutProfile::operator!=(const CWShortcutProfile &profile)\n{\n    return !operator==(profile);\n}\n"
  },
  {
    "path": "data/CWShortcutProfile.h",
    "content": "#ifndef QLOG_DATA_CWSHORTCUTPROFILE_H\n#define QLOG_DATA_CWSHORTCUTPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n\n#include \"data/ProfileManager.h\"\n\n#define MAX_SHORTCUT_KEYS 7\n\nclass CWShortcutProfile\n{\npublic:\n    CWShortcutProfile()\n    {\n        shortDescs.resize(MAX_SHORTCUT_KEYS);\n        macros.resize(MAX_SHORTCUT_KEYS);\n    };\n\n    QString profileName;\n    QVector<QString> shortDescs;\n    QVector<QString> macros;\n\n    bool operator== (const CWShortcutProfile &profile);\n    bool operator!= (const CWShortcutProfile &profile);\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const CWShortcutProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, CWShortcutProfile& v);\n};\n\nQ_DECLARE_METATYPE(CWShortcutProfile);\n\nclass CWShortcutProfilesManager : public ProfileManagerSQL<CWShortcutProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit CWShortcutProfilesManager();\n    ~CWShortcutProfilesManager() { };\n\n    static CWShortcutProfilesManager* instance()\n    {\n        static CWShortcutProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n\n#endif // QLOG_DATA_CWSHORTCUTPROFILE_H\n"
  },
  {
    "path": "data/Callsign.cpp",
    "content": "#include \"Callsign.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.callsign\");\n\nCallsign::Callsign(const QString &callsign,\n                   QObject *parent)\n    : QObject{parent},\n      fullCallsign(callsign.toUpper()),\n      valid(false)\n{\n    FCT_IDENTIFICATION;\n\n    QRegularExpression callsignRE = callsignRegEx();\n    QRegularExpressionMatch match = callsignRE.match(fullCallsign);\n\n    if ( match.hasMatch() )\n    {\n        //it is a valid callsign\n        valid = true;\n        hostPrefixWithDelimiter = match.captured(1);\n        hostPrefix              = match.captured(2);\n        base                    = match.captured(3);\n        basePrefix              = match.captured(4);\n        basePrefixNumber        = match.captured(5);\n        suffixWithDelimiter     = match.captured(7);\n        suffix                  = match.captured(8);\n\n        qCDebug(runtime) << hostPrefix << base << suffix;\n    }\n    else\n    {\n        //it is an invalid callsign\n        fullCallsign = QString();\n    }\n}\n\nconst QRegularExpression Callsign::callsignRegEx()\n{\n    FCT_IDENTIFICATION;\n    return QRegularExpression(callsignRegExString(), QRegularExpression::CaseInsensitiveOption);\n}\n\nconst QString Callsign::callsignRegExString()\n{\n    FCT_IDENTIFICATION;\n    return QString(\"^(([A-Z0-9]+)[\\\\/])?(([A-Z][0-9]|[A-Z]{1,2}|[0-9][A-Z])([0-9]|[0-9]+)([A-Z]+))([\\\\/]([A-Z0-9]+))?\");\n}\n\nconst QString Callsign::getCallsign() const\n{\n    FCT_IDENTIFICATION;\n\n    return fullCallsign;\n}\n\nconst QString Callsign::getHostPrefix() const\n{\n    FCT_IDENTIFICATION;\n\n    return hostPrefix;\n}\n\nconst QString Callsign::getHostPrefixWithDelimiter() const\n{\n    FCT_IDENTIFICATION;\n\n    return hostPrefixWithDelimiter;\n}\n\nconst QString Callsign::getBase() const\n{\n    FCT_IDENTIFICATION;\n\n    return base;\n}\n\nconst QString Callsign::getBasePrefix() const\n{\n    FCT_IDENTIFICATION;\n\n    return basePrefix;\n}\n\nconst QString Callsign::getBasePrefixNumber() const\n{\n    FCT_IDENTIFICATION;\n\n    return basePrefixNumber;\n}\n\nconst QString Callsign::getSuffix() const\n{\n    FCT_IDENTIFICATION;\n\n    return suffix;\n}\n\nconst QString Callsign::getSuffixWithDelimiter() const\n{\n    FCT_IDENTIFICATION;\n\n    return suffixWithDelimiter;\n}\n\nconst QString Callsign::getWPXPrefix() const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isValid() )\n        return QString();\n\n    // defined here\n    // https://www.cqwpx.com/rules.htm\n\n    // inspired here\n    // https://git.fkurz.net/dj1yfk/yfklog/src/branch/develop/yfksubs.pl#L605\n\n\n    /*********************\n     * ONLY BASE CALLSIGN\n     *********************/\n    if ( getBase() != QString()\n         && getHostPrefix() == QString()\n         && getSuffix() == QString() )\n    {\n        // only callsign\n        // return callsign prefix + prefix number\n        // OL80ABC -> OL80\n        // OK1ABC -> OK1\n        return getBasePrefix() + getBasePrefixNumber();\n    }\n\n    /*********************\n     * HOST PREFIX PRESENT\n     *********************/\n    if ( getHostPrefix() != QString() )\n    {\n        // callsign has a Host prefix SP/OK1XXX\n        // we do not look at the suffix and assign automatically HostPrefix + '0'\n\n        if ( getHostPrefix().back().isDigit() )\n            return getHostPrefix();\n\n        return getHostPrefix() + QString(\"0\");\n    }\n\n    /****************\n     * SUFFIX PRESENT\n     ****************/\n    if ( getSuffix().length() == 1) // some countries add single numbers as suffix to designate a call area, e.g. /4\n    {\n        bool isNumber = false;\n        (void)suffix.toInt(&isNumber);\n        if ( isNumber )\n        {\n            // callsign suffix is a number\n            // VE7ABC/2 -> VE2\n            return getBasePrefix() + getSuffix();\n        }\n\n        // callsign suffix is not a number\n        // OK1ABC/P -> OK1\n        return getBasePrefix() + getBasePrefixNumber();\n    }\n\n    /***************************\n     * SUFFIX PRESENT LENGTH > 1\n     ***************************/\n    if ( secondarySpecialSuffixes.contains(getSuffix()) )\n    {\n        // QRP, MM etc.\n        // OK1ABC/AM -> OK1\n        return getBasePrefix() + getBasePrefixNumber();\n    }\n\n    // valid prefix should contain a number in the last position - check it\n    // and prefix is not just a number\n    // N8ABC/KH9 -> KH9\n\n    bool isNumber = false;\n    (void)getSuffix().toInt(&isNumber);\n\n    if ( isNumber )\n    {\n        // suffix contains 2 and more numbers - ignore it\n        return getBasePrefix() + getBasePrefixNumber();\n    }\n\n    // suffix is combination letters and digits and last position is a number\n    if ( getSuffix().back().isDigit() )\n        return getSuffix();\n\n    // prefix does not contain a number - add \"0\"\n    return getSuffix() + QString(\"0\");\n}\n\nbool Callsign::isValid() const\n{\n    FCT_IDENTIFICATION;\n\n    return valid;\n}\n\n// Based on wiki information\n// https://en.wikipedia.org/wiki/Amateur_radio_call_signs\nconst QStringList Callsign::secondarySpecialSuffixes =\n{\n    \"A\",   // operator at a secondary location registered with the licensing authorities\n    \"AM\",  // aeronautical mobile\n    \"M\",   // mobile operation\n    \"MM\",  // marine mobile\n    \"P\",   // portable operation\n    \"QRP\",  // QRP - unofficial\n    \"R\",    // repeaters\n    \"B\",    // beacon\n    \"LGT\"   // 'LIGHTHOUSE' or 'LIGHTSHIP'  - unofficial\n};\n"
  },
  {
    "path": "data/Callsign.h",
    "content": "#ifndef QLOG_DATA_CALLSIGN_H\n#define QLOG_DATA_CALLSIGN_H\n\n#include <QObject>\n#include <QRegularExpression>\n\nclass Callsign : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit Callsign(const QString &callsign,\n                      QObject *parent = nullptr);\n    static const QRegularExpression callsignRegEx();\n    static const QString callsignRegExString();\n    static const QStringList secondarySpecialSuffixes;\n\n    const QString getCallsign() const;\n    const QString getHostPrefix() const;\n    const QString getHostPrefixWithDelimiter() const;\n    const QString getBase() const;\n    const QString getBasePrefix() const;\n    const QString getBasePrefixNumber() const;\n    const QString getSuffix() const;\n    const QString getSuffixWithDelimiter() const;\n    const QString getWPXPrefix() const;\n    bool isValid() const;\n\nprivate:\n    QString fullCallsign;\n    QString hostPrefix;\n    QString hostPrefixWithDelimiter;\n    QString base;\n    QString basePrefix;\n    QString basePrefixNumber;\n    QString suffix;\n    QString suffixWithDelimiter;\n    bool valid;\n};\n\n#endif // QLOG_DATA_CALLSIGN_H\n"
  },
  {
    "path": "data/Data.cpp",
    "content": "#include <QJsonDocument>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QCompleter>\n#include <QColor>\n#include \"Data.h\"\n#include \"data/Callsign.h\"\n#include \"core/debug.h\"\n#include \"BandPlan.h\"\n#include \"data/StationProfile.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.data\");\n\nData::Data(QObject *parent) :\n   QObject(parent),\n   zd(nullptr),\n   isDXCCQueryValid(false)\n{\n    FCT_IDENTIFICATION;\n\n    loadContests();\n    loadPropagationModes();\n    loadLegacyModes();\n    loadDxccFlags();\n    loadSatModes();\n    loadIOTA();\n    loadSOTA();\n    loadWWFF();\n    loadPOTA();\n    loadTZ();\n\n\n    // dxcc_prefixes_ad1c.exact DESC, dxcc_prefixes_ad1c.prefix DESC\n    // is used because it prefers an exact-match record over a partial-match records\n    isDXCCQueryValid = queryDXCC.prepare(\n                \"SELECT \"\n                \"    dxcc_entities_ad1c.id, \"\n                \"    dxcc_entities_ad1c.name, \"\n                \"    dxcc_entities_ad1c.prefix, \"\n                \"    dxcc_entities_ad1c.cont, \"\n                \"    CASE \"\n                \"        WHEN (dxcc_prefixes_ad1c.cqz != 0) \"\n                \"        THEN dxcc_prefixes_ad1c.cqz \"\n                \"        ELSE dxcc_entities_ad1c.cqz \"\n                \"    END AS cqz, \"\n                \"    CASE \"\n                \"        WHEN (dxcc_prefixes_ad1c.ituz != 0) \"\n                \"        THEN dxcc_prefixes_ad1c.ituz \"\n                \"        ELSE dxcc_entities_ad1c.ituz \"\n                \"    END AS ituz , \"\n                \"    dxcc_entities_ad1c.lat, \"\n                \"    dxcc_entities_ad1c.lon, \"\n                \"    dxcc_entities_ad1c.tz, \"\n                \"    dxcc_prefixes_ad1c.exact \"\n                \"FROM dxcc_prefixes_ad1c \"\n                \"INNER JOIN dxcc_entities_ad1c ON (dxcc_prefixes_ad1c.dxcc = dxcc_entities_ad1c.id) \"\n                \"WHERE (dxcc_prefixes_ad1c.prefix = :callsign and dxcc_prefixes_ad1c.exact = true) \"\n                \"    OR (dxcc_prefixes_ad1c.exact = false and :callsign LIKE dxcc_prefixes_ad1c.prefix || '%') \"\n                \"ORDER BY dxcc_prefixes_ad1c.exact DESC, dxcc_prefixes_ad1c.prefix DESC \"\n                \"LIMIT 1 \"\n                );\n\n    isDXCCClublogQueryValid = queryDXCCClublog.prepare(\n                \"SELECT e.id, \"\n                \"      e.name, \"\n                \"      e.prefix, \"\n                \"      e.cont, \"\n                \"      COALESCE(z.cqz, \"\n                \"               CASE  WHEN (p.cqz != 0) THEN p.cqz ELSE e.cqz END) AS cqz, \"\n                \"      CASE WHEN z.cqz IS NOT NULL THEN NULL \"\n                \"           WHEN (p.ituz != 0) THEN p.ituz \"\n                \"           ELSE e.ituz END AS ituz, \"\n                \"      e.lat, \"\n                \"      e.lon, \"\n                \"      p.exact \"\n                \" FROM dxcc_prefixes_clublog p\"\n                \"   INNER JOIN dxcc_entities_clublog e ON (p.dxcc = e.id) \"\n                \"   LEFT JOIN dxcc_zone_exceptions_clublog z ON ( z.call = :exactcall AND :dxccdate BETWEEN COALESCE(z.start, '0001-01-01 00:00:00') \"\n                \"                                                                                    AND COALESCE(z.end, '9999-12-31 23:59:59')) \"\n                \" WHERE ((p.prefix = :exactcall and p.exact = 1) \"\n                \"     OR (p.exact = 0 and :modifiedcall LIKE p.prefix || '%')) \"\n                \"    AND :dxccdate BETWEEN COALESCE(p.start, '0001-01-01 00:00:00') \"\n                \"                          AND COALESCE(p.end, '9999-12-31 23:59:59') \"\n                \" ORDER BY p.exact DESC, p.prefix DESC LIMIT 1\"\n                );\n\n    isDXCCIDAD1CQueryValid = queryDXCCIDAD1C.prepare(\n                \" SELECT dxcc_entities_ad1c.id, dxcc_entities_ad1c.name, dxcc_entities_ad1c.prefix, dxcc_entities_ad1c.cont, \"\n                \"        dxcc_entities_ad1c.cqz, dxcc_entities_ad1c.ituz, dxcc_entities_ad1c.lat, dxcc_entities_ad1c.lon, dxcc_entities_ad1c.tz \"\n                \" FROM dxcc_entities_ad1c \"\n                \" WHERE dxcc_entities_ad1c.id = :dxccid\"\n                );\n\n    isDXCCIDClublogQueryValid = queryDXCCIDClublog.prepare(\n                \" SELECT c.id, c.name, c.prefix, c.cont, \"\n                \"        c.cqz, c.ituz, c.lat, c.lon \"\n                \" FROM dxcc_entities_clublog c \"\n                \" WHERE c.id = :dxccid\"\n                );\n\n    isSOTAQueryValid = querySOTA.prepare(\n                \"SELECT summit_code,\"\n                \"       association_name,\"\n                \"       region_name,\"\n                \"       summit_name,\"\n                \"       altm,\"\n                \"       altft,\"\n                \"       gridref1,\"\n                \"       gridref2,\"\n                \"       longitude,\"\n                \"       latitude,\"\n                \"       points,\"\n                \"       bonus_points,\"\n                \"       valid_from,\"\n                \"       valid_to \"\n                \"FROM sota_summits \"\n                \"WHERE summit_code = :code\"\n                );\n\n    isPOTAQueryValid = queryPOTA.prepare(\n                \"SELECT reference,\"\n                \"       name,\"\n                \"       active,\"\n                \"       entityID,\"\n                \"       locationDesc,\"\n                \"       latitude,\"\n                \"       longitude,\"\n                \"       grid \"\n                \"FROM pota_directory \"\n                \"WHERE reference = :code\"\n                );\n\n    isWWFFQueryValid = queryWWFF.prepare(\n                \"SELECT reference,\"\n                \"       status,\"\n                \"       name,\"\n                \"       program,\"\n                \"       dxcc,\"\n                \"       state,\"\n                \"       county,\"\n                \"       continent,\"\n                \"       iota,\"\n                \"       iaruLocator,\"\n                \"       latitude,\"\n                \"       longitude,\"\n                \"       iucncat,\"\n                \"       valid_from,\"\n                \"       valid_to \"\n                \"FROM wwff_directory \"\n                \"WHERE reference = :reference\"\n                );\n}\n\nData::~Data()\n{\n    FCT_IDENTIFICATION;\n\n    if ( zd )\n    {\n        ZDCloseDatabase(zd);\n    }\n}\n\n#define RETCODE(a)  \\\n    dxccStatusCache.insert(dxcc, myDXCC, band, mode, new DxccStatus(a)); \\\n    return ((a));\n\nDxccStatus Data::dxccStatus(int dxcc, const QString &band, const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxcc << \" \" << band << \" \" << mode;\n\n    const int myDXCC = StationProfilesManager::instance()->getCurProfile1().dxcc;\n\n    DxccStatus *statusFromCache = dxccStatusCache.value(dxcc, myDXCC, band, mode);\n\n    if ( statusFromCache )\n        return *statusFromCache;\n\n    // FTx modes (FT8, FT4, FT2) are stored in contacts with modes.dxcc = 'DIGITAL',\n    // so we use DIGITAL as the effective mode group when querying for FTx.\n    const QString modeForQuery = ( mode == BandPlan::MODE_GROUP_STRING_FTx )\n                                 ? BandPlan::MODE_GROUP_STRING_DIGITAL\n                                 : mode;\n\n    QString sql_mode(\":mode\");\n\n    if ( modeForQuery != BandPlan::MODE_GROUP_STRING_CW\n         && modeForQuery != BandPlan::MODE_GROUP_STRING_PHONE\n         && modeForQuery != BandPlan::MODE_GROUP_STRING_DIGITAL )\n    {\n        sql_mode = \"(SELECT modes.dxcc FROM modes WHERE modes.name = :mode LIMIT 1) \";\n    }\n\n\n    QStringList dxccConfirmedByCond(QLatin1String(\"0=1\")); // if no option is selected then always false\n\n    if ( LogParam::getDxccConfirmedByLotwState() )\n        dxccConfirmedByCond << QLatin1String(\"all_dxcc_qsos.lotw_qsl_rcvd = 'Y'\");\n\n    if ( LogParam::getDxccConfirmedByPaperState() )\n        dxccConfirmedByCond << QLatin1String(\"all_dxcc_qsos.qsl_rcvd = 'Y'\");\n\n    if ( LogParam::getDxccConfirmedByEqslState() )\n        dxccConfirmedByCond << QLatin1String(\"all_dxcc_qsos.eqsl_qsl_rcvd = 'Y'\");\n\n    QSqlQuery query;\n    QString sqlStatement = QString(\"WITH all_dxcc_qsos AS (SELECT DISTINCT contacts.mode, contacts.band, \"\n                                         \"                                       contacts.qsl_rcvd, contacts.lotw_qsl_rcvd, contacts.eqsl_qsl_rcvd \"\n                                         \"                       FROM contacts \"\n                                         \"                       WHERE dxcc = :dxcc %1) \"\n                                         \"  SELECT (SELECT 1 FROM all_dxcc_qsos LIMIT 1) as entity,\"\n                                         \"         (SELECT 1 FROM all_dxcc_qsos WHERE band = :band LIMIT 1) as band, \"\n                                         \"         (SELECT 1 FROM all_dxcc_qsos INNER JOIN modes ON (modes.name = all_dxcc_qsos.mode) \"\n                                         \"          WHERE modes.dxcc = %2 LIMIT 1) as mode, \"\n                                         \"         (SELECT 1 FROM all_dxcc_qsos INNER JOIN modes ON (modes.name = all_dxcc_qsos.mode) \"\n                                         \"          WHERE modes.dxcc = %3 AND all_dxcc_qsos.band = :band LIMIT 1) as slot, \"\n                                         \"         (SELECT 1 FROM all_dxcc_qsos INNER JOIN modes ON (modes.name = all_dxcc_qsos.mode) \"\n                                         \"          WHERE modes.dxcc = %4 AND all_dxcc_qsos.band = :band \"\n                                         \"                AND (%5) LIMIT 1) as confirmed\")\n                                         .arg(( myDXCC != 0 ) ? QString(\" AND my_dxcc = %1\").arg(myDXCC)\n                                                                    : \"\",\n                                              sql_mode,\n                                              sql_mode,\n                                              sql_mode,\n                                              dxccConfirmedByCond.join(\" OR \"));\n\n    if ( ! query.prepare(sqlStatement) )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return DxccStatus::UnknownStatus;\n    }\n\n    query.bindValue(\":dxcc\", dxcc);\n    query.bindValue(\":band\", band);\n    query.bindValue(\":mode\", modeForQuery);\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute Select statement\" << query.lastError();\n        return DxccStatus::UnknownStatus;\n    }\n\n    if ( query.next() )\n    {\n        if ( query.value(0).toString().isEmpty() )\n        {\n            RETCODE(DxccStatus::NewEntity);\n        }\n\n        if ( query.value(1).toString().isEmpty() )\n        {\n            if ( query.value(2).toString().isEmpty() )\n            {\n                RETCODE(DxccStatus::NewBandMode);\n            }\n            else\n            {\n                RETCODE(DxccStatus::NewBand);\n            }\n        }\n\n        if ( query.value(2).toString().isEmpty() )\n        {\n            RETCODE(DxccStatus::NewMode);\n        }\n\n        if ( query.value(3).toString().isEmpty() )\n        {\n            RETCODE(DxccStatus::NewSlot);\n        }\n\n        if ( query.value(4).toString().isEmpty() )\n        {\n            RETCODE(DxccStatus::Worked);\n        }\n        else\n        {\n            RETCODE(DxccStatus::Confirmed);\n        }\n    }\n\n    RETCODE(DxccStatus::UnknownStatus);\n}\n#undef RETCODE\n\nQStringList Data::contestList()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList contestLOV;\n\n    QSqlQuery query(QLatin1String(\"SELECT DISTINCT contest_id FROM contacts ORDER BY 1 COLLATE LOCALEAWARE ASC\"));\n\n    while ( query.next() )\n        contestLOV << query.value(0).toString();\n\n    return contestLOV + contests.keys();\n}\n\n#define RETURNCODE(a) \\\n    qCDebug(runtime) << \"new DXCC Status: \" << (a); \\\n    return ((a))\n\nDxccStatus Data::dxccNewStatusWhenQSOAdded(const DxccStatus &oldStatus,\n                                  const qint32 oldDxcc,\n                                  const QString &oldBand,\n                                  const QString &oldMode,\n                                  const qint32 newDxcc,\n                                  const QString &newBand,\n                                  const QString &newMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << oldStatus\n                               << oldDxcc\n                               << oldBand\n                               << oldMode\n                               << newDxcc\n                               << newBand\n                               << newMode;\n\n    if ( oldDxcc != newDxcc )\n    {\n        /* No change */\n        RETURNCODE(oldStatus);\n    }\n\n    if ( oldBand == newBand\n         && oldMode == newMode )\n    {\n        if ( oldStatus < DxccStatus::Worked )\n        {\n            RETURNCODE(DxccStatus::Worked);\n        }\n        else\n        {\n            RETURNCODE(oldStatus);\n        }\n    }\n\n    /*************/\n    /* NewEntity */\n    /*************/\n    if ( oldStatus == DxccStatus::NewEntity )\n    {\n        if ( oldBand != newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewBandMode);\n        }\n\n        if ( oldBand != newBand\n             && oldMode == newMode )\n        {\n            RETURNCODE(DxccStatus::NewBand);\n        }\n\n        if ( oldBand == newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewMode);\n        }\n    }\n\n    /***************/\n    /* NewBandMode */\n    /***************/\n    if ( oldStatus == DxccStatus::NewBandMode )\n    {\n        if ( oldBand != newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewBandMode);\n        }\n\n        if ( oldBand != newBand\n             && oldMode == newMode )\n        {\n            RETURNCODE(DxccStatus::NewBand);\n        }\n\n        if ( oldBand == newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewMode);\n        }\n    }\n\n    /*************/\n    /* NewBand   */\n    /*************/\n    if ( oldStatus == DxccStatus::NewBand )\n    {\n        if ( oldBand != newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewBand);\n        }\n\n        if ( oldBand != newBand\n             && oldMode == newMode )\n        {\n            RETURNCODE(DxccStatus::NewBand);\n        }\n\n        if ( oldBand == newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewSlot);\n        }\n    }\n\n    /*************/\n    /* NewMode   */\n    /*************/\n    if ( oldStatus == DxccStatus::NewMode )\n    {\n        if ( oldBand != newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewMode);\n        }\n\n        if ( oldBand != newBand\n             && oldMode == newMode )\n        {\n            RETURNCODE(DxccStatus::NewSlot);\n        }\n\n        if ( oldBand == newBand\n             && oldMode != newMode )\n        {\n            RETURNCODE(DxccStatus::NewMode);\n        }\n    }\n\n    /*************/\n    /* NewSlot   */\n    /*************/\n    if ( oldStatus == DxccStatus::NewSlot )\n    {\n        RETURNCODE(DxccStatus::NewSlot);\n    }\n\n    /*************/\n    /* Worked   */\n    /*************/\n    if ( oldStatus == DxccStatus::Worked )\n    {\n        RETURNCODE(DxccStatus::Worked);\n    }\n\n    /***************/\n    /* Confirmed   */\n    /***************/\n    if ( oldStatus == DxccStatus::Confirmed )\n    {\n        RETURNCODE(DxccStatus::Confirmed);\n    }\n\n    RETURNCODE(DxccStatus::UnknownStatus);\n}\n\nqulonglong Data::dupeNewCountWhenQSOAdded(qulonglong oldCounter,\n                                          const QString &oldBand,\n                                          const QString &oldMode,\n                                          const QString &addedBand,\n                                          const QString &addedMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << oldCounter\n                                 << oldBand\n                                 << oldMode\n                                 << addedBand\n                                 << addedMode;\n\n    int dupeType = LogParam::getContestDupeType();\n    const QString &contestID = LogParam::getContestID();\n\n    qCDebug(runtime) << dupeType << contestID;\n\n    if ( contestID.isEmpty() )\n        return oldCounter;\n\n    bool shouldIncrease = (dupeType == DupeType::ALL_BANDS) ||\n                          (dupeType == DupeType::EACH_BAND && oldBand == addedBand) ||\n                          (dupeType == DupeType::EACH_BAND_MODE && oldBand == addedBand && oldMode == addedMode);\n\n    RETURNCODE( shouldIncrease ? oldCounter + 1 : oldCounter);\n}\n\nqulonglong Data::dupeNewCountWhenQSODelected(qulonglong oldCounter,\n                                             const QString &oldBand,\n                                             const QString &oldMode,\n                                             const QString &deletedBand,\n                                             const QString &deletedMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << oldCounter\n                                 << oldBand\n                                 << oldMode\n                                 << deletedBand\n                                 << deletedMode;\n\n    if ( oldCounter == 0 )\n        return 0;\n\n    int dupeType = LogParam::getContestDupeType();\n    const QString &contestID = LogParam::getContestID();\n\n    qCDebug(runtime) << dupeType << contestID;\n\n    if ( contestID.isEmpty() )\n        return oldCounter;\n\n    bool shouldDecrease = (dupeType == DupeType::ALL_BANDS) ||\n                          (dupeType == DupeType::EACH_BAND && oldBand == deletedBand) ||\n                          (dupeType == DupeType::EACH_BAND_MODE && oldBand == deletedBand && oldMode == deletedMode);\n\n    RETURNCODE( shouldDecrease ? oldCounter - 1 : oldCounter);\n}\n\n#undef RETURNCODE\n\nQColor Data::statusToColor(const DxccStatus &status, bool isDupe, const QColor &defaultColor) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << status << isDupe;\n\n    if ( isDupe )\n        return QColor(109, 109, 109, 100);\n\n    switch (status) {\n        case DxccStatus::NewEntity:\n            return QColor(255, 58, 9);\n        case DxccStatus::NewBand:\n        case DxccStatus::NewMode:\n        case DxccStatus::NewBandMode:\n            return QColor(76, 200, 80);\n        case DxccStatus::NewSlot:\n            return QColor(30, 180, 230);\n        case DxccStatus::Worked:\n            return QColor(255,165,0);\n        default:\n            return defaultColor;\n    }\n}\n\nQString Data::colorToHTMLColor(const QColor &in_color)\n{\n    FCT_IDENTIFICATION;\n\n    return in_color.name(QColor::HexRgb);\n}\n\nQString Data::statusToText(const DxccStatus &status) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << status;\n\n    switch (status) {\n        case DxccStatus::NewEntity:\n            return tr(\"New Entity\");\n        case DxccStatus::NewBand:\n            return tr(\"New Band\");\n        case DxccStatus::NewMode:\n            return tr(\"New Mode\");\n        case DxccStatus::NewBandMode:\n            return tr(\"New Band&Mode\");\n        case DxccStatus::NewSlot:\n            return tr(\"New Slot\");\n        case DxccStatus::Confirmed:\n            return tr(\"Confirmed\");\n        case DxccStatus::Worked:\n            return tr(\"Worked\");\n        default:\n            return QString(\"Unknown\");\n    }\n}\n\nint Data::getITUZMin()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << 1;\n\n    return 1;\n}\n\nint Data::getITUZMax()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << 90;\n\n    return 90;\n}\n\nint Data::getCQZMin()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << 1;\n\n    return 1;\n}\n\nint Data::getCQZMax()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << 40;\n\n    return 40;\n}\n\nQString Data::debugFilename()\n{\n    QDir dir(QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation));\n    const QString debugFilename = \"qlog_debug_\" + QDateTime::currentDateTime().toString(\"yyyyMMddhhmmss\") + \".log\";\n    return dir.filePath(debugFilename);\n}\n\ndouble Data::MHz2UserFriendlyFreq(double freqMHz,\n                                  QString &unit,\n                                  unsigned char &efectiveDecP)\n{\n    FCT_IDENTIFICATION;\n\n    if ( freqMHz < 0.001 )\n    {\n        unit = tr(\"Hz\");\n        efectiveDecP = 0;\n        return freqMHz * 1000000.0;\n    }\n\n    if ( freqMHz < 1 )\n    {\n        unit = tr(\"kHz\");\n        efectiveDecP = 3;\n        return freqMHz * 1000.0;\n    }\n\n    if ( freqMHz >= 1000 )\n    {\n        unit = tr(\"GHz\");\n        efectiveDecP = 3;\n        return freqMHz / 1000.0;\n    }\n\n    unit = tr(\"MHz\");\n    efectiveDecP = 3;\n    return freqMHz;\n}\n\nconst QStringList &Data::getContinentList()\n{\n    static const QStringList continents{\"AF\", \"AN\", \"AS\", \"EU\", \"NA\", \"OC\", \"SA\"};\n    return continents;\n}\n\nQPair<QString, QString> Data::legacyMode(const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    // used in the case of external programs that generate an invalid ADIF modes.\n    // Database Mode Table cannot be used because these programs have different mode-strings.\n\n    qCDebug(function_parameters) << mode;\n    return legacyModes.value(mode);\n}\n\nQString Data::getIANATimeZone(double lat, double lon)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << lat << lon;\n\n    QString ret;\n\n    if ( zd )\n    {\n        ret = ZDHelperSimpleLookupString(zd,\n                                         static_cast<float>(lat),\n                                         static_cast<float>(lon));\n    }\n\n    qCDebug(runtime) << ret;\n    return ret;\n}\n\nQStringList Data::sigIDList()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList sigLOV;\n    QSqlQuery query(QLatin1String(\"SELECT DISTINCT sig_intl FROM contacts\"));\n\n    while ( query.next() )\n        sigLOV << query.value(0).toString();\n\n    return sigLOV;\n}\n\nvoid Data::invalidateDXCCStatusCache(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    dxccStatusCache.invalidate(record.value(\"dxcc\").toInt(), StationProfilesManager::instance()->getCurProfile1().dxcc);\n}\n\nvoid Data::invalidateSetOfDXCCStatusCache(const QSet<uint> &entities)\n{\n    FCT_IDENTIFICATION;\n\n    int myDXCC = StationProfilesManager::instance()->getCurProfile1().dxcc;\n\n    for ( uint entity : entities )\n       dxccStatusCache.invalidate(entity, myDXCC);\n}\n\nvoid Data::clearDXCCStatusCache()\n{\n    FCT_IDENTIFICATION;\n\n    dxccStatusCache.clear();\n}\n\nqulonglong Data::countDupe(const QString &callsign,\n                           const QString &band,\n                           const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign\n                                 << band\n                                 << mode;\n\n    int dupeType = LogParam::getContestDupeType();\n    const QString &contestID = LogParam::getContestID();\n    const QDateTime &dupeStartTime = LogParam::getContestDupeDate();\n\n    qCDebug(runtime) << dupeType <<  dupeStartTime << contestID;\n\n    if ( contestID.isEmpty()\n         || dupeType == DupeType::NO_CHECK\n         || !dupeStartTime.isValid() )\n        return false;\n\n    QStringList whereClause =\n    {\n        \"callsign = :callsign\",\n        \"contest_id = :contestid\"\n    };\n\n    if ( dupeType >= DupeType::ALL_BANDS )\n        whereClause << QLatin1String(\"datetime(start_time) >= datetime(:date)\");\n\n    if ( dupeType >= DupeType::EACH_BAND)\n        whereClause << QLatin1String(\"band = :band\");\n\n    // FTx modes are stored with modes.dxcc = 'DIGITAL', so map FTx to DIGITAL.\n    const QString modeForQuery = ( mode == BandPlan::MODE_GROUP_STRING_FTx )\n                                 ? BandPlan::MODE_GROUP_STRING_DIGITAL\n                                 : mode;\n\n    if ( dupeType >= DupeType::EACH_BAND_MODE )\n    {\n        QString sql_mode = (modeForQuery != BandPlan::MODE_GROUP_STRING_CW &&\n                            modeForQuery != BandPlan::MODE_GROUP_STRING_PHONE &&\n                            modeForQuery != BandPlan::MODE_GROUP_STRING_DIGITAL)\n                            ? \"(SELECT modes.dxcc FROM modes WHERE modes.name = :mode LIMIT 1)\"\n                            : \":mode\";\n        whereClause << QString(\"m.dxcc = %1\").arg(sql_mode);\n    }\n\n    QString queryString(\"SELECT COUNT(1) \"\n                        \"FROM contacts c \"\n                        \"INNER JOIN modes m ON (m.name = c.mode) \"\n                        \"WHERE %1 \");\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(queryString.arg(whereClause.join(\" AND \"))))\n    {\n        qWarning() << \"Cannot prepare Select statement\" << queryString.arg(whereClause.join(\" AND \"));\n        return false;\n    }\n\n    query.bindValue(\":callsign\", callsign);\n    query.bindValue(\":date\", dupeStartTime);\n    query.bindValue(\":band\", band);\n    query.bindValue(\":mode\", modeForQuery);\n    query.bindValue(\":contestid\", contestID);\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute Select statement\" << query.lastError() << query.lastQuery();\n        return false;\n    }\n\n    return (query.first()) ? query.value(0).toULongLong() : 0ULL;\n}\n\nQString Data::safeQueryString(const QUrlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n    QUrlQuery safe;\n    const QList<QPair<QString, QString>> &items = query.queryItems(QUrl::FullyDecoded);\n\n    for ( const auto &item : items )\n    {\n        if ( item.first.compare(\"password\", Qt::CaseInsensitive) == 0\n             || item.first.compare(\"code\", Qt::CaseInsensitive) == 0)\n            safe.addQueryItem(item.first, \"***MASKED***\");\n        else\n            safe.addQueryItem(item.first, item.second);\n    }\n\n    return safe.query(QUrl::FullyEncoded);\n}\n\nvoid Data::loadContests()\n{\n    FCT_IDENTIFICATION;\n\n    QFile file(\":/res/data/contests.json\");\n    file.open(QIODevice::ReadOnly | QIODevice::Text);\n    QByteArray data = file.readAll();\n\n    const QList<QVariant> objectList = QJsonDocument::fromJson(data).toVariant().toList();\n    for ( const QVariant &object : objectList )\n    {\n        const QVariantMap &contestData = object.toMap();\n        const QString &id = contestData.value(\"id\").toString();\n        const QString &name = contestData.value(\"name\").toString();\n        contests.insert(id, name);\n    }\n}\n\nvoid Data::loadPropagationModes()\n{\n    FCT_IDENTIFICATION;\n\n    QFile file(\":/res/data/propagation_modes.json\");\n    file.open(QIODevice::ReadOnly | QIODevice::Text);\n    QByteArray data = file.readAll();\n\n    const QList<QVariant> objects = QJsonDocument::fromJson(data).toVariant().toList();\n\n    for ( const QVariant &object : objects )\n    {\n        const QVariantMap &propagationModeData = object.toMap();\n        const QString &id = propagationModeData.value(\"id\").toString();\n        const QString &name = tr(propagationModeData.value(\"name\").toString().toUtf8().constData());\n        propagationModes.insert(id, name);\n    }\n}\n\nvoid Data::loadLegacyModes()\n{\n    FCT_IDENTIFICATION;\n\n    // Load conversion table from non-ADIF mode to ADIF mode/submode\n    // used in the case of external programs that generate an invalid ADIF modes.\n    // Database Mode Table cannot be used because these programs have different mode-strings.\n\n    QFile file(\":/res/data/legacy_modes.json\");\n    file.open(QIODevice::ReadOnly | QIODevice::Text);\n    QByteArray data = file.readAll();\n\n    QVariantMap extModes = QJsonDocument::fromJson(data).toVariant().toMap();\n    const QList<QString> keys = extModes.keys();\n\n    for ( const QString &key : keys )\n    {\n        const QVariantMap &legacyModeData = extModes[key].toMap();\n        const QString &mode = legacyModeData.value(\"mode\").toString();\n        const QString &submode = legacyModeData.value(\"submode\").toString();\n        QPair<QString, QString> modes = QPair<QString, QString>(mode, submode);\n        legacyModes.insert(key, modes);\n    }\n}\n\nvoid Data::loadDxccFlags()\n{\n    FCT_IDENTIFICATION;\n\n    QFile file(\":/res/data/dxcc.json\");\n    file.open(QIODevice::ReadOnly | QIODevice::Text);\n    QByteArray data = file.readAll();\n\n    const QList<QVariant> &objects = QJsonDocument::fromJson(data).toVariant().toList();\n\n    for ( const QVariant &object : objects )\n    {\n        const QVariantMap &dxccData = object.toMap();\n        int id = dxccData.value(\"id\").toInt();\n        dxccEntityStaticInfo.insert(id, dxccData);\n    }\n}\n\nvoid Data::loadSatModes()\n{\n    FCT_IDENTIFICATION;\n\n    QFile file(\":/res/data/sat_modes.json\");\n    file.open(QIODevice::ReadOnly | QIODevice::Text);\n    QByteArray data = file.readAll();\n\n    const QList<QVariant> &objects = QJsonDocument::fromJson(data).toVariant().toList();\n    for ( const QVariant &object : objects )\n    {\n        const QVariantMap &satModesData = object.toMap();\n        const QString &id = satModesData.value(\"id\").toString();\n        const QString &name = satModesData.value(\"name\").toString();\n        satModes.insert(id, name);\n    }\n}\n\nvoid Data::loadIOTA()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query(\"SELECT iotaid, islandname FROM iota\");\n\n    while ( query.next() )\n    {\n        const QString &iotaID = query.value(0).toString();\n        const QString &islandName = query.value(1).toString();\n        iotaRef.insert(iotaID, islandName);\n    }\n}\n\nvoid Data::loadSOTA()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query(\"SELECT summit_code FROM sota_summits\");\n\n    while ( query.next() )\n    {\n        const QString &summitCode = query.value(0).toString();\n        sotaRefID.insert(summitCode, QString());\n    }\n}\n\nvoid Data::loadWWFF()\n{\n    QSqlQuery query(\"SELECT reference FROM wwff_directory\");\n\n    while ( query.next() )\n    {\n        const QString &reference = query.value(0).toString();\n        wwffRefID.insert(reference, QString());\n    }\n}\n\nvoid Data::loadPOTA()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query(\"SELECT reference FROM pota_directory\");\n\n    while ( query.next() )\n    {\n        const QString &reference = query.value(0).toString();\n        potaRefID.insert(reference, QString());\n    }\n}\n\nQCompleter* Data::createCountyCompleter(int dxcc, QObject *parent)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery query;\n\n    if ( dxcc != 0 )\n    {\n        query.prepare(\"SELECT code FROM adif_enum_secondary_subdivision \"\n                      \"WHERE dxcc = :dxcc ORDER BY code\");\n        query.bindValue(\":dxcc\", dxcc);\n    }\n    else\n        query.prepare(\"SELECT code FROM adif_enum_secondary_subdivision ORDER BY code\");\n\n    if ( !query.exec() )\n    {\n        qCWarning(runtime) << query.lastError().text();\n        return nullptr;\n    }\n\n    QStringList list;\n    while ( query.next() )\n        list << query.value(0).toString();\n\n    if ( list.isEmpty() )\n        return nullptr;\n\n    QCompleter *completer = new QCompleter(list, parent);\n    completer->setCaseSensitivity(Qt::CaseInsensitive);\n    completer->setFilterMode(Qt::MatchStartsWith);\n    completer->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    return completer;\n}\n\nvoid Data::loadTZ()\n{\n    FCT_IDENTIFICATION;\n\n    QFile file (\":/res/data/timezone21.bin\");\n    file.open(QIODevice::ReadOnly);\n    uchar *tzMap = file.map(0, file.size());\n\n    if ( tzMap )\n    {\n        zd = ZDOpenDatabaseFromMemory(tzMap, file.size());\n        if ( !zd )\n        {\n            qWarning() << \"Cannot open TZ Database\";\n        }\n    }\n    else\n    {\n        qWarning() << \"Cannot map TZ File to memory\";\n    }\n\n}\n\nDxccEntity Data::lookupDxcc(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n#if 0\n    //qInfo() << \"Start AD1C\";\n    DxccEntity ad1cDXCCData = lookupDxccAD1C(callsign);\n    //qInfo() << \"Finished AD1C\";\n    DxccEntity clublogDXCCData = lookupDxccClublog(callsign);\n    //qInfo() << \"Finished Clublog\";\n    if ( ad1cDXCCData.dxcc != clublogDXCCData.dxcc\n         || ad1cDXCCData.cqz != clublogDXCCData.cqz\n         || ad1cDXCCData.ituz != clublogDXCCData.ituz)\n    {\n        qInfo(runtime) << \"DIFF for call \" << callsign\n                         << \"AD1C:\" << ad1cDXCCData.dxcc << ad1cDXCCData.cqz << ad1cDXCCData.ituz\n                         << \"Clublog:\" << clublogDXCCData.dxcc << clublogDXCCData.cqz << clublogDXCCData.ituz;\n    }\n    //qInfo() << \"AD1C:\" << ad1cDXCCData.dxcc << ad1cDXCCData.cqz << ad1cDXCCData.ituz\n      //         << \"Clublog:\" << clublogDXCCData.dxcc << clublogDXCCData.cqz << clublogDXCCData.ituz;\n    return ad1cDXCCData;\n#else\n    // LF: The AD1C method seems more accurate for current data regarding ITU and CQZ.\n    // The Clublog method is good for determining historical data and CQZ, but unfortunately,\n    // the ITU zone is not reliable in this method because it’s not listed and has to be\n    // calculated. Therefore, I decided to use the AD1C method as the general approach and only\n    // use Clublog in exceptional cases. Once Clublog starts distributing ITUZ, we should\n    // completely switch to the Clublog method.\n    // I also believes that the AD1C method is more accurate in determining special exceptions\n    // for American callsigns.\n    return lookupDxccAD1C(callsign);\n#endif\n}\n\nDxccEntity Data::lookupDxccAD1C(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n    static QCache<QString, DxccEntity> localCache(1000);\n\n    qCDebug(function_parameters) << callsign;\n\n    if ( callsign.isEmpty())\n        return  DxccEntity();\n\n    DxccEntity dxccRet;\n    DxccEntity *dxccCached = localCache.object(callsign);\n\n    if ( dxccCached )\n    {\n        dxccRet = *dxccCached;\n    }\n    else\n    {\n        if ( ! isDXCCQueryValid )\n        {\n            qWarning() << \"Cannot prepare Select statement\";\n            return DxccEntity();\n        }\n\n        QString lookupPrefix = callsign; // use the callsign with optional prefix as default to find the dxcc\n        const Callsign parsedCallsign(callsign); // use Callsign to split the callsign into its parts\n\n        if ( parsedCallsign.isValid() )\n        {\n            QString suffix = parsedCallsign.getSuffix();\n            if ( suffix.length() == 1 ) // some countries add single numbers as suffix to designate a call area, e.g. /4\n            {\n                bool isNumber = false;\n                (void)suffix.toInt(&isNumber);\n                if ( isNumber )\n                {\n                    lookupPrefix = parsedCallsign.getBasePrefix() + suffix; // use the call prefix and the number from the suffix to find the dxcc\n                }\n            }\n            else if ( suffix.length() > 1\n                      && !parsedCallsign.secondarySpecialSuffixes.contains(suffix) ) // if there is more than one character and it is not one of the special suffixes, we definitely have a call prefix as suffix\n            {\n                lookupPrefix = suffix;\n            }\n        }\n\n        queryDXCC.bindValue(\":callsign\", lookupPrefix);\n\n        if ( ! queryDXCC.exec() )\n        {\n            qWarning() << \"Cannot execute Select statement\" << queryDXCC.lastError() << queryDXCC.lastQuery();\n            return DxccEntity();\n        }\n\n        if ( queryDXCC.next() )\n        {\n            dxccRet.dxcc = queryDXCC.value(0).toInt();\n            dxccRet.country = queryDXCC.value(1).toString();\n            dxccRet.prefix = queryDXCC.value(2).toString();\n            dxccRet.cont = queryDXCC.value(3).toString();\n            dxccRet.cqz = queryDXCC.value(4).toInt();\n            dxccRet.ituz = queryDXCC.value(5).toInt();\n            dxccRet.latlon[0] = queryDXCC.value(6).toDouble();\n            dxccRet.latlon[1] = queryDXCC.value(7).toDouble();\n            dxccRet.tz = queryDXCC.value(8).toFloat();\n            bool isExactMatch = queryDXCC.value(9).toBool();\n            dxccRet.flag = dxccFlag(dxccRet.dxcc);\n\n            if ( !isExactMatch )\n            {\n                // find the exceptions to the exceptions\n                if (  dxccRet.prefix == \"KG4\" && parsedCallsign.getBase().size() != 5 )\n                {\n                    //only KG4AA - KG4ZZ are US Navy in Guantanamo Bay. Other KG4s are USA\n                    dxccRet = lookupDxccID(291); // USA\n\n                    //do not overwrite the original prefix\n                    dxccRet.prefix = \"KG4\";\n                }\n            }\n\n            dxccCached = new DxccEntity;\n\n            if ( dxccCached )\n            {\n                *dxccCached = dxccRet;\n                localCache.insert(callsign, dxccCached);\n            }\n        }\n        else\n        {\n            dxccRet.dxcc = 0;\n            dxccRet.ituz = 0;\n            dxccRet.cqz = 0;\n            dxccRet.tz = 0;\n        }\n    }\n\n    return dxccRet;\n}\n\nDxccEntity Data::lookupDxccIDAD1C(const int dxccID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxccID;\n\n    if ( !isDXCCIDAD1CQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return DxccEntity();\n    }\n\n    queryDXCCIDAD1C.bindValue(\":dxccid\", dxccID);\n    if ( ! queryDXCCIDAD1C.exec() )\n    {\n        qWarning() << \"Cannot execte Select statement\" << queryDXCCIDAD1C.lastError();\n        return DxccEntity();\n    }\n\n    DxccEntity dxccRet;\n\n    if ( queryDXCCIDAD1C.next() )\n    {\n        dxccRet.dxcc = queryDXCCIDAD1C.value(0).toInt();\n        dxccRet.country = queryDXCCIDAD1C.value(1).toString();\n        dxccRet.prefix = queryDXCCIDAD1C.value(2).toString();\n        dxccRet.cont = queryDXCCIDAD1C.value(3).toString();\n        dxccRet.cqz = queryDXCCIDAD1C.value(4).toInt();\n        dxccRet.ituz = queryDXCCIDAD1C.value(5).toInt();\n        dxccRet.latlon[0] = queryDXCCIDAD1C.value(6).toDouble();\n        dxccRet.latlon[1] = queryDXCCIDAD1C.value(7).toDouble();\n        dxccRet.tz = queryDXCCIDAD1C.value(8).toFloat();\n        dxccRet.flag = dxccFlag(dxccRet.dxcc);\n    }\n    else\n    {\n        dxccRet.dxcc = 0;\n        dxccRet.ituz = 0;\n        dxccRet.cqz = 0;\n        dxccRet.tz = 0;\n    }\n    return dxccRet;\n}\n\nDxccEntity Data::lookupDxccIDClublog(const int dxccID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxccID;\n\n    if ( !isDXCCIDClublogQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return DxccEntity();\n    }\n\n    queryDXCCIDClublog.bindValue(\":dxccid\", dxccID);\n    if ( ! queryDXCCIDClublog.exec() )\n    {\n        qWarning() << \"Cannot execte Select statement\" << queryDXCCIDClublog.lastError();\n        return DxccEntity();\n    }\n\n    DxccEntity dxccRet;\n\n    if ( queryDXCCIDClublog.next() )\n    {\n        dxccRet.dxcc = queryDXCCIDClublog.value(0).toInt();\n        dxccRet.country = queryDXCCIDClublog.value(1).toString();\n        dxccRet.prefix = queryDXCCIDClublog.value(2).toString();\n        dxccRet.cont = queryDXCCIDClublog.value(3).toString();\n        dxccRet.cqz = queryDXCCIDClublog.value(4).toInt();\n        dxccRet.ituz = queryDXCCIDClublog.value(5).toInt();\n        dxccRet.latlon[0] = queryDXCCIDClublog.value(6).toDouble();\n        dxccRet.latlon[1] = queryDXCCIDClublog.value(7).toDouble();\n        dxccRet.tz = queryDXCCIDClublog.value(8).toFloat();\n        dxccRet.flag = dxccFlag(dxccRet.dxcc);\n    }\n    else\n    {\n        dxccRet.dxcc = 0;\n        dxccRet.ituz = 0;\n        dxccRet.cqz = 0;\n        dxccRet.tz = 0;\n    }\n    return dxccRet;\n}\n\nDxccEntity Data::lookupDxccID(const int dxccID)\n{\n    FCT_IDENTIFICATION;\n\n    // LF: The AD1C method seems more accurate for current data regarding ITU and CQZ.\n    // The Clublog method is good for determining historical data and CQZ, but unfortunately,\n    // the ITU zone is not reliable in this method because it’s not listed and has to be\n    // calculated. Therefore, I decided to use the AD1C method as the general approach and only\n    // use Clublog in exceptional cases. Once Clublog starts distributing ITUZ, we should\n    // completely switch to the Clublog method.\n    // I also believes that the AD1C method is more accurate in determining special exceptions\n    // for American callsigns.\n    return lookupDxccIDAD1C(dxccID);\n}\n\nDxccEntity Data::lookupDxccClublog(const QString &callsign, const QDateTime &date)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    if ( callsign.isEmpty()) return  DxccEntity();\n\n    if ( ! isDXCCClublogQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return DxccEntity();\n    }\n\n    QString lookupPrefix = callsign; // use the callsign with optional prefix as default to find the dxcc\n    const Callsign parsedCallsign(callsign); // use Callsign to split the callsign into its parts\n\n    if ( parsedCallsign.isValid() )\n    {\n        QString suffix = parsedCallsign.getSuffix();\n        if ( suffix.length() == 1 ) // some countries add single numbers as suffix to designate a call area, e.g. /4\n        {\n            bool isNumber = false;\n            (void)suffix.toInt(&isNumber);\n            if ( isNumber )\n            {\n                lookupPrefix = parsedCallsign.getBasePrefix() + suffix; // use the call prefix and the number from the suffix to find the dxcc\n            }\n        }\n        else if ( suffix.length() > 1\n                  && !parsedCallsign.secondarySpecialSuffixes.contains(suffix) ) // if there is more than one character and it is not one of the special suffixes, we definitely have a call prefix as suffix\n        {\n            lookupPrefix = suffix;\n        }\n    }\n\n    queryDXCCClublog.bindValue(\":modifiedcall\", lookupPrefix);\n    queryDXCCClublog.bindValue(\":exactcall\", callsign);\n    queryDXCCClublog.bindValue(\":dxccdate\", date);\n\n    if ( ! queryDXCCClublog.exec() )\n    {\n        qWarning() << \"Cannot execute Select statement\"\n                   << queryDXCCClublog.lastError()\n                   << queryDXCCClublog.lastQuery();\n        return DxccEntity();\n    }\n\n    DxccEntity dxccRet;\n    const DxccEntity &ad1cDXCCData = lookupDxccAD1C(callsign);\n\n    if ( queryDXCCClublog.first() )\n    {\n        dxccRet.dxcc = queryDXCCClublog.value(0).toInt();\n        dxccRet.country = queryDXCCClublog.value(1).toString();\n        dxccRet.prefix = queryDXCCClublog.value(2).toString();\n        dxccRet.cont = queryDXCCClublog.value(3).toString();\n        dxccRet.cqz = queryDXCCClublog.value(4).toInt();\n        dxccRet.ituz = queryDXCCClublog.value(5).toInt();\n        dxccRet.latlon[0] = queryDXCCClublog.value(6).toDouble();\n        dxccRet.latlon[1] = queryDXCCClublog.value(7).toDouble();\n        dxccRet.tz = queryDXCCClublog.value(8).toFloat();\n        bool isExactMatch = queryDXCCClublog.value(9).toBool();\n        dxccRet.flag = dxccFlag(dxccRet.dxcc);\n\n        if ( !isExactMatch )\n        {\n            // find the exceptions to the exceptions\n            if (  dxccRet.prefix == \"KG4\" && parsedCallsign.getBase().size() != 5 )\n            {\n                //only KG4AA - KG4ZZ are US Navy in Guantanamo Bay. Other KG4s are USA\n                dxccRet = lookupDxccID(291); // USA\n\n                //do not overwrite the original prefix\n                dxccRet.prefix = \"KG4\";\n            }\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"DXCC not found for \" << lookupPrefix << \"; Using AD1C Info\";\n        dxccRet = ad1cDXCCData;\n    }\n\n    if ( dxccRet.ituz == 0 )\n    {\n        qCDebug(runtime) << \"Zone exception, using AD1C Info Info to find ITUZ for \" << callsign;\n\n        if ( ad1cDXCCData.dxcc == dxccRet.dxcc && ad1cDXCCData.cqz == dxccRet.cqz )\n        {\n            qCDebug(runtime) << \"Fixing ITUZ for call\" << callsign;\n            dxccRet.ituz = ad1cDXCCData.ituz;\n        }\n        else\n        {\n            qCDebug(runtime) << \"not match\" << callsign\n                             << ad1cDXCCData.dxcc << dxccRet.dxcc\n                             << ad1cDXCCData.cqz << dxccRet.cqz;\n        }\n    }\n\n    if ( ad1cDXCCData.dxcc == dxccRet.dxcc && ad1cDXCCData.cqz == dxccRet.cqz )\n        dxccRet.ituz = ad1cDXCCData.ituz;\n\n    return dxccRet;\n}\n\nSOTAEntity Data::lookupSOTA(const QString &SOTACode)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! isSOTAQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return SOTAEntity();\n    }\n\n    querySOTA.bindValue(\":code\", SOTACode.toUpper());\n\n    if ( ! querySOTA.exec() )\n    {\n        qWarning() << \"Cannot execte Select statement\" << querySOTA.lastError();\n        return SOTAEntity();\n    }\n\n    SOTAEntity SOTARet;\n\n    if (querySOTA.next())\n    {\n        SOTARet.summitCode = querySOTA.value(0).toString();\n        SOTARet.associationName = querySOTA.value(1).toString();\n        SOTARet.regionName = querySOTA.value(2).toString();\n        SOTARet.summitName = querySOTA.value(3).toString();\n        SOTARet.altm = querySOTA.value(4).toInt();\n        SOTARet.altft = querySOTA.value(5).toInt();\n        SOTARet.gridref1 = querySOTA.value(6).toDouble();\n        SOTARet.gridref2 = querySOTA.value(7).toDouble();\n        SOTARet.longitude = querySOTA.value(8).toDouble();\n        SOTARet.latitude = querySOTA.value(9).toDouble();\n        SOTARet.points = querySOTA.value(10).toInt();\n        SOTARet.bonusPoints = querySOTA.value(11).toInt();\n        SOTARet.validFrom = querySOTA.value(12).toDate();\n        SOTARet.validTo = querySOTA.value(13).toDate();\n    }\n    else\n    {\n        SOTARet.altft = 0;\n        SOTARet.altm  = 0;\n        SOTARet.gridref1 = 0.0;\n        SOTARet.gridref2  = 0.0;\n        SOTARet.longitude = 0.0;\n        SOTARet.latitude  = 0.0;\n        SOTARet.points = 0;\n        SOTARet.bonusPoints  = 0;\n    }\n\n    return SOTARet;\n}\n\nPOTAEntity Data::lookupPOTA(const QString &POTACode)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! isPOTAQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return POTAEntity();\n    }\n\n    queryPOTA.bindValue(\":code\", POTACode.toUpper());\n\n    if ( ! queryPOTA.exec() )\n    {\n        qWarning() << \"Cannot execte Select statement\" << queryPOTA.lastError();\n        return POTAEntity();\n    }\n\n    POTAEntity POTARet;\n\n    if (queryPOTA.next())\n    {\n        POTARet.reference = queryPOTA.value(0).toString();\n        POTARet.name = queryPOTA.value(1).toString();\n        POTARet.active = queryPOTA.value(2).toBool();\n        POTARet.entityID = queryPOTA.value(3).toInt();\n        POTARet.locationDesc = queryPOTA.value(4).toString();\n        POTARet.longitude = queryPOTA.value(5).toDouble();\n        POTARet.latitude = queryPOTA.value(6).toDouble();\n        POTARet.grid = queryPOTA.value(7).toString();\n    }\n    else\n    {\n        POTARet.active = false;\n        POTARet.entityID = 0;\n        POTARet.longitude = 0.0;\n        POTARet.latitude  = 0.0;\n    }\n\n    return POTARet;\n}\n\nWWFFEntity Data::lookupWWFF(const QString &reference)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! isWWFFQueryValid )\n    {\n        qWarning() << \"Cannot prepare Select statement\";\n        return WWFFEntity();\n    }\n\n    queryWWFF.bindValue(\":reference\", reference.toUpper());\n\n    if ( ! queryWWFF.exec() )\n    {\n        qWarning() << \"Cannot execte Select statement\" << queryWWFF.lastError();\n        return WWFFEntity();\n    }\n\n    WWFFEntity WWFFRet;\n\n    if (queryWWFF.next())\n    {\n        WWFFRet.reference = queryWWFF.value(0).toString();\n        WWFFRet.status = queryWWFF.value(1).toString();\n        WWFFRet.name = queryWWFF.value(2).toString();\n        WWFFRet.program = queryWWFF.value(3).toString();\n        WWFFRet.dxcc = queryWWFF.value(4).toString();\n        WWFFRet.state = queryWWFF.value(5).toString();\n        WWFFRet.county = queryWWFF.value(6).toString();\n        WWFFRet.continent = queryWWFF.value(7).toString();\n        WWFFRet.iota = queryWWFF.value(8).toString();\n        WWFFRet.iaruLocator = queryWWFF.value(9).toString();\n        WWFFRet.latitude = queryWWFF.value(10).toDouble();\n        WWFFRet.longitude = queryWWFF.value(11).toDouble();\n        WWFFRet.iucncat = queryWWFF.value(12).toString();\n        WWFFRet.validFrom = queryWWFF.value(13).toDate();\n        WWFFRet.validTo = queryWWFF.value(14).toDate();\n    }\n    else\n    {\n        WWFFRet.longitude = 0.0;\n        WWFFRet.latitude  = 0.0;\n    }\n\n    return WWFFRet;\n}\n\n"
  },
  {
    "path": "data/Data.h",
    "content": "#ifndef QLOG_DATA_DATA_H\n#define QLOG_DATA_DATA_H\n\n#include <QtCore>\n#include <QSqlQuery>\n#include \"Dxcc.h\"\n#include \"SOTAEntity.h\"\n#include \"WWFFEntity.h\"\n#include \"POTAEntity.h\"\n#include \"core/zonedetect.h\"\n#include \"core/QuadKeyCache.h\"\n\nclass QCompleter;\n\nclass Data : public QObject\n{\n    Q_OBJECT\npublic:\n\n    enum DupeType\n    {\n        ALL_BANDS = 1,\n        EACH_BAND = 2,\n        EACH_BAND_MODE = 3,\n        NO_CHECK = 4\n    };\n\n    enum SeqType\n    {\n        SINGLE = 1,\n        PER_BAND = 2\n    };\n\n    const QMap<QString, QString> qslSentEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\"R\", tr(\"Requested\")},\n        {\"Q\", tr(\"Queued\")},\n        {\"I\", tr(\"Invalid\")}\n    };\n    const QMap<QString, QString> qslSentViaEnum = {\n        {\"B\", tr(\"Bureau\")},\n        {\"D\", tr(\"Direct\")},\n        {\"E\", tr(\"Electronic\")},\n        {\" \", tr(\"Blank\")}\n    };\n    const QMap<QString, QString> qslRcvdEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\"R\", tr(\"Requested\")},\n        {\"I\", tr(\"Invalid\")}\n    };\n    const QMap<QString, QString> uploadStatusEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\"M\", tr(\"Modified\")},\n        {\" \", tr(\"Blank\")}\n    };\n    const QMap<QString, QString> antPathEnum = {\n        {\"G\", tr(\"Grayline\")},\n        {\"O\", tr(\"Other\")},\n        {\"S\", tr(\"Short Path\")},\n        {\"L\", tr(\"Long Path\")},\n        {\" \", tr(\"Blank\")}\n    };\n    const QMap<QString, QString> boolEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\" \", tr(\"Blank\")}\n    };\n    const QMap<QString, QString> qsoCompleteEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\"Nil\", tr(\"Not Heard\")},\n        {\"?\", tr(\"Uncertain\")},\n        {\" \", tr(\"Blank\")}\n    };\n    const QMap<QString, QString> morseKeyTypeEnum = {\n        {\"SK\", tr(\"Straight Key\")},\n        {\"SS\", tr(\"Sideswiper\")},\n        {\"BUG\", tr(\"Mechanical semi-automatic keyer or Bug\")},\n        {\"FAB\", tr(\"Mechanical fully-automatic keyer or Bug\")},\n        {\"SP\", tr(\"Single Paddle\")},\n        {\"DP\", tr(\"Dual Paddle\")},\n        {\"CPU\", tr(\"Computer Driven\")},\n        {\" \", tr(\"Blank\")}\n        };\n    const QMap<QString, QString> downloadStatusEnum = {\n        {\"Y\", tr(\"Yes\")},\n        {\"N\", tr(\"No\")},\n        {\"I\", tr(\"Invalid\")},\n        {\" \", tr(\"Blank\")}\n    };\n\n    const QMap<QString, QString> eqslAgEnum = {\n        {\"Y\", tr(\"Confirmed (AG)\")},\n        {\"N\", tr(\"Confirmed (no AG)\")},\n        {\"U\", tr(\"Unknown\")},\n        {\" \", tr(\"Blank\")}\n    };\n\n    explicit Data(QObject *parent = nullptr);\n    ~Data();\n    static Data* instance()\n    {\n        static Data instance;\n        return &instance;\n    };\n\n    static DxccStatus dxccNewStatusWhenQSOAdded(const DxccStatus &oldStatus,\n                                       const qint32 oldDxcc,\n                                       const QString &oldBand,\n                                       const QString &oldMode,\n                                       const qint32 newDxcc,\n                                       const QString &newBand,\n                                       const QString &newMode);\n    static qulonglong dupeNewCountWhenQSOAdded(qulonglong oldCounter,\n                                               const QString &oldBand,\n                                               const QString &oldMode,\n                                               const QString &addedBand,\n                                               const QString &addedMode);\n    static qulonglong dupeNewCountWhenQSODelected(qulonglong oldCounter,\n                                                  const QString &oldBand,\n                                                  const QString &oldMode,\n                                                  const QString &deletedBand,\n                                                  const QString &deletedMode);\n\n    static QColor statusToColor(const DxccStatus &status, bool isDupe, const QColor &defaultColor);\n    static QString colorToHTMLColor(const QColor&);\n    static QString statusToText(const DxccStatus &status);\n    static QString removeAccents(const QString &input);\n    static int getITUZMin();\n    static int getITUZMax();\n    static int getCQZMin();\n    static int getCQZMax();\n    static QString debugFilename();\n    static double MHz2UserFriendlyFreq(double,\n                                       QString &unit,\n                                       unsigned char &efectiveDecP);\n    static const QStringList& getContinentList();\n\n    static qulonglong countDupe(const QString& callsign,\n                                const QString &band,\n                                const QString &mode);\n\n    static QString safeQueryString(const QUrlQuery &query);\n    DxccStatus dxccStatus(int dxcc, const QString &band, const QString &mode);\n    QStringList contestList();\n    QStringList propagationModesList() const { return QStringList{\"\"} + propagationModes.values(); }\n    QStringList propagationModesIDList() const { return QStringList{\"\"} + propagationModes.keys(); }\n    QString propagationModeTextToID(const QString &propagationText) const { return propagationModes.key(propagationText);}\n    QString propagationModeIDToText(const QString &propagationID) const { return propagationModes.value(propagationID);}\n    DxccEntity lookupDxcc(const QString &callsign);\n    DxccEntity lookupDxccID(const int dxccID);\n    DxccEntity lookupDxccAD1C(const QString &callsign);\n    DxccEntity lookupDxccIDAD1C(const int dxccID);\n    DxccEntity lookupDxccClublog(const QString &callsign, const QDateTime &date = QDateTime::currentDateTimeUtc());\n    DxccEntity lookupDxccIDClublog(const int dxccID);\n    SOTAEntity lookupSOTA(const QString &SOTACode);\n    POTAEntity lookupPOTA(const QString &POTACode);\n    WWFFEntity lookupWWFF(const QString &reference);\n    const QString dxccFlag(int dxcc) const {return dxccEntityStaticInfo.value(dxcc).value(\"flag\").toString();};\n    const QString dxccName(int dxcc) const {return dxccEntityStaticInfo.value(dxcc).value(\"name\").toString();};\n    int dxccITUZ(int dxcc) const {return dxccEntityStaticInfo.value(dxcc).value(\"ituz\").toInt();};\n    QPair<QString, QString> legacyMode(const QString &mode);\n    QStringList satModeList() { return satModes.values();}\n    QStringList satModesIDList() { return satModes.keys(); }\n    QString satModeTextToID(const QString &satModeText) { return satModes.key(satModeText);}\n    QString satModeIDToText(const QString &satModeID) { return satModes.value(satModeID);}\n    QStringList iotaList() { return iotaRef.values();}\n    QStringList iotaIDList() { return iotaRef.keys();}\n    QString iotaTextToID(const QString &iotaText) { return iotaRef.key(iotaText);}\n    QStringList sotaIDList() { return sotaRefID.keys();}\n    QStringList wwffIDList() { return wwffRefID.keys();}\n    QStringList potaIDList() { return potaRefID.keys();}\n    QString getIANATimeZone(double, double);\n    QStringList sigIDList();\n    static QCompleter* createCountyCompleter(int dxcc, QObject *parent = nullptr);\n\nsignals:\n\npublic slots:\n    void invalidateDXCCStatusCache(const QSqlRecord &record);\n    void invalidateSetOfDXCCStatusCache(const QSet<uint> &entities);\n    void clearDXCCStatusCache();\n\nprivate:\n    void loadContests();\n    void loadPropagationModes();\n    void loadLegacyModes();\n    void loadDxccFlags();\n    void loadSatModes();\n    void loadIOTA();\n    void loadSOTA();\n    void loadWWFF();\n    void loadPOTA();\n    void loadTZ();\n\n    QHash<int, QVariantMap> dxccEntityStaticInfo;\n    QMap<QString, QString> contests;\n    QMap<QString, QString> propagationModes;\n    QMap<QString, QPair<QString, QString>> legacyModes;\n    QMap<QString, QString> satModes;\n    QMap<QString, QString> iotaRef;\n    QMap<QString, QString> sotaRefID;\n    QMap<QString, QString> wwffRefID;\n    QMap<QString, QString> potaRefID;\n    ZoneDetect * zd;\n    QSqlQuery queryDXCC;\n    QSqlQuery queryDXCCIDAD1C;\n    QSqlQuery queryDXCCIDClublog;\n    QSqlQuery queryDXCCClublog;\n    QSqlQuery querySOTA;\n    QSqlQuery queryWWFF;\n    QSqlQuery queryPOTA;\n    bool isDXCCQueryValid;\n    bool isDXCCClublogQueryValid;\n    bool isSOTAQueryValid;\n    bool isWWFFQueryValid;\n    bool isPOTAQueryValid;\n    bool isDXCCIDAD1CQueryValid;\n    bool isDXCCIDClublogQueryValid;\n    QuadKeyCache<DxccStatus> dxccStatusCache;\n\n    static const char translitTab[];\n    static const int tranlitIndexMap[];\n};\n\n#endif // QLOG_DATA_DATA_H\n"
  },
  {
    "path": "data/DxServerString.cpp",
    "content": "#include <QRegularExpression>\n#include \"DxServerString.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.dxserverstring\");\n\nDxServerString::DxServerString(const QString &connectString,\n                               const QString &defaultUsername) :\n    port(7300),\n    valid(false)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isValidServerString(connectString) )\n        return;\n\n    // serverSelect format is:\n    //   [username@]hostname:port\n    // username is not mandatory\n    QStringList serverElements = connectString.split(\":\");\n\n    username = defaultUsername;\n\n    if ( serverElements[0].contains(QStringLiteral(\"@\")) )\n    {\n        QStringList hostNameElements = serverElements[0].split(QStringLiteral(\"@\"));\n        username = hostNameElements[0];\n        hostname = hostNameElements[1];\n    }\n    else\n    {\n        hostname = serverElements[0];\n    }\n\n    port = serverElements[1].toInt();  // servername is verified, therefore it is not needed to check\n    // whether the variable \"server\" contains hostname and port\n    valid = true;\n}\n\nconst QRegularExpression DxServerString::serverStringRegEx()\n{\n    FCT_IDENTIFICATION;\n    return QRegularExpression(QStringLiteral(\"^([a-z0-9\\\\-._~%!$&'()*+,;=]+@)?(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?):([0-9]{1,5})$|^([a-z0-9\\\\-._~%!$&'()*+,;=]+@)?(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*([A-Za-z]|[A-Za-z][A-Za-z0-9\\\\-]*[A-Za-z0-9]):([0-9]{1,5})$\"),\n                              QRegularExpression::CaseInsensitiveOption);\n\n}\n\nbool DxServerString::isValidServerString(const QString &connectString)\n{\n    FCT_IDENTIFICATION;\n\n    QRegularExpressionMatch stringMatch = serverStringRegEx().match(connectString);\n\n    bool ret = stringMatch.hasMatch();\n    qCDebug(runtime) << ret;\n    return ret;\n}\n\nconst QString DxServerString::getPasswordStorageKey() const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isValid() )\n        return QString();\n\n    return getHostname() + \":\" + QString::number(getPort());\n}\n"
  },
  {
    "path": "data/DxServerString.h",
    "content": "#ifndef QLOG_DATA_DXSERVERSTRING_H\n#define QLOG_DATA_DXSERVERSTRING_H\n\n#include <QString>\n\nclass DxServerString\n{\npublic:\n    explicit DxServerString(const QString &connectString,\n                            const QString &defaultUsername = QString());\n\n    static bool isValidServerString(const QString &);\n    bool isValid() const {return valid;};\n    QString getUsername() const {return username;};\n    QString getHostname() const {return hostname;};\n    int getPort() const {return port;};\n    const QString getPasswordStorageKey() const;\n\nprivate:\n    static const QRegularExpression serverStringRegEx();\n\n    QString username, hostname;\n    int port;\n    bool valid;\n};\n\n#endif // QLOG_DATA_DXSERVERSTRING_H\n"
  },
  {
    "path": "data/DxSpot.h",
    "content": "#ifndef QLOG_DATA_DXSPOT_H\n#define QLOG_DATA_DXSPOT_H\n\n#include <QtCore>\n#include \"Dxcc.h\"\n#include \"core/MembershipQE.h\"\n#include \"data/BandPlan.h\"\n\nclass DxSpot\n{\n\npublic:\n\n    QDateTime dateTime;\n    QString callsign;\n    QList<ClubInfo> callsign_member;\n    double freq;\n    double freqTX;\n    QString band;\n    QString modeGroupString;\n    BandPlan::BandPlanMode bandPlanMode;\n    QString spotter;\n    QString comment;\n    qulonglong dupeCount = 0;\n    QString wwffRef;\n    QString potaRef;\n    QString sotaRef;\n    QString iotaRef;\n    DxccEntity dxcc;\n    DxccEntity dxcc_spotter;\n    DxccStatus status;\n    bool containsWWFF;\n    bool containsPOTA;\n    bool containsSOTA;\n    bool containsIOTA;\n\n    DxSpot() : freq(0.0),\n        freqTX(0.0),\n        bandPlanMode(BandPlan::BAND_MODE_UNKNOWN),\n        status(DxccStatus::UnknownStatus),\n        containsWWFF(false), containsPOTA(false),\n        containsSOTA(false), containsIOTA(false)\n        {};\n\n    QStringList memberList2StringList() const\n    {\n        QStringList ret;\n        for ( const ClubInfo &member : static_cast<const QList<ClubInfo>&>(callsign_member) )\n            ret << member.getClubInfo();\n        return ret;\n    };\n\n    QSet<QString> memberList2Set() const\n    {\n        QSet<QString> ret;\n\n        for ( const ClubInfo &member : static_cast<const QList<ClubInfo>&>(callsign_member) )\n            ret << member.getClubInfo();\n        return ret;\n    }\n\n    operator QString() const\n    {\n        return QString(\"DxSpot \")\n               + \"Country: \" + QString::number(dxcc.dxcc) + \" \"\n               + \"CQZ: \" + QString::number(dxcc.cqz) + \" \"\n               + \"ITUZ: \" + QString::number(dxcc.ituz) + \" \"\n               + \"Status: \" + QString::number(status) + \" \"\n               + \"ModeGroup: \" + modeGroupString  + \" \"\n               + \"Band: \" + band  + \" \"\n               + \"spotter Country: \" + QString::number(dxcc_spotter.dxcc) + \" \"\n               + \"Continent: \" + dxcc.cont + \" \"\n               + \"Spotter Continent: \" + dxcc_spotter.cont + \" \"\n               + \"Callsign: \" + callsign + \" \"\n               + \"FreqTX: \" + QString::number(freqTX) + \" \"\n               + \"Message: \" + comment + \" \"\n               + \"DX Member: \" + memberList2StringList().join(\", \") + \" \"\n               + \"POTA: \" + potaRef  + \" \" + \"POTA present: \" + (containsPOTA ? \"true\" : \"false\") + \" \"\n               + \"SOTA: \" + sotaRef  + \" \" + \"SOTA present: \" + (containsSOTA ? \"true\" : \"false\") + \" \"\n               + \"WWFF: \" + wwffRef + \" \" + \"WWFF present: \" + (containsWWFF ? \"true\" : \"false\") + \" \"\n               + \"IOTA: \" + iotaRef + \" \" + \"IOTA present: \" + (containsIOTA ? \"true\" : \"false\") + \" \";\n    }\n};\n\nQ_DECLARE_METATYPE(DxSpot);\n\n#endif // QLOG_DATA_DXSPOT_H\n"
  },
  {
    "path": "data/Dxcc.h",
    "content": "#ifndef QLOG_DATA_DXCC_H\n#define QLOG_DATA_DXCC_H\n\n#include <QtCore>\n\nenum DxccStatus {\n    NewEntity     = 0b1,\n    NewBand       = 0b10,\n    NewMode       = 0b100,\n    NewBandMode   = 0b110,\n    NewSlot       = 0b1000,\n    Worked        = 0b10000,\n    Confirmed     = 0b100000,\n    UnknownStatus = 0b1000000,\n    All           = 0b1111111\n};\n\nclass DxccEntity {\npublic:\n    QString country;\n    QString prefix;\n    qint32 dxcc;\n    QString cont;\n    qint32 cqz;\n    qint32 ituz;\n    double latlon[2];\n    float tz;\n    QString flag;\n};\n\nstruct DxccPrefix {\npublic:\n    QString prefix;\n    bool exact;\n    qint32 dxcc;\n    qint32 cqz;\n    qint32 ituz;\n    QString cont;\n    double latlon[2];\n};\n\n#endif // QLOG_DATA_DXCC_H\n"
  },
  {
    "path": "data/Gridsquare.cpp",
    "content": "#include \"Gridsquare.h\"\n#include <core/debug.h>\n#include <QtMath>\n#include <QRegularExpression>\n#include <cmath>\n#include <QLocale>\n\nMODULE_IDENTIFICATION(\"qlog.core.gridsquare\");\n\nGridsquare::Gridsquare(const QString &in_grid) :\n    validGrid(false), lat(qQNaN()), lon(qQNaN())\n{\n    FCT_IDENTIFICATION;\n\n    if ( !in_grid.isEmpty() )\n    {\n        grid = in_grid.toUpper();\n\n        if ( gridRegEx().match(grid).hasMatch() )\n        {\n            lon = (grid.at(0).toLatin1() - 'A') * 20 - 180;\n            lat = (grid.at(1).toLatin1() - 'A') * 10 - 90;\n\n            if ( grid.size() >= 4 )\n            {\n                lon += (grid.at(2).toLatin1() - '0') * 2;\n                lat += (grid.at(3).toLatin1() - '0') * 1;\n\n                if ( grid.size() >= 6 )\n                {\n                    lon += (grid.at(4).toLatin1() - 'A') * (5.0/60.0);\n                    lat += (grid.at(5).toLatin1() - 'A') * (2.5/60.0);\n\n                    if ( grid.size() >= 8 )\n                    {\n                        lon += (grid.at(6).toLatin1() - '0') * (30.0/3600.0);\n                        lat += (grid.at(7).toLatin1() - '0') * (15.0/3600.0);\n\n                        // move to the center\n                        lon += 15.0/3600.0;\n                        lat += 7.5/3600.0;\n                    }\n                    else\n                    {\n                        // move to the center\n                        lon += 2.5/60.0;\n                        lat += 1.25/60.0;\n                    }\n\n                }\n                else\n                {\n                    // move to the center\n                    lon += 1;\n                    lat += 0.5;\n                }\n            }\n            else\n            {\n                // move 0to the center\n                lon += 10;\n                lat += 5;\n            }\n            validGrid = true;\n        }\n        else\n        {\n            /* not valid grid */\n            grid = QString();\n        }\n    }\n}\n\nGridsquare::Gridsquare(const double inlat, const double inlon) :\n    validGrid(false), lat(inlat), lon(inlon)\n{\n    FCT_IDENTIFICATION;\n\n    QString U = \"ABCDEFGHIJKLMNOPQRSTUVWX\";\n\n    if ( qIsNaN(inlat)\n         || qIsNaN(inlon)\n         || qAbs(inlat) >= 90.0\n         || qAbs(inlon) >= 180.0 )\n    {\n        qCDebug(runtime) << \"Invalid Grid lat/lon\" << inlat << inlon;\n        this->lat = this->lon = qQNaN();\n    }\n    else\n    {\n        // currently user only for SOTA where only 6 chars are enough\n        double modifiedLat = lat + 90.0;\n        double modifiedLon = lon + 180.0;\n        QString grid1 = U.at(static_cast<int>(modifiedLon/20));\n        QString grid2 = U.at(static_cast<int>(modifiedLat/10));\n        QString grid3 = QString::number(static_cast<int>(fmod((modifiedLon/2), 10.0)));\n        QString grid4 = QString::number(static_cast<int>(fmod(modifiedLat,10.0)));\n        double rLat = (modifiedLat - static_cast<int>(modifiedLat)) * 60;\n        double rLon = (modifiedLon - 2*static_cast<int>(modifiedLon/2)) *60;\n        QString grid5 = U.at((int)(rLon/5));\n        QString grid6 = U.at((int)(rLat/2.5));\n        grid = grid1 + grid2 + grid3 + grid4 + grid5 + grid6;\n        qCDebug(runtime) << grid;\n        validGrid = true;\n    }\n}\n\nconst QRegularExpression Gridsquare::gridRegEx()\n{\n    FCT_IDENTIFICATION;\n\n    return QRegularExpression(\"^[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2}|[0-9]{2}[A-Xa-x]{2}[0-9]{2})?$\");\n    //return QRegularExpression(\"^[A-Ra-r]{2}[0-9]{2}([A-Xa-x]{2})?([0-9]{2})?$\");\n}\n\nconst QRegularExpression Gridsquare::gridVUCCRegEx()\n{\n    FCT_IDENTIFICATION;\n\n    return QRegularExpression(\"^[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2}),[ ]*[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2})$|\"\n                              \"^[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2}),[ ]*[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2}),[ ]*[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2}),[ ]*[A-Ra-r]{2}(?:[0-9]{2}|[0-9]{2}[A-Xa-x]{2})$\");\n}\n\nconst QRegularExpression Gridsquare::gridExtRegEx()\n{\n    FCT_IDENTIFICATION;\n\n    return QRegularExpression(\"^[A-Xa-x]{2}?([0-9]{2})?$\");\n}\n\ndouble Gridsquare::distance2localeUnitDistance(double km,\n                                               QString &unit,\n                                               const LogLocale &locale)\n{\n    FCT_IDENTIFICATION;\n\n    unit = QObject::tr(\"km\");\n    double ret = km;\n\n    // All imperial systems\n    if ( ! locale.getSettingUseMetric() )\n    {\n        unit = QObject::tr(\"miles\");\n        ret = km * localeDistanceCoef(locale);\n    }\n    return ret;\n}\n\ndouble Gridsquare::localeDistanceCoef(const LogLocale &locale)\n{\n    FCT_IDENTIFICATION;\n\n    return ( ! locale.getSettingUseMetric() ) ? 0.6213711922\n                                              : 1.0;\n}\n\nbool Gridsquare::isValid() const\n{\n    FCT_IDENTIFICATION;\n    return validGrid;\n}\n\nbool Gridsquare::distanceTo(double lat, double lon, double &distance) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isValid() )\n    {\n        distance = 0.0;\n        return false;\n    }\n\n    /* https://www.movable-type.co.uk/scripts/latlong.html */\n    double dLat = (lat - this->getLatitude()) * M_PI / 180;\n    double dLon = (lon - this->getLongitude()) * M_PI / 180;\n\n    double lat1 = this->getLatitude() * M_PI / 180;\n    double lat2 = lat * M_PI / 180;\n\n    double a = sin(dLat / 2) * sin(dLat / 2) +\n               sin(dLon / 2) * sin(dLon / 2) * cos(lat1) * cos(lat2);\n\n    double c = 2 * atan2(sqrt(a), sqrt(1-a));\n\n    // Based on IARU Rules\n    // The centre of the Large Locator Square (e.g. IO84MM to IO91MM) is used for distance calculations.\n    // In order to make contest scores comparable, for the conversion from degrees to kilometres a factor\n    // of 111.2 should be used when calculating distances with the aid of the spherical geometry equation.\n\n    // It means that 111.2km/° * 360 =40032km\n    // It means that R = 40032 / (2*PI)\n\n    distance = (40032.0 / (2 * M_PI)) * c;\n\n    return true;\n}\n\nbool Gridsquare::distanceTo(const Gridsquare &in_grid, double &distance) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !in_grid.isValid() )\n    {\n        distance = 0.0;\n        return false;\n    }\n    return distanceTo(in_grid.getLatitude(), in_grid.getLongitude(), distance);\n}\n\nbool Gridsquare::bearingTo(double lat, double lon, double &bearing) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isValid() )\n    {\n        bearing = 0.0;\n        return false;\n    }\n\n    double dLon = (lon - this->getLongitude()) * M_PI / 180;\n    double lat1 = this->getLatitude() * M_PI / 180;\n    double lat2 = lat * M_PI / 180;\n\n    double y = sin(dLon) * cos(lat2);\n    double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon);\n\n    bearing = fmod((180.0 * atan2(y, x) / M_PI + 360.0), 360.0);\n\n    return true;\n}\n\nbool Gridsquare::bearingTo(const Gridsquare &in_grid, double &bearing) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! in_grid.isValid() )\n    {\n        bearing = 0.0;\n        return false;\n    }\n\n    return bearingTo(in_grid.getLatitude(), in_grid.getLongitude(), bearing);\n}\n"
  },
  {
    "path": "data/Gridsquare.h",
    "content": "#ifndef QLOG_CORE_GRIDSQUARE_H\n#define QLOG_CORE_GRIDSQUARE_H\n\n#include <QObject>\n#include <QString>\n#include <QDebug>\n\n#include \"core/LogLocale.h\"\n\nclass Gridsquare\n{\npublic:\n    explicit Gridsquare(const QString &in_grid = QString());\n    explicit Gridsquare(const double inlat,const  double inlon);\n    ~Gridsquare() {};\n    static const QRegularExpression gridRegEx();\n    static const QRegularExpression gridVUCCRegEx();\n    static const QRegularExpression gridExtRegEx();\n    static double distance2localeUnitDistance(double km, QString &unit, const LogLocale &locale);\n    static double localeDistanceCoef(const LogLocale &locale);\n\n    bool isValid() const;\n    double getLongitude() const {return lon;};\n    double getLatitude() const {return lat;};\n    const QString getGrid() const { return grid;};\n    bool distanceTo(const Gridsquare &in_grid, double &distance) const;\n    bool distanceTo(double lat, double lon, double &distance) const;\n    bool bearingTo(const Gridsquare &in_grid, double &bearing) const;\n    bool bearingTo(double lat, double lon, double &bearing) const ;\n    operator QString() const { return QString(\"Gridsquare: grid[%1]; valid[%2]; lat[%3]; lon[%4]\")\n                                      .arg(grid).arg(validGrid).arg(lat).arg(lon);};\n\nprivate:\n    QString grid;\n    bool validGrid;\n    double lat, lon;\n};\n\n#endif // QLOG_CORE_GRIDSQUARE_H\n"
  },
  {
    "path": "data/HostsPortString.cpp",
    "content": "#include <QRegularExpression>\n#include <QNetworkInterface>\n#include \"HostsPortString.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.hostsportstring\");\n\nconst QRegularExpression HostsPortString::hostsPortRegEx()\n{\n    return QRegularExpression(\"^((((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])\\\\.?\\\\b){4}):[0-9]{1,5}\\\\s*)+$\");\n}\n\nHostsPortString::HostsPortString(const QString &addressesString, QObject *parent) :\n    QObject(parent)\n{\n    FCT_IDENTIFICATION;\n\n    qDebug(function_parameters) << addressesString;\n\n    if ( addressesString.isEmpty() )\n    {\n        return;\n    }\n\n    const QStringList &addressTokens = addressesString.split(\" \");\n\n    for ( const QString &addrToken : addressTokens )\n    {\n        qCDebug(runtime) << \"Processing address \" << addrToken;\n\n        QStringList addressPair = addrToken.split(\":\");\n\n        if ( addressPair.size() == 2 )\n        {\n            bool isPortOK = false;\n            uint port = addressPair.at(1).toUInt(&isPortOK);\n\n            if ( isPortOK && port < 65536 )\n            {\n                qCDebug(runtime) << \"Adding address\" << addrToken;\n                addressList << HostPortAddress(addressPair.at(0), port);\n            }\n            else\n            {\n                qCInfo(runtime) << \"Malformed port \"<< addressPair.at(1) << \"for address \" << addrToken << \" - skipping\";\n            }\n        }\n        else\n        {\n            qCInfo(runtime) << \"Malformed address \" << addrToken << \" - skipping\";\n        }\n    }\n}\n\nbool HostsPortString::hasLocalIPWithPort(int port) const\n{\n    FCT_IDENTIFICATION;\n\n    qDebug(function_parameters) << port;\n\n    QList<QHostAddress> localAddresses = QNetworkInterface::allAddresses();\n    localAddresses.append(QHostAddress(\"0.0.0.0\"));\n\n    qCDebug(runtime) << \"My IPs:\" << localAddresses;\n\n    for ( const QHostAddress& addr : static_cast<const QList<QHostAddress>&>(localAddresses) )\n        if ( addressList.contains(HostPortAddress(addr, port)) )\n            return true;\n\n    return false;\n}\n\nQList<HostPortAddress> HostsPortString::getAddrList() const\n{\n    FCT_IDENTIFICATION;\n\n    return addressList;\n}\n\nHostPortAddress::HostPortAddress(const QString &hostAddress, quint16 hostPort) :\n    QHostAddress(hostAddress),\n    port(hostPort)\n{\n    FCT_IDENTIFICATION;\n\n}\n\nHostPortAddress::HostPortAddress(const QHostAddress &host, quint16 port) :\n    QHostAddress(host),\n    port(port)\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid HostPortAddress::setPort(quint16 hostPort)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << hostPort;\n\n    port = hostPort;\n}\n\nquint16 HostPortAddress::getPort() const\n{\n    FCT_IDENTIFICATION;\n\n    return port;\n}\n\nbool HostPortAddress::operator==(const HostPortAddress &other) const\n{\n    return QHostAddress::operator==(other) && port == other.port;\n}\n"
  },
  {
    "path": "data/HostsPortString.h",
    "content": "#ifndef QLOG_DATA_HOSTSPORTSTRING_H\n#define QLOG_DATA_HOSTSPORTSTRING_H\n\n#include <QObject>\n#include <QHostAddress>\n\nclass HostPortAddress : public QHostAddress\n{\npublic:\n    explicit HostPortAddress(const QString &, quint16);\n    HostPortAddress(const QHostAddress &host, quint16 port);\n    void setPort(quint16);\n    quint16 getPort() const;\n    bool operator==(const HostPortAddress &other) const;\n\nprivate:\n    quint16 port;\n};\n\nclass HostsPortString : public QObject\n{\n    Q_OBJECT\npublic:\n    static const QRegularExpression hostsPortRegEx();\n\n    explicit HostsPortString(const QString &, QObject *parent=nullptr);\n    bool hasLocalIPWithPort(int port) const;\n    QList<HostPortAddress> getAddrList() const;\n\nprivate:\n\n    QList<HostPortAddress> addressList;\n\n};\n\n#endif // QLOG_DATA_HOSTSPORTSTRING_H\n"
  },
  {
    "path": "data/MainLayoutProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n#include <QByteArray>\n\n#include \"MainLayoutProfile.h\"\n#include \"core/debug.h\"\n#include \"models/LogbookModel.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.mainlayoutprofile\");\n\nQDataStream& operator<<(QDataStream& out, const MainLayoutProfile& v)\n{\n    out << v.profileName\n        << v.rowA\n        << v.rowB\n        << v.detailColA\n        << v.detailColB\n        << v.detailColC\n        << v.mainGeometry\n        << v.mainState\n        << v.darkMode\n        << v.tabsexpanded\n        << v.addlBandmaps;\n\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, MainLayoutProfile& v)\n{\n    in >> v.profileName;\n    in >> v.rowA;\n    in >> v.rowB;\n    in >> v.detailColA;\n    in >> v.detailColB;\n    in >> v.detailColC;\n    in >> v.mainGeometry;\n    in >> v.mainState;\n    in >> v.darkMode;\n    in >> v.tabsexpanded;\n    in >> v.addlBandmaps;\n\n    return in;\n}\n\nMainLayoutProfilesManager::MainLayoutProfilesManager() :\n    ProfileManagerSQL<MainLayoutProfile>(\"main_layout_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, row_A, row_B, detail_col_A, \"\n                                \"detail_col_B, detail_col_C, main_geometry, main_state, \"\n                                \"dark_mode, tabsexpanded, addlbandmaps \"\n                                \"FROM main_layout_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            MainLayoutProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.rowA = toIntList(profileQuery.value(1).toString());\n            profileDB.rowB = toIntList(profileQuery.value(2).toString());\n            profileDB.detailColA = toIntList(profileQuery.value(3).toString());\n            profileDB.detailColB = toIntList(profileQuery.value(4).toString());\n            profileDB.detailColC = toIntList(profileQuery.value(5).toString());\n            profileDB.mainGeometry = QByteArray::fromBase64(profileQuery.value(6).toString().toUtf8());\n            profileDB.mainState = QByteArray::fromBase64(profileQuery.value(7).toString().toUtf8());\n            profileDB.darkMode = profileQuery.value(8).toInt();\n            profileDB.tabsexpanded = profileQuery.value(9).toBool();\n            profileDB.addlBandmaps = toPairStringList(profileQuery.value(10).toString());\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"MainLayout Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid MainLayoutProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM main_layout_profiles\") )\n    {\n        qWarning() << \"Cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO main_layout_profiles(profile_name, row_A, row_B, detail_col_A, detail_col_B, detail_col_C, main_geometry, main_state, dark_mode, tabsexpanded, addlbandmaps) \"\n                               \"VALUES (:profile_name, :row_A, :row_B, :detail_col_A, :detail_col_B, :detail_col_C, :main_geometry, :main_state, :dark_mode, :tabsexpanded, :addlbandmaps)\") )\n    {\n        qWarning() << \"Cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const MainLayoutProfile &layoutProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":row_A\", toDBStringList(layoutProfile.rowA));\n            insertQuery.bindValue(\":row_B\", toDBStringList(layoutProfile.rowB));\n            insertQuery.bindValue(\":detail_col_A\", toDBStringList(layoutProfile.detailColA));\n            insertQuery.bindValue(\":detail_col_B\", toDBStringList(layoutProfile.detailColB));\n            insertQuery.bindValue(\":detail_col_C\", toDBStringList(layoutProfile.detailColC));\n            insertQuery.bindValue(\":main_geometry\", layoutProfile.mainGeometry.toBase64());\n            insertQuery.bindValue(\":main_state\", layoutProfile.mainState.toBase64());\n            insertQuery.bindValue(\":dark_mode\", layoutProfile.darkMode);\n            insertQuery.bindValue(\":tabsexpanded\", layoutProfile.tabsexpanded);\n            insertQuery.bindValue(\":addlbandmaps\", toDBStringList(layoutProfile.addlBandmaps));\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"MainLayoutProfile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"MainLayoutProfile Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\nQString MainLayoutProfilesManager::toDBStringList(const QList<int> &list)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << list;\n\n    QStringList stringsList;\n    for ( const int item : list)\n    {\n        stringsList << QString::number(item);\n    }\n    qCDebug(runtime) << \"return:\" << stringsList;\n    return stringsList.join(\",\");\n}\n\nQString MainLayoutProfilesManager::toDBStringList(const QList<QPair<QString, QString> > &list)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << list;\n\n    QStringList stringsList;\n    for ( const QPair<QString, QString> &item : list)\n        stringsList << item.first + \"/\" + item.second;\n\n    qCDebug(runtime) << \"return:\" << stringsList;\n    return stringsList.join(\",\");\n}\n\nQList<int> MainLayoutProfilesManager::toIntList(const QString &list) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << list;\n\n    QList<int> retList;\n\n    if ( list.isEmpty() )\n        return retList;\n\n    const QStringList splitList = list.split(\",\");\n    for ( const QString &item : splitList )\n    {\n        retList << item.toInt();\n    }\n\n    qCDebug(runtime) << \"return:\" << retList;\n    return retList;\n}\n\nQList<QPair<QString, QString> > MainLayoutProfilesManager::toPairStringList(const QString &list)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << list;\n\n    QList<QPair<QString, QString>> retList;\n\n    if ( list.isEmpty() )\n        return retList;\n\n    const QStringList &elements = list.split(\",\");\n\n    for ( const QString &elementParams : elements )\n    {\n        const QStringList &params = elementParams.split(\"/\");\n        if ( params.size() == 2 )\n            retList << QPair<QString, QString>(params.at(0), params.at(1));\n        else\n            qWarning() << \"Unexpected number of Bandmap widget params\" << elementParams;\n    }\n\n    return retList;\n}\n\nbool MainLayoutProfile::operator==(const MainLayoutProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.rowA == this->rowA\n            && profile.rowB == this->rowB\n            && profile.detailColA == this->detailColA\n            && profile.detailColB == this->detailColB\n            && profile.detailColC == this->detailColC\n            && profile.mainGeometry == this->mainGeometry\n            && profile.mainState == this->mainState\n            && profile.darkMode == this->darkMode\n            && profile.tabsexpanded == this->tabsexpanded\n            && profile.addlBandmaps == this->addlBandmaps);\n}\n\nbool MainLayoutProfile::operator!=(const MainLayoutProfile &profile)\n{\n    return !operator==(profile);\n}\n\nMainLayoutProfile MainLayoutProfile::getClassicLayout()\n{\n\n    MainLayoutProfile ret;\n\n    ret.rowA << LogbookModel::COLUMN_NAME_INTL\n             << LogbookModel::COLUMN_QTH_INTL\n             << LogbookModel::COLUMN_GRID\n             << LogbookModel::COLUMN_COMMENT_INTL;\n\n    ret.detailColA << LogbookModel::COLUMN_CONTINENT\n                   << LogbookModel::COLUMN_ITUZ\n                   << LogbookModel::COLUMN_CQZ\n                   << LogbookModel::COLUMN_STATE\n                   << LogbookModel::COLUMN_COUNTY\n                   << LogbookModel::COLUMN_AGE\n                   << LogbookModel::COLUMN_VUCC_GRIDS;\n\n    ret.detailColB << LogbookModel::COLUMN_DARC_DOK\n                   << LogbookModel::COLUMN_IOTA\n                   << LogbookModel::COLUMN_POTA_REF\n                   << LogbookModel::COLUMN_SOTA_REF\n                   << LogbookModel::COLUMN_WWFF_REF\n                   << LogbookModel::COLUMN_SIG_INTL\n                   << LogbookModel::COLUMN_SIG_INFO_INTL;\n\n    ret.detailColC << LogbookModel::COLUMN_EMAIL\n                   << LogbookModel::COLUMN_WEB;\n\n    return ret;\n}\n"
  },
  {
    "path": "data/MainLayoutProfile.h",
    "content": "#ifndef QLOG_DATA_MAINLAYOUTPROFILE_H\n#define QLOG_DATA_MAINLAYOUTPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n\n#include \"data/ProfileManager.h\"\n\nclass MainLayoutProfile\n{\n\npublic:\n    MainLayoutProfile()\n    {\n        darkMode = 0;\n        tabsexpanded = true;\n    };\n\n    QString profileName;\n    QList<int> rowA;\n    QList<int> rowB;\n    QList<int> detailColA;\n    QList<int> detailColB;\n    QList<int> detailColC;\n    QByteArray mainGeometry;\n    QByteArray mainState;\n    int darkMode;\n    bool tabsexpanded;\n    QList<QPair<QString, QString>> addlBandmaps;\n\n    bool operator== (const MainLayoutProfile &profile);\n    bool operator!= (const MainLayoutProfile &profile);\n    static MainLayoutProfile getClassicLayout();\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const MainLayoutProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, MainLayoutProfile& v);\n\n};\n\nQ_DECLARE_METATYPE(MainLayoutProfile);\n\nclass MainLayoutProfilesManager : public ProfileManagerSQL<MainLayoutProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit MainLayoutProfilesManager();\n    ~MainLayoutProfilesManager() { };\n\n    static MainLayoutProfilesManager* instance()\n    {\n        static MainLayoutProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n    static QString toDBStringList(const QList<int> &list);\n    static QString toDBStringList(const QList<QPair<QString, QString>> &list);\n    QList<int> toIntList(const QString &list) const;\n    static QList<QPair<QString, QString>> toPairStringList(const QString &list);\n};\n\n\n#endif // QLOG_DATA_MAINLAYOUTPROFILE_H\n"
  },
  {
    "path": "data/POTAEntity.h",
    "content": "#ifndef QLOG_DATA_POTAENTITY_H\n#define QLOG_DATA_POTAENTITY_H\n\n#include <QtCore>\n\nclass POTAEntity {\npublic:\n    QString reference;\n    QString name;\n    bool active;\n    qint16 entityID;\n    QString locationDesc;\n    double longitude;\n    double latitude;\n    QString grid;\n};\n\n#endif // QLOG_DATA_POTAENTITY_H\n"
  },
  {
    "path": "data/POTASpot.h",
    "content": "#ifndef QLOG_DATA_POTASPOT_H\n#define QLOG_DATA_POTASPOT_H\n\n#include <QtCore>\n\nclass POTASpot\n{\npublic:\n    quint64 spotId = 0;\n    QString activator;\n    QString activatorBaseCallsign;\n    double frequency = 0.0;\n    QString mode;\n    QString reference;\n    QString parkName;\n    QDateTime spotTime;\n    QString spotter;\n    QString comments;\n    QString source;\n    QString name;\n    QString locationDesc;\n};\n\n#endif // QLOG_DATA_POTASPOT_H\n"
  },
  {
    "path": "data/ProfileManager.h",
    "content": "#ifndef QLOG_DATA_PROFILEMANAGER_H\n#define QLOG_DATA_PROFILEMANAGER_H\n\n#include <QString>\n#include <QVariant>\n#include <QMutex>\n#include <QLoggingCategory>\n#include <QtSql>\n\n/* the header file contains function implementation because\n * https://stackoverflow.com/questions/8752837/undefined-reference-to-template-class-constructor\n */\n\n\n/* Question:\n * when I build, the compiler throws errors in every instance of the template class:\n *\n * undefined reference to `cola(float)::cola()'... (it's actually cola'<'float'>'::cola(),\n * but this doesn't let me use it like that.)\n */\n\n/*\n * This is a common question in C++ programming. There are two valid answers to this. There are advantages\n * and disadvantages to both answers and your choice will depend on context. The common answer is to put all\n * the implementation in the header file, but there's another approach will will be suitable in some cases.\n * The choice is yours.\n *\n * The code in a template is merely a 'pattern' known to the compiler. The compiler won't compile the\n * constructors cola<float>::cola(...) and cola<string>::cola(...) until it is forced to do so.\n * And we must ensure that this compilation happens for the constructors at least once in the entire\n * compilation process, or we will get the 'undefined reference' error. (This applies to the other\n * methods of cola<T> also.)\n *\n * Understanding the problem:\n *\n * The problem is caused by the fact that main.cpp and cola.cpp will be compiled separately first.\n * In main.cpp, the compiler will implicitly instantiate the template classes cola<float> and\n * cola<string> because those particular instantiations are used in main.cpp. The bad news is that\n * the implementations of those member functions are not in main.cpp, nor in any header file included\n * in main.cpp, and therefore the compiler can't include complete versions of those functions in main.o.\n * When compiling cola.cpp, the compiler won't compile those instantiations either, because there are no\n * implicit or explicit instantiations of cola<float> or cola<string>. Remember, when compiling cola.cpp,\n * the compiler has no clue which instantiations will be needed; and we can't expect it to compile for\n * every type in order to ensure this problem never happens! (cola<int>, cola<char>, cola<ostream>,\n * cola< cola<int> > ... and so on ...)\n *\n * The two answers are:\n *     Tell the compiler, at the end of cola.cpp, which particular template classes will be required,\n *     forcing it to compile cola<float> and cola<string>.\n *     Put the implementation of the member functions in a header file that will be included every\n *     time any other 'translation unit' (such as main.cpp) uses the template class.\n *\n *  Answer 1: Explicitly instantiate the template, and its member definitions\n *  At the end of cola.cpp, you should add lines explicitly instantiating all the relevant templates, such as\n *\n *     template class cola<float>;\n *     template class cola<string>;\n *\n *  and you add the following two lines at the end of nodo_colaypila.cpp:\n *\n *     template class nodo_colaypila<float>;\n *     template class nodo_colaypila<std :: string>;\n *\n *  This will ensure that, when the compiler is compiling cola.cpp that it will explicitly compile\n *  all the code for the cola<float> and cola<string> classes. Similarly, nodo_colaypila.cpp\n *  contains the implementations of the nodo_colaypila<...> classes.\n *\n *  In this approach, you should ensure that all the of the implementation is placed into\n *  one .cpp file (i.e. one translation unit) and that the explicit instantation is placed\n *  after the definition of all the functions (i.e. at the end of the file).\n *\n *  Answer 2: Copy the code into the relevant header file\n *  The common answer is to move all the code from the implementation files cola.cpp and\n *  nodo_colaypila.cpp into cola.h and nodo_colaypila.h. In the long run, this is more\n *  flexible as it means you can use extra instantiations (e.g. cola<char>) without any\n *  more work. But it could mean the same functions are compiled many times, once in\n *  each translation unit. This is not a big problem, as the linker will correctly ignore\n *  the duplicate implementations. But it might slow down the compilation a little.\n *\n *  Summary\n *  The default answer, used by the STL for example and in most of the code that any\n *  of us will write, is to put all the implementations in the header files. But in a more\n *  private project, you will have more knowledge and control of which particular template\n *  classes will be instantiated. In fact, this 'bug' might be seen as a feature, as it\n *  stops users of your code from accidentally using instantiations you have not tested\n *  for or planned for (\"I know this works for cola<float> and cola<string>, if you want\n *  to use something else, tell me first and will can verify it works before enabling it.\").\n*/\n\nclass ProfileSignalSlot : public QObject\n{\n    Q_OBJECT\n\nsignals:\n    void profileChanged(const QString &profileName);\n};\n\ntemplate<class T>\nclass ProfileManagerSQL : public ProfileSignalSlot\n{\n\npublic:\n    explicit ProfileManagerSQL(const QString &tableName)\n        : tableName(tableName)\n    {\n        QSqlQuery query(QString(\"SELECT profile_name FROM %1 WHERE IFNULL(selected, 0) = 1\").arg(tableName));\n        currentProfile1 = query.first() ? query.value(0).toString() : QString();\n        if ( currentProfile1.isEmpty() )\n            qDebug() << \"Empty profile name for \" << tableName\n                     << \"SQL Error\" << query.lastError().text();\n    };\n\n    const T getCurProfile1()\n    {\n        return ( ! currentProfile1.isEmpty() ) ? getProfile(currentProfile1)\n                                               : T();\n    };\n\n    bool __setCurProfile1(const QString &profileName)\n    {\n        bool ret = false;\n        if ( profiles.contains(profileName) || profileName.isEmpty() )\n        {\n            QSqlQuery query;\n\n            // atomic change\n            if ( !query.prepare(QString(\"UPDATE %1 \"\n                                              \"SET selected = CASE \"\n                                              \"               WHEN profile_name = :profileName THEN 1 \"\n                                              \"               ELSE NULL \"\n                                              \"               END \"\n                                              \"WHERE selected = 1 OR profile_name = :profileName2\").arg(tableName)) )\n            {\n                qWarning() << \"Cannot prepare Update statement for\" << tableName;\n                return ret;\n            }\n\n            query.bindValue(\":profileName\", profileName);\n            query.bindValue(\":profileName2\", profileName);\n\n            if ( query.exec() )\n            {\n                currentProfile1 = profileName;\n                ret = true;\n            }\n            else\n                qWarning() << \"Cannot set the selected profile for \" << tableName\n                           << query.lastError().text();\n        }\n        else\n            qWarning() << \"Cannot set Current Profile to \"\n                       << profileName\n                       << \"because is not not a valid profile name\" << tableName;\n        return ret;\n    };\n\n    void setCurProfile1(const QString &profileName)\n    {\n        currProfMutex.lock();\n        bool changed = __setCurProfile1(profileName);\n        currProfMutex.unlock();\n        if ( changed )\n            emit profileChanged(currentProfile1);\n    };\n\n    void saveCurProfile1()\n    {\n        currProfMutex.lock();\n        bool changed = __setCurProfile1(currentProfile1);\n        currProfMutex.unlock();\n        if ( changed )\n            emit profileChanged(currentProfile1);\n    };\n\n    const T getProfile(const QString &profileName)\n    {\n        if ( profiles.contains(profileName) )\n        {\n            profilesMutex.lock();\n            T ret = profiles.value(profileName).template value<T>();\n            profilesMutex.unlock();\n            return ret;\n        }\n        else\n        {\n            if ( !profileName.isEmpty() )\n                qWarning() << \"Profile \" << profileName << \" not found\" << tableName;\n            return T();\n        }\n    };\n\n    void addProfile(const QString &profileName, T profile)\n    {\n        profilesMutex.lock();\n        profiles.insert(profileName, QVariant::fromValue(profile));\n        profilesMutex.unlock();\n    };\n\n    int removeProfile(const QString &profileName)\n    {\n        currProfMutex.lock();\n        if ( currentProfile1 == profileName )\n        {\n            __setCurProfile1(QString());\n        }\n        currProfMutex.unlock();\n\n        profilesMutex.lock();\n        int ret = profiles.remove(profileName);\n        profilesMutex.unlock();\n\n        return ret;\n    };\n\n    const QStringList profileNameList()\n    {\n        profilesMutex.lock();\n        QStringList ret(profiles.keys());\n        profilesMutex.unlock();\n\n        return ret;\n    };\n\nprivate:\n    QMap<QString, QVariant> profiles;\n    QString currentProfile1;\n    QString tableName;\n    QMutex profilesMutex;\n    QMutex currProfMutex;\n};\n\n#endif // QLOG_DATA_PROFILEMANAGER_H\n"
  },
  {
    "path": "data/RigProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"RigProfile.h\"\n#include \"core/debug.h\"\n#include \"data/ProfileManager.h\"\n#include \"rig/Rig.h\"\n#include \"SerialPort.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.rigprofile\");\n\nQDataStream& operator<<(QDataStream& out, const RigProfile& v)\n{\n    out << v.profileName << v.model << v.portPath\n        << v.hostname << v.netport << v.baudrate\n        << v.databits << v.stopbits << v.flowcontrol\n        << v.parity << v.pollInterval << v.txFreqStart\n        << v.txFreqEnd << v.getFreqInfo << v.getModeInfo\n        << v.getVFOInfo << v.getPWRInfo << v.ritOffset\n        << v.xitOffset << v.getRITInfo << v.getXITInfo\n        << v.defaultPWR << v.getPTTInfo << v.QSYWiping\n        << v.getKeySpeed << v.assignedCWKey << v.keySpeedSync\n        << v.driver << v.dxSpot2Rig << v.pttType << v.pttPortPath\n        << v.rts << v.dtr << v.civAddr\n        << v.shareRigctld << v.rigctldPort << v.rigctldPath << v.rigctldArgs << v.getSplitInfo;\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, RigProfile& v)\n{\n    in >> v.profileName;\n    in >> v.model;\n    in >> v.portPath;\n    in >> v.hostname;\n    in >> v.netport;\n    in >> v.baudrate;\n    in >> v.databits;\n    in >> v.stopbits;\n    in >> v.flowcontrol;\n    in >> v.parity;\n    in >> v.pollInterval;\n    in >> v.txFreqStart;\n    in >> v.txFreqEnd;\n    in >> v.getFreqInfo;\n    in >> v.getModeInfo;\n    in >> v.getVFOInfo;\n    in >> v.getPWRInfo;\n    in >> v.ritOffset;\n    in >> v.xitOffset;\n    in >> v.getRITInfo;\n    in >> v.getXITInfo;\n    in >> v.defaultPWR;\n    in >> v.getPTTInfo;\n    in >> v.QSYWiping;\n    in >> v.getKeySpeed;\n    in >> v.assignedCWKey;\n    in >> v.keySpeedSync;\n    in >> v.driver;\n    in >> v.dxSpot2Rig;\n    in >> v.pttType;\n    in >> v.pttPortPath;\n    in >> v.rts;\n    in >> v.dtr;\n    in >> v.civAddr;\n    in >> v.shareRigctld;\n    in >> v.rigctldPort;\n    in >> v.rigctldPath;\n    in >> v.rigctldArgs;\n    in >> v.getSplitInfo;\n\n    return in;\n}\n\nRigProfilesManager::RigProfilesManager() :\n    ProfileManagerSQL<RigProfile>(\"rig_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(QString(\"SELECT profile_name, model, port_pathname, hostname, \"\n                                \"netport, baudrate, databits, stopbits, flowcontrol, parity, \"\n                                \"pollinterval, txfreq_start, txfreq_end, get_freq, get_mode, \"\n                                \"get_vfo, get_pwr, rit_offset, xit_offset, get_rit, get_xit, \"\n                                \"default_pwr, get_ptt, qsy_wiping, get_key_speed, assigned_cw_key, \"\n                                \"key_speed_sync, driver, dxspot2rig, ptt_type, ptt_port_pathname, \"\n                                \"IFNULL(rts, '%0'), IFNULL(dtr, '%0'), IFNULL(civaddr, -1), \"\n                                \"IFNULL(share_rigctld, 0), IFNULL(rigctld_port, 4532), \"\n                                \"IFNULL(rigctld_path, ''), IFNULL(rigctld_args, ''), get_split \"\n                                \"FROM rig_profiles\").arg(SerialPort::SERIAL_SIGNAL_NONE)))\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            RigProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.model =  profileQuery.value(1).toInt();\n            profileDB.portPath =  profileQuery.value(2).toString();\n            profileDB.hostname =  profileQuery.value(3).toString();\n            profileDB.netport =  profileQuery.value(4).toUInt();\n            profileDB.baudrate =  profileQuery.value(5).toUInt();\n            profileDB.databits =  profileQuery.value(6).toUInt();\n            profileDB.stopbits =  profileQuery.value(7).toFloat();\n            profileDB.flowcontrol =  profileQuery.value(8).toString();\n            profileDB.parity =  profileQuery.value(9).toString();\n            profileDB.pollInterval = profileQuery.value(10).toUInt();\n            profileDB.txFreqStart = profileQuery.value(11).toFloat();\n            profileDB.txFreqEnd = profileQuery.value(12).toFloat();\n            profileDB.getFreqInfo = profileQuery.value(13).toBool();\n            profileDB.getModeInfo = profileQuery.value(14).toBool();\n            profileDB.getVFOInfo = profileQuery.value(15).toBool();\n            profileDB.getPWRInfo = profileQuery.value(16).toBool();\n            profileDB.ritOffset = profileQuery.value(17).toDouble();\n            profileDB.xitOffset = profileQuery.value(18).toDouble();\n            profileDB.getRITInfo = profileQuery.value(19).toBool();\n            profileDB.getXITInfo = profileQuery.value(20).toBool();\n            profileDB.defaultPWR = profileQuery.value(21).toDouble();\n            profileDB.getPTTInfo = profileQuery.value(22).toBool();\n            profileDB.QSYWiping = profileQuery.value(23).toBool();\n            profileDB.getKeySpeed = profileQuery.value(24).toBool();\n            profileDB.assignedCWKey = profileQuery.value(25).toString();\n            profileDB.keySpeedSync = profileQuery.value(26).toBool();\n            profileDB.driver = profileQuery.value(27).toInt();\n            profileDB.dxSpot2Rig = profileQuery.value(28).toBool();\n            profileDB.pttType = profileQuery.value(29).toString();\n            profileDB.pttPortPath = profileQuery.value(30).toString();\n            profileDB.rts = profileQuery.value(31).toString();\n            profileDB.dtr = profileQuery.value(32).toString();\n            profileDB.civAddr = profileQuery.value(33).toInt();\n            profileDB.shareRigctld = profileQuery.value(34).toBool();\n            profileDB.rigctldPort = profileQuery.value(35).toUInt();\n            profileDB.rigctldPath = profileQuery.value(36).toString();\n            profileDB.rigctldArgs = profileQuery.value(37).toString();\n            profileDB.getSplitInfo = profileQuery.value(38).toBool();\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid RigProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM rig_profiles\") )\n    {\n        qWarning() << \"cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO rig_profiles(profile_name, model, port_pathname, hostname, netport, \"\n                               \"baudrate, databits, stopbits, flowcontrol, parity, pollinterval, txfreq_start, \"\n                               \"txfreq_end, get_freq, get_mode, get_vfo, get_pwr, rit_offset, xit_offset, get_rit, \"\n                               \"get_xit, default_pwr, get_ptt, qsy_wiping, get_key_speed, assigned_cw_key, key_speed_sync, \"\n                               \"driver, dxSpot2Rig, ptt_type, ptt_port_pathname, rts, dtr, civaddr, \"\n                               \"share_rigctld, rigctld_port, rigctld_path, rigctld_args, get_split ) \"\n                        \"VALUES (:profile_name, :model, :port_pathname, :hostname, :netport, \"\n                               \":baudrate, :databits, :stopbits, :flowcontrol, :parity, :pollinterval, :txfreq_start, \"\n                               \":txfreq_end, :get_freq, :get_mode, :get_vfo, :get_pwr, :rit_offset, :xit_offset, :get_rit, \"\n                               \":get_xit, :default_pwr, :get_ptt, :qsy_wiping, :get_key_speed, :assigned_cw_key, :key_speed_sync, \"\n                               \":driver, :dxSpot2Rig, :ptt_type, :ptt_port_pathname, :rts, :dtr, :civaddr, \"\n                               \":share_rigctld, :rigctld_port, :rigctld_path, :rigctld_args, :get_split )\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const RigProfile &rigProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":model\", rigProfile.model);\n            insertQuery.bindValue(\":port_pathname\", rigProfile.portPath);\n            insertQuery.bindValue(\":hostname\", rigProfile.hostname);\n            insertQuery.bindValue(\":netport\", rigProfile.netport);\n            insertQuery.bindValue(\":baudrate\", rigProfile.baudrate);\n            insertQuery.bindValue(\":databits\", rigProfile.databits);\n            insertQuery.bindValue(\":stopbits\", rigProfile.stopbits);\n            insertQuery.bindValue(\":flowcontrol\", rigProfile.flowcontrol);\n            insertQuery.bindValue(\":parity\", rigProfile.parity);\n            insertQuery.bindValue(\":pollinterval\", rigProfile.pollInterval);\n            insertQuery.bindValue(\":txfreq_start\", rigProfile.txFreqStart);\n            insertQuery.bindValue(\":txfreq_end\", rigProfile.txFreqEnd);\n            insertQuery.bindValue(\":get_freq\", rigProfile.getFreqInfo);\n            insertQuery.bindValue(\":get_mode\", rigProfile.getModeInfo);\n            insertQuery.bindValue(\":get_vfo\", rigProfile.getVFOInfo);\n            insertQuery.bindValue(\":get_pwr\", rigProfile.getPWRInfo);\n            insertQuery.bindValue(\":rit_offset\", rigProfile.ritOffset);\n            insertQuery.bindValue(\":xit_offset\", rigProfile.xitOffset);\n            insertQuery.bindValue(\":get_rit\", rigProfile.getRITInfo);\n            insertQuery.bindValue(\":get_xit\", rigProfile.getXITInfo);\n            insertQuery.bindValue(\":default_pwr\", rigProfile.defaultPWR);\n            insertQuery.bindValue(\":get_ptt\", rigProfile.getPTTInfo);\n            insertQuery.bindValue(\":qsy_wiping\", rigProfile.QSYWiping);\n            insertQuery.bindValue(\":get_key_speed\", rigProfile.getKeySpeed);\n            insertQuery.bindValue(\":assigned_cw_key\", rigProfile.assignedCWKey);\n            insertQuery.bindValue(\":key_speed_sync\", rigProfile.keySpeedSync);\n            insertQuery.bindValue(\":driver\", rigProfile.driver);\n            insertQuery.bindValue(\":dxSpot2Rig\", rigProfile.dxSpot2Rig);\n            insertQuery.bindValue(\":ptt_type\", rigProfile.pttType);\n            insertQuery.bindValue(\":ptt_port_pathname\", rigProfile.pttPortPath);\n            insertQuery.bindValue(\":rts\", rigProfile.rts);\n            insertQuery.bindValue(\":dtr\", rigProfile.dtr);\n            insertQuery.bindValue(\":civaddr\", (rigProfile.civAddr >= 0) ? rigProfile.civAddr : QVariant()); // 0x0 is valid CIV Address, NULL will be Auto\n            insertQuery.bindValue(\":share_rigctld\", rigProfile.shareRigctld);\n            insertQuery.bindValue(\":rigctld_port\", rigProfile.rigctldPort);\n            insertQuery.bindValue(\":rigctld_path\", rigProfile.rigctldPath);\n            insertQuery.bindValue(\":rigctld_args\", rigProfile.rigctldArgs);\n            insertQuery.bindValue(\":get_split\", rigProfile.getSplitInfo);\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"Station Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\nbool RigProfile::operator==(const RigProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.model == this->model\n            && profile.portPath == this->portPath\n            && profile.hostname == this->hostname\n            && profile.netport == this->netport\n            && profile.baudrate == this->baudrate\n            && profile.databits == this->databits\n            && profile.stopbits == this->stopbits\n            && profile.flowcontrol == this->flowcontrol\n            && profile.parity == this->parity\n            && profile.pollInterval == this->pollInterval\n            && profile.txFreqStart == this->txFreqStart\n            && profile.txFreqEnd == this->txFreqEnd\n            && profile.getFreqInfo == this->getFreqInfo\n            && profile.getModeInfo == this->getModeInfo\n            && profile.getVFOInfo == this->getVFOInfo\n            && profile.getPWRInfo == this->getPWRInfo\n            && profile.ritOffset == this->ritOffset\n            && profile.xitOffset == this->xitOffset\n            && profile.getRITInfo == this->getRITInfo\n            && profile.getXITInfo == this->getXITInfo\n            && profile.defaultPWR == this->defaultPWR\n            && profile.getPTTInfo == this->getPTTInfo\n            && profile.QSYWiping == this->QSYWiping\n            && profile.getKeySpeed == this->getKeySpeed\n            && profile.assignedCWKey == this->assignedCWKey\n            && profile.keySpeedSync == this->keySpeedSync\n            && profile.driver == this->driver\n            && profile.dxSpot2Rig == this->dxSpot2Rig\n            && profile.pttType == this->pttType\n            && profile.pttPortPath == this->pttPortPath\n            && profile.rts == this->rts\n            && profile.dtr == this->dtr\n            && profile.civAddr == this->civAddr\n            && profile.shareRigctld == this->shareRigctld\n            && profile.rigctldPort == this->rigctldPort\n            && profile.rigctldPath == this->rigctldPath\n            && profile.rigctldArgs == this->rigctldArgs\n            && profile.getSplitInfo == this->getSplitInfo\n            );\n}\n\nbool RigProfile::operator!=(const RigProfile &profile)\n{\n    return !operator==(profile);\n}\n\nQString RigProfile::toHTMLString() const\n{\n    QString ret = \"<b>\" + QObject::tr(\"My Rig\") + \":</b> \" + profileName + \"<br/>\";\n\n    return ret;\n}\n\nRigProfile::rigPortType RigProfile::getPortType() const\n{\n    FCT_IDENTIFICATION;\n\n    if ( driver == Rig::OMNIRIG_DRIVER\n        || driver == Rig::OMNIRIGV2_DRIVER )\n        return RigProfile::SPECIAL_OMNIRIG_ATTACHED;\n\n    if ( !hostname.isEmpty()\n         && portPath.isEmpty() )\n    {\n        return RigProfile::NETWORK_ATTACHED;\n    }\n    return RigProfile::SERIAL_ATTACHED;\n}\n"
  },
  {
    "path": "data/RigProfile.h",
    "content": "#ifndef QLOG_DATA_RIGPROFILE_H\n#define QLOG_DATA_RIGPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QMap>\n#include <QDataStream>\n#include <QVariant>\n\n#include \"data/ProfileManager.h\"\n\nclass RigProfile\n{\npublic:\n    enum rigPortType\n    {\n        SERIAL_ATTACHED,\n        NETWORK_ATTACHED,\n        SPECIAL_OMNIRIG_ATTACHED\n    };\n\n    RigProfile() {\n                   model = 1; netport = 0; baudrate = 0;\n                   databits = 0; stopbits = 0.0; pollInterval = 0;\n                   txFreqStart = 0.0; txFreqEnd = 0.0; getFreqInfo = false;\n                   getModeInfo = false; getVFOInfo = false; getPWRInfo = false;\n                   ritOffset = 0.0; xitOffset = 0.0, getRITInfo = false;\n                   getXITInfo = true; defaultPWR = 0.0, getPTTInfo = false;\n                   QSYWiping = false, getKeySpeed = false, keySpeedSync = false;\n                   driver = 0, dxSpot2Rig = false, civAddr = -1;\n                   shareRigctld = false; rigctldPort = 4532; getSplitInfo = false;\n                 };\n\n    QString profileName;\n    QString portPath;\n    QString hostname;\n    QString flowcontrol;\n    QString parity;\n    double ritOffset;\n    double xitOffset;\n    double defaultPWR;\n    QString assignedCWKey;\n    QString pttType;\n    QString pttPortPath;\n    QString rts;\n    QString dtr;\n    QString rigctldPath;  // empty = autodetect\n    QString rigctldArgs;  // additional arguments\n\n    qint32 model;\n    quint32 baudrate;\n    float stopbits;\n    quint32 pollInterval;\n    float txFreqStart;\n    float txFreqEnd;\n    qint32 driver;\n\n    quint16 netport;\n    qint16 civAddr; // -1 = AUTO; otherwise address\n    quint16 rigctldPort;\n\n    quint8 databits;\n    bool getFreqInfo;\n    bool getModeInfo;\n    bool getVFOInfo;\n    bool getPWRInfo;\n    bool getRITInfo;\n    bool getXITInfo;\n    bool getPTTInfo;\n    bool QSYWiping;\n    bool getKeySpeed;\n    bool keySpeedSync;\n    bool dxSpot2Rig;\n    bool shareRigctld;\n    bool getSplitInfo;\n\n    bool operator== (const RigProfile &profile);\n    bool operator!= (const RigProfile &profile);\n\n    QString toHTMLString() const;\n    rigPortType getPortType() const;\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const RigProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, RigProfile& v);\n};\n\nQ_DECLARE_METATYPE(RigProfile)\n\nclass RigProfilesManager : public ProfileManagerSQL<RigProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit RigProfilesManager();\n    ~RigProfilesManager() { };\n\n    static RigProfilesManager* instance()\n    {\n        static RigProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n\n\n#endif // QLOG_DATA_RIGPROFILE_H\n"
  },
  {
    "path": "data/RotProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"RotProfile.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.rotprofile\");\n\nQDataStream& operator<<(QDataStream& out, const RotProfile& v)\n{\n\n    out << v.profileName << v.model << v.portPath\n        << v.hostname << v.netport << v.baudrate\n        << v.databits << v.stopbits << v.flowcontrol\n        << v.parity << v.driver;\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, RotProfile& v)\n{\n    in >> v.profileName;\n    in >> v.model;\n    in >> v.portPath;\n    in >> v.hostname;\n    in >> v.netport;\n    in >> v.baudrate;\n    in >> v.databits;\n    in >> v.stopbits;\n    in >> v.flowcontrol;\n    in >> v.parity;\n    in >> v.driver;\n\n    return in;\n}\n\nRotProfilesManager::RotProfilesManager() :\n    ProfileManagerSQL<RotProfile>(\"rot_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, model, port_pathname, hostname, netport, baudrate, databits, stopbits, flowcontrol, parity, driver FROM rot_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            RotProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.model =  profileQuery.value(1).toInt();\n            profileDB.portPath =  profileQuery.value(2).toString();\n            profileDB.hostname =  profileQuery.value(3).toString();\n            profileDB.netport =  profileQuery.value(4).toUInt();\n            profileDB.baudrate =  profileQuery.value(5).toUInt();\n            profileDB.databits =  profileQuery.value(6).toUInt();\n            profileDB.stopbits =  profileQuery.value(7).toFloat();\n            profileDB.flowcontrol =  profileQuery.value(8).toString();\n            profileDB.parity =  profileQuery.value(9).toString();\n            profileDB.driver = profileQuery.value(10).toInt();\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"Rot Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nRotProfilesManager *RotProfilesManager::instance()\n{\n    FCT_IDENTIFICATION;\n\n    static RotProfilesManager instance;\n    return &instance;\n}\n\nvoid RotProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM rot_profiles\") )\n    {\n        qWarning() << \"cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO rot_profiles(profile_name, model, port_pathname, hostname, netport, baudrate, databits, stopbits, flowcontrol, parity, driver) \"\n                        \"VALUES (:profile_name, :model, :port_pathname, :hostname, :netport, :baudrate, :databits, :stopbits, :flowcontrol, :parity, :driver)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const RotProfile &rigProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":model\", rigProfile.model);\n            insertQuery.bindValue(\":port_pathname\", rigProfile.portPath);\n            insertQuery.bindValue(\":hostname\", rigProfile.hostname);\n            insertQuery.bindValue(\":netport\", rigProfile.netport);\n            insertQuery.bindValue(\":baudrate\", rigProfile.baudrate);\n            insertQuery.bindValue(\":databits\", rigProfile.databits);\n            insertQuery.bindValue(\":stopbits\", rigProfile.stopbits);\n            insertQuery.bindValue(\":flowcontrol\", rigProfile.flowcontrol);\n            insertQuery.bindValue(\":parity\", rigProfile.parity);\n            insertQuery.bindValue(\":driver\", rigProfile.driver);\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"Station Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"Rot Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\n\nbool RotProfile::operator==(const RotProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.model == this->model\n            && profile.portPath == this->portPath\n            && profile.hostname == this->hostname\n            && profile.netport == this->netport\n            && profile.baudrate == this->baudrate\n            && profile.databits == this->databits\n            && profile.stopbits == this->stopbits\n            && profile.flowcontrol == this->flowcontrol\n            && profile.parity == this->parity\n            && profile.driver == this->driver);\n}\n\nbool RotProfile::operator!=(const RotProfile &profile)\n{\n    return !operator==(profile);\n}\n\nRotProfile::rotPortType RotProfile::getPortType() const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !hostname.isEmpty()\n         && portPath.isEmpty() )\n    {\n        return RotProfile::NETWORK_ATTACHED;\n    }\n    return RotProfile::SERIAL_ATTACHED;\n}\n"
  },
  {
    "path": "data/RotProfile.h",
    "content": "#ifndef QLOG_DATA_ROTPROFILE_H\n#define QLOG_DATA_ROTPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n#include <QVariant>\n\n#include \"data/ProfileManager.h\"\n\n#define DEFAULT_ROT_MODEL 1\n\nclass RotProfile\n{\npublic:\n    enum rotPortType\n    {\n        SERIAL_ATTACHED,\n        NETWORK_ATTACHED\n    };\n\n    RotProfile() { model = DEFAULT_ROT_MODEL; netport = 0;\n                   baudrate = 0; databits = 0; stopbits = 0.0;\n                   driver = 0;};\n\n    QString profileName;\n    qint32 model;\n    QString portPath;\n    QString hostname;\n    quint16 netport;\n    quint32 baudrate;\n    quint8 databits;\n    float stopbits;\n    QString flowcontrol;\n    QString parity;\n    qint32 driver;\n\n    bool operator== (const RotProfile &profile);\n    bool operator!= (const RotProfile &profile);\n\n    rotPortType getPortType() const;\n\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const RotProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, RotProfile& v);\n\n};\n\nQ_DECLARE_METATYPE(RotProfile);\n\nclass RotProfilesManager : public ProfileManagerSQL<RotProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit RotProfilesManager();\n    ~RotProfilesManager() { };\n\n    static RotProfilesManager* instance();\n    void save();\n\n};\n\n#endif // QLOG_DATA_ROTPROFILE_H\n"
  },
  {
    "path": "data/RotUsrButtonsProfile.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"RotUsrButtonsProfile.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.data.rotusrbuttonsprofile\");\n\n\nQDataStream& operator<<(QDataStream& out, const RotUsrButtonsProfile& v)\n{\n\n    out << v.profileName;\n\n    for( int i = 0; i < v.shortDescs.size(); i++ )\n    {\n        out << v.shortDescs[i];\n    }\n\n    for( int i = 0; i < v.bearings.size(); i++ )\n    {\n        out << v.bearings[i];\n    }\n\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, RotUsrButtonsProfile& v)\n{\n    in >> v.profileName;\n\n    for( int i = 0; i < v.shortDescs.size(); i++ )\n    {\n        in >> v.shortDescs[i];\n    }\n\n    for( int i = 0; i < v.bearings.size(); i++ )\n    {\n        in >> v.bearings[i];\n    }\n\n    return in;\n}\n\nRotUsrButtonsProfilesManager::RotUsrButtonsProfilesManager() :\n    ProfileManagerSQL<RotUsrButtonsProfile>(\"rot_user_buttons_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, button1_short, button1_value, button2_short, button2_value, \"\n                                \"button3_short, button3_value, button4_short, button4_value \"\n                                \"FROM rot_user_buttons_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            RotUsrButtonsProfile profileDB;\n\n            int column = 0;\n            profileDB.profileName = profileQuery.value(column++).toString();\n\n            for ( int i = 0; i < profileDB.shortDescs.size(); i++ )\n            {\n                profileDB.shortDescs[i] = profileQuery.value(column++).toString();\n                profileDB.bearings[i] = profileQuery.value(column++).toDouble();\n            }\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"Rot User Button Profile DB select error \" << profileQuery.lastError().text();\n    }\n\n}\n\nvoid RotUsrButtonsProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM rot_user_buttons_profiles\") )\n    {\n        qWarning() << \"Cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO rot_user_buttons_profiles(profile_name, button1_short, button1_value, button2_short, button2_value,\"\n                               \"button3_short, button3_value, button4_short, button4_value)\"\n                        \"VALUES (:profile_name, :b1_short, :b1_value, :b2_short, :b2_value,\"\n                               \":b3_short, :b3_value, :b4_short, :b4_value)\") )\n    {\n        qWarning() << \"Cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key: keys )\n        {\n            const RotUsrButtonsProfile &rotUsrButtonProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            for ( int i = 0; i < rotUsrButtonProfile.shortDescs.size(); i++ )\n            {\n                insertQuery.bindValue(QString(\":b%1_short\").arg(i+1), rotUsrButtonProfile.shortDescs[i]);\n            }\n\n            for ( int i = 0; i < rotUsrButtonProfile.bearings.size(); i++ )\n            {\n                insertQuery.bindValue(QString(\":b%1_value\").arg(i+1), rotUsrButtonProfile.bearings[i]);\n            }\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"Rot User Button Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"Rot User Button Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n\n}\n\nbool RotUsrButtonsProfile::operator==(const RotUsrButtonsProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.shortDescs == this->shortDescs\n            && profile.bearings == this->bearings);\n}\n\nbool RotUsrButtonsProfile::operator!=(const RotUsrButtonsProfile &profile)\n{\n    return !operator==(profile);\n}\n"
  },
  {
    "path": "data/RotUsrButtonsProfile.h",
    "content": "#ifndef QLOG_DATA_ROTUSRBUTTONSPROFILE_H\n#define QLOG_DATA_ROTUSRBUTTONSPROFILE_H\n\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n\n#include \"data/ProfileManager.h\"\n\n#define MAX_ROT_USER_BUTTONS 4\n\nclass RotUsrButtonsProfile\n{\npublic:\n    RotUsrButtonsProfile()\n    {\n        shortDescs.resize(MAX_ROT_USER_BUTTONS);\n        bearings.resize(MAX_ROT_USER_BUTTONS);\n    }\n\n    QString profileName;\n    QVector<QString> shortDescs;\n    QVector<double> bearings;\n\n    bool operator== (const RotUsrButtonsProfile &profile);\n    bool operator!= (const RotUsrButtonsProfile &profile);\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const RotUsrButtonsProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, RotUsrButtonsProfile& v);\n\n};\n\nQ_DECLARE_METATYPE(RotUsrButtonsProfile);\n\nclass RotUsrButtonsProfilesManager : public ProfileManagerSQL<RotUsrButtonsProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit RotUsrButtonsProfilesManager();\n    ~RotUsrButtonsProfilesManager() { };\n\n    static RotUsrButtonsProfilesManager* instance()\n    {\n        static RotUsrButtonsProfilesManager instance;\n        return &instance;\n    };\n    void save();\n\n};\n\n#endif // QLOG_DATA_ROTUSRBUTTONSPROFILE_H\n"
  },
  {
    "path": "data/SOTAEntity.h",
    "content": "#ifndef QLOG_DATA_SOTAENTITY_H\n#define QLOG_DATA_SOTAENTITY_H\n\n#include <QtCore>\n\nclass SOTAEntity {\npublic:\n    QString summitCode;\n    QString associationName;\n    QString regionName;\n    QString summitName;\n    qint32 altm;\n    qint32 altft;\n    double gridref1;\n    double gridref2;\n    double longitude;\n    double latitude;\n    qint16 points;\n    qint16 bonusPoints;\n    QDate validFrom;\n    QDate validTo;\n};\n\n#endif // QLOG_DATA_SOTAENTITY_H\n"
  },
  {
    "path": "data/SerialPort.cpp",
    "content": "#include \"SerialPort.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.serialport\");\n\nSerialPort::SerialPort(QObject *parent)\n    : QObject{parent}\n{\n    FCT_IDENTIFICATION;\n\n}\n\nconst QString SerialPort::SERIAL_FLOWCONTROL_NONE = \"none\";\nconst QString SerialPort::SERIAL_FLOWCONTROL_HARDWARE = \"hardware\";\nconst QString SerialPort::SERIAL_FLOWCONTROL_SOFTWARE = \"software\";\nconst QString SerialPort::SERIAL_PARITY_EVEN = \"even\";\nconst QString SerialPort::SERIAL_PARITY_ODD = \"odd\";\nconst QString SerialPort::SERIAL_PARITY_MARK = \"mark\";\nconst QString SerialPort::SERIAL_PARITY_SPACE  = \"space\";\nconst QString SerialPort::SERIAL_PARITY_NO  = \"no\";\nconst QString SerialPort::SERIAL_SIGNAL_NONE = \"none\";\nconst QString SerialPort::SERIAL_SIGNAL_HIGH = \"high\";\nconst QString SerialPort::SERIAL_SIGNAL_LOW = \"low\";\n"
  },
  {
    "path": "data/SerialPort.h",
    "content": "#ifndef QLOG_DATA_SERIALPORT_H\n#define QLOG_DATA_SERIALPORT_H\n\n#include <QObject>\n#include <hamlib/rig.h>\n\nclass SerialPort : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit SerialPort(QObject *parent = nullptr);\n\n    static const QString SERIAL_FLOWCONTROL_NONE;\n    static const QString SERIAL_FLOWCONTROL_SOFTWARE;\n    static const QString SERIAL_FLOWCONTROL_HARDWARE;\n    static const QString SERIAL_PARITY_EVEN;\n    static const QString SERIAL_PARITY_ODD;\n    static const QString SERIAL_PARITY_MARK;\n    static const QString SERIAL_PARITY_SPACE;\n    static const QString SERIAL_PARITY_NO;\n    static const QString SERIAL_SIGNAL_NONE;\n    static const QString SERIAL_SIGNAL_HIGH;\n    static const QString SERIAL_SIGNAL_LOW;\n};\n\n#endif // QLOG_DATA_SERIALPORT_H\n"
  },
  {
    "path": "data/SpotAlert.h",
    "content": "#ifndef QLOG_DATA_SPOTALERT_H\n#define QLOG_DATA_SPOTALERT_H\n\n#include <QMetaType>\n#include \"data/WsjtxEntry.h\"\n#include \"data/DxSpot.h\"\n\nclass SpotAlert\n{\n\npublic:\n\n    enum ALERTSOURCETYPE\n    {\n        UKNOWN = 0,\n        DXSPOT = 0b1,\n        WSJTXCQSPOT = 0b10\n    };\n\n    ALERTSOURCETYPE source;\n    QStringList ruleNameList;\n    WsjtxEntry spot;\n\n    SpotAlert() : source(DXSPOT) {};\n\n    SpotAlert(const QStringList &ruleList, const DxSpot &sourceSpot) :\n        spot(sourceSpot)\n    {\n        source = SpotAlert::ALERTSOURCETYPE::DXSPOT;\n        ruleNameList = ruleList;\n    };\n\n    SpotAlert(const QStringList &ruleList, const WsjtxEntry &sourceWsjtx) :\n        spot(sourceWsjtx)\n    {\n        source = SpotAlert::ALERTSOURCETYPE::WSJTXCQSPOT;\n        ruleNameList = ruleList;\n    };\n\n    const DxSpot& getDxSpot() const {return spot;};\n\nprivate:\n\n};\n\nQ_DECLARE_METATYPE(SpotAlert);\n\n#endif // QLOG_DATA_SPOTALERT_H\n"
  },
  {
    "path": "data/StationProfile.cpp",
    "content": "#include \"data/StationProfile.h\"\n#include \"core/debug.h\"\n\n#include <QVariant>\n#include <QSqlQuery>\n#include <QSqlError>\n\nMODULE_IDENTIFICATION(\"qlog.data.stationprofile\");\n\nQDataStream& operator<<(QDataStream& out, const StationProfile& v)\n{\n    out << v.profileName << v.callsign << v.locator\n        << v.operatorName << v.operatorCallsign << v.qthName << v.iota\n        << v.sota << v.sig << v.sigInfo << v.vucc\n        << v.wwff << v.pota << v.ituz << v.cqz << v.dxcc << v.country << v.county << v.darcDOK;\n    return out;\n}\n\nQDataStream& operator>>(QDataStream& in, StationProfile& v)\n{\n    in >> v.profileName;\n    in >> v.callsign;\n    in >> v.locator;\n    in >> v.operatorName;\n    in >> v.operatorCallsign;\n    in >> v.qthName;\n    in >> v.iota;\n    in >> v.sota;\n    in >> v.sig;\n    in >> v.sigInfo;\n    in >> v.vucc;\n    in >> v.wwff;\n    in >> v.pota;\n    in >> v.ituz;\n    in >> v.cqz;\n    in >> v.dxcc;\n    in >> v.country;\n    in >> v.county;\n    in >> v.darcDOK;\n\n    return in;\n}\n\nStationProfilesManager::StationProfilesManager() :\n    ProfileManagerSQL<StationProfile>(\"station_profiles\")\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery profileQuery;\n\n    if ( ! profileQuery.prepare(\"SELECT profile_name, callsign, locator, \"\n                                \"operator_name, qth_name, iota, sota, sig, sig_info, vucc, pota, \"\n                                \"ituz, cqz, dxcc, country, county, operator_callsign, darc_dok \"\n                                \"FROM station_profiles\") )\n    {\n        qWarning()<< \"Cannot prepare select\";\n    }\n\n    if ( profileQuery.exec() )\n    {\n        while (profileQuery.next())\n        {\n            StationProfile profileDB;\n            profileDB.profileName = profileQuery.value(0).toString();\n            profileDB.callsign =  profileQuery.value(1).toString();\n            profileDB.locator =  profileQuery.value(2).toString();\n            profileDB.operatorName =  profileQuery.value(3).toString();\n            profileDB.qthName =  profileQuery.value(4).toString();\n            profileDB.iota =  profileQuery.value(5).toString();\n            profileDB.sota =  profileQuery.value(6).toString();\n            profileDB.sig =  profileQuery.value(7).toString();\n            profileDB.sigInfo =  profileQuery.value(8).toString();\n            profileDB.vucc =  profileQuery.value(9).toString();\n            profileDB.pota = profileQuery.value(10).toString();\n            profileDB.ituz = profileQuery.value(11).toInt();\n            profileDB.cqz = profileQuery.value(12).toInt();\n            profileDB.dxcc = profileQuery.value(13).toInt();\n            profileDB.country = profileQuery.value(14).toString();\n            profileDB.county = profileQuery.value(15).toString();\n            profileDB.operatorCallsign = profileQuery.value(16).toString();\n            profileDB.darcDOK = profileQuery.value(17).toString();\n\n            addProfile(profileDB.profileName, profileDB);\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB select error \" << profileQuery.lastError().text();\n    }\n}\n\nvoid StationProfilesManager::save()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlQuery deleteQuery;\n    QSqlQuery insertQuery;\n\n    if ( ! deleteQuery.prepare(\"DELETE FROM station_profiles\") )\n    {\n        qWarning() << \"cannot prepare Delete statement\";\n        return;\n    }\n\n    if ( ! insertQuery.prepare(\"INSERT INTO station_profiles(profile_name, callsign, locator, operator_name, qth_name, iota, sota, sig, sig_info, vucc, wwff, pota, ituz, cqz, dxcc, country, county, operator_callsign, darc_dok) \"\n                        \"VALUES (:profile_name, :callsign, :locator, :operator_name, :qth_name, :iota, :sota, :sig, :sig_info, :vucc, :wwff, :pota, :ituz, :cqz, :dxcc, :country, :county, :operator_callsign, :darc_dok)\") )\n    {\n        qWarning() << \"cannot prepare Insert statement\";\n        return;\n    }\n\n    if ( deleteQuery.exec() )\n    {\n        const QStringList &keys = profileNameList();\n        for ( const QString &key : keys )\n        {\n            StationProfile stationProfile = getProfile(key);\n\n            insertQuery.bindValue(\":profile_name\", key);\n            insertQuery.bindValue(\":callsign\", stationProfile.callsign);\n            insertQuery.bindValue(\":locator\", stationProfile.locator);\n            insertQuery.bindValue(\":operator_name\", stationProfile.operatorName);\n            insertQuery.bindValue(\":qth_name\", stationProfile.qthName);\n            insertQuery.bindValue(\":iota\", stationProfile.iota);\n            insertQuery.bindValue(\":sota\", stationProfile.sota);\n            insertQuery.bindValue(\":sig\", stationProfile.sig);\n            insertQuery.bindValue(\":sig_info\", stationProfile.sigInfo);\n            insertQuery.bindValue(\":vucc\", stationProfile.vucc);\n            insertQuery.bindValue(\":wwff\", stationProfile.wwff);\n            insertQuery.bindValue(\":pota\", stationProfile.pota);\n            insertQuery.bindValue(\":ituz\", stationProfile.ituz);\n            insertQuery.bindValue(\":cqz\", stationProfile.cqz);\n            insertQuery.bindValue(\":dxcc\", stationProfile.dxcc);\n            insertQuery.bindValue(\":country\", stationProfile.country);\n            insertQuery.bindValue(\":county\", stationProfile.county);\n            insertQuery.bindValue(\":operator_callsign\", stationProfile.operatorCallsign);\n            insertQuery.bindValue(\":darc_dok\", stationProfile.darcDOK);\n\n            if ( ! insertQuery.exec() )\n            {\n                qInfo() << \"Station Profile DB insert error \" << insertQuery.lastError().text() << insertQuery.lastQuery();\n            }\n        }\n    }\n    else\n    {\n        qInfo() << \"Station Profile DB delete error \" << deleteQuery.lastError().text();\n    }\n\n    saveCurProfile1();\n}\n\nStationProfile StationProfilesManager::findByCallsign(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << callsign;\n\n    const QStringList &names = profileNameList();\n    for ( const QString &name : names )\n    {\n        StationProfile profile = getProfile(name);\n        if ( profile.callsign.compare(callsign, Qt::CaseInsensitive) == 0 )\n            return profile;\n    }\n\n    return StationProfile();\n}\n\nbool StationProfile::operator==(const StationProfile &profile)\n{\n    return (profile.profileName == this->profileName\n            && profile.callsign == this->callsign\n            && profile.locator == this->locator\n            && profile.operatorName == this->operatorName\n            && profile.qthName == this->qthName\n            && profile.iota == this->iota\n            && profile.sota == this->sota\n            && profile.sig == this->sig\n            && profile.sigInfo == this->sigInfo\n            && profile.vucc == this->vucc\n            && profile.wwff == this->wwff\n            && profile.pota == this->pota\n            && profile.ituz == this->ituz\n            && profile.cqz == this->cqz\n            && profile.dxcc == this->dxcc\n            && profile.country == this->country\n            && profile.county == this->county\n            && profile.operatorCallsign == this->operatorCallsign\n            && profile.darcDOK == this->darcDOK\n            );\n}\n\nbool StationProfile::operator!=(const StationProfile &profile)\n{\n    return !operator==(profile);\n}\n\nQString StationProfile::toHTMLString() const\n{\n    QString ret = \"<b>\" + QObject::tr(\"Logging Station Callsign\") + \":</b> \" + callsign + \"<br/>\" +\n                  ((!locator.isEmpty()) ? \"<b>\" + QObject::tr(\"My Gridsquare\") + \":</b> \" + locator + \"<br/>\" : \"\") +\n                  ((!operatorName.isEmpty()) ? \"<b>\" + QObject::tr(\"Operator Name\") + \":</b> \" + operatorName + \"<br/>\" : \"\") +\n                  ((!operatorCallsign.isEmpty()) ? \"<b>\" + QObject::tr(\"Operator Callsign\") + \":</b> \" + operatorCallsign + \"<br/>\" : \"\") +\n                  ((!qthName.isEmpty()) ? \"<b>\" + QObject::tr(\"My City\") + \":</b> \" + qthName + \"<br/>\" : \"\") +\n                  ((!country.isEmpty()) ? \"<b>\" + QObject::tr(\"My Country\") + \":</b> \" + country + \"<br/>\" : \"\") +\n                  ((!county.isEmpty()) ? \"<b>\" + QObject::tr(\"My County\") + \":</b> \" + county + \"<br/>\" : \"\") +\n                  ((!iota.isEmpty()) ? \"<b>\" + QObject::tr(\"My IOTA\") + \":</b> \" + iota + \"<br/>\" : \"\") +\n                  ((!sota.isEmpty()) ? \"<b>\" + QObject::tr(\"My SOTA\") + \":</b> \" + sota + \"<br/>\" : \"\" ) +\n                  ((!sig.isEmpty()) ? \"<b>\" + QObject::tr(\"My Special Interest Activity\") + \":</b> \" + sig + \"<br/>\" : \"\" )+\n                  ((!sigInfo.isEmpty()) ? \"<b>\" + QObject::tr(\"My Spec. Interes Activity Info\") + \":</b> \" + sigInfo + \"<br/>\" : \"\" )+\n                  ((!vucc.isEmpty()) ? \"<b>\" + QObject::tr(\"My VUCC Grids\") + \":</b> \" + vucc + \"<br/>\" : \"\") +\n                  ((!wwff.isEmpty()) ? \"<b>\" + QObject::tr(\"My WWFF\") + \":</b> \" + wwff + \"<br/>\" : \"\") +\n                  ((!pota.isEmpty()) ? \"<b>\" + QObject::tr(\"My POTA Ref\") + \":</b> \" + pota : \"\") +\n                  ((!pota.isEmpty()) ? \"<b>\" + QObject::tr(\"My DARC DOK\") + \":</b> \" + darcDOK : \"\") +\n                  ((ituz != 0) ? \"<b>\" + QObject::tr(\"My ITU\") + \":</b> \" + QString::number(ituz) : \"\") + \" \" +\n                  ((cqz != 0) ? \"<b>\" + QObject::tr(\"My CQZ\") + \":</b> \" + QString::number(cqz) : \"\") + \" \" +\n                  ((dxcc != 0) ? \"<b>\" + QObject::tr(\"My DXCC\") + \":</b> \" + QString::number(dxcc) : \"\");\n    return ret;\n}\n\nQString StationProfile::getContactInnerJoin() const\n{\n    QStringList ret({\"contacts.station_callsign = station_profiles.callsign\",\n                     \"contacts.my_gridsquare = station_profiles.locator\"});\n\n    auto addIfNoEmpty = [&](const QString &field, const QString& contact, const QString &profile)\n    {\n        if ( ! field.isEmpty() ) ret << \"contacts.\" + contact + \" = station_profiles.\" + profile;\n    };\n\n    auto addIfNoEmptyNumber = [&](int field, const QString& contact, const QString &profile)\n    {\n        if ( field ) ret << \"contacts.\" + contact + \" = station_profiles.\" + profile;\n    };\n\n    addIfNoEmpty(operatorName, \"my_name_intl\", \"operator_name\");\n    addIfNoEmpty(qthName, \"my_city_intl\", \"qth_name\");\n    addIfNoEmpty(iota, \"my_iota\", \"iota\");\n    addIfNoEmpty(sota, \"my_sota\", \"sota\");\n    addIfNoEmpty(sig, \"my_sig_intl\", \"sig\");\n    addIfNoEmpty(sigInfo, \"my_sig_info_intl\", \"sig_info\");\n    addIfNoEmpty(vucc, \"my_vucc_grids\", \"vucc\");\n    addIfNoEmpty(wwff, \"my_wwff_ref\", \"wwff\");\n    addIfNoEmpty(pota, \"my_pota_ref\", \"pota\");\n    addIfNoEmptyNumber(ituz, \"my_itu_zone\", \"ituz\");\n    addIfNoEmptyNumber(cqz, \"my_cq_zone\", \"cqz\");\n    addIfNoEmptyNumber(dxcc, \"my_dxcc\", \"dxcc\");\n    // skipping Country - depends on dxcc\n    addIfNoEmpty(county, \"my_cnty\", \"county\");\n    addIfNoEmpty(operatorCallsign, \"operator\", \"operator_callsign\");\n    addIfNoEmpty(darcDOK, \"my_darc_dok\", \"darc_doc\");\n\n    return \"(\" + ret.join(\" AND \") + \")\";\n}\n"
  },
  {
    "path": "data/StationProfile.h",
    "content": "#ifndef QLOG_DATA_STATIONPROFILE_H\n#define QLOG_DATA_STATIONPROFILE_H\n\n#include <QMetaType>\n#include <QString>\n#include <QObject>\n#include <QDataStream>\n#include <QVariant>\n#include <QMap>\n\n#include \"data/ProfileManager.h\"\n\nclass StationProfile\n{\n\npublic:\n    StationProfile() : ituz(0), cqz(0), dxcc(0) {};\n\n    QString profileName;\n    QString callsign;\n    QString locator;\n    QString operatorName;\n    QString operatorCallsign;\n    QString qthName;\n    QString iota;\n    QString pota;\n    QString sota;\n    QString sig;\n    QString sigInfo;\n    QString vucc;\n    QString wwff;\n    int ituz;\n    int cqz;\n    int dxcc;\n    QString country;\n    QString county;\n    QString darcDOK;\n\n    bool operator== (const StationProfile &profile);\n    bool operator!= (const StationProfile &profile);\n\n    QString toHTMLString() const;\n    QString getContactInnerJoin() const;\n\nprivate:\n    friend QDataStream& operator<<(QDataStream& out, const StationProfile& v);\n    friend QDataStream& operator>>(QDataStream& in, StationProfile& v);\n};\n\nQ_DECLARE_METATYPE(StationProfile)\n\nclass StationProfilesManager : public ProfileManagerSQL<StationProfile>\n{\n    Q_OBJECT\n\npublic:\n\n    explicit StationProfilesManager();\n    ~StationProfilesManager() {};\n\n    static StationProfilesManager* instance()\n    {\n        static StationProfilesManager instance;\n        return &instance;\n    };\n    void save();\n    StationProfile findByCallsign(const QString &callsign);\n};\n\n\n#endif // QLOG_DATA_STATIONPROFILE_H\n"
  },
  {
    "path": "data/ToAllSpot.h",
    "content": "#ifndef QLOG_DATA_TOALLSPOT_H\n#define QLOG_DATA_TOALLSPOT_H\n\n#include <QtGlobal>\n#include \"data/Dxcc.h\"\n\nclass ToAllSpot {\npublic:\n    QDateTime time;\n\n    DxccEntity dxcc_spotter;\n    QString spotter;\n    QString message;\n};\n\n#endif // QLOG_DATA_TOALLSPOT_H\n"
  },
  {
    "path": "data/UpdatableSQLRecord.cpp",
    "content": "#include <QSqlField>\n\n#include \"UpdatableSQLRecord.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.updatableqslrecord\");\n\nUpdatableSQLRecord::UpdatableSQLRecord(int interval, QObject *parent)\n    : QObject{parent},\n      interval(interval)\n{\n    FCT_IDENTIFICATION;\n\n    connect(&timer, &QTimer::timeout, this, &UpdatableSQLRecord::emitStoreRecord);\n}\n\nUpdatableSQLRecord::~UpdatableSQLRecord()\n{\n    FCT_IDENTIFICATION;\n\n    timer.stop();\n}\n\nvoid UpdatableSQLRecord::updateRecord(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    if ( internalRecord.isEmpty() )\n    {\n        internalRecord = record;\n        qCDebug(runtime) << \"Record is empty, starting timer\" << interval;\n        timer.start(interval);\n        return;\n    }\n    else if ( !matchQSO(QSOMatchingType, record) )\n    {\n        qCDebug(runtime) << \"Records do not match\";\n        timer.stop();\n        emitStoreRecord();\n        internalRecord = record;\n    }\n    else\n    {\n        qCDebug(runtime) << \"Records match\";\n\n        timer.stop();\n        for ( int i = 0; i < record.count(); ++i )\n        {\n            const QString &fieldName = record.fieldName(i);\n\n            if ( !internalRecord.contains(fieldName) )\n                internalRecord.append(record.field(i));\n            else if ( !record.value(i).toString().isEmpty()\n                      && internalRecord.value(fieldName).toString().isEmpty() )\n                internalRecord.setValue(fieldName, record.value(i));\n        }\n    }\n\n    qCDebug(runtime) << \"starting timer\" << interval;\n    timer.start(interval);\n}\n\nvoid UpdatableSQLRecord::emitStoreRecord()\n{\n    FCT_IDENTIFICATION;\n\n    timer.stop();\n\n    if ( internalRecord.isEmpty() )\n        return;\n\n    qCDebug(runtime) << \"emitting record\";\n    emit recordReady(internalRecord);\n    internalRecord.clear();\n}\n\nbool UpdatableSQLRecord::matchQSO(const MatchingType matchingType,\n                                  const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &fields = matchingFields.value(matchingType);\n\n    for ( const QString &fieldName : fields )\n    {\n        qCDebug(runtime) << \"compare field name \" << fieldName\n                         << \"In value\" << internalRecord.value(fieldName)\n                         << \"New value\" << record.value(fieldName);\n\n        if ( internalRecord.value(fieldName) != record.value(fieldName))\n            return false;\n    }\n\n    return true;\n}\n"
  },
  {
    "path": "data/UpdatableSQLRecord.h",
    "content": "#ifndef QLOG_DATA_UPDATABLESQLRECORD_H\n#define QLOG_DATA_UPDATABLESQLRECORD_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include <QTimer>\n#include <QHash>\n\nclass UpdatableSQLRecord : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit UpdatableSQLRecord(int interval = 500,\n                                QObject *parent = nullptr);\n\n    ~UpdatableSQLRecord();\n    void updateRecord(const QSqlRecord &record);\n\nsignals:\n    void recordReady( QSqlRecord );\n\nprivate slots:\n    void emitStoreRecord();\n\nprivate:\n\n    enum MatchingType{\n        QSOMatchingType\n    };\n\n    QHash<MatchingType, QStringList> matchingFields\n    {\n        {QSOMatchingType, {\"callsign\", \"mode\", \"submode\"}}\n    };\n\n    bool matchQSO(const MatchingType,\n                  const QSqlRecord &);\n\n    QSqlRecord internalRecord;\n    QTimer timer;\n    int interval;\n};\n\n#endif // QLOG_DATA_UPDATABLESQLRECORD_H\n"
  },
  {
    "path": "data/WCYSpot.h",
    "content": "#ifndef QLOG_DATA_WCYSPOT_H\n#define QLOG_DATA_WCYSPOT_H\n\n#include <QtCore>\n\nclass WCYSpot {\npublic:\n    QDateTime time;\n    quint16 KIndex;\n    quint16 expK;\n    quint16 AIndex;\n    quint16 RIndex;\n    quint16 SFI;\n    QString SA;\n    QString GMF;\n    QString Au;\n};\n\n#endif // QLOG_DATA_WCYSPOT_H\n"
  },
  {
    "path": "data/WWFFEntity.h",
    "content": "#ifndef QLOG_DATA_WWFFENTITY_H\n#define QLOG_DATA_WWFFENTITY_H\n\n#include <QtCore>\n\nclass WWFFEntity {\npublic:\n    QString reference;\n    QString status;\n    QString name;\n    QString program;\n    QString dxcc;\n    QString state;\n    QString county;\n    QString continent;\n    QString iota;\n    QString iaruLocator;\n    double latitude;\n    double longitude;\n    QString iucncat;\n    QDate validFrom;\n    QDate validTo;\n};\n\n\n#endif // QLOG_DATA_WWFFENTITY_H\n"
  },
  {
    "path": "data/WWVSpot.h",
    "content": "#ifndef QLOG_DATA_WWVSPOT_H\n#define QLOG_DATA_WWVSPOT_H\n\n#include <QtCore>\n\nclass WWVSpot {\npublic:\n    QDateTime time;\n    quint16 SFI;\n    quint16 AIndex;\n    quint16 KIndex;\n    QString info1;\n    QString info2;\n};\n\n#endif // QLOG_DATA_WWVSPOT_H\n"
  },
  {
    "path": "data/WsjtxDecode.h",
    "content": "#ifndef QLOG_DATA_WSJTXDECODE_H\n#define QLOG_DATA_WSJTXDECODE_H\n\n#include <QString>\n#include <QTime>\n\nclass WsjtxDecode\n{\npublic:\n    QString id, mode, message;\n    bool is_new, low_confidence, off_air;\n    QTime time;\n    qint32 snr;\n    quint32 df;\n    double dt;\n    operator QString() const\n    {\n        return QString(\"WsjtxDecode: \")\n                + \"(\"\n                + \"ID: \"            + id + \"; \"\n                + \"IsNew: \"         + QString::number(is_new) + \"; \"\n                + \"Time: \"          + time.toString() + \"; \"\n                + \"SNR: \"           + QString::number(snr) + \"; \"\n                + \"DeltaTime: \"     + QString::number(dt) + \"; \"\n                + \"DeltaFreq: \"     + QString::number(df) + \"; \"\n                + \"Mode: \"          + mode + \"; \"\n                + \"Message: \"       + message + \"; \"\n                + \"LowConfidence: \" + QString::number(low_confidence) + \"; \"\n                + \"OffAir: \"        + QString::number(off_air) + \"; \"\n                + \")\";\n    }\n};\n\n#endif // QLOG_DATA_WSJTXDECODE_H\n"
  },
  {
    "path": "data/WsjtxEntry.h",
    "content": "#ifndef QLOG_DATA_WSJTXENTRY_H\n#define QLOG_DATA_WSJTXENTRY_H\n\n#include \"data/WsjtxDecode.h\"\n#include \"data/DxSpot.h\"\n\nclass WsjtxEntry : public DxSpot\n{\n\npublic:\n\n    WsjtxDecode decode;\n    QString grid;\n    double distance;\n    QDateTime receivedTime;\n    QString decodedMode;\n\n    WsjtxEntry() : DxSpot(), distance(0.0){};\n\n    WsjtxEntry(const DxSpot &other) :\n        DxSpot(other), distance(0.0) {};\n\n    operator QString() const\n    {\n        return QString(\"WsjtxEntry \")\n        + \"Country: \" + QString::number(dxcc.dxcc) + \" \"\n        + \"CQZ\" + QString::number(dxcc.cqz) + \" \"\n        + \"ITUZ\" + QString::number(dxcc.ituz) + \" \"\n        + \"Status: \" + QString::number(status) + \" \"\n        + \"Band: \" + band + \" \"\n        + \"ModeGroup: \" + (BandPlan::isFTxMode(decodedMode) ? BandPlan::MODE_GROUP_STRING_FTx\n                                                             : BandPlan::MODE_GROUP_STRING_DIGITAL )  + \" \"\n        + \"spotter Country: \" + QString::number(dxcc_spotter.dxcc)  + \" \"\n        + \"Continent: \" + dxcc.cont  + \" \"\n        + \"Spotter Continent: \" + dxcc_spotter.cont  + \" \"\n        + \"Callsign: \" + callsign  + \" \"\n        + \"Message: \" + decode.message  + \" \"\n        + \"DX Member: \" + memberList2StringList().join(\", \");\n    };\n};\n\n#endif // QLOG_DATA_WSJTXENTRY_H\n"
  },
  {
    "path": "data/WsjtxLog.h",
    "content": "#ifndef QLOG_DATA_WSJTXLOG_H\n#define QLOG_DATA_WSJTXLOG_H\n\n#include <QString>\n#include <QDateTime>\n\nclass WsjtxLog\n{\npublic:\n    QString id, dx_call, dx_grid, mode, rprt_sent, rprt_rcvd;\n    QString tx_pwr, comments, name, op_call, my_call, my_grid, prop_mode;\n    QString exch_sent, exch_rcvd;\n    QDateTime time_on, time_off;\n    quint64 tx_freq;\n    operator QString() const\n    {\n        return QString(\"WsjtxLog: \")\n                + \"(\"\n                + \"ID: \"           + id + \"; \"\n                + \"DateTimeOff: \"  + time_off.toString() + \"; \"\n                + \"DXCall: \"       + dx_call + \"; \"\n                + \"DXGrid: \"       + dx_grid + \"; \"\n                + \"TXFreq: \"       + QString::number(tx_freq) + \"; \"\n                + \"Mode: \"         + mode + \"; \"\n                + \"RrpSent: \"      + rprt_sent + \"; \"\n                + \"RrpRcvd: \"      + rprt_rcvd + \"; \"\n                + \"TxPower: \"      + tx_pwr + \"; \"\n                + \"Comments: \"     + comments + \"; \"\n                + \"Name: \"         + name + \"; \"\n                + \"DateTimeOn: \"   + time_on.toString() + \"; \"\n                + \"OpCall: \"       + op_call + \"; \"\n                + \"MyCall: \"       + my_call + \"; \"\n                + \"MyGrid: \"       + my_grid + \"; \"\n                + \"ExchSent: \"     + exch_sent + \"; \"\n                + \"ExchRcvd: \"     + exch_rcvd + \"; \"\n                + \"ADIFPropMode: \" + prop_mode + \"; \"\n                + \")\";\n    }\n};\n\n#endif // QLOG_DATA_WSJTXLOG_H\n"
  },
  {
    "path": "data/WsjtxLogADIF.h",
    "content": "#ifndef QLOG_DATA_WSJTXLOGADIF_H\n#define QLOG_DATA_WSJTXLOGADIF_H\n\n#include <QString>\n\nclass WsjtxLogADIF\n{\npublic:\n    QString id, log_adif;\n\n    operator QString() const\n    {\n        return QString(\"WsjtxLogADIF\")\n                 + \"(\"\n                 + \"ID: \"  + id + \";\"\n                 + \"ADIF: \" + log_adif + \";\"\n                 + \")\";\n    }\n};\n\n#endif // QLOG_DATA_WSJTXLOGADIF_H\n"
  },
  {
    "path": "data/WsjtxStatus.h",
    "content": "#ifndef QLOG_DATA_WSJTXSTATUS_H\n#define QLOG_DATA_WSJTXSTATUS_H\n\n#include <QString>\n\nclass WsjtxStatus\n{\npublic:\n    QString id, mode, tx_mode, sub_mode;\n    QString dx_call, dx_grid, de_call, de_grid;\n    QString report;\n    quint64 dial_freq;\n    qint32 rx_df, tx_df;\n    bool tx_enabled, transmitting, decoding;\n    bool tx_watchdog, fast_mode;\n    quint8 special_op_mode;\n    quint32 freq_tolerance, tr_period;\n    QString conf_name, tx_message;\n\n    operator QString() const\n    {\n        return QString(\"WsjtxStatus: \")\n                + \"(\"\n                + \"ID: \"           + id + \"; \"\n                + \"Dial: \"         + QString::number(dial_freq) + \"; \"\n                + \"Mode: \"         + mode + \"; \"\n                + \"DXCall: \"       + dx_call + \"; \"\n                + \"Report: \"       + report + \"; \"\n                + \"TXMode: \"       + tx_mode + \"; \"\n                + \"TXEnabled: \"    + QString::number(tx_enabled) + \"; \"\n                + \"Transmitting: \" + QString::number(transmitting) + \"; \"\n                + \"Decoding: \"     + QString::number(decoding) + \"; \"\n                + \"RxDF: \"         + QString::number(rx_df) + \"; \"\n                + \"TxDF: \"         + QString::number(tx_df) + \"; \"\n                + \"DECall: \"       + de_call + \"; \"\n                + \"DEGrid: \"       + de_grid + \"; \"\n                + \"DXGrid: \"       + dx_grid + \"; \"\n                + \"TXWatchdog: \"   + QString::number(tx_watchdog) + \"; \"\n                + \"SubMode: \"      + sub_mode + \"; \"\n                + \"FastMode: \"     + QString::number(fast_mode) + \"; \"\n                + \"SpecOpMode: \"   + QString::number(special_op_mode) + \"; \"\n                + \"FreqTolerance: \"+ QString::number(freq_tolerance) + \"; \"\n                + \"TRPeriod: \"     + QString::number(tr_period) + \"; \"\n                + \"ConfName: \"     + conf_name + \"; \"\n                + \"TXMessage: \"    + tx_message + \"; \"\n                + \")\";\n    }\n};\n\n#endif // QLOG_DATA_WSJTXSTATUS_H\n"
  },
  {
    "path": "debian/changelog",
    "content": "qlog (0.50.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Split detection\n  * [NEW] - Added Developer and Support tools (PR #991 @aa5sh @foldynl)\n  * [NEW] - Added a simple QSL label printing dialog (issue #562)\n  * [NEW] - Added Cabrillo contest export\n  * [NEW] - Added direct labeling of QSL Requested and QSL Received to the QSO context menu (PR #982 @aa5sh)\n  * [NEW] - DXCC Submission Report (PR #967 @aa5sh)\n  * [NEW] - DXC - Search pre-fills the callsign from New Contact if callsign is present\n  * [NEW] - Settings - Added Danger Zone tab with Delete all passwords and QSOs\n  * [CHANGED] - Mutex-free Omnirig1 and Omnirig2\n  * [CHANGED] - POTA/SOTA/WWFF/SAT list are download from QLog LOV-repo\n  * [CHANGED] - Used an external lib for CSV parsing for LOV Download\n  * [CHANGED] - Import - ADIF import updates DXCC only if it is missing in the QSO (issue #983)\n  * [REMOVED] - Import - ADIF import does not include the option to update DXCC during the import - no longer needed\n  * Fixed Callsign disappears when calling a DX in a split via VFO-B (issue #799)\n  * Fixing Rendering issue (issue #989)\n  * Updated debian packaging (PR @979 thx @dawkagaming)\n  * Hamlib rigctld switching between VFO A/B doesnt change the band mode - added workaround (issue #999)\n  * Awards internal redesign\n  * Removed AN from the WAC award (issue #1010)\n\n -- foldynl <foldyna@gmail.com>  Sun, 26 Apr 2026 10:25:10 +0200\n\nqlog (0.49.1-1) UNRELEASED; urgency=low\n  * Fixed Online Map OSM Access Blocked banner (issue #956)\n  * Fixed Package build process issue - openssl-dev is missing (issue #957)\n  * Fixed Missing dependence for QTKeychain (issue #964)\n  * Added French Translation (PR #969 thx @fillods)\n\n -- foldynl <foldyna@gmail.com>  Thu, 19 Mar 2026 12:18:46 +0100\n\nqlog (0.49.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Pack and Unpack Data and Setting - Computer to Computer Migration (issue #535)\n  * [NEW] - Added Rig Sharing via Rigctld (PR #736 issue #159 @aa5sh @foldynl)\n  * [NEW] - Added QSL Gallery\n  * [NEW] - QSO Filter - Added REGEXP operator\n  * [NEW] - Settings - TQSL - Added Path auto-detect and validation\n  * [NEW] - Upload QSO - Added LoTW Station Location Combo (PR #929 @TrgoSk @foldynl)\n  * [NEW] - QSO Export - Added Station Profile Filter\n  * [NEW] - BandMap shows emergency frequencies (issue #462)\n  * [NEW] - Added Speed Up Down Macros - WinKey and CWDaemon (issue #491)\n  * [NEW] - Settings Winkey v2 - Added PaddleOnly Sidetone (issue #739)\n  * [NEW] - Settings Winkey v2 and CWDaemon - Added Sidetone Freq\n  * [NEW] - All County fields contain Completer for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n  * [NEW] - Added County Awards for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n  * [NEW] - ADIF 3.1.7 - Added new modes FT2, FREEDATA, RIBBIT_PIX, RIBBIT_SMS (issue #934)\n  * [CHANGED] - Generic FTx for FT8/FT4 (FT2) in Alert and DXC filter (issue #937)\n  * [CHANGED] - LoTW QSL matching algorithm uses Mode and Mode Group matching (issue #942)\n  * [CHANGED] - Reduced download period for DXCC Entities from 21 to 7 days\n  * LogbookWidget: Delete Performance Optimization\n  * Fixed Awards POTA Activator Filter\n  * Fixed man page\n  * Fixing SATmode Activity is blank (issue #948)\n\n -- foldynl <foldyna@gmail.com>  Fri, 13 Mar 2026 18:56:51 +0100\n\nqlog (0.48.0-1) UNRELEASED; urgency=low\n  * [NEW] - Rig Widget - tuning rig with mouse (issue #855)\n  * [NEW] - Awards - Added User Filter Combo (issue #870)\n  * [NEW] - Statistics - Added User Filter; new Dialog layout (issue #870)\n  * [NEW] - Alerts - Added detailed Log Status settings (issue #817)\n  * [NEW] - Settings - Enable/Disable sending color-coded status indicators back to WSJT-X (issue #885 @aa5sh @foldynl)\n  * [CHANGED] - Omnirig Drivers: Removed QT AXContainers - pure Windows API code\n  * [CHANGED] - Enabled Chekbox in Alerts Table (issue #867)\n  * [CHANGED] - Serial Port Completer contains Horizontal ScrollBar\n  * [CHANGED] - TCI - Settings - Default PWR defines the maximum output power\n  * Fixed Omnirig drivers keep sending frequency change (issue #872)\n  * Fixed ADIF import does not accept a default operator name (issue #884)\n  * Fixed HamQTH URL from http to https (PR #886 @aa5sh)\n  * Fixed Missing Band value when QSO from FLDigi (issue #892)\n\n -- foldynl <foldyna@gmail.com>  Fri, 30 Jan 2026 16:28:43 +0100\n\nqlog (0.47.1-1) UNRELEASED; urgency=low\n  * [CHANGED] - DXC - VE7CC-type Cluster is correctly detected (PR #851 @kyleboyle)\n  * [CHANGED] - Chat - Changed ON4KST URL (issue #857)\n  * Fixed missing clear button for Search Callsign (issue #753)\n  * Fixed Updated QSOs are not sent to wavelog (issue #847)\n  * Fixed Fixed Omnirig(v2) getFreq, getVFO, setFreq (issue #853)\n  * Fixed ADI Header does not follow ADIF Spec (issue #859)\n  * Fixed OmniRig settings are not saved (issue #862)\n\n -- foldynl <foldyna@gmail.com>  Fri, 19 Dec 2025 15:56:45 +0100\n\nqlog (0.47.0-1) UNRELEASED; urgency=low\n  * [NEW] - Adds theme options - native, light, dark (PR #718 @kyleboyle)\n  * [NEW] - Implemented ADIF 3.1.6\n  * [NEW] - ADIF 3.1.6 - Added new modes FSK and MTONE\n  * [NEW] - ADIF 3.1.6 - Added new contest IDs\n  * [NEW] - ADIF 3.1.6 - Added new column EQSL_AG (Import/Export only)\n  * [NEW] - Statistics, QSODetail contain deleted DXCC Entities (PR #728 @aa5sh @foldynl)\n  * [NEW] - Settings Hamlib - Added support to define CIV Addr for Icom and Ten-Tec (issue #747)\n  * [NEW] - Settings Hamlib - Added RTS and DTR control (PR #809 @aa5sh)\n  * [NEW] - Settings GUI - Added options to switch distance unit\n  * [NEW] - Added Linux manpage (PR #791 @dawkagaming)\n  * [NEW] - Added a link to the GitHub release notes under Help-Whats New\n  * [NEW] - Added workaround for WriteLog - always call callbook lookups (PR #833 @sjwoodr)\n  * [NEW] - Awards - Added Not-Confirmed filter (PR #836 @aa5sh)\n  * [NEW] - Rotator Widget - Added buttons to change button profiles\n  * [CHANGED] - Settings - Added network loop detection for WSJTX Forward (issue #815 @aa5sh @foldynl)\n  * [CHANGED] - Rotator - Rotator timeout is set to 5s (PR #823 @aa5sh)\n  * [CHANGED] - Double Spin Boxes - the decimal separator is forced to be a period\n  * [DELETED] - WSJTX Widget - Removed Freq and Mode\n  * Fixed QSODetail - Anti-meridian bug on map (issue #786)\n  * Fixed Statistics: Center maps on QTH longitude (issue #824)\n  * Fixed OmniRig disconnecting when its status changed unexpectedly (issue #832)\n\n -- foldynl <foldyna@gmail.com>  Sat, 6 Dec 2025 12:59:15 +0100\n\nqlog (0.46.2-1) UNRELEASED; urgency=high\n  * Fixed Spaces after QRZ.com name (issue #767)\n  * Fixed SPID Rot1Prog Rotator more 360 deg (issue #775)\n  * Fixed build instructions on Debian (PR #777 @leventelist)\n  * Fixed Bandmap truncated output despite having space (issue #779)\n  * Fixed Statistics - Anti-meridian bug on map (issue #786)\n  * Fixed Binary file in the tarballs (issue #794)\n  * Fixed LOTW and eQSL upload status updated even when nothing is uploaded (issue #807)\n  * Fixed Imported QSOs contain incorrect My DXCC info (issue #812)\n  * Fixed Statistics Dialog does not show confirmed grids\n\n -- foldynl <foldyna@gmail.com>  Fri, 31 Oct 2025 15:24:57 +0100\n\nqlog (0.46.1-1) UNRELEASED; urgency=low\n  * Fixed QSO filter incorrectly displays inserted date (issue #752)\n  * Fixed Logbook Search Icon is not centered (issue #753)\n  * Fixed Using CQRLog API Key for Clublog (issue #759)\n  * Fixed Online Service Password leaking via debug files (issue #760)\n  * Fixed Tabs are not showed properly (PR #762 @aa5sh)\n  * Fixed inability to edit Power in QSO Detail (issue #763)\n\n -- foldynl <foldyna@gmail.com>  Fri, 26 Sep 2025 17:14:06 +0200\n\nqlog (0.46.0-1) UNRELEASED; urgency=low\n  * [NEW] - NewContact: POTA/SOTA/WWFF/IOTA info is taken from the nearest spot (@aa5sh @foldynl)\n  * [NEW] - DXSpots are sent to Flex Radio (PR #694 @aa5sh)\n  * [NEW] - CWConsole - Added support for automatic periodic sending of CW Macros (issue #708)\n  * [NEW] - Added mapping of Winkey hardware buttons to CW macro keys F1–F4 (issue #711)\n  * [NEW] - Added Search Types to the Logbook Search Editbox (issue #733)\n  * [NEW] - Rig - Periodic Rig status reporting independent of its changes (PR #730 @aa5sh)\n  * [NEW] - Settings - Serial Port Completer for MacOS and Linux (PR #737 @aa5sh)\n  * [NEW] - Hamlib - Attempt to send Power On when connecting the Rig\n  * [NEW] - POTA Spots Info is received from the API at api.pota.app to improve POTA detection\n  * [CHANGED] - Logbook Search Filter Widget - Added Search Widget\n  * [CHANGED] - QSO Detail Country boxes use the new Search Filter Widget\n  * [CHANGED] - NewContact - RST field uses the Overwrite Mode\n  * [CHANGED] - NewContact - Default cursor position in RST is at the first character\n  * [CHANGED] - Setting Dialog - Modes - Default Report can define cursor position\n  * [CHANGED] - HamlibRot - Changed Poll Interval from 500 to 2000ms\n  * Fixed DUPE is not detected for the first Contest QSO (issue #699)\n  * Fixed FREQ_RX/BAND_RX is present only when RX and TX freqs are different (issue #714)\n  * Fixed Repeated log recording (issue #722)\n  * Fixed QSO Filter contains untranslated QSO items (issue #732)\n\n -- foldynl <foldyna@gmail.com>  Fri, 12 Sep 2025 16:58:08 +0200\n\nqlog (0.45.0-1) UNRELEASED; urgency=low\n  * [NEW] - Single Dialog for Upload/Download Online Services (issue #448)\n  * [NEW] - Added option to swap paddles to Winkey settings (issue #676)\n  * [NEW] - Added native support for the FLRig interface (issue #679)\n  * [NEW] - Added New Version Notification - only for MacOS and Windows (PR #669 @aa5sh)\n  * [NEW] - QRZ Upload - Added support for multiple API Keys\n  * [NEW] - Logbook - Added highlighting to the filter button when a filter is active\n  * [NEW] - WSJTX - Filtered label is shown when filter is enabled\n  * [NEW] - DXC - Filtered label is shown when filter is enabled\n  * [NEW] - Added support to Upload Cloudlog/Wavelog\n  * [NEW] - Add JS8 to legacy_modes.json (issue #677)\n  * [CHANGED] - Unification Settings storage\n  * [CHANGED] - Calculate distances according to IARU rules\n  * Fixed missing Wsjtx Spot values in the AlertWindow\n\n -- foldynl <foldyna@gmail.com>  Fri, 11 Jul 2025 16:17:43 +0200\n\nqlog (0.44.1-1) UNRELEASED; urgency=low\n  * Fixed Rotator Widget Seg Fault for new users (issue #666)\n\n -- foldynl <foldyna@gmail.com>  Sun, 11 May 2025 07:30:56 +0200\n\nqlog (0.44.0-1) UNRELEASED; urgency=low\n  * [NEW] - Activity Manager - Added SKCC, UKSMG and FISTS as Dynamic Fields\n  * [NEW] - QSO - FISTS, SKCC, and UKSMG are auto-filled from MembershipQE (issue #628)\n  * [NEW] - Rotator - Added QSO destination needle (issue #644)\n  * [NEW] - QSO Detail - Adds grayline and short path (PR #653 @kyleboyle)\n  * [CHANGED] - Rotator - Needle colors correspond to the online map (issue #644)\n  * Fixed TCI cw_macros must contain RigID (issue #663)\n  * Fixed TCI setKeySpeed sets keyer and macros speed (issue #663)\n  * Fixed Data mode missing in rig control window - rigctld (issue #660 @aa5sh)\n  * Improved DXC Mode detection\n  * Updated Simplified Chinese translation\n\n -- foldynl <foldyna@gmail.com>  Fri, 9 May 2025 17:05:38 +0200\n\nqlog (0.43.1-1) UNRELEASED; urgency=low\n  * Fixed Click on PHONE DX Spots sets wrong mode (issue #453)\n  * Fixed No freq via Omnirig for IC7400 (issue #639)\n\n -- foldynl <foldyna@gmail.com>  Sat, 19 Apr 2025 10:05:24 +0200\n\nqlog (0.43.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added support to receive QSOs from CSN SAT Device (PR #610 @aa5sh)\n  * [NEW] - Bandmap - Multiple independent bandmap windows (PR #593 @kyleboyle @foldynl)\n  * [NEW] - Winkey Keyer driver currently supports v1 and v2 hardware\n  * [NEW] - QSO Detail - QSLs QSLr Msg is editable\n  * [NEW] - Activity Manager - Added new dynamic field - QSL Message Send\n  * [CHANGED] - HamlibDrv - Enabled Power, RIT, XIT, Morse for RIG Netctl\n  * [CHANGED] - QSO Detail - QSLMSG replaced by QSLMSG_RCVD (issue #633)\n  * [CHANGED] - eQSL Upload - Added an option to choose a QSLMsg field\n  * [CHANGED] - eQSL Download - eQSL QSLMSG is stored to QLog QSLMSG_RCVD\n  * [CHANGED] - eQSL Download - Added QSLMSG_RCVD merging - eQSL message is appended\n  * Fixed Speed pot doesn't seem to work with a WinKeyer; double chars (issue #618)\n  * Fixed BandMap Spots colour change after a QSO (issue #632)\n  * Fixed Incorrect Field Mapping for Received eQSL Messages (issue #633)\n\n -- foldynl <foldyna@gmail.com>  Fri, 4 Apr 2025 14:19:18 +0200\n\nqlog (0.42.2-1) UNRELEASED; urgency=low\n  * Fixed Logbook country translations (issue #608)\n  * Fixed Unexpected dialog when QSO after contest (issue #614)\n  * Fixed Statistics Widget does not display NULL continents (@aa5sh)\n  * Fixed Statistics Widget does not display NULL Band, Mode\n  * Fixed Statistics Widget TOP10 does not display removed DXCCs\n  * Fixed Statistics Widget TOP10 does not display translated country names\n  * Fixed Awards Widget does not display removed DXCCs\n\n -- foldynl <foldyna@gmail.com>  Fri, 7 Mar 2025 15:19:11 +0100\n\nqlog (0.42.1-1) UNRELEASED; urgency=low\n  * Fixed Unexpected timezone info (issue #600)\n  * Fixed DXCC Statistics picks more entities (issue #601)\n  * Fixed a crash when no internet connection\n\n -- foldynl <foldyna@gmail.com>  Sat, 22 Feb 2025 11:45:02 +0100\n\nqlog (0.42.0-1) UNRELEASED; urgency=low\n  * [NEW] - Awards - Added Slots - total over each band (issue #538)\n  * [NEW] - Awards - Added Grid Award - 2/4/6 Chars grid (issue #564)\n  * [NEW] - Settings - Added options to switch 12/24 time and date format (issue #573)\n  * [NEW] - Activity Manager - Added new dynamic fields - Rig (issue #575)\n  * [NEW] - LoTW Import - Fill missing information also for confirmed QSOs (@aa5sh)\n  * [NEW] - Added CW macro QTH\n  * [NEW] - DXC - Added 15min Trend\n  * [CHANGED] - Changed IOTA LOV Source, the official web is used\n  * [CHANGED] - CSV Export: Time and Date formats use ISO8601 format (issue #562)\n  * [CHANGED] - Settings - Renamed Shortcuts to GUI tab\n  * [CHANGED] - LOV - Improved LOV download performance (PR #582 @aa5sh)\n  * Partial fix Windows State/Size does not save in case of fullscreen (issue #418)\n  * Fixing TCI error when you change Rig (issue #526)\n  * Fixed DXCC Award total worked confirmed counts included deleted entities (PR #588 @aa5sh)\n  * Fixed Raspberry PI Flatpak - Import Select file dialog crashes (issue #589)\n  * Suppressed the ability to edit Contest fields after the start (issue #590)\n\n -- foldynl <foldyna@gmail.com>  Fri, 14 Feb 2025 18:45:25 +0100\n\nqlog (0.41.1-1) UNRELEASED; urgency=low\n  * Fixed compilation issue under Debian 12 (issue #571)\n  * Fixed Incorrect GPL version in rpm/deb packages (issue #572)\n  * Fixed MacOS floating utility window bug (PR #576 @kyleboyle)\n  * Updated IT translation\n\n -- foldynl <foldyna@gmail.com>  Tue, 21 Jan 2025 14:00:52 +0100\n\nqlog (0.41.0-1) UNRELEASED; urgency=low\n  * [NEW] - Logbook - Added a new context menu item - Update QSO from Callbook (issue #450 @aa5sh)\n  * [NEW] - DIGI mode is used in case of DXC Digi Spots (issue #480)\n  * [NEW] - DXC - Retrieve information about SOTA, POTA, IOTA and WWFF from comment (issue #482)\n  * [NEW] - Alert - Added SOTA, POTA, IOTA and WWFF filter\n  * [NEW] - Added the COM Port Completer for Windows platform (issue #490)\n  * [NEW] - Settings - Added DXCC Confirmed By options (issue #508)\n  * [NEW] - Added POTA Export Formatter (activator/hunter) (PR #514 @kyleboyle)\n  * [NEW] - CW Console - CW Halt with the user-defined shortcut (issue #518)\n  * [NEW] - Added an input parameter to save debug message to file\n  * [NEW] - Logbook - Added sorting function to logbook table columns (PR #540 @kyleboyle)\n  * [NEW] - Network Notification - Added Rig Status Notification\n  * [NEW] - Implemented ADIF 3.1.5\n  * [NEW] - ADIF 3.1.5 - Added new submodes FSKH245 and FSKH105 for HELL\n  * [NEW] - ADIF 3.1.5 - Added new contest IDs\n  * [NEW] - ADIF 3.1.5 - Added new columns (Import/Export only)\n  * [NEW] - ADIF 3.1.5 - Added My DARC DOK to Station Profile\n  * [CHANGED] - Settings: disabled band and mode name modification\n  * [CHANGED] - DX Stats contain all enabled bands (issue #538)\n  * [CHANGED] - Removed Freq, TimeDate On/Off Data Type Indicators (issue #552)\n  * [CHANGED] - ADIF 3.1.5 - VUCC and MY_VUCC can contain 6 or 4-chars locators\n  * [CHANGED] - Stop exporting default value N for qsl_rcvd, qsl_sent, lotw/dcl/eslq_qsl_rcvd/sent\n  * [CHANGED] - Extended QSL/Import Dupe matching rule to Callsign, Band, Mode, Time and Sat_Name (issue #563)\n  * Fixed MacOS - keep floating windows visible on app unfocus (issue #530)\n  * Fixed Contest Filter ignores the first QSO (issue #529)\n  * Fixed It is not possible to quit Qlog with detached widgets Rot and Rig (issue #534)\n  * Fixed ADX/CSV/JSON do not export non-ASCII chars (issue #542)\n  * Fixed Checking the 60m checkbox in cluster filters allows 160m spots to appear (issue #543 @aa5sh)\n  * Fixed Problems uploading to QRZ.com (issue #559 PR #561 @aa5sh)\n  * Fixed DX Stat screen is jumping up/down\n  * Fixed Omnirig drivers: Digi modes are not correclty recognized\n\n -- foldynl <foldyna@gmail.com>  Sat, 11 Jan 2025 09:26:36 +0100\n\nqlog (0.40.1-1) UNRELEASED; urgency=low\n  * Fixed Bands - Added missing 8m band (issue #515)\n  * Fixed CW Console - EXCSTR does not work properly (issue #517)\n  * Fixed Activity Manager - Missing Propagation Mode None (issue #519)\n  * Fixed QSO Filter - filter fields with random order (PR #525 @aa5sh)\n  * Fixed TCI error when you change Rig (issue #526)\n  * Fixed NewContact - satellite mode too wide (issue #527)\n\n -- foldynl <foldyna@gmail.com>  Fri, 29 Nov 2024 12:07:56 +0100\n\nqlog (0.40.0-1) UNRELEASED; urgency=low\n  * [NEW] - Activity Manager - merged Layout Manager and profiles (issue #408)\n  * [NEW] - Activity Manager - Added new dynamic fields - Contest fields, RX/TX Power\n  * [NEW] - Added light support for contests (issue #345)\n  * [NEW] - Added CW macros EXCHSTR, EXCHNR, EXCHNRN\n  * [NEW] - Export Filter - Added user filter combo (original idea PR #476 @aa5sh)\n  * [NEW] - New Contact -  Added expand/collapse button to QSO field tab widget (PR #495 @kyleboyle)\n  * [NEW] - Alert - Added CQZ and ITUZ filters\n  * [NEW] - KSTChat - Added a new 40MHz room (PR #496 @kyleboyle)\n  * [NEW] - Station Profile contains Operator Callsign (issue #441 @kyleboyle)\n  * [NEW] - Station Profile contains County (issue #493 @kyleboyle)\n  * [NEW] - Statistics - Adds time of day and better qso mapping (PR #501 @kyleboyle)\n  * [NEW] - Bandmap - Tooltip shows a spotter callsign (PR #507 @Skittlebrau)\n  * [CHANGED] - New Contact - Renamed DXCC Tab to DX Stats contains DXCC and Station Statistics (issue #477)\n  * [CHANGED] - QSL Import dialog - Detail text is selectable by mouse and keyboard\n  * [CHANGED] - Removed Main Menu Layout; Activity Manager is in the bottom-left corner\n  * [CHANGED] - Removed Keep Options from the Equipment Menu - use Activity Manager for it\n  * Fixed issue when CW is always selected after Settings exiting or connecting the Rig\n  * Updated Timezone definition file - version 2024b\n\n -- foldynl <foldyna@gmail.com>  Sun, 24 Nov 2024 09:12:01 +0100\n\nqlog (0.39.0-1) UNRELEASED; urgency=low\n  * [NEW] - DXC - Added Full-text search\n  * [NEW] - Select S in RST Edit when focused (issue #454)\n  * [NEW] - Alerts - Added Member Column\n  * [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep\n  * [CHANGED] - Changed Backup policy\n  * [CHANGED] - Logbook page size - improved performance\n  * [CHANGED] - Logbook - CTRL-A (Select All) is disabled\n  * [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452)\n  * [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh)\n  * [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh)\n  * [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map\n  * [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received\n  * [CHANGED] - Added a postponed handling for Rig soft errors (issue #472)\n  * Fixed WSJT-X does not emit band change if rig is disconnected (issue #447)\n  * Fixed Wrong import of ADIF file of another log program (issue #455)\n  * Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458)\n  * Fixed ADIF import does not import records with old DXCC Entities (issue #459)\n  * Fixed ADIF import incorrectly uses Station Profile parameters (issue #461)\n  * Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464)\n  * Fixed Alerts Window displays OOB Spots (issue #469)\n  * Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470)\n\n -- foldynl <foldyna@gmail.com>  Sat, 5 Oct 2024 13:33:52 +0200\n\nqlog (0.38.0-1) UNRELEASED; urgency=low\n  * [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu\n  * [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh)\n  * [NEW] - Rig Setting - Added RTS/DTR PTT Type support (issue #353)\n  * [NEW] - Bandmap - Scrollbar position is saved per band (issue #415)\n  * [NEW] - New Contact - Added a dynamic value completer for SIG field (issue #425)\n  * [NEW] - Awards - Added SOTA/POTA/WWFF (@aa5sh issue #311)\n  * [NEW] - Awards - Added Not-Worked Filter\n  * [NEW] - New Contact - Added Long Path Azimuth info\n  * [NEW] - POTA Fields allow a comma-delimited list of one or more POTA Refs\n  * [NEW] - WSJTX tunes freq/mode like Rig if rig is disconnected\n  * [CHANGED] - Alert Widget is a Dock Widget (issue #399)\n  * [CHANGED] - QLog adds more information from callbook for WSJTX QSOs (issues #403 #405 #420)\n  * [CHANGED] - File Open dialogs are not a native dialog under Linux (issue #427)\n  * [CHANGED] - Profiles transferred to DB\n  * [CHANGED] - LOV last_dates transferred to DB\n  * [CHANGED] - DX Cluster - Login Callsign is always the base Callsign\n  * [REMOVED] - Setting DXCC Date\n  * Fix for MacOS Layout Geometry Restore (@aa5sh)\n  * Fixed TQSL does not block GUI thread\n  * Fixed MacOS build process (@aa5sh)\n\n -- foldynl <foldyna@gmail.com>  Thu, 29 Aug 2024 11:11:09 +0200\n\nqlog (0.37.2-1) UNRELEASED; urgency=low\n  * Fixed Field QSL Send Via should be retained (issue #413)\n  * Fixed Set rotator position fails if azimuth > 180 (issue #417)\n  * Fixed Windows State/Size does not save in case of fullscreen (issue #418)\n  * Fixed Significant rounding during azimuth calculation (issue #422)\n  * Updated Simplified Chinese translation\n  * Updated Spanish translaction\n  * Added Italian translation (thx IK1VQY)\n\n -- foldynl <foldyna@gmail.com>  Fri, 26 Jul 2024 13:54:11 +0200\n\nqlog (0.37.1-1) UNRELEASED; urgency=low\n  * Fixed QSO Table Callsign filter is not filled properly (issue #401)\n  * Fixed DXC zero frequency for last QSO in case of FT8 QSOs (issue #404)\n  * Fixed Callsign Context Menu does not work (issue #409)\n  * Fixed QSO Detail Save and Edit buttons are not translated (issue #410)\n\n -- foldynl <foldyna@gmail.com>  Wed, 10 Jul 2024 21:18:45 +0200\n\nqlog (0.37.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Shortcuts Editor (issue #293)\n  * [NEW] - Added QO100 Bandplan to correctly categorize the DX Spots\n  * [NEW] - Improveded detection of SH/DX SHF Spots\n  * [NEW] - Online Map - Added WSJTX CQ Spots\n  * [NEW] - WSJTX - Sortable View\n  * [NEW] - Alerts - Sortable View\n  * [NEW] - Added Spanish translation (thx LU1IDC)\n  * [NEW[ - Added Search Callsign Clear Button (issue #396)\n  * [CHANGED] - QRZ auth should be over POST with form data (issue #389)\n  * [CHANGED] - Big CTY file is used\n  * [CHANGED] - Callbook Country DXCC ID is used in case of difference from Big CTY\n  * [CHANGED] - Removed ALT+W and CTRL+DEL shortcuts\n  * [CHANGED] - Removed New Contact and Save Contact from Logbook Main Menu\n  * Fixed Guantanamo KG4 Issue (issue #372)\n  * Fixed QRZ Lookup Not Including Full Name - History (issue #388)\n  * Fixed Spot Last QSO contains TX freq, should contain RX freq (issue #390)\n  * Fixed Spot Last QSO must contain Freq in kHz (issue #391)\n  * Fixed Bandmap select previous selected callsign issue (issue #394)\n  * Fixed Malfunctioning tuning of WSJTX Alert spot\n  * Fixed DXCC Status for FT4 Spots incorrectly identified in WSJTX\n\n -- foldynl <foldyna@gmail.com>  Mon, 1 Jul 2024 16:01:04 +0200\n\nqlog (0.36.0-1) UNRELEASED; urgency=low\n  * [NEW] - WSJTX: Added support to received ADIF QSO Log record\n  * [NEW] - Sat mode is derived from RX/TX Freq\n  * [NEW] - Logbook filters change color when enabled\n  * [NEW] - Frequency input boxes PageUp/Dn switches the band (issue #360)\n  * [NEW] - CTRL + PgUp/Dn switch band on the connected rig - global shortcut (issue #360)\n  * [NEW] - Added number of filtered QSOs (issue #374)\n  * Fixed Callbook query does not work (issue #377)\n  * Fixed Logbook columns are reordered after Delete (issue #383)\n  * Fixed Missing Republic of Kosovo flag (issue #384)\n\n -- foldynl <foldyna@gmail.com>  Fri, 7 Jun 2024 15:44:02 +0200\n\nqlog (0.35.2-1) UNRELEASED; urgency=low\n  * Improved delete performance; added delete progress bar (issue #351)\n  * Fixed Password with plus is incorrectly sent to online services (issue #366)\n  * Fixed Compilation issue under v4.6 (issue #368)\n  * Fixed Network Rig configuration is not saved (issue #370)\n\n -- foldynl <foldyna@gmail.com>  Tue, 21 May 2024 19:57:13 +0200\n\nqlog (0.35.1-1) UNRELEASED; urgency=low\n  * Fixed Free QRZ callbook - Name is not populating (issue #363)\n  * Fixed Incorrect CW segment freqs (issue #365)\n\n -- foldynl <foldyna@gmail.com>  Mon, 6 May 2024 19:28:13 +0200\n\nqlog (0.35.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Rot Interface PSTRotator Network\n  * [NEW] - Added QSO/QSL Since option to eQSL Dialog\n  * [NEW] - Bandmap - Current Mode segment visualisation\n  * [NEW] - CW Console - Added Word/Whole mode switch\n  * [NEW] - Added Callbook Profile Image Widget\n  * [NEW] - ASCII conversion based on Text-Unidecode/iconv algorithm (issue #316 #350)\n  * [NEW] - ITU/CQ Zones can be defined in Station Profile (issue #358)\n  * [CHANGED] - Spacebar is used as a focus changer for fields where space is not allowed\n  * [CHANGED] - Focus does not select text in the input fields\n  * [CHANGED] - Force XCB under Linux Wayland\n  * [CHANGED] - Bandmap - Added Callsign/Freq/Mode to tooltip (issue #355)\n  * Fixed incorrect ADIF date format for clublog_qso_upload_date (issue #342)\n  * Fixed The last name from Callbooks queries (issue #346)\n\n -- foldynl <foldyna@gmail.com>  Fri, 3 May 2024 13:12:36 +0200\n\nqlog (0.34.0-1) UNRELEASED; urgency=low\n  * [NEW] - Rotator Widget - Azimuth by Clicking\n  * [NEW] - Rotator Widget - QSO button provides Short/Long Path (issue #330)\n  * [NEW] - Equipment Menu - Added Keep Options between application restart (issue #331)\n  * Fixed TCI - Thetis Connection issue (issue #327)\n  * Fixed TCI - Spots To Rig are not displayed (issue #328)\n  * Fixed Bandmap unintentionally emits frequency labels (issue #333)\n  * Fixed Failing to load grid square for G and EI SOTA summits (issue #336)\n  * Fixed HRDLog On-Air message is not sent (issue #337)\n  * Fixed Offline Map - Improved Path drawing\n\n -- foldynl <foldyna@gmail.com>  Mon, 25 Mar 2024 13:54:20 +0100\n\nqlog (0.33.1-1) UNRELEASED; urgency=critical\n  * Fixed Rotator offline map is incorrectly centered (issue #324)\n  * Fixed Hamlib integration not working (issue #325)\n  * Fixed issue when Hamlib reopen rig caused Initialization Error\n  * Fixed issue when Omnirig Drv did not emit rigIsReady signal\n\n -- foldynl <foldyna@gmail.com>  Sat, 9 Mar 2024 13:37:01 +0100\n\nqlog (0.33.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Rig Interface TCI\n  * [NEW] - Callbook search can be temporarily paused\n  * Improved DXC Mode recognition\n  * Fixed Modal dialog blinks - Windows platform (issue #315)\n  * Fixed LoTW and eQSL download are only QSLs dowloads - button label changed (issue #318)\n  * Fixed i18n: Country Names and Prop-modes are translated (issue #322)\n\n -- foldynl <foldyna@gmail.com>  Fri, 8 Mar 2024 11:49:26 +0100\n\nqlog (0.32.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Rig Interface Omnirig v1 (Windows only)\n  * [NEW] - Added Rig Interface Omnirig v2 (Windows only)\n  * [NEW] - Clublog - Added Clear Clublog and reupload QSOs\n  * [NEW] - Clublog - Added Real-time Insert/Update/Delete\n  * [CHANGED] - Clublog - Upload callsign is derived from the Current Profile Callsign\n  * Fixed clang linker failed issue (issue #301)\n  * Fixed SAT Mode U/U missing (issue #308 PR #309 thanks ea5wa)\n  * Fixed Multiple QSO selection. Callsigns modified by mistake (issue #310)\n  * Fixed Callbook query cache is not properly cleared when Callbook settings change (issue #313)\n\n -- foldynl <foldyna@gmail.com>  Sat, 10 Feb 2024 17:31:58 +0100\n\nqlog (0.31.0-1) UNRELEASED; urgency=low\n  * [NEW] - DXC - Improved Mode recognition\n  * [NEW] - DXC - Switch Rig mode based on DXC Spot Mode (issue #217)\n  * [NEW] - DXC - Added Spot Country Column (issue #273)\n  * [NEW] - DXC - Added Menu for server management\n  * [NEW] - DXC - Added Auto-connect to server\n  * [NEW] - DXC - Added Keep QSOs Context Menu\n  * [NEW] - DXC - Added Clear QSO Context Menu\n  * [NEW] - DXC - Added support for SH/DX response parsing\n  * [NEW] - DXC - Added support for username, password for connection\n  * [CHANGED] - DXC - Commands Combo changed to function button with selectable function\n  * [CHANGED] - DXC - DX Spot is prepared via DXC Command Line, Remark dialog was removed\n  * [NEW] - Online Map - IBP station double-click tunes freq and switch Rig mode\n  * [NEW] - Main Window - Current profile name is shown (issue #282)\n  * [NEW] - Import - Details can be saved to file (issue #284)\n  * [NEW] - Added Simplified Chinese translation (PR #285 thank BG7JAF)\n  * [NEW] - New Contact - Enter saves QSO if QSO time is running (issue #293 - partial)\n  * [NEW] - New Contact - Callsign Enter event saves QSO if no Callbook is active - Pileup Mode (issue #293)\n  * [NEW] - RIG Widget - RIT/XIT are displayed with user-friendly units (issue #294)\n  * [CHANGED] - SAT List download - Shortened download period for SAT list from 30 to 7 days\n  * Fixed ADI Import is too slow (issue #270)\n  * Improved Import/Export Performance\n  * Fixed Missing Satellite Mode SX (issue #291)\n  * Fixed QSO Detail - Issue when Sat-Name field was always disabled\n  * Fixed RPM build - Installed (but unpackaged) metainfo file issue\n\n -- foldynl <foldyna@gmail.com>  Fri, 5 Jan 2024 11:23:36 +0100\n\nqlog (0.30.0-1) UNRELEASED; urgency=low\n  * [NEW] - QSL Images are stored in the database\n  * [NEW] - Added AppStream Metainfo File (PR #262 thanks AsciiWolf)\n  * [NEW] - Added (WPX) prefix (issue #263)\n  * [NEW] - Added WPX Award statistics\n  * [NEW] - Added support for external translation files(issue #275)\n  * [CHANGED] - Removed QSOID from Export dialog column setting (issue #258)\n  * Fixed Date editor does not support NULL value in Logbook Direct Editor (issue #256)\n  * Fixed duplicate entry in Windows Add or Remove - only Window platform (issue #260)\n  * Fixed RST fields revert to 59 after changing them (issue #261)\n  * Fixed Cannot change TQSL Path in Settings - flatpak (issue #271)\n\n -- foldynl <foldyna@gmail.com>  Fri, 1 Dec 2023 16:23:18 +0100\n\nqlog (0.29.2-1) UNRELEASED; urgency=low\n  * Fixed QLog is already running error popup on MacOS (issue #257 thanks rjesson)\n\n -- foldynl <foldyna@gmail.com>  Mon, 13 Nov 2023 14:46:57 +0100\n\nqlog (0.29.1-1) UNRELEASED; urgency=low\n  * Fixed QSL cards tooltip are not displayed under qt6.5 (issue #248)\n  * Fixed Distance unit is not displayed in QSO Info under Windows (issue #250)\n  * Fixed Editing STATION_CALLSIGN can cause unwanted change in QSO Detail (issue #251)\n  * Fixed QSO Detail Operator Name containes an incorrect value (issue #252)\n  * Fixed Calls with VE, VA are coding as Amsterdam & St Paul Islands instead of Canada (issue #253)\n  * Fixed LoTW QSL import reports unmatched QSOs sometime (issue #254)\n\n -- foldynl <foldyna@gmail.com>  Fri, 10 Nov 2023 08:50:15 +0100\n\nqlog (0.29.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added user-defined layout for New QSO Detail widget\n  * [NEW] - Main window State and Geometry can be saved to layout profile\n  * [NEW] - Awards - Added WAS\n  * [NEW] - Awards - WAZ/ITU/WAC show all possible values\n  * [NEW] - Distance unit (km/miles) is controlled by OS Locale\n  * [CHANGED] - Removed SAT Tab - field can be added via Layout Editor\n  * Improved Import QSO performance\n  * Fixed QLog crashes if POTA, SOTA or WWFF contain incorrect values (issue #245)\n  * Fixed QSOs are not uploaded to QRZ and HRDLog if fields contain HTML delimiter strings (issue #247)\n\n -- foldynl <foldyna@gmail.com>  Fri, 20 Oct 2023 15:58:36 +0200\n\nqlog (0.28.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added ON4KST Chat Support\n  * [NEW] - Added Az BeamWidth and Az Offset to Antenna Profile\n  * [NEW] - Double-Clicking the IBP callsign in the online map tunes the frequency\n  * Fixed Browse button should open an expecting folder (issue #241)\n  * Fixed Reword QSL buttons and Settings in QSO Details and Settings (issue #242)\n\n -- foldynl <foldyna@gmail.com>  Fri, 22 Sep 2023 16:26:02 +0200\n\nqlog (0.27.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added HRDLog Support\n  * Fixed Text field alignment (issue #233)\n  * Fixed Rig/Rot Connection port type selection (issue #235)\n  * Fixed Incorrect Distance Value in WSJTX Widget (issue #236)\n  * Fixed Incorrect WSJTX locator target on the map (issue #237)\n\n -- foldynl <foldyna@gmail.com>  Mon, 21 Aug 2023 19:32:02 +0200\n\nqlog (0.26.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added user-defined layout for New QSO widget\n  * [NEW] - Pressing Spacebar in Callsign field skips RST fields\n  * [NEW] - Added user-defined URL for web lookup (issue #230)\n  * Fixed WSJTX QSOs should have an Operator Name from Callbook (issue #223)\n  * Fixed US call area suffixes not handled correctly (issue #226 thanks Florian)\n  * Fixed QSO Filter Detail allows to save an empty Filter Name (issue #228)\n\n -- foldynl <foldyna@gmail.com>  Sun, 30 Jul 2023 19:27:08 +0200\n\nqlog (0.25.1-1) UNRELEASED; urgency=low\n  * Fixed Unexpected mode change when Setting Dialog is saved (issue #222)\n  * Fixed QSL_SENT field has an incorrect ADIF name (issue #225)\n\n -- foldynl <foldyna@gmail.com>  Mon, 17 Jul 2023 13:49:01 +0200\n\nqlog (0.25.0-1) UNRELEASED; urgency=low\n  * [NEW] - Export - Added CSV Format\n  * [NEW] - Export - Added Type of Export Generic/QSLs (issue #209)\n  * [NEW] - Export - Added Exported Columns Setting\n  * [NEW] - Export - All export formats use the ADIF field name convention\n  * [CHANGED] - Export - JSON format contains a header - JSON format change\n  * [CHANGED] - Default Statistics Interval is curr_date-1 and curr_day\n  * Fixed Errors from Secure Storage are not shown (issue #216)\n  * Fixed RX/TX Bands are uneditable when RX/TX freqs are missing (issue #220)\n\n -- foldynl <foldyna@gmail.com>  Tue, 4 Jul 2023 15:05:16 +0200\n\nqlog (0.24.0-1) UNRELEASED; urgency=low\n  * Fixed Incorrect FT4 mode-submode (issue #212)\n  * Fixed CONTESTIA mode should be CONTESTI (issue #213)\n  * Fixed Context menu deselects NewContactEditLine (issue #215)\n  * Fixed incorrect WSJTX Filter initialization (issue #218)\n\n -- foldynl <foldyna@gmail.com>  Fri, 16 Jun 2023 12:20:54 +0200\n\nqlog (0.23.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added CWDaemon Keyer Support\n  * [NEW] - Added FLDigi Keyer Support\n  * [NEW] - Online Map - based on locale, the map language is selected (Only EN, FR, GE supported - issue #180)\n  * Fixed After entering longer QTH, the field content is not left-aligned (issue #157)\n  * Fixed wrong QSO Time in case of JTDX (issue #204)\n  * Fixed QSL Sent Date fields are not filled if QSL Sent Status fields are Y (issue #207)\n\n -- foldynl <foldyna@gmail.com>  Fri, 9 Jun 2023 12:00:00 +0200\n\nqlog (0.22.0-1) UNRELEASED; urgency=low\n  * [NEW] - ADIF Import - My Profile is used to define default values\n  * [NEW] - ADIF Import - Checking a minimal set of input fields (start_time, call, band, mode, station_callsign)\n  * [NEW] - ADIF Import - Added Import Result Summary + Import Detail Info\n  * [NEW] - Main Menu - Added Help -> Mailing List.\n  * [NEW] - Export - Filter for the exported QSOs\n  * [CHANGE] - Renamed Locator to Gridsquare\n  * Fixed Some anomalies in the input and processing of QSLr Date (issue #192)\n  * Fixed User unfriedly CW Keyer Error (issue #194)\n  * Fixed ADIF import (issue #196)\n  * Fixed Operator field is incorrectly used  (issue #197)\n  * Fixed Crash if an unknown POTA & SOTA/WWFF Setting is entered (issue #198)\n  * Fixed FLDIGI cannot connect QLog (issue #199)\n  * Fixed if ADIF record is missing band info, add this from freq field (thx DJ5CW)\n\n -- foldynl <foldyna@gmail.com>  Sun, 7 May 2023 10:00:00 +0200\n\nqlog (0.21.0-1) UNRELEASED; urgency=low\n  * [NEW] - Rotator - Added Used-Defined Buttons\n  * [NEW] - Rotator - Added Destination Azimuth Needle\n  * [NEW] - Online Map - Added Antenna Beam Path\n  * [NEW] - Rig - Combos are disbled when disconnected\n  * [NEW] - Club Member Lists (issue #60)\n  * [NEW] - Alert Table shows rule names\n  * [CHANGED] - Alerts, DXC and WSJTX Network Notifications\n  * Fixed Antenna Azimuth Negative Value (issue #191)\n  * Fixed CTY file is not loaded when duplicate record (issue #193)\n\n -- foldynl <foldyna@gmail.com>  Tue, 16 Apr 2023 10:00:00 +0200\n\nqlog (0.20.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added MUF Layer to online map\n  * [NEW] - Added International Beacon Project (IBP) Beacons to online map\n  * [NEW] - Centering the map on the current profile at start (issue #185)\n  * Fixed incorrect ADIF interpretation of _SENT fields (issue #176)\n  * Fixed Awards Dialog, Table double click for ITU/CQZ/WAZ/IOTA shows incorrect QSOs (issue #177)\n  * Fixed ADIF double-type fields when 0.0 is currently mapped to NULL (issue #178)\n  * Fixed QSO Detail to save NULL instead of empty string (issue #179)\n  * Fixed ADIF Import default _INTL values are now stored correctly (issue #183)\n  * Fixed Maps show an incorrect path if from/to grids are the same (issue #186)\n  * Fixed Online Maps incorrect Bounds if Bandmap callsign double-click (issue #188)\n  * Updated German translation (thx DL2KI)\n\n -- foldynl <foldyna@gmail.com>  Tue, 14 Mar 2023 20:00:00 +0100\n\nqlog (0.19.0-1) UNRELEASED; urgency=low\n  * [NEW] - Added Aurora Layer to online map\n  * [NEW] - Logbook - filter options are saved and restored\n  * [NEW] - Map Setting is saved and restored (issue #140)\n  * [NEW] - QSO Duration (issue #158)\n  * [NEW] - DX Cluster uses monospace font (issue #164)\n  * [NEW] - Awards - if click on the Entity/band the logbook filter is set (issue #168)\n  * [NEW] - WSJTX - Added Multicast support (issue #172)\n  * Fixed WWFF LOV Download (issue #169)\n\n -- foldynl <foldyna@gmail.com>  Fri, 17 Feb 2023 15:00:00 +0100\n\nqlog (0.18.0-1) UNRELEASED; urgency=low\n  * [NEW] - ADIF 3.1.4 updates\n  *    Added new modes FREEDV and M17\n  *    Added new band (submm)\n  *    Adopted Altitude (for SOTA only)\n  *    Adopted POTA (includes POTA List)\n  *    Adopted Gridsquare_ext (only import/export)\n  *    Adopted Hamlogeu_* (only import/export)\n  *    Adopted HamQTH_* (only import/export)\n  * [NEW] - Added new DXCC Status and color for it - Confirmed\n  * [NEW] - New Contact - Tab selection is saved\n  * [NEW] - Grid can contain 8-characters\n  * [NEW] - User filter can contain NULL value\n  * [NEW] - Compilation - added variables for external sources\n  * [NEW] - My DXCC/CQZ/ITUZ/Country is filled\n  * [NEW] - Alerts - Added Aging (issue #153)\n  * [NEW] - Alerts - Added DXCC Status Color (issue #153)\n  * [NEW] - DXC - Added Log Status to filter (issue #154)\n  * [NEW] - DXC - Added Spot deduplication to filter (issue #154)\n  * [NEW] - WSJTX - Added CQ-Spot Filter (issue #155)\n  * [NEW] - QSO Detail contains DXCC Tab (issue #156)\n  * [CHANGED] - New QSO DXCC Tab reworked (issue #144)\n  * [CHANGED] - All DXCC Stats are computed based on My DXCC instead of My Callsign\n  * [CHANGED] - Station Profile Setting layout\n\n -- foldynl <foldyna@gmail.com>  Sun, 15 Jan 2023 15:00:00 +0100\n\nqlog (0.17.0-1) UNRELEASED; urgency=low\n  * [NEW] - NetPort and Polling interval can be defined for NET Rigs\n  * [NEW] - NetPort can be defined for NET Rots\n  * [NEW] - Added Saving Bandmap Zoom per band (issue #137)\n  * [NEW] - CW speed synchronisation (issue #139)\n  * Fixed Missing callbook data when callsign has prefix (issue #133)\n  * Fixed Winkey2 echo chars are incorrectly displayed in CW Console (issue #141)\n  * [CHANGED] - Online Map - Gray-Line is enabled by default\n  * Update Timezone database\n\n -- foldynl <foldyna@gmail.com>  Sun, 18 Dec 2022 10:00:00 +0100\n\nqlog (0.16.0-1) UNRELEASED; urgency=low\n  * [NEW] - SOTA/IOTA lists updated regularly\n  * [NEW] - Added WWFF list, updated regularly\n  * [NEW] - QTH/Grid are filled based on SOTA/WWFF\n  * [NEW] - DXC/WSJTX columns are movable, added column visibility setting\n  * [NEW] - DXC/WSJTX columns layout is saved\n  * [NEW] - Added Wiki&Report Issue links to Help section\n  * [NEW] - About dialog contains run-time information\n  * [NEW] - Solar Info as a ToolTip\n  * [NEW] - QSO Manual Entry Mode\n  * Fixed Bandmap unlogical animation when band is changed (issue #128)\n  * Fixed Bandmap marks are not displayed correctly when RIT/XI (issue #131)\n  * Fixed Setting Dialog size\n  * Update Timezone database\n\n -- foldynl <foldyna@gmail.com>  Sun, 20 Nov 2022 10:00:00 +0200\n\nqlog (0.15.0-1) UNRELEASED; urgency=low\n  * Fixed Keeping the Bandmap RX mark always visible when centre RX is disabled (issue #115)\n  * Fixed Equipment Menu: Swapped Connect Keyer and Rig (issue #122)\n  * Fixed Callsign is deleted when clicking bandmap (issue #126)\n  * Fixed typo in the Map layer menu (issue #127)\n  * Fixed compilation issues & warning under QT6 - preparation for QT6 migration\n\n -- foldynl <foldyna@gmail.com>  Sun, 16 Oct 2022 19:00:00 +0200\n\nqlog (0.14.1-1) UNRELEASED; urgency=low\n  * Fixed CW Console - HALT Button is not enabled under Ubuntu flavours (issue #124)\n\n -- foldynl <foldyna@gmail.com>  Sun, 2 Oct 2022 10:00:00 +0200\n\nqlog (0.14.0-1) UNRELEASED; urgency=low\n  * [NEW] CW Console (Winkey2, Morse over CAT support)\n  * [NEW] DX Cluster pre-defined commands (send last spot, get stats)\n  * [NEW] Added DX Cluster Views (Spots, WCY, WWV, ToALL)\n  * [NEW] Implemented DX Cluster Reconnection\n  * [NEW] Remember last used DX Cluster\n  * [CHANGED] - UI unifications - Rot/Rig/DXC\n  * Fixed COM port validation for Windows platform\n  * Fixed Reconnecting (DXC/Callbook) (issue #110)\n  * Fixed DX Cluster crashes when DXC server is not connected and a command is sent (issue #111)\n  * Fixed Bandmap callsign selection not fully works (issue #116)\n\n -- foldynl <foldyna@gmail.com>  Thu, 29 Sep 2022 18:00:00 +0200\n\nqlog (0.13.0-1) UNRELEASED; urgency=low\n  * [NEW] QSY Contact Wiping (issue #100)\n  * [NEW] Timeoff is highlighted when QSO timer is running (issue #100)\n  * [NEW] Callsign whisperer\n  * [NEW] Bandmap - Spot's color is recalculated when QSO is saved\n  * [NEW] BandMap - CTRL + Wheel zooming\n  * [NEW] BandMap - Zooming via buttons keeps a focus on centre freq\n  * [NEW] BandMap - DX Spot's Comment as a tooltip\n  * [CHANGED] BandMap - UI Layout\n  * Fixed MacOS builds (PR #102) (thx gerbert)\n  * Fixed templates under MacOS (PR #101) (thx gerbert)\n  * Fixed WindowsOS Installer - Unable to upgrade version\n\n -- foldynl <foldyna@gmail.com>  Sat, 6 Aug 2022 18:00:00 +0200\n\nqlog (0.12.0-1) UNRELEASED; urgency=low\n  * [NEW] Statistics - Show ODX on the map\n  * [EXPERIMENTAL] Support for QT Styles (issue #88)\n  * [CHANGED] - Removed F2 as a shortcut for QSO field editing\n  * Next fixing of a high CPU load when DXC is processed (issue #52)\n  * Fixed QSO fields from prev QSOs when Prefix - Callsign - Suffix (issue #90)\n  * Fixed Chaotic QSO start time (issue #93)\n  * Offline maps - Lighter colors, night sky removed, Sun position removed (issue #97)\n  * Fixed incorrect A-Index colort (issue #98)\n  * Fixed Stats Widget - percents - does not reflect date range (issue #99)\n  * Fixed potential LogParam Cache issue\n  * Import/Export polishing\n\n -- foldynl <foldyna@gmail.com>  Fri, 15 Jul 2022 18:00:00 +0200\n\nqlog (0.11.0-1) UNRELEASED; urgency=low\n  * [NEW] QSO Detail/Edit Dialog\n  * [NEW] Added mW power Support\n  * [NEW] Implemented ADIF 3.1.3\n  * [NEW] Rigwidget saves last used freq for bands\n  * Fixed Rig Combo size when Rig Profile name is long (issue #31)\n  * Fixed CQZ, ITUZ do not validate whether their entered value is a number (issue #75)\n  * Fixed vucc, myvucc must be uppercase - Edit mode (issue #76)\n  * Fixed Greyline-Map is very dark (issue #78)\n  * Fixed DX Country is not saved properly when name is between S-Z (issue #79)\n  * Fixed Bandmap call selection - only left mouse button (issue #82)\n  * Fixed My Notes Copy & Paste - Rich Text (issue #83)\n  * Fixed Font appearance in the context menu (issue #84)\n\n -- foldynl <foldyna@gmail.com>  Sun, 26 Jun 2022 8:00:00 +0200\n\nqlog (0.10.0-1) UNRELEASED; urgency=low\n  * [NEW] Bandmap shows XIT/RIT Freq\n  * [NEW] Bandmap RX Mark Center (issue #69)\n  * [NEW] Getting PTT State from RIG - only for CAT-controlled rigs\n  * [NEW] PTT Shortchut - only for CAT-controlled rigs\n  * Fixed Lost internet conneciton is not detected properly (issue #56)\n  * Fixed Cannot manually edit QSO Date&Time (issue #66)\n  * Fixed Field contents in capital letters (issue #67)\n  * Fixed Band RX is not updated when RX Freq is edited (issue #72)\n  * Fixed Stat Windget does not handle a date range correctly (issue #73)\n  * Fixed eQSL card is incorreclty handled when a callsign contains special characters (issue #74)\n\n -- foldynl <foldyna@gmail.com>  Sun, 5 Jun 2022 12:00:00 +0200\n\nqlog (0.9.0-1) UNRELEASED; urgency=low\n\n  * [NEW] User-defined Spot Alerts\n  * [NEW] User filter contains a new operator \"Starts with\"\n  * [NEW] a real local time is showed for the DX callsign (issue #45)\n  * [NEW] Lotw/eQSL registration info is shown from callbooks\n  * [NEW] Added shortcuts for menu and tabs\n  * [NEW] Bandmap - Switching a band view via Bandmap context menu (issue #57)\n  * [CHANGED] - Network Notification format\n  * Fixed issue with My Notes multiple lines edit/show mode (issue 39)\n  * Fixed issue when GUI froze when Rig disconnect was called (issue #50)\n  * Partially fixed a high CPU load when DXC is processed (issue #52)\n  * Fixed crashes under Debian \"bullseye\" - 32bit (issue #55)\n  * Fixed Bandmap Callsign selection margin (issue #61)\n  * Fixed issue when it was not possible to enter RX/TX freq manually\n\n -- foldynl <foldyna@gmail.com>  Fri, 20 May 2022 08:00:00 +0200\n\nqlog (0.8.0-1) UNRELEASED; urgency=low\n\n  * RIT/XIT offset enable/disable detection (issue #26)\n  * Fixed Rig Setting, Data Bits (issue #28)\n  * Added default PWR for Rig profile (issue #30)\n  * Fixed issue when GUI freezes during Rig connection (issue #32 & #33)\n  * Fixed issue with an incorrect value of A-Index (issue #34)\n  * Fixed ADI Import - incorrect _INTL fields import (issue #35)\n  * Fixed isuue with an editing of bands in Setting dialog (#issue 36)\n  * Fixed issue with hamlib when get_pwr crashes for a network rig (issue #37)\n  * Improved new QSO fields are filled from prev QSO (issue #40)\n  * Added mode for a network Rig (issue #41)\n  * Fixed warning - processing a new request but the previous one hasn't been completed (issue #42)\n  * Fixed Info widget when Country name is long (issue #43)\n  * Reordered column visibility Tabs (issue #46)\n  * Improved Rig tunning when XIT/RIT is enabled (issue #47)\n\n -- foldynl <foldyna@gmail.com>  Fri, 22 Apr 2022 08:00:00 +0200\n\nqlog (0.7.0-1) UNRELEASED; urgency=low\n\n  * [NEW] - Ant/Rig/Rot Profiles\n  * [NEW] - Rig widget shows additional information\n  * [NEW] - Rig widget Band/Mode/Profile Changer\n  * [NEW] - Rot profile Changer\n  * [NEW] - AZ/EL are stored when Rot is connected\n  * Fixed an issue with Statistic widget (issue #25)\n  * Fixed Rot AZ current value (issue #22)\n\n -- foldynl <foldyna@gmail.com>  Fri, 8 Apr 2022 12:00:00 +0200\n\n\nqlog (0.6.5-1) UNRELEASED; urgency=low\n \n  * Fixed missing modes in Setting Dialog (issue #11)\n  * Fixed Station Profile text color in dark mode (issue #10)\n  * Fixed DXCluster Server Combo (issue #12)\n  * Fixed TAB focus on QSO Fields (issue #14)\n\n -- foldynl <foldyna@gmail.com>  Thu, 10 Mar 2022 20:35:00 +0200\n\n\nqlog (0.6.0-1) UNRELEASED; urgency=low\n  * [NEW] QSL - added import a file with QSL - QSLr column\n  * Fixed QLog start when Band is 3cm (too long start time due to the Bandmap drawing) (issue #6)\n  * Fixed Rotator Widget Warning - map transformation issue (issue #8)\n  * Changed Bandmap window narrow size (issue #3)\n  * Changed User Filter Widget size\n  * Removed Units from Logbook widget\n  * Removed UTC string\n  * Renamed RSTs, RSTr etc. (issue #4)\n  * Renamed Main Menu Services->Service and Station->Equipment\n  * Internal - reworked Service networking signal handling\n\n -- foldynl <foldyna@gmail.com>  Sun, 5 Mar 2022 08:00:00 +0200\n\nqlog (0.5.0-1) UNRELEASED; urgency=low\n\n  * DB: Started to use *_INTL fields\n  * DB: Added all ADIF-supported modes/submodes\n  * GUI: Dark Mode\n  * GUI: TIme format controlled by Locale\n  * Import/Export: ADI do not export UTF-8 characters and *_INTL fields\n  * Import/Export: ADX exports UTF-8 characters and *_INTL fields\n  * Import/Export: Added Import of ADX file format\n  * Logbook: Shows QSO summary as a Callsign's tooltip\n  * Logbook: QSO time is shown with seconds; added timezone\n  * New QSO: Added My notes - free text for your personal notes\n  * Backup: Change backup format form ADI to ADX (ADX supports UTF-8)\n  * Settings: WSJTX Port is changable\n\n -- foldynl <foldyna@gmail.com>  Sat, 19 Feb 2022 12:00:00 +0200\n\nlog (0.4.0-1) UNRELEASED; urgency=low\n\n  * Stats: Added Show on Map - QSOs and Worked&Confirmed Grids\n  * Stats: Stats are refreshed after every QSO\n  * WSJTX: Remove TRX/Monitoring Status\n  * Added Split mode - RX/TX RIG Offset\n  * Added export of selected QSOs\n  * Fixed FLdigi interface\n  * CPPChecks & Clazy cleanup\n\n -- foldynl <foldyna@gmail.com>  Sun, 9 Jan 2022 12:00:00 +0200\n\nqlog (0.3.0-1) UNRELEASED; urgency=low\n\n  * Rework Station Profile - stored in DB, new fields\n  * Added VUCC fields support\n  * Added BandMap marks (CTRL+M)\n  * Clublog is uploaded the same way as EQSL and LOTW (modified QSO are resent)\n  * Clublog real-time upload is temporary disabled\n  * Added QRZ suppor - upload QSO and Callsign query\n  * Callbook cooperation - Primary&Secondary - Secondary used when Primary did not find\n\n -- foldynl <foldyna@gmail.com>  Sun, 19 Dec 2021 12:00:00 +0200\n\nqlog (0.2.0-1) UNRELEASED; urgency=low\n\n  * Fork changes\n  * Many GUI Changes\n  * Added Online Map\n  * Secure Storage for passwords\n  * Improved Logging\n  * CTY and SAT Name auto-update\n  * Added Station Profile\n  * Reworked Stats\n  * Added Awards\n  * Added Czech Translation\n  * many other changes\n\n -- foldynl <foldyna@gmail.com>  Sat, 27 Nov 2021 19:07:01 +0200\n\nqlog (0.1.0-1) UNRELEASED; urgency=low\n\n  * Initial release - non-public\n\n -- foldynl <foldyna@gmail.com>  Thu, 26 Aug 2021 19:50:55 +0200\n"
  },
  {
    "path": "debian/control",
    "content": "Source: qlog\nSection: hamradio\nPriority: optional\nMaintainer: Ladislav Foldyna <ok1mlg@gmail.com>\nUploaders: Ladislav Foldyna <foldyna@gmail.com>\nVcs-Browser: https://github.com/foldynl/QLog\nVcs-Git: https://github.com/foldynl/QLog.git\nBuild-Depends: \n debhelper (>= 10.0.0),\n debhelper-compat (= 13),\n qtbase5-dev,\n libsqlite3-dev,\n libhamlib-dev,\n libqt5charts5-dev,\n qtchooser,\n qttools5-dev-tools,\n libqt5keychain1,\n qt5keychain-dev,\n qtwebengine5-dev,\n libqt5serialport5-dev,\n pkg-config,\n libqt5websockets5-dev,\n zlib1g-dev,\n libssl-dev\nStandards-Version: 4.5.0\n\nPackage: qlog\nArchitecture: any\nDepends: ${shlibs:Depends}, ${misc:Depends}, gnome-keyring | kwalletmanager\nDescription: Qt Logging program for hamradio operators\n QLog is an Amateur Radio logging application for Linux, Windows and Mac OS. It\n is based on the Qt 5 framework and uses SQLite as database backend.\n\n"
  },
  {
    "path": "debian/copyright",
    "content": "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: qlog\nUpstream-Contact: Ladislav Foldyna <ok1mlg@gmail.com>\n\nFiles: *\nCopyright: 2020, Thomas Gatzweiler\n           2021-2026, Ladislav Foldyna <ok1mlg@gmail.com>\n           2025, Michael Morgan AA5SH\n           2025, Kyle Boyle\n\t   2018-2019, Bertold Van den Bergh\n\t   2026, Stephane Fillod \nLicense: GPL-3+\n\nFiles: debian/*\nCopyright: 2021-2026, Ladislav Foldyna <ok1mlg@gmail.com>\n           2025-2026, Dawid Kulas <sp9ska@op.pl>\nLicense: GPL-3+\n The package for qlog was put together first by Ladislav Foldyna <ok1mlg@gmail.com>\n\nFiles: res/io.github.foldynl.QLog.metainfo.xml\nCopyright: 2023-2026, Ladislav Foldyna <ok1mlg@gmail.com>\n           2023-2025, AsciiWolf <https://asciiwolf.com>\nLicense: CC0-1.0\n\nFiles: core/zonedetect.*\nCopyright: 2018, Bertold Van den Bergh <vandenbergh@bertold.org>\n\t   2022-2023, Ladislav Foldyna <ok1mlg@gmail.com>\nLicense: BSD-3-Clause\n\nFiles: devtools/timezones/*\nCopyright: 2018, Bertold Van den Bergh <vandenbergh@bertold.org>\n\t   2022-2024, Ladislav Foldyna <ok1mlg@gmail.com>\nLicense: ODbL-1.0\n\nFiles: ui/component/SwitchButton.h\n       ui/component/SwitchButton.cpp\n       ui/component/ButtonStyle.h\nCopyright:\n\t   2018-2020, Iman Ahmadvand\n\t   2025, Ladislav Foldyna <ok1mlg@gmail.com>\nLicense: GPL-3+\n\nFiles: core/csv.hpp\nCopyright: 2017-2024 Vincent Lau\n           2017-2019 Martin Moene (string-view lite, embedded)\nLicense: Expat\n\nFiles: devtools/timezones/builder/builder.cpp\nCopyright: \n\t   2018, Bertold Van den Bergh <vandenbergh@bertold.org>\n\t   2022-2024, Ladislav Foldyna <ok1mlg@gmail.com>\nLicense: BSD-3-Clause\n\nLicense: GPL-3+\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation, either version 3 of the License, or\n (at your option) any later version.\n .\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n .\n You should have received a copy of the GNU General Public License\n along with this program.  If not, see <https://www.gnu.org/licenses/>.\n .\nComment:\n On Debian systems, the full text of the GNU General Public License\n version 3 can be found in the file '/usr/share/common-licenses/GPL-3'.\n\nLicense: CC0-1.0\n To the extent possible under law, the author(s) have dedicated all copyright\n and related and neighboring rights to this software to the public domain\n worldwide. This software is distributed without any warranty.\n .\n You should have received a copy of the CC0 Public Domain Dedication along with\n this software. If not, see <https://creativecommons.org/publicdomain/zero/1.0/>.\nComment:\n On Debian systems, the full text of the CC0 1.0 Universal license can be\n found in the file '/usr/share/common-licenses/CC0-1.0'.\n\nLicense: BSD-3-Clause\n Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n .\n * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n .\n * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n .\n * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n .\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nLicense: ODbL-1.0\n ### Preamble\n .\n The Open Database License (ODbL) is a license agreement intended to\n allow users to freely share, modify, and use this Database while\n maintaining this same freedom for others. Many databases are covered by\n copyright, and therefore this document licenses these rights. Some\n jurisdictions, mainly in the European Union, have specific rights that\n cover databases, and so the ODbL addresses these rights, too. Finally,\n the ODbL is also an agreement in contract for users of this Database to\n act in certain ways in return for accessing this Database.\n .\n Databases can contain a wide variety of types of content (images,\n audiovisual material, and sounds all in the same database, for example),\n and so the ODbL only governs the rights over the Database, and not the\n contents of the Database individually. Licensors should use the ODbL\n together with another license for the contents, if the contents have a\n single set of rights that uniformly covers all of the contents. If the\n contents have multiple sets of different rights, Licensors should\n describe what rights govern what contents together in the individual\n record or in some other way that clarifies what rights apply. \n .\n Sometimes the contents of a database, or the database itself, can be\n covered by other rights not addressed here (such as private contracts,\n trade mark over the name, or privacy rights / data protection rights\n over information in the contents), and so you are advised that you may\n have to consult other documents or clear other rights before doing\n activities not covered by this License.\n .\n ------\n .\n The Licensor (as defined below) \n .\n and \n .\n You (as defined below) \n .\n agree as follows: \n .\n ### 1.0 Definitions of Capitalised Words\n .\n \"Collective Database\" - Means this Database in unmodified form as part\n of a collection of independent databases in themselves that together are\n assembled into a collective whole. A work that constitutes a Collective\n Database will not be considered a Derivative Database.\n .\n \"Convey\" - As a verb, means Using the Database, a Derivative Database,\n or the Database as part of a Collective Database in any way that enables\n a Person to make or receive copies of the Database or a Derivative\n Database.  Conveying does not include interaction with a user through a\n computer network, or creating and Using a Produced Work, where no\n transfer of a copy of the Database or a Derivative Database occurs.\n \"Contents\" - The contents of this Database, which includes the\n information, independent works, or other material collected into the\n Database. For example, the contents of the Database could be factual\n data or works such as images, audiovisual material, text, or sounds.\n .\n \"Database\" - A collection of material (the Contents) arranged in a\n systematic or methodical way and individually accessible by electronic\n or other means offered under the terms of this License.\n .\n \"Database Directive\" - Means Directive 96/9/EC of the European\n Parliament and of the Council of 11 March 1996 on the legal protection\n of databases, as amended or succeeded.\n .\n \"Database Right\" - Means rights resulting from the Chapter III (\"sui\n generis\") rights in the Database Directive (as amended and as transposed\n by member states), which includes the Extraction and Re-utilisation of\n the whole or a Substantial part of the Contents, as well as any similar\n rights available in the relevant jurisdiction under Section 10.4. \n .\n \"Derivative Database\" - Means a database based upon the Database, and\n includes any translation, adaptation, arrangement, modification, or any\n other alteration of the Database or of a Substantial part of the\n Contents. This includes, but is not limited to, Extracting or\n Re-utilising the whole or a Substantial part of the Contents in a new\n Database.\n .\n \"Extraction\" - Means the permanent or temporary transfer of all or a\n Substantial part of the Contents to another medium by any means or in\n any form.\n .\n \"License\" - Means this license agreement and is both a license of rights\n such as copyright and Database Rights and an agreement in contract.\n .\n \"Licensor\" - Means the Person that offers the Database under the terms\n of this License. \n .\n \"Person\" - Means a natural or legal person or a body of persons\n corporate or incorporate.\n .\n \"Produced Work\" -  a work (such as an image, audiovisual material, text,\n or sounds) resulting from using the whole or a Substantial part of the\n Contents (via a search or other query) from this Database, a Derivative\n Database, or this Database as part of a Collective Database.  \n .\n \"Publicly\" - means to Persons other than You or under Your control by\n either more than 50% ownership or by the power to direct their\n activities (such as contracting with an independent consultant). \n .\n \"Re-utilisation\" - means any form of making available to the public all\n or a Substantial part of the Contents by the distribution of copies, by\n renting, by online or other forms of transmission.\n .\n \"Substantial\" - Means substantial in terms of quantity or quality or a\n combination of both. The repeated and systematic Extraction or\n Re-utilisation of insubstantial parts of the Contents may amount to the\n Extraction or Re-utilisation of a Substantial part of the Contents.\n .\n \"Use\" - As a verb, means doing any act that is restricted by copyright\n or Database Rights whether in the original medium or any other; and\n includes without limitation distributing, copying, publicly performing,\n publicly displaying, and preparing derivative works of the Database, as\n well as modifying the Database as may be technically necessary to use it\n in a different mode or format. \n .\n \"You\" - Means a Person exercising rights under this License who has not\n previously violated the terms of this License with respect to the\n Database, or who has received express permission from the Licensor to\n exercise rights under this License despite a previous violation.\n .\n Words in the singular include the plural and vice versa.\n .\n ### 2.0 What this License covers\n .\n 2.1. Legal effect of this document. This License is:\n .\n   a. A license of applicable copyright and neighbouring rights;\n .\n   b. A license of the Database Right; and\n .\n   c. An agreement in contract between You and the Licensor.\n .\n 2.2 Legal rights covered. This License covers the legal rights in the\n Database, including:\n .\n   a. Copyright. Any copyright or neighbouring rights in the Database.\n   The copyright licensed includes any individual elements of the\n   Database, but does not cover the copyright over the Contents\n   independent of this Database. See Section 2.4 for details. Copyright\n   law varies between jurisdictions, but is likely to cover: the Database\n   model or schema, which is the structure, arrangement, and organisation\n   of the Database, and can also include the Database tables and table\n   indexes; the data entry and output sheets; and the Field names of\n   Contents stored in the Database;\n .\n   b. Database Rights. Database Rights only extend to the Extraction and\n   Re-utilisation of the whole or a Substantial part of the Contents.\n   Database Rights can apply even when there is no copyright over the\n   Database. Database Rights can also apply when the Contents are removed\n   from the Database and are selected and arranged in a way that would\n   not infringe any applicable copyright; and\n .\n   c. Contract. This is an agreement between You and the Licensor for\n   access to the Database. In return you agree to certain conditions of\n   use on this access as outlined in this License. \n .\n 2.3 Rights not covered. \n .\n   a. This License does not apply to computer programs used in the making\n   or operation of the Database; \n .\n   b. This License does not cover any patents over the Contents or the\n   Database; and\n .\n   c. This License does not cover any trademarks associated with the\n   Database. \n .\n 2.4 Relationship to Contents in the Database. The individual items of\n the Contents contained in this Database may be covered by other rights,\n including copyright, patent, data protection, privacy, or personality\n rights, and this License does not cover any rights (other than Database\n Rights or in contract) in individual Contents contained in the Database.\n For example, if used on a Database of images (the Contents), this\n License would not apply to copyright over individual images, which could\n have their own separate licenses, or one single license covering all of\n the rights over the images.  \n .\n ### 3.0 Rights granted\n .\n 3.1 Subject to the terms and conditions of this License, the Licensor\n grants to You a worldwide, royalty-free, non-exclusive, terminable (but\n only under Section 9) license to Use the Database for the duration of\n any applicable copyright and Database Rights. These rights explicitly\n include commercial use, and do not exclude any field of endeavour. To\n the extent possible in the relevant jurisdiction, these rights may be\n exercised in all media and formats whether now known or created in the\n future. \n .\n The rights granted cover, for example:\n .\n   a. Extraction and Re-utilisation of the whole or a Substantial part of\n   the Contents;\n .\n   b. Creation of Derivative Databases;\n .\n   c. Creation of Collective Databases;\n .\n   d. Creation of temporary or permanent reproductions by any means and\n   in any form, in whole or in part, including of any Derivative\n   Databases or as a part of Collective Databases; and\n .\n   e. Distribution, communication, display, lending, making available, or\n   performance to the public by any means and in any form, in whole or in\n   part, including of any Derivative Database or as a part of Collective\n   Databases.\n .\n 3.2 Compulsory license schemes. For the avoidance of doubt:\n .\n   a. Non-waivable compulsory license schemes. In those jurisdictions in\n   which the right to collect royalties through any statutory or\n   compulsory licensing scheme cannot be waived, the Licensor reserves\n   the exclusive right to collect such royalties for any exercise by You\n   of the rights granted under this License;\n .\n   b. Waivable compulsory license schemes. In those jurisdictions in\n   which the right to collect royalties through any statutory or\n   compulsory licensing scheme can be waived, the Licensor waives the\n   exclusive right to collect such royalties for any exercise by You of\n   the rights granted under this License; and,\n .\n   c. Voluntary license schemes. The Licensor waives the right to collect\n   royalties, whether individually or, in the event that the Licensor is\n   a member of a collecting society that administers voluntary licensing\n   schemes, via that society, from any exercise by You of the rights\n   granted under this License.\n .\n 3.3 The right to release the Database under different terms, or to stop\n distributing or making available the Database, is reserved. Note that\n this Database may be multiple-licensed, and so You may have the choice\n of using alternative licenses for this Database. Subject to Section\n 10.4, all other rights not expressly granted by Licensor are reserved.\n .\n ### 4.0 Conditions of Use\n .\n 4.1 The rights granted in Section 3 above are expressly made subject to\n Your complying with the following conditions of use. These are important\n conditions of this License, and if You fail to follow them, You will be\n in material breach of its terms.\n .\n 4.2 Notices. If You Publicly Convey this Database, any Derivative\n Database, or the Database as part of a Collective Database, then You\n must: \n .\n   a. Do so only under the terms of this License or another license\n   permitted under Section 4.4;\n .\n   b. Include a copy of this License (or, as applicable, a license\n   permitted under Section 4.4) or its Uniform Resource Identifier (URI)\n   with the Database or Derivative Database, including both in the\n   Database or Derivative Database and in any relevant documentation; and\n .\n   c. Keep intact any copyright or Database Right notices and notices\n   that refer to this License.\n .\n   d. If it is not possible to put the required notices in a particular\n   file due to its structure, then You must include the notices in a\n   location (such as a relevant directory) where users would be likely to\n   look for it.\n .\n 4.3 Notice for using output (Contents). Creating and Using a Produced\n Work does not require the notice in Section 4.2. However, if you\n Publicly Use a Produced Work, You must include a notice associated with\n the Produced Work reasonably calculated to make any Person that uses,\n views, accesses, interacts with, or is otherwise exposed to the Produced\n Work aware that Content was obtained from the Database, Derivative\n Database, or the Database as part of a Collective Database, and that it\n is available under this License.\n .\n   a. Example notice. The following text will satisfy notice under\n   Section 4.3:\n .\n         Contains information from DATABASE NAME, which is made available\n         here under the Open Database License (ODbL).\n .\n DATABASE NAME should be replaced with the name of the Database and a\n hyperlink to the URI of the Database. \"Open Database License\" should\n contain a hyperlink to the URI of the text of this License. If\n hyperlinks are not possible, You should include the plain text of the\n required URI's with the above notice.\n .\n 4.4 Share alike. \n .\n   a. Any Derivative Database that You Publicly Use must be only under\n   the terms of: \n .\n     i. This License;\n .\n     ii. A later version of this License similar in spirit to this\n       License; or\n .\n     iii. A compatible license. \n .\n   If You license the Derivative Database under one of the licenses\n   mentioned in (iii), You must comply with the terms of that license. \n .\n   b. For the avoidance of doubt, Extraction or Re-utilisation of the\n   whole or a Substantial part of the Contents into a new database is a\n   Derivative Database and must comply with Section 4.4. \n .\n   c. Derivative Databases and Produced Works.  A Derivative Database is\n   Publicly Used and so must comply with Section 4.4. if a Produced Work\n   created from the Derivative Database is Publicly Used.\n .\n   d. Share Alike and additional Contents. For the avoidance of doubt,\n   You must not add Contents to Derivative Databases under Section 4.4 a\n   that are incompatible with the rights granted under this License. \n .\n   e. Compatible licenses. Licensors may authorise a proxy to determine\n   compatible licenses under Section 4.4 a iii. If they do so, the\n   authorised proxy's public statement of acceptance of a compatible\n   license grants You permission to use the compatible license.\n .\n .\n 4.5 Limits of Share Alike.  The requirements of Section 4.4 do not apply\n in the following:\n .\n   a. For the avoidance of doubt, You are not required to license\n   Collective Databases under this License if You incorporate this\n   Database or a Derivative Database in the collection, but this License\n   still applies to this Database or a Derivative Database as a part of\n   the Collective Database; \n .\n   b. Using this Database, a Derivative Database, or this Database as\n   part of a Collective Database to create a Produced Work does not\n   create a Derivative Database for purposes of  Section 4.4; and\n .\n   c. Use of a Derivative Database internally within an organisation is\n   not to the public and therefore does not fall under the requirements\n   of Section 4.4.\n .\n 4.6 Access to Derivative Databases. If You Publicly Use a Derivative\n Database or a Produced Work from a Derivative Database, You must also\n offer to recipients of the Derivative Database or Produced Work a copy\n in a machine readable form of:\n .\n   a. The entire Derivative Database; or\n .\n   b. A file containing all of the alterations made to the Database or\n   the method of making the alterations to the Database (such as an\n   algorithm), including any additional Contents, that make up all the\n   differences between the Database and the Derivative Database.\n .\n The Derivative Database (under a.) or alteration file (under b.) must be\n available at no more than a reasonable production cost for physical\n distributions and free of charge if distributed over the internet.\n .\n 4.7 Technological measures and additional terms\n .\n   a. This License does not allow You to impose (except subject to\n   Section 4.7 b.)  any terms or any technological measures on the\n   Database, a Derivative Database, or the whole or a Substantial part of\n   the Contents that alter or restrict the terms of this License, or any\n   rights granted under it, or have the effect or intent of restricting\n   the ability of any person to exercise those rights.\n .\n   b. Parallel distribution. You may impose terms or technological\n   measures on the Database, a Derivative Database, or the whole or a\n   Substantial part of the Contents (a \"Restricted Database\") in\n   contravention of Section 4.74 a. only if You also make a copy of the\n   Database or a Derivative Database available to the recipient of the\n   Restricted Database:\n .\n     i. That is available without additional fee;\n .\n     ii. That is available in a medium that does not alter or restrict\n     the terms of this License, or any rights granted under it, or have\n     the effect or intent of restricting the ability of any person to\n     exercise those rights (an \"Unrestricted Database\"); and\n .\n     iii. The Unrestricted Database is at least as accessible to the\n     recipient as a practical matter as the Restricted Database.\n .\n   c. For the avoidance of doubt, You may place this Database or a\n   Derivative Database in an authenticated environment, behind a\n   password, or within a similar access control scheme provided that You\n   do not alter or restrict the terms of this License or any rights\n   granted under it or have the effect or intent of restricting the\n   ability of any person to exercise those rights. \n .\n 4.8 Licensing of others. You may not sublicense the Database. Each time\n You communicate the Database, the whole or Substantial part of the\n Contents, or any Derivative Database to anyone else in any way, the\n Licensor offers to the recipient a license to the Database on the same\n terms and conditions as this License. You are not responsible for\n enforcing compliance by third parties with this License, but You may\n enforce any rights that You have over a Derivative Database. You are\n solely responsible for any modifications of a Derivative Database made\n by You or another Person at Your direction. You may not impose any\n further restrictions on the exercise of the rights granted or affirmed\n under this License.\n .\n ### 5.0 Moral rights\n .\n 5.1 Moral rights. This section covers moral rights, including any rights\n to be identified as the author of the Database or to object to treatment\n that would otherwise prejudice the author's honour and reputation, or\n any other derogatory treatment:\n .\n   a. For jurisdictions allowing waiver of moral rights, Licensor waives\n   all moral rights that Licensor may have in the Database to the fullest\n   extent possible by the law of the relevant jurisdiction under Section\n   10.4; \n .\n   b. If waiver of moral rights under Section 5.1 a in the relevant\n   jurisdiction is not possible, Licensor agrees not to assert any moral\n   rights over the Database and waives all claims in moral rights to the\n   fullest extent possible by the law of the relevant jurisdiction under\n   Section 10.4; and\n .\n   c. For jurisdictions not allowing waiver or an agreement not to assert\n   moral rights under Section 5.1 a and b, the author may retain their\n   moral rights over certain aspects of the Database.\n .\n Please note that some jurisdictions do not allow for the waiver of moral\n rights, and so moral rights may still subsist over the Database in some\n jurisdictions.\n .\n ### 6.0 Fair dealing, Database exceptions, and other rights not affected \n .\n 6.1 This License does not affect any rights that You or anyone else may\n independently have under any applicable law to make any use of this\n Database, including without limitation:\n .\n   a. Exceptions to the Database Right including: Extraction of Contents\n   from non-electronic Databases for private purposes, Extraction for\n   purposes of illustration for teaching or scientific research, and\n   Extraction or Re-utilisation for public security or an administrative\n   or judicial procedure. \n .\n   b. Fair dealing, fair use, or any other legally recognised limitation\n   or exception to infringement of copyright or other applicable laws. \n .\n 6.2 This License does not affect any rights of lawful users to Extract\n and Re-utilise insubstantial parts of the Contents, evaluated\n quantitatively or qualitatively, for any purposes whatsoever, including\n creating a Derivative Database (subject to other rights over the\n Contents, see Section 2.4). The repeated and systematic Extraction or\n Re-utilisation of insubstantial parts of the Contents may however amount\n to the Extraction or Re-utilisation of a Substantial part of the\n Contents.\n .\n ### 7.0 Warranties and Disclaimer\n .\n 7.1 The Database is licensed by the Licensor \"as is\" and without any\n warranty of any kind, either express, implied, or arising by statute,\n custom, course of dealing, or trade usage. Licensor specifically\n disclaims any and all implied warranties or conditions of title,\n non-infringement, accuracy or completeness, the presence or absence of\n errors, fitness for a particular purpose, merchantability, or otherwise.\n Some jurisdictions do not allow the exclusion of implied warranties, so\n this exclusion may not apply to You.\n .\n ### 8.0 Limitation of liability\n .\n 8.1 Subject to any liability that may not be excluded or limited by law,\n the Licensor is not liable for, and expressly excludes, all liability\n for loss or damage however and whenever caused to anyone by any use\n under this License, whether by You or by anyone else, and whether caused\n by any fault on the part of the Licensor or not. This exclusion of\n liability includes, but is not limited to, any special, incidental,\n consequential, punitive, or exemplary damages such as loss of revenue,\n data, anticipated profits, and lost business. This exclusion applies\n even if the Licensor has been advised of the possibility of such\n damages.\n .\n 8.2 If liability may not be excluded by law, it is limited to actual and\n direct financial loss to the extent it is caused by proved negligence on\n the part of the Licensor.\n .\n ### 9.0 Termination of Your rights under this License\n .\n 9.1 Any breach by You of the terms and conditions of this License\n automatically terminates this License with immediate effect and without\n notice to You. For the avoidance of doubt, Persons who have received the\n Database, the whole or a Substantial part of the Contents, Derivative\n Databases, or the Database as part of a Collective Database from You\n under this License will not have their licenses terminated provided\n their use is in full compliance with this License or a license granted\n under Section 4.8 of this License.  Sections 1, 2, 7, 8, 9 and 10 will\n survive any termination of this License.\n .\n 9.2 If You are not in breach of the terms of this License, the Licensor\n will not terminate Your rights under it. \n .\n 9.3 Unless terminated under Section 9.1, this License is granted to You\n for the duration of applicable rights in the Database. \n .\n 9.4 Reinstatement of rights. If you cease any breach of the terms and\n conditions of this License, then your full rights under this License\n will be reinstated:\n .\n   a. Provisionally and subject to permanent termination until the 60th\n   day after cessation of breach; \n .\n   b. Permanently on the 60th day after cessation of breach unless\n   otherwise reasonably notified by the Licensor; or\n .\n   c.  Permanently if reasonably notified by the Licensor of the\n   violation, this is the first time You have received notice of\n   violation of this License from  the Licensor, and You cure the\n   violation prior to 30 days after your receipt of the notice.\n .\n Persons subject to permanent termination of rights are not eligible to\n be a recipient and receive a license under Section 4.8.\n .\n 9.5 Notwithstanding the above, Licensor reserves the right to release\n the Database under different license terms or to stop distributing or\n making available the Database. Releasing the Database under different\n license terms or stopping the distribution of the Database will not\n withdraw this License (or any other license that has been, or is\n required to be, granted under the terms of this License), and this\n License will continue in full force and effect unless terminated as\n stated above.\n .\n ### 10.0 General\n .\n 10.1 If any provision of this License is held to be invalid or\n unenforceable, that must not affect the validity or enforceability of\n the remainder of the terms and conditions of this License and each\n remaining provision of this License shall be valid and enforced to the\n fullest extent permitted by law. \n .\n 10.2 This License is the entire agreement between the parties with\n respect to the rights granted here over the Database. It replaces any\n earlier understandings, agreements or representations with respect to\n the Database. \n .\n 10.3 If You are in breach of the terms of this License, You will not be\n entitled to rely on the terms of this License or to complain of any\n breach by the Licensor. \n .\n 10.4 Choice of law. This License takes effect in and will be governed by\n the laws of the relevant jurisdiction in which the License terms are\n sought to be enforced. If the standard suite of rights granted under\n applicable copyright law and Database Rights in the relevant\n jurisdiction includes additional rights not granted under this License,\n these additional rights are granted in this License in order to meet the\n terms of this License.\n\nLicense: Expat\n Permission is hereby granted, free of charge, to any person obtaining a copy\n of this software and associated documentation files (the \"Software\"), to deal\n in the Software without restriction, including without limitation the rights\n to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n copies of the Software, and to permit persons to whom the Software is\n furnished to do so, subject to the following conditions:\n .\n The above copyright notice and this permission notice shall be included in all\n copies or substantial portions of the Software.\n .\n THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n THE SOFTWARE.\n\n\n"
  },
  {
    "path": "debian/rules",
    "content": "#!/usr/bin/make -f\n%:\n\tdh $@ --parallel\n"
  },
  {
    "path": "debian/source/format",
    "content": "3.0 (quilt)\n"
  },
  {
    "path": "debian/watch",
    "content": "Version: 5\nTemplate: Github\nOwner: foldynl\nProject: QLog\n#Release-Only: yes"
  },
  {
    "path": "devtools/ADIF/all_ADIF_fields_example.adi",
    "content": "### QLog ADIF Export\n<ADIF_VER:5>3.1.4\n<PROGRAMID:4>Gene\n<PROGRAMVERSION:6>0.20.0\n<CREATED_TIMESTAMP:15>20230324 081527\n<EOH>\n\n<ADDRESS:12>123 Main St.\n<AGE:2>35\n<ALTITUDE:4>1900\n<A_INDEX:2>10\n<ANT_AZ:2>45\n<ANT_EL:2>20\n<ANT_PATH:1>S\n<ARRL_SECT:2>AL\n<AWARD_SUBMITTED:3>WAS\n<AWARD_GRANTED:3>WAS\n<BAND:3>20M\n<BAND_RX:3>40M\n<CALL:4>N1MM\n<CHECK:3>599\n<CLASS:1>A\n<CLUBLOG_QSO_UPLOAD_DATE:8>20220101\n<CLUBLOG_QSO_UPLOAD_STATUS:1>Y\n<CNTY:9>New Haven\n<COMMENT:12>Nice signal!\n<CONT:2>SA\n<CONTACTED_OP:5>N1CON\n<CONTEST_ID:8>NAQP-SSB\n<COUNTRY:13>United States\n<CQZ:1>5\n<CREDIT_SUBMITTED:4>DXCC\n<CREDIT_GRANTED:4>DXCC\n<DARC_DOK:2>HX\n<DISTANCE:3>500\n<DXCC:3>291\n<EMAIL:20>john.doe@example.com\n<EQ_CALL:5>K1ABC\n<EQSL_QSLRDATE:8>20220101\n<EQSL_QSLSDATE:8>20220101\n<EQSL_QSL_RCVD:1>Y\n<EQSL_QSL_SENT:1>Y\n<FISTS:4>1234\n<FISTS_CC:4>5678\n<FORCE_INIT:1>Y\n<FREQ:5>14200\n<FREQ_RX:4>7050\n<GRIDSQUARE:6>FN31pr\n<GRIDSQUARE_EXT:4>FN31\n<GUEST_OP:5>K2XYZ\n<HAMLOGEU_QSO_UPLOAD_DATE:8>20230101\n<HAMLOGEU_QSO_UPLOAD_STATUS:1>Y\n<HAMQTH_QSO_UPLOAD_DATE:8>20230101\n<HAMQTH_QSO_UPLOAD_STATUS:1>Y\n<HRDLOG_QSO_UPLOAD_DATE:8>20220101\n<HRDLOG_QSO_UPLOAD_STATUS:1>Y\n<IOTA:6>EU-001\n<IOTA_ISLAND_ID:3>001\n<ITUZ:1>8\n<K_INDEX:1>3\n<LAT:11>N041 30.000\n<LON:11>N041 30.000\n<LOTW_QSLRDATE:8>20220101\n<LOTW_QSLSDATE:8>20220101\n<LOTW_QSL_RCVD:1>Y\n<LOTW_QSL_SENT:1>Y\n<MAX_BURSTS:1>3\n<MODE:3>SSB\n<MS_SHOWER:3>GEM\n<MY_ALTITUDE:4>1900\n<MY_ANTENNA:2>GP\n<MY_ARRL_SECT:2>AL\n<MY_CITY:9>New Haven\n<MY_CNTY:6>JA Gun\n<MY_COUNTRY:13>United States\n<MY_CQ_ZONE:1>5\n<MY_DXCC:3>291\n<MY_FISTS:4>1234\n<MY_GRIDSQUARE:6>FN31pr\n<MY_GRIDSQUARE_EXT:2>AA\n<MY_IOTA:6>EU-001\n<MY_IOTA_ISLAND_ID:3>001\n<MY_ITU_ZONE:1>8\n<MY_LAT:11>N041 30.000\n<MY_LON:11>N041 30.000\n<MY_NAME:8>John Doe\n<MY_POSTAL_CODE:5>06511\n<MY_POTA_REF:6>K-5033\n<MY_RIG:12>Icom IC-7300\n<MY_SIG:3>SIG\n<MY_SIG_INFO:4>INFO\n<MY_SOTA_REF:4>SOTA\n<MY_STATE:11>Connecticut\n<MY_STREET:8>Main St.\n<MY_USACA_COUNTIES:6>CT-009\n<MY_VUCC_GRIDS:4>FN80\n<MY_WWFF_REF:4>WWFF\n<NAME:10>Jane Smith\n<NOTES:16>Had a great QSO!\n<NR_BURSTS:1>5\n<NR_PINGS:2>10\n<OPERATOR:5>K1ABC\n<OWNER_CALLSIGN:5>K1ABC\n<PFX:4>W1AW\n<POTA_REF:6>K-5033\n<PRECEDENCE:1>A\n<PROP_MODE:2>SAT\n<PUBLIC_KEY:12><public key>\n<QRZCOM_QSO_UPLOAD_DATE:8>20220101\n<QRZCOM_QSO_UPLOAD_STATUS:1>Y\n<QSLMSG:8>Tnx QSO!\n<QSLRDATE:8>20220101\n<QSLSDATE:8>20220101\n<QSL_RCVD:1>Y\n<QSL_RCVD_VIA:1>D\n<QSL_SENT:1>Y\n<QSL_SENT_VIA:1>B\n<QSL_VIA:4>BURO\n<QSO_COMPLETE:1>Y\n<QSO_DATE:8>20220101\n<QSO_DATE_OFF:8>20220101\n<QSO_RANDOM:1>Y\n<QTH:9>New Haven\n<REGION:2>AI\n<RIG:12>Icom IC-7300\n<RST_RCVD:2>59\n<RST_SENT:2>59\n<RX_PWR:3>100\n<SAT_MODE:2>FM\n<SAT_NAME:5>SO-50\n<SFI:2>70\n<SIG:2>59\n<SIG_INFO:3>USB\n<SILENT_KEY:1>N\n<SKCC:4>1234\n<SOTA_REF:9>W1/HA-001\n<SRX:4>7050\n<SRX_STRING:5>7.050\n<STATE:11>Connecticut\n<STATION_CALLSIGN:5>K1ABC\n<STX:3>599\n<STX_STRING:4>5.99\n<SUBMODE:3>LSB\n<SWL:1>Y\n<TEN_TEN:5>12345\n<TIME_OFF:4>1200\n<TIME_ON:4>1100\n<TX_PWR:3>100\n<UKSMG:4>1234\n<USACA_COUNTIES:6>CT-009\n<VE_PROV:2>ON\n<VUCC_GRIDS:4>FN31\n<WEB:4>http://all.com\n<WWFF_REF:9>WWFF-OK11\n<CNTY_ALT:3>ALT\n<DCL_QSLRDATE:8>20240101\n<DCL_QSLSDATE:8>20240202\n<DCL_QSL_RCVD:1>I\n<DCL_QSL_SENT:1>Y\n<MORSE_KEY_INFO:4>TEST\n<MORSE_KEY_TYPE:3>CPU\n<MY_CNTY_ALT:3>ALT\n<MY_DARC_DOK:3>DOK\n<MY_MORSE_KEY_INFO:7>MY TEST\n<MY_MORSE_KEY_TYPE:2>DP\n<QRZCOM_QSO_DOWNLOAD_DATE:8>20240303\n<QRZCOM_QSO_DOWNLOAD_STATUS:1>Y\n<QSLMSG_RCVD:8>QSLR MSG\n<EQSL_AG:1>U\n<eor>\n"
  },
  {
    "path": "devtools/ADIF/min_ADIF_fields_example.adi",
    "content": "### QLog ADIF Export\n<ADIF_VER:5>3.1.4\n<PROGRAMID:4>QLog\n<PROGRAMVERSION:6>0.20.0\n<CREATED_TIMESTAMP:15>20230324 081527\n<EOH>\n\n<call:7>SO1TEST\n<qso_date:8>20230101\n<time_on:6>132300\n<band:3>40m\n<mode:2>CW\n<eor>\n"
  },
  {
    "path": "devtools/ADIF/test_intl.adi",
    "content": "### QLog ADIF Export\n<ADIF_VER:5>3.1.4\n<PROGRAMID:4>QLog\n<PROGRAMVERSION:6>0.20.0\n<CREATED_TIMESTAMP:15>20230324 081527\n<EOH>\n\n<call:7>SO1TEST\n<qso_date:8>20230501\n<time_on:6>132300\n<band:3>40m\n<mode:2>CW\n<comment:3>com\n<my_rig_intl:8>Rig from\n<my_antenna:2>GP\n<my_antenna_intl:7>GP_INTL\n<eor>\n\n<call:8>SO1TESTT\n<qso_date:8>20230501\n<time_on:6>132300\n<band:3>40m\n<mode:2>CW\n<comment:3>com\n<comment_intl:8>com_intl\n<eor>\n\n<call:8>SO1TESTS\n<qso_date:8>20230501\n<time_on:6>132300\n<band:3>40m\n<mode:2>CW\n<eor>\n"
  },
  {
    "path": "devtools/TCISimulator/client.html",
    "content": "<!DOCTYPE html>\n\n<meta charset=\"utf-8\" />\n\n<title>WebSocket Test</title>\n\n<script language=\"javascript\" type=\"text/javascript\">\n\n\n  function init()\n  {\n\tdocument.myform.url.value = \"ws://localhost:8000/\"\n        document.myform.inputtext.value = \"Command\"\n\tdocument.myform.disconnectButton.disabled = true;\n  }\n\n  function doConnect()\n  {\n    websocket = new WebSocket(document.myform.url.value);\n    websocket.onopen = function(evt) { onOpen(evt) };\n    websocket.onclose = function(evt) { onClose(evt) };\n    websocket.onmessage = function(evt) { onMessage(evt) };\n    websocket.onerror = function(evt) { onError(evt) };\n  }\n\n  function onOpen(evt)\n  {\n    writeToScreen(\"connected\\n\");\n\tdocument.myform.connectButton.disabled = true;\n\tdocument.myform.disconnectButton.disabled = false;\n  }\n\n  function onClose(evt)\n  {\n    writeToScreen(\"disconnected\\n\");\n\tdocument.myform.connectButton.disabled = false;\n\tdocument.myform.disconnectButton.disabled = true;\n  }\n\n  function onMessage(evt)\n  {\n    writeToScreen(\"response: \" + evt.data + '\\n');\n  }\n\n  function onError(evt)\n  {\n    writeToScreen('error: ' + evt.data + '\\n');\n\n\twebsocket.close();\n\n\tdocument.myform.connectButton.disabled = false;\n\tdocument.myform.disconnectButton.disabled = true;\n\n  }\n\n  function doSend(message)\n  {\n    writeToScreen(\"sent: \" + message + '\\n'); \n    websocket.send(message);\n  }\n\n  function writeToScreen(message)\n  {\n    document.myform.outputtext.value += message\n\tdocument.myform.outputtext.scrollTop = document.myform.outputtext.scrollHeight;\n\n  }\n\n  window.addEventListener(\"load\", init, false);\n\n\n   function sendText() {\n\t\tdoSend( document.myform.inputtext.value );\n   }\n\n  function clearText() {\n\t\tdocument.myform.outputtext.value = \"\";\n   }\n\n   function doDisconnect() {\n\t\twebsocket.close();\n   }\n\n\n</script>\n\n<div id=\"output\"></div>\n\n<form name=\"myform\">\n<p>\n<textarea name=\"outputtext\" rows=\"20\" cols=\"50\"></textarea>\n</p>\n<p>\n<textarea name=\"inputtext\" cols=\"50\"></textarea>\n</p>\n<p>\n<textarea name=\"url\" cols=\"50\"></textarea>\n</p>\n<p>\n<input type=\"button\" name=sendButton value=\"Send\" onClick=\"sendText();\">\n<input type=\"button\" name=clearButton value=\"Clear\" onClick=\"clearText();\">\n<input type=\"button\" name=disconnectButton value=\"Disconnect\" onClick=\"doDisconnect();\">\n<input type=\"button\" name=connectButton value=\"Connect\" onClick=\"doConnect();\">\n</p>\n\n\n</form>\n</html> \n\n\n"
  },
  {
    "path": "devtools/TCISimulator/server.py",
    "content": "#!/usr/bin/env python3\n\n\"\"\"\nTCI WebSocket simulator \n\nThis script implements a minimal TCI-like WebSocket server that accepts multiple client connections\nand broadcasts status updates to all connected clients.\n\nHow it works\n- Starts a WebSocket server on TCP port 8000.\n- When a client connects, the server immediately sends a set of capability/status messages\n  (limits, device info, supported modulations) and a READY message.\n- Incoming messages are parsed as simple \"COMMAND:arg1,arg2,...\" frames and mapped to handlers.\n  Supported commands include: VFO, TRX, MODULATION, DRIVE, RIT_OFFSET, RIT_ENABLE, XIT_OFFSET,\n  XIT_ENABLE, and CW_MACROS_SPEED.\n- The server keeps an internal state (frequency, TX/RX, modulation, drive, RIT/XIT settings, CW speed).\n  When a command updates the state, the server broadcasts the corresponding response/status frame\n  to all connected clients.\n\nNotes\n- This is a simulator: it does not control real radio hardware; it only maintains and publishes state.\n- Each connection creates its own SimpleTCI state instance; broadcasting still goes to all clients.\n- Messages are terminated with ';' when sent to clients.\n\"\"\"\n\nimport asyncio\nimport websockets\n\nclients = set()\n\nclass SimpleTCI:\n    def __init__(self):\n        self.currFreq = 14000000\n        self.currTrx = False\n        self.currModulation = \"USB\"\n        self.currDrive = 20\n        self.currRITOffset = 0\n        self.currRITEnable = False\n        self.currCWSpeed = 20\n        self.currXITOffset = 0\n        self.currXITEnable = False\n\n    async def sendTCIMessage(self, msg: str):\n        print(f\"Sending msg: {msg}\")\n        await asyncio.sleep(0.1)\n        dead = set()\n        for ws in clients:\n            try:\n                await ws.send(msg + \";\")\n            except Exception:\n                dead.add(ws)\n        for ws in dead:\n            clients.discard(ws)\n\n    async def VFOCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currFreq = args[2]\n        await self.sendTCIMessage(f\"vfo:0,0,{self.currFreq}\")\n\n    async def TRXCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currTrx = (args[1].lower() == \"true\")\n        await self.sendTCIMessage(f\"trx:0,{self.currTrx}\")\n\n    async def MODULATIONCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currModulation = args[1].upper()\n        await self.sendTCIMessage(f\"modulation:0,{self.currModulation}\")\n\n    async def DRIVECommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currDrive = args[1]\n        await self.sendTCIMessage(f\"drive:0,{self.currDrive}\")\n\n    async def RITOFFSETCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currRITOffset = args[1]\n        await self.sendTCIMessage(f\"rit_offset:0,{self.currRITOffset}\")\n\n    async def RITENABLECommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currRITEnable = (args[1].lower() == \"true\")\n        await self.sendTCIMessage(f\"rit_enable:0,{self.currRITEnable}\")\n\n    async def XITOFFSETCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currXITOffset = args[1]\n        await self.sendTCIMessage(f\"xit_offset:0,{self.currXITOffset}\")\n\n    async def XITENABLECommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currXITEnable = (args[1].lower() == \"true\")\n        await self.sendTCIMessage(f\"xit_enable:0,{self.currXITEnable}\")\n\n    async def CWMACROSSPEEDCommand(self, args, getNum):\n        if len(args) > getNum:\n            self.currCWSpeed = args[0]\n        await self.sendTCIMessage(f\"cw_macros_speed:0,{self.currCWSpeed}\")\n\n    def _processCommand(self, argString, getArgsNum):\n        stripArgs = argString.replace(\";\", \"\")\n        args = stripArgs.split(\",\")\n        if len(args) < getArgsNum:\n            return None\n        return args\n\n    async def handleMessage(self, data: str):\n        commandString = data.split(\":\")\n        print(f\"Received: {commandString}\")\n\n        if len(commandString) < 2:\n            return\n\n        command = commandString[0].upper()\n        payload = commandString[1]\n\n        if command == \"VFO\":\n            args = self._processCommand(payload, 2)\n            if args: await self.VFOCommand(args, 2)\n        elif command == \"TRX\":\n            args = self._processCommand(payload, 1)\n            if args: await self.TRXCommand(args, 1)\n        elif command == \"MODULATION\":\n            args = self._processCommand(payload, 1)\n            if args: await self.MODULATIONCommand(args, 1)\n        elif command == \"DRIVE\":\n            args = self._processCommand(payload, 1)\n            if args: await self.DRIVECommand(args, 1)\n        elif command == \"RIT_OFFSET\":\n            args = self._processCommand(payload, 1)\n            if args: await self.RITOFFSETCommand(args, 1)\n        elif command == \"RIT_ENABLE\":\n            args = self._processCommand(payload, 1)\n            if args: await self.RITENABLECommand(args, 1)\n        elif command == \"XIT_OFFSET\":\n            args = self._processCommand(payload, 1)\n            if args: await self.XITOFFSETCommand(args, 1)\n        elif command == \"XIT_ENABLE\":\n            args = self._processCommand(payload, 1)\n            if args: await self.XITENABLECommand(args, 1)\n        elif command == \"CW_MACROS_SPEED\":\n            args = self._processCommand(payload, 0)\n            if args is not None: await self.CWMACROSSPEEDCommand(args, 0)\n\nasync def handler(websocket, path=None):\n    clients.add(websocket)\n    tci = SimpleTCI()\n\n    print(websocket.remote_address, \"connected\")\n\n    await tci.sendTCIMessage(\"VFO_LIMITS:10000,30000000;TRX_COUNT:2\")\n    await tci.sendTCIMessage(\"DEVICE:SunSDR2DX;MODULATIONS_LIST:AM,SAM,LSB,USB,CW,NFM,WFM;PROTOCOL:ExpertSDR3,1.9\")\n    await tci.sendTCIMessage(\"VFO:0,0,14000000;TRX:0,false;MODULATION:0,USB;RIT_OFFSET:0,-50;RIT_ENABLE:0,false\")\n    await tci.sendTCIMessage(\"READY\")\n\n    try:\n        async for message in websocket:\n            await tci.handleMessage(message)\n    finally:\n        clients.discard(websocket)\n        print(websocket.remote_address, \"closed\")\n\nasync def main():\n    host = \"0.0.0.0\"   # nebo \"127.0.0.1\" jen pro localhost\n    port = 8000\n\n    print(f\"TCI Server Simulator listening on ws://{host}:{port}\")\n\n    async with websockets.serve(handler, host, port):\n        await asyncio.Future()  # run forever\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n"
  },
  {
    "path": "devtools/cabrillo/generate_cabrillo_templates.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nGenerate Cabrillo template SQL for QLog from formats.dat.\n\nSource: https://codeberg.org/kq4mhe/adif2cabrillo/raw/branch/main/resources/formats.dat\n\nUsage:\n  python3 generate_cabrillo_templates.py          -- diff since last run\n  python3 generate_cabrillo_templates.py --full    -- all templates\n\nDownloads formats.dat automatically. SQL goes to stdout.\nState is kept in formats.dat.state next to this script.\n\nField mapping:\n  All field-name mappings live in FIELD_MAP below.\n\n  Format:  \"name\": (sent_db, rcvd_db, formatter [, sent_label, rcvd_label])\n           \"name\": None                          -- skip this field\n\n  Examples:\n    \"freq\":  (\"freq\", \"freq\", \"freq_khz\"),             -- common field\n    \"call\":  (\"station_callsign\", \"callsign\", \"upper\",  -- with explicit labels\n              \"My Call\", \"Call Rcvd\"),\n    \"exch\":  (\"stx_string\", \"srx_string\", \"\"),           -- exchange field\n    \"t\":     None,                                       -- ignored\n\n  Fields not listed produce \"-- REVIEW\" in the SQL output.\n  To fix a REVIEW, just add the field name to FIELD_MAP.\n\"\"\"\n\nimport os\nimport re\nimport sys\nimport urllib.request\n\nSOURCE_URL = (\"https://codeberg.org/kq4mhe/adif2cabrillo\"\n              \"/raw/branch/main/resources/formats.dat\")\n\nSCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))\nDAT_PATH = os.path.join(SCRIPT_DIR, \"formats.dat\")\nSTATE_PATH = os.path.join(SCRIPT_DIR, \"formats.dat.state\")\n\n# ---------------------------------------------------------------------------\n# Built-in contest IDs — only these are emitted as builtin templates.\n# Top 10 most popular worldwide contests by participation.\n# ---------------------------------------------------------------------------\nBUILTIN_CONTEST_IDS = {\n    \"CQ-WW-CW\",\n    \"CQ-WW-SSB\",\n    \"CQ-WPX-CW\",\n    \"CQ-WPX-SSB\",\n    \"CQ-WW-RTTY\",\n    \"ARRL-DX-CW\",\n    \"ARRL-DX-SSB\",\n    \"IARU-HF\",\n    \"ARRL-VHF-JAN\",\n    \"CQ-VHF\",\n}\n\n# ---------------------------------------------------------------------------\n# Field mapping: \"name\" -> (sent_db, rcvd_db, formatter [, sent_lbl, rcvd_lbl])\n#                \"name\" -> None   means skip\n# ---------------------------------------------------------------------------\nFIELD_MAP = {\n    # Common (non-directional)\n    \"freq\":      (\"freq\",       \"freq\",       \"freq_khz\"),\n    \"mo\":        (\"mode\",       \"mode\",       \"mode_cabrillo\"),\n    \"date\":      (\"start_time\", \"start_time\", \"date_yyyy_mm_dd\"),\n    \"time\":      (\"start_time\", \"start_time\", \"time_hhmm\"),\n\n    # Callsigns\n    \"call\":      (\"station_callsign\", \"callsign\", \"upper\", \"My Call\", \"Call Rcvd\"),\n    \"callsign\":  (\"station_callsign\", \"callsign\", \"upper\", \"My Call\", \"Call Rcvd\"),\n\n    # RST\n    \"rst\":       (\"rst_sent\", \"rst_rcvd\", \"\"),\n\n    # Gridsquare\n    \"grid\":      (\"my_gridsquare\", \"gridsquare\", \"upper\"),\n\n    # Serial number fields (map to stx / srx)\n    \"nr\":        (\"stx\", \"srx\", \"\"),\n    \"number\":    (\"stx\", \"srx\", \"\"),\n    \"num\":       (\"stx\", \"srx\", \"\"),\n    \"ser\":       (\"stx\", \"srx\", \"\"),\n    \"stx\":       (\"stx\", \"srx\", \"\"),\n    \"srx\":       (\"stx\", \"srx\", \"\"),\n\n    # Exchange fields (map to stx_string / srx_string)\n    \"exch\":      (\"stx_string\", \"srx_string\", \"\"),\n    \"exchange\":  (\"stx_string\", \"srx_string\", \"\"),\n    \"exc\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"ex1\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"ex2\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"ex3\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"sec\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"p\":         (\"stx_string\", \"srx_string\", \"\"),\n    \"ck\":        (\"stx_string\", \"srx_string\", \"\"),\n    \"zn\":        (\"stx_string\", \"srx_string\", \"\"),\n    \"age\":       (\"stx_string\", \"srx_string\", \"\"),\n    \"name\":      (\"stx_string\", \"srx_string\", \"\"),\n    \"qth\":       (\"stx_string\", \"srx_string\", \"\"),\n\n    # Transmitter ID (fixed value, not from DB)\n    \"t\":         (\"\", \"\", \"transmitter_id\", \"t\", \"t\"),\n}\n\nDEFAULT_FIELDS = [\"freq\", \"mo\", \"date\", \"time\",\n                  \"call\", \"rst\", \"exch\", \"call\", \"rst\", \"exch\", \"t\"]\n\n\n# ---------------------------------------------------------------------------\n# Mapping logic\n# ---------------------------------------------------------------------------\ndef map_field(name, is_sent, is_common):\n    \"\"\"Map field name to (db_field, formatter, label, needs_review) or None to skip.\"\"\"\n    low = name.lower()\n    entry = FIELD_MAP.get(low)\n\n    if entry is None and low in FIELD_MAP:\n        return None  # explicitly skipped\n\n    if entry is None:\n        # Unknown field -> default to exchange\n        db = \"stx_string\" if is_sent else \"srx_string\"\n        sfx = \"Sent\" if is_sent else \"Rcvd\"\n        return (db, \"\", f\"{name.title()} {sfx}\", False)\n\n    sent_db, rcvd_db, formatter = entry[0], entry[1], entry[2]\n    db = sent_db if is_sent else rcvd_db\n\n    if len(entry) >= 5:\n        label = entry[3] if is_sent else entry[4]\n    elif is_common:\n        label = name.title()\n    else:\n        sfx = \"Sent\" if is_sent else \"Rcvd\"\n        label = f\"{name.title()} {sfx}\"\n\n    return (db, formatter, label, False)\n\n\ndef guess_mode(name):\n    u = name.upper()\n    if u.endswith(\"-CW\"):                          return \"CW\"\n    if u.endswith(\"-SSB\") or u.endswith(\"-PH\"):     return \"SSB\"\n    if \"RTTY\" in u or u.endswith(\"-RY\"):            return \"RTTY\"\n    if \"PSK\" in u or \"DIGI\" in u or \"FT8\" in u:    return \"DIGI\"\n    if u.endswith(\"-FM\"):                           return \"FM\"\n    return \"MIXED\"\n\n\n# ---------------------------------------------------------------------------\n# Parsing helpers\n# ---------------------------------------------------------------------------\ndef parse_names(line):\n    names = []\n    for part in line.strip().split(\",\"):\n        m = re.match(r\"^\\s*([\\w-]+)\\s*\\(([\\w-]+)\\)\\s*$\", part)\n        if m:\n            names += [m.group(1), m.group(2)]\n        else:\n            clean = re.sub(r\"\\s*\\(.*?\\)\", \"\", part).strip()\n            if clean:\n                names.append(clean)\n    return names\n\n\ndef is_name(line):\n    s = line.strip()\n    if not s or s.startswith((\"QSO:\", \"****\", \"[x\")):\n        return False\n    if s[0].isdigit() and s.replace(\" \", \"\").isdigit():\n        return False\n    return \"info sent\" not in s.lower()\n\n\ndef is_format(line):\n    s = line.strip()\n    return (s.startswith((\"QSO:\", \"****\"))\n            and (\"***\" in s or \"yyyy\" in s or \"nnnn\" in s))\n\n\ndef is_header(line):\n    s = line.strip().lower()\n    return (s.startswith(\"qso:\") and not is_format(line)\n            and (\"freq\" in s or \"call\" in s))\n\n\ndef tokens(line):\n    t = line.split()\n    return t[1:] if t and t[0] in (\"QSO:\", \"****\") else t\n\n\ndef esc(s):\n    return s.replace(\"'\", \"''\")\n\n\ndef make_sig(fld, fmt_tok):\n    return \" \".join(f\"{f}:{len(t)}\" for f, t in zip(fld, fmt_tok)\n                    if FIELD_MAP.get(f.lower()) is not None or f.lower() not in FIELD_MAP)\n\n\ndef load_state(path):\n    state = {}\n    if not os.path.isfile(path):\n        return state\n    with open(path, \"r\") as f:\n        for line in f:\n            line = line.strip()\n            if line:\n                parts = line.split(\"\\t\", 1)\n                state[parts[0]] = parts[1] if len(parts) > 1 else \"\"\n    return state\n\n\ndef save_state(path, state):\n    with open(path, \"w\") as f:\n        for cid in sorted(state):\n            f.write(f\"{cid}\\t{state[cid]}\\n\")\n\n\ndef download():\n    print(f\"Downloading {SOURCE_URL} ...\", file=sys.stderr)\n    urllib.request.urlretrieve(SOURCE_URL, DAT_PATH)\n    print(f\"Saved to {DAT_PATH}\", file=sys.stderr)\n\n\n# ---------------------------------------------------------------------------\n# Main\n# ---------------------------------------------------------------------------\ndef main():\n    full = \"--full\" in sys.argv\n\n    download()\n\n    prev = {} if full else load_state(STATE_PATH)\n\n    with open(DAT_PATH, \"r\", encoding=\"utf-8\", errors=\"replace\") as f:\n        lines = f.readlines()\n\n    new_state = {}\n    new_count = changed_count = skip_count = 0\n    # Collect: (contest_name, display_name, mode, [(pos, db, width, fmt, lbl), ...])\n    emit_list = []\n    i = 0\n\n    while i < len(lines):\n        line = lines[i].rstrip()\n        if not is_name(line):\n            i += 1\n            continue\n\n        names = parse_names(line)\n        if not names or names[0].startswith(\"Standard\"):\n            i += 1\n            continue\n\n        hdr = fmt = None\n        j = i + 1\n        while j < min(i + 10, len(lines)):\n            l = lines[j].rstrip()\n            if is_name(l):\n                break\n            if not hdr and is_header(l):  hdr = l\n            if not fmt and is_format(l):  fmt = l\n            j += 1\n\n        if not fmt:\n            i = j\n            continue\n\n        fmt_tok = tokens(fmt)\n        fld = tokens(hdr) if hdr else list(DEFAULT_FIELDS[:len(fmt_tok)])\n        while len(fld) < len(fmt_tok):\n            fld.append(\"unknown\")\n        n = min(len(fld), len(fmt_tok))\n        fld = fld[:n]\n        fmt_tok = fmt_tok[:n]\n\n        sig = make_sig(fld, fmt_tok)\n\n        # Only process ADIF contest IDs\n        names = [n for n in names if n in BUILTIN_CONTEST_IDS]\n        if not names:\n            i = j\n            continue\n\n        for name in names:\n            new_state[name] = sig\n\n        # Classify: new / changed / unchanged\n        emit_names = []\n        for name in names:\n            if name not in prev:\n                emit_names.append(name)\n                new_count += 1\n            elif prev[name] != sig:\n                emit_names.append(name)\n                changed_count += 1\n            else:\n                skip_count += 1\n\n        if not emit_names:\n            i = j\n            continue\n\n        # Find sent/rcvd boundary at second call/callsign\n        calls = [k for k in range(n) if fld[k].lower() in (\"call\", \"callsign\")]\n        sent0 = calls[0] if calls else n\n        rcvd0 = calls[1] if len(calls) >= 2 else n\n\n        # Build columns\n        cols = []\n        pos = 0\n        for k in range(n):\n            is_common = k < sent0\n            is_sent = k < rcvd0\n            mapped = map_field(fld[k], is_sent, is_common)\n            if mapped is None:\n                continue\n            pos += 1\n            db, fmtr, lbl, _ = mapped\n            cols.append((pos, db, len(fmt_tok[k]), fmtr, lbl))\n\n        for name in emit_names:\n            emit_list.append((name, name.replace(\"-\", \" \"), guess_mode(name), cols))\n\n        i = j\n\n    # -- Generate SQL -------------------------------------------------------\n    out = [\"-- Generated by devtools/cabrillo/generate_cabrillo_templates.py\",\n           \"-- Source: \" + SOURCE_URL, \"\"]\n\n    if not emit_list:\n        out.append(\"-- Nothing to emit.\")\n    else:\n        for cid, display, mode, cols in emit_list:\n            e = esc(cid)\n            ed = esc(display)\n            out.append(\n                f\"DELETE FROM cabrillo_templates \"\n                f\"WHERE name = '{ed}';\")\n            out.append(\n                f\"INSERT INTO cabrillo_templates \"\n                f\"(name, contest_name_for_header, \"\n                f\"default_category_mode) VALUES \"\n                f\"('{ed}', '{e}', '{esc(mode)}');\")\n            for p, db, w, fmtr, lbl in cols:\n                out.append(\n                    f\"INSERT INTO cabrillo_template_columns \"\n                    f\"(template_id, position, db_field, width, formatter, label) \"\n                    f\"SELECT id, {p}, '{esc(db)}', {w}, '{esc(fmtr)}', \"\n                    f\"'{esc(lbl)}' FROM cabrillo_templates \"\n                    f\"WHERE name = '{ed}';\")\n            out.append(\"\")\n\n    save_state(STATE_PATH, new_state)\n    print(\"\\n\".join(out))\n\n    parts = []\n    if full:\n        parts.append(f\"{new_count} templates [full]\")\n    else:\n        parts.append(f\"{new_count} new, {changed_count} changed, \"\n                     f\"{skip_count} unchanged\")\n    print(\", \".join(parts), file=sys.stderr)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "devtools/deployment/finalize_release.sh",
    "content": "#!/usr/bin/env bash\n\n# The script finalizes the release and edits the changlog in deployment scripts.\n#\n# Usage:\n#   ./devtools/deployment/finalize_release.sh\n#\n# Must be executed from the QLog root directory.\n# Changelog is the single source of truth.\n\nset -uo pipefail\n\nROOTDIR=.\nCHANGELOG=\"${ROOTDIR}/Changelog\"\nQLOG_PRO=\"${ROOTDIR}/QLog.pro\"\n\nif [ ! -f \"${QLOG_PRO}\" ]; then\n    echo \"ERROR: QLog.pro not found. Run this script from the QLog root directory.\"\n    exit 1\nfi\n\n# --- Checks ---\n\nDEB_CHANGELOG=\"${ROOTDIR}/debian/changelog\"\nRPM_SPEC=\"${ROOTDIR}/rpm_spec/qlog.spec\"\nMETAINFO=\"${ROOTDIR}/res/io.github.foldynl.QLog.metainfo.xml\"\nINSTALLER_PKG=\"${ROOTDIR}/installer/packages/de.dl2ic.qlog/meta/package.xml\"\nINSTALLER_CFG=\"${ROOTDIR}/installer/config/config.xml\"\n\n# Cleanup temp files on exit\nTMPFILE=$(mktemp)\ntrap 'rm -f \"${TMPFILE}\"' EXIT\n\nif ! head -n 1 \"${CHANGELOG}\" | grep -q '^TBC - '; then\n    echo \"ERROR: Changelog does not start with 'TBC'. Already finalized?\"\n    exit 1\nfi\n\n# --- Extract data ---\n\nQLOG_VERSION=$(head -n 1 \"${CHANGELOG}\" | awk '{print $3}')\nRELEASE_DATE_ISO=$(date \"+%Y-%m-%d\")\nRELEASE_DATE_CHANGELOG=$(date \"+%Y/%m/%d\")\nRELEASE_DATE_DEB=$(date \"+%a, %-d %b %Y %T %z\")\nRELEASE_DATE_RPM=$(date \"+%a %b %-d %Y\")\n\n# Changelog entries: lines from 2nd line until first empty line\nENTRIES=$(sed -n '2,/^$/{ /^$/d; p }' \"${CHANGELOG}\")\n\necho \"Preparing release ${QLOG_VERSION} (${RELEASE_DATE_ISO})\"\n\n# --- Helper ---\n\nxml_escape() {\n    sed 's/&/\\&amp;/g; s/</\\&lt;/g; s/>/\\&gt;/g'\n}\n\n# --- QLog.pro ---\n\necho \"  QLog.pro\"\nsed -i \"s/VERSION = .*/VERSION = ${QLOG_VERSION}/\" \"${QLOG_PRO}\"\n\n# --- Changelog ---\n\necho \"  Changelog\"\nsed -i \"s#^TBC - #${RELEASE_DATE_CHANGELOG} - #\" \"${CHANGELOG}\"\n\n# --- DEB Changelog ---\n\necho \"  debian/changelog\"\n{\n    echo \"qlog (${QLOG_VERSION}-1) UNRELEASED; urgency=low\"\n    echo \"${ENTRIES}\" | sed 's/^-/  */'\n    echo \"\"\n    echo \" -- foldynl <foldyna@gmail.com>  ${RELEASE_DATE_DEB}\"\n    echo \"\"\n    cat \"${DEB_CHANGELOG}\"\n} > \"${TMPFILE}\"\ncp \"${TMPFILE}\" \"${DEB_CHANGELOG}\"\n\n# --- RPM Changelog ---\n\necho \"  rpm_spec/qlog.spec\"\n{\n    echo \"* ${RELEASE_DATE_RPM} Ladislav Foldyna - ${QLOG_VERSION}-1\"\n    echo \"${ENTRIES}\"\n    echo \"\"\n} > \"${TMPFILE}\"\nsed -i -e \"/%changelog/{r ${TMPFILE}\" -e '}' \"${RPM_SPEC}\"\n\n# --- Appstream Metainfo ---\n\necho \"  res/io.github.foldynl.QLog.metainfo.xml\"\n{\n    echo \"    <release version=\\\"${QLOG_VERSION}\\\" date=\\\"${RELEASE_DATE_ISO}\\\">\"\n    echo \"      <description>\"\n    echo \"        <ul>\"\n    echo \"${ENTRIES}\" | sed 's/^- //' | xml_escape | sed 's/^/          <li>/; s/$/<\\/li>/'\n    echo \"        </ul>\"\n    echo \"      </description>\"\n    echo \"    </release>\"\n} > \"${TMPFILE}\"\nsed -i -e \"/  <releases>/{r ${TMPFILE}\" -e '}' \"${METAINFO}\"\nappstreamcli validate \"${METAINFO}\"\n\n# --- Qt Installer files ---\n\necho \"  installer/packages/.../package.xml\"\nsed -i \"s/<Version>.*<\\/Version>/<Version>${QLOG_VERSION}-1<\\/Version>/\" \"${INSTALLER_PKG}\"\nsed -i \"s/<ReleaseDate>.*<\\/ReleaseDate>/<ReleaseDate>${RELEASE_DATE_ISO}<\\/ReleaseDate>/\" \"${INSTALLER_PKG}\"\n\necho \"  installer/config/config.xml\"\nsed -i \"s/<Version>.*<\\/Version>/<Version>${QLOG_VERSION}<\\/Version>/\" \"${INSTALLER_CFG}\"\n\n# --- Summary ---\n\necho \"\"\necho \"Release ${QLOG_VERSION} finalized. Changed files:\"\necho \"  - ${QLOG_PRO}\"\necho \"  - ${CHANGELOG}\"\necho \"  - ${DEB_CHANGELOG}\"\necho \"  - ${RPM_SPEC}\"\necho \"  - ${METAINFO}\"\necho \"  - ${INSTALLER_PKG}\"\necho \"  - ${INSTALLER_CFG}\"\n\n# --- Commit ---\n\necho \"\"\nread -r -p \"Commit changes? [y/N] \" confirm\nif [[ ! \"${confirm}\" =~ ^[Yy]$ ]]; then\n    echo \"Aborted.\"\n    exit 0\nfi\n\ngit commit -a -m \"Preparation for release ${QLOG_VERSION}\"\necho \"Changes committed.\"\n\n# --- Push, merge to master ---\n\nBRANCH=$(git rev-parse --abbrev-ref HEAD)\necho \"\"\necho \"Pushing ${BRANCH}...\"\ngit push origin \"${BRANCH}\"\n\necho \"Switching to master and merging ${BRANCH}...\"\ngit checkout master\ngit pull\ngit merge \"${BRANCH}\"\n\n# --- Tag and push ---\n\nTAG=\"v${QLOG_VERSION}\"\n\necho \"\"\necho \"Wait for GitHub Actions to pass, then confirm.\"\necho \"\"\nread -r -p \"Tag and push ${TAG}? [y/N] \" confirm\nif [[ ! \"${confirm}\" =~ ^[Yy]$ ]]; then\n    echo \"Aborted. To tag manually later:\"\n    echo \"  git tag -a ${TAG} -m \\\"Release ${QLOG_VERSION}\\\"\"\n    echo \"  git push --atomic origin master ${TAG}\"\n    exit 0\nfi\n\ngit tag -a \"${TAG}\" -m \"Release ${QLOG_VERSION}\"\ngit push --atomic origin master \"${TAG}\"\n\necho \"\"\necho \"Tag ${TAG} pushed. You can now create the GitHub release:\"\necho \"  ./devtools/deployment/create_github_release.sh\"\n"
  },
  {
    "path": "devtools/timezones/README.md",
    "content": "# Database files\n\nPlease download the database files [here](https://cdn.bertold.org/zonedetect/db/db.zip) or create them using the builder.\n\nTo use the builder, first install [shapelib](https://github.com/OSGeo/shapelib), then:\n\n    cd builder\n    ./makedb.sh\n    \nThis will create database files in `out` and `out_v1`, as well as a `db.zip` containing both directories.\n\nThe files in the folder out\\_v1/ use a newer format and use less space to encode the same information.\n\nQLog uses out\\_v1/timezone21.bin\n"
  },
  {
    "path": "devtools/timezones/builder/builder.cpp",
    "content": "/*\n * Copyright (c) 2018, Bertold Van den Bergh (vandenbergh@bertold.org)\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *     * Redistributions of source code must retain the above copyright\n *       notice, this list of conditions and the following disclaimer.\n *     * Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *     * Neither the name of the author nor the\n *       names of its contributors may be used to endorse or promote products\n *       derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR DISTRIBUTOR BE LIABLE FOR ANY\n * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include <shapefil.h>\n#include <iostream>\n#include <limits>\n#include <fstream>\n#include <vector>\n#include <algorithm>\n#include <unordered_map>\n#include <functional>\n#include <math.h>\n#include <tuple>\n#include <cstdint>\n\nunsigned version = 1;\n\nconst double Inf = std::numeric_limits<float>::infinity();\n\nstd::unordered_map<std::string, std::string> alpha2ToName;\nstd::unordered_map<std::string, std::string> tzidToAlpha2;\n\nvoid errorFatal(std::string what)\n{\n    std::cerr<<what<<\"\\n\";\n    exit(1);\n}\n\nvoid assert_(bool mustBeTrue, std::string what){\n    if(!mustBeTrue){\n        errorFatal(what);\n    }\n}\n\nuint64_t encodeSignedToUnsigned(int64_t valueIn){\n    uint64_t value = valueIn * 2;\n    if(valueIn < 0) {\n        value = -valueIn * 2 + 1;\n    }\n\n    return value;\n}\n\nint encodeVariableLength(std::vector<uint8_t>& output, int64_t valueIn, bool handleNeg = true)\n{\n    uint64_t value = valueIn;\n\n    if(handleNeg) {\n        value = encodeSignedToUnsigned(valueIn);\n    }\n\n    int bytesUsed = 0;\n    do {\n        uint8_t byteOut = value & 0x7F;\n        if(value >= 128) {\n            byteOut |= 128;\n        }\n        output.push_back(byteOut);\n        bytesUsed ++;\n        value >>= 7;\n    } while(value);\n\n    return bytesUsed;\n}\n\nuint64_t encodePointTo64(int64_t lat, int64_t lon){\n    assert_(lat || lon, \"Tried to encode 0,0. This is not allowed\");\n\n    uint64_t latu=encodeSignedToUnsigned(lat);\n    uint64_t lonu=encodeSignedToUnsigned(lon);\n\n    assert_(latu < (uint64_t)1<<32, \"Unsigned lat overflow\");\n    assert_(lonu < (uint64_t)1<<32, \"Unsigned lat overflow\");\n\n    uint64_t point = 0;\n    for(uint8_t i=31; i<=31; i--){\n        point <<= 2;\n        if(latu & (1<<i)){\n            point |= 1;\n        }\n        if(lonu & (1<<i)){\n            point |= 2;\n        }\n    }\n\n    return point;\n}\n    \n\nint64_t doubleToFixedPoint(double input, double scale, unsigned int precision = 32)\n{\n    double inputScaled = input / scale;\n    return inputScaled * pow(2, precision-1);\n\n}\n\nstruct Point;\nstruct PolygonData;\n\nstd::unordered_map<uint64_t, Point*> pointMap_;\n\nstruct Point {\n    static Point* GetPoint(double dlat = 0, double dlon = 0, unsigned int precision = 32){    \n\tint64_t lat = doubleToFixedPoint(dlat, 90, precision);\n        int64_t lon = doubleToFixedPoint(dlon, 180, precision);\n        \n        uint64_t key = encodePointTo64(lat, lon);\n        if(pointMap_.count(key)){\n            return pointMap_[key];\n        }\n        \n        Point* p = new Point(lat, lon);\n        p->key_ = key;\n        pointMap_[key] = p;\n        return p;\n    }\n\n    Point(int64_t lat = 0, int64_t lon = 0)\n    {\n        lat_ = lat;\n        lon_ = lon;   \n    }\n\n    std::tuple<int64_t, int64_t> value()\n    {\n        return std::make_tuple(lat_, lon_);\n    }\n\n    int encodePointBinary(std::vector<uint8_t>& output)\n    {\n        int bytesUsed = encodeVariableLength(output, lat_);\n        bytesUsed += encodeVariableLength(output, lon_);\n\n        return bytesUsed;\n    }\n\n    int64_t lat_;\n    int64_t lon_;\n    uint64_t key_;\n    PolygonData* parent_ = nullptr;\n    int index_ = 0;\n    bool encoded_ = false;\n    uint64_t encodedOffset_ = 0;\n};\n\nstruct PolygonData {\n    Point boundingMin;\n    Point boundingMax;\n    std::vector<Point*> points_;\n    unsigned long fileIndex_ = 0;\n    unsigned long metadataId_;\n    Point* lastPoint_ = nullptr;\n\n    void processPoint(Point* p)\n    {\n        if(p->lat_ < boundingMin.lat_) {\n            boundingMin.lat_ = p->lat_;\n        }\n        if(p->lon_ < boundingMin.lon_) {\n            boundingMin.lon_ = p->lon_;\n        }\n        if(p->lat_ > boundingMax.lat_) {\n            boundingMax.lat_ = p->lat_;\n        }\n        if(p->lon_ > boundingMax.lon_) {\n            boundingMax.lon_ = p->lon_;\n        }\n\n\t/* Don't encode duplicate points */\n\tif(lastPoint_ == p){\n\t    return;\n\t}\n\tlastPoint_ = p;\n\t\n        points_.push_back(p);\n    }\n\n    PolygonData(unsigned long id):\n        boundingMin(INT64_MAX, INT64_MAX),\n        boundingMax(INT64_MIN, INT64_MIN),\n        metadataId_(id)\n    {\n    }\n    \n\n    struct LineSegment {\n        std::vector<Point*> points_;\n        Point* prevPoint_;\n        PolygonData* parent_;\n    \n        bool sameDirection(int64_t x1, int64_t y1, int64_t x2, int64_t y2){\n            if(!x2 && !y2){\n                return false;\n            }\n\n            if((x1 > 0 && x2 < 0) || (x1 < 0 && x2 > 0)){\n                return false;\n            }        \n            if((y1 > 0 && y2 < 0) || (y1 < 0 && y2 > 0)){\n                return false;\n            }\n\n            if(x1 == 0){\n                return x2 == 0;\n            }\n\n            return y2 == (y1*x2/x1);\n        }\n\n    \n        unsigned int encodeDelta(std::vector<uint8_t>& output, PolygonData* mark = nullptr, int start = 0, int end = -1){\n            unsigned int numPoints = 0;\n            if(end < 0){\n                end = points_.size()-1;\n            }\n\n            int64_t accDiffLat = 0, accDiffLon = 0;\n            int64_t prevDiffLat = 0, prevDiffLon = 0;\n\n            int64_t prevLat, prevLon;\n            \n            Point* prevPoint = prevPoint_;\n            if(start > 0){\n                prevPoint = points_[start-1];\n            }\n\n            std::tie(prevLat, prevLon) = prevPoint->value();\n\n            auto encodePoint = [&](bool force = false){\n                /* Encode accumulator.\n                 * After this the position is equal to that of the previous point */\n                if(accDiffLat || accDiffLon || force){\n                    if(version == 0){\n                        encodeVariableLength(output, accDiffLat);\n                        encodeVariableLength(output, accDiffLon);\n                    }else{\n                        encodeVariableLength(output, encodePointTo64(accDiffLat, accDiffLon), false);\n                    }\n\n                    numPoints++;\n                }\n\n                /* Mark points as encoded if we mark and we are the parent */\n                if(mark && prevPoint->parent_ == mark){\n                    prevPoint->encoded_ = true;\n                    prevPoint->encodedOffset_ = output.size();\n                }\n\n                /* Reset accumulator */\n                accDiffLat = 0;\n                accDiffLon = 0;\n            };\n\n            for(int i = start; i<=end; i++){\n                Point* point = points_[i];\n\n                int64_t lat, lon;\n                std::tie(lat, lon) = point->value();\n\n                /* Calculate difference */\n                int64_t diffLat = lat - prevLat;\n                int64_t diffLon = lon - prevLon;\n               \n                /* Encode delta */\n                if(!sameDirection(diffLat, diffLon, prevDiffLat, prevDiffLon)){\n                    encodePoint();\n                }\n\n                accDiffLat += diffLat;\n                accDiffLon += diffLon; \n\n                /* Store previous values */\n                prevDiffLat = diffLat;\n                prevDiffLon = diffLon;\n                prevLat = lat;\n                prevLon = lon;\n                prevPoint = point;\n            } \n            \n            /* Encode remainder if needed */ \n            encodePoint(version == 0);\n\n            return numPoints;\n        }\n        \n        bool encodeReference(std::vector<uint8_t>& output){\n            /* Search for first marked point */\n            int end = -1, start = -1;\n            for(int i=0; i<points_.size(); i++){\n                if(points_[i]->encoded_){\n                    start = i;\n                    break;\n                }\n            }\n            \n            for(int i=points_.size()-1; i>=0; i--){\n                if(points_[i]->encoded_){\n                    end = i;\n                    break;\n                }\n            }\n\n            if(end < 0 || start < 0){\n                /* Only unencoded points, then we can only delta encode it ourself */\n                return false;\n            }\n\n            /* Encode delta until where we can refer */\n            encodeDelta(output, nullptr, 0, start);\n            \n\n            /* Add reference marker if it is still needed */\n            if(start != end){\n                uint64_t startRef = points_[start]->encodedOffset_;\n                uint64_t endRef = points_[end]->encodedOffset_;\n\n                output.push_back(0);\n                output.push_back(1);\n                encodeVariableLength(output, startRef, false);\n                int64_t diff = endRef - startRef;\n                encodeVariableLength(output, diff, true);\n            }\n\n            /* Encode delta till the end of the segment */\n            encodeDelta(output, nullptr, end+1);\n\n            return true;\n        }\n    };\n\n    unsigned int encodeBinaryData(std::vector<uint8_t>& output)\n    {\n        std::vector<LineSegment*> lines_;\n        PolygonData* currentParent = nullptr;\n        LineSegment* segment = nullptr;\n\n        /* Step 1: Encode first point */\n        Point* prevPoint = points_[0];\n        if(version == 0){\n            prevPoint->encodePointBinary(output);\n        }else{\n            encodeVariableLength(output, prevPoint->key_, false);\n        }\n\n        int direction = 0;\n        /* Step 2: Go through the list of points and check which ones already exist.\n         * We skip the first and last one since the first one is already encoded\n         * and the last one is identical to the first */\n        for(int i=1; i<points_.size()-1; i++){\n            Point* point = points_[i];\n\n            if(!point->parent_){\n                point->parent_ = this;\n                point->index_ = i;\n            }\n            \n            bool newSegment = false;\n\n            if(point->parent_ == currentParent){\n                if(direction == 0){\n                    direction = point->index_ - prevPoint->index_;\n                    if(direction > 1 || direction < -1){\n                        newSegment = true;\n                    }\n                }else{\n                    if(point->index_ != prevPoint->index_ + direction){\n                        newSegment = true;\n                    }\n                }\n            }\n\n            if(point->parent_ != currentParent || newSegment){\n                if(segment){\n                    lines_.push_back(segment);\n                }\n                \n                currentParent = point->parent_;\n\n                segment = new LineSegment();\n                segment->prevPoint_ = prevPoint;\n                segment->parent_ = currentParent;\n                direction = 0;\n            }\n\n            segment->points_.push_back(point);\n\n            prevPoint = point;\n        }\n        if(segment){\n            lines_.push_back(segment);\n        }\n\n        unsigned int v0Points = 1;\n\n        /* Step 3: Encode segments */\n        for(LineSegment* segment: lines_){\n            if(segment->parent_ == this || version == 0){\n                /* If we are the parent of the segment we must encode and mark it */\n                v0Points += segment->encodeDelta(output, this);\n            }else{\n                /* We are not the parent, we can encode it or refer to it, depending on \n                 * which takes less bytes. In any case we should not mark it. */\n                std::vector<uint8_t> delta;\n                segment->encodeDelta(delta);\n                \n                std::vector<uint8_t> reference;\n                bool possible = segment->encodeReference(reference);\n\n                if(!possible || delta.size() <= reference.size()){\n                    output.insert(std::end(output), std::begin(delta), std::end(delta));\n                }else{\n                    output.insert(std::end(output), std::begin(reference), std::end(reference));\n                }\n            }\n        }\n\n        if (version != 0){\n            /* Step 4: Write end marker */\n            output.push_back(0);\n            output.push_back(0);\n        }\n\n        return v0Points;\n    }\n};\n\nvoid encodeStringToBinary(std::vector<uint8_t>& output, std::string& input)\n{\n    encodeVariableLength(output, input.size(), false);\n    for(unsigned int i=0; i<input.size(); i++) {\n        output.push_back(input[i] ^ 0x80);\n    }\n}\n\n\nstd::unordered_map<std::string, uint64_t> usedStrings_;\n\nstruct MetaData {\n    void encodeBinaryData(std::vector<uint8_t>& output)\n    {\n        for(std::string& str: data_) {\n            if(str.length() >= 256) {\n                std::cout << \"Metadata string is too long\\n\";\n                exit(1);\n            }\n\n            if(!usedStrings_.count(str)) {\n                usedStrings_[str] = output.size();\n                encodeStringToBinary(output, str);\n            } else {\n                encodeVariableLength(output, usedStrings_[str] + 256, false);\n            }\n        }\n    }\n\n    std::vector<std::string> data_;\n\n    unsigned long fileIndex_;\n};\n\n\nstd::vector<PolygonData*> polygons_;\nstd::vector<MetaData> metadata_;\nstd::vector<std::string> fieldNames_;\n\n\nunsigned int decodeVariableLength(uint8_t* buffer, int64_t* result, bool handleNeg = true)\n{\n    int64_t value = 0;\n    unsigned int i=0, shift = 0;\n\n    do {\n        value |= (buffer[i] & 0x7F) << shift;\n        shift += 7;\n    } while(buffer[i++] & 0x80);\n\n    if(!handleNeg) {\n        *result = value;\n    } else {\n        *result = (value & 1)?-(value/2):(value/2);\n    }\n    return i;\n}\n\nvoid readMetaDataTimezone(DBFHandle dataHandle)\n{\n    /* Specify field names */\n    fieldNames_.push_back(\"TimezoneIdPrefix\");\n    fieldNames_.push_back(\"TimezoneId\");\n    fieldNames_.push_back(\"CountryAlpha2\");\n    fieldNames_.push_back(\"CountryName\");\n\n    /* Parse attribute names */\n    for(int i = 0; i < DBFGetRecordCount(dataHandle); i++) {\n        metadata_[i].data_.resize(4);\n        for(int j = 0; j < DBFGetFieldCount(dataHandle); j++) {\n            char fieldTitle[12];\n            int fieldWidth, fieldDecimals;\n            DBFFieldType eType = DBFGetFieldInfo(dataHandle, j, fieldTitle, &fieldWidth, &fieldDecimals);\n\n            fieldTitle[11] = 0;\n            std::string fieldTitleStr(fieldTitle);\n\n            if( eType == FTString ) {\n                if(fieldTitleStr == \"tzid\") {\n                    std::string data = DBFReadStringAttribute(dataHandle, i, j);\n                    size_t pos = data.find('/');\n                    if (pos == std::string::npos) {\n                        metadata_[i].data_.at(0) = data;\n                    } else {\n                        metadata_[i].data_.at(0) = data.substr(0, pos) + \"/\";\n                        metadata_[i].data_.at(1) = data.substr(pos + 1, std::string::npos);\n                    }\n                    if(tzidToAlpha2.count(data)) {\n                        metadata_[i].data_.at(2) = tzidToAlpha2[data];\n                        if(alpha2ToName.count(metadata_[i].data_.at(2))) {\n                            metadata_[i].data_.at(3) = alpha2ToName[metadata_[i].data_.at(2)];\n                        } else {\n                            std::cout<<metadata_[i].data_.at(2)<< \" not found in alpha2ToName! (\"<<data<<\")\\n\";\n                        }\n                    } else {\n                        std::cout<<data<<\" not found in zoneToAlpha2!\\n\";\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid readMetaDataNaturalEarthCountry(DBFHandle dataHandle)\n{\n    /* Specify field names */\n    fieldNames_.push_back(\"Alpha2\");\n    fieldNames_.push_back(\"Alpha3\");\n    fieldNames_.push_back(\"Name\");\n\n    /* Parse attribute names */\n    for(int i = 0; i < DBFGetRecordCount(dataHandle); i++) {\n        metadata_[i].data_.resize(3);\n        for(int j = 0; j < DBFGetFieldCount(dataHandle); j++) {\n            char fieldTitle[12];\n            int fieldWidth, fieldDecimals;\n            DBFFieldType eType = DBFGetFieldInfo(dataHandle, j, fieldTitle, &fieldWidth, &fieldDecimals);\n\n            fieldTitle[11] = 0;\n            std::string fieldTitleStr(fieldTitle);\n\n            if( eType == FTString ) {\n                if(fieldTitleStr == \"ISO_A2\" || fieldTitleStr == \"WB_A2\") {\n                    std::string tmp = DBFReadStringAttribute(dataHandle, i, j);\n                    if(tmp != \"-99\") {\n                        metadata_[i].data_.at(0) = tmp;\n                    }\n                } else if(fieldTitleStr == \"ISO_A3\" || fieldTitleStr == \"WB_A3\" || fieldTitleStr == \"BRK_A3\") {\n                    std::string tmp = DBFReadStringAttribute(dataHandle, i, j);\n                    if(tmp != \"-99\") {\n                        metadata_[i].data_.at(1) = tmp;\n                    }\n                } else if(fieldTitleStr == \"NAME_LONG\") {\n                    metadata_[i].data_.at(2) = DBFReadStringAttribute(dataHandle, i, j);\n                }\n            }\n\n        }\n    }\n}\n\nstd::unordered_map<std::string, std::string> parseAlpha2ToName(DBFHandle dataHandle)\n{\n    std::unordered_map<std::string, std::string> result;\n\n    for(int i = 0; i < DBFGetRecordCount(dataHandle); i++) {\n        std::string alpha2, name;\n        for(int j = 0; j < DBFGetFieldCount(dataHandle); j++) {\n            char fieldTitle[12];\n            int fieldWidth, fieldDecimals;\n            DBFFieldType eType = DBFGetFieldInfo(dataHandle, j, fieldTitle, &fieldWidth, &fieldDecimals);\n\n            fieldTitle[11] = 0;\n            std::string fieldTitleStr(fieldTitle);\n\n            if( eType == FTString ) {\n                if(fieldTitleStr == \"ISO_A2\" || fieldTitleStr == \"WB_A2\") {\n                    std::string tmp = DBFReadStringAttribute(dataHandle, i, j);\n                    if(tmp != \"-99\" && alpha2 == \"\") {\n                        alpha2 = tmp;\n                    }\n                } else if(fieldTitleStr == \"NAME_LONG\") {\n                    name = DBFReadStringAttribute(dataHandle, i, j);\n                }\n            }\n        }\n        if(alpha2 != \"\") {\n            result[alpha2]=name;\n        }\n    }\n\n    result[\"GF\"]=\"French Guiana\";\n    result[\"GP\"]=\"Guadeloupe\";\n    result[\"BQ\"]=\"Bonaire\";\n    result[\"MQ\"]=\"Martinique\";\n    result[\"SJ\"]=\"Svalbard and Jan Mayen Islands\";\n    result[\"NO\"]=\"Norway\";\n    result[\"CX\"]=\"Christmas Island\";\n    result[\"CC\"]=\"Cocos Islands\";\n    result[\"YT\"]=\"Mayotte\";\n    result[\"RE\"]=\"Réunion\";\n    result[\"TK\"]=\"Tokelau\";\n    result[\"TW\"]=\"Taiwan\";\n\n    return result;\n}\n\nstd::unordered_map<std::string, std::string> parseTimezoneToAlpha2(std::string path)\n{\n    std::unordered_map<std::string, std::string> result;\n    //TODO: Clean solution...\n#include \"zoneToAlpha.h\"\n\n    return result;\n}\n\nint main(int argc, char ** argv )\n{\n    if(argc != 7) {\n        std::cout << \"Wrong number of parameters\\n\";\n        return 1;\n    }\n\n    tzidToAlpha2 = parseTimezoneToAlpha2(\"TODO\");\n\n    char tableType = argv[1][0];\n    std::string path = argv[2];\n    std::string outPath = argv[3];\n    unsigned int precision = strtol(argv[4], NULL, 10);\n    std::string notice = argv[5];\n    version = strtol(argv[6], NULL, 10);\n    if(version > 1){\n        std::cout << \"Unknown version\\n\";\n        return 1;\n    }\n\n    DBFHandle dataHandle = DBFOpen(\"naturalearth/ne_10m_admin_0_countries_lakes\", \"rb\" );\n    alpha2ToName = parseAlpha2ToName(dataHandle);\n    DBFClose(dataHandle);\n\n    dataHandle = DBFOpen(path.c_str(), \"rb\" );\n    if( dataHandle == NULL ) {\n        errorFatal(\"Could not open attribute file\\n\");\n    }\n\n    metadata_.resize(DBFGetRecordCount(dataHandle));\n    std::cout << \"Reading \"<<metadata_.size()<<\" metadata records.\\n\";\n\n    if(tableType == 'C') {\n        readMetaDataNaturalEarthCountry(dataHandle);\n    } else if(tableType == 'T') {\n        readMetaDataTimezone(dataHandle);\n    } else {\n        std::cout << \"Unknown table type\\n\";\n        return 1;\n    }\n\n    DBFClose(dataHandle);\n\n    SHPHandle shapeHandle = SHPOpen(path.c_str(), \"rb\");\n    if( shapeHandle == NULL ) {\n        errorFatal(\"Could not open shapefile\\n\");\n    }\n\n    int numEntities, shapeType, totalPolygons = 0;\n    SHPGetInfo(shapeHandle, &numEntities, &shapeType, NULL, NULL);\n\n    std::cout<<\"Opened \"<<SHPTypeName( shapeType )<< \" file with \"<<numEntities<<\" entries.\\n\";\n\n    for(int i = 0; i < numEntities; i++ ) {\n        SHPObject *shapeObject;\n\n        shapeObject = SHPReadObject( shapeHandle, i );\n        if(shapeObject) {\n            if(shapeObject->nSHPType != 3 && shapeObject->nSHPType != 5 &&\n                    shapeObject->nSHPType != 13 && shapeObject->nSHPType != 15) {\n                std::cout<<\"Unsupported shape object (\"<< SHPTypeName(shapeObject->nSHPType) <<\")\\n\";\n                continue;\n            }\n\n            int partIndex = 0;\n\n            PolygonData* polygonData = nullptr;\n\n            for(int j = 0; j < shapeObject->nVertices; j++ ) {\n                if(j == 0 || j == shapeObject->panPartStart[partIndex]) {\n                    totalPolygons++;\n\n                    if(polygonData) {\n                        /* Commit it */\n                        polygons_.push_back(polygonData);\n                    }\n                    polygonData =  new PolygonData(i);\n\n                    if(partIndex + 1 < shapeObject->nParts) {\n                        partIndex++;\n                    }\n                }\n\n                Point* p = Point::GetPoint(shapeObject->padfY[j], shapeObject->padfX[j], precision);\n                polygonData->processPoint(p);\n\n            }\n\n            if(polygonData) {\n                /* Commit it */\n                polygons_.push_back(polygonData);\n            }\n\n            SHPDestroyObject(shapeObject);\n        }\n    }\n\n    SHPClose(shapeHandle);\n\n    std::cout<<\"Parsed \"<<totalPolygons<<\" polygons.\\n\";\n\n    /* Sort according to bounding box */\n    std::sort(polygons_.begin(), polygons_.end(), [](PolygonData* a, PolygonData* b) {\n        return a->boundingMin.lat_ < b->boundingMin.lat_;\n    });\n\n    /* Encode data section and store pointers */\n    std::vector<uint8_t> outputData;\n    for(PolygonData* polygon: polygons_) {\n        polygon->fileIndex_ = outputData.size();\n        if(version == 0){\n            std::vector<uint8_t> tmpData;\n            unsigned int numPoints = polygon->encodeBinaryData(tmpData);\n            encodeVariableLength(outputData, numPoints, false);\n            outputData.insert(std::end(outputData), std::begin(tmpData), std::end(tmpData));\n        }else{\n            polygon->encodeBinaryData(outputData);\n        }\n    }\n    std::cout << \"Encoded data section into \"<<outputData.size()<<\" bytes.\\n\";\n\n    /* Encode metadata */\n    std::vector<uint8_t> outputMeta;\n    for(MetaData& metadata: metadata_) {\n        metadata.fileIndex_ = outputMeta.size();\n        metadata.encodeBinaryData(outputMeta);\n    }\n    std::cout << \"Encoded metadata into \"<<outputMeta.size()<<\" bytes.\\n\";\n\n    /* Encode bounding boxes */\n    std::vector<uint8_t> outputBBox;\n    int64_t prevFileIndex = 0;\n    int64_t prevMetaIndex = 0;\n    for(PolygonData* polygon: polygons_) {\n        polygon->boundingMin.encodePointBinary(outputBBox);\n        polygon->boundingMax.encodePointBinary(outputBBox);\n\n        encodeVariableLength(outputBBox, metadata_.at(polygon->metadataId_).fileIndex_ - prevMetaIndex);\n        prevMetaIndex = metadata_[polygon->metadataId_].fileIndex_;\n\n        encodeVariableLength(outputBBox, polygon->fileIndex_ - prevFileIndex, false);\n        prevFileIndex = polygon->fileIndex_;\n    }\n    std::cout << \"Encoded bounding box section into \"<<outputBBox.size()<<\" bytes.\\n\";\n\n    /* Encode header */\n    std::vector<uint8_t> outputHeader;\n    outputHeader.push_back('P');\n    outputHeader.push_back('L');\n    outputHeader.push_back('B');\n    outputHeader.push_back(tableType);\n    outputHeader.push_back(version);\n    outputHeader.push_back(precision);\n    outputHeader.push_back(fieldNames_.size());\n    for(unsigned int i=0; i<fieldNames_.size(); i++) {\n        encodeStringToBinary(outputHeader, fieldNames_[i]);\n    }\n    encodeStringToBinary(outputHeader, notice);\n    encodeVariableLength(outputHeader, outputBBox.size(), false);\n    encodeVariableLength(outputHeader, outputMeta.size(), false);\n    encodeVariableLength(outputHeader, outputData.size(), false);\n    std::cout << \"Encoded header into \"<<outputHeader.size()<<\" bytes.\\n\";\n\n    FILE* outputFile = fopen(outPath.c_str(), \"wb\");\n    fwrite(outputHeader.data(), 1, outputHeader.size(), outputFile);\n    fwrite(outputBBox.data(), 1, outputBBox.size(), outputFile);\n    fwrite(outputMeta.data(), 1, outputMeta.size(), outputFile);\n    fwrite(outputData.data(), 1, outputData.size(), outputFile);\n    fclose(outputFile);\n\n}\n"
  },
  {
    "path": "devtools/timezones/builder/buildspec.yml",
    "content": "version: 0.2\n\nphases:\n  build:\n    commands:\n       - apt update\n       - apt install -y libshp-dev\n       - cd database/builder\n       - ./makedb.sh\n\nartifacts:\n  files:\n    - database/builder/db.zip\n  discard-paths: yes\n"
  },
  {
    "path": "devtools/timezones/builder/makedb.sh",
    "content": "#!/bin/sh\n\nset -e\n\ng++ builder.cpp --std=c++11 -o builder -lshp\n\nrm -rf out naturalearth timezone db.zip\nmkdir -p out\nmkdir -p out_v1\nmkdir -p naturalearth\nmkdir -p timezone\n\n(\necho https://naciscdn.org/naturalearth/10m/cultural/ne_10m_admin_0_countries_lakes.zip -o /dev/null -O naturalearth/ne.zip\necho https://github.com/evansiroky/timezone-boundary-builder/releases/latest/download/timezones-with-oceans.shapefile.zip -o /dev/null -O timezone/tz.zip\n) | xargs -n5 -P2 wget\n\ncd naturalearth\nunzip ne.zip\ncd ..\n\n(\necho C \"naturalearth/ne_10m_admin_0_countries_lakes ./out/country16.bin 16 \\\"Made with Natural Earth, placed in the Public Domain.\\\" 0\";\necho C \"naturalearth/ne_10m_admin_0_countries_lakes ./out/country21.bin 21 \\\"Made with Natural Earth, placed in the Public Domain.\\\" 0\";\necho C \"naturalearth/ne_10m_admin_0_countries_lakes ./out_v1/country16.bin 16 \\\"Made with Natural Earth, placed in the Public Domain.\\\" 1\";\necho C \"naturalearth/ne_10m_admin_0_countries_lakes ./out_v1/country21.bin 21 \\\"Made with Natural Earth, placed in the Public Domain.\\\" 1\";\n) | xargs -n6 -P4 ./builder\n\ncd timezone\nunzip tz.zip\ncd ..\n\n(\necho \"T timezone/combined-shapefile-with-oceans ./out/timezone16.bin 16 \\\"Contains data from Natural Earth, placed in the Public Domain. Contains information from https://github.com/evansiroky/timezone-boundary-builder, which is made available here under the Open Database License \\(ODbL\\).\\\" 0\";\necho \"T timezone/combined-shapefile-with-oceans ./out/timezone21.bin 21 \\\"Contains data from Natural Earth, placed in the Public Domain. Contains information from https://github.com/evansiroky/timezone-boundary-builder, which is made available here under the Open Database License \\(ODbL\\).\\\" 0\";\necho \"T timezone/combined-shapefile-with-oceans ./out_v1/timezone16.bin 16 \\\"Contains data from Natural Earth, placed in the Public Domain. Contains information from https://github.com/evansiroky/timezone-boundary-builder, which is made available here under the Open Database License \\(ODbL\\).\\\" 1\";\necho \"T timezone/combined-shapefile-with-oceans ./out_v1/timezone21.bin 21 \\\"Contains data from Natural Earth, placed in the Public Domain. Contains information from https://github.com/evansiroky/timezone-boundary-builder, which is made available here under the Open Database License \\(ODbL\\).\\\" 1\";\n) | xargs -n 6 -P4 ./builder\n\nrm -rf timezone naturalearth\n\nzip db.zip out/* out_v1/*\n"
  },
  {
    "path": "devtools/timezones/builder/zoneToAlpha.h",
    "content": "result[\"Europe/Andorra\"] = \"AD\";\nresult[\"Asia/Dubai\"] = \"AE\";\nresult[\"Asia/Kabul\"] = \"AF\";\nresult[\"America/Antigua\"] = \"AG\";\nresult[\"America/Anguilla\"] = \"AI\";\nresult[\"Europe/Tirane\"] = \"AL\";\nresult[\"Asia/Yerevan\"] = \"AM\";\nresult[\"Africa/Luanda\"] = \"AO\";\nresult[\"Antarctica/McMurdo\"] = \"AQ\";\nresult[\"Antarctica/Casey\"] = \"AQ\";\nresult[\"Antarctica/Davis\"] = \"AQ\";\nresult[\"Antarctica/DumontDUrville\"] = \"AQ\";\nresult[\"Antarctica/Mawson\"] = \"AQ\";\nresult[\"Antarctica/Palmer\"] = \"AQ\";\nresult[\"Antarctica/Rothera\"] = \"AQ\";\nresult[\"Antarctica/Syowa\"] = \"AQ\";\nresult[\"Antarctica/Troll\"] = \"AQ\";\nresult[\"Antarctica/Vostok\"] = \"AQ\";\nresult[\"America/Argentina/Buenos_Aires\"] = \"AR\";\nresult[\"America/Argentina/Cordoba\"] = \"AR\";\nresult[\"America/Argentina/Salta\"] = \"AR\";\nresult[\"America/Argentina/Jujuy\"] = \"AR\";\nresult[\"America/Argentina/Tucuman\"] = \"AR\";\nresult[\"America/Argentina/Catamarca\"] = \"AR\";\nresult[\"America/Argentina/La_Rioja\"] = \"AR\";\nresult[\"America/Argentina/San_Juan\"] = \"AR\";\nresult[\"America/Argentina/Mendoza\"] = \"AR\";\nresult[\"America/Argentina/San_Luis\"] = \"AR\";\nresult[\"America/Argentina/Rio_Gallegos\"] = \"AR\";\nresult[\"America/Argentina/Ushuaia\"] = \"AR\";\nresult[\"America/Nuuk\"] = \"GL\";\nresult[\"Pacific/Pago_Pago\"] = \"AS\";\nresult[\"Europe/Vienna\"] = \"AT\";\nresult[\"Australia/Lord_Howe\"] = \"AU\";\nresult[\"Antarctica/Macquarie\"] = \"AU\";\nresult[\"Australia/Hobart\"] = \"AU\";\nresult[\"Australia/Currie\"] = \"AU\";\nresult[\"Australia/Melbourne\"] = \"AU\";\nresult[\"Australia/Sydney\"] = \"AU\";\nresult[\"Australia/Broken_Hill\"] = \"AU\";\nresult[\"Australia/Brisbane\"] = \"AU\";\nresult[\"Australia/Lindeman\"] = \"AU\";\nresult[\"Australia/Adelaide\"] = \"AU\";\nresult[\"Australia/Darwin\"] = \"AU\";\nresult[\"Australia/Perth\"] = \"AU\";\nresult[\"Australia/Eucla\"] = \"AU\";\nresult[\"America/Aruba\"] = \"AW\";\nresult[\"Europe/Mariehamn\"] = \"AX\";\nresult[\"Asia/Baku\"] = \"AZ\";\nresult[\"Europe/Sarajevo\"] = \"BA\";\nresult[\"America/Barbados\"] = \"BB\";\nresult[\"Asia/Dhaka\"] = \"BD\";\nresult[\"Europe/Brussels\"] = \"BE\";\nresult[\"Africa/Ouagadougou\"] = \"BF\";\nresult[\"Europe/Sofia\"] = \"BG\";\nresult[\"Asia/Bahrain\"] = \"BH\";\nresult[\"Africa/Bujumbura\"] = \"BI\";\nresult[\"Africa/Porto-Novo\"] = \"BJ\";\nresult[\"America/St_Barthelemy\"] = \"BL\";\nresult[\"Atlantic/Bermuda\"] = \"BM\";\nresult[\"Asia/Brunei\"] = \"BN\";\nresult[\"America/La_Paz\"] = \"BO\";\nresult[\"America/Kralendijk\"] = \"BQ\";\nresult[\"America/Noronha\"] = \"BR\";\nresult[\"America/Belem\"] = \"BR\";\nresult[\"America/Fortaleza\"] = \"BR\";\nresult[\"America/Recife\"] = \"BR\";\nresult[\"America/Araguaina\"] = \"BR\";\nresult[\"America/Maceio\"] = \"BR\";\nresult[\"America/Bahia\"] = \"BR\";\nresult[\"America/Sao_Paulo\"] = \"BR\";\nresult[\"America/Campo_Grande\"] = \"BR\";\nresult[\"America/Cuiaba\"] = \"BR\";\nresult[\"America/Santarem\"] = \"BR\";\nresult[\"America/Porto_Velho\"] = \"BR\";\nresult[\"America/Boa_Vista\"] = \"BR\";\nresult[\"America/Manaus\"] = \"BR\";\nresult[\"America/Eirunepe\"] = \"BR\";\nresult[\"America/Rio_Branco\"] = \"BR\";\nresult[\"America/Nassau\"] = \"BS\";\nresult[\"Asia/Thimphu\"] = \"BT\";\nresult[\"Africa/Gaborone\"] = \"BW\";\nresult[\"Europe/Minsk\"] = \"BY\";\nresult[\"America/Belize\"] = \"BZ\";\nresult[\"America/St_Johns\"] = \"CA\";\nresult[\"America/Halifax\"] = \"CA\";\nresult[\"America/Glace_Bay\"] = \"CA\";\nresult[\"America/Moncton\"] = \"CA\";\nresult[\"America/Goose_Bay\"] = \"CA\";\nresult[\"America/Blanc-Sablon\"] = \"CA\";\nresult[\"America/Toronto\"] = \"CA\";\nresult[\"America/Nipigon\"] = \"CA\";\nresult[\"America/Thunder_Bay\"] = \"CA\";\nresult[\"America/Iqaluit\"] = \"CA\";\nresult[\"America/Pangnirtung\"] = \"CA\";\nresult[\"America/Atikokan\"] = \"CA\";\nresult[\"America/Winnipeg\"] = \"CA\";\nresult[\"America/Rainy_River\"] = \"CA\";\nresult[\"America/Resolute\"] = \"CA\";\nresult[\"America/Rankin_Inlet\"] = \"CA\";\nresult[\"America/Regina\"] = \"CA\";\nresult[\"America/Swift_Current\"] = \"CA\";\nresult[\"America/Edmonton\"] = \"CA\";\nresult[\"America/Cambridge_Bay\"] = \"CA\";\nresult[\"America/Yellowknife\"] = \"CA\";\nresult[\"America/Inuvik\"] = \"CA\";\nresult[\"America/Creston\"] = \"CA\";\nresult[\"America/Dawson_Creek\"] = \"CA\";\nresult[\"America/Fort_Nelson\"] = \"CA\";\nresult[\"America/Vancouver\"] = \"CA\";\nresult[\"America/Whitehorse\"] = \"CA\";\nresult[\"America/Dawson\"] = \"CA\";\nresult[\"Indian/Cocos\"] = \"CC\";\nresult[\"Africa/Kinshasa\"] = \"CD\";\nresult[\"Africa/Lubumbashi\"] = \"CD\";\nresult[\"Africa/Bangui\"] = \"CF\";\nresult[\"Africa/Brazzaville\"] = \"CG\";\nresult[\"Europe/Zurich\"] = \"CH\";\nresult[\"Africa/Abidjan\"] = \"CI\";\nresult[\"Pacific/Rarotonga\"] = \"CK\";\nresult[\"America/Santiago\"] = \"CL\";\nresult[\"America/Punta_Arenas\"] = \"CL\";\nresult[\"Pacific/Easter\"] = \"CL\";\nresult[\"Africa/Douala\"] = \"CM\";\nresult[\"Asia/Shanghai\"] = \"CN\";\nresult[\"Asia/Urumqi\"] = \"CN\";\nresult[\"America/Bogota\"] = \"CO\";\nresult[\"America/Costa_Rica\"] = \"CR\";\nresult[\"America/Havana\"] = \"CU\";\nresult[\"Atlantic/Cape_Verde\"] = \"CV\";\nresult[\"America/Curacao\"] = \"CW\";\nresult[\"Indian/Christmas\"] = \"CX\";\nresult[\"Asia/Nicosia\"] = \"CY\";\nresult[\"Asia/Famagusta\"] = \"CY\";\nresult[\"Europe/Prague\"] = \"CZ\";\nresult[\"Europe/Berlin\"] = \"DE\";\nresult[\"Europe/Busingen\"] = \"DE\";\nresult[\"Africa/Djibouti\"] = \"DJ\";\nresult[\"Europe/Copenhagen\"] = \"DK\";\nresult[\"America/Dominica\"] = \"DM\";\nresult[\"America/Santo_Domingo\"] = \"DO\";\nresult[\"Africa/Algiers\"] = \"DZ\";\nresult[\"America/Guayaquil\"] = \"EC\";\nresult[\"Pacific/Galapagos\"] = \"EC\";\nresult[\"Europe/Tallinn\"] = \"EE\";\nresult[\"Africa/Cairo\"] = \"EG\";\nresult[\"Africa/El_Aaiun\"] = \"EH\";\nresult[\"Africa/Asmara\"] = \"ER\";\nresult[\"Europe/Madrid\"] = \"ES\";\nresult[\"Africa/Ceuta\"] = \"ES\";\nresult[\"Atlantic/Canary\"] = \"ES\";\nresult[\"Africa/Addis_Ababa\"] = \"ET\";\nresult[\"Europe/Helsinki\"] = \"FI\";\nresult[\"Pacific/Fiji\"] = \"FJ\";\nresult[\"Atlantic/Stanley\"] = \"FK\";\nresult[\"Pacific/Chuuk\"] = \"FM\";\nresult[\"Pacific/Pohnpei\"] = \"FM\";\nresult[\"Pacific/Kosrae\"] = \"FM\";\nresult[\"Atlantic/Faroe\"] = \"FO\";\nresult[\"Europe/Paris\"] = \"FR\";\nresult[\"Africa/Libreville\"] = \"GA\";\nresult[\"Europe/London\"] = \"GB\";\nresult[\"America/Grenada\"] = \"GD\";\nresult[\"Asia/Tbilisi\"] = \"GE\";\nresult[\"America/Cayenne\"] = \"GF\";\nresult[\"Europe/Guernsey\"] = \"GG\";\nresult[\"Africa/Accra\"] = \"GH\";\nresult[\"Europe/Gibraltar\"] = \"GI\";\nresult[\"America/Godthab\"] = \"GL\";\nresult[\"America/Danmarkshavn\"] = \"GL\";\nresult[\"America/Scoresbysund\"] = \"GL\";\nresult[\"America/Thule\"] = \"GL\";\nresult[\"Africa/Banjul\"] = \"GM\";\nresult[\"Africa/Conakry\"] = \"GN\";\nresult[\"America/Guadeloupe\"] = \"GP\";\nresult[\"Africa/Malabo\"] = \"GQ\";\nresult[\"Europe/Athens\"] = \"GR\";\nresult[\"Atlantic/South_Georgia\"] = \"GS\";\nresult[\"America/Guatemala\"] = \"GT\";\nresult[\"Pacific/Guam\"] = \"GU\";\nresult[\"Africa/Bissau\"] = \"GW\";\nresult[\"America/Guyana\"] = \"GY\";\nresult[\"Asia/Hong_Kong\"] = \"HK\";\nresult[\"America/Tegucigalpa\"] = \"HN\";\nresult[\"Europe/Zagreb\"] = \"HR\";\nresult[\"America/Port-au-Prince\"] = \"HT\";\nresult[\"Europe/Budapest\"] = \"HU\";\nresult[\"Asia/Jakarta\"] = \"ID\";\nresult[\"Asia/Pontianak\"] = \"ID\";\nresult[\"Asia/Makassar\"] = \"ID\";\nresult[\"Asia/Jayapura\"] = \"ID\";\nresult[\"Europe/Dublin\"] = \"IE\";\nresult[\"Asia/Jerusalem\"] = \"IL\";\nresult[\"Europe/Isle_of_Man\"] = \"IM\";\nresult[\"Asia/Kolkata\"] = \"IN\";\nresult[\"Indian/Chagos\"] = \"IO\";\nresult[\"Asia/Baghdad\"] = \"IQ\";\nresult[\"Asia/Tehran\"] = \"IR\";\nresult[\"Atlantic/Reykjavik\"] = \"IS\";\nresult[\"Europe/Rome\"] = \"IT\";\nresult[\"Europe/Jersey\"] = \"JE\";\nresult[\"America/Jamaica\"] = \"JM\";\nresult[\"Asia/Amman\"] = \"JO\";\nresult[\"Asia/Tokyo\"] = \"JP\";\nresult[\"Africa/Nairobi\"] = \"KE\";\nresult[\"Asia/Bishkek\"] = \"KG\";\nresult[\"Asia/Phnom_Penh\"] = \"KH\";\nresult[\"Pacific/Tarawa\"] = \"KI\";\nresult[\"Pacific/Enderbury\"] = \"KI\";\nresult[\"Pacific/Kiritimati\"] = \"KI\";\nresult[\"Indian/Comoro\"] = \"KM\";\nresult[\"America/St_Kitts\"] = \"KN\";\nresult[\"Asia/Pyongyang\"] = \"KP\";\nresult[\"Asia/Seoul\"] = \"KR\";\nresult[\"Asia/Kuwait\"] = \"KW\";\nresult[\"America/Cayman\"] = \"KY\";\nresult[\"Asia/Almaty\"] = \"KZ\";\nresult[\"Asia/Qyzylorda\"] = \"KZ\";\nresult[\"Asia/Aqtobe\"] = \"KZ\";\nresult[\"Asia/Aqtau\"] = \"KZ\";\nresult[\"Asia/Atyrau\"] = \"KZ\";\nresult[\"Asia/Oral\"] = \"KZ\";\nresult[\"Asia/Vientiane\"] = \"LA\";\nresult[\"Asia/Beirut\"] = \"LB\";\nresult[\"America/St_Lucia\"] = \"LC\";\nresult[\"Europe/Vaduz\"] = \"LI\";\nresult[\"Asia/Colombo\"] = \"LK\";\nresult[\"Africa/Monrovia\"] = \"LR\";\nresult[\"Africa/Maseru\"] = \"LS\";\nresult[\"Europe/Vilnius\"] = \"LT\";\nresult[\"Europe/Luxembourg\"] = \"LU\";\nresult[\"Europe/Riga\"] = \"LV\";\nresult[\"Africa/Tripoli\"] = \"LY\";\nresult[\"Africa/Casablanca\"] = \"MA\";\nresult[\"Europe/Monaco\"] = \"MC\";\nresult[\"Europe/Chisinau\"] = \"MD\";\nresult[\"Europe/Podgorica\"] = \"ME\";\nresult[\"America/Marigot\"] = \"MF\";\nresult[\"Indian/Antananarivo\"] = \"MG\";\nresult[\"Pacific/Majuro\"] = \"MH\";\nresult[\"Pacific/Kwajalein\"] = \"MH\";\nresult[\"Europe/Skopje\"] = \"MK\";\nresult[\"Africa/Bamako\"] = \"ML\";\nresult[\"Asia/Yangon\"] = \"MM\";\nresult[\"Asia/Ulaanbaatar\"] = \"MN\";\nresult[\"Asia/Hovd\"] = \"MN\";\nresult[\"Asia/Choibalsan\"] = \"MN\";\nresult[\"Asia/Macau\"] = \"MO\";\nresult[\"Pacific/Saipan\"] = \"MP\";\nresult[\"America/Martinique\"] = \"MQ\";\nresult[\"Africa/Nouakchott\"] = \"MR\";\nresult[\"America/Montserrat\"] = \"MS\";\nresult[\"Europe/Malta\"] = \"MT\";\nresult[\"Indian/Mauritius\"] = \"MU\";\nresult[\"Indian/Maldives\"] = \"MV\";\nresult[\"Africa/Blantyre\"] = \"MW\";\nresult[\"America/Mexico_City\"] = \"MX\";\nresult[\"America/Cancun\"] = \"MX\";\nresult[\"America/Merida\"] = \"MX\";\nresult[\"America/Monterrey\"] = \"MX\";\nresult[\"America/Matamoros\"] = \"MX\";\nresult[\"America/Mazatlan\"] = \"MX\";\nresult[\"America/Chihuahua\"] = \"MX\";\nresult[\"America/Ojinaga\"] = \"MX\";\nresult[\"America/Hermosillo\"] = \"MX\";\nresult[\"America/Tijuana\"] = \"MX\";\nresult[\"America/Bahia_Banderas\"] = \"MX\";\nresult[\"Asia/Kuala_Lumpur\"] = \"MY\";\nresult[\"Asia/Qostanay\"] = \"KZ\";\nresult[\"Asia/Kuching\"] = \"MY\";\nresult[\"Africa/Maputo\"] = \"MZ\";\nresult[\"Africa/Windhoek\"] = \"NA\";\nresult[\"Pacific/Noumea\"] = \"NC\";\nresult[\"Africa/Niamey\"] = \"NE\";\nresult[\"Pacific/Norfolk\"] = \"NF\";\nresult[\"Africa/Lagos\"] = \"NG\";\nresult[\"America/Managua\"] = \"NI\";\nresult[\"Europe/Amsterdam\"] = \"NL\";\nresult[\"Europe/Oslo\"] = \"NO\";\nresult[\"Asia/Kathmandu\"] = \"NP\";\nresult[\"Pacific/Nauru\"] = \"NR\";\nresult[\"Pacific/Niue\"] = \"NU\";\nresult[\"Pacific/Auckland\"] = \"NZ\";\nresult[\"Pacific/Chatham\"] = \"NZ\";\nresult[\"Asia/Muscat\"] = \"OM\";\nresult[\"America/Panama\"] = \"PA\";\nresult[\"America/Lima\"] = \"PE\";\nresult[\"Pacific/Tahiti\"] = \"PF\";\nresult[\"Pacific/Marquesas\"] = \"PF\";\nresult[\"Pacific/Gambier\"] = \"PF\";\nresult[\"Pacific/Port_Moresby\"] = \"PG\";\nresult[\"Pacific/Bougainville\"] = \"PG\";\nresult[\"Asia/Manila\"] = \"PH\";\nresult[\"Asia/Karachi\"] = \"PK\";\nresult[\"Europe/Warsaw\"] = \"PL\";\nresult[\"America/Miquelon\"] = \"PM\";\nresult[\"Pacific/Pitcairn\"] = \"PN\";\nresult[\"America/Puerto_Rico\"] = \"PR\";\nresult[\"Asia/Gaza\"] = \"PS\";\nresult[\"Asia/Hebron\"] = \"PS\";\nresult[\"Europe/Lisbon\"] = \"PT\";\nresult[\"Atlantic/Madeira\"] = \"PT\";\nresult[\"Atlantic/Azores\"] = \"PT\";\nresult[\"Pacific/Palau\"] = \"PW\";\nresult[\"America/Asuncion\"] = \"PY\";\nresult[\"Asia/Qatar\"] = \"QA\";\nresult[\"Indian/Reunion\"] = \"RE\";\nresult[\"Europe/Bucharest\"] = \"RO\";\nresult[\"Europe/Belgrade\"] = \"RS\";\nresult[\"Europe/Kaliningrad\"] = \"RU\";\nresult[\"Europe/Moscow\"] = \"RU\";\nresult[\"Europe/Simferopol\"] = \"RU\";\nresult[\"Europe/Volgograd\"] = \"RU\";\nresult[\"Europe/Kirov\"] = \"RU\";\nresult[\"Europe/Astrakhan\"] = \"RU\";\nresult[\"Europe/Saratov\"] = \"RU\";\nresult[\"Europe/Ulyanovsk\"] = \"RU\";\nresult[\"Europe/Samara\"] = \"RU\";\nresult[\"Asia/Yekaterinburg\"] = \"RU\";\nresult[\"Asia/Omsk\"] = \"RU\";\nresult[\"Asia/Novosibirsk\"] = \"RU\";\nresult[\"Asia/Barnaul\"] = \"RU\";\nresult[\"Asia/Tomsk\"] = \"RU\";\nresult[\"Asia/Novokuznetsk\"] = \"RU\";\nresult[\"Asia/Krasnoyarsk\"] = \"RU\";\nresult[\"Asia/Irkutsk\"] = \"RU\";\nresult[\"Asia/Chita\"] = \"RU\";\nresult[\"Asia/Yakutsk\"] = \"RU\";\nresult[\"Asia/Khandyga\"] = \"RU\";\nresult[\"Asia/Vladivostok\"] = \"RU\";\nresult[\"Asia/Ust-Nera\"] = \"RU\";\nresult[\"Asia/Magadan\"] = \"RU\";\nresult[\"Asia/Sakhalin\"] = \"RU\";\nresult[\"Asia/Srednekolymsk\"] = \"RU\";\nresult[\"Asia/Kamchatka\"] = \"RU\";\nresult[\"Asia/Anadyr\"] = \"RU\";\nresult[\"Africa/Kigali\"] = \"RW\";\nresult[\"Asia/Riyadh\"] = \"SA\";\nresult[\"Pacific/Guadalcanal\"] = \"SB\";\nresult[\"Indian/Mahe\"] = \"SC\";\nresult[\"Africa/Khartoum\"] = \"SD\";\nresult[\"Europe/Stockholm\"] = \"SE\";\nresult[\"Asia/Singapore\"] = \"SG\";\nresult[\"Atlantic/St_Helena\"] = \"SH\";\nresult[\"Europe/Ljubljana\"] = \"SI\";\nresult[\"Arctic/Longyearbyen\"] = \"SJ\";\nresult[\"Europe/Bratislava\"] = \"SK\";\nresult[\"Africa/Freetown\"] = \"SL\";\nresult[\"Europe/San_Marino\"] = \"SM\";\nresult[\"Africa/Dakar\"] = \"SN\";\nresult[\"Africa/Mogadishu\"] = \"SO\";\nresult[\"America/Paramaribo\"] = \"SR\";\nresult[\"Africa/Juba\"] = \"SS\";\nresult[\"Africa/Sao_Tome\"] = \"ST\";\nresult[\"America/El_Salvador\"] = \"SV\";\nresult[\"America/Lower_Princes\"] = \"SX\";\nresult[\"Asia/Damascus\"] = \"SY\";\nresult[\"Africa/Mbabane\"] = \"SZ\";\nresult[\"America/Grand_Turk\"] = \"TC\";\nresult[\"Africa/Ndjamena\"] = \"TD\";\nresult[\"Indian/Kerguelen\"] = \"TF\";\nresult[\"Africa/Lome\"] = \"TG\";\nresult[\"Asia/Bangkok\"] = \"TH\";\nresult[\"Asia/Dushanbe\"] = \"TJ\";\nresult[\"Pacific/Fakaofo\"] = \"TK\";\nresult[\"Asia/Dili\"] = \"TL\";\nresult[\"Asia/Ashgabat\"] = \"TM\";\nresult[\"Africa/Tunis\"] = \"TN\";\nresult[\"Pacific/Tongatapu\"] = \"TO\";\nresult[\"Europe/Istanbul\"] = \"TR\";\nresult[\"America/Port_of_Spain\"] = \"TT\";\nresult[\"Pacific/Funafuti\"] = \"TV\";\nresult[\"Asia/Taipei\"] = \"TW\";\nresult[\"Africa/Dar_es_Salaam\"] = \"TZ\";\nresult[\"Europe/Kyiv\"] = \"UA\";\nresult[\"Europe/Uzhgorod\"] = \"UA\";\nresult[\"Europe/Zaporozhye\"] = \"UA\";\nresult[\"Africa/Kampala\"] = \"UG\";\nresult[\"Pacific/Midway\"] = \"UM\";\nresult[\"Pacific/Wake\"] = \"UM\";\nresult[\"America/New_York\"] = \"US\";\nresult[\"America/Detroit\"] = \"US\";\nresult[\"America/Kentucky/Louisville\"] = \"US\";\nresult[\"America/Kentucky/Monticello\"] = \"US\";\nresult[\"America/Indiana/Indianapolis\"] = \"US\";\nresult[\"America/Indiana/Vincennes\"] = \"US\";\nresult[\"America/Indiana/Winamac\"] = \"US\";\nresult[\"America/Indiana/Marengo\"] = \"US\";\nresult[\"America/Indiana/Petersburg\"] = \"US\";\nresult[\"America/Indiana/Vevay\"] = \"US\";\nresult[\"America/Chicago\"] = \"US\";\nresult[\"America/Indiana/Tell_City\"] = \"US\";\nresult[\"America/Indiana/Knox\"] = \"US\";\nresult[\"America/Menominee\"] = \"US\";\nresult[\"America/North_Dakota/Center\"] = \"US\";\nresult[\"America/North_Dakota/New_Salem\"] = \"US\";\nresult[\"America/North_Dakota/Beulah\"] = \"US\";\nresult[\"America/Denver\"] = \"US\";\nresult[\"America/Boise\"] = \"US\";\nresult[\"America/Phoenix\"] = \"US\";\nresult[\"America/Los_Angeles\"] = \"US\";\nresult[\"America/Anchorage\"] = \"US\";\nresult[\"America/Juneau\"] = \"US\";\nresult[\"America/Sitka\"] = \"US\";\nresult[\"America/Metlakatla\"] = \"US\";\nresult[\"America/Yakutat\"] = \"US\";\nresult[\"America/Nome\"] = \"US\";\nresult[\"America/Adak\"] = \"US\";\nresult[\"Pacific/Honolulu\"] = \"US\";\nresult[\"America/Montevideo\"] = \"UY\";\nresult[\"Asia/Samarkand\"] = \"UZ\";\nresult[\"Asia/Tashkent\"] = \"UZ\";\nresult[\"Europe/Vatican\"] = \"VA\";\nresult[\"America/St_Vincent\"] = \"VC\";\nresult[\"America/Caracas\"] = \"VE\";\nresult[\"America/Tortola\"] = \"VG\";\nresult[\"America/St_Thomas\"] = \"VI\";\nresult[\"Asia/Ho_Chi_Minh\"] = \"VN\";\nresult[\"Pacific/Efate\"] = \"VU\";\nresult[\"Pacific/Wallis\"] = \"WF\";\nresult[\"Pacific/Apia\"] = \"WS\";\nresult[\"Asia/Aden\"] = \"YE\";\nresult[\"Indian/Mayotte\"] = \"YT\";\nresult[\"Africa/Johannesburg\"] = \"ZA\";\nresult[\"Africa/Lusaka\"] = \"ZM\";\nresult[\"Africa/Harare\"] = \"ZW\";\n"
  },
  {
    "path": "devtools/timezones/country_DATA_LICENSE",
    "content": "Source: http://www.naturalearthdata.com/\n\nAll versions of Natural Earth raster + vector map data found on this website are in the public domain. You may use the maps in any manner, including modifying the content and design, electronic dissemination, and offset printing. The primary authors, Tom Patterson and Nathaniel Vaughn Kelso, and all other contributors renounce all financial claim to the maps and invites you to use them for personal, educational, and commercial purposes.\n\nNo permission is needed to use Natural Earth. Crediting the authors is unnecessary.\n"
  },
  {
    "path": "devtools/timezones/timezone_DATA_LICENSE",
    "content": "Source: https://github.com/evansiroky/timezone-boundary-builder\n\nOpen Database License (ODbL) v1.0\nDisclaimer\nOpen Data Commons is not a law firm and does not provide legal services of any kind.\n\nOpen Data Commons has no formal relationship with you. Your receipt of this document does not create any kind of agent-client relationship. Please seek the advice of a suitably qualified legal professional licensed to practice in your jurisdiction before using this document.\n\nNo warranties and disclaimer of any damages. This information is provided ‘as is‘, and this site makes no warranties on the information provided. Any damages resulting from its use are disclaimed.\n\nPlain language summary\nA plain language summary of the Open Database License is available.\n\nAlternative formats:\nPlain Text\n\nODC Open Database License (ODbL)\nPreamble\nThe Open Database License (ODbL) is a license agreement intended to\nallow users to freely share, modify, and use this Database while\nmaintaining this same freedom for others. Many databases are covered by\ncopyright, and therefore this document licenses these rights. Some\njurisdictions, mainly in the European Union, have specific rights that\ncover databases, and so the ODbL addresses these rights, too. Finally,\nthe ODbL is also an agreement in contract for users of this Database to\nact in certain ways in return for accessing this Database.\n\nDatabases can contain a wide variety of types of content (images,\naudiovisual material, and sounds all in the same database, for example),\nand so the ODbL only governs the rights over the Database, and not the\ncontents of the Database individually. Licensors should use the ODbL\ntogether with another license for the contents, if the contents have a\nsingle set of rights that uniformly covers all of the contents. If the\ncontents have multiple sets of different rights, Licensors should\ndescribe what rights govern what contents together in the individual\nrecord or in some other way that clarifies what rights apply.\n\nSometimes the contents of a database, or the database itself, can be\ncovered by other rights not addressed here (such as private contracts,\ntrade mark over the name, or privacy rights / data protection rights\nover information in the contents), and so you are advised that you may\nhave to consult other documents or clear other rights before doing\nactivities not covered by this License.\n\nThe Licensor (as defined below)\n\nand\n\nYou (as defined below)\n\nagree as follows:\n\n1.0 Definitions of Capitalised Words\n“Collective Database” – Means this Database in unmodified form as part\nof a collection of independent databases in themselves that together are\nassembled into a collective whole. A work that constitutes a Collective\nDatabase will not be considered a Derivative Database.\n\n“Convey” – As a verb, means Using the Database, a Derivative Database,\nor the Database as part of a Collective Database in any way that enables\na Person to make or receive copies of the Database or a Derivative\nDatabase. Conveying does not include interaction with a user through a\ncomputer network, or creating and Using a Produced Work, where no\ntransfer of a copy of the Database or a Derivative Database occurs.\n“Contents” – The contents of this Database, which includes the\ninformation, independent works, or other material collected into the\nDatabase. For example, the contents of the Database could be factual\ndata or works such as images, audiovisual material, text, or sounds.\n\n“Database” – A collection of material (the Contents) arranged in a\nsystematic or methodical way and individually accessible by electronic\nor other means offered under the terms of this License.\n\n“Database Directive” – Means Directive 96/9/EC of the European\nParliament and of the Council of 11 March 1996 on the legal protection\nof databases, as amended or succeeded.\n\n“Database Right” – Means rights resulting from the Chapter III (“sui\ngeneris”) rights in the Database Directive (as amended and as transposed\nby member states), which includes the Extraction and Re-utilisation of\nthe whole or a Substantial part of the Contents, as well as any similar\nrights available in the relevant jurisdiction under Section 10.4.\n\n“Derivative Database” – Means a database based upon the Database, and\nincludes any translation, adaptation, arrangement, modification, or any\nother alteration of the Database or of a Substantial part of the\nContents. This includes, but is not limited to, Extracting or\nRe-utilising the whole or a Substantial part of the Contents in a new\nDatabase.\n\n“Extraction” – Means the permanent or temporary transfer of all or a\nSubstantial part of the Contents to another medium by any means or in\nany form.\n\n“License” – Means this license agreement and is both a license of rights\nsuch as copyright and Database Rights and an agreement in contract.\n\n“Licensor” – Means the Person that offers the Database under the terms\nof this License.\n\n“Person” – Means a natural or legal person or a body of persons\ncorporate or incorporate.\n\n“Produced Work” – a work (such as an image, audiovisual material, text,\nor sounds) resulting from using the whole or a Substantial part of the\nContents (via a search or other query) from this Database, a Derivative\nDatabase, or this Database as part of a Collective Database.\n\n“Publicly” – means to Persons other than You or under Your control by\neither more than 50% ownership or by the power to direct their\nactivities (such as contracting with an independent consultant).\n\n“Re-utilisation” – means any form of making available to the public all\nor a Substantial part of the Contents by the distribution of copies, by\nrenting, by online or other forms of transmission.\n\n“Substantial” – Means substantial in terms of quantity or quality or a\ncombination of both. The repeated and systematic Extraction or\nRe-utilisation of insubstantial parts of the Contents may amount to the\nExtraction or Re-utilisation of a Substantial part of the Contents.\n\n“Use” – As a verb, means doing any act that is restricted by copyright\nor Database Rights whether in the original medium or any other; and\nincludes without limitation distributing, copying, publicly performing,\npublicly displaying, and preparing derivative works of the Database, as\nwell as modifying the Database as may be technically necessary to use it\nin a different mode or format.\n\n“You” – Means a Person exercising rights under this License who has not\npreviously violated the terms of this License with respect to the\nDatabase, or who has received express permission from the Licensor to\nexercise rights under this License despite a previous violation.\n\nWords in the singular include the plural and vice versa.\n\n2.0 What this License covers\n2.1. Legal effect of this document. This License is:\n\n      a. A license of applicable copyright and neighbouring rights;\n\n      b. A license of the Database Right; and\n\n      c. An agreement in contract between You and the Licensor.\n\n2.2 Legal rights covered. This License covers the legal rights in the\nDatabase, including:\n\n      a. Copyright. Any copyright or neighbouring rights in the Database.\nThe copyright licensed includes any individual elements of the\nDatabase, but does not cover the copyright over the Contents\nindependent of this Database. See Section 2.4 for details. Copyright\nlaw varies between jurisdictions, but is likely to cover: the Database\nmodel or schema, which is the structure, arrangement, and organisation\nof the Database, and can also include the Database tables and table\nindexes; the data entry and output sheets; and the Field names of\nContents stored in the Database;\n\n      b. Database Rights. Database Rights only extend to the Extraction and\nRe-utilisation of the whole or a Substantial part of the Contents.\nDatabase Rights can apply even when there is no copyright over the\n      Database. Database Rights can also apply when the Contents are removed\nfrom the Database and are selected and arranged in a way that would\nnot infringe any applicable copyright; and\n\n      c. Contract. This is an agreement between You and the Licensor for\naccess to the Database. In return you agree to certain conditions of\nuse on this access as outlined in this License.\n\n2.3 Rights not covered.\n\n      a. This License does not apply to computer programs used in the making\nor operation of the Database;\n\n      b. This License does not cover any patents over the Contents or the\nDatabase; and\n\n      c. This License does not cover any trademarks associated with the\n      Database.\n\n2.4 Relationship to Contents in the Database. The individual items of\nthe Contents contained in this Database may be covered by other rights,\nincluding copyright, patent, data protection, privacy, or personality\nrights, and this License does not cover any rights (other than Database\nRights or in contract) in individual Contents contained in the Database.\nFor example, if used on a Database of images (the Contents), this\nLicense would not apply to copyright over individual images, which could\nhave their own separate licenses, or one single license covering all of\nthe rights over the images.\n\n3.0 Rights granted\n3.1 Subject to the terms and conditions of this License, the Licensor\ngrants to You a worldwide, royalty-free, non-exclusive, terminable (but\nonly under Section 9) license to Use the Database for the duration of\nany applicable copyright and Database Rights. These rights explicitly\ninclude commercial use, and do not exclude any field of endeavour. To\nthe extent possible in the relevant jurisdiction, these rights may be\nexercised in all media and formats whether now known or created in the\nfuture.\n\nThe rights granted cover, for example:\n\n      a. Extraction and Re-utilisation of the whole or a Substantial part of\nthe Contents;\n\n      b. Creation of Derivative Databases;\n\n      c. Creation of Collective Databases;\n\n      d. Creation of temporary or permanent reproductions by any means and\nin any form, in whole or in part, including of any Derivative\nDatabases or as a part of Collective Databases; and\n\n      e. Distribution, communication, display, lending, making available, or\nperformance to the public by any means and in any form, in whole or in\npart, including of any Derivative Database or as a part of Collective\n      Databases.\n\n3.2 Compulsory license schemes. For the avoidance of doubt:\n\n      a. Non-waivable compulsory license schemes. In those jurisdictions in\nwhich the right to collect royalties through any statutory or\ncompulsory licensing scheme cannot be waived, the Licensor reserves\nthe exclusive right to collect such royalties for any exercise by You\nof the rights granted under this License;\n\n      b. Waivable compulsory license schemes. In those jurisdictions in\nwhich the right to collect royalties through any statutory or\ncompulsory licensing scheme can be waived, the Licensor waives the\nexclusive right to collect such royalties for any exercise by You of\nthe rights granted under this License; and,\n\n      c. Voluntary license schemes. The Licensor waives the right to collect\nroyalties, whether individually or, in the event that the Licensor is\na member of a collecting society that administers voluntary licensing\nschemes, via that society, from any exercise by You of the rights\ngranted under this License.\n\n3.3 The right to release the Database under different terms, or to stop\ndistributing or making available the Database, is reserved. Note that\nthis Database may be multiple-licensed, and so You may have the choice\nof using alternative licenses for this Database. Subject to Section\n10.4, all other rights not expressly granted by Licensor are reserved.\n\n4.0 Conditions of Use\n4.1 The rights granted in Section 3 above are expressly made subject to\nYour complying with the following conditions of use. These are important\nconditions of this License, and if You fail to follow them, You will be\nin material breach of its terms.\n\n4.2 Notices. If You Publicly Convey this Database, any Derivative\nDatabase, or the Database as part of a Collective Database, then You\nmust:\n\n      a. Do so only under the terms of this License or another license\npermitted under Section 4.4;\n\n      b. Include a copy of this License (or, as applicable, a license\npermitted under Section 4.4) or its Uniform Resource Identifier (URI)\nwith the Database or Derivative Database, including both in the\nDatabase or Derivative Database and in any relevant documentation; and\n\n      c. Keep intact any copyright or Database Right notices and notices\nthat refer to this License.\n\n      d. If it is not possible to put the required notices in a particular\nfile due to its structure, then You must include the notices in a\nlocation (such as a relevant directory) where users would be likely to\nlook for it.\n\n4.3 Notice for using output (Contents). Creating and Using a Produced\nWork does not require the notice in Section 4.2. However, if you\nPublicly Use a Produced Work, You must include a notice associated with\nthe Produced Work reasonably calculated to make any Person that uses,\nviews, accesses, interacts with, or is otherwise exposed to the Produced\nWork aware that Content was obtained from the Database, Derivative\nDatabase, or the Database as part of a Collective Database, and that it\nis available under this License.\n\n      a. Example notice. The following text will satisfy notice under\nSection 4.3:\n\n    Contains information from DATABASE NAME, which is made available\n    here under the Open Database License (ODbL).\nDATABASE NAME should be replaced with the name of the Database and a\nhyperlink to the URI of the Database. “Open Database License” should\ncontain a hyperlink to the URI of the text of this License. If\nhyperlinks are not possible, You should include the plain text of the\nrequired URI’s with the above notice.\n\n4.4 Share alike.\n\n      a. Any Derivative Database that You Publicly Use must be only under\nthe terms of:\n\n           i. This License;\n\n           ii. A later version of this License similar in spirit to this\nLicense; or\n\n           iii. A compatible license.\n\nIf You license the Derivative Database under one of the licenses\nmentioned in (iii), You must comply with the terms of that license.\n\n      b. For the avoidance of doubt, Extraction or Re-utilisation of the\nwhole or a Substantial part of the Contents into a new database is a\nDerivative Database and must comply with Section 4.4.\n\n      c. Derivative Databases and Produced Works. A Derivative Database is\nPublicly Used and so must comply with Section 4.4. if a Produced Work\ncreated from the Derivative Database is Publicly Used.\n\n      d. Share Alike and additional Contents. For the avoidance of doubt,\nYou must not add Contents to Derivative Databases under Section 4.4 a\nthat are incompatible with the rights granted under this License.\n\n      e. Compatible licenses. Licensors may authorise a proxy to determine\ncompatible licenses under Section 4.4 a iii. If they do so, the\nauthorised proxy’s public statement of acceptance of a compatible\nlicense grants You permission to use the compatible license.\n\n4.5 Limits of Share Alike. The requirements of Section 4.4 do not apply\nin the following:\n\n      a. For the avoidance of doubt, You are not required to license\nCollective Databases under this License if You incorporate this\nDatabase or a Derivative Database in the collection, but this License\nstill applies to this Database or a Derivative Database as a part of\nthe Collective Database;\n\n      b. Using this Database, a Derivative Database, or this Database as\npart of a Collective Database to create a Produced Work does not\ncreate a Derivative Database for purposes of Section 4.4; and\n\n      c. Use of a Derivative Database internally within an organisation is\nnot to the public and therefore does not fall under the requirements\nof Section 4.4.\n\n4.6 Access to Derivative Databases. If You Publicly Use a Derivative\nDatabase or a Produced Work from a Derivative Database, You must also\noffer to recipients of the Derivative Database or Produced Work a copy\nin a machine readable form of:\n\n      a. The entire Derivative Database; or\n\n      b. A file containing all of the alterations made to the Database or\nthe method of making the alterations to the Database (such as an\nalgorithm), including any additional Contents, that make up all the\ndifferences between the Database and the Derivative Database.\n\nThe Derivative Database (under a.) or alteration file (under b.) must be\navailable at no more than a reasonable production cost for physical\ndistributions and free of charge if distributed over the internet.\n\n4.7 Technological measures and additional terms\n\n      a. This License does not allow You to impose (except subject to\nSection 4.7 b.) any terms or any technological measures on the\nDatabase, a Derivative Database, or the whole or a Substantial part of\nthe Contents that alter or restrict the terms of this License, or any\nrights granted under it, or have the effect or intent of restricting\nthe ability of any person to exercise those rights.\n\n      b. Parallel distribution. You may impose terms or technological\nmeasures on the Database, a Derivative Database, or the whole or a\nSubstantial part of the Contents (a “Restricted Database”) in\ncontravention of Section 4.74 a. only if You also make a copy of the\nDatabase or a Derivative Database available to the recipient of the\nRestricted Database:\n\n           i. That is available without additional fee;\n\n           ii. That is available in a medium that does not alter or restrict\nthe terms of this License, or any rights granted under it, or have\nthe effect or intent of restricting the ability of any person to\nexercise those rights (an “Unrestricted Database”); and\n\n           iii. The Unrestricted Database is at least as accessible to the\nrecipient as a practical matter as the Restricted Database.\n\n      c. For the avoidance of doubt, You may place this Database or a\nDerivative Database in an authenticated environment, behind a\npassword, or within a similar access control scheme provided that You\ndo not alter or restrict the terms of this License or any rights\ngranted under it or have the effect or intent of restricting the\nability of any person to exercise those rights.\n\n4.8 Licensing of others. You may not sublicense the Database. Each time\nYou communicate the Database, the whole or Substantial part of the\nContents, or any Derivative Database to anyone else in any way, the\nLicensor offers to the recipient a license to the Database on the same\nterms and conditions as this License. You are not responsible for\nenforcing compliance by third parties with this License, but You may\nenforce any rights that You have over a Derivative Database. You are\nsolely responsible for any modifications of a Derivative Database made\nby You or another Person at Your direction. You may not impose any\nfurther restrictions on the exercise of the rights granted or affirmed\nunder this License.\n\n5.0 Moral rights\n5.1 Moral rights. This section covers moral rights, including any rights\nto be identified as the author of the Database or to object to treatment\nthat would otherwise prejudice the author’s honour and reputation, or\nany other derogatory treatment:\n\n      a. For jurisdictions allowing waiver of moral rights, Licensor waives\nall moral rights that Licensor may have in the Database to the fullest\nextent possible by the law of the relevant jurisdiction under Section\n      10.4;\n\n      b. If waiver of moral rights under Section 5.1 a in the relevant\njurisdiction is not possible, Licensor agrees not to assert any moral\nrights over the Database and waives all claims in moral rights to the\nfullest extent possible by the law of the relevant jurisdiction under\nSection 10.4; and\n\n      c. For jurisdictions not allowing waiver or an agreement not to assert\nmoral rights under Section 5.1 a and b, the author may retain their\nmoral rights over certain aspects of the Database.\n\nPlease note that some jurisdictions do not allow for the waiver of moral\nrights, and so moral rights may still subsist over the Database in some\njurisdictions.\n\n6.0 Fair dealing, Database exceptions, and other rights not affected\n6.1 This License does not affect any rights that You or anyone else may\nindependently have under any applicable law to make any use of this\nDatabase, including without limitation:\n\n      a. Exceptions to the Database Right including: Extraction of Contents\nfrom non-electronic Databases for private purposes, Extraction for\npurposes of illustration for teaching or scientific research, and\nExtraction or Re-utilisation for public security or an administrative\nor judicial procedure.\n\n      b. Fair dealing, fair use, or any other legally recognised limitation\nor exception to infringement of copyright or other applicable laws.\n\n6.2 This License does not affect any rights of lawful users to Extract\nand Re-utilise insubstantial parts of the Contents, evaluated\nquantitatively or qualitatively, for any purposes whatsoever, including\ncreating a Derivative Database (subject to other rights over the\nContents, see Section 2.4). The repeated and systematic Extraction or\nRe-utilisation of insubstantial parts of the Contents may however amount\nto the Extraction or Re-utilisation of a Substantial part of the\nContents.\n\n7.0 Warranties and Disclaimer\n7.1 The Database is licensed by the Licensor “as is” and without any\nwarranty of any kind, either express, implied, or arising by statute,\ncustom, course of dealing, or trade usage. Licensor specifically\ndisclaims any and all implied warranties or conditions of title,\nnon-infringement, accuracy or completeness, the presence or absence of\nerrors, fitness for a particular purpose, merchantability, or otherwise.\nSome jurisdictions do not allow the exclusion of implied warranties, so\nthis exclusion may not apply to You.\n\n8.0 Limitation of liability\n8.1 Subject to any liability that may not be excluded or limited by law,\nthe Licensor is not liable for, and expressly excludes, all liability\nfor loss or damage however and whenever caused to anyone by any use\nunder this License, whether by You or by anyone else, and whether caused\nby any fault on the part of the Licensor or not. This exclusion of\nliability includes, but is not limited to, any special, incidental,\nconsequential, punitive, or exemplary damages such as loss of revenue,\ndata, anticipated profits, and lost business. This exclusion applies\neven if the Licensor has been advised of the possibility of such\ndamages.\n\n8.2 If liability may not be excluded by law, it is limited to actual and\ndirect financial loss to the extent it is caused by proved negligence on\nthe part of the Licensor.\n\n9.0 Termination of Your rights under this License\n9.1 Any breach by You of the terms and conditions of this License\nautomatically terminates this License with immediate effect and without\nnotice to You. For the avoidance of doubt, Persons who have received the\nDatabase, the whole or a Substantial part of the Contents, Derivative\nDatabases, or the Database as part of a Collective Database from You\nunder this License will not have their licenses terminated provided\ntheir use is in full compliance with this License or a license granted\nunder Section 4.8 of this License. Sections 1, 2, 7, 8, 9 and 10 will\nsurvive any termination of this License.\n\n9.2 If You are not in breach of the terms of this License, the Licensor\nwill not terminate Your rights under it.\n\n9.3 Unless terminated under Section 9.1, this License is granted to You\nfor the duration of applicable rights in the Database.\n\n9.4 Reinstatement of rights. If you cease any breach of the terms and\nconditions of this License, then your full rights under this License\nwill be reinstated:\n\n      a. Provisionally and subject to permanent termination until the 60th\nday after cessation of breach;\n\n      b. Permanently on the 60th day after cessation of breach unless\notherwise reasonably notified by the Licensor; or\n\n      c. Permanently if reasonably notified by the Licensor of the\nviolation, this is the first time You have received notice of\nviolation of this License from the Licensor, and You cure the\nviolation prior to 30 days after your receipt of the notice.\n\nPersons subject to permanent termination of rights are not eligible to\nbe a recipient and receive a license under Section 4.8.\n\n9.5 Notwithstanding the above, Licensor reserves the right to release\nthe Database under different license terms or to stop distributing or\nmaking available the Database. Releasing the Database under different\nlicense terms or stopping the distribution of the Database will not\nwithdraw this License (or any other license that has been, or is\nrequired to be, granted under the terms of this License), and this\nLicense will continue in full force and effect unless terminated as\nstated above.\n\n10.0 General\n10.1 If any provision of this License is held to be invalid or\nunenforceable, that must not affect the validity or enforceability of\nthe remainder of the terms and conditions of this License and each\nremaining provision of this License shall be valid and enforced to the\nfullest extent permitted by law.\n\n10.2 This License is the entire agreement between the parties with\nrespect to the rights granted here over the Database. It replaces any\nearlier understandings, agreements or representations with respect to\nthe Database.\n\n10.3 If You are in breach of the terms of this License, You will not be\nentitled to rely on the terms of this License or to complain of any\nbreach by the Licensor.\n\n10.4 Choice of law. This License takes effect in and will be governed by\nthe laws of the relevant jurisdiction in which the License terms are\nsought to be enforced. If the standard suite of rights granted under\napplicable copyright law and Database Rights in the relevant\njurisdiction includes additional rights not granted under this License,\nthese additional rights are granted in this License in order to meet the\nterms of this License.\n"
  },
  {
    "path": "devtools/translit/generate.py",
    "content": "#!/usr/bin/env python3\n\n# This script generates a Unicode character transliteration\n# table into sequences of individual characters.\n\n# For each Unicode character from decimal value 128 to 0xffff,\n# its transliteration is obtained using the `unidecode` library.\n\nfrom unidecode import unidecode\n\ndef unicode_table():\n    chars = []\n    mapChar = []\n    elementCnt = 0\n    pos = 0\n    for i in range(128, 0xffff):\n        try:\n            char = chr(i)\n            charU = unidecode(char)\n            if charU != \"\" :\n               charField = []\n               for element in charU:\n                   charField.append(\"'\" + element.replace('\\\\', '\\\\\\\\').replace('\\'', '\\\\\\'').replace('\\\"', '\\\\\\\"') + \"'\")\n\n               stringlen = len(charU)\n               print (f\"{stringlen}, \" + \", \".join(charField) + \",\", end = \" \" )\n               elementCnt = elementCnt + 1\n               mapChar.append(pos);\n               pos = pos + stringlen + 1\n               if elementCnt % 6 == 0:\n                   print(\"\")\n            else :\n                mapChar.append(-1)\n        except ValueError:\n            mapChar.append(-1)\n    return mapChar\n\nprint ('const char Data::translitTab[] = {')\nl = unicode_table()\nprint ('};')\n\nprint('const int Data::tranlitIndexMap[] = {')\ncount = 0\nfor charMap in l:\n    print(f\"{charMap}, \", end = \"\")\n    count = count + 1;\n    if count % 10 == 0:\n        print(\"\")\nprint('};')\n"
  },
  {
    "path": "devtools/windowsMake/make.bat",
    "content": "@echo off\r\nsetlocal EnableExtensions EnableDelayedExpansion\r\n\r\nrem ============================================================\r\nrem  Build + Make script for QLog (MSVC + Qt)\r\nrem  Usage:\r\nrem    %~nx0              -> release\r\nrem    %~nx0 release      -> release\r\nrem    %~nx0 clean        -> clean release\r\nrem    %~nx0 rebuild      -> clean + release\r\nrem    %~nx0 deploy       -> windeployqt + binarycreator\r\nrem    %~nx0 all          -> rebuild + deploy\r\nrem ============================================================\r\nrem ============================================================\r\nrem - The script is executed in cmd.exe on Windows.\r\nrem - The Visual Studio environment init batch (VS_VCVARS) must exist.\r\nrem   - It must support the selected target (VS_ARCH), e.g. x86_amd64 for x64 builds.\r\nrem - The Qt MSVC kit root (QT_BASE) must exist and contain:\r\nrem   - %QT_BASE%\\bin\\qmake.exe\r\nrem   - %QT_BASE%\\bin\\windeployqt.exe\r\nrem - The jom executable (JOM) must exist (used for qmake_all and Makefile.Release).\r\nrem - The Qt Installer Framework bin directory (QTIFW_BIN) must exist and contain:\r\nrem   - binarycreator.exe\r\nrem - The QMake project file (PRO) must exist and be readable.\r\nrem - The working/build directory must be writable (Makefile.Release will be generated).\r\nrem\r\nrem - Hamlib must be present under %DEVROOT%\\hamlib-w64-%HAMLIBVERSION% derived from HAMLIBVERSION:\r\nrem   - Expected headers:   %HAMLIBROOT%\\include\\\r\nrem   - Expected libraries: %HAMLIBROOT%\\lib\\msvc\\\r\nrem\r\nrem - vcpkg packages root (VCPKG_PACKAGES) must exist and contain required packages:\r\nrem   - %VCPKG_PACKAGES%\\%QTKEYCHAIN_PKG%\\include  and  ...\\lib\r\nrem   - %VCPKG_PACKAGES%\\%PTHREAD_PKG%\\include     and  ...\\lib\r\nrem   - %VCPKG_PACKAGES%\\%ZLIB_PKG%\\include        and  ...\\lib\r\nrem\r\nrem ============================================================\r\n\r\nset \"ROOT=%~dp0\"\r\n\r\nif \"%ROOT:~-1%\"==\"\\\" set \"ROOT=%ROOT:~0,-1%\"\r\nfor %%I in (\"%ROOT%\\..\\..\\..\") do set \"DEVROOT=%%~fI\"\r\n\r\nrem === CONFIGURATION ===\r\n\r\nrem -- VC Compiler Settings\r\nset \"VS_VCVARS=C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\"\r\n\r\nrem -- QT Settings\r\nset \"QT_BASE=C:\\Qt\\6.10.2\\msvc2022_64\"\r\nset \"QTIFW_BIN=C:\\Qt\\Tools\\QtInstallerFramework\\4.6\\bin\"\r\nset \"JOM=C:\\Qt\\Tools\\QtCreator\\bin\\jom\\jom.exe\"\r\n\r\nrem -- Project Settings\r\nset \"PROJECT_BASE=%DEVROOT%\\QLog\"\r\nfor /f \"tokens=3\" %%V in ('findstr /R /C:\"^VERSION *= *\" \"%PROJECT_BASE%\\QLog.pro\"') do set \"QLOG_VERSION=%%V\"\r\nset \"INSTALLER_BASE=%DEVROOT%\\qlog_build\\qlog-installer-%QLOG_VERSION%\"\r\nset \"INSTALLER_SEQ=0\"\r\nif exist \"%INSTALLER_BASE%.exe\" (\r\n  :seq_loop\r\n  set /a INSTALLER_SEQ+=1\r\n  if exist \"%INSTALLER_BASE%-!INSTALLER_SEQ!.exe\" goto :seq_loop\r\n)\r\nif %INSTALLER_SEQ%==0 (\r\n  set \"INSTALLER_OUT=%INSTALLER_BASE%.exe\"\r\n) else (\r\n  set \"INSTALLER_OUT=%INSTALLER_BASE%-!INSTALLER_SEQ!.exe\"\r\n)\r\n\r\nrem -- Libs Settings\r\nset \"VCPKG_PACKAGES=%DEVROOT%\\vcpkg\\packages\"\r\nset \"VCPKG_QTKEYCHAIN_PKG=qtkeychain-qt6_x64-windows\"\r\nset \"VCPKG_PTHREAD_PKG=pthreads_x64-windows\"\r\nset \"VCPKG_ZLIB_PKG=zlib_x64-windows\"\r\n\r\nrem -- Hamlib Settings\r\nset \"HAMLIBVERSION_MAJOR=4\"\r\nset \"HAMLIBVERSION_MINOR=7\"\r\nset \"HAMLIBVERSION_PATCH=0\"\r\n\r\nrem === END OF CONFIGURATION ===\r\n\r\nset \"VS_ARCH=x86_amd64\"\r\n\r\nset \"QMAKE=%QT_BASE%\\bin\\qmake.exe\"\r\nset \"WINDEPLOYQT=%QT_BASE%\\bin\\windeployqt.exe\"\r\nset \"BINARYCREATOR=%QTIFW_BIN%\\binarycreator.exe\"\r\n\r\nset \"PRO=%PROJECT_BASE%\\QLog.pro\"\r\nset \"BUILDROOT=%PROJECT_BASE%\\build\\deployment\"\r\n\r\nset \"HAMLIBVERSION=%HAMLIBVERSION_MAJOR%.%HAMLIBVERSION_MINOR%.%HAMLIBVERSION_PATCH%\"\r\nset \"HAMLIBROOT=%DEVROOT%\\hamlib-w64-%HAMLIBVERSION%\"\r\nset \"HAMLIBINCLUDEPATH=%HAMLIBROOT%\\include\"\r\nset \"HAMLIBLIBPATH=%HAMLIBROOT%\\lib\\msvc\"\r\nset \"HAMLIBBINPATH=%HAMLIBROOT%\\bin\"\r\n\r\nset \"QTKEYCHAININCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\include\"\r\nset \"QTKEYCHAINLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\lib\"\r\nset \"QTKEYCHAINBINPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\bin\"\r\n\r\nset \"PTHREADINCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_PTHREAD_PKG%\\include\"\r\nset \"PTHREADLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_PTHREAD_PKG%\\lib\"\r\n\r\nset \"ZLIBINCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\include\"\r\nset \"ZLIBLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\lib\"\r\nset \"ZLIBBINPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\bin\"\r\n\r\n\r\nset \"DEPLOY_DIR=%BUILDROOT%\\installer\\packages\\de.dl2ic.qlog\\data\"\r\nset \"INSTALLER_CONFIG=%BUILDROOT%\\installer\\config\\config.xml\"\r\nset \"INSTALLER_PACKAGES=%BUILDROOT%\\installer\\packages\"\r\n\r\nset \"OPENSSLROOT=%DEVROOT%\\openssl-3.0\\x64\"\r\n\r\nrem === Action ===\r\n\r\nset \"ACTION=%~1\"\r\nif /I \"%ACTION%\"==\"\" set \"ACTION=release\"\r\nif not exist \"%BUILDROOT%\" mkdir \"%BUILDROOT%\"\r\npushd \"%BUILDROOT%\" >nul\r\n\r\nrem === Initialize MSVC environment ===\r\necho === Initializing MSVC environment (%VS_ARCH%) ===\r\ncall \"%VS_VCVARS%\" %VS_ARCH%\r\nif errorlevel 1 goto :fail\r\n\r\nif /I \"%ACTION%\"==\"clean\"   goto :clean\r\nif /I \"%ACTION%\"==\"rebuild\" goto :rebuild\r\nif /I \"%ACTION%\"==\"release\" goto :release\r\nif /I \"%ACTION%\"==\"deploy\"  goto :deploy\r\nif /I \"%ACTION%\"==\"all\"     goto :all\r\n\r\necho Unknown action: %ACTION%\r\necho Usage: %~nx0 [release^|clean^|rebuild^|deploy^|all]\r\ngoto :fail\r\n\r\nrem ============================================================\r\nrem  BUILD STEPS\r\nrem ============================================================\r\n:qmake\r\necho === Running qmake ===\r\n\"%QMAKE%\" \"%PRO%\" -spec win32-msvc ^\r\n  \"CONFIG+=qtquickcompiler\" ^\r\n  \"HAMLIBINCLUDEPATH=%HAMLIBINCLUDEPATH%\" ^\r\n  \"HAMLIBLIBPATH=%HAMLIBLIBPATH%\" ^\r\n  \"HAMLIBVERSION_MAJOR=%HAMLIBVERSION_MAJOR%\" ^\r\n  \"HAMLIBVERSION_MINOR=%HAMLIBVERSION_MINOR%\" ^\r\n  \"HAMLIBVERSION_PATCH=%HAMLIBVERSION_PATCH%\" ^\r\n  \"QTKEYCHAININCLUDEPATH=%QTKEYCHAININCLUDEPATH%\" ^\r\n  \"QTKEYCHAINLIBPATH=%QTKEYCHAINLIBPATH%\" ^\r\n  \"PTHREADINCLUDEPATH=%PTHREADINCLUDEPATH%\" ^\r\n  \"PTHREADLIBPATH=%PTHREADLIBPATH%\" ^\r\n  \"ZLIBINCLUDEPATH=%ZLIBINCLUDEPATH%\" ^\r\n  \"ZLIBLIBPATH=%ZLIBLIBPATH%\" ^\r\n  \"OPENSSLINCLUDEPATH=%OPENSSLROOT%/include\" ^\r\n  \"OPENSSLLIBPATH=%OPENSSLROOT%/lib\"\r\n\r\nif errorlevel 1 exit /b 10\r\n\r\necho === jom qmake_all ===\r\n\"%JOM%\" qmake_all\r\nif errorlevel 1 exit /b 11\r\nexit /b 0\r\n\r\n:clean\r\ncall :qmake\r\nif errorlevel 1 goto :fail\r\n\r\necho === Cleaning (Makefile.Release) ===\r\n\"%JOM%\" -f Makefile.Release clean\r\nif errorlevel 1 goto :fail\r\n\r\ndel /F /Q \"%BUILDROOT%\\release\\qlog.exe\" >nul\r\nrmdir /S /Q \"%BUILDROOT%\\installer\" >nul\r\ngoto :ok\r\n\r\n:release\r\ncall :qmake\r\nif errorlevel 1 goto :fail\r\n\r\necho === Building Release (Makefile.Release) ===\r\n\"%JOM%\" -f Makefile.Release\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\n:rebuild\r\ncall :qmake\r\nif errorlevel 1 goto :fail\r\n\r\necho === Cleaning (Makefile.Release) ===\r\n\"%JOM%\" -f Makefile.Release clean\r\nif errorlevel 1 goto :fail\r\n\r\necho === Building Release (Makefile.Release) ===\r\n\"%JOM%\" -f Makefile.Release\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\nrem ============================================================\r\nrem  DEPLOYMENT STEPS\r\nrem ============================================================\r\n:deploy\r\necho === Deployment ===\r\n\r\nrem Ensure tools are reachable (only for this process)\r\nset \"PATH=%QT_BASE%\\bin;%QTIFW_BIN%;%PATH%\"\r\n\r\nif not exist \"%BUILDROOT%\\release\\qlog.exe\" (\r\n  echo ERROR: \"%BUILDROOT%\\release\\qlog.exe\" not found.\r\n  echo Check DEPLOY_DIR: \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrobocopy \"%PROJECT_BASE%\\installer\" \"%BUILDROOT%\\installer\" /MIR\r\nif errorlevel 8 (\r\n  echo ERROR: Cannot ROBOCOPY installer\r\n  goto :fail\r\n)\r\n\r\nmkdir \"%DEPLOY_DIR%\"\r\n\r\nrem  *****************\r\nrem  Copy QLog Binary\r\nrem  *****************\r\ncopy /Y \"%BUILDROOT%\\release\\qlog.exe\" \"%DEPLOY_DIR%\\qlog.exe\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy qlog.exe to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrem  ***********\r\nrem  Copy Hamlib\r\nrem  ***********\r\ncopy /Y \"%HAMLIBBINPATH%\\*.dll\" \"%DEPLOY_DIR%\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy Hamlib DLL to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\ncopy /Y \"%HAMLIBBINPATH%\\rigctld.exe\" \"%DEPLOY_DIR%\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy rigctld.exe to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrem  ****************\r\nrem  Copy QtKeychain\r\nrem  ****************\r\ncopy /Y \"%QTKEYCHAINBINPATH%\\*.dll\" \"%DEPLOY_DIR%\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy QTKeychain DLL to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrem  ****************\r\nrem  Copy zlib\r\nrem  ****************\r\ncopy /Y \"%ZLIBBINPATH%\\*.dll\" \"%DEPLOY_DIR%\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy zlib DLL to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrem  ****************\r\nrem  Copy OpenSSL\r\nrem  ****************\r\ncopy /Y \"%OPENSSLROOT%\\bin\\*.dll\" \"%DEPLOY_DIR%\"\r\n\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot copy OpenSSL DLL to \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\nrem  ****************\r\nrem  Deploy\r\nrem  ****************\r\npushd \"%DEPLOY_DIR%\" >nul\r\nif errorlevel 1 (\r\n  echo ERROR: Cannot enter DEPLOY_DIR: \"%DEPLOY_DIR%\"\r\n  goto :fail\r\n)\r\n\r\necho --- windeployqt (release) ---\r\n\"%WINDEPLOYQT%\" -release --openssl-root \"%OPENSSLROOT%\" --skip-plugin-types qmltooling,position,qml,qsqlpsql,qsqlodbc,qsqlmimer \"qlog.exe\"\r\nif errorlevel 1 (\r\n  popd >nul\r\n  goto :fail\r\n)\r\npopd >nul\r\n\r\nif not exist \"%BINARYCREATOR%\" (\r\n  echo ERROR: binarycreator.exe not found: \"%BINARYCREATOR%\"\r\n  goto :fail\r\n)\r\n\r\necho --- binarycreator ---\r\n\"%BINARYCREATOR%\" -f -c \"%INSTALLER_CONFIG%\" -p \"%INSTALLER_PACKAGES%\" \"%INSTALLER_OUT%\"\r\nif errorlevel 1 goto :fail\r\n\r\ngoto :ok\r\n\r\n:all\r\ncall :rebuild\r\nif errorlevel 1 goto :fail\r\ncall :deploy\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\nrem ============================================================\r\nrem  END\r\nrem ============================================================\r\n:ok\r\npopd >nul\r\nendlocal\r\nexit /b 0\r\n\r\n:fail\r\nset \"EC=%errorlevel%\"\r\nif \"%EC%\"==\"0\" set \"EC=1\"\r\necho.\r\necho FAILED with errorlevel %EC%\r\npopd >nul\r\nendlocal\r\nexit /b %EC%\r\n"
  },
  {
    "path": "devtools/windowsMake/tests.bat",
    "content": "@echo off\r\nsetlocal EnableExtensions EnableDelayedExpansion\r\n\r\nrem ============================================================\r\nrem  Build + Run all unit tests for QLog (MSVC + Qt)\r\nrem  Usage:\r\nrem    %~nx0              -> build (release) + run\r\nrem    %~nx0 all          -> build (release) + run\r\nrem    %~nx0 build        -> build only (release)\r\nrem    %~nx0 run          -> run existing binaries\r\nrem    %~nx0 clean        -> clean build directory\r\nrem    %~nx0 rebuild      -> clean + build + run\r\nrem ============================================================\r\nrem  Notes:\r\nrem  - This script is executed in cmd.exe on Windows.\r\nrem  - It expects MSVC environment init batch (VS_VCVARS) and Qt qmake.\r\nrem  - QTKEYCHAIN/HAMLIB/ZLIB paths are passed through like in make.bat.\r\nrem ============================================================\r\n\r\nset \"ROOT=%~dp0\"\r\nif \"%ROOT:~-1%\"==\"\\\" set \"ROOT=%ROOT:~0,-1%\"\r\nfor %%I in (\"%ROOT%\\..\\..\\..\") do set \"DEVROOT=%%~fI\"\r\n\r\nrem === CONFIGURATION (keep in sync with make.bat) ===\r\n\r\nrem -- VC Compiler Settings\r\nset \"VS_VCVARS=C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Auxiliary\\Build\\vcvarsall.bat\"\r\nset \"VS_ARCH=x86_amd64\"\r\n\r\nrem -- QT Settings\r\nset \"QT_BASE=C:\\Qt\\6.10.2\\msvc2022_64\"\r\nset \"JOM=C:\\Qt\\Tools\\QtCreator\\bin\\jom\\jom.exe\"\r\n\r\nrem -- Project Settings\r\nset \"PROJECT_BASE=%DEVROOT%\\QLog\"\r\nset \"PRO=%PROJECT_BASE%\\tests\\tests.pro\"\r\nset \"BUILDROOT=%PROJECT_BASE%\\build\\tests\"\r\n\r\nrem -- Libs Settings\r\nset \"VCPKG_PACKAGES=%DEVROOT%\\vcpkg\\packages\"\r\nset \"VCPKG_QTKEYCHAIN_PKG=qtkeychain-qt6_x64-windows\"\r\nset \"VCPKG_PTHREAD_PKG=pthreads_x64-windows\"\r\nset \"VCPKG_ZLIB_PKG=zlib_x64-windows\"\r\n\r\nrem -- Hamlib Settings\r\nset \"HAMLIBVERSION_MAJOR=4\"\r\nset \"HAMLIBVERSION_MINOR=7\"\r\nset \"HAMLIBVERSION_PATCH=0\"\r\n\r\nrem -- OpenSSL (needed at runtime for some configurations)\r\nset \"OPENSSLROOT=%DEVROOT%\\openssl-3.0\\x64\"\r\n\r\nrem === END OF CONFIGURATION ===\r\n\r\nset \"QMAKE=%QT_BASE%\\bin\\qmake.exe\"\r\n\r\nset \"HAMLIBVERSION=%HAMLIBVERSION_MAJOR%.%HAMLIBVERSION_MINOR%.%HAMLIBVERSION_PATCH%\"\r\nset \"HAMLIBROOT=%DEVROOT%\\hamlib-w64-%HAMLIBVERSION%\"\r\nset \"HAMLIBINCLUDEPATH=%HAMLIBROOT%\\include\"\r\nset \"HAMLIBLIBPATH=%HAMLIBROOT%\\lib\\msvc\"\r\nset \"HAMLIBBINPATH=%HAMLIBROOT%\\bin\"\r\n\r\nset \"QTKEYCHAININCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\include\"\r\nset \"QTKEYCHAINLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\lib\"\r\nset \"QTKEYCHAINBINPATH=%VCPKG_PACKAGES%\\%VCPKG_QTKEYCHAIN_PKG%\\bin\"\r\n\r\nset \"PTHREADINCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_PTHREAD_PKG%\\include\"\r\nset \"PTHREADLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_PTHREAD_PKG%\\lib\"\r\n\r\nset \"ZLIBINCLUDEPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\include\"\r\nset \"ZLIBLIBPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\lib\"\r\nset \"ZLIBBINPATH=%VCPKG_PACKAGES%\\%VCPKG_ZLIB_PKG%\\bin\"\r\n\r\nset \"ACTION=%~1\"\r\nif /I \"%ACTION%\"==\"\" set \"ACTION=all\"\r\n\r\nif not exist \"%PRO%\" (\r\n  echo ERROR: tests project not found: \"%PRO%\"\r\n  goto :fail\r\n)\r\n\r\nif not exist \"%BUILDROOT%\" mkdir \"%BUILDROOT%\"\r\npushd \"%BUILDROOT%\" >nul\r\n\r\necho === Initializing MSVC environment (%VS_ARCH%) ===\r\ncall \"%VS_VCVARS%\" %VS_ARCH%\r\nif errorlevel 1 goto :fail\r\n\r\nif exist \"%JOM%\" (\r\n  set \"MAKE=%JOM%\"\r\n) else (\r\n  set \"MAKE=nmake\"\r\n)\r\n\r\nif /I \"%ACTION%\"==\"clean\"   goto :action_clean\r\nif /I \"%ACTION%\"==\"build\"   goto :action_build\r\nif /I \"%ACTION%\"==\"run\"     goto :action_run\r\nif /I \"%ACTION%\"==\"rebuild\" goto :action_rebuild\r\nif /I \"%ACTION%\"==\"all\"     goto :action_all\r\n\r\necho Unknown action: %ACTION%\r\necho Usage: %~nx0 [all^|build^|run^|clean^|rebuild]\r\ngoto :fail\r\n\r\n:qmake\r\necho === Running qmake (tests, release) ===\r\n\"%QMAKE%\" \"%PRO%\" -spec win32-msvc ^\r\n  \"CONFIG+=release\" ^\r\n  \"CONFIG-=debug_and_release\" ^\r\n  \"HAMLIBINCLUDEPATH=%HAMLIBINCLUDEPATH%\" ^\r\n  \"HAMLIBLIBPATH=%HAMLIBLIBPATH%\" ^\r\n  \"HAMLIBVERSION_MAJOR=%HAMLIBVERSION_MAJOR%\" ^\r\n  \"HAMLIBVERSION_MINOR=%HAMLIBVERSION_MINOR%\" ^\r\n  \"HAMLIBVERSION_PATCH=%HAMLIBVERSION_PATCH%\" ^\r\n  \"QTKEYCHAININCLUDEPATH=%QTKEYCHAININCLUDEPATH%\" ^\r\n  \"QTKEYCHAINLIBPATH=%QTKEYCHAINLIBPATH%\" ^\r\n  \"PTHREADINCLUDEPATH=%PTHREADINCLUDEPATH%\" ^\r\n  \"PTHREADLIBPATH=%PTHREADLIBPATH%\" ^\r\n  \"ZLIBINCLUDEPATH=%ZLIBINCLUDEPATH%\" ^\r\n  \"ZLIBLIBPATH=%ZLIBLIBPATH%\" ^\r\n  \"OPENSSLINCLUDEPATH=%OPENSSLROOT%/include\" ^\r\n  \"OPENSSLLIBPATH=%OPENSSLROOT%/lib\"\r\n\r\nif errorlevel 1 exit /b 10\r\nexit /b 0\r\n\r\n:doBuild\r\ncall :qmake\r\nif errorlevel 1 exit /b 11\r\n\r\necho === Building tests ===\r\n\"%MAKE%\"\r\nif errorlevel 1 exit /b 12\r\nexit /b 0\r\n\r\n:doRun\r\necho === Running tests ===\r\nset \"PATH=%QT_BASE%\\bin;%QTKEYCHAINBINPATH%;%HAMLIBBINPATH%;%ZLIBBINPATH%;%OPENSSLROOT%\\bin;%PATH%\"\r\n\r\nset \"FAILED=0\"\r\nset \"COUNT=0\"\r\nfor /r \"%BUILDROOT%\" %%F in (tst_*.exe) do (\r\n  set /a COUNT+=1\r\n  echo --- %%~nxF ---\r\n  \"%%F\"\r\n  if errorlevel 1 (\r\n    echo FAILED: %%~nxF\r\n    set \"FAILED=1\"\r\n    goto :run_done\r\n  )\r\n)\r\n\r\n:run_done\r\nif \"%COUNT%\"==\"0\" (\r\n  echo ERROR: No test executables found under \"%BUILDROOT%\".\r\n  exit /b 21\r\n)\r\nif \"%FAILED%\"==\"1\" exit /b 20\r\nexit /b 0\r\n\r\n:action_clean\r\necho === Cleaning build directory ===\r\nif exist \"%BUILDROOT%\\Makefile\" (\r\n  \"%MAKE%\" clean\r\n)\r\npopd >nul\r\nrmdir /S /Q \"%BUILDROOT%\" >nul 2>&1\r\nendlocal\r\nexit /b 0\r\n\r\n:action_build\r\ncall :doBuild\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\n:action_run\r\ncall :doRun\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\n:action_rebuild\r\necho === Rebuild ===\r\nif exist \"%BUILDROOT%\\Makefile\" (\r\n  \"%MAKE%\" clean\r\n)\r\ncall :doBuild\r\nif errorlevel 1 goto :fail\r\ncall :doRun\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\n:action_all\r\ncall :doBuild\r\nif errorlevel 1 goto :fail\r\ncall :doRun\r\nif errorlevel 1 goto :fail\r\ngoto :ok\r\n\r\n:ok\r\npopd >nul\r\nendlocal\r\nexit /b 0\r\n\r\n:fail\r\nset \"EC=%errorlevel%\"\r\nif \"%EC%\"==\"0\" set \"EC=1\"\r\necho.\r\necho FAILED with errorlevel %EC%\r\npopd >nul\r\nendlocal\r\nexit /b %EC%\r\n"
  },
  {
    "path": "doc/UDP_Notifications.txt",
    "content": "see details https://github.com/foldynl/QLog/wiki/Notifications\n"
  },
  {
    "path": "entitlements.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n<key>com.apple.security.cs.allow-unsigned-executable-memory</key><true/>\n<key>com.apple.security.cs.disable-library-validation</key><true/>\n<key>com.apple.security.cs.allow-jit</key><true/>\n<key>com.apple.security.cs.disable-executable-page-protection</key>\n<true/>\n</dict>\n</plist>\n"
  },
  {
    "path": "i18n/datastrings.tri",
    "content": "QT_TRANSLATE_NOOP(\"Data\", \"Aircraft Scatter\");\nQT_TRANSLATE_NOOP(\"Data\", \"Aurora-E\");\nQT_TRANSLATE_NOOP(\"Data\", \"Aurora\");\nQT_TRANSLATE_NOOP(\"Data\", \"Back scatter\");\nQT_TRANSLATE_NOOP(\"Data\", \"EchoLink\");\nQT_TRANSLATE_NOOP(\"Data\", \"Earth-Moon-Earth\");\nQT_TRANSLATE_NOOP(\"Data\", \"Sporadic E\");\nQT_TRANSLATE_NOOP(\"Data\", \"F2 Reflection\");\nQT_TRANSLATE_NOOP(\"Data\", \"Field Aligned Irregularities\");\nQT_TRANSLATE_NOOP(\"Data\", \"Ground Wave\");\nQT_TRANSLATE_NOOP(\"Data\", \"Internet-assisted\");\nQT_TRANSLATE_NOOP(\"Data\", \"Ionoscatter\");\nQT_TRANSLATE_NOOP(\"Data\", \"IRLP\");\nQT_TRANSLATE_NOOP(\"Data\", \"Line of Sight\");\nQT_TRANSLATE_NOOP(\"Data\", \"Meteor scatter\");\nQT_TRANSLATE_NOOP(\"Data\", \"Terrestrial or atmospheric repeater or transponder\");\nQT_TRANSLATE_NOOP(\"Data\", \"Rain scatter\");\nQT_TRANSLATE_NOOP(\"Data\", \"Satellite\");\nQT_TRANSLATE_NOOP(\"Data\", \"Trans-equatorial\");\nQT_TRANSLATE_NOOP(\"Data\", \"Tropospheric ducting\");\n"
  },
  {
    "path": "i18n/dbstrings.tri",
    "content": "QT_TRANSLATE_NOOP(\"DBStrings\", \"PHONE\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"CW\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"DIGITAL\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Afghanistan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Agalega & St. Brandon\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Aland Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Alaska\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Albania\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Algeria\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"American Samoa\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Amsterdam & St. Paul Is.\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Andaman & Nicobar Is.\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Andorra\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Angola\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Anguilla\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Annobon Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Antarctica\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Antigua & Barbuda\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Argentina\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Armenia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Aruba\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ascension Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Asiatic Russia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Asiatic Turkey\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Austral Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Australia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Austria\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Aves Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Azerbaijan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Azores\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bahamas\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bahrain\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Baker & Howland Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Balearic Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Banaba Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bangladesh\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Barbados\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Belarus\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Belgium\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Belize\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Benin\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bermuda\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bhutan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bolivia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bonaire\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bosnia-Herzegovina\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Botswana\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bouvet\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Brazil\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"British Virgin Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Brunei Darussalam\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Bulgaria\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Burkina Faso\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Burundi\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cambodia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cameroon\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Canada\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Canary Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cape Verde\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cayman Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Central African Republic\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Central Kiribati\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ceuta & Melilla\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Chad\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Chagos Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Chatham Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Chesterfield Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Chile\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"China\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Christmas Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Clipperton Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cocos (Keeling) Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cocos Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Colombia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Comoros\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Conway Reef\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Corsica\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Costa Rica\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cote d'Ivoire\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Crete\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Croatia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Crozet Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cuba\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Curacao\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Cyprus\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Czech Republic\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"DPR of Korea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Dem. Rep. of the Congo\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Denmark\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Desecheo Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Djibouti\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Dodecanese\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Dominica\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Dominican Republic\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ducie Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"East Malaysia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Easter Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Eastern Kiribati\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ecuador\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Egypt\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"El Salvador\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"England\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Equatorial Guinea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Eritrea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Estonia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ethiopia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"European Russia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Falkland Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Faroe Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Fed. Rep. of Germany\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Fernando de Noronha\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Fiji\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Finland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"France\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Franz Josef Land\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"French Guiana\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"French Polynesia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Gabon\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Galapagos Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Georgia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ghana\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Gibraltar\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Glorioso Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Greece\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Greenland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Grenada\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guadeloupe\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guam\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guantanamo Bay\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guatemala\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guernsey\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guinea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guinea-Bissau\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Guyana\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Haiti\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Hawaii\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Heard Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Honduras\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Hong Kong\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Hungary\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"ITU HQ\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Iceland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"India\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Indonesia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Iran\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Iraq\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ireland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Isle of Man\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Israel\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Italy\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Jamaica\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Jan Mayen\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Japan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Jersey\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Johnston Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Jordan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Juan Fernandez Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Juan de Nova & Europa\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kaliningrad\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kazakhstan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kenya\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kerguelen Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kermadec Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kingdom of Eswatini\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kure Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kuwait\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Kyrgyzstan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Lakshadweep Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Laos\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Latvia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Lebanon\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Lesotho\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Liberia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Libya\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Liechtenstein\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Lithuania\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Lord Howe Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Luxembourg\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Macao\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Macquarie Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Madagascar\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Madeira Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Malawi\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Maldives\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mali\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Malpelo Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Malta\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mariana Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Market Reef\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Marquesas Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Marshall Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Martinique\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mauritania\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mauritius\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mayotte\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mellish Reef\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mexico\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Micronesia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Midway Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Minami Torishima\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Moldova\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Monaco\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mongolia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Montenegro\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Montserrat\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Morocco\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mount Athos\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Mozambique\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Myanmar\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"N.Z. Subantarctic Is.\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Namibia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Nauru\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Navassa Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Nepal\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Netherlands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"New Caledonia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"New Zealand\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Nicaragua\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Niger\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Nigeria\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Niue\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Norfolk Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"North Cook Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"North Macedonia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Northern Ireland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Norway\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ogasawara\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Oman\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Pakistan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Palau\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Palestine\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Palmyra & Jarvis Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Panama\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Papua New Guinea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Paraguay\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Peru\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Peter 1 Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Philippines\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Pitcairn Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Poland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Portugal\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Pr. Edward & Marion Is.\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Pratas Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Puerto Rico\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Qatar\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Republic of Korea\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Republic of Kosovo\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Republic of South Sudan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Republic of the Congo\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Reunion Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Revillagigedo\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Rodriguez Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Romania\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Rotuma Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Rwanda\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Saba & St. Eustatius\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sable Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Samoa\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"San Andres & Providencia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"San Felix & San Ambrosio\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"San Marino\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sao Tome & Principe\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sardinia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Saudi Arabia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Scarborough Reef\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Scotland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Senegal\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Serbia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Seychelles\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sierra Leone\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Singapore\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sint Maarten\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Slovak Republic\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Slovenia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Solomon Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Somalia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Africa\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Cook Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Georgia Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Orkney Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Sandwich Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"South Shetland Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sov Mil Order of Malta\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Spain\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Spratly Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sri Lanka\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Barthelemy\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Helena\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Kitts & Nevis\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Lucia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Martin\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Paul Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Peter & St. Paul\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Pierre & Miquelon\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"St. Vincent\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sudan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Suriname\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Svalbard\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Swains Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Sweden\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Switzerland\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Syria\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Taiwan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tajikistan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tanzania\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Temotu Province\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Thailand\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"The Gambia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Timor - Leste\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Togo\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tokelau Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tonga\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Trindade & Martim Vaz\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Trinidad & Tobago\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tristan da Cunha & Gough Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tromelin Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tunisia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Turkmenistan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Turks & Caicos Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Tuvalu\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"UK Base Areas on Cyprus\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"US Virgin Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Uganda\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Ukraine\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"United Arab Emirates\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"United Nations HQ\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"United States\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Uruguay\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Uzbekistan\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Vanuatu\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Vatican City\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Venezuela\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Vietnam\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Wake Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Wales\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Wallis & Futuna Islands\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"West Malaysia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Western Kiribati\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Western Sahara\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Willis Island\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Yemen\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Zambia\");\nQT_TRANSLATE_NOOP(\"DBStrings\", \"Zimbabwe\");\n"
  },
  {
    "path": "i18n/i18n.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/i18n\">\n        <file>qlog_de.qm</file>\n        <file>qlog_cs.qm</file>\n        <file>qlog_zh_CN.qm</file>\n        <file>datastrings.tri</file>\n        <file>qlog_es.qm</file>\n        <file>qlog_fr.qm</file>\n        <file>qlog_it.qm</file>\n    </qresource>\n    <qresource prefix=\"/\"/>\n</RCC>\n"
  },
  {
    "path": "i18n/qlog_cs.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"cs_CZ\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>Editor Aktivit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>Jméno aktivity</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>Rozložení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>Uspořádání oken:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>Uloženo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>Dostupná pole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>Seznam polí, která mohou být použita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>Řádka A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>Přesunout vybraná pole ze seznamu dostupných polí na řádek A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>Odstranit vybrané pole z řádku A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>Seznam polí na první řádce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>Změnit pořadí. Přesunout vybrané pole nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>Změnit pořadí. Přesunout vybrané pole dolu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>Řádka B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>Přesunout vybraná pole ze seznamu dostupných polí na řádek B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>Odstranit vybrané pole z řádku B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>Seznam polí na druhé řádce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>Sloupec A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>Seznam polí v prvním sloupci detailu QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>Sloupec B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>Seznam polí ve druhém sloupci detailu QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>Sloupec C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>Seznam polí ve třetím sloupci detailu QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>Řádky QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>Sloupce QSO Detailu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>Hodnoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>Profily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>Pokud není aktivován, profil se nezmění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>Anténa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>Automaticky připojit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>Připojit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>Rotátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>Pole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>Nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>Neuloženo</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>Detail Pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>Jméno pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>Aktivní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>Zdroje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation>DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation>DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation>Nový slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation>Nová země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation>Nový druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation>Nové pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>DX Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>Použijte regulární výraz ve formatu Perl</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation>.*</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>Status v logu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>Spot komentář</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>Activity</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>Druhy provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>Fóne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>Pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>Severní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>Antarktida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>Jižní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>Evropa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>Oceánie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>Vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>Nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>Není aktívní žádný Club List</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Stav</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>Pravidlo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>Aktualizací</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>Poslední</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>Vymazat starší</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>Nemazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation> min</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translation>Upravit pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translation>Zobrazení sloupců...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translation>Diplomy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translation>Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translation>Diplom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translation>Má DXCC Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation>Uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>Fóne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translation>Nepracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation>Nepotvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translation>Zobrazit</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation>WAC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation>WAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation>WAS</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation>WPX</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translation>POTA Lovec</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translation>POTA Aktivátor</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation>Lokátor 2 znaky</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation>Lokátor 4 znaky</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation>Lokátor 6 znaků</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation>Lokátor %1 znaků</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation>Okresy USA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation>Ruské distrikty</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation>Japonská města / ku / guny</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation>Okresy Nového Zélandu</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation>Španělské DME</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation>Ukrajinské distrikty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation>Žádný uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translation>Severní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translation>Jižní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translation>Evropa</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translation>Antarktida</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translation>Oceánie</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation>Smazáno</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>Slot: </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>Stále čeká</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>Vytvořit další okno Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>Vymazat starší</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>Vše vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>Vymazat aktuální pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>Nemazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation> min</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>Zobrazit pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>Centrovat RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation>Zobrazit nouzové frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation>SOS</translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>Rig není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>Rig nepodporuje Morse over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>Klíč není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Nelze odeslat Text do rádia</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Nelze nastavit rychlost klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Nelze zastavit odesílání textu</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>Rychlost</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation>Okamžitě zastavit vysílání CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>Zastavit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>Vymazat Odeslané a Echo konzoli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation>&amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>Text k odeslání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>Shortcut profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>Profil klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>Odeslaný text</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>Echo text</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>Přepnout mezi odesílám po &lt;b&gt;slovech&lt;/n&gt; (oddělené mezerami) &lt;br&gt;a odesláním jako &lt;b&gt;celku&lt;/b&gt; (oddělené koncem rádku).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>CW Konzole - Zastavit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>Rig musí být připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>Slovo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>Celek</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>Klíč není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>Nelze odeslat text</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Nelze nastavit rychlost klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Nelze zastavit odesílání textu</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>Připojené zařízení není FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>Klíč není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>Nelze odeslat text do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>Nelze odeslat příkaz do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>Nelze odeslat příkaz do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>Nelze odeslat příkaz do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>Nelze odeslat příkaz do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>Nelze odeslat příkaz do FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>Nelze přijmount data z FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>Vypršel časový limit připojení FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>Chyba FLDigi připojeni</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>Chyba odeslaného FLDigi příkazu</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>Není vybrán žádný profil klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>Interní Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>Chyba připojení</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>Nelze přijipoji klíč</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>Připojené zařízení není WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Nelze odeslat Text do rádia</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>Klíč není připojen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>Chyba připojení</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Nelze nastavit rychlost klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Nelze zastavit odesílání textu</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation>4000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation>2000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation>1333 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation>1000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation>800 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation>666 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation>571 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation>500 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation>444 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation>400 Hz</translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation>Export Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation>Soubor:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation>Šablona formátu:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation>Spravovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation>Uživatelský filtr:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation>Datum/čas:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation> - </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation>UTC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation>Stanice a kategorie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation>Značka:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation>Operátoři:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation>Pásmo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation>Druh provozu:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation>Výkon:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation>Operátor:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation>Asistované:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation>Stanice:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation>Vysílač:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation>Čas:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation>Další</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation>Jméno:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation>Email:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation>Adresa:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation>Max. 6 řádků</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation>Umístění:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation>Klub:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation>Volná poznámka:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation>Soubory Cabrillo (*.log);;CBR soubory (*.cbr);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation>QSO: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation>QSOs: ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation>Upozornění QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation>Vyberte prosím šablonu soutěže.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation>Vyberte prosím výstupní soubor.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation>Žádná volací značka není k dispozici. Zkontrolujte filtry.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation>Nepodařilo se připravit exportní dotaz.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation>Nepodařilo se načíst QSO pro export.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation>Nelze otevřít soubor %1 pro zápis.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation>Exportuje se Cabrillo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation>Informace QLog</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation>\n            <numerusform>Exportováno %n QSO do souboru Cabrillo.</numerusform>\n            <numerusform></numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation>Všechna pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation>2m (144 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation>1.25m (222 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation>70cm (432 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation>33cm (902 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation>23cm (1.2 GHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation>Světlo</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation>VHF 3 pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation>Pouze VHF FM</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation>Smíšený</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation>Jeden operátor</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation>Více operátorů</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation>Zkontrolovat log</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation>Neasistovaný</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation>Asistovaný</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation>Pevný</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation>Mobilní</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation>Portable</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation>Rover</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation>Rover Limited</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation>Rover Unlimited</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation>Expedice</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation>HQ</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation>Škola</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation>Distribuovaný</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation>Jeden</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation>Dva</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation>Omezený</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation>Neomezený</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation>6 hodin</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation>12 hodin</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation>24 hodin</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation>Klasické</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation>Rookie</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation>TB Wires</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation>Nováček/Technik</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation>Nad 50</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation>Text (zarovnán vlevo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation>Frekvence (kHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation>Čas (HHMM)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation>Datum (RRRR-MM-DD)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation>RST zkrácené (bez poslední číslice)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation>Velká písmena</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation>Mód (Cabrillo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation>Číslo s nulami</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation>Správce Cabrillo šablon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation>Importovat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation>Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation>Exportovat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation>Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation>Nová šablona</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation>Nový</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation>Kopírovat existující šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation>Kopírovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation>Smazat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation>Název šablony:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation>Název závodu:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation>Výchozí mód:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation>Sloupce řádku QSO:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation>Název soutěže podle pravidel. Je možné zadat vlastní řetězec, pokud není v seznamu.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation>Poř.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation>Pole QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation>Formátovač</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation>Šířka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation>Štítek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation>Přidat řádek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation>Odstranit vybraný řádek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation>Nová šablona</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation>Kopie – %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation>Smazat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation>Smazat šablonu „%1“?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation>Importovat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation>QLog Cabrillo šablona (*.qct)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation>Import se nezdařil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation>Exportovat šablonu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation>Export se nezdařil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation>Nepodařilo se zapsat soubor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation>Soubor nebyl nalezen: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation>Nelze otevřít soubor: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation>Neplatný soubor šablony: chybí název</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation>Nelze zahájit databázovou transakci.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation>Upozornění QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation>Nelze uložit šablonu „%1“: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Bude použit sekundární&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation>ON4KST Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>Připojit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>Nový</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>Upozornění QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>ON4KST Chat není správně nastaven.&lt;p&gt; Prosím, použijte dialog &lt;b&gt;Nastavení&lt;/b&gt; pro konfiguraci služby.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>Zapnuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>Vypnuto</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Hodiny</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>Východ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>Západ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation>-</translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>Neplatný klíč API</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>Clublog operace pro značku %1 se nezdrařila.&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Nastavení zobrazených sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>Obecné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>Moje Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation>QSL &amp;&amp; Callbooks</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>Členství</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>Podmínky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>Závody</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>Jiné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>Dokončit</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>Odznačit vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>Vybrat vše</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Nastavení zobrazených sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>Dokončit</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation>DXCC Země</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation>Sat Info</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation>SOTA Summit</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation>WWFF záznamy</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation>IOTA záznamy</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation>POTA záznamy</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation>Klubové informace</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation>Clublog CTY.XML</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation>Seznam hodnot</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation>Aktualizuji </translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation> Aktualizace selhala</translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation>Fóne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>Afghánistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>Agalega a St. Brandon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>Alandské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>Aljaška</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>Albánie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>Alžírsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>Americká Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>Amsterdam a St. Paul Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>Andaman &amp; Nicobar Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>Andorra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>Angola</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>Anguilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>Ostrov Annobon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>Antarktida</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>Antigua a Barbuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>Argentina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>Arménie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>Aruba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>Ostrov Ascension</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>Asijské Rusko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>Asijské Turecko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>Australské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>Austrálie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>Rakousko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>Ostrov Aves</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>Ázerbajdžán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>Azory</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>Bahamy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>Bahrajn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>Bakerovy a Howlandovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>Baleárské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>Ostrov Banaba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>Bangladéš</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>Barbados</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>Bělorusko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>Belgie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>Belize</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>Benin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>Bermudy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>Bhútán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>Bolívie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>Bonaire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>Bosna a Hercegovina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>Botswana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>Bouvet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>Brazílie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>Britské Panenské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>Brunej Darussalam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>Bulharsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>Burkina Faso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>Burundi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>Kambodža</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>Kamerun</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>Kanada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>Kanárské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>Kapverdy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>Kajmanské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>Středoafrická republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>Střední Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>Ceuta a Melilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>Čad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>ostrovy Chagos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>Chathamské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>Chesterfieldovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>Chile</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>Čína</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>Vánoční ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>Ostrov Clipperton</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>Kokosové (Keelingovy) ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>Kokosový ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>Kolumbie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>Komory</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>Conwayský útes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>Korsika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>Kostarika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>Pobřeží slonoviny</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>Kréta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>Chorvatsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>Ostrov Crozet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>Kuba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>Curacao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>Kypr</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>Česká Republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>Korejská lidová republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>Dem. Rep. Konga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>Dánsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>Ostrov Desecheo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>Džibutsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>Dodecanese</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>Dominika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>Dominikánská republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>Ostrov Ducie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>Východní Malajsie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>Velikonoční ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>východní Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>Ekvádor</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>Egypt</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>El Salvador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>Anglie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>Rovníková Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>Eritrea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>Estonsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>Etiopie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>evropské Rusko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>Falklandy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>Faerské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>Německo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>Fernando de Noronha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>Fidži</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>Finsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>Francie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>Země Františka Josefa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>Francouzská Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>Francouzská Polynésie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>Gabon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>Galapágy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>Gruzie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>Ghana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>Gibraltar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>Ostrovy Glorioso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>Řecko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>Grónsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>Grenada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>Guadeloupe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>Guam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>Guantánamo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>Guatemala</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>Guernsey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>Guinea-Bissau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>Haiti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>Havaj</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>Heardův ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>Honduras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>Hong Kong</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>Maďarsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>ITU HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>Indie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>Indonésie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>Írán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>Irák</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>Irsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>Ostrov Man</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>Izrael</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>Itálie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>Jamaica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>Jan Mayen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>Japonsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>Jersey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>Ostrov Johnston</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>Jordán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>Ostrovy Juana Fernandeze</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>Juan de Nova a Evropa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>Kaliningrad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>Kazachstán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>Keňa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>Kerguelenské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>ostrovy Kermadec</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>Království Eswatini</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>Ostrov Kure</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>Kuvajt</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>Kyrgyzstán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>Ostrovy Lakshadweep</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>Laos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>Lotyšsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>Libanon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>Lesotho</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>Libérie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>Libye</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>Lichtenštejnsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>Litva</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>Ostrov lorda Howea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>Lucembursko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>Macao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>Ostrov Macquarie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>Madagaskar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>ostrovy Madeira</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>Malawi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>Maledivy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>Mali</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>Ostrov Malpelo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>Mariánské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>Market Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>Markézské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>Marshallovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>Martinik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>Mauritánie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>Mauricius</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>Mayotte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>Mellish Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>Mexiko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>Mikronésie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>Ostrov Midway</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>Minami Torishima</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>Moldavsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>Monako</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>Mongolsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>Černá Hora</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>Montserrat</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>Maroko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>Hora Athos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>Mosambik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>Myanmar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>Namibie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>Nauru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>Ostrov Navassa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>Nepál</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>Holandsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>Nová Kaledonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>Nový Zéland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>Nikaragua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>Niger</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>Nigérie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>Niue</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>Ostrov Norfolk</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>Severní Cookovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>Severní Makedonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>Severní Irsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>Norsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>Ogasawara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>Omán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>Pákistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>Palau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>Palestina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>Palmýra a ostrovy Jarvis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>Panama</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>Papua-Nová Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>Paraguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>Peru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>Ostrov Petr 1</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>Filipíny</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>Ostrov Pitcairn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>Polsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>Portugalsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>Ostrov Pratas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>Portoriko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>Katar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>Korejská republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>Kosovská republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>Republika Jižní Súdán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>Republika Kongo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>Ostrov Réunion</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>Revillagigedo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>Rodriguezův ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>Rumunsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>Ostrov Rotuma</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>Rwanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>Saba &amp; St. Eustatius</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>Sable Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>San Andres &amp; Providencie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>San Felix a San Ambrosio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>San Marino</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>Svatý Tomáš a Princův ostrov</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>Sardinie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>Saudská arábie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>Útes Scarborough</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>Skotsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>Senegal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>Srbsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>Seychely</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>Sierra Leone</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>Singapur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>Svatý Martin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>Slovenská republika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>Slovinsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>Solomonovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>Somálsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>Jižní Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>Jižní Cookovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>Ostrov Jižní Georgie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>Jižní Orknejské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>Jižní Sandwichovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>Jižní Shetlandské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>Maltézský řád Sov Mil</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>Španělsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>Spratlyho ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>Srí Lanka</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>Svatý Bartoloměj</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>Svatá Helena</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>Svatý Kryštof a Nevis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>Svatá Lucie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>Svatý Martin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation>Ostrov svatého Pavla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>Svatý Petr a Svatý Pavel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>St. Pierre a Miquelon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>Svatý Vincent</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>Súdán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>Surinam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>Svalbard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>Ostrov Swains</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>Švédsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>Švýcarsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>Sýrie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>Tchaj-wan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>Tádžikistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>Tanzanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>Provincie Temotu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>Thajsko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>Gambie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>Timor – Východní</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>Togo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>Tokelauské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>Tonga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>Trindade a Martim Vazovi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>Trinidad a Tobago</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>Tristan da Cunha a Goughovy ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>Ostrov Tromelin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>Tunisko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>Turkmenistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>Ostrovy Turks a Caicos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>Tuvalu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>Americké Panenské ostrovy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>Uganda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>Ukrajina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>Spojené arabské emiráty</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>Sídlo Organizace spojených národů</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation>Spojené státy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>Uruguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>Uzbekistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>Vanuatu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>Vatikán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>Venezuela</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>Vietnam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>Ostrov Wake</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>Wales</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>Ostrovy Wallis a Futuna</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>Západní Malajsie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>Západní Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>Západní Sahara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>Ostrov Willis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>Jemen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>Zambie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>Zimbabwe</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation>Seznam pro DXCC podání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation>Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation>Má DXCC Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation>Uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation>Kategorie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation>Smíšené</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation>Fóne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation>Zobrazit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation>Dosud nepředloženo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation>Předloženo (neuznáno)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation>Již uznáno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation>Rozsah pásem</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation>Vybrat přednastavená DXCC pásma 5-Band (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation>5pásmové DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation>Vybrat všechna DXCC způsobilá pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation>Všechna DXCC pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation>Pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation>Vyberte možnosti výše a seznam se automaticky aktualizuje.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation>Exportovat kontakty uvedené výše do souboru ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation>Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation>Žádný uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation>Libovolné pásmo (úroveň entity)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation>5pásmové DXCC (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation>Vlastní výběr pásem</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation>Entita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation>Prefix</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation>Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation>Předloženo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation>Uznáno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation>Export ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation>Žádné kontakty k exportu.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation>Nepodařilo se načíst záznamy kontaktů.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation>Exportovat seznam DXCC podání jako ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation>libovolné pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation>5pásmový</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation>všechna pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation>%1 vybraných pásem</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation>Žádné kontakty neodpovídají zadaným kritériím.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation>%1 %2 %3 — DXCC %4 / %5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation>pásmo-slots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation>entita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation>záznam</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation>záznamů</translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>Nová země</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>Nové pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>Nový druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>Nové pásmo&amp;druh</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>Nový slot</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>Ano</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>Ne</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>Vyžádáno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>Ve frontě</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>Chybné</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>Elektronicky</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>Upraveno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>Jiné</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>Neslyšeno</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>Nejistý</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation type=\"unfinished\">Single Paddle</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation>Potvrzeno (AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation>Potvrzeno (non-AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation>Neurčeno</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <oldsource>Aircraft Scatte</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation type=\"unfinished\">Pol. záře</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation>Vývojářské nástroje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation>Ladicí log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation>Pravidla logování:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation>např. qlog.ui.*.runtime=true</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation>Použít</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation>Vygenerovat ladicí soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation>Exportovat soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation>SQL konzole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation>Otevřít SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation>Uložit SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation>Spustit SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation>Exportovat jako</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation>Zadejte SQL dotaz... Ctrl+Enter = spustit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation>Otevřít SQL dotaz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation>SQL soubory (*.sql);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation>Chyba při otevírání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation>Nelze otevřít soubor:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation>Uložit SQL dotaz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation>Chyba ukládání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation>Nelze uložit soubor:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation>Dotaz uložen do %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation>Chyba: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation>Zobrazeno %1 řádků (zkráceno na %2) za %3 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation>Vráceno %1 řádků za %2 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation>Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation>Žádné výsledky k exportu.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation>Chyba exportu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation>Nelze otevřít soubor pro zápis:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation>Exportováno %1 řádků do %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation>Textové soubory (*.txt);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation>CSV soubory (*.csv);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation>Export ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation>Ve výsledcích nebyla nalezena žádná platná ID kontaktů.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation>Nepodařilo se načíst záznamy kontaktů:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation>V databázi nebyly nalezeny žádné odpovídající kontakty.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation>Pravidla logování vymazána (výchozí)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation>Pravidla logování použita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation>Uložit ladicí log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation>Aktuálně se nezapisuje žádný ladicí log soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation>Log soubory (*.log);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation>Ladicí log uložen do %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation>Nepodařilo se zkopírovat ladicí log soubor.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation>Ukládání logů do souboru je zakázáno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation>Log soubor: %1</translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>Stáhnout QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>eQSL QTH Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSL od</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSO od</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>Moje značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;Stáhnout</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW není správně nastaven.&lt;p&gt; Prosím, použijte dialog &lt;b&gt;Nastavení&lt;/b&gt; pro konfiguraci služby.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL není správně nastaven.&lt;p&gt; Prosím, použijte dialog &lt;b&gt;Nastavení&lt;/b&gt; pro konfiguraci služby.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>Stahování z %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>Zpracovávám %1 QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>Aktualizace %1 selhala: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>Informace QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>Není vybrána žádná služba</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>Filtry DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>Obecné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>Severní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>Antarktida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>Jižní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>Evropa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>Oceánie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>Fóne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>Status v logu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>Nový druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>Nová země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>Nové pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>Nový slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>Pokročilé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>Kontinent Spottera</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>Nezobrazovat následující spoty pokud mají stejnou značku a jejich rozdíl frekvencí a času je menší než nastavené parametry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>Deduplikace Spotů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translation>Rozdíl časů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translation>Rozdíl frekvencí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>Není aktívní žádný Club List</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>Čas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Poznámka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>Kontinent Spottera</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>Země</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>Odeslat příkaz do DX Clusteru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>Připojit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>Vložte &lt;b&gt;hostname:port&lt;/b&gt; DXC Serveru.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>Filtrováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation>Spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>To All</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>Konzole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>Fulltextové vyhledávání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>Hledat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>Zavřít vyhledávání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>Filtr...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translation>Spotni poslední QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>Odeslat poslední QSO spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>Zobrazit KV Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>Zobrazit VKV Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>Zobrazit WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>Zobrazit WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>Zobrazení sloupců...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>Připojit při spuštění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>Automatické připojení po startu aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>Vymazat server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>DXC - Vymazat server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>Vymazat heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>Zachovat Spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>Při přepojení serverů nejsou spoty smazány.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>Vše vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>Hledat...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC- Hledat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Který sloupec by měl být zobrazen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>Filtr DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>Můj Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>Automaticky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>Připojování...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>DX Cluster je dočasně nedostupný</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>Chyba DXC Serveru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>Nesprávná značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster Heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>Bezpečnostní upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>Heslo může být posláno přes nezabezpečený kanál</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>Uživatelské jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>Odpojit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>Příkaz DX Clusteru</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>Chybné heslo nebo QTHProfile Id</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation>ADIF nenalezen v odpovědi z eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>Chybé uživatelské jméno nebo heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>Neznámá chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>Nelze otevřít dočasný soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>Nelze uložit obrázek do souboru</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>Neznámá odpověď z eQSL</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>Editor Aktivit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>Aktivity</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>Exportovat vybraná QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>Typ Exportu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>Sada Sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>Vyberte jednu z předdefinovaných sad sloupců nebo definujte vlastní sadu sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>Upravit aktuální sadu sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>Označit exportované QSO jako Odeslané</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>Exportovat pouze QSO, která splňují nastavené filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>Filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>Exportovat pouze QSO, která splnují zadaný časový interval</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>Časové období</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>Exportovat pouze QSO, která mají vybrabou Moji značku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>Moje značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>Exportovat pouze QSO, která mají vybraný Můj lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>Můj lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>Exportovat QSO, která odpovídají vybrané hodnotě QSL Send Via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>QSL odeslat přes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>Zahrnout QSO se statusem odeslání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>Zahrnout Status Odeslání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Za normálních okolností tento status znamená &lt;b&gt;&quot;Ignorovat&quot;&lt;/b&gt;.&lt;br/&gt;Avšak, někdy může být požadováno toto nastavení ignorovat.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>Ignorovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Za normálních okolností tento status znamená &lt;b&gt;Neodesílat&lt;/b&gt;.&lt;br/&gt;Avšak, někdy může být požadováno toto nastavení ignorovat.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>Neodesílat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>Znovu odeslat již odeslaná QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>Již odeslaná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>Uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>Exportovat QSO, která vyhovují vybranému QSO Filteru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation>Profil stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>Soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation>JSON</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>Export QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation>Exportovat pouze QSO odpovídající tomuto profilu stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation>Exportuje se…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>Nelze označit exportovaná QSO jako Odeslaná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>Obecný</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>QSL specifické</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>Vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation>Minimální</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>Uživatelské 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>Uživatelské 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>Uživatelské 3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation>Zabalit data a nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation>Zadejte heslo pro zašifrování uložených přihlašovacích údajů.\nToto heslo bude později potřeba pro jejich obnovení.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation>Heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation>Náhodné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation>Potvrzení hesla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation>Po exportu odstranit hesla z úložiště přihlašovacích údajů</translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>Timeout</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>Vypršel časový limit odezvy FLRig</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>Chyba sítě</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>Chyba v odpovědi</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translation>Žádné</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translation>CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translation>Nelze nastavit PTT Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translation>Nelze nastavit PTT Sdílení</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation>Nelze nastavit CI-V adresu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>Nepodporovaný ovladač</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>Nelze nastavit auto_power_on</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation>Nelze nastavit no_xchg na 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>Spojení nelze navázat</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation>Chyba nastavení TX frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>Chyba v nastavení frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation>Chyba nastavení split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>Chyba nastavení režimu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation>Chyba nastavení split režimu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>Chyba v získaní stavu PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>Chyba v získání frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>Chyba v získání druhu provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>Chyba v získání VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>Nepodporovaný ovladač</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>Spojení nelze navázat</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>Chyba v nastavení pozice</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>Chyba v získání pozice</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>Importovat vše nebo vybraná QSO z vybraného časového období</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>Soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>Výchozí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation>Pokud v importovaném záznamu chybí DXCC, bude doplněno podle volacího znaku.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation>Doplnit chybějící DXCC informace o entitě</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>Můj profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>Můj Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>Časové období</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>Vybrat soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>Hodnota je použita v případě, když importovaný záznam má příslušné ADIF pole prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Hodnoty jsou použity v případě, když importovaný záznam má příslušné ADIF pole prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;QSO v logu:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Importováno:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>Duplicitní QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;Přejete si importovat toto duplicitní QSO?&lt;/p&gt;%1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>Uložit do souboru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>QLog Shrnutí Importu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>Datum Importu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>Soubor importu</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>Importovano: %n kontaktů</numerusform>\n            <numerusform>Importovano: %n kontakt</numerusform>\n            <numerusform>Importovano: %n kontaktů</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>Upozornění: %n</numerusform>\n            <numerusform>Upozornění: %n</numerusform>\n            <numerusform>Upozornění: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>Chyb: %n</numerusform>\n            <numerusform>Chyb: %n</numerusform>\n            <numerusform>Chyb: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>Detaily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>Výsledek Importu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>Uložit detaily...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translatorcomment>Neprekladat - nezobrazuje se</translatorcomment>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>Heslo bude uloženo do uložiště hesel.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>Zapamatovat heslo</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>Neznámý uživatel</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>Nesprávné heslo</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>Chat zprávy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>Zprávy stojící za pozornost</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>Vymazat vybranou značku a zprávu ze vstupu.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>Odeslat chat zprávu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>Zobrazení sloupců</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Který sloupec by měl být zobrazen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>Připravit QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>Přenese značku a lokátor do okna pro nové QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>Zobrazit pouze o mně</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>Zobrazit pouze zprávy, kde je moje volací značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>Potlačit Uživatel-Uživatel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>Potlačí soukromé zprávy mezi dvěma uživateli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>Zvýraznit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>Zvýraznit zprávy na základě nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>Pravidla Zvýraznění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation>Směrovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>Vymazat zprávy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>Vymazat všechny zprávy v okně</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>Vy</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>Upravit pravidlo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>Jméno pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>Aktivní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>Zvýraznit zprávy odpovídající</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>všem následující podmínkám</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>jakékoliv z následujících podmínek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>Přidat podmínku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>Vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation>Odesílatel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>Obsahuje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>Začíná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>Nesmí být prázdné</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>Pravidla Zvýraznění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Stav</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation>Rozbalit data a nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Aktuální databáze bude SMAZÁNA!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Všechna uložená hesla budou SMAZÁNA!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Aplikace se po načtení restartuje&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Pro zachování dat nejprve použijte Pack Data &amp;amp; Settings nebo Export QSOs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation>Vybrat databázi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation>Soubor:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation>Stav: Nebyl vybrán žádný soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation>Dešifrovat přihlašovací údaje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation>Zadejte heslo pro dešifrování přihlašovacích údajů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation>Heslo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation>Načíst a restartovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation>Nesprávné heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation>Vybrat soubor databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation>QLog export databáze (*.dbe);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation>Nelze vytvořit dočasný soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation>Rozbaluje se databáze…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation>Nelze rozbalit soubor databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation>Nelze otevřít databázi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation>Platná databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation>Jiná platforma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation>Pro import přihlašovacích údajů je vyžadováno heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation>V databázi nejsou žádné zašifrované přihlašovací údaje</translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>Nelze dohledat Mé DXCC Informace</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>Zaznam neobsahuje minimální počet polí (start_time, call, band, mode, station_callsign)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>Mimo vybraný rozsah datumů</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>Duplicitní</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>Chybí informace o DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>Značka stanice není k dispozici</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>Nelze vložit do databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>Importováno</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>Stav DXCC:</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>Upozornění</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translation>QSO ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>Čas od</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>Čas do</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST Sent</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST Rcvd</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>Datum QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>Datum QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>Datum LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>Datum LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>TX Výkon</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>Adresa (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>Nadmořská výška</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>Lokator rozšíření</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>Vzdálenost</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>Datu eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>Datum eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>Datum Nahrání HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>Stav nahrání HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>Datum Nahrání HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>Stav nahrání HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation>CW Klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation>Typ CW Klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>Má nadmořská výška</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>Moje město (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>Moje země (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>Muj lokator rozšíření</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>Moje IOTA Island ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation>Můj CW klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation>Můj typ CW klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>Mé jméno (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>Mé směrovací číslo (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>Má POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>Můj Rig (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation>Jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>Poznámky (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>Značka Operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSLr Via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSLs Via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>Země</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>Jméno (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>Země (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>Prefix</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>Stát</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>Okres</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>Datum stažení z QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>Stav stahování QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation>Odchozí QSL Zpráva (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation>Odchozí QSL Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation>Příchozí QSL Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>RcvNr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>RcvExch</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Sent</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>Nezařazená Pole</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>Adresa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>Věk</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>A-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>Azimut Antény</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>Elevace Antény</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>Cesta Signálu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>ARRL Section</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>RX Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>Třída</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>Datum Nahrání Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>Stav nahrání Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>Komentář (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>Region</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation>Rig (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>Můj WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL přijato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>Okres Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>Kontaktovaný Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>ID Závodu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>Datum DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>Datum DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation>DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation>DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>Email</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>Vlastní značka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation>eQSL AG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>EME Init</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>RX Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>Hostující Operátor</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>Datum Nahrání HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>Stav nahrání HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>IOTA Island ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>K-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>Zeměpisná šířka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>Zeměpisná délka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation>Jméno MS roje</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>Moje anténa (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>Moje anténa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>Moje město</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>Můj okres</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>Můj Okres Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>Moje země</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>Moje CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>Můj DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>Moje DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>Můj FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>Můj lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>Moje IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>Moje ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>Moje zeměpisná šířka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>Moje zeměpisná délka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>Mé jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>Mé směrovací číslo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>Můj Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Má SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>Moje SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>Můj Stát</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>Moje ulice</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mé VUCC lokátory</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>Poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation>#MS Burst</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation>#MS Ping</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>Podmínky šíření</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>Veřejný šifrovací klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>Datum Nahrání QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>Stav nahrání QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>QSL zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation>QSL Via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>Úplné QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation>Random QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>Jméno SAT</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation>Solar Flux</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation>Silent Key</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>SKCC Member</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Značka logující stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Ten-Ten Číslo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>UKSMG Člen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>Logbook - Vymazat QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>Nahrát do Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>Vyhledat na Webu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>Aktualizovat z Callbooku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>Doplnit chybějící informace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation>Označit QSL přijato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation>Označit QSL požadováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>Vyhledat značku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>Upravit hodnotu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>Logbook - Upravit hodnotu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation>Zobrazení sloupců </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Který sloupec by měl být zobrazen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>Export vybraných</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>Export vybraných QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translation>Odeslat DX Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>Logbook - Odeslat DX Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>Vymazat vybraný kontakt?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation>Clublog &lt;b&gt;Okamžité odeslání&lt;/b&gt; podporuje pouze mazání po jednom záznamu&lt;br&gt;&lt;br&gt;Chcete pokračovat navzdory skutečnosti,&lt;br&gt;že operace DELETE nebude odeslána do Clublogu?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>Mazání QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>Aktualizace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>Aktualizací budou ovlivněny všechny vybrané řádky&lt;br&gt;Aktuálněupravená hodnota ve sloupci se použije na všechny vybrané řádky.&lt;br&gt;Chcete je upravit?</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translatorcomment>Anzahl: %n</translatorcomment>\n        <translation>\n            <numerusform>Počet: %n</numerusform>\n            <numerusform>Počet: %n</numerusform>\n            <numerusform>Počet: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Stahování eQSL obrázku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>Všechna pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>Všechny módy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>Všechny země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>Žádný uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>Upozornění QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>Každá dávka podporuje až 100 QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>Progres aktualizace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>Selhalo přihlášení do Callbooku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>Chyba Callbooku: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>Všechny kluby</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Stažení eQSL obrázku selhalo: </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>Nelze otevřít dočasný soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation>Nesprávné přihlašovací jméno nebo heslo</translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>Nahrání přerušeno uživatelem</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>Nahrání odmítnuto LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>Neočekávaná odpověď z TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>Chyba TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>Chyba TQSLLib</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>Nelze otevřít vstupní soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>Nelze otevřít výstupní soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>Všechna QSO byla duplicitní nebo mimo časový rozsah</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>Nekterá QSO byla duplicitní nebo mimo časový rozsah</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>Chybný příkaz</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>Chyba připojení k LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>Neočekávaná chyba TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>Nenalezen TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL neočekávaně skončil</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>&amp;Logbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>&amp;Zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Nápověda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>Z&amp;obrazení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation>Sl&amp;užby</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>Toolbar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>Hodiny</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>Mapa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation>DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>Rotátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>Online Mapa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation>CW Konzole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>Profilová fotka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>&amp;Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Export</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation>Mailing List...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>Uložit uspořádání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>Zachovat nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>Obnovit možnosti připojení po restartu aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>Připojit R&amp;ig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>Upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>Ukončit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>Aplikace - Ukončit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation>Zabalit data a nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation>Rozbalit data a nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>Nový kontakt - Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>&amp;O aplikaci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>Nový kontakt - Uložit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>S&amp;tatistiky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation>QSL &amp;Galerie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation>Vývojářské nástroje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation>Spouštět vlastní SQL dotazy pouze pro čtení nad databází logu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation>&amp;Tisk QSL štítků</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>Připojit R&amp;otátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>&amp;Filtry QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation>&amp;Diplomy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation>&amp;Seznam pro DXCC podání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation>Vygenerovat seznam spojení pro předložení k uznání ARRL DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation>Pípnutí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>Připojit &amp;CW Klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>Nahlásít &amp;Bug...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>&amp;Ruční zadání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>Přepnout QSO okno do režimu ručního zadávání&lt;br/&gt;(hodnoty času, frekvence, profilů atd. nejsou přebírány z jejich běžných zdrojů)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>Logbook - Vyhledat značku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>Nový kontakt - Přenést text z pole Callsign do Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>Rig - Pásmo dolů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>Rig - Pásmo nahoru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>Nový kontakt - Použít volací značku z Našeptávače</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>CW Konzole - Rychlost klíče zvýšit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>CW Konzole - Rychlost klíče snížit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>CW Konzole - O profil výš</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>CW Konzole - O profil níž</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>Rig - PTT On/Off</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>Všechna pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>Každé pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>Každé pásmo a mod</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>Bez kontroly</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>Jedna pro vše</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>Pro pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>Zastavit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>Žádné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>Nahrát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>Služba – Nahrávání QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>Stáhnout QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>Služba - Stáhnout QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation>Téma: Native</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation>Téma: QLog Light</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation>Téma: QLog Dark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation>Novinky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation>Export Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>Upravit pravidla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>Kontrola Duplicit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>Sekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>Spojit Exchange s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>Zobrazit upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>O aplikaci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation>Barevné téma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>Není povoleno pro jiný styl než Fusion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>Stiskni pro naladění alertu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Chyba Okamžitého nahrávání do Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Detail chyby:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>op: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>Nová verze</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>Je k dispozici nová verze %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>Připomenout později</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>Stáhnout</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation>Nepodařilo se zašifrovat přihlašovací údaje.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation>Soubory databáze (*.dbe);;Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation>Nepodařilo se vytvořit dočasný soubor.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation>Nepodařilo se exportovat databázi.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation>Komprimuje se databáze…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation>Databáze byla úspěšně exportována do\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation>Nepodařilo se komprimovat databázi.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation>Nepodařilo se připravit databázi pro import.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>Klasické</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>Prejete si odstranit Contest filtr %1?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>Contest: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Záloženo na Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Ikony &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satelitní snímky &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation>-</translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation>Noc a Den</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation>Pol. záře</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation>MUF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation>IBP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>Cesta</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation>59</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation>80m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>Uložit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DUPE !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>Vyhledet informace o značce na webu. URL dotazu lze změnit v Nastavení -&gt; Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>Čas od</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC Statistiky&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiky stanice&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>Člen:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation>World Wide Flora &amp; Fauna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>QSL Send Status</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Odesláno&lt;/b&gt; -QSL byl odeslán; QSO bylo nahráno a akceptováno online službou&lt;br/&gt;&lt;b&gt;Neodesílat&lt;/b&gt; -QSL nemá být odesláno; neodesílat do online služby&lt;br/&gt;&lt;b&gt;Vyžádano&lt;/b&gt; -protistanice vyžádala QSL; protistanice vyžádala opětovné nahrání do online služby&lt;br/&gt;&lt;b&gt;Ve frontě&lt;/b&gt; -QSL bylo zařazeno do fronty k vyřízení; QSO je ve frontě k nahrání do online služby&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>QSL odeslat přes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>Mé &amp;poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Detaily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>Mo&amp;je Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>DARC DOK (kód uzemí) (např A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>Délka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL Via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>Podmínky šíření</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>Anténa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>Neodesílat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>Odesláno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>Vyžádáno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>Ve frontě</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>Ignorovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>Elektronicky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>Selhalo přihlášení do Callbooku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>Nová země!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>Nové pásmo!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>Nový druh provozu!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>Nové pásmo &amp; druh!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>Nový slot!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GE</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation> m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>Hledání v Callbooku je aktivní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>Pro aktivaci je nutné vyplnit Contest ID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation>Není to jméno Contestu ale jeho přiřazené Contest ID (např. CQ-WW-CW pro CQ WW DX Contest (CW)) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>Popis vybavení kontaktované stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>Hledání v Callbooku není aktivní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>Rozbalit/sbalit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>dva nebo čtyři sousední lokátory, každý o délce čtyř znaků (např. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>Změna stavu Rigu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig není připojen</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>Rig 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>Rig 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>Změna stavu Rigu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig není připojen</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>Port nelze použít</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>Nelze získat IP adresa pro</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>Neexistuje IPv4 adresa pro</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation>Došlo k chybě</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>Timeout</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>Správa QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>Dostupné QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>Zkopiruje vstupní soubor ze zdrojové složky do složky QLog uložiště QSL.&lt;br/&gt;Původní soubor zůstane ve zdrojové složce nezměněn</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>Import QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>Vymazat QSL?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>Otevřít</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation>Oblíbené</translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation>Nastavení specifické pro platformu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation>Databáze byla exportována z jiné platformy.\nOvěřte nebo aktualizujte následující nastavení.\nPole můžete nechat prázdná a nastavit je později v Nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation>Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation>Hodnota</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation>Pokračovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation>Vybrat soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation>Všechny soubory (*)</translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>Profilová fotka</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>QLog Help</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>Upozornění QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>Nepovedlo se aktualizovat Club List. Není možné odstranit staré záznamy</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>Nepovedlo se aktualizovat Club List. Není možné naplánovat stažení listů</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>Do uložiště hesel nelze uložit heslo pro %1</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>Z uložiště hesel nelze získat heslo pro %1</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>Neočekávaná odpověď Club Listu. Ruším aktualizaci</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>Neočekávaný obsah Club List pro</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>Síťová chyba. Nepovedlo se stáhnout Club List pro</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>QLog již běží</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation>Nepodařilo se zpracovat čekající import databáze.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation>Databáze byla úspěšně importována, ale uložená hesla nebylo možné obnovit (dešifrování selhalo nebo jsou data poškozena). Všechna hesla služeb byla vymazána a musí být znovu zadána v Nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>Nelze se připojit k databázi.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>Nelze exportovat QLog databázi do ADIF jako backup.&lt;p&gt;Pokuste se ručně exportovat log do ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>Migrace databaze selhala.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>Chyba jména DXC Serveru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>Adresa DXC Serveru musí být ve formátu &lt;p&gt;&lt;b&gt;[uživatel@]hostname:port&lt;/b&gt; (např. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>Nesprávné heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>Chyba připojení k DXC serveru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>Pole &lt;b&gt;%0&lt;/b&gt; nebudou uložena, protože &lt;b&gt;%1&lt;/b&gt; není vyplněno.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>Vaše značka není vyplněna. Prosím, nastavte Profil Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>QLog Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>Jméno aktivity již existuje.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>Pravidlo s tímto jménem již existuje.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>Regulární výraz pro značku je chybný.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>Regulární výraz pro komentář je chybný.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>Nelze aktualizovat Pravidla upozornění</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>Filtr s tímto jménem již existuje.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>Prosím, definujte alespoň jeden Profil Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>WSJTX Multicast je aktivní ale adresa není multicast IP adresa.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation>Zjištěna smyčka. Raw UDP přesměrování používá stejný port jako příjem WSJT-X.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Port musí být platný COM port.&lt;br&gt;Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>PTT Port musí být platný COM port.&lt;br&gt;Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;Rozsah TX&lt;/b&gt;: Koncová frekvence nesmí být 0.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;Rozsah TX&lt;/b&gt;: Koncová frekvence nesmí být menší než počáteční.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Port musí být platný COM port.&lt;br&gt;Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Port musí být platný COM port.&lt;br&gt;Použijte COMxx pro Windows, pro ostatní cestu k souboru zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Nelze změnit Model klíče na &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;Nasledující zařízení nepodporuji Morse over CAT support &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Nelze vymazat Profil Klíče&lt;br&gt;Profil je pouzívám temito zařízeními:&lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>Značka operátora ma chybý format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translation>Lokátor má chybný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>VUCC lokátor má neplatný formát (musí být 2 nebo 4 lokátory oddělené &apos;,&apos;)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>Zěme nesmí být prázdná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>CQZ nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>ITU nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>Značka má chybný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>Jméno souboru je zprázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>Nelze zapsat do souboru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>Informace QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>Exportováno.</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>Exportován %n kontakt.</numerusform>\n            <numerusform>Exporováno %n kontaktů.</numerusform>\n            <numerusform>Exporováno %n kontaktů.</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Chyba Rig:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Chyba Rotátoru:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Chyba CW Klíče:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>Chyba v Chatu: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>Nelze aktualizovat QSO Filter</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>Nelse se připojit k DXC serveru &lt;p&gt;Důvod &lt;b&gt;: </translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>Spojení odmítnuto</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>Server uzavřel spojení</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>Server nenalezen</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>Timeout</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>Chyba sítě</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>Interní Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation>Importuji databázi</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>Načítání Databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>Záloha Databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>Migrace Databáze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>Start aplikace</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>Můj Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Značka logující stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>Můj lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>Jméno operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>Značka operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>Mé město</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>Moje země</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>Můj okres</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>Moje IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>Má SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Má SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>Mé SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mé VUCC lokátory</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>Můj WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>Má POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>Můj DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>Moje ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>Moje CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>Moje DXCC</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;Importován&lt;/b&gt;: %n kontakt</numerusform>\n            <numerusform>&lt;b&gt;Importováno&lt;/b&gt;: %n kontaktů</numerusform>\n            <numerusform>&lt;b&gt;Importováno&lt;/b&gt;: %n kontaktů</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Upozornění&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Upozornění&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Upozornění&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Chyb&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Chyb&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Chyb&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>km</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>mil</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation>Neplatná databáze QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation>Verze databáze je příliš nová (vyžaduje novější verzi QLog)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation>Databáze není soubor QLog Export</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation>Cesta k TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation>(Interní cesta Flatpak)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation>Importazione database</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation>Rig rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation>Rotátor</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation>CW Klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation>Celkem Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation>Celkem Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>Obecná chyba</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation>Galerie QSL lístků</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation>Hledat podle volací značky…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation>Seřadit podle:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation>Exportovat filtrované</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation>Datum (nejnovější)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation>Datum (nejstarší)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation>Volací značka (A-Z)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation>Volací značka (Z-A)</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation>\n            <numerusform>%n QSL lístek</numerusform>\n            <numerusform>%n QSL lísteky</numerusform>\n            <numerusform>%n QSL lísteků</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation>Všechny QSL lístky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation>Oblíbené</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation>Podle země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation>Podle data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation>Podle pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation>Podle módu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation>Podle kontinentu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation>Odebrat z oblíbených</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation>Přidat mezi oblíbené</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation>Otevřít</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation>Uložit…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation>Uložit QSL lístek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation>Exportovat QSL lístky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation>Exportováno %1 z %2 lístků</translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>Shrnutí importu QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>Shrnutí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>Stažených:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>Aktualizovaných:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>Nespárovaných:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>Chyb:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>Detaily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>Nové QSL: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>Aktualizované QSO: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translation>Nespárované QSL: </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation>Tisk QSL štítků</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation>Filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation>Časové období</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation>Moje značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation>Profil stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Sent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation>Uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation>Šablona štítku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation>Velikost stránky:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation>Sloupce:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation>Řádka:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation>Šířka štítku:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation>Výška štítku:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation>Levý okraj:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation>Horní okraj:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation>Vodorovná mezera:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation>Svislá mezera:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation>Vzhled štítku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation>Tisk okrajů štítků</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation>QSO na štítek:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation>Levý text zápatí:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation>Pravý text zápatí:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation>Přeskočit štítek:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation>Bezpatkové písmo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation>Neproporcionální písmo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation>Velikost volací značky:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation>Velikost „To Radio“:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation>Text „To Radio“:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation>Velikost záhlaví:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation>Velikost dat:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation>Text záhlaví data:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation>Formát data:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation>Text záhlaví času:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation>Text záhlaví pásma:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation>Text záhlaví módu:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation>Text záhlaví QSL:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation>Další sloupec:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation>Text dalšího sloupce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation>(název sloupce DB)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation>Nebyla nalezena žádná odpovídající QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation>Stránka 0 z 0</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation>Štítky: 0 (0 stránek)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation>Tisk</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation>Exportovat jako PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation>Vlastní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation>Prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation>QSO odpovídající tomuto profilu stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation>Štítky: %1 (%2 stránek)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation>Stránka %1 z %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation>Export PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation>Soubory PDF (*.pdf)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation>Označit jako odeslané</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation>Označit vytištěná/exportovaná QSO jako odeslaná?</translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation>dd/MM/yyyy HH:mm:ss</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>Čas od</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>Čas do</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>Jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>Komentář</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>Mé poznámky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Detaily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation>CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>Stát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>Okres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>Věk</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation>AF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation>AN</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation>AS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation>EU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation>NA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation>OC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC Statistiky&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiky stanice&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>Značka operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation>Příchozí QSL Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>Odchozí QSL Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>ID Závodu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>Člen:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>DARC DOK (kód uzemí) (např A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>dva nebo čtyři sousední lokátory, každý o délce čtyř znaků (např. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>Podmínky šíření</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>Jméno Satelitu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>Satelitní Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>Mo&amp;je Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>Jméno operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>Anténa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>Výkon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation>Sig Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>Správa QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Odesláno&lt;/b&gt; -QSL byl odeslán; QSO bylo nahráno a akceptováno online službou&lt;br/&gt;&lt;b&gt;Neodesílat&lt;/b&gt; -QSL nemá být odesláno; neodesílat do online služby&lt;br/&gt;&lt;b&gt;Vyžádano&lt;/b&gt; -protistanice vyžádala QSL; protistanice vyžádala opětovné nahrání do online služby&lt;br/&gt;&lt;b&gt;Ve frontě&lt;/b&gt; -QSL bylo zařazeno do fronty k vyřízení; QSO je ve frontě k nahrání do online služby&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>QSL odesláno via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>Přijato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation>QSL Via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>Odesláno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>Zobrazit QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Ano&lt;/b&gt; - QSL byl přijat; QSO bylo potvrzeno online službou&lt;br/&gt;&lt;b&gt;Ne&lt;/b&gt; - QSL nebylo přijato; nebylo potvrzeno online službou&lt;br/&gt;&lt;b&gt;Vyžádano&lt;/b&gt; - QSL vyžádáno; vyžádáno opětovné nahrání do online služby&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation>&amp;Závod</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>RcvNr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>RcvExch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>SendNr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>SendExch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>&amp;Reset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>&amp;Vyhledat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>Neodesílat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>Odesláno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>Vyžádáno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>Ve frontě</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>Ignorovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>Elektronicky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>Uložit změny</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>Opravdu uložit všechny změny?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>Chyba QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>Nepovedlo se uložit všechny změny - interní chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>Nepovedlo se uložit všechny změny - zkuste reset všech změn</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>QSO Detail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>Úprava QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Stahování eQSL obrázku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Stažení eQSL obrázku selhalo: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>Značka nesmí být prazdná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>Značka má chybný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>TX Frekvence nebo Pásmo musí být vyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>Lokátor má chybný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation>Na základě značky DXCC Zěme nemá správné ID - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation>Na základě značky DXCC Kontinent nemá správné ID - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation>Na základě značky ITU nemá správné ID - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation>Na základě značky CQZ nemá správné ID - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation>Satelitní Mode se na základě frekvencí liší od zadané hodnoty - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>Jméno Satelitu nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>Vlastní VUCC má špatný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation>Vlastní DXCC ITU se na základě vlastní volací značky liší od zadané hodnoty - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation>Vlastní DXCC CQZ se na základě vlastní volací značky liší od zadané hodnoty - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation>Vlastní DXCC Země se na základě vlastní volací značky liší od zadané hodnoty - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Pole LoTW Odesláno nastavené na &lt;b&gt;Neodesílat&lt;/b&gt; nedává smysl pokud je nastaveno datum odeslání QSL. Nastavte datum na 1.1.1900, aby pole datum zůstalo prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Datum by měl být nastavenen v případě LoTW Sent Status &lt;b&gt;Odesláno&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Pole eQSL Odesláno nastavené na &lt;b&gt;Neodesílat&lt;/b&gt; nedává smysl pokud je nastaveno datum odeslání QSL. Nastavte datum na 1.1.1900, aby pole datum zůstalo prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Datum by měl být nastavenen v případě eQSL Sent Status &lt;b&gt;Odesláno&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Pole Odesláno nastavené na &lt;b&gt;Neodesílat&lt;/b&gt; nedává smysl pokud je nastaveno datum odeslání QSL. Nastavte datum na 1.1.1900, aby pole datum zůstalo prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Datum by měl být nastavenen v případě Sent Status &lt;b&gt;Odesláno&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>VUCC má chybný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>TX Pásmo by mělo být </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>RX Pásmo by mělo být </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>Vlastní značka nesmí být prázdná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>Vlastní značka má špatný formát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Na základě SOTA Summit, QTH neodpovídat SOTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation>Na základě SOTA Summit, Lokátor neodpovídat SOTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation>Na základě POTA Summit, QTH neodpovídat POTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation>Na základě POTA Summit, Lokátor neodpovídat POTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Na základě SOTA Summit, Mé QTH neodpovídat SOTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation>Na základě SOTA Summit, Můj Lokátor neodpovídat SOTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation>Na základě POTA Summit, Mé QTH neodpovídat POTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation>Na základě POTA Summit, Můj Lokátor neodpovídat POTA definici - očekáváno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>Chyba Callbooku: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;Upozornění: &lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>Kontrola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>Žlutě vyznačená pole obsahují neplatné hodnoty&lt;p&gt;I přes to uložit změny?&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>&amp;Uložit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>U&amp;pravit</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>Detail Filtru QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>Jméno filtru:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>Najít QSO, která odpovídají</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>všem následující podmínkám</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>jakékoliv z následujících podmínek</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>Přidat podmínku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>Rovná se</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>Nerovná se</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>Obsahuje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>Neobsahuje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>Větší než</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>Menší než</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>Začíná</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation>RegExp</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>Nesmí být prázdné</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>QSO Filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>Filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Vymazat</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>Není vybrán žádný Rig profil</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation>Chyba Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>Interní Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>Rig nelze připojit</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation>RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation>Odpojeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation>Vypnout split</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation>RIT: 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation>XIT: 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation>PWR: %1W</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation>Pokročilá nastavení Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation>Cesta k rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Nechte prázdné pro automatickou detekci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation>Automaticky zjistit cestu k Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation>Automatická detekce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation>Verze Rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation>Další parametry:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation>např. -v -v pro podrobné protokolování</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation>Nelze změnit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation>Automatická detekce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation>rigctld nebyl na tomto systému nalezen.\nNainstalujte prosím Hamlib nebo zadejte cestu ručně.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation>Spustitelný soubor (*.exe);;Všechny soubory (*.*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation>Všechny soubory (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation>Vybrat spustitelný soubor rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation>Nenalezeno</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation>Spustitelný soubor rigctld nebyl nalezen v /app/bin/. V Flatpak verzi by se toto nemělo stát.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation>Spustitelný soubor rigctld nebyl nalezen. Nainstalujte prosím Hamlib nebo zadejte cestu v Pokročilém nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation>Nesoulad hlavní verze Hamlib: QLog byl kompilován s Hamlib %1, ale rigctld hlásí verzi %2.%3.%4. ID modelů transceiverů nejsou kompatibilní mezi hlavními verzemi.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation>Port %1 je již používán. Na tomto portu může běžet jiný rigctld nebo aplikace.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation>rigctld byl spuštěn, ale na portu %1 neodpovídá.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation>Nepodařilo se spustit rigctld: %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation>rigctld havaroval.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation>rigctld vypršel časový limit.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation>Chyba zápisu do rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation>Chyba čtení z rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation>Neznámá chyba rigctld.</translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>Není vybrán žádný Rot profil</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>Chyba inicializace</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>Interní Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>Rotátor nelze připojit</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation>Az:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation>Goto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation>Předchozí profil tlačítka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation>Následující profil tlačítka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>Nastavení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>Stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>Jméno profilu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>Vymazat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>Přidat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation>Rigs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>Antény</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>Jméno operátora (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>Lokátor Stanice (povinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>Značka (povinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>Seznam všech dostupných profilů stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA  (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>SIG Informace (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>Jméno QTH (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>VUCC lokátor (nepovinný perametr). Příklad EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>Seznam všech dostupných Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>Seznam všech dostupných antén</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>Model</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation>Port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>Baudrate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation>1200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation>2400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation>4800</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation>9600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation>19200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation>38400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation>57600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation>RX Offset (RIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation>TX Offset (XIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>Rotátory</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation>115200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>Data Bits</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> Profily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>World Wide Flora &amp; Fauna (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>Jméno operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>Zařízení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>Profily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>Popis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation>Šířka svazku </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation>Posun Azimutu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>Platný rozsah hodnot je 0° - 100° (0° nespecifikováno)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>Nespecifikováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>Výchozí rychlost</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>CW ShortCut Profily</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>Kratký popisek tlačítka (max 7 znaků)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>Minimální a maximální TX frekvence. Specifické rozsahy např. ovládání Rigu, se odvozují z povolených pásem v záložce Pásma.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>Rozsah TX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>Vložte RIT nebo transverter offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>Vložte XIT nebo transverter offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>Sync CW Rychlosti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation>5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation>6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation>7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation>8</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation>Stop Bits</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation>1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation>2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation>Flow Control</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation>None</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation>Hardware</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation>Software</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation>Parity</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation>Even</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation>Odd</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation>Space</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation>Mark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation>Poll Interval</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation> ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation>Název serveru</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib nepodporuje změnu cílového portu.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>Výchozí PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>Vložte výchozí PWR (např. když je Rig offline)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>Frekvence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>Stav PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>Název profilu, který se používá jako alias pro volací značku, lokátor, jméno operátora a QTH (povinný parametr) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>SIG (Optional parameter).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>CW Klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>Profil klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>Seznam všech dostupných klíčů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>Režim klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>Přiřazený klíč</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>Rychlost CW Klíče</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>Typ Portu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>Serial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>Uživatelská tlačítka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>Tlačítko 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>Tlačítko 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>Tlačítko 3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>Tlačítko 4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>Značka operátora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>Značka logující stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>Volací znak operátora (volitelný, pokud se liší od volacího znaku stanice)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>Okres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation>Okres (nepovinný parametr)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>Prohodit pádla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>Interface</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translation>Typ PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translation>PTT Port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>DX Spoty do Rigu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation>Frek. sidetone:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation>&lt;DXCALL&gt; = DX značka\n&lt;NAME&gt; = DX Jméno operátora\n&lt;NAME&gt; = DX Jméno operátora\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Pozdrav GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = Má značka \n&lt;MYNAME&gt; = Mé jméno\n&lt;MYQTH&gt; = Mé QTH\n&lt;MYLOCATOR&gt; = Můj Lokátor\n&lt;MYGRID&gt; = Můj Lokátor\n&lt;MYSIG&gt; = Můj SIG\n&lt;MYSIGINFO&gt; = Mé SIG Info\n&lt;MYIOTA&gt; = Má IOTA\n&lt;MYSOTA&gt; = Má SOTA\n&lt;MYWWFT&gt; = Mé WWFT\n&lt;MYVUCC&gt; = Mé VUCC\n&lt;MYPWR&gt; = Můj Výkon ve W\n&lt;EXCHSTR&gt; = Contest Exchange\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T) RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Pozdrav GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = Má značka \n&lt;MYNAME&gt; = Mé jméno\n&lt;MYQTH&gt; = Mé QTH\n&lt;MYLOCATOR&gt; = Můj Lokátor\n&lt;MYGRID&gt; = Můj Lokátor\n&lt;MYSIG&gt; = Můj SIG\n&lt;MYSIGINFO&gt; = Mé SIG Info\n&lt;MYIOTA&gt; = Má IOTA\n&lt;MYSOTA&gt; = Má SOTA\n&lt;MYWWFT&gt; = Mé WWFT\n&lt;MYVUCC&gt; = Mé VUCC\n&lt;MYPWR&gt; = Můj Výkon ve W\n&lt;EXCHSTR&gt; = Contest Exchange\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Rychlost +5 WPM (&lt;++&gt; = +10 WPM, atd.)\n&lt;-&gt; = Rychlost -5 WPM (&lt;--&gt; = -10 WPM, atd.)\n</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation>Spustit démon rigctld pro sdílení transceiveru s jinými aplikacemi (např. WSJT-X)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation>Sdílet transceiver přes port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation>Pokročilé…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation>Port Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation>CIV Addr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation>Automaticky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Hledání na Webu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>Zadejte URL, kterou chcete použít pro rychlé vyhledávání. Makro &lt;DXCALL&gt; bude nahrazeno aktuální volací značkou</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>Test URL s vlastní značkou</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation>Test</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation>Kluby</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>Seznam aktivních</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>Okamžítý Upload</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>Toto není heslo. Toto je kód pro nahrávání, který jste obdrželi e-mailem po registraci na HRDLOG.net</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translation>Upload Code</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>Pokud je povoleno a Rig je připojen, pak QLog pravidelně odesílá zprávy On-Air do HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>Odesílat On-Air</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Nechte prázdné pro automatickou detekci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation>Automaticky zjistit cestu k TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation>Automatická detekce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation>Verze TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>Výchozí klíč API</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>API klíče specifické pro volací značku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>Klíč API</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation>Nebezpečná zóna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation>&lt;b&gt;⚠ Toto je nebezpečná zóna. Pokračujte opatrně, protože provedené akce nelze vrátit zpět a mohou mít zásadní dopad na váš log.&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation>Smazat všechny QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation>Smazat všechna hesla z bezpečného úložiště</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>Koncový bod</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>Jiné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;Oznámení o zabezpečení:&lt;/b&gt; QLog ukládá všechna hesla do zabezpečeného úložiště. ON4KST bohužel používá protokol, kde je toto heslo odesíláno přes nezabezpečený kanál jako prostý text.&lt;/p&gt;&lt;p&gt;Při výběru hesla pro tuto službu buďte opatrní, protože vaše heslo je odesíláno přes nezabezpečený kanál v podobě prostého textu.&lt; /p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>Znak „&gt;“ je interpretován jako značka pro počáteční pozici kurzoru ve sloupci Report.&lt;br&gt;Př.: „5&gt;9“ znamená, že kurzor bude umístěn na druhém znaku</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>UDP Forward</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá nezměněné UDP WSJTX pakety. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>Použít Multicast</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>Povolit/zakázat možnost Multicast pro WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>Multicast Adresa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>Zadejte Multicast adresu. &lt;br&gt;Na některých Linux systémech může být nutné povolit Multicast pro Loopback interface.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation>TTL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>Time-To-Live určuje vzdálenost&lt;br&gt;, do které se paket Multicastu v síti šíří. </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation>Obarvit CQ spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation>Povolit / zakázat odesílání barevně kódovaných stavových indikátorů zpět do WSJT-X pro každou</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>Notifikace</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation>DX Spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá UDP notificate z DX Clusteru. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>Změny QSO </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá UDP notificate o novém/aktualizovaném/vymazaném QSO. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation>Wsjtx CQ Spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá UDP notificate s WSJTX CQ Spoty. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>Stav Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá UDP notifikace Stavu Rigu. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>GUI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>Formát času</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24hodinový</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation>AM/PM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation>Jednotkový systém</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation>Metrický</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation>Imperiální</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>Formát data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>Systémový</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>Vlastní</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Dokumentace formátu času&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation>Upozornění na Spoty</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Seznam IP adres, na které QLog přeposílá UDP notifikace Upozornění na Spoty. &lt;/p&gt;Adresy jsou odděleny mezerou a mají formát IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation>LogID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;LogID pro aktuální log&lt;/p&gt;LogID se posílá ve všech UDP notifikacích jako unikátní identifikátor.&lt;p&gt; ID je generováno automaticky a nemůže být změněno.&lt;/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation>Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>Pořadí dotazů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>Primární</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>Sekundární</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>Uživatelské jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>Heslo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>Port, kde QLog poslouchá příchozí zprávy z WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation>např. 192.168.1.1:1234 192.168.2.1:1234</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>Procházet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>Cesta k TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>Síť</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation>ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>Výkon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation>VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Použijte COMxx pro Windows or cestu ke COM portu pro Unix-like OS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>Seznam všech dostupných CW Shortcut Profilů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>Vlastnosti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation>QSY Výmaz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;Oznámení:&lt;/b&gt; Pro přístup k podrobným informacím se doporučuje alespoň předplatné QRZ XML. Bez předplatného získáte od QRZ jen omezené údaje, například chybějící grid a další pole.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation>Sync &amp;&amp; QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>QSO jsou okamžítě nahrána</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>Používám interní TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>Pásma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>Druhy provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>Jméno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>Report</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>Stav</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>Vypnuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation>WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation>Stiskněte &lt;b&gt;Upravit&lt;/b&gt; pro potvrzení změny profilu nebo &lt;b&gt;Zrušit&lt;/b&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>Nesmí být prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>Upravit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>Special - Omnirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation>Nelze změnit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>Pořátek (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>Konec (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation>Dummy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>Morse Over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation>CWDaemon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation>FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation>Single Paddle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation>IAMBIC A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation>IAMBIC B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation>Ultimate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>Vybrat soubor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation>Automatická detekce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation>TQSL nebyl na tomto systému nalezen.\nNainstalujte prosím TQSL nebo zadejte cestu ručně.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation>Nenalezeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation>Sdílení transceiveru je k dispozici pouze pro ovladač Hamlib</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation>Sdílení transceiveru není k dispozici pro síťové připojení</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation>Smazat hesla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation>Všechna hesla byla smazána</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation>Mažu všechna QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation>Chyba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation>Nepodařilo se smazat všechna QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>členů</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>Je vyžadováno připojení do internetu během startu aplikace</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>Popis</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>Zkratky</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>Konflikt s vestavěnou klávesovou zkratkou</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>Konflikt s klávesovou zkratkou</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>Vybraná QSO pro nahrání</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>Vybraná QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>Nahrát</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>Hledat</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>Statistiky</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>Moje značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>Časové období</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>Typ grafu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>Můj lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSO za</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation>Uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>Procenta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation>Top 10</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>Histogram</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>Moje Anténa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>Zobrazit na mapě</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>Můj Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>do</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>Pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>rok</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>měsíc</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>den v týdnu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>hodinu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>podmínky šíření</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>Potvrzeno / Nepotvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>Země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>Velké čtverce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>Vzdálenost</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation>QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>Potvrzené / Pracováno Lokátory</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>Ned</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>Pon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>Út</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>Stř</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>Čtvr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>Pát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>Sob</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>Neurčeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation>Potvrzeno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation>Nepotvrzeno </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation>Žádný uživatelský filtr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>Přes 50000 QSO. Zobrazit je?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation>Vykreslování QSO…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>Vše</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>Rig 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>Rig 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation>Došlo k chybě</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>Změna stavu Rigu</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig není připojen</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>Nevyplněno</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>Čas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>Zpráva</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>Nahrát QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>Filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>Profil stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>Moje značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>Zahrnout QSO se statusem</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Za normálních okolností tento status znamená &lt;b&gt;Neodesílat&lt;/b&gt;.&lt;br/&gt;Avšak, někdy může být požadováno toto nastavení ignorovat.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>Ne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Za normálních okolností tento status znamená &lt;b&gt;&quot;Ignorovat&quot;&lt;/b&gt;.&lt;br/&gt;Avšak, někdy může být požadováno toto nastavení ignorovat.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>Ignorovat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>Žádné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>Odchozí QSL Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>Poznámka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>Pole QSL zprávy</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>QTH Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>Tato volba smaže všechna QSO v Clublog&lt;br&gt;a na základě filtru nahraje všechna QSO bez ohledu na jejich stav.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>Vymazat Clublog a znovu nahrát QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation>LoTW / TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation>Umístění stanice TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>Profil stanice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translation>Nahrát vše znovu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>Zobrazit QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;Nahrát</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation>Nespecifikováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>Skrýt QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>Nahrávám na %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>Zrušit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>Upozornění QLog - %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>Nelze aktualizovat stav QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>Není možné nahrát QSO: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>Informace QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>Nebyl nalezen žádný QSO k nahrání.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>QSO byly nahrány do vybraných služeb</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>Čas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>Druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>Nahrát do</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Hodnoty jsou použity v případě, když importovaný záznam má příslušné ADIF pole prázdné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>Jakýkoliv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation>Volací značka (%1) a čtverec (%2) neodpovídají vybraným filtrům</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation>Volací značka lokace (%1) neodpovídá vybrané volací značce (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation>Čtverec lokace (%1) neodpovídá vybranému čtverci (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>Neurčeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>Služba není správně nastavena.&lt;p&gt; Prosím, použijte dialog &lt;b&gt;Nastavení&lt;/b&gt; pro konfiguraci služby.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>Vzdálenost</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation>Azimut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>Poznámka</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>Čas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation>expK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation>R</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation>GMF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation>Au</translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>Čas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>WSJTX Filtry</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>Obecné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Status v logu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>Nové pásmo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>Nový druh provozu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>Nová země</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>Nový slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>Pracováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>Potvrzeno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>Severní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>Evropa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>Jižní Amerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>Antarktida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>Oceánie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>Vzdálenost větší než</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR lepší než</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>Pokročilé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>Není aktívní žádný Club List</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>Značka</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>Lokátor</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>Vzdálenost</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation>SNR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>Aktivita</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>Zpráva</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>Člen</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>Filtrováno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>Zobrazení sloupců...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>Filtr...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Který sloupec by měl být zobrazen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>Filtr</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation>Spustit ve specifickém jmeném prostoru.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation>namespace</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation>Soubor s překladem - absolutní nebo relativní cesta a jméno QM souboru.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation>path/QM-filename</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation>Nastavit jazyk. Příklad &lt;code&gt;: &apos;en&apos; nebo &apos;en_US&apos;. Ignoruje OS nastavení.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation>kód</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>Zapsat ladící zprávy do souboru</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation>Zpracovat čekající import databáze (pro interní použití)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation>Vynutit aktualizaci všech seznamů hodnot (DXCC, SATy atd.)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/qlog_de.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"de_DE\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>Aktivitätseditor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>Aktivitätsname</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>Layout</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>Fensteranordnung:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>Gespeichert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>Verfügbare Felder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>Liste der Felder, die verwendet werden können</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>Zeile A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>Ausgewählte Felder aus der Liste der verfügbaren Felder in die Zeile A verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>Ausgewähltes Feld aus der Zeile A entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>Liste der Felder in der ersten Variablenzeile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>Ändern Sie die Reihenfolge. Ausgewähltes Feld nach oben verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>Ändern Sie die Reihenfolge. Ausgewähltes Feld nach unten verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>Zeile B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>Ausgewählte Felder aus der Liste der verfügbaren Felder in die Zeile B verschieben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>Ausgewähltes Feld aus der Zeile B entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>Liste der Felder in der zweiten Variablenzeile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>Spalte A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>Liste der Felder in der ersten QSO-Detail Spalte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>Spalte B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>Liste der Felder in der zweiten QSO-Detail Spalte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>Spalte C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>Liste der Felder in der dritten QSO-Detail-Spalte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>Neue QSO Zeilen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>Neue Spalten in den QSO Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>Werte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>Wenn nicht aktiviert, ändert sich das Profil nicht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>Automatisch verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>Verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>Felder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>Darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>Ungespeichert</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>Alarmregel Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>Regelname</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>Aktiviert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>Quellen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation>Neuer Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation>Neuer Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation>Neuer Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation>Neues Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>DX Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>Verwende Perl-ähnliche reguläre Ausdrücke</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>Land</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>Protokollstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>Spot-Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>Sonderprogramme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>Betriebsarten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>Nordamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>Antarktis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>Südamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>Asien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>Ozeanien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>Darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>Keine Clubliste aktiviert</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>Alarmregeln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Regeln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Status</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>Regelname</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>Aktualisiert</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>Letzte Aktualisierung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>Letzter Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>Benachrichtigungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>Löschen älter als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>Nie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translation>Regeln bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translation>Spaltensichtbarkeit...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translation>Auszeichnungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translation>Optionen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translation>Auszeichnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translation>Eigener DXCC Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation>Benutzer-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translation>Bestätigt durch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translation>nur nicht gearbeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation>Nur unbestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translation>Anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translation>POTA Jaeger</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translation>POTA Aktivierer</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation>Locator 2 Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation>Locator 4 Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation>Locator 6 Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation>Locator %1 Zeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation>Countys der USA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation>Russische Distrikte</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation>Japanische Städte / Ku / Gun</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation>Countys Neuseelands</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation>Spanische DME</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation>Ukrainische Distrikte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation>Kein Benutzerfilter</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translation>Nordamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translation>Südamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>Asien</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translation>Antarktis</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translation>Ozeanien</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation>Gelöscht</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>Slot: </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>Wartend</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>Ein zusätzliches Bandplan-Fenster erstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>Ältere löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>Nie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>Alle löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>Aktuelles Band löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>Bandplan</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>Band anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>RX zentrieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation>Notruffrequenzen anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>Rig nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>Rig unterstützt kein CW-über-CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Kann Text nicht an Rig senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Kann Keyer Geschwindigkeit nicht einstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Kann Textübertragung nicht beenden</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>Geschwindigkeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation>CW-Sendung sofort stoppen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>Halt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>Sendefenster und Echo-Konsole löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>Zu versendender Text</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>Funktionstasten Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>CW-Keyer Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>Gesendeter Text</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>Wiederholter Text</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>Wechseln Sie zwischen dem Senden &lt;b&gt;Wort&lt;/b&gt; für Wort (getrennt durch Leerzeichen) &lt;br&gt; und dem Senden als &lt;b&gt;Ganzes&lt;/b&gt; (getrennt durch eine neue Zeile).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>CW Console - Halt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>Rig muss verbunden sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>Wort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>Ganze</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>Kann Text nicht senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Kann Keyer-Geschwindigkeit nicht einstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Kann Textübertragung nicht beenden</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>Verbundenes Programm ist nicht FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer ist nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>Kann Text nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>Kann das Kommando Clear nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>Kann das Kommando TX nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>Kann das Text-Kommando nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>Kann das Kommando Stop nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>Kann das Kommando Abort nicht an FLDigi senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>Kann keine Daten von FLDigi empfangen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>Zeitüberschreitung der FLDigi-Verbindung</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>FLDigi Verbindungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>FLDigi Kommandofehler</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>Kein CW-Keyer Profil ausgewählt</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>Interner Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>Verbindungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>Kann die Keyer-Verbindung nicht herstellen</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>Angeschlossenes Gerät ist kein WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Kann Text nicht an Rig senden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>Kommunikationsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Kann Keyer-Geschwindigkeit nicht einstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Kann Textübertragung nicht beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation>4000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation>2000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation>1333 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation>1000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation>800 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation>666 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation>571 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation>500 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation>444 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation>400 Hz</translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation>Cabrillo exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation>Datei:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation>Formatvorlage:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation>Verwalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation>Benutzerfilter:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation>Datum/Uhrzeit:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation> - </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation>Station &amp; Kategorien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation>Rufzeichen:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation>Operatoren:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation>Band:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation>Betriebsart:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation>Leistung:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation>Operator:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation>Unterstützt:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation>Station:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation>Sender:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation>Zeit:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation>Zusätzlich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation>Name:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation>Email:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation>Adresse:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation>Max. 6 Zeilen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation>Standort:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation>Club:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation>Freitext:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation>Cabrillo-Dateien (*.log);;CBR-Dateien (*.cbr);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation>QSO(s): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation>QSOs: ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation>QLog Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation>Bitte wählen Sie eine Contest-Vorlage aus.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation>Bitte wählen Sie eine Ausgabedatei aus.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation>Kein Rufzeichen verfügbar. Überprüfen Sie Ihre Filter.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation>Exportabfrage konnte nicht vorbereitet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation>QSOs für den Export konnten nicht abgefragt werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation>Datei %1 kann nicht zum Schreiben geöffnet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation>Cabrillo wird exportiert…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation>QLog Information</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation>\n            <numerusform>%n QSOs in die Cabrillo-Datei exportiert.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation>Alle Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation>2m (144 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation>1.25m (222 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation>70cm (432 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation>33cm (902 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation>23cm (1.2 GHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation>Licht</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation>VHF 3-Band</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation>Nur VHF FM</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation>Gemischt</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation>Einmannbetrieb</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation>Mehrmannbetrieb</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation>Log prüfen</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation>Nicht assistiert</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation>Assistiert</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation>Fest</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation>Mobil</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation>Rover</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation>Rover Limited</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation>Expedition</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation>Schule</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation>Verteilt</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation>Eins</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation>Zwei</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation>Begrenzt</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation>Unbegrenzt</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation>6 Stunden</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation>12 Stunden</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation>24 Stunden</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation>Klassisch</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation>Novize/Techniker</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation>Über 50</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation>Text (linksbündig)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation>Frequenz (kHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation>Zeit (HHMM)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation>Datum (JJJJ-MM-TT)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation>RST kurz (letzte Ziffer weglassen)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation>Großbuchstaben</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation>Modus (Cabrillo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation>Nummer mit Nullen</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation>Cabrillo-Vorlagenverwaltung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation>Vorlage importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation>Importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation>Vorlage exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation>Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation>Neue Vorlage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation>Neu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation>Vorhandene Vorlage kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation>Kopieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation>Vorlage löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation>Vorlagenname:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation>Contest-Name:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation>Standardmodus:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation>QSO-Zeilen-Spalten:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation>Contest-Name gemäß den Regeln. Es ist möglich, eine benutzerdefinierte Zeichenkette einzugeben, falls sie nicht in der Liste enthalten ist.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation>Nr.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation>QSO-Feld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation>Formatierer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation>Breite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation>Etikett</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation>Zeile hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation>Ausgewählte Zeile entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation>Neue Vorlage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation>Kopie – %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation>Vorlage löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation>Vorlage „%1“ löschen?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation>Vorlage importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation>QLog Cabrillo-Vorlage (*.qct)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation>Import fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation>Vorlage exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation>Export fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation>Datei konnte nicht geschrieben werden: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation>Datei nicht gefunden: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation>Datei kann nicht geöffnet werden: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation>Ungültige Vorlagendatei: Name fehlt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation>Datenbanktransaktion kann nicht gestartet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation>QLog Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation>Vorlage „%1“ kann nicht gespeichert werden: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Das sekundäre Callbook wird verwendet&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>Chatraum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>Verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>Neu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>QLog Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>ON4KST Chat ist nicht richtig konfiguriert.&lt;p&gt;Bitte verwenden Sie den &lt;b&gt;Einstellungen&lt;/b&gt; Dialog um ihn zu konfigurieren.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>Aktiv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>Inaktiv</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>SU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>Ungültiger API-Schlüssel</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>Clublog-Anfrage für Rufzeichen %1 fehlgeschlagen.&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Einstellung der Spaltensichtbarkeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>Allgemein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>Eigene Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>Mitglieder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>Bedingungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>Conteste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>Andere</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>erledigt</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>Alle abwählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>Alle auswählen</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Spaltensichtbarkeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>erledigt</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation>DXCC Einträge</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation>SAT Info</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation>SOTA Gipfel</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation>WWFF Datensätze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation>IOTA Datensätze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation>POTA Datensätze</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation>Mitgliedschaftsverzeichnis</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation>Clublog CTY.XML</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation>Werteliste</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>Afghanistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>Agalega &amp; St. Brandon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>Aland-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>Alaska</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>Albanien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>Algerien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>Amerikanischen Samoa-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>Amsterdam &amp; St. Paul Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>Andamanen und Nikobaren.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>Andorra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>Angola</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>Anguilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>Annobon-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>Antarktis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>Antigua und Barbuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>Argentinien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>Armenien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>Aruba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>Ascension-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>Asiatisches Russland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>Asiatische Türkei</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>Austral-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>Australien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>Österreich</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>Aves-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>Aserbaidschan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>Azoren</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>Bahamas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>Bahrain</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>Baker- und Howlandinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>Balearen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>Banaba-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>Bangladesch</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>Barbados</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>Weißrussland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>Belgien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>Belize</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>Benin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>Bermuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>Bhutan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>Bolivien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>Bonaire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>Bosnien-Herzegowina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>Botswana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>Bouvet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>Brasilien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>Britische Jungferninseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>Brunei Darussalam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>Bulgarien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>Burkina Faso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>Burundi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>Kambodscha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>Kamerun</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>Kanada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>Kanarische Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>Kap Verde</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>Cayman Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>Zentralafrikanische Republik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>Zentralkiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>Ceuta und Melilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>Tschad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>Chagos-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>Chatham-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>Chesterfield-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>Chile</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>China</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>Weihnachtsinsel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>Clipperton-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>Kokosinseln (Keelinginseln)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>Kokosinsel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>Kolumbien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>Komoren</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>Conway-Riff</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>Korsika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>Costa Rica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>Elfenbeinküste</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>Kreta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>Kroatien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>Crozet-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>Kuba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>Curacao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>Zypern</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>Tschechien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>DVR Korea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>Dem. Republik Kongo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>Dänemark</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>Insel Desecheo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>Dschibuti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>Dodekanes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>Dominica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>Dominikanische Republik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>Ducie-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>Ost-Malaysia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>Osterinsel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>Ostkiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>Ecuador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>Ägypten</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>El Salvador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>England</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>Äquatorialguinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>Eritrea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>Estland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>Äthiopien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>Europäisches Russland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>Falkland Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>Färöer Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>Deutschland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>Fernando de Noronha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>Fidschi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>Finnland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>Frankreich</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>Franz-Josef-Land</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>Französisch-Guayana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>Französisch Polynesien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>Gabun</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>Galapagos Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>Georgia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>Ghana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>Gibraltar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>Glorioso-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>Griechenland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>Grönland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>Grenada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>Guadeloupe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>Guam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>Guantanamo Bay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>Guatemala</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>Guernsey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>Guinea-Bissau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>Haiti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>Hawaii</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>Heard-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>Honduras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>Hongkong</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>Ungarn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>ITU HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>Indien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>Indonesien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>Iran</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>Irak</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>Irland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>Isle of Man</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>Israel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>Italien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>Jamaika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>Jan Mayen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>Japan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>Jersey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>Johnston-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>Jordanien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>Juan-Fernandez-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>Juan de Nova &amp; Europa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>Kaliningrad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>Kasachstan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>Kenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>Kerguelen-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>Kermadec-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>Königreich Eswatini</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>Kure-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>Kuwait</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>Kirgisistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>Lakshadweep-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>Laos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>Lettland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>Libanon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>Lesotho</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>Liberia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>Libyen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>Liechtenstein</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>Litauen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>Lord-Howe-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>Luxemburg</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>Macau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>Macquarie-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>Madagaskar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>Madeira-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>Malawi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>Malediven</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>Mali</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>Malpelo-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>Marianen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>Marktriff</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>Marquesas-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>Marshallinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>Martinique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>Mauretanien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>Mauritius</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>Mayotte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>Mellish Riff</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>Mexiko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>Mikronesien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>Midway-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>Minami Torishima</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>Moldawien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>Monaco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>Mongolei</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>Montenegro</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>Montserrat</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>Marokko</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>Berg Athos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>Mosambik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>Myanmar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation>Subantarktische Inseln Neuseelands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>Namibia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>Nauru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>Navassa-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>Nepal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>Niederlande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>Neu-Kaledonien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>Neuseeland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>Nicaragua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>Niger</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>Nigeria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>Niue</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>Norfolkinsel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>Nordcookinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>Nordmazedonien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>Nordirland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>Norwegen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>Ogasawara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>Oman</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>Pakistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>Palau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>Palästina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>Palmyra und Jarvis-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>Panama</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>Papua Neu-Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>Paraguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>Peru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>Peter-1-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>Philippinen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>Pitcairninsel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>Polen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>Portugal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>Pratas-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>Puerto Rico</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>Katar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>Republik Korea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>Republik Kosovo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>Republik Südsudan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>Republik Kongo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>Insel La Réunion</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>Revillagigedo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>Rodriguez-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>Rumänien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>Rotuma-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>Ruanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>Saba und St. Eustatius (Statia)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>Sable-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>San Andrés und Providencia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>San Felix und San Ambrosio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>San Marino</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>São Tomé und Príncipe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>Sardinien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>Saudi-Arabien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>Scarborough-Riff</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>Schottland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>Senegal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>Serbien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>Seychellen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>Sierra Leone</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>Singapur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>Sint Maarten</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>Slowakische Republik</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>Slowenien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>Salomon-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>Somalia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>Südafrika</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>Südliche Cookinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>Insel Südgeorgien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>Südliche Orkney-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>Südliche Sandwichinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>Südshetlandinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>Souveräner Malteserorden</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>Spanien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>Spratly-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>Sri Lanka</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>St. Barthelemy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>St. Helena</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>St. Kitts und Nevis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>St. Lucia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>St. Martin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>St. Peter und St. Paul</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>St. Pierre und Miquelon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>St. Vincent</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>Sudan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>Surinam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>Spitzbergen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>Swains-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>Schweden</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>Schweiz</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>Syrien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>Taiwan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>Tadschikistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>Tansania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>Provinz Temotu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>Thailand</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>Gambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>Timor - Leste</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>Togo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>Tokelau-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>Tonga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>Trindade und Martim Vaz</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>Trinidad &amp; Tobago</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>Tristan da Cunha und Gough-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>Tromelin-Insel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>Tunesien</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>Turkmenistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>Turks- und Caicosinseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>Tuvalu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation>Souveräne Militärbasen Akrotiri und Dekelia </translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>Amerikanische Jungferninseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>Uganda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>Ukraine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>Vereinigte Arabische Emirate</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>Vereinte Nationen HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>Uruguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>Usbekistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>Vanuatu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>Vatikanstadt</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>Venezuela</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>Vietnam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>Wake Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>Wales</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>Wallis- und Futuna-Inseln</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>West Malaysia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>Westkiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>Westsahara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>Willis Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>Jemen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>Sambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>Zimbabwe</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation>DXCC-Einreichungsliste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation>Optionen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation>Eigener DXCC Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation>Benutzer-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation>Kategorie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation>Gemischt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation>Bestätigt durch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation>Anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation>Noch nicht eingereicht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation>Eingereicht (nicht anerkannt)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation>Bereits anerkannt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation>Bandbereich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation>Vordefinierte 5-Band-DXCC-Bänder auswählen (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation>5-Band-DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation>Alle DXCC-berechtigten Bänder auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation>Alle DXCC-Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation>Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation>Wählen Sie die Optionen oben aus und die Liste wird automatisch aktualisiert.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation>Die oben aufgeführten Kontakte in eine ADIF-Datei exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation>Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation>Kein Benutzerfilter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation>Beliebiges Band (Entity-Ebene)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation>5-Band-DXCC (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation>Benutzerdefinierte Bandauswahl</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation>Entität</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation>Präfix</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation>Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation>Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation>Eingereicht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation>Anerkannt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation>ADIF exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation>Keine Kontakte zum Exportieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation>Kontaktaufzeichnungen konnten nicht abgerufen werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation>DXCC-Einreichungsliste als ADIF exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation>beliebiges Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation>5-Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation>alle Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation>%1 ausgewählte Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation>Keine Kontakte entsprechen den ausgewählten Kriterien.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation>%1 %2 %3 — DXCC %4 / %5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation>Band-Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation>Entität</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation>Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation>Einträge</translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>Neuer Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>Neues Band</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>Neuer Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>Neues Band&amp;Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>Neuer Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>Ja</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>Nein</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>Angefordert</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>Wartend</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>Ungültig</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>Büro</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>Direkt</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>Elektronisch</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>Geändert</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation>Grayline</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>Andere</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>Nicht gehört</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>Unsicher</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation>Straight Key</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation>Sideswiper</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation>Mechanical semi-automatic keyer or Bug</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation>Mechanical fully-automatic keyer or Bug</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation>Single Paddle</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation>Dual Paddle</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation>Computergesteuert</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation>Bestätigt (AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation>Bestätigt (non-AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation>Unbekannt</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <oldsource>Aircraft Scatte</oldsource>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation>Aurora-E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation>Aurora</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation>Back scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation>EchoLink</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation>Erde-Mond-Erde</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation>Sporadic E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation>F2 Reflektion</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation>Feldbedingte Unregelmäßigkeiten</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation>Bodenwelle</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation>Internet-assisted</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation>Ionoscatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation>IRLP</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation>Sichtlinie</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation>Entwickler-Tools</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation>Debug-Log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation>Protokollierungsregeln:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation>z. B. qlog.ui.*.runtime=true</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation>Anwenden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation>Debug-Datei erzeugen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation>Datei exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation>SQL-Konsole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation>SQL öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation>SQL speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation>SQL ausführen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation>Exportieren als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation>SQL-Abfrage hier eingeben... Strg+Eingabe = ausführen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation>SQL-Abfrage öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation>SQL-Dateien (*.sql);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation>Fehler beim Öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation>Datei kann nicht geöffnet werden:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation>SQL-Abfrage speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation>Fehler beim Speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation>Datei kann nicht gespeichert werden:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation>Abfrage in %1 gespeichert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation>Fehler: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation>%1 Zeile(n) angezeigt (gekürzt auf %2) in %3 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation>%1 Zeile(n) in %2 ms zurückgegeben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation>Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation>Keine Ergebnisse zum Exportieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation>Exportfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation>Datei kann nicht zum Schreiben geöffnet werden:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation>%1 Zeile(n) nach %2 exportiert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation>Textdateien (*.txt);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation>CSV-Dateien (*.csv);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation>ADIF exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation>Keine gültigen Kontakt-IDs im Ergebnissatz gefunden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation>Kontaktaufzeichnungen konnten nicht abgerufen werden:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation>Keine passenden Kontakte in der Datenbank gefunden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation>Protokollierungsregeln zurückgesetzt (Standard)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation>Protokollierungsregeln angewendet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation>Debug-Log speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation>Derzeit wird keine Debug-Logdatei geschrieben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation>Logdateien (*.log);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation>Debug-Log in %1 gespeichert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation>Die Debug-Logdatei konnte nicht kopiert werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation>Dateiprotokollierung ist deaktiviert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation>Logdatei: %1</translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>QSLs herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>eQSL QTH Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSLs seit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSO seit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>Eigenes Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;Herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW ist nicht richtig eingerichtet.&lt;p&gt; Bitte verwende den &lt;b&gt;Einstellungen&lt;/b&gt; Dialog, um es einzurichten.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL ist nicht richtig eingerichtet.&lt;p&gt; Bitte verwende den &lt;b&gt;Einstellungen&lt;/b&gt; Dialog, um es einzurichten.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>Herunterladen von %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>Verarbeite %1 QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>Aktualisierung von %1 fehlgeschlagen: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>QLog Information</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>Kein Dienst ausgewählt</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>DX Cluster Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>Allgemeine Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>Nordamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>Antarktis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>Südamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>Asien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>Ozeanien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>Betriebsarten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>Log Status</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>Neuer Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>Neuer Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>Neues Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>Neuer Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>Erweiterte Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>Spotter Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>Folgende Spots nicht anzeigen, wenn sie dasselbe Rufzeichen haben und der Unterschied in Frequenz und Zeit kleiner als die eingestellten Parameter ist</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>Spot-Dubletten entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translation>Zeitunterschied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translation>Frequenzunterschied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation> kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>Keine Clubliste aktiviert</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>Zeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>Spotter Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>Land</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>Sende DX-Cluster Kommando</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>Gefiltert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>An alle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>Konsole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>Volltextsuche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>Suchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>Suche schließen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>Filter...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>Filter DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translation>Spot letztes QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>Letzten QSO-Spot senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>HF Statistik anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>VHF Statistik anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>WCY anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>WWV anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>Spaltensichtbarkeit...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>Beim Start verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>Automatische Verbindung nach dem Start</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>Löschen Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>DXC - Löschen Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>Passwort löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>Spots merken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>Spots werden nicht gelöscht, wenn eine Verbindung zu einem neuen DX-Cluster hergestellt wird.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>Alle Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>Suchen...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC- Suchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Welche Spalten sollen angezeigt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>Füge &lt;b&gt;hostname:port&lt;/b&gt; eines DXC Servers ein.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>Verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>Mein Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>Automatisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>Verbinden...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>DX-Cluster vorübergehend nicht erreichbar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>DXC-Serverfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>Ungültiges Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>Sicherheitshinweis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>Das Passwort kann über einen ungesicherten Kanal gesendet werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>Benutzername</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>Trennen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>DX-Cluster Kommando</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>Falsches Passwort oder QTHProfil-Id</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation>Keine ADIF-Datei in der eQSL-Antwort gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>Falscher Benutzername oder Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>Unbekannter Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>Kann temporäre Datei nicht öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>Kann das Bild nicht in die Datei speichern</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>Unbekannte Antwort von eQSL</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>Aktivitätseditor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>Aktivitäten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>Ausgewählte QSOs exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>Export-Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>Export-Felder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>Wählen Sie eine der vordefinierten Auswahl von ADIF-Feldern aus oder definieren Sie Ihre eigene Auswahl</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>Bearbeiten Sie die aktuelle Auswahl von ADIF-Feldern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>Markieren Sie exportierte QSOs als gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>Nur QSOs exportieren, die mit den aktiven Filtern übereinstimmen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>Nur QSOs exportieren, die dem ausgewählten Datumsbereich entsprechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>Datumsbereich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>Nur QSOs exportieren, die mit dem ausgewählten eigenen Rufzeichen übereinstimmen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>Eigenes Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>Nur QSOs exportieren, die mit dem ausgewählten eigenen Gitterfeld übereinstimmen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>Eigenes Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>Exportieren Sie nur QSOs, die der ausgewählten QSL-Ausgang-Via entsprechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>QSL Ausgang via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>Unüblichen QSO Sent-Status einbeziehen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>Send-Status mit einbeziehen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Unter normalen Umständen bedeutet dieser Status &lt;b&gt;&quot;ignorieren/fehlerhaft&quot;&lt;/b&gt;.&lt;br/&gt;Manchmal kann es jedoch sinnvoll sein, diese Einstellung beim Senden einer QSL zu ignorieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>&quot;Ignorieren&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Unter normalen Umständen bedeutet dieser Status &lt;b&gt;&quot;nicht senden&quot;&lt;/b&gt;.&lt;br/&gt;Manchmal kann es jedoch sinnvoll sein, diese Einstellung beim Senden einer QSL zu ignorieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>&quot;Nein&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>Bereits gesendete QSOs erneut senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>Bereits gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>Benutzer-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>QSOs exportieren, die dem ausgewählten Benutzer-QSO-Filter entsprechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation>Stationsprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>Datei</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation>JSON</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>QSOs exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation>Nur QSOs exportieren, die tomuto Stationsprofil entsprechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation>Export wird ausgeführt…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>Exportierte QSOs können nicht als gesendet markiert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>Allgemein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>QSL-spezifisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>Benutzerdefiniert 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>Benutzerdefiniert 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>Benutzerdefiniert 3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation>Daten und Einstellungen packen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation>Geben Sie ein Passwort ein, um die gespeicherten Zugangsdaten zu verschlüsseln.\nDieses Passwort wird später benötigt, um sie wiederherzustellen.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation>Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation>Zufällig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation>Passwort bestätigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation>Passwörter nach dem Export aus dem Credential Store löschen</translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>Zeitüberschreitung</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>FLRig-Antwortzeitüberschreitung</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>Netzwerkfehler</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>Antwortnachricht fehlerhaft</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translation type=\"unfinished\">Keine</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translation>CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translation>PTT-Typ kann nicht eingestellt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translation>PTT-Share kann nicht eingestellt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation>CI-V-Adresse kann nicht gesetzt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>Nicht unterstützter Rig-Treiber</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>auto_power_on kann nicht gesetzt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation>no_xchg kann nicht auf 1 gesetzt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>Verbindung fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation>Fehler beim Setzen der TX-Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>Fehler bei der Frequenzeinstellung</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation>Fehler beim Setzen von Split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>Fehler bei der Moduseinstellung</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation>Fehler beim Setzen des Split-Modus</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>Fehler beim Auslösen der PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>Fehler bei der Frequenzabfrage</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>Fehler bei der Mode-Abfrage</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>Fehler beim Abrufen des VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>Nicht unterstützter Rotor-Treiber</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>Verbindung fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>Fehler beim Einstellen der Position</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>Fehler beim Abrufen der Position</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>Importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>Voreinstellung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>Eigener Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>Alle oder nur QSOs aus dem angegebenen Zeitraum importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>Datei</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>Eigenes Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation>Wenn DXCC im importierten Datensatz fehlt, wird es aus dem Rufzeichen ermittelt.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation>Fehlende DXCC-Entitätsinformationen ergänzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>Zeitraum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>Optionen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>Datei auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>Der Wert wird verwendet, wenn ein importierter Datensatz den ADIF-Wert nicht enthält</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Die folgenden Werte werden verwendet, wenn ein importierter Datensatz die ADIF-Werte nicht enthält</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Logbuch QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Importieren:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>Doppeltes QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;Doppelte QSOs importieren?&lt;/p&gt;%1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>In Datei speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>Zusammenfassung QLog Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>Datum importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>Datei importieren</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>Importiert: %n Kontakt(e)</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>Warnungen: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>Fehler: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>Ergebnis des Imports</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>Details speichern...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translatorcomment>Do not translate -not used</translatorcomment>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>Das Passwort wird im Credential Store gespeichert.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>Passwort merken</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>Unbekannter Benutzer</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>Falsches Passwort</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>Chat-Nachrichten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>Wertvolle Nachrichten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>Ausgewählten Rufzeichen- und Chat-Nachrichteneintrag löschen.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>Chat-Nachricht senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>Spaltensichtbarkeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Welche Spalten sollen angezeigt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>QSO vorbereiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>Übertragen Sie Rufzeichen und Gitterfeldinformationen in den Neues QSO Dialog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>Nur Informationen über mich anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>Nur Nachrichten anzeigen, in denen mein Rufzeichen vorkommt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>Unterdrückung von Benutzer zu Benutzer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>Private Nachrichten zwischen zwei Rufzeichen unterdrücken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>Hervorheben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>Hervorhebung von Meldungen je nach Einstellung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>Regeln hervorheben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>Nachrichten löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>Alle Nachrichten im Fenster löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>Du</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>Regel bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>Regelname</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>Nachrichtenraum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>Aktiv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>Hervorhebung von Nachrichten, die übereinstimmen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>Alle folgenden Bedingungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>Eine der folgenden Bedingungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>Bedingung hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>Alle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>enthält</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>beginnt mit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>Darf nicht leer sein</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>Regeln hervorheben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Regeln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Staat</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation>Daten und Einstellungen entpacken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation>Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Die aktuelle Datenbank wird GELÖSCHT!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Alle gespeicherten Passwörter werden GELÖSCHT!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Die Anwendung wird nach dem Laden neu gestartet&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Um Daten zu sichern, verwenden Sie zuerst Pack Data &amp;amp; Settings oder Export QSOs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation>Datenbank auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation>Datei:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation>Status: Keine Datei ausgewählt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation>Zugangsdaten entschlüsseln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation>Passwort eingeben, um die Zugangsdaten zu entschlüsseln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation>Passwort:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation>Laden und neu starten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation>Falsches Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation>Datenbankdatei auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation>QLog-Datenbankexport (*.dbe);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation>Temporäre Datei kann nicht erstellt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation>Datenbank wird dekomprimiert…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation>Datenbankdatei kann nicht dekomprimiert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation>Datenbank kann nicht geöffnet werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation>Gültige Datenbank</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation>Andere Plattform</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation>Passwort zum Importieren der Zugangsdaten erforderlich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation>Keine verschlüsselten Zugangsdaten in der Datenbank</translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>Meine DXCC-Informationen fehlen</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>Ein minimaler Satz von Datenfeldern, die nicht vorhanden sind (start_time, call, band, mode, station_callsign)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>Außerhalb des gewählten Datumsbereichs</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>Duplikate</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>DXCC-Informationen fehlen</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>Kein Stationsrufzeichen vorhanden</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>Einfügen in die Datenbank nicht möglich</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>Importiert</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>DXCC Status:</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>Warnung</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translatorcomment>Original descriptions may be more meaningful here?</translatorcomment>\n        <translation>QSO ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>Startzeit</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>Endzeit</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST Ausgang</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST Eingang</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>Band</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>Unterart</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>Eigene Stadt (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>Eigenes Land (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>Eigener Name (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>Eigene Postleitzahl (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>Eigener Rig (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation>Eigene spezielle Interessenaktivität (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation>Eigene spezielle Interessenaktivität Info (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation>Eigene spezielle Interessenaktivität Info</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>Anmerkungen (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>Land</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RSTa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>Name (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>Land (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>QSLe Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSLa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>QSLa Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTWe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>LoTWe Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTWa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>LoTWa Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>TX Leistung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>Zusatzfelder</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>Adresse</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>Alter</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>A-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>Antenne Az</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>Antenne El</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>Signalweg</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>ARRL Sektion</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation>Award eingereicht</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation>Award erteilt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>Band RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation>Contest Püfung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>Klasse</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>Clublog Uploaddatum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>Clublog Uploadstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>Kommentar (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>Landkreis Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>Operator kontaktiert</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>Contest ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation>Beitrag eingereicht</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation>Beitrag bewilligt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>DCLe Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>DCLa Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation>DCLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation>DCLa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>Email</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>Eigentümer Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation>eQSL AG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation>FISTS Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>EME Initialisierung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>Frequenz RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>Gastoperator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>HRDLog Uploaddatum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>HRDLog Uploadstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>IOTA Insel-ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>K-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>Breitengrad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>Längengrad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>Eigene Antenne (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>Eigene Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>Eigener Landkreis Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>Eigenes DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>Operator Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>QRZ Herunterladen Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>QRZ Herunterladen Status</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation type=\"unfinished\">QSL-Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSLe via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSLa via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>Region</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>Nr. erhalten</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>Info erhalten</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation>Nr. gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation>Info gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation>Eigene ARRL Sektion</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>Eigener WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL Eingang</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>Eigene Stadt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>Adresse (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>Höhe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>Erweitertes Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>Entfernung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>eQSLe Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>eQSLa Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSLa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>HamlogEU Uploaddatum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>HamlogEU Uploadstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>HamQTH Uploaddatum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>HamQTH Uploadstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation>CW Key Information</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation>CW Key Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>Eigene Höhe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>Eigener Landkreis</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>Eigenes Land</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>Eigene CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>Eigenes DXCC Land</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>Eigene FISTS Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>Eigener Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>Eigener erweiterter Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>Eigene IOTA Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>Eigene IOTA Insel-ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>Eigene ITU Zone</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>Eigener Breitengrad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>Eigener Längengrad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation>Eiene CW Key</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation>Eigener CW Key Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>Eigener Name</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>Eigene Postleitzahl</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>Eigene POTA Ref</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>Eigener Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Eigene spezielle Interessenaktivität</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>Eigene SOTA Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>Eigener Staat</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>Eigene Strasse</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation>Eigene USA-CA Bezirke</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>Eigenes VUCC Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>Anmerkungen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation>Contest Vorrang</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>Ausbreitungsmodus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>Öffentlicher Chiffrierschlüssel</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>QRZ Uploaddatum</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>QRZ Uploadstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>QSL-Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>QSO abgeschlossen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>SAT Name</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation>Verstorben</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>SKCC Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Logging Station Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Ten-Ten Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>UKSMG Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation>USA-CA Bezirke</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>Präfix</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>Staat</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>Landkreis</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Ausgang</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>Logbuch - Löschen QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>Nach Clublog hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>Nachschlagen im Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>Update vom Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>fehlende Angaben ergänzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation>QSL als empfangen markieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation>QSL als angefordert markieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>Rufzeichen filtern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>Wert Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>Logbuch - Wert Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Welche Spalten sollen angezeigt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>Ausgewählte exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>Ausgewählte QSOs exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translation>QSO-Spot senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>Logbuch - QSO-Spot senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>Die ausgewählten Kontakte löschen?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation>Clublog &lt;b&gt;Sofort Upload&lt;/b&gt; unterstützt nur das Löschen eines Datensatzes nach dem anderen.&lt;br&gt;&lt;br&gt;Möchten Sie fortfahren, obwohl&lt;br&gt;der DELETE-Vorgang nicht an Clublog gesendet wird?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>QSOs Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>Aktualisieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>Durch die Aktualisierung werden alle ausgewählten Zeilen beeinflusst.&lt;br&gt;Der aktuell bearbeitete Wert in der Spalte wird auf alle ausgewählten Zeilen angewendet.&lt;br&gt;Möchten Sie fortfahren?</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translation>\n            <numerusform>Anzahl: %n</numerusform>\n            <numerusform>Anzahl: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>eQSL-Bild herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>Alle Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>Alle Betriebsarten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>Alle Länder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>Kein Benutzerfilter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>QLog Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>Jeder Stapel unterstützt bis zu 100 QSOs.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>QSOs Update Fortschritt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>Callbook-Anmeldung fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>Callbook-Fehler: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>Alle Clubs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>eQSL-Bild download fehlgeschlagen: </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>Kann temporäre Datei nicht öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation>Falscher Benutzername oder falsches Passwort</translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>Upload vom Benutzer abgebrochen</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>Upload durch LoTW abgelehnt</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>Unerwartete Antwort vom TQSL-Server</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>TQSL-Utility Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>TQSLib Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>Kann Eingabedatei nicht öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>Kann Ausgabedatei nicht öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>Alle QSOs waren Duplikate oder außerhalb des Datumsbereichs</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>Einige QSOs waren Duplikate oder außerhalb des Datumsbereichs</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>Befehls-Syntaxfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>LoTW Verbindungsfehler (kein Netzwerk oder LoTW nicht erreichbar)</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>Unerwarteter Fehler von TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>TQSL nicht gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL abgestürzt</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>Karte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>Werkzeugleiste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Datei</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>&amp;Logbuch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>&amp;Geräte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Hilfe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>Fe&amp;nster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>Uhr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>Online Karte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>Profilfoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>Einste&amp;llungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>Optionen behalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>Verbindungsoptionen nach dem Neustart der Anwendung wiederherstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>Verbinde R&amp;ig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>Alerts</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>Beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>App - Beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation>Daten und Einstellungen packen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation>Daten und Einstellungen entpacken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>Neuer Kontakt – Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Über</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>Neuer Kontakt – Speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>S&amp;tatistik</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation>QSL &amp;Galerie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation>Entwickler-Tools</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation>Benutzerdefinierte SQL-Abfragen (nur lesen) für die Logbuchdatenbank ausführen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation>QSL-Etiketten &amp;drucken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>Verbinde R&amp;otor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>QSO &amp;Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation>DXCC-&amp;Einreichungsliste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation>Liste von Verbindungen zur Einreichung für ARRL DXCC-Anerkennung erstellen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>Verbinde &amp;CW Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>Fehler &amp;melden...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>&amp;Manueller Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>Schalte den Dialog &quot;Neuer Kontakt&quot; in den manuellen Eingabemodus&lt;br/&gt;(Zeit, Frequenz, Profile etc. werden nicht aus ihren gemeinsamen Quellen übernommen)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>Arrangement speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>Logbuch - Suche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>Neuer Kontakt - Übertragen Sie den Text vom Rufzeichenfeld in die Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>Rig - Band (-)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>Rig - Band (+)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>Neuer Kontakt - Verwende Rufzeichen vom Whisperer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>CW Console - Geschwindigkeit (+)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>CW Console - Geschwindigkeit (-)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>CW Console - CW-Keyer Profil (+)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>CW Console - CW-Keyer Profil (-)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>Rig - PTT On/Off</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>Alle Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>Jedes Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>Jedes Band &amp; Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>Keine Kontrolle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>Eine für alles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>Stoppen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>Zurücksetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>Keine</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>Hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>Service – QSO hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>QSLs herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>Service - QSLs herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation>Thema: Native</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation>Thema: QLog Light</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation>Thema: QLog Dark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation>Was ist neu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation>Cabrillo exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>Dupe-Prüfung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>Sequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>Exchange mit verknüpfen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>Regeln bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>Alerts anzeigen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>Über</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation>Farbschema</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>Für keinen anderen Stil als Fusion zulässig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>Drücken zum Einstellen des Alarms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Clublog-Sofort-Upload-Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>op: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>Eine neue Version</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>Eine neue Version %1 ist verfügbar.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>Später erinnern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>Herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation>Verschlüsseln der Zugangsdaten fehlgeschlagen.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation>Datenbankdateien (*.dbe);;Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation>Temporäre Datei konnte nicht erstellt werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation>Datenbank-Dump fehlgeschlagen.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation>Datenbank wird komprimiert…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation>Datenbank erfolgreich exportiert nach\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation>Datenbank konnte nicht komprimiert werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation>Datenbank konnte nicht für den Import vorbereitet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>Klassisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>Möchten Sie den Contest-Filter %1 entfernen?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>Contest: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>Weg</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>Startzeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RSTa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>DARC-DOK (Ortsverbandkenner) der kontaktierten Station (z.B. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DUPE !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>Suchen Sie das Rufzeichen im Internet. Die Abfrage-URL kann unter Einstellungen -&gt; Callbook geändert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>Dauer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>QSL Ausgangsstatus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Ja&lt;/b&gt; - eine ausgehende QSL-Karte wurde gesendet; das QSO wurde in den Online-Dienst hochgeladen und von diesem akzeptiert.&lt;br/&gt;&lt;b&gt;Nein&lt;/b&gt; - keine ausgehende QSL-Karte senden; das QSO nicht in den Online-Dienst hochladen.&lt;br/&gt;&lt;b&gt;Angefordert&lt;/b&gt; - die kontaktierte Station hat eine QSL-Karte angefordert; die kontaktierte Station hat angefordert, dass das QSO in den Online-Dienst hochgeladen wird.&lt;br/&gt;&lt;b&gt;Wartend&lt;/b&gt; - eine ausgehende QSL-Karte wurde zum Senden ausgewählt; ein QSO wurde zum Hochladen in den Online-Dienst ausgewählt.&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>QSL Ausgang via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC-Statistik&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Stationsstatistik&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>Eigene &amp;Anmerkungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>Mitglied:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>Nein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>Ja</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>Angefordert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>Wartend</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>Ausbreitungsmodus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>Büro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>Direkt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>&amp;Eigene Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>Zurücksetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>Speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>Ignoriert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>Elektronisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>Callbook-Anmeldung fehlgeschlagen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>Neuer Eintrag!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>Neues Band!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>Neue Betriebsart!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>Neues Band &amp; Betriebsart!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>Neuer Slot!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>Callbook-Suche ist aktiv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>Zur Aktivierung muss die Contest-ID ausgefüllt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>Beschreibung der Ausrüstung der kontaktierten Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>Callbook-Suche ist inaktiv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>Erweitern/Zusammenklappen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>zwei oder vier nebeneinander liegende, jeweils vier Zeichen lange Gitterfelder (z. B. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation>Spezielle Aktivitätsgruppe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>Rig-Status geändert</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig nicht verbunden</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>Rig 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>Rig 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>Rig-Status geändert</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig nicht verbunden</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>Ein Port kann nicht gebunden werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>IP-Adresse kann nicht abgerufen werden</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>Keine IPv4-Adresse für</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation>Fehler ist aufgetreten</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>Zeitüberschreitung</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>QSL-Karte verwalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>Verfügbare QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>Kopieren Sie die Bilddatei aus dem Quellordner in den Ordner &quot;QLog Internal QSL Storage&quot;.&lt;br/&gt;Die Originaldatei bleibt unverändert im Quellordner</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>QSL importieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>Datei hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>Löschen QSL?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>Öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation>Favorit</translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation>Plattform-spezifische Einstellungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation>Die Datenbank wurde von einer anderen Plattform exportiert.\nBitte überprüfen oder aktualisieren Sie die folgenden Einstellungen.\nSie können Felder leer lassen und später in den Einstellungen konfigurieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation>Einstellungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation>Wert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation>Fortsetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation>Datei auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation>Alle Dateien (*)</translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>Profilfoto</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>QLog Hilfe</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>QLog wird bereits ausgeführt</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation>Ausstehenden Datenbankimport konnte nicht verarbeitet werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation>Die Datenbank wurde erfolgreich importiert, aber die gespeicherten Passwörter konnten nicht wiederhergestellt werden (Entschlüsselung fehlgeschlagen oder Daten sind beschädigt). Alle Service-Passwörter wurden gelöscht und müssen in den Einstellungen erneut eingegeben werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>Keine Verbindung zur Datenbank möglich.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>Kann QLog-Datenbank nicht als Backup nach ADIF exportieren.&lt;p&gt;Versuchen Sie, Ihr Log manuell nach ADIF zu exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>Migration der Datenbank fehlgeschlagen.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>QLog Warnung</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>Aktualisierung der Clubliste fehlgeschlagen. Alte Datensätze können nicht entfernt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>Aktualisierung der Clubliste fehlgeschlagen. Kann keine neuen Downloads durchführen</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>QLog kritischer Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>Das Passwort für %1 kann nicht im Passwort Speicher gespeichert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>Es kann kein Passwort für %1 aus dem Passwort Speicher abgerufen werden</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>Unerwartete Clubliste herunterladen. Nächste Downloads beenden</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>Unerwarteter Inhalt der Clubliste für</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>Netzwerkfehler. Clubliste kann nicht heruntergeladen werden für</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>DXC Server Namensfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>Format der DXC-Server-Adresse &lt;p&gt;&lt;b&gt;[benutzername@]hostname:Port&lt;/b&gt; (z. B. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>Falsches Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>DXC Server Verbindungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>Die Felder &lt;b&gt;%0&lt;/b&gt; werden nicht gespeichert, da &lt;b&gt;%1&lt;/b&gt; nicht ausgefüllt ist.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>Ihr Rufzeichen ist nicht angegeben. Bitte richten Sie Ihr Stationsprofil ein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>QLog Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>Der Aktivitätsname existiert bereits.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>Name der Regel ist bereits vorhanden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>Der reguläre Ausdruck für das Rufzeichen ist fehlerhaft..</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>Kommentar Regulärer Ausdruck ist fehlerhaft.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>Kann Alarmregeln nicht aktualisieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>Filtername ist bereits vorhanden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>Bitte definieren Sie mindestens ein Stationsstandortprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>WSJTX Multicast ist aktiviert, aber die Adresse ist keine Multicast-Adresse.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation>Schleife erkannt. Raw-UDP-Weiterleitung verwendet denselben Port wie der WSJT-X-Empfangsport.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Rig port muss ein gültiger COM-Port sein.&lt;br&gt;Für Windows verwende COMxx, für Unix-ähnliche Betriebssysteme verwende einen Pfad zum Gerät</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Rig-PTT-Port muss ein gültiger COM-Port sein. Für Windows verwenden Sie COMxx, für Unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;TX-Bereich&lt;/b&gt;: Max Frequenz darf nicht 0 sein.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;TX-Bereich&lt;/b&gt;: Die Maximalfrequenz darf nicht niedriger als die Minimalfrequenz sein.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Rotor-Port muss ein gültiger COM-Port sein.&lt;br&gt;Für Windows verwenden Sie COMxx, für Unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>CW Keyer Port muss ein gültiger COM-Port sein.&lt;br&gt;Für Windows verwenden Sie COMxx, für unix-ähnliche Betriebssysteme verwenden Sie einen Pfad zum Gerät</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Kann das CW-Keyer Modell nicht zu &lt;b&gt;CW-über-CAT&lt;/b&gt; ändern.&lt;br&gt;Keine CW-über-CAT Unterstützung für Rig(s) &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Kann das CW-Keyer Profil nicht löschen.&lt;br&gt;Das Profil wird verwendet von Rig(s): &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>Das Operator-Rufzeichen hat ein ungültiges Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translation>Gitterfeld hat ein falsches Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>VUCC Gitterfeld hat ein falsches Format (es müssen 2 oder 4 Gitterfelder sein, getrennt durch &apos;,&apos;)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>Das Land darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>CQZ darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>ITU darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>Rufzeichen hat ein falsches Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>Dateiname ist leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>Kann nicht in die Datei schreiben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>QLog Information</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>Exportiert.</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>%n Kontakt(e) exportiert.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>Chat Fehler: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>QSO-Filter kann nicht aktualisiert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>Kann keine Verbindung zum DXC Server herstellen &lt;p&gt;Ursache &lt;b&gt;: </translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>Verbindung abgelehnt</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>Der Host hat die Verbindung beendet</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>Host nicht gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>Zeitüberschreitung</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>Netzwerkfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>Interner Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation>Datenbank wird importiert</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>Datenbank öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>Datenbank sichern</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>Datenbank migrieren</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>Anwendung starten</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>Eigener Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Logging-Station Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>Eigenes Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>Operator Name</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>Operator Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>Eigene Stadt</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>Eigenes Land</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>Eigener Landkreis</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>Eigene IOTA Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>Eigene SOTA Nummer</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Eigene spezielle Interessenaktivität</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>Eigene spezielle Interessenaktivität Info</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>Eigenes VUCC Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>Eigener WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>Eigene POTA Ref</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>Eigenes DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>Eigene ITU Zone</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>Eigene CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>Eigenes DXCC Land</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;Importiert&lt;/b&gt;: %n Kontakt(e)</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Warnungen&lt;/b&gt;: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Fehler&lt;/b&gt;: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>km</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>mil</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation>Keine gültige QLog-Datenbank</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation>Datenbankversion zu neu (erfordert neuere QLog-Version)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation>Datenbank ist keine QLog-Exportdatei</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation>TQSL Pfad</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation>(Interner Flatpak-Pfad)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation>Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation>CW Key</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation>Summe Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation>Summe Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>Allgemeiner Fehler</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation>QSL-Karten-Galerie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation>Nach Rufzeichen suchen…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation>Sortieren nach:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation>Gefilterte exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation>Datum (neueste)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation>Datum (älteste)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation>Rufzeichen (A-Z)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation>Rufzeichen (Z-A)</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation>\n            <numerusform>%n QSL-Karte(n)</numerusform>\n            <numerusform>%n QSL-Karte(n)</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation>Alle QSL-Karten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation>Favoriten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation>Nach Land</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation>Nach Datum</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation>Nach Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation>Nach Modus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation>Nach Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation>Aus Favoriten entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation>Zu Favoriten hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation>Öffnen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation>Speichern…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation>QSL-Karte speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation>QSL-Karten exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation>%1 von %2 Karten exportiert</translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>Zusammenfassung QSL-Import</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>Zusammenfassung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>Heruntergeladen:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>Aktualisiert:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>Nicht gefunden:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>Fehler:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>Neue QSLs: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>Aktualisierte QSOs: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translation>Nicht gefundene QSLs: </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation>QSL-Etiketten drucken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation>Eigenes Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation>Stationsprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Ausgang</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation>Benutzer-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation>Etikettenvorlage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation>Seitengröße:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation>Spalte:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation>Zeile:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation>Etikettenbreite:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation>Etikettenhöhe:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation>Linker Rand:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation>Oberer Rand:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation>Horizontaler Abstand:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation>Vertikaler Abstand:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation>Erscheinungsbild des Etiketts</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation>Etikettenränder drucken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation>QSOs pro Etikett:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation>Linker Fußzeilentext:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation>Rechter Fußzeilentext:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation>Etikett überspringen:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation>Serifenlose Schrift:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation>Monospace-Schrift:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation>Größe des Rufzeichens:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation>Größe „To Radio“:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation>Text „To Radio“:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation>Kopfzeilen-Größe:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation>Datengröße:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation>Datum-Header-Text:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation>Datumsformat:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation>Zeit-Header-Text:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation>Band-Header-Text:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation>Modus-Header-Text:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation>QSL-Header-Text:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation>Zusätzliche Spalte:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation>Text der zusätzlichen Spalte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation>(Datenbank-Spaltenname)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation>Keine passenden QSOs gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation>Seite 0 von 0</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation>Etiketten: 0 (0 Seiten)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation>Drucken</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation>Als PDF exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation>Benutzerdefiniert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation>QSOs, die diesem Stationsprofil entsprechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation>Etiketten: %1 (%2 Seiten)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation>Seite %1 von %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation>PDF exportieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation>PDF-Dateien (*.pdf)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation>Als gesendet markieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation>Gedruckte/exportierte QSOs als gesendet markieren?</translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>Startzeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>Endzeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RSTa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>Eigene Anmerkungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>Land</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>Staat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>Landkreis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>Alter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>zwei oder vier nebeneinander liegende, jeweils vier Zeichen lange Gitterfelder (z. B. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Stats</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC-Statistik&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Stationsstatistik&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>Operator Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>QSL-Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>Contest ID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>Mitglied:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>DARC-DOK (Ortsverbandkenner) der kontaktierten Station (z.B. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>Ausbreitungsmodus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>Satellit-Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>Satellit-Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>&amp;Eigene Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>Operator Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>Leistung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation>&amp;QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>QSL-Karte verwalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Ja&lt;/b&gt; - eine ausgehende QSL-Karte wurde gesendet; das QSO wurde in den Online-Dienst hochgeladen und von diesem akzeptiert.&lt;br/&gt;&lt;b&gt;Nein&lt;/b&gt; - keine ausgehende QSL-Karte senden; das QSO nicht in den Online-Dienst hochladen.&lt;br/&gt;&lt;b&gt;Angefordert&lt;/b&gt; - die kontaktierte Station hat eine QSL-Karte angefordert; die kontaktierte Station hat angefordert, dass das QSO in den Online-Dienst hochgeladen wird.&lt;br/&gt;&lt;b&gt;Wartend&lt;/b&gt; - eine ausgehende QSL-Karte wurde zum Senden ausgewählt; ein QSO wurde zum Hochladen in den Online-Dienst ausgewählt.&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>QSL Ausgang via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>Eingang</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>Ausgang</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>QSL-Karte ansehen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Ja&lt;/b&gt; - eine eingehende QSL-Karte wurde angenommen; das QSO wurde vom Online-Dienst bestätigt.&lt;br/&gt;&lt;b&gt;Nein&lt;/b&gt; - eine eingehende QSL-Karte wurde nicht angenommen; das QSO wurde vom Online-Dienst nicht bestätigt.&lt;br/&gt;&lt;b&gt;Angefordert&lt;/b&gt; - die loggende Station hat eine QSL-Karte angefordert; die loggende Station hat verlangt, dass das QSO in den Online-Dienst hochgeladen wird.&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>Nr. erhalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>Info erhalten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>Nr. gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>Info gesendet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>&amp;Zurücksetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>&amp;Suchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>Nein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>Ja</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>Angefordert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>Wartend</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>Ignoriert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>Büro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>Direkt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>Elektronisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>Änderungen übermitteln</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>Wirklich alle Änderungen übermitteln?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>QLog Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>Es können nicht alle Änderungen gespeichert werden - interner Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>Es können nicht alle Änderungen gespeichert werden - versuchen Sie, alle Änderungen zurückzusetzen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>QSO Detail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>QSO Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>eQSL-Bild herunterladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>eQSL-Bild download fehlgeschlagen: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>DX-Rufzeichen darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>DX-Rufzeichen hat ein falsches Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>TX-Frequenz oder -Band muss ausgefüllt sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>DX Gitterfeld hat ein fehlerhaftes Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>VUCC hat ein fehlerhaftes Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>Der Satellitenname darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>Eigenes Rufzeichen darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>Eigenes Rufzeichen hat ein fehlerhaftes Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>Eigenes VUCC Gitterfeld hat ein fehlerhaftes Format</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>LoTW Sent Status &lt;b&gt;Nein&lt;/b&gt; macht keinen Sinn, wenn ein QSL Sent Datum gesetzt ist. Setzen Sie das Datum auf 1.1.1900, um das Datumsfeld leer zu lassen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Ein Datum sollte für LoTW Sent Status &lt;b&gt;Ja&lt;/b&gt; angegeben werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>eQSL Sent Status &lt;b&gt;Nein&lt;/b&gt; macht keinen Sinn, wenn ein QSL Sent Datum eingestellt ist. Setzen Sie Datum auf 1.1.1900, um das Datumsfeld leer zu lassen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Ein Datum sollte für eQSL Sent Status &lt;b&gt;Ja&lt;/b&gt; angegeben werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Papier Sent Status &lt;b&gt;Nein&lt;/b&gt; macht keinen Sinn, wenn ein QSL Sent Datum gesetzt ist. Setzen Sie das Datum auf 1.1.1900, um das Datumsfeld leer zu lassen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Ein Datum sollte für Papier Sent Status &lt;b&gt;Ja&lt;/b&gt; angegeben werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Auf Grundlage der SOTA-Daten stimmt das QTH nicht mit dem SOTA Gipfelname überein - erwartend </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>TX-Band sollte sein </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>RX-Band sollte sein </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>Callbook-Fehler: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;Warnung: &lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>Überprüfung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>Gelb markierte Felder sind ungültig.&lt;p&gt;Dennoch die Änderungen speichern?&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>&amp;Speichern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>B&amp;earbeiten</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>QSO Filter Details</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>Filter Name:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>QSO mit Suchfilter finden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>Alle folgenden Bedingungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>Eine der folgenden Bedingungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>Bedingung hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>gleich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>nicht gleich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>enthält</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>enthält nicht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>größer als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>kleiner als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>beginnt mit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>Darf nicht leer sein</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>QSO-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Bearbeiten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Entfernen</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>Kein Rig-Profil ausgewählt</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation>Rigctld-Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>Interner Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>Kann Rig nicht öffnen</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation>Nicht verbunden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation>Split deaktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation>Erweiterte Rigctld-Einstellungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation>Rigctld-Pfad:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Leer lassen für automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation>Rigctld-Pfad automatisch erkennen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation>Automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation>Rigctld-Version:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation>Zusätzliche Argumente:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation>z.&#x202f;B. -v -v für ausführliche Protokollierung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation>Kann nicht geändert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation>Automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation>rigctld wurde auf diesem System nicht gefunden.\nBitte installieren Sie Hamlib oder geben Sie den Pfad manuell an.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation>Ausführbare Datei (*.exe);;Alle Dateien (*.*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation>Alle Dateien (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation>Rigctld ausführbare Datei auswählen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation>Nicht gefunden</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation>Rigctld-Ausführbare Datei wurde in /app/bin/ nicht gefunden. Dies sollte im Flatpak-Build nicht passieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation>Rigctld-Ausführbare Datei wurde nicht gefunden. Bitte installieren Sie Hamlib oder geben Sie den Pfad in den erweiterten Einstellungen an.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation>Hamlib-Hauptversionskonflikt: QLog wurde mit Hamlib %1 kompiliert, aber rigctld meldet Version %2.%3.%4. Rig-Modell-IDs sind zwischen Hauptversionen nicht kompatibel.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation>Port %1 wird bereits verwendet. Ein anderer rigctld oder eine Anwendung läuft möglicherweise auf diesem Port.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation>Rigctld wurde gestartet, reagiert aber nicht auf Port %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation>Rigctld konnte nicht gestartet werden: %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation>rigctld ist abgestürzt.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation>rigctld hat die Zeitüberschreitung erreicht.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation>Schreibfehler bei rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation>Lese Fehler bei rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation>Unbekannter rigctld-Fehler.</translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>Kein Rotor-Profil ausgewählt</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>Initialisierungsfehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>Interner Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>Kann Rotor nicht öffnen</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation>Vorheriges Tastenprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation>Nächstes Tastenprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>Einstellungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>Löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>Hinzufügen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>Modell</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>Profilname</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>SIG Information (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>VUCC Gitterfelder (optional). Beisp. EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>Baudrate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>Standard-Ausgangsleistung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>Standard-Ausgangsleistung eingeben (z.B. wenn der Rig nicht verbunden ist)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation>1200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation>2400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation>4800</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation>9600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation>19200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation>38400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation>57600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation>115200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>Daten Bit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>Geräte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>Antennen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>Beschreibung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Verwende COMxx für Windows oder den Pfad zum COM-Anschluss unter Unix-ähnlichen Betriebssystemen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>Liste der verfügbaren CW Funktionstastenprofile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>Niedrigste und höchste Sendefrequenzen. Die spezifischen Bereiche ergeben sich aus dem zulässigen Band in der Einstellung.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>TX Frequenzbereich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>Eingabe RIT oder Transverter Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>Eingabe XIT oder Transverter Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation>6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation>7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation>8</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation>2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib unterstützt keine Änderung eines Zielports.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>Leistung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>World Wide Flora &amp; Fauna (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>Frequenz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>PTT Status</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>Standard WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>CW Funktionstasten Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>Kurzbeschreibung der Schaltfläche (bis zu 7 Zeichen)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>Rig Merkmale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>SIG (optional).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>WPM-Sync</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>Rotoren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>Reihenfolge der Abfrage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>Primär</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>Sekundär</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;Notiz:&lt;/b&gt; Es wird empfohlen, mindestens ein QRZ-XML-Abonnement abzuschließen, um detaillierte Informationen zu erhalten. Ohne ein Abonnement erhalten Sie nur begrenzte Daten von QRZ, z. B. Gitterfeld  und andere Felder.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>QSOs werden sofort hochgeladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>Verwendung einer internen TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>Port, an dem QLog auf eingehenden Datenverkehr von WSJT-X wartet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>UDP Rohdaten-Weiterleitung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>Profilname, der als Alias für Rufzeichen, QTH-Locator, Operator-Name und QTH verwendet wird (erforderlich) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>CW-Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>Keyer Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>Liste der verfügbaren CW Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>Keyer Modus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>Zugeordneter CW-Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>CW-Keyer WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>Port Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>Serial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>Funktionstasten Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>Taste 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>Taste 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>Taste 3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>Taste 4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>Operator Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>Operator Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>Land</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>Logging Station Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>Rufzeichen des Operators (Optionale Angabe, falls es vom Stationsrufzeichen abweicht)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>Landkreis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>Gültiger Wertebereich: 0° - 100° (0° unbestimmt)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>Unbestimmt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>Paddles vertauschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>Interface</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translation>PTT Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translation>PTT Port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>DX-Spots zum Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation>Sidetone-Frequenz:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation>&lt;DXCALL&gt; = DX Rufzeichen\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Grussformel GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = Eigenes Rufzeichen\n&lt;MYNAME&gt; = Eigener Name\n&lt;MYQTH&gt; = Eigenes QTH\n&lt;MYLOCATOR&gt; = Eigenes Gitterfeld\n&lt;MYSIG&gt; = Eigenes SIG\n&lt;MYSIGINFO&gt; = Eigene SIG Information\n&lt;MYIOTA&gt; = Eigenes IOTA\n&lt;MYSOTA&gt; = Eigenes SOTA\n&lt;MYWWFT&gt; = Eigenes WWFT\n&lt;MYVUCC&gt; = Eigenes VUCC\n&lt;MYPWR&gt; = Eigene Leistung in W\n&lt;EXCHSTR&gt; = Contest Exchange\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T) \n&lt;+&gt; = Geschwindigkeit +5 WPM (&lt;++&gt; = +10 WPM, usw.)\n&lt;-&gt; = Geschwindigkeit -5 WPM (&lt;--&gt; = -10 WPM, usw.)\n</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation>Rigctld-Daemon starten, um das Rig mit anderen Anwendungen zu teilen (z.&#x202f;B. WSJT-X)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation>Rig über Port freigeben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation>Erweitert…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation>Rig-Port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation>CIV Addr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation>Automatisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Schaltfläche Web Suche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>Geben Sie die URL an, die für die Schnellsuche verwendet werden soll. Das Makro &lt;DXCALL&gt; wird durch das aktuelle Rufzeichen ersetzt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>Prüfen Sie die URL mit Ihrem Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>Aktive Listen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>Sofort-Upload</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>Das ist kein Passwort. Es handelt sich um den Upload-Code, den sie nach der Registrierung bei HRDLOG.net per E-Mail erhalten haben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translatorcomment>Do not translate.</translatorcomment>\n        <translation>Upload Code</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>Wenn es aktiviert ist und Rig angeschlossen ist, sendet QLog regelmäßig On-Air-Nachrichten an HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>On-Air senden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Leer lassen für automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation>TQSL-Pfad automatisch erkennen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation>Automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation>TQSL-Version</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>Standard-API-Schlüssel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>API-Schlüssel, die auf das Rufzeichen zugeschnitten sind</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>API-Schlüssel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation>Gefahrenzone</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation>&lt;b&gt;⚠ Dies ist eine Gefahrenzone. Gehen Sie vorsichtig vor, da die ausgeführten Aktionen nicht rückgängig gemacht werden können und erhebliche Auswirkungen auf Ihr Log haben können.&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation>Alle QSOs löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation>Alle Passwörter aus dem sicheren Speicher löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>Endpunkt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>Andere</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>Bestätigt durch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;Sicherheitshinweis:&lt;/b&gt; QLog speichert alle Passwörter im Secure Storage. Leider verwendet ON4KST ein Protokoll, bei dem dieses Passwort über einen ungesicherten Kanal im Klartext gesendet wird.&lt;/p&gt;&lt;p&gt;Bitte seien Sie vorsichtig, wenn Sie Ihr Passwort für diesen Dienst wählen, da Ihr Passwort über einen ungesicherten Kanal im Klartext gesendet wird.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>Das Zeichen „&gt;“ wird als Markierung für die anfängliche Cursorposition in der Spalte „Report“ interpretiert.&lt;br/&gt;Beispiel: „5&gt;9“ bedeutet, dass sich der Cursor auf dem zweiten Zeichen befindet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog unbearbeitete UDP WSJT-X-Pakete weiterleitet.&lt;/p&gt;Die IP-Adressen werden durch ein Leerzeichen getrennt und haben die Form IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>Multicast verbinden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>Aktivieren/Deaktivieren der Multicast-Option für WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>Multicast Adresse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>Geben Sie die Multicast-Adresse an. &lt;br&gt;Auf einigen Linux-Systemen kann es erforderlich sein, Multicast auf der Loopback-Netzwerkschnittstelle zu aktivieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>Time-To-Live bestimmt den Bereich&lt;br&gt;, über den ein Multicast-Paket in Ihrem Intranet verbreitet wird. </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation>CQ-Spots einfärben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation>Senden farbcodierter Statusindikatoren für jede CQ-rufende Station zurück an WSJT-X aktivieren/deaktivieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>Benachrichtigungen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog UDP-Notification-Pakete mit DX Cluster Spots sendet.&lt;/p&gt;Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>QSO Änderungen </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete über ein neues/aktualisiertes/gelöschtes QSO im Log sendet.&lt;/p&gt;Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete mit WSJTX CQ Spots sendet.&lt;/p&gt;Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>Rig-Status</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete mit Rig-Status sendet.&lt;/p&gt;Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>GUI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>Zeitformat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24-Stunden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation>AM/PM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation>Einheitensystem</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation>Metrisch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation>Imperial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>Datumsformat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>System</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>Benutzerdefiniert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Dokumentation des Zeitformats&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste der IP-Adressen, an die QLog UDP-Benachrichtigungspakete über User Spot Alerts sendet.&lt;/p&gt;Die IP-Adressen sind durch ein Leerzeichen getrennt und haben das Format IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;Zugeordnete LogID für das aktuelle Protokoll.&lt;/p&gt;Die LogID wird in den Netzwerk-Notifizierungsmeldungen als eindeutige Instanzkennung gesendet.&lt;p&gt;Die ID wird automatisch generiert und kann nicht geändert werden&lt;/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>Durchsuchen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>TQSL Pfad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>Netzwerk</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>Bänder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>Betriebsarten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>Operator-Name (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>Stations-Gitterfeld (erforderlich)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>Rufzeichen (erforderlich)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>Liste der verfügbaren Stations-Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>QTH Name (optional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>Liste der verfügbaren Rigs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>Liste der verfügbaren Antennen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>Benutzername</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>Passwort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>Name</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>Bericht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>Staat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>Beginn (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>Ende (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>Inaktiv</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>CW-über-CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation>Drücken Sie &lt;b&gt;Ändern&lt;/b&gt;, um die Profiländerungen zu bestätigen oder &lt;b&gt;Abbrechen&lt;/b&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>Darf nicht leer sein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation>Automatische Erkennung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation>TQSL wurde auf diesem System nicht gefunden.\nBitte installieren Sie TQSL oder geben Sie den Pfad manuell an.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation>Nicht gefunden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation>Rig-Freigabe ist nur für den Hamlib-Treiber verfügbar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation>Rig-Freigabe ist für Netzwerkverbindungen nicht verfügbar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation>Passwörter löschen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation>Alle Passwörter wurden gelöscht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation>Alle QSOs werden gelöscht...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation>Fehler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation>Alle QSOs konnten nicht gelöscht werden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>Mitglieder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>Erfordert Internetverbindung beim Start der Anwendung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>Ändern</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>Special - Omnirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation>Kann nicht geändert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation>WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>Datei auswählen</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>Beschreibung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>Tastenkombination</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>Konflikt mit einer eingebauten Tastenkombination</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>Konflikt mit einer benutzerdefinierten Tastenkombination</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>QSOs zum Hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>Ausgewählte QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>Hochladen</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>Suchen</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>Statistik</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>Eigenes Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>Auf Karte ansehen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation>Benutzer-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation>Bestätigt durch</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>Eigenes Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>Datumsbereich</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>Diagramm-Typ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSOs pro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>Prozent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>Histogramm</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>Eigene Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>Eigener Rig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>bis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>Jahr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>Monat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>Wochentag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>Stunde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>Ausbreitungsmodus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>Bestätigt / nicht Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>Länder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>Grossfelder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>Entfernung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>Bestätigte / gearbeitete Gitterfelder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>Son</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>Mon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>Die</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>Mit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>Don</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>Fre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>Sa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>Nicht angegeben</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation>Kein Benutzerfilter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>Über 50000 QSOs. Anzeigen?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation>Rendern der QSOs…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>Alle</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>Rig 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>Rig 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>Rig 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>Rig 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation>Fehler aufgetreten</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>Rig-Status geändert</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>Rig nicht verbunden</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>Leer</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>Zeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>Nachricht</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>QSOs hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>Stationsprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>Eigenes Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>QSOs mit Sendestatus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Unter normalen Umständen bedeutet dieser Status &lt;b&gt;&quot;nicht senden&quot;&lt;/b&gt;.&lt;br/&gt;Manchmal kann es jedoch sinnvoll sein, diese Einstellung beim Senden einer QSL zu ignorieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>Nein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>Unter normalen Umständen bedeutet dieser Status &lt;b&gt;&quot;ignorieren/fehlerhaft&quot;&lt;/b&gt;.&lt;br/&gt;Manchmal kann es jedoch sinnvoll sein, diese Einstellung beim Senden einer QSL zu ignorieren.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>Ignorieren</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>Keine</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>QSL-Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>QSL-Nachrichtenfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>QTH Profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>Diese Option löscht alle QSOs im Clublog&lt;br&gt;und lädt basierend auf dem Filter alle QSOs hoch, unabhängig von ihrem Status.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>Clublog löschen und QSOs erneut hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation>LoTW / TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation>TQSL-Stationstandort</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>Stationsprofil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translation>Alles erneut hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>QSOs anzeigen...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;Hochladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation>Unbestimmt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>QSOs ausblenden...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>Lade hoch zu %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>Abbrechen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>QLog Warnung - %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>QSO-Status kann nicht aktualisiert werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>Kann QSO(s) nicht hochladen: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>QLog Information</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>Keine QSO zum Hochladen gefunden.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>QSOs wurden zu den ausgewählten Diensten hochgeladen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>Zeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>Betriebsart</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>Hochladen zu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Die folgenden Werte werden verwendet, wenn ein importierter Datensatz die ADIF-Werte nicht enthält</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>Irgendein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation>Standortrufzeichen (%1) und Grid (%2) stimmen nicht mit den ausgewählten Filtern überein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation>Standortrufzeichen (%1) stimmt nicht mit dem ausgewählten Rufzeichen (%2) überein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation>Standort-Grid (%1) stimmt nicht mit dem ausgewählten Grid (%2) überein</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>Unbekannt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>Service ist nicht richtig eingerichtet.&lt;p&gt; Bitte verwende den &lt;b&gt;Einstellungen&lt;/b&gt; Dialog, um es einzurichten.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>Entfernung</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>Kommentar</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>Zeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>Zeit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>WSJTX-Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>Allgemeine Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Log Status</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>Neues Band</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>Neuer Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>Neuer Eintrag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>Neuer Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>Gearbeitet</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>Bestätigt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>Kontinent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>Nordamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>Südamerika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>Afrika</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>Antarktis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>Asien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>Ozeanien</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>Entfernung größer als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR besser als</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation> dB</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>Erweiterte Filter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>Keine Clubliste aktiviert</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation>SNR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>Rufzeichen</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>Gitterfeld</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>Entfernung</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>Letzte Aktivität</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>Letzte Nachricht</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>Mitglied</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>Gefiltert</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>Spaltensichtbarkeit...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>Filter...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Welche Spalten sollen angezeigt werden</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>Filter Spots</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation>Im spezifischen Namensraum ausführen.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation>Namensraum</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation>Übersetzungsdatei - Absoluter oder relativer Pfad und Name der QM-Datei.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation>path/QM-filename</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation>Sprache einstellen. Beispiel &lt;code&gt;: &apos;en&apos; oder &apos;en_US&apos;. Ignoriert Betriebssystemeinstellungen.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation>code</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>Schreibt Debugmeldungen in die Debugdatei</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation>Ausstehenden Datenbankimport verarbeiten (interne Verwendung)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation>Aktualisierung aller Wertelisten erzwingen (DXCC, SATs usw.)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/qlog_es.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"es_ES\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>Editor de actividades</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>Nombre de la actividad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>Diseño</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>Disposición de las ventanas:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>Guardado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>Limpiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>Campos disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>Lista de campos que pueden utilizarse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>Fila A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>Mover los campos seleccionados de la lista de campos disponibles a la fila A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>Eliminar el campo seleccionado de la fila A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>Lista de campos de la primera fila de variables</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>Cambiar el orden. Mover el campo seleccionado hacia arriba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>Cambiar el orden. Desplazar hacia abajo el campo seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>Fila B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>Mover los campos seleccionados de la lista de campos disponibles a la fila B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>Eliminar el campo seleccionado de la fila B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>Lista de campos de la segunda fila de variables</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>Columna A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>Lista de campos en la primera columna de detalles del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>Columna B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>Lista de campos de la segunda columna de detalles del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>Columna C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>Lista de campos de la tercera columna de detalles del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>Nuevas filas del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>Nuevas columnas de detalles del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>Valores</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>Perfiles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>Si no está marcada, el perfil no cambia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>Equipo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>Conectar automáticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>Conectar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>Campos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>No debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>Sin guardar</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>Detalle de la Regla de Alerta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>Nombre de la Regla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>Habilitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>Fuentes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation>Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation>DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation>Nuevo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation>Nueva Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation>Nuevo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation>Nueva Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>Indicativo DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>Utilice expresiones regulares similares a Perl</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation>.*</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>País</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>Estado del Registro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>Comentario Anunciado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>Especial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>Modos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>Fonía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>Bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>Norteamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>África</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>Antártida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>Sudamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation>Anunciante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>Todos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>No debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>No hay ninguna lista de clubes habilitada</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>Reglas de Alerta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Reglas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>Agregar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Estado</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>Nombre Regla</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>Actualizado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>Última Actualización</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>Último Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>Alertas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>Borrar anteriores a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>Nunca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translatorcomment>Editar Reglas</translatorcomment>\n        <translation>Editar Reglas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translatorcomment>Visibilidad de Columnas</translatorcomment>\n        <translation>Visibilidad de Columnas...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translatorcomment>Limpiar</translatorcomment>\n        <translation>Limpiar</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translatorcomment>Diplomas</translatorcomment>\n        <translation>Diplomas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translatorcomment>Opciones</translatorcomment>\n        <translation>Opciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translatorcomment>Diploma</translatorcomment>\n        <translation>Diploma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translatorcomment>Mi entidad DXCC</translatorcomment>\n        <translation>Mi Entidad DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation>Filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translatorcomment>Confirmado por</translatorcomment>\n        <translation>Confirmado por</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translatorcomment>Papel</translatorcomment>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translatorcomment>Modo</translatorcomment>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>Fonía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translatorcomment>Sólo no trabajado</translatorcomment>\n        <translation>Sólo no trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation>No confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translatorcomment>Mostrar</translatorcomment>\n        <translation>Mostrar</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation>WAC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation>WAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation>WAS</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation>WPX</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translatorcomment>Cazador de POTA</translatorcomment>\n        <translation>Cazador de POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translatorcomment>Activador de POTA</translatorcomment>\n        <translation>Activador de POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translatorcomment>Cumbres en el Aire</translatorcomment>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translatorcomment>Flora y Fauna Mundial</translatorcomment>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation>Condados de EE. UU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation>Distritos de Rusia</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation>Ciudades japonesas / Ku / Gun</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation>Condados de Nueva Zelanda</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation>DMEs de España</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation>Distritos de Ucrania</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation>Sin filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation>Eliminado</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translatorcomment>América del Norte</translatorcomment>\n        <translation>América del Norte</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translatorcomment>América del Sur</translatorcomment>\n        <translation>América del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translatorcomment>Europa</translatorcomment>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translatorcomment>África</translatorcomment>\n        <translation>África</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translatorcomment>Oceanía</translatorcomment>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translatorcomment>Antártida</translatorcomment>\n        <translation>Antártida</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>Slot: </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>Esperando</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation>Mapa de Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>Crear una ventana adicional de Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>Borrar anteriores a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>Borrar Todo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>Borrar la banda actual</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>Nunca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>Mapa de Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>Mostrar Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>Centrar RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation>Mostrar frecuencias de emergencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>Ninguna Radio está conectada</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>La Radio no soprte Morse sobre CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>No se puede enviar el Texto a la Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>El manipulador no está conectado</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio no conectada</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>No se puede establecer la velocidad del manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>No se puede detener el envío del Texto</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>Perfil del Manipulador CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>Perfil de atajos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>Velocidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation>S/D</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation> PPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>Enviar Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>Texto repetido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation>&amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>Texto a Enviar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>Cambiar entre enviar &lt;b&gt;palabras&lt;/b&gt; individualmente (separadas por espacios)&lt;br&gt; y enviar el texto completo como un &lt;b&gt;todo&lt;/b&gt; (separado por una nueva línea).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>Detener</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>Consola CW - Detener</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>Borrar enviados y consola Eco</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation>Detener inmediatamente la transmisión CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>Borrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>La radio debe estar conectada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>Palabra</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>Todo</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>El manipulador no está conectado</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>No se puede enviar el Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>No se puede establecer la velocidad del manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>No se puede detener el envío del Texto</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>El dispositivo conectado no es FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>El manipulador no está conectado</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>No se puede enviar el Texto a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>No se puede enviar Borrar a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>No se puede enviar TX a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>No se puede enviar Texto a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>No se puede enviar Parar a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>No se puede enviar Abortar a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>No se reciben datos de FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>Terminó el tiempo de espera de conexión FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>Error de conexión FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>Error de comando FLDigi</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>No Hay Perfil de Manipulador Seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>Error Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>Error de Conexión</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>No se puede conectar al Manipulador</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>El dispositivo conectado no es Winkey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>No se puede enviar el Texto a la Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>El manipulador no está conectado</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>Error de Comunicación</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>No se puede establecer la velocidad del manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>No se puede detener el envío del Texto</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation>4000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {2000 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {1333 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {1000 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {800 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {666 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {571 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {500 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {444 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {400 ?}</translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation>Exportar Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation>Archivo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation>Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation>Plantilla de formato:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation>Administrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation>Filtro de usuario:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation>Fecha/Hora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation> - </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation>Estación y categorías</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation>Indicativo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation>Operadores:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation>Banda:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation>Modo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation>Potencia:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation>Operador:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation>Asistido:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation>Estación:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation>Transmisor:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation>Hora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation>Adicional</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation>Nombre:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation>EMail:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation>Dirección:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation>Máx. 6 líneas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation>Ubicación:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation>Club:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation>Comentario libre:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation>Archivos Cabrillo (*.log);;Archivos CBR (*.cbr);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation>QSO(s): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation>QSOs: ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation>Alerta de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation>Seleccione una plantilla de concurso.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation>Seleccione un archivo de salida.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation>No hay indicativos disponibles. Compruebe sus filtros.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation>No se pudo preparar la consulta de exportación.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation>No se pudieron consultar los QSOs para la exportación.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation>No se puede abrir el archivo %1 para escritura.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation>Exportando Cabrillo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation>Información de QLog</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation>\n            <numerusform>Exportados %n QSOs al archivo Cabrillo.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation>Todas las bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation>2m (144 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation>1.25m (222 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation>70cm (432 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation>33cm (902 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation>23cm (1.2 GHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation>Luz</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation>VHF de 3 bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation>Solo VHF FM</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation>Mixto</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation>Operador único</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation>Multioperador</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation>Revisar log</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation>No asistido</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation>Asistido</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation>Fijo</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation>Móvil</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation>Expedición</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation>Escuela</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation>Distribuido</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation>Uno</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation>Dos</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation>Limitado</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation>Ilimitado</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation>6 horas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation>12 horas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation>24 horas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation>Clásico</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation>Novato/Técnico</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation>Más de 50</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation>Texto (alineado a la izquierda)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation>Frecuencia (kHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation>Hora (HHMM)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation>Fecha (AAAA-MM-DD)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation>RST corto (omitir el último dígito)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation>Mayúsculas</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation>Modo (Cabrillo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation>Número con ceros</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation>Gestor de plantillas Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation>Importar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation>Importar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation>Exportar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation>Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation>Nueva plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation>Nuevo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation>Copiar plantilla existente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation>Copiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation>Eliminar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation>Nombre de la plantilla:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation>Nombre del concurso:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation>Modo predeterminado:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation>Columnas de línea QSO:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation>Nombre del concurso según las reglas. Es posible introducir una cadena personalizada si no está incluida en la lista.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation>N.º</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation>Campo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation>Formateador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation>Ancho</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation>Etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation>Añadir línea</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation>Eliminar línea seleccionada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation>Nueva plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation>Copia – %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation>Eliminar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation>¿Eliminar la plantilla «%1»?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation>Importar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation>Plantilla Cabrillo de QLog (*.qct)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation>Importación fallida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation>Exportar plantilla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation>Exportación fallida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation>No se pudo escribir el archivo: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation>Archivo no encontrado: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation>No se puede abrir el archivo: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation>Archivo de plantilla inválido: falta el nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation>No se puede iniciar la transacción de base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation>Alerta de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation>No se puede guardar la plantilla «%1»: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Se usará el libro de guaria secundario&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation>Chat ON4KST</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>Sala de Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>Conectar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>Nuevo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>Alerta de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>Chat ON4KST no está configurado apropiadamente.&lt;p&gt; Por favor usar &lt;b&gt;Ajustes&lt;/b&gt; para configurarlo.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>Activado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>Desactivado</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Reloj</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>Amanecer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>Ocaso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation>S/D</translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>Clave API no válida</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>La Operación de Clublog para el indicativo %1 ha fallado.&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Ajustes de Visibilidad de Columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>General</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>Mi Información</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation>QSL y Libros de Guardia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>Miembros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>Condiciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>Concursos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>Otros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>Hecho</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>Seleccionar Nada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>Seleccionar Todo</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Ajustes de Visibilidad de Columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>Hecho</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation>Entidades DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation>Informació de Satélites</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation>Cumbres SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation>Registros WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation>Registros IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation>Registros POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation>Registros del Directorio de Miembros</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation>Clublog CTY.XML</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation>Lista de Valores</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation>Actualizando </translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation> Actualización Fallida</translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation>Fonía</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>Afganistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>Is. Agalega y San Brandon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>Is. Aland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>Alaska</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>Albania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>Argelia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>Samoa Americana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>Is. San Pablo y Ámsterdam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>Is. Andamán y Nicobar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>Andorra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>Angola</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>Anguilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>Is. Annobón</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>Antártida</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>Antigua y Barbuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>Argentina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>Armenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>Aruba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>Is. Ascensión</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>Rusia Asiática</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>Turquía Asiática</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>Is. Australes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>Australia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>Austria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>Is. de Aves</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>Azerbaiyán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>Azores</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>Bahamas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>Baréin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>Is. Baker y Howland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>Is. Baleares</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>Is. Banana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>Bangladesh</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>Barbados</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>Bielorrusia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>Bélgica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>Belice</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>Benín</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>Bermudas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>Bután</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>Bolivia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>Bonaire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>Bosnia y Herzegovina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>Botsuana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>Bouvet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>Brasil</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>Is. Vírgenes Británicas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>Brunéi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>Bulgaria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>Burkina Faso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>Burundi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>Camboya</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>Camerún</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>Canadá</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>Is. Canarias</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>Cabo Verde</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>Is. Caimán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>República Centroafricana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>Kiribati Central</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>Ceuta y Melilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>Chad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>Is. Chagos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>Is. Chatham</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>Is. Chesterfield</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>Chile</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>China</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>Is. de Navidad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>Is. Clipperton</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>Is. Cocos (Keeling)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>Is. del Coco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>Colombia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>Islas Comoras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>Conway Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>Córcega</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>Costa Rica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>Costa de Marfíl</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>Creta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>Croacia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>Is. Crozet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>Cuba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>Curazao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>Chipre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>Rep. Checa (Chequia)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>Corea del Norte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>República Democrática del Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>Dinamarca</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>Is. Desecheo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>Yibuti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>Dodecaneso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>Dominica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>Rep. Dominicana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>Is. Ducie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>Malasia Oriental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>Is. de Pascua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>Kiribati Oriental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>Ecuador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>Egipto</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>El Salvador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>Inglaterra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>Guinea Ecuatorial</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>Eritrea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>Estonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>Etiopía</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>Rusia Europea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>Is. Falkland (Malvinas)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>Is. Feroe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>Alemania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>Fernando de Noronha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>Fiyi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>Finlandia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>Francia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>Tierra Franciso José</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>Guayana Francesa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>Polinesia Francesa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>Gabón</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>Is. Galápagos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>Georgia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>Ghana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>Gibraltar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>Is. Glorioso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>Grecia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>Groenlandia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>Granada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>Guadalupe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>Guam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>Bahía de Guantánamo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>Guatemala</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>Guernsey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>Guinea-Bisáu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>Haití</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>Hawái</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>Is. Heard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>Honduras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>Hong Kong</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>Hungría</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>ITU Ginebra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>Islandia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>India</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>Indonesia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>Irán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>Iraq</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>Irlanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>Isla de Man</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>Israel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>Italia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>Jamaica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>Jan Mayen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>Japón</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>Jersey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>Is. Johnston</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>Jordania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>Is. Juan Fernández</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>Juan de Nova, Europa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>Kaliningrado</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>Kazajistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>Kenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>Is. Kerguelen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>Is. Kermadec</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>Reino de Esuatini</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>Is. Kure</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>Kuwait</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>Kirguistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>Is. Laquedivas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>Laos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>Letonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>Líbano</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>Lesoto</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>Liberia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>Libia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>Liechtenstein</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>Lituania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>Is. Lord Howe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>Luxemburgo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>Macao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>Is. Madquarie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>Madagascar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>Is. Madeira</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>Malawi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>Maldivas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>Malí</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>Is. Malpelo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>Is. Mariana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>Market Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>Is. Marquesas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>Is. Marshall</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>Martinica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>Mauritania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>Mauricio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>Mayotte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>Arrecife Mellish</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>México</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>Micronesia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>Is. Midway</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>Minami Torishima</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>Moldavia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>Mónaco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>Mongolia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>Montenegro</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>Monserrat</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>Marruecos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>Monte Athos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>Mozambique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>Myanmar (Birmania)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation>Islas Subantárticas de N.Z.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>Namibia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>Nauru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>Is. Navassa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>Nepal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>Países Bajos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>Nueva Caledonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>Nueva Zelanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>Nicaragua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>Niger</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>Nigeria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>Niue</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>Is. Norfolk</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>Is. Cook del Norte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>Macedonia del Norte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>Irlanda del Norte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>Noruega</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>Ogasawara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>Omán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>Pakistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>Palau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>Palestina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>Is. Palmyra y Jarvis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>Panamá</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>Papúa Nueva Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>Paraguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>Perú</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>Is. Pedro I</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>Filipinas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>Is.Pitcairn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>Polonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>Portugal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation>Is. Príncipe Eduardo y Marion</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>Is. Pratas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>Puerto Rico</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>Qatar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>Corea del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>República de Kosovo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>Sudán del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>República del Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>Is. Reunión</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>Islas Revillagigedo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>Is. Rodrigues</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>Rumania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>Is. Rotuma</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>Ruanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>Saba y San Eustaquio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>Is. Sable</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>San Andrés y Providencia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>San Félix y San Ambrosio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>San Marino</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>Santo Tomé y Príncipe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>Cerdeña</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>Arabia Saudita</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>Arrecife Scarborough</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>Escocia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>Senegal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>Serbia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>Seychelles</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>Sierra Leona</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>Singapur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>Sint Maarten</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>Rep. Eslovaquia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>Eslovenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>Is. Salomón</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>Somalia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>Sudáfrica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>Is. Cook del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>Is. Georgias del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>Is. Orcadas del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>Is. Sandwich del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>Is. Shetland del Sur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>Orden de Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>España</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>Is. Spratly</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>Sri Lanka</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>Isla San Bartolomé</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>Santa Helena</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>San Cristóbal y Nieves</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>Isla de Santa Lucía</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>Isla de San Martín</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation>Is. de San Pablo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>San Pedro y San Pablo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>San Pedro y Miquelón</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>Isla San Vicente</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>Sudán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>Surinam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>Svalbard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>Is. Swains</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>Suecia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>Suiza</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>Siria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>Taiwán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>Tajikistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>Tanzania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>Provincia Temotu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>Tailandia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>Gambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>Timor Oriental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>Togo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>Is. Tokelau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>Tonga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>Islas Trinidad y Martín Vaz</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>Trinidad y Tobago</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>Islas Tristán de Acuña y Gough</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>Is. Tromelin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>Túnez</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>Turkmenistán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>Is. Turcas y Caicos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>Tuvalu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation>Área Soberana Inglesa en Chipre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>Is. Vírgenes Americanas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>Uganda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>Ucrania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>Emiratos Árabes Unidos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>ONU Nueva York</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation>Estados Unidos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>Uruguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>Uzbekistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>Vanuatu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>Ciudad del Vaticano</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>Venezuela</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>Vietnam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>Wake Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>Gales</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>Wallis y Futuna Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>Malasia Occidental (Peninsular)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>Kiribati Occidental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>Sahara Occidental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>Willis Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>Yemen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>Zambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>Zimbabue</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation>Lista de envío DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation>Opciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation>Mi Entidad DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation>Filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation>Categoría</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation>Mixto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation>Fonía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation>Confirmado por</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation>Mostrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation>Aún no enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation>Enviado (no concedido)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation>Ya concedido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation>Alcance de banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation>Seleccionar bandas predefinidas DXCC de 5 bandas (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation>DXCC de 5 bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation>Seleccionar todas las bandas elegibles para DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation>Todas las bandas DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation>Bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation>Seleccione las opciones anteriores y la lista se actualizará automáticamente.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation>Exportar los contactos listados arriba a un archivo ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation>Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation>Sin filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation>Cualquier banda (nivel de entidad)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation>DXCC de 5 bandas (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation>Selección personalizada de bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation>Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation>Prefijo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation>Fecha</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation>Enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation>Concedido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation>Exportar ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation>No hay contactos para exportar.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation>No se pudieron obtener los registros de contactos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation>Exportar la lista de envío DXCC como ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation>cualquier banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation>5 bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation>todas las bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation>%1 banda(s) seleccionada(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation>Ningún contacto coincide con los criterios seleccionados.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation>%1 %2 %3 — DXCC %4 / %5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation>ranura de banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation>entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation>entrada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation>entradas</translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>Nueva Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>Nueva Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>Nuevo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>Nueva Banda y Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>Nuevo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>Solicitado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>En Cola</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>Inválido</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>Directa</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>Electrónica</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>Modificado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation>Línea Gris</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>Otro</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation>Paso Corto</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation>Paso Largo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>No Escuchado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>Dudoso</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation type=\"unfinished\">Pala Simple</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation>Confirmado (AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation>Confirmado (non-AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation>Desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <translation>Reflexión por Aviones</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation>Aurora-E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation>Aurora</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation>Retrodispersión</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation>EchoLink</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation>Tierra-Luna-Tierra</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation>Esporádica E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation>Reflexión F2</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation>Irregularidades FAI</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation>Ondas de Tierra</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation>Asistido por Internet</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation>Dispersión Ionosférica</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation>Línea de Visión</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation>Dispersión Meteórica</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation>Repetidor o transpondedor terrestre o atmosférico</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation>Dispersión por Lluvia</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation>Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation>Trans-ecuatorial</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation>Conductos Troposféricos</translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation>Herramientas dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation>Registro de depuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation>Reglas de registro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation>p. ej. qlog.ui.*.runtime=true</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation>Aplicar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation>Generar archivo de depuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation>Exportar archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation>Consola SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation>Abrir SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation>Guardar SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation>Ejecutar SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation>Exportar como</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation>Introduzca la consulta SQL aquí... Ctrl+Enter = ejecutar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation>Abrir consulta SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation>Archivos SQL (*.sql);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation>Error al abrir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation>No se puede abrir el archivo:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation>Guardar consulta SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation>Error de guardado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation>No se puede guardar el archivo:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation>Consulta guardada en %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation>Error: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation>%1 fila(s) mostrada(s) (recortado a %2) en %3 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation>%1 fila(s) devuelta(s) en %2 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation>Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation>No hay resultados para exportar.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation>Error de exportación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation>No se puede abrir el archivo para escritura:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation>Exportadas %1 fila(s) a %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation>Archivos de texto (*.txt);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation>Archivos CSV (*.csv);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation>Exportar ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation>No se encontraron IDs de contacto válidos en el conjunto de resultados.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation>No se pudieron obtener los registros de contactos:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation>No se encontraron contactos coincidentes en la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation>Reglas de registro restablecidas (predeterminadas)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation>Reglas de registro aplicadas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation>Guardar registro de depuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation>Actualmente no se está escribiendo ningún archivo de registro de depuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation>Archivos de registro (*.log);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation>Registro de depuración guardado en %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation>No se pudo copiar el archivo de registro de depuración.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation>El registro en archivo está desactivado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation>Archivo de registro: %1</translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>Descargar QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>Perfil de QTH en eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSLs desde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSO desde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>Mi Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;Descargar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW no está configurado apropiadamente.&lt;p&gt; Por favor usar &lt;b&gt;Ajustes&lt;/b&gt; para configurarlo.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL no está configurado apropiadamente.&lt;p&gt; Por favor usar &lt;b&gt;Ajustes&lt;/b&gt; para configurarlo.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>Descargando desde %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>Procesando %1 QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>Error al actualizar %1: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>Información de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>No se ha seleccionado ningún servicio</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>Filtros del DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>Filtro Generales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>Bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>Modos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>Fonía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>Norteamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>África</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>Antártida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>Sudamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>Estado del Registro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>Nuevo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>Nueva Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>Nueva Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>Nuevo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>Filtros Extendidos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>Continente del Anunciante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>No mostrar los siguientes spots cuando tengan el mismo indicativo y su diferencia horaria sea inferior a Time Diff y su diferencia de frecuencia sea inferior a Freq Diff</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>Deduplicación de Anuncios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translatorcomment>Diferencia Horaria</translatorcomment>\n        <translation>Diferencia Horaria</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translatorcomment>Diferencia de Frecuencia</translatorcomment>\n        <translation>Diferencia de Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation>Khz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>No hay ninguna lista de clubes habilitada</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation>Anunciante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>Continente del Anunciante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>País</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>Inserte &lt;b&gt;nombre de host:puerto&lt;/b&gt; del servidor del  Cluster DX.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>Conectar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>Filtrado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation>Anuncios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>A Todo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>Consola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>Búsqueda de texto completo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>Búsqueda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>Cerrar búsqueda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>Enviar comando de Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>Filtrar...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>Filtrar Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translation>Anun. Últ. QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>Anunciar el último QSO realizado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>Mostrar Estadísticas de HF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>Mostrar Estadísticas de VHF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>Mostrar WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>Mostrar WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilidad de Columnas...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Qué columnas deben mostrarse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>Conectar al inicio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>Conectar automáticamente después de iniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>Borrar Servidor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>Cluster DX - Eliminar Servidor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>Borrar Contraseña</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>Mantener Anuncios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>Los anuncios no se borran al conectarse a un nuevo clúster DX.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>Borrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>Borrar todos los datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>Búsqueda...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC - Búsqueda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>Mi continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>Automático</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>Conectando...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>El Cluster DX no está disponible temporalmente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>Error del Servidor del Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>Un indicativo inválido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>Contraseña del Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>Aviso de Seguridad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>La contraseña se puede enviar a través de un canal no seguro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>Servidor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>Nombre de Usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>Desconectar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>Comando de DX Cluster</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>Contraseña o PerfilQTH Id incorrectos</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>Nombre de usuario o contraseña incorrectos</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>Error Desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>No se puede abrir el archivo temporal</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>No se puede guardar la imagen en el archivo</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>Respuesta Desconocida de eQSL</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>Editar actividades</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>Actividades</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Añadir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Eliminar</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>Exportar los QSOs Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>Tipo de Exportación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>Conjunto de columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>Select one of the pre-defined sets of columns or define your own set of columns</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>Editar el conjunto actual de columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>Marcar QSOs exportados como enviados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>Exporta solo QSOs que coincidan con los filtros activos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>Filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>Exporte solo QSOs que coincidan con el rango de fechas seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>Rango de Fechas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>Exporta solo QSOs que coincidan con Mi Indicativo seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>Mi Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>Exporta solo QSOs que coincidan con Mi Locator seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>Mi Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>Exporte solo los QSO que coincidan con el Valor de Enviar QSL Vía seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>Enviar QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>Incluir estados inusuales de QSO enviados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>Incluir Estado de Envío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En circunstancias normales, este estado significa &lt;b&gt;&quot;Ignorado/Inválido&quot;&lt;/b&gt;.&lt;br/&gt;Sin embargo, a veces es posible que desee ignorar esta configuración al enviar una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>&quot;Ignorar&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En circunstancias normales, este estado significa &lt;b&gt;&quot;no enviar&quot;&lt;/b&gt;.&lt;br/&gt;Sin embargo, a veces es posible que desee ignorar esta configuración al enviar una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>&quot;No&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>Reenviar QSOs ya enviados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>Ya está Enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>Filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>Exportar QSO que coincidan con el filtro de QSO de usuario seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation>Perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>Exportar QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation>Exportar solo los QSO que coincidan con este perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation>Exportando…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>No se pueden marcar los QSOs exportados como enviados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>Genérico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>Todas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation>Mínimo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>Específico de QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>Personalizado 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>Personalizado 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>Personalizado 3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation>Empaquetar datos y configuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation>Introduzca una contraseña para cifrar las credenciales almacenadas.\nEsta contraseña será necesaria más adelante para restaurarlas.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation>Contraseña</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation>Aleatorio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation>Confirmar contraseña</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation>Eliminar las contraseñas del almacén de credenciales después de la exportación</translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>Se agotó el tiempo de espera</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>Tiempo de espera agotado para la respuesta de FLRig</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>Error de red</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>Mensaje de respuesta con formato incorrecto</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translatorcomment>Ninguno</translatorcomment>\n        <translation>Ninguno</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translatorcomment>Sintonización asistida por ordenador</translatorcomment>\n        <translation>CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translatorcomment>Terminal de datos listo (DTR) es una señal de control en comunicaciones serie RS-232, transmitida desde un equipo terminal de datos (DTE), como una computadora, a un equipo de comunicaciones de datos (DCE), por ejemplo un interface, para indicar que el terminal está listo para comunicaciones y el interface puede iniciar un canal de comunicaciones.</translatorcomment>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translatorcomment>Control de Señal del Puerto Serie</translatorcomment>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translatorcomment>No se puede configurar el tipo de PTT</translatorcomment>\n        <translation>No se puede configurar el tipo de PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translatorcomment>No se puede configurar la acción del PTT</translatorcomment>\n        <translation>No se puede configurar la acción del PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation>No se puede establecer la dirección CI-V</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>Controlador de Radio No Soportado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>No se puede establecer auto_power_on</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation>No se puede establecer no_xchg en 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>Conexión fallida</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation>Error al establecer la frecuencia TX</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>Error al Establecer Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation>Error al establecer split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>Error al establecer el modo</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation>Error al establecer el modo split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>Error al Establecer PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>No se puede enviar Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>No se puede detener Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>Error al Obtener Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>Error al Obtener Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>Error al obtener el VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener PWR (power2mw)</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtenerfunción de RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener función XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Error al obtener KeySpeed</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translatorcomment>No se puede visualizar</translatorcomment>\n        <translation>Configurar error de KeySpeed</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>Controlador de Rotor No Soportado</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>Conexión fallida</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>Error al Establecer Posición</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>Error al Obtener Posición</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>Importar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>Rango de Fechas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>Importar todos o sólo los QSOs del período determinado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>Todos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>Opciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>El valor se utiliza cuando un registro de entrada no contiene el valor ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>Valores predeterminados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>Mi Perfil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>Mi Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation>Si falta el DXCC en el registro importado, se resolverá a partir del indicativo.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation>Completar la información de entidad DXCC faltante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>Seleccionar Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Los valores siguientes se utilizarán cuando un registro de entrada no contenga los valores ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;QSO en Log:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Importando:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>QSO Duplicado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;¿Quiere importar QSO duplicado?&lt;/p&gt;%1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>Guardar al Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>Resumen de Importación de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>Fecha de Importación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>Archivo Importado</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>Importado: %n contacto/s</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>Alerta/s: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>Error/s: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>Detalles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>Resultado de Importación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>Guardar Detalles...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>La contraseña se guardará en el Almacén de Credenciales.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>Recordar Contraseña</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>Usuario desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>Contraseña incorrecta</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>Mensajes de Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>Mensajes valiosos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>Borrar el indicativo seleccionado y la entrada de mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>Enviar mensaje de chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>Visibilidad de Columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Qué columnas deben mostrarse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>Preparar QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>Transferir información de Indicativo y Locator a Nuevo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>Mostrar Acerca de Mi Únicamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>Mostrar solo mensajes que contengan mi indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>Suprimir Usuario a Usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>Suprimir mensajes privados entre dos indicativos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>Resaltar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>Resaltar mensajes basados en los ajustes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>Reglas de Resaltado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation>Haz Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>Borrar Mensajes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>Borrar todos los mensajes en la ventana</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>Usted</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>Editar Regla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>Nombre de la Regla</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>Sala de Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>Habilitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>Resaltar mensaje que coincida con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>Todas las siguientes condiciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>Cualquiera de las siguientes condiciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>Agregar Condición</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>Todos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation>Remitente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>Mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>Comience con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>No debe estar vacío</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>Reglas de Resaltado de Mensajes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Reglas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>Agregar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Estado</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>Borrar</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation>Desempaquetar datos y configuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation>Alerta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;¡La base de datos actual será ELIMINADA!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;¡Todas las contraseñas almacenadas serán ELIMINADAS!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;La aplicación se reiniciará después de la carga&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Para conservar los datos, utilice primero Pack Data &amp;amp; Settings o Export QSOs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation>Seleccionar base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation>Archivo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation>Estado: Ningún archivo seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation>Descifrar credenciales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation>Introduzca la contraseña para descifrar las credenciales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation>Contraseña:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation>Cargar y reiniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation>Contraseña incorrecta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation>Seleccionar archivo de base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation>Exportación de base de datos QLog (*.dbe);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation>No se puede crear el archivo temporal</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation>Descomprimiendo base de datos…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation>No se puede descomprimir el archivo de la base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation>No se puede abrir la base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation>Base de datos válida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation>Plataforma diferente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation>Se requiere contraseña para importar credenciales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation>No hay credenciales cifradas en la base de datos</translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>No se puede encontrar la información de mi entidad DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>Un conjunto mínimo de campos no presentes (hora_inicio, indicativo, banda, modo, indicativo de estación)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>Fuera del rango de fechas seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>Duplicado</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>La información DXCC falta</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>no hay Indicativo de Estación presente</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>No se puede insertar en la base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>Importado</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>Estado DXCC:</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>Alerta</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translation>ID QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>Hora inicio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>Hora fin</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>Submodo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>Nombre (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>País (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>Prefijo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>Estado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>Condado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>Fecha QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>Fecha QSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>Fecha LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTWe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>Fecha LoTWe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>Potencia TX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>Campos Adicionales</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>Dirección (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>Dirección</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>Edad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>Altitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>A-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>Antena Az</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>Antena El</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>Paso de Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>Sección ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation>Diploma Presentado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation>Diploma Otorgado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>Banda RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>Locator Extendido</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation>Prueba de Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>Categoría</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>Fecha de carga en ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>Estado de carga en ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>Comentario (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>Operador Contactado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>ID del Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>País</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>Condado Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation>Crédito Recibido</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation>Crédito Otorgado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>Fecha DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>Fecha DCLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation>DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation>DCLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>Distancia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>EMail</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>Indicativo del Propietario</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation>eQSL AG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>Fecha eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>Fecha eQSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSLe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation>Número FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation>CC FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>Inicio EME</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>Frecuencia RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>Operador Invitado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>Fecha de carga en HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>Estado de carga en HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>Fecha de carga en HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>Estado de carga en HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>Fecha de carga en HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>Estado de carga en HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>ID IOTA de la Isla</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>K-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>Latitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>Longitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation>Ráfagas Máximas</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation>Nombre Lluvia Meteroros</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>Mi Altitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>Mi Antena (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>Mi Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>Mi Ciudad (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>Mi Ciudad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>Mi Condado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>Mi Condado Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>Mi Condado (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>Mi País</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>Mi Zona CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>Mi DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>Mi DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>Mi FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>Mi Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>Mi Locator Extendido</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>Mi IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>Mi ID IOTA de la isla</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>MI ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>Mi Latitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>Mi Longitud</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>Mi Nombre (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>Mi Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>Mi Código Postal (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>Mi Código Postal</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>Mi Ref POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>Mi Radio (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>Mi Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation>Mi Actividad de Interés Especial (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mi Actividad de Interés Especial</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation>Mi Info de Actividad de Interés Especial (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation>Mi Info de Actividad de Interés Especial</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>Mi SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>Mi Estado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>Mi Calle</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation>Mi Condado USA-CA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mi Locator VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>Notas (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>Fecha de descarga de QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>Estado de la descarga QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation type=\"unfinished\">Mensaje del QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation>Potencia recibida</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>Número recibido</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>Intercambio recibido</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation>Número enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation>Intercambio enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation>Precedencia del Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo de Propagación</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>Clave de Cifrado Pública</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>Fecha de carga en QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>Estado de carga en QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>Mensaje del QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicativo del operador</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSLr Vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSLe Vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>QSO Completado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation>QSO Aleatorio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>Región</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation>Radio (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation>Equipo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>Modo del Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>Nombre del Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation>Flujo Solar</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>Miembro SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicativo de la Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Número Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>Miembro UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation>Condado USA-CA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation>Provincia VE</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation>Mi Sección ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>Mi WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST Enviadas</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST Recibidas</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL Recibida</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Enviada</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>Eliminar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>Libro de Guardia - Eliminar QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>Actualización del Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>Libro de Guardia - Editar Valor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translatorcomment>Envía un Spot de DX</translatorcomment>\n        <translation>Enviar Spot de DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>El libro envia Spot de DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>Subir a Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>Buscar en la Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>Añadir la información que falta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation>Marcar QSL como recibida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation>Marcar QSL solicitada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>Filtrar Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>Editar Valor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation>Visibilidad de Columnas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Qué columnas deben mostrarse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>Exportar Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>Exportar los QSOs seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>¿Eliminar los conactos seleccionados?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>Borrando QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>Actualizar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>Al actualizar, todas las filas seleccionadas se verán afectadas.&lt;br&gt;El valor actualmente editado en la columna se aplicará a todas las filas seleccionadas.&lt;br&gt;&lt;br&gt;¿Quieres editarlas?</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translation>\n            <numerusform>QSO: %n</numerusform>\n            <numerusform>QSOs: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Descargando Imágen de eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>Todas las bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>Todos los modos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>Todos los países</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>Sin filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>Alerta de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>Cada lote admite hasta 100 QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>Actualización de QSOs Progreso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>Error al iniciar sesión en el Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>Error del Libro de Guardia: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>Todos los clubes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>La descarga de imágen de eQSL  ha fallado: </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>No se puede abrir el archivo temporal</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation>Usuario o contraseña incorrectos</translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>Carga cancelada por el usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>Carga rechazada por LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>Respuesta inesperada del servidor TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>Error de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>Error de TQSLlib</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>No se puede abrir el archivo de entrante</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>No se puede abrir el archivo saliente</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>Todos los QSOs estaban duplicados o fuera de rango</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>Algunos QSOs estaban duplicados o fuera de rango</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>Error de sintaxis</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>Error de conexión a LoTW (no hay red o LoTW es inaccesible)</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>Error inesperado de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>TQSL no encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL falló</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>&amp;Libro de Guardia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>E&amp;quipo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>A&amp;yuda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>&amp;Ventana</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation>&amp;Servicios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>Barra de herramientas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>Reloj</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>Mapa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation>Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation>Mapa de Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>Mapa en línea</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation>Consola CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>Imágen de Perfil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>Alertas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>&amp;Ajustes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exportar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>Conectar &amp;Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>&amp;Acerca de</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>Subir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>Servicios - Subir QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>Descargar QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>Servicios - Descargar QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>Salir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>Aplicación - Salir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>Nuevo QSO - Limpiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>Nuevo QSO - Guardar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>Es&amp;tadísticas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>Conectar R&amp;otor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>&amp;Filtrar QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation>&amp;Diplomas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>Editar Reglas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>Limpiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>Mostrar Alertas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation>Campana</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>Comprobación de duplicados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>Secuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>Intercambio de enlaces con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation>Empaquetar datos y configuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation>Desempaquetar datos y configuración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation>&amp;Galería QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation>Herramientas dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation>Ejecutar consultas SQL personalizadas de solo lectura sobre la base de datos del log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation>&amp;Imprimir etiquetas QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation>&amp;Lista de envío DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation>Generar una lista de contactos para presentar para el crédito del premio ARRL DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>Conectar &amp;Manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>Reportar &amp;Bug...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>Entrada &amp;Manual</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>Cambia la pantalla de Nuevo Contacto a Entrada Manual&lt;br/&gt;(hora, frec, perfiles etc. no se tomarán de las fuentes habituales)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation>Lista de Correo...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>Guardar Disposición</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>Mantener Opciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>Restaurar las opciones de conexión después de reiniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>Libro de Guardia - Buscar Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>Nuevo QSO - Agregar texto del campo Indicativo al Mapa de Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>Radio - Bajar Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>Radio - Subir Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>Nuevo QSO - Usar el indicativo del Whisperer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>Consola CW - Subir Velocidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>Consola CW - Bajar Velocidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>Consola CW - Subir Perfil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>Consola CW - Bajar Perfil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>Radio - PTT Enc./Apag</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>Todas las bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>Cada banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>Cada banda y modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>Sin control</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>Único</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>Por banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>Parar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>Restablecer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>Ninguno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation>Tema: Native</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation>Tema: QLog Light</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation>Tema: QLog Dark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation>Novedades</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation>Exportar Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation>Tema de color</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>No habilitado para estilos que no sean Fusion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>Presione para sintonizar la alerta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Error de carga inmediata de Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Detalle del Error:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>Op: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>Una nueva versión</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>Una nueva versión %1 está disponible.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>Recordármelo más tarde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>Descargar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation>No se pudo cifrar las credenciales.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation>Archivos de base de datos (*.dbe);;Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation>No se pudo crear el archivo temporal.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation>No se pudo volcar la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation>Comprimiendo base de datos…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation>Base de datos exportada con éxito a\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation>No se pudo comprimir la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation>No se pudo preparar la base de datos para la importación.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>Clásico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>¿Desea eliminar el filtro Concurso %1?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>Concurso: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Basado en Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Iconos por &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Imágenes satelitales por &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;Detección de zonas por &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;Base de datos de zonas horarias por &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>Acerca de</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation>S/D</translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation>Línea Gris</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation>Haz Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation>Aurora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>Rutas</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translatorcomment>Contacto duplicado.</translatorcomment>\n        <translation>&lt;b&gt;DUPL !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>Guardar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>Consulta el indicativo en la web. La URL de consulta se puede cambiar en Ajustes -&gt;Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>Hora Inicio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>Reiniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>Fecha</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>Duración</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation>Información</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Detalles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>Estado de envío de QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sí&lt;/b&gt;: se ha enviado una tarjeta QSL; el QSO ha sido cargado y aceptado por el servicio en línea&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - no envié una tarjeta QSL; no cargué el QSO al servicio en línea&lt;br/&gt;&lt;b&gt;Solicitado&lt;/b&gt; - la estación contactada ha solicitado una tarjeta QSL; la estación contactada ha solicitado que el QSO se cargue en el servicio en línea&lt;br/&gt;&lt;b&gt;En cola&lt;/b&gt; - se ha seleccionado una tarjeta QSL para enviar; Se ha seleccionado un QSO para subir al servicio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>Enviar QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo de Propagación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>Estadísticas D&amp;X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Estadísticas DXCC&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Estadísticas de la estación&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>&amp;Mi Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation>Equipo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>Mis N&amp;otas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>Miembro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>Expandir/Contraer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>Solicitado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>En Cola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>Ignorado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>Directa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>Electrónica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>Error al iniciar sesión en el Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>Nueva Entidad!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>Nueva Banda!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>Nuevo Modo!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>Nueva Banda y Modo!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>Nuevo Slot!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GE</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>Búsqueda en Callbook desactivada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>Búsqueda en Callbook activada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>Debe rellenarse el ID del concurso para activarlo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>dos o cuatro locators adyacentes, cada uno de cuatro caracteres (ej. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>el DARC DOK (código de ubicación de distrito) de la estación contactada (ej. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation>World Wide Flora &amp; Fauna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation>Grupo de Actividades Especiales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation>Información Grupo de Actividades Especiales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation>No es el nombre del concurso, sino un ID de concurso asignado (ej. CQ-WW-CW para CQ WW DX Contest (CW)) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>Descripción del equipo de la estación contactada</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>Equipo 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>Equipo 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>El estado del equipo ha cambiado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>El equipo no está conectado</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>Equipo 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>Equipo 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>Equipo 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>Equipo 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>El estado del equipo ha cambiado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>El equipo no está conectado</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation>Rot 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>No se puede vincular un puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>No se puede obtener la dirección IP para</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>Sin dirección IPv4 para</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation>Se produjo un error</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>Se ha agotado el tiempo de espera de la operación</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>Administrar QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>QSLs Disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>Copie el archivo de la carpeta de origen a la carpeta de almacenamiento interno de QSL de QLog.&lt;br/&gt;El archivo original permanece sin cambios en la carpeta de origen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>Importar QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>Agregar Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>Borrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>¿Borrar QSL?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>Abrir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation>Favorito</translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation>Configuración específica de la plataforma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation>La base de datos se exportó desde una plataforma diferente.\nVerifique o actualice la siguiente configuración.\nPuede dejar los campos vacíos y configurarlos más tarde en Configuración.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation>Ajustes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation>Valor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation>Continuar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation>Seleccionar Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation>Todos los archivos (*)</translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>Imágen de Perfil</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>Ayuda de QLog</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>QLog Crítico</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>No se puede guardar una contraseña para %1 en el almacén de credenciales</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>No se puede obtener una contraseña para %1 del almacén de credenciales</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>Alerta de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>Error al actualizar la lista de clubes. No se pueden eliminar registros antiguos</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>Error al actualizar la lista de clubes. No se pueden planificar nuevas descargas</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>Descarga inesperada de la lista de clubes. Cancelar próximas descargas</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>Contenido inesperado de la lista de clubes para</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>Error de red. No se puede descargar la lista de clubes para</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>QLog ya se está ejecutando</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation>No se pudo procesar la importación pendiente de la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation>La base de datos se importó correctamente, pero no se pudieron restaurar las contraseñas almacenadas (falló la descifrado o los datos están corruptos). Todas las contraseñas de los servicios se han borrado y deben volver a introducirse en Configuración.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>No se pudo conectar a la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>No se pudo exportar una base de datos QLog a ADIF como copia de seguridad.&lt;p&gt;Intente exportar su registro a ADIF manualmente</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>Error en la migración de la base de datos.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>Información de Qlog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>El nombre de la actividad ya existe.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>El nombre de la regla ya existe.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>La expresión regular del Indicativo es incorrecta.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>La expresión regular del Comentario de llamada es incorrecta.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>No se pueden actualizar las reglas de alerta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>Error en el nombre del servidor del Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>La dirección del servidor del Cluster DX debe tener el formato&lt;p&gt;&lt;b&gt;[nombre de usuario@]nombre de host:puerto&lt;/b&gt; (ej. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>Contraseña del Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>Contraseña incorrecta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>Error en la conexión del servidor del Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>El nombre del archivo está vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>No se puede escribir el archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>Información de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>Exportado.</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>Exportado: %n contacto/s.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>Error del Chat: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>El nombre del filtro ya existe.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Error del Equipo:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Error del Rotor:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Error del Manipulador:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>Los campos &lt;b&gt;%0&lt;/b&gt; no se guardarán porque &lt;b&gt;%1&lt;/b&gt; no está completado.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>Tu indicativo está vacío. Por favor, configure su Perfil de Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>Por favor, defina al menos un Perfil de Ubicaciones de Estaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>WSJTX Multicast está habilitada pero la dirección no es una dirección de multidifusión.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation>Bucle detectado. El reenvío UDP en bruto usa el mismo puerto que el puerto de recepción de WSJT-X.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>El puerto de la Radio debe ser un puerto COM válido.&lt;br&gt;Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>El puerto de control del PTT debe ser un puerto COM válido.&lt;br&gt;Para Windows utilice COMxx, para SO tipo unix utilice una ruta al dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;Rango TX&lt;/b&gt;: la frecuencia máxima no debe ser 0.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;Rango TX&lt;/b&gt;: la frecuencia máxima no debe estar por debajo de la frecuencia mínima.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>El puerto del Rotor debe ser un puerto COM válido.&lt;br&gt;Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>El puerto del Manipulador debe ser un puerto COM válido.&lt;br&gt;Para Windows use COMxx, para sistemas operativos tipo Unix use una ruta al dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>No se puede cambiar el modelo de Manipulador a &lt;b&gt;Morse sobre CAT&lt;/b&gt;&lt;br&gt;No se admite Morse sobre CAT para la/s Radio/s &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>No se puede eliminar el Perfil del Manipulador&lt;br&gt;El Perfil del Manipulador es utilizado por la/s radio/s: &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>El Indicativo tiene un formato no válido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>El indicativo del operador tiene un formato no válido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translatorcomment>La cuadrícula no es válida en ese formato.</translatorcomment>\n        <translation>El Locator tiene un formato no válido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>El Locator VUCC tiene un formato no válido (debe se 2 o 4 dígitos separadas por &apos;,&apos;)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>El País no debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>La Zona CQ no debe estar vacía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>ITU no debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>No se pueden actualizar las condiciones del filtro QSO</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>km</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>millas</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>Conexión Denegada</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>El host cerró la conexión</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>Host no encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>Se agotó el tiempo de espera</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>Error de red</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>Error Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation>Importando base de datos</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>Abriendo Base de Datos</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>Respaldando Base de Datos</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>Migrando Base de Datos</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>Iniciando Aplicación</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>Mi Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicativo de la Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>Mi Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>Nombre del operador</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicativo del operador</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>Mi Ciudad</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>Mi País</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>Mi Condado</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>Mi IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>Mi SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mi Actividad de Interés Especial</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>Mi Info de Actividad de Interés Especial</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mi Locator VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>Mi WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>Mi Ref POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>Mi DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>MI ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>Mi Zona CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>Mi DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>No se puede conectar al servidor del Cluster DX &lt;p&gt;Razón &lt;b&gt;: </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;Importado&lt;/b&gt;: %n contacto/s</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Alerta/s&lt;/b&gt;: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Error/es&lt;/b&gt;: %n</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation>No es una base de datos QLog válida</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation>La versión de la base de datos es demasiado nueva (requiere una versión más reciente de QLog)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation>La base de datos no es un archivo de exportación de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation>Ruta de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation>(Ruta interna de Flatpak)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation>Generador CW</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation>TOTAL Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation>TOTAL Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>Error General</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation>Galería de tarjetas QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation>Buscar por indicativo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation>Ordenar por:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation>Exportar filtrados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation>Fecha (más reciente)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation>Fecha (más antigua)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation>Indicativo (A-Z)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation>Indicativo (Z-A)</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation>\n            <numerusform>%n tarjeta(s) QSL</numerusform>\n            <numerusform>%n tarjeta(s) QSL</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation>Todas las tarjetas QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation>Favoritos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation>Por país</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation>Por fecha</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation>Por banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation>Por modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation>Por continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation>Quitar de favoritos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation>Añadir a favoritos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation>Abrir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation>Guardar…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation>Guardar tarjeta QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation>Exportar tarjetas QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation>Exportadas %1 de %2 tarjetas</translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>Resumen de Importación de QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>Resumen</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>Descargadas:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>Actualizadas:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>Incomparables:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>Errores:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>Detalles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>QSLs Nuevas: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>QSOs actualizados: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translation>QSLs Incomparables: </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation>Imprimir etiquetas QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation>Filtrar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation>Rango de Fechas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation>Mi Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation>Perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Enviada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation>Filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation>Plantilla de etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation>Tamaño de página:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation>Columna:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation>Fila:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation>Ancho de la etiqueta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation>Altura de la etiqueta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation>Margen izquierdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation>Margen superior:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation>Espaciado horizontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation>Espaciado vertical:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation>Apariencia de la etiqueta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation>Imprimir bordes de etiquetas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation>QSOs por etiqueta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation>Texto de pie de página izquierdo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation>Texto de pie de página derecho:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation>Omitir etiqueta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation>Fuente sans-serif:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation>Fuente monoespaciada:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation>Tamaño del indicativo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation>Tamaño de «To Radio»:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation>Texto «To Radio»:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation>Tamaño del encabezado:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation>Tamaño de datos:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation>Texto del encabezado de fecha:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation>Formato de fecha:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation>Texto del encabezado de hora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation>Texto del encabezado de banda:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation>Texto del encabezado de modo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation>Texto del encabezado QSL:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation>Columna adicional:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation>Texto de la columna adicional</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation>(nombre de columna de BD)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation>No se encontraron QSOs coincidentes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation>Página 0 de 0</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation>Etiquetas: 0 (0 páginas)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation>Imprimir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation>Exportar como PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation>Personalizado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation>Vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation>QSOs que coinciden con este perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation>Etiquetas: %1 (%2 páginas)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation>Página %1 de %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation>Exportar PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation>Archivos PDF (*.pdf)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation>Marcar como enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation>¿Marcar QSOs impresos/exportados como enviados?</translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>Comienzo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>Término</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>Mis Notas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Detalles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>País</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>Cont</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation>CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>Estado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>Condado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>Edad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation>AF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation>AN</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation>AS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation>EU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation>NA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation>OC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>Locator VUCC (Opcional). Ej. EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>la estación DARC DOK (District Location Code) contactada (ej. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation>CC FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo de Propagación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>Nombre del Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>Modo del Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>&amp;Mi Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>Nombre Operador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicativo del operador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>Potencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>Mensaje del QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>ID del Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>Estadísticas D&amp;X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Estadísticas DXCC&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Estadísticas de la estación&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation>&amp;QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>Enviada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>Administrar QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>Enviar QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sí&lt;/b&gt;: se ha enviado una tarjeta QSL; el QSO ha sido cargado y aceptado por el servicio en línea&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - no envié una tarjeta QSL; no cargué el QSO al servicio en línea&lt;br/&gt;&lt;b&gt;Solicitado&lt;/b&gt; - la estación contactada ha solicitado una tarjeta QSL; la estación contactada ha solicitado que el QSO se cargue en el servicio en línea&lt;br/&gt;&lt;b&gt;En cola&lt;/b&gt; - se ha seleccionado una tarjeta QSL para enviar; Se ha seleccionado un QSO para subir al servicio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>Mostrar QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sí&lt;/b&gt;: se ha recibido una tarjeta QSL; el QSO ha sido confirmado por el servicio en línea&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - no se ha recibido una tarjeta QSL; el QSO no ha sido confirmado por el servicio en línea&lt;br/&gt;&lt;b&gt;Solicitado&lt;/b&gt; - la estación de registro ha solicitado una tarjeta QSL; la estación de registro ha solicitado que el QSO se cargue en el servicio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>Recibida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation>&amp;Concurso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>Número Recibido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>Intercambio Recibido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>Número Enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>Intercambio Enviado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>Miembro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>&amp;Reiniciar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>&amp;Buscar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>Solicitado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>En Cola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>Ignorado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>Directa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>Electrónica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>Grabar cambios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>Realmente desea grabar todos los cambios?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>Error de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>No se pueden guardar todos los cambios - Error interno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>No se pueden guardar todos los cambios - intente reestablecer todos los cambios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>Detalle del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>Editar QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Descargando Imágen de eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>La descarga de imágen de eQSL  ha fallado: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>El indicativo del DX no puede estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>El indicativo del DX tiene formato incorrecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>La Frecuencia o Bande de TX debe estar completada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>La Banda TX debe ser </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>La Banda RX debe ser</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>El Locator del DX tiene formato incorrecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation>Según el indicativo, el País es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation>Según el indicativo, el Continente es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation>Según el indicativo, la Zona ITU es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation>Según el indicativo, la Zona CQ es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>VUCC tiene formato incorrecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation>Según las frecuencias, el modo Satélite debe ser</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>El nombre del Satélite no debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>El Indicativo propio no puede estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>El Indicativo propio tiene formato incorrecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>El Locator VUCC propio tiene formato incorrecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation>Según el indicativo propio, la Zona ITU propia es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation>Según el indicativo propio, la Zona CQ propia es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation>Según el indicativo propio, el País propio es diferente del valor ingresado; se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Según la Cumbre SOTA, el QTH no coincide con el Nombre de la Cumbre SOTA - se esperaba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation>Según la Cumbre SOTA, el Locator no coincide con el Locator SOTA - se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation>Según los registros POTA, el QTH no coincide con el Nombre POTA - se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation>Según los registros POTA, el Locator no coincide con el Locator POTA - se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Según la Cumbre SOTA, mi QTH no coincide con el Nombre de la Cumbre SOTA - se esperaba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation>Según la Cumbre SOTA, mi Locator no coincide con el Locator SOTA - se esperaba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation>Según los registros POTA, mi QTH no coincide con el Nombre POTA - se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation>Según los registros POTA, mi Locator no coincide con el Locator POTA - se esperaba </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>El estado de envío de LoTW en &lt;b&gt;No&lt;/b&gt; no tiene ningún sentido si se establece la fecha de envío de QSL. Establezca la fecha en 1.1.1900 para dejar el campo de fecha en blanco</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La fecha debe estar presente para el estado de envío de LotW &lt;b&gt;Sí&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>El estado de envío de eQSL en &lt;b&gt;No&lt;/b&gt; no tiene ningún sentido si se establece la fecha de envío de QSL. Establezca la fecha en 1.1.1900 para dejar el campo de fecha en blanco</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La fecha debe estar presente para el estado de envío de eQSL &lt;b&gt;Sí&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>El estado de envío de QSL Papel en &lt;b&gt;No&lt;/b&gt; no tiene ningún sentido si se establece la fecha de envío de QSL. Establezca la fecha en 1.1.1900 para dejar el campo de fecha en blanco</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La fecha debe estar presente para el estado de envío de Papel &lt;b&gt;Sí&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>Error del Libro de Guardia:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;Alerta: &lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>Validación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>Los campos marcados en amarillo no son válidos.&lt;p&gt;¿Guardar los cambios igualmente?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>&amp;Guardar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Editar</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>Detalle de Filtros de QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>Nombre del Filtro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>Buscar QSO que coincida con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>Todas las siguientes condiciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>Cualquiera de las siguientes condiciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>Agregar Condición</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>Igual</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>No es Igual</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>No Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>Mayor que</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>Menor que</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>Comience con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>No debe estar vacío</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>Filtros de QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>Filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Agregar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Editar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Quitar</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>No Hay Perfil de Radio Seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation>Error de Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>Error Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>No se puede abrir la Radio</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation>Desconectado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation>Desactivar split</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation>Configuración avanzada de Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation>Ruta de Rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Dejar vacío para detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation>Detectar automáticamente la ruta de Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation>Detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation>Versión de Rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation>Argumentos adicionales:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation>p. ej. -v -v para registro detallado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation>No se puede cambiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation>Detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation>rigctld no se encontró en este sistema.\nInstale Hamlib o especifique la ruta manualmente.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation>Ejecutable (*.exe);;Todos los archivos (*.*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation>Todos los archivos (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation>Seleccionar ejecutable de rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation>No encontrado</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation>No se encontró el ejecutable de rigctld en /app/bin/. Esto no debería ocurrir en la versión Flatpak.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation>No se encontró el ejecutable de rigctld. Instale Hamlib o especifique la ruta en la configuración avanzada.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation>Incompatibilidad de versión principal de Hamlib: QLog se compiló con Hamlib %1, pero rigctld informa la versión %2.%3.%4. Los ID de modelo de transceptor no son compatibles entre versiones principales.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation>El puerto %1 ya está en uso. Otro rigctld o aplicación puede estar ejecutándose en este puerto.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation>rigctld se inició pero no responde en el puerto %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation>No se pudo iniciar rigctld: %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation>rigctld se bloqueó.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation>rigctld agotó el tiempo de espera.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation>Error de escritura con rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation>Error de lectura con rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation>Error desconocido de rigctld.</translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>No Hay Perfil de Rotor Seleccionado</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>Error al Inicializar</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>Error Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>No se puede abrir el Rotor</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation>Az:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation>Ir a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation>Perfil de botón anterior</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation>Siguiente perfil de botón</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation>QSO PL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation>QSO Paso Largo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation>QSO PC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation>QSO Paso Corto</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>Ajustes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>Estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> Perfiles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>World Wide Flora &amp; Fauna (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>Locator de la Estación (Obligatorio)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>Nombre del Operador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>Información de Grupo de Actividades Especiales (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>Nombre de perfil que se utiliza como alias para Indicativo, Locator, Nombre del operador y QTH (obligatorio) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>Listado de los Perfiles de Estación disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>Nombre del Perfil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>Grupo de Actividades Especiales (Opcional) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>Locator VUCC (Opcional). Ej. EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>Agregar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>Eliminar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>Nombre de QTH (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>Nombre del operador (Opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>Indicativo (Obligatorio)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>Zona CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicativo del operador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>País</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>Indicativo de la estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>Indicativo del operador (parámetro opcional, si es diferente del indicativo de la estación)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>Condado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation>Ubicación del condado de la estación (parámetro opcional)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>Equipo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>Antenas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>Perfiles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>Descripción</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation>Apertura de Haz en Azimut </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation>Compensación de Azimut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>El valor de rango válido es 0° - 100° (0° sin definir)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>Sin definir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>Lista de Antenas disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>Manipuladores</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>Perfiles de Manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>Lista de Manipuladores disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>Modelo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>Modo del Manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>Intercambiar paletas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation>Frecuencia del tono de retorno:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>Velocidad por Defecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation>S/D</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation> PPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation>Puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Utilice COMxx para Windows o la ruta al puerto COM en un sistema operativo tipo Unix</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>Velocidad de Baudios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation>Nombre del Host</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib no admite cambiar un puerto de destino.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>Perfiles de Atajos de CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>Listado de los Perfiles de Atajos disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>Breve descripción del Botón (hasta 7 caracteres)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation>Radios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>Lista de Equipos disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>Interface</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>Frecuencias de TX mínima y máxima. Los rangos específicos se derivan de la Banda permitida en Ajustes.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>Rango TX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>Compensaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>Ingrese manualmente RIT o Transverter Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>Ingrese manualmente XIT o Transverter Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>Potencia por Defecto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>Ingresar la potencia por defecto (ej. cuando la radio está desconectada)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>Manipulador Asignado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>Características de la Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation>VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>Frecuencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation>Limpieza de QSY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>Potencia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>Estado del PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation>Comp. TX (XIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation>Comp. RX (RIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>Vel. Manipulador</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>Sinc. de Velocidad CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation>Iniciar el demonio rigctld para compartir el transceptor con otras aplicaciones (p. ej., WSJT-X)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation>Compartir transceptor mediante puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation>Avanzado…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation>Tiempo de Consulta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation> ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>Tipo de Puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>Bits de Datos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation>Control de Flujo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation>Paridad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation>Bits de Parada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translatorcomment>Tipo de PTT</translatorcomment>\n        <translation>Tipo de PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translatorcomment>Puerto para el PTT</translatorcomment>\n        <translation>PTT Puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>Anunciar DX a Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation>CIV Addr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation>Automático</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>Rotores</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>Serie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>Red</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>Perfiles de Botones de Usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>Botón 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>Botón 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>Botón 3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>Botón 4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation>Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>Órden de Consulta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>Primario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>Secundario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>Nombre de Usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>Contraseña</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Botón de búsqueda en la Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>Especifique la URL que se utilizará para la búsqueda rápida. La macro &lt;DXCALL&gt; será reemplazada por el indicativo actual</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>Probar la URL con su Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation>Probar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation>Clubs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>Listas Activas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation>Sincronización y QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>Los QSOs serán subidos inmediatamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation>Zona de peligro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation>&lt;b&gt;⚠ Esta es una zona de peligro. Proceda con precaución, ya que las acciones realizadas no se pueden deshacer y pueden tener un impacto significativo en su log.&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation>Eliminar todos los QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation>Eliminar todas las contraseñas del almacén seguro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>Subir Inmediatamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>No es la contraseña. Es el código de carga recibido por correo electrónico después del registro en HRDLOG.net</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translation>Código de Carga</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>Si está habilitado y la radio está conectada, QLog envía periódicamente mensajes al aire a HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>Enviar Al Aire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>Ruta de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>Navegar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation>Detectar automáticamente la ruta de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation>Detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation>Versión de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>Usando una instancia interna de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>Otros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>Confirmado por</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;Aviso de seguridad:&lt;/b&gt; QLog almacena todas las contraseñas en el almacenamiento seguro. Desafortunadamente, ON4KST utiliza un protocolo en el que esta contraseña se envía a través de un canal no seguro como texto sin formato.&lt;/p&gt;&lt;p&gt;Tenga cuidado al elegir su contraseña para este servicio, ya que su contraseña se envía a través de un canal no seguro en formato de texto sin formato.&lt; /p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>Bandas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>Modos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>El carácter &quot;&gt;&quot; se interpreta como un marcador de la posición inicial del cursor en la columna Report.&lt;br/&gt;Ej.: &quot;5&gt;9&quot; significa que el cursor se colocará en el segundo carácter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation>Colorear los spots CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation>Habilitar/deshabilitar el envío de indicadores de estado codificados por color de vuelta a WSJT-X para cada indicativo que llama CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>GUI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>Formato de tiempo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24 horas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation>AM/PM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation>Sistema de unidades</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation>Métrico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation>Imperial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>Formato de fecha</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>Sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>Personalizado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Documentación del formato de hora&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;Aviso:&lt;/b&gt; Se recomienda al menos una Suscripción QRZ XML para acceder a información detallada. Sin una suscripción, obtendrás datos limitados de QRZ.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>Clave API predeterminada</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>Claves API específicas para indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>Clave API</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>Punto final</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>Reenvío UDP sin procesar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Lista de direcciones IP a las que QLog reenvía paquetes UDP WSJT-X sin procesar.&lt;/p&gt;Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation>ej. 192.168.1.1:1234 192.168.2.1:1234</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation>Puerto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>Puerto donde QLog escucha el tráfico entrante de WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>Unirse a Multidifusión</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>Activar/desactivar la opción de multidifusión para WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>Dirección de multidifusión</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation>&lt;DXCALL&gt; = Indicativo DX\n&lt;NAME&gt; = Nombre del operador DX\n&lt;RST&gt; = Reporte 599\n&lt;RSTN&gt; = Reporte 5NN\n&lt;GREETING&gt; = Saludo GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = Mi Indicativo\n&lt;MYNAME&gt; = Mi Nombre\n&lt;MYQTH&gt; = Mi QTH\n&lt;MYLOCATOR&gt; = Mi Locator\n&lt;MYGRID&gt; = Mi Cuadrícula\n&lt;MYSIG&gt; = Mi Señal\n&lt;MYSIGINFO&gt; = Mi Información de la señal\n&lt;MYIOTA&gt; = Mi IOTA\n&lt;MYSOTA&gt; = Mi SOTA\n&lt;MYWWFT&gt; = Mi WWFT\n&lt;MYVUCC&gt; = Mi VUCC\n&lt;MYPWR&gt; = Mi Potencia en W\n&lt;EXCHSTR&gt; = Mensaje de intercambio del Concurso\n&lt;EXCHNR&gt; = Número de serie de intercambio del Concurso\n&lt;EXCHNRN&gt; = Número de serie de intercambio de Concursos (9→N, 0→T) \n&lt;+&gt; = Velocidad +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Velocidad -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Dejar vacío para detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>Especifique la dirección de multidifusión. &lt;br&gt;En algunos sistemas Linux, puede ser necesario habilitar la multidifusión en la interfaz de red de bucle invertido.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation>TTL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>Time-To-Live determina el rango&lt;br&gt; sobre el cual se propaga un paquete de multidifusión en su intranet.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>Notificaciones</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;LogID asignado al registro actual.&lt;/p&gt;El LogID se envía en los mensajes de notificación de red como una instancia única identificada.&lt;p&gt;El ID se genera automáticamente y no se puede cambiar&lt;/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation>Anuncios DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; Lista de direcciones IP a las que QLog envía paquetes de notificación UDP con anuncios de Cluster DX.&lt;/p&gt; Las direcciones IP están separadas por un espacio y tienen la forma IP:PUERTO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation>Alertas de Anuncios</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; Lista de direcciones IP a las que QLog envía paquetes de notificación UDP sobre Alertas de Anuncios de usuario.&lt;/p&gt; Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>Cambios de QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; Lista de direcciones IP a las que QLog envía paquetes de notificación UDP sobre un QSO nuevo/actualizado/eliminado en el registro.&lt;/p&gt;Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation>Anuncios CQ de Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; Lista de direcciones IP a las que QLog envía paquetes de notificación UDP con Anuncios de CQ de WSJTX.&lt;/p&gt;Las direcciones IP están separadas por un espacio y tienen el formato IP:PUERTO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>Especial - Omnirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation>No se puede cambiar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>Nombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>Informe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>Estado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>Inicio (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>Fin (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>Modo del Satélite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>Desactivado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation>Ninguno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation>Hardware</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation>Software</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation>Par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation>Impar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation>Marca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation>Espacio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>Morse Sobre CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation>WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation>Pala Simple</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation>Presione &lt;b&gt;Modificar&lt;/b&gt; para confirmar los cambios de perfil o &lt;b&gt;Cancelar&lt;/b&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>Modificar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>No debe estar vacío</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>Seleccionar Archivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation>Detección automática</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation>No se encontró TQSL en este sistema.\nInstale TQSL o especifique la ruta manualmente.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation>No encontrado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation>Compartir el transceptor solo está disponible para el controlador Hamlib</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation>Compartir el transceptor no está disponible para conexiones de red</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation>Eliminar contraseñas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation>Todas las contraseñas han sido eliminadas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation>Eliminando todos los QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation>Error</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation>No se pudieron eliminar todos los QSOs.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>Miembros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>Required internet connection during application start</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>Descripción</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>Atajo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>Conflicto con un atajo integrado</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>Conflicto con un atajo definido por el usuario</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>QSOs a Subir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>QSO Seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>Subir</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>Búsqueda</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>Estadísticas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>Mi Antena</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>Mi Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation>Filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation>Confirmado por</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSOs por</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>Porcentajes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation>Top 10</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>Histrograma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>Mostrar en el Mapa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>Tipo de Gráfico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>Mi Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>Mi Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>Rango de Fechas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>Papel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>Año</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>Mes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>Día de la Semana</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo de Propagación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>Confirmado / No Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>Paises</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>Grandes cuadrículas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>Distancia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation>QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>Locators Confirmados/Trabajados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>Dom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>Lun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>Mar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>Mie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>Jue</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>Vie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>Sáb</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>No Especificado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation>Confirmado </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation>No Confirmado </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation>Sin filtro de usuario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>Más de 50.000 QSO. ¿Mostrarlo?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation>Renderizando los QSO…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>Todos</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>Radio 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>Radio 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>Radio 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>Radio 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation>Se produjo un error</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>El estado de la radio ha cambiado</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio no conectada</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>Vacío</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation>Anunciante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>Mensaje</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>Subir QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>Filtros</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>Perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>Mi Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>Incluir estado de QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En circunstancias normales, este estado significa &lt;b&gt;&quot;no enviar&quot;&lt;/b&gt;.&lt;br/&gt;Sin embargo, a veces es posible que desee ignorar esta configuración al enviar una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En circunstancias normales, este estado significa &lt;b&gt;&quot;Ignorado/Inválido&quot;&lt;/b&gt;.&lt;br/&gt;Sin embargo, a veces es posible que desee ignorar esta configuración al enviar una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>Ignorar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>Ninguno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>Mensaje del QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>Campo de mensaje QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>Perfil de QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>Esta opción elimina todos los QSO en Clublog&lt;br&gt;y, según el filtro, carga todos los QSO independientemente de su estado.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>Borrar Clublog y resubir los QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation>LoTW / TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation>Ubicación de la estación TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>Perfil de estación</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translation>Volver a subir todo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>Mostrar QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;Subir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation>Sin definir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>Ocultar QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>Subiendo a %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>Cancelar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>Alerta de QLog - %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>No se puede actualizar el estado del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>No se puede subir el/los QSO/s: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>Información de QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>No se encontraron QSOs para subir.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>Los QSOs se cargaron en los servicios seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>Subir a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Los valores siguientes se utilizarán cuando un registro de entrada no contenga los valores ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>Cualquier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation>El indicativo de la ubicación (%1) y la cuadrícula (%2) no coinciden con los filtros seleccionados</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation>El indicativo de la ubicación (%1) no coincide con el indicativo seleccionado (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation>La cuadrícula de la ubicación (%1) no coincide con la cuadrícula seleccionada (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>Desconocido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>Cuadrícula</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>Distancia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation>Azimut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>Comentario</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>Hora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>Filtros WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>Filtro Generales</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Estado del Registro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>Nueva Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>Nuevo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>Nueva Entidad</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>Nuevo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>Trabajado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>Confirmado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>Norteamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>Sudamérica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>África</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>Antártida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>Distancia mayor a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR mejor a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>Filtros Extendidos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>No hay ninguna lista de clubes habilitada</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>Cuadrícula</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>Distancia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>Última Actividad</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>Último Mensaje</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>Miembro</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>Filtrado</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilidad de Columnas...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>Filtrar...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Qué columnas deben mostrarse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>Filtrar Anuncios</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>Escribe mensajes de depuración en el archivo de depuración</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation>Procesar importación pendiente de la base de datos (uso interno)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation>Forzar actualización de todas las listas de valores (DXCC, SATs, etc.)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/qlog_fr.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"fr_FR\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>Éditeur d&apos;activité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>Nom de l&apos;activité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>Mise en page</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>Agencement des fenêtres :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>Enregistré</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>Champs disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>Liste des champs utilisables</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>Ligne A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>Déplacer les champs sélectionnés vers la Ligne A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>Retirer le champ sélectionné de la Ligne A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>Liste des champs de la première ligne variable</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>Changer l&apos;ordre. Monter le champ sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>Changer l&apos;ordre. Descendre le champ sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>Ligne B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>Déplacer les champs sélectionnés vers la Ligne B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>Retirer le champ sélectionné de la Ligne B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>Liste des champs de la seconde ligne variable</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>Colonne A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>Liste des champs de la première colonne de détail QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>Colonne B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>Liste des champs de la seconde colonne de détail QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>Colonne C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>Liste des champs de la troisième colonne de détail QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>Lignes du nouveau QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>Colonnes de détail du nouveau QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>Valeurs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>Profils</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>Si décoché, le profil ne change pas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>Poste/Transceiver</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>Connexion automatique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>Connecter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>Rotor/Pointeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>Champs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>Ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>Non enregistré</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>Détail de la règle d&apos;alerte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>Nom de la règle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>Activé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>Sources</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation>Cluster DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation>DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>Statut du Log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation>Nouveau créneau (Slot)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation>Nouvelle Entité (DXCC)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation>Nouveau Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation>Nouvelle Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>Tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>Indicatif DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>Utiliser une expression régulière (Perl)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation>.*</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>Zone ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>Zone CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>Commentaire du Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>Diplômes &amp; Programmes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>Modes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>Bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>Amérique du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>Antarctique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>Amérique du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>Océanie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>Europe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>Afrique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>Membre de club</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation>Spotter (celui qui annonce)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>Ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>Aucune liste de club n&apos;est activée</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>Règles d&apos;alertes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Règles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>État</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>Nom de la règle</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>Fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>Mis à jour</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>Dernière MAJ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>Dernier commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>Membre</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>Alertes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>Effacer plus ancien que</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>Jamais</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translation>Modifier les règles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilité des colonnes...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translation>Diplômes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translation>Options</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translation>Diplôme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translation>Mon entité DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation>Filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translation>Confirmé par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translation>Papier (QSL)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translation>Afficher</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translation>Non contactés seulement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation>Non confirmés seulement</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation>Zones ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation>WAC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation>WAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation>WAS</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation>WPX</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translation>Chasseur POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translation>Activateur POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation>Locator (2 car.)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation>Locator (4 car.)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation>Locator (6 car.)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation>Locator (%1 car.)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation>Comtés US</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation>Districts russes (RDA)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation>Villes/Ku/Guns japonais (JCC/JCG)</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation>Comtés NZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation>DME espagnols</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation>Districts ukrainiens (URDA)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation>Aucun filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation>SUPPRIMÉ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translation>Amérique du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translation>Amérique du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translation>Europe</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translation>Afrique</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translation>Océanie</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translation>Antarctique</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>Slots : </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>En attente</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>Créer une fenêtre Bandmap supplémentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>Effacer plus anciens</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>Jamais</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>Tout effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>Effacer la bande actuelle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>Afficher la bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>Centrer sur RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation>Montrer les fréquences d&apos;urgence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation>SOS</translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>Aucun poste connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>Le poste ne supporte pas la CW via CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Impossible d&apos;envoyer du texte au poste</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>Le manipulateur (keyer) n&apos;est pas connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>Le poste n&apos;est pas connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossible de régler la vitesse du manipulateur</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossible d&apos;arrêter l&apos;envoi du texte</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>Profil de manipulateur CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>Profil de raccourcis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>Vitesse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation>N/D</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation> WPM (mots/min)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>Texte envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>Texte en écho</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation>&amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>Texte à envoyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>Alterner entre l&apos;envoi par &lt;b&gt;mots&lt;/b&gt; individuels (séparés par des espaces)&lt;br&gt; et l&apos;envoi du texte &lt;b&gt;complet&lt;/b&gt; (séparé par un saut de ligne).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation>Arrêt immédiat de l&apos;émission CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>Stop</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>Effacer la console d&apos;envoi et d&apos;écho</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>Console CW - Arrêt d&apos;émission</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>Le poste doit être connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>Mot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>Complet</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>Le manipulateur n&apos;est pas connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>Impossible d&apos;envoyer le texte</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossible de régler la vitesse</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossible d&apos;arrêter l&apos;émission</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>L&apos;appareil connecté n&apos;est pas FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>Le manipulateur n&apos;est pas connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>Impossible d&apos;envoyer le texte à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>Impossible d&apos;envoyer la commande Clear à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>Impossible d&apos;envoyer la commande TX à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>Impossible d&apos;envoyer la commande Text à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>Impossible d&apos;envoyer la commande Stop à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>Impossible d&apos;envoyer la commande Abort à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>Impossible de recevoir des données de FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>Délai de connexion à FLDigi dépassé</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>Erreur de connexion à FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>Erreur de commande FLDigi</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>Aucun profil de manipulateur CW sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>Erreur interne</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>Erreur de connexion</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>Impossible d&apos;ouvrir la connexion au manipulateur</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>L&apos;appareil connecté n&apos;est pas un WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Impossible d&apos;envoyer le texte au poste</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>Le manipulateur n&apos;est pas connecté</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>Erreur de communication</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossible de régler la vitesse</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossible d&apos;arrêter l&apos;émission</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation>4000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation>2000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation>1333 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation>1000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation>800 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation>666 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation>571 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation>500 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation>444 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation>400 Hz</translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation>Exporter Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation>Fichier :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation>Concours (Contest)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation>Modèle de format :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation>Gérer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation>Filtre utilisateur :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation>Date/Heure:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation> - </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation>Station et catégories</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation>Indicatif:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation>Opérateurs :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation>Bande:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation>Mode:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation>Puissance:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation>Opérateur:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation>Assisté :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation>Station:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation>Émetteur:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation>Heure:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation>Supplémentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation>Nom:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation>Email:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation>Adresse:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation>Max. 6 lignes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation>Emplacement:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation>Club:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation>Commentaire libre:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation>Fichiers Cabrillo (*.log);;Fichiers CBR (*.cbr);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation>QSO(s) : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation>QSOs: ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation>Avertissement QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation>Veuillez sélectionner un modèle de concours.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation>Veuillez sélectionner un fichier de sortie.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation>Aucun indicatif disponible. Vérifiez vos filtres.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation>Impossible de préparer la requête d’exportation.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation>Impossible de récupérer les QSO pour l’exportation.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation>Impossible d’ouvrir le fichier %1 en écriture.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation>Exportation Cabrillo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation>Information QLog</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation>\n            <numerusform>%n QSO exportés dans le fichier Cabrillo.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation>2m (144 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation>70cm (432 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation>33cm (902 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation>23cm (1.2 GHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation>Lumière</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation>VHF 3 bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation>VHF FM uniquement</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation>Mixte</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation>Haut (High)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation>Bas (Low)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation>Opérateur unique</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation>Multi-opérateurs</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation>Vérifier le log</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation>Non assisté</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation>Assisté</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation>Fixe</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation>Mobile</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation>Expédition</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation>école</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation>Distribué</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation>Un</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation>Deux</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation>Limité</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation>Illimité</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation>6 heures</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation>12 heures</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation>24 heures</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation>Classique</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation>Novice/Technicien</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation>Plus de 50</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation>Texte (aligné à gauche)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation>Fréquence (kHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation>Heure (HHMM)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation>Date (AAAA-MM-JJ)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation>RST court (sans le dernier chiffre)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation>Majuscules</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation>Mode (Cabrillo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation>Numéro avec zéros</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation>Gestionnaire de modèles Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation>Importer un modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation>Importation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation>Exporter un modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation>Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation>Nouveau modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation>Nouveau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation>Copier un modèle existant</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation>Copier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation>Supprimer le modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\">Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation>Nom du modèle:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation>Nom du concours:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation>Mode par défaut:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation>Colonnes de ligne QSO:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation>Nom du concours selon les règles. Il est possible de saisir une chaîne personnalisée si elle ne figure pas dans la liste.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation>N°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation>Champ QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation>Formateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation>Largeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation>Étiquette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation>Ajouter une ligne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation>Supprimer la ligne sélectionnée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation>Nouveau modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation>Copie – %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation>Supprimer le modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation>Supprimer le modèle «%1» ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation>Importer un modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation>Modèle Cabrillo QLog (*.qct)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation>Import échoué</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation>Exporter un modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation>Export échoué</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation>Impossible d’écrire le fichier : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation>Fichier introuvable : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation>Impossible d’ouvrir le fichier : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation>Fichier de modèle invalide : nom manquant</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation>Impossible de démarrer la transaction de base de données.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation>Avertissement QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation>Impossible d’enregistrer le modèle «%1» : %2</translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;La nomenclature (callbook) secondaire sera utilisée&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation>Chat ON4KST</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>Salon de discussion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>Connecter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>Nouveau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>Avertissement QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>Le chat ON4KST n&apos;est pas configuré correctement.&lt;p&gt; Veuillez utiliser le menu &lt;b&gt;Paramètres&lt;/b&gt; pour le configurer.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>Activé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>Désactivé</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>Lever soleil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>Coucher soleil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation>N/D</translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>Clé API invalide</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>L&apos;opération Clublog pour l&apos;indicatif %1 a échoué.&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Réglage de visibilité des colonnes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>Général</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>Mes infos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation>QSL &amp;&amp; Nomenclature</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>Membres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>Conditionnels</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>Concours (Contests)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>Autres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>Terminé</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>Tout désélectionner</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>Tout sélectionner</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Réglage de visibilité des colonnes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>Terminé</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation>Entités DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation>Infos Satellites</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation>Sommets SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation>Références WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation>Références IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation>Références POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation>Registres des listes de membres</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation>Fichier Clublog CTY.XML</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation>Liste de valeurs</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation>Mise à jour de </translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation> Échec de la mise à jour</translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>Afghanistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>Agalega &amp; St. Brandon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>Îles d&apos;Åland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>Alaska</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>Albanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>Algérie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>Samoa américaines</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>Is. Amsterdam &amp; St. Paul</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>Is. Andaman &amp; Nicobar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>Andorre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>Angola</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>Anguilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>Île d&apos;Annobon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>Antarctique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>Antigua &amp; Barbuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>Argentine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>Arménie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>Aruba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>Île de l&apos;Ascension</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>Russie asiatique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>Turquie asiatique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>Îles Australes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>Australie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>Autriche</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>Île d&apos;Aves</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>Azerbaïdjan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>Açores</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>Bahamas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>Bahreïn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>Îles Baker &amp; Howland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>Îles Baléares</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>Île de Banaba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>Bangladesh</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>Barbade</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>Biélorussie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>Belgique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>Belize</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>Bénin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>Bermudes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>Bhoutan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>Bolivie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>Bonaire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>Bosnie-Herzégovine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>Botswana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>Bouvet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>Brésil</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>Îles Vierges britanniques</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>Brunei</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>Bulgarie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>Burkina Faso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>Burundi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>Cambodge</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>Cameroun</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>Canada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>Îles Canaries</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>Cap-Vert</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>Îles Caïmans</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>République centrafricaine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>Kiribati Central</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>Ceuta &amp; Melilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>Tchad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>Archipel des Chagos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>Îles Chatham</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>Îles Chesterfield</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>Chili</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>Chine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>Île Christmas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>Île de Clipperton</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>Îles Cocos (Keeling)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>Île de Cocos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>Colombie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>Comores</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>Récif Conway</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>Corse</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>Costa Rica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>Côte d&apos;Ivoire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>Crète</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>Croatie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>Île Crozet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>Cuba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>Curaçao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>Chypre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>République tchèque</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>Corée du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>Rép. dém. du Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>Danemark</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>Île Desecheo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>Djibouti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>Dodécanèse</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>Dominique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>République dominicaine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>Île Ducie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>Malaisie orientale</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>Île de Pâques</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>Kiribati oriental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>Équateur</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>Égypte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>Salvador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>Angleterre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>Guinée équatoriale</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>Érythrée</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>Estonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>Éthiopie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>Russie européenne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>Îles Falkland (Malouines)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>Îles Féroé</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>Rép. féd. d&apos;Allemagne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>Fernando de Noronha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>Fidji</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>Finlande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>France</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>Terre de François-Joseph</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>Guyane française</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>Polynésie française</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>Gabon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>Îles Galapagos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>Géorgie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>Ghana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>Gibraltar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>Îles Glorieuses</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>Grèce</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>Groenland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>Grenade</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>Guadeloupe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>Guam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>Guantanamo Bay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>Guatemala</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>Guernesey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>Guinée</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>Guinée-Bissau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>Haïti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>Hawaï</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>Île Heard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>Honduras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>Hong Kong</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>Hongrie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>Siège de l&apos;UIT</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>Islande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>Inde</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>Indonésie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>Iran</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>Irak</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>Irlande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>Île de Man</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>Israël</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>Italie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>Jamaïque</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>Jan Mayen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>Japon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>Jersey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>Île Johnston</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>Jordanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>Îles Juan Fernández</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>Juan de Nova &amp; Europa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>Kaliningrad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>Kazakhstan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>Kenya</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>Îles Kerguelen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>Îles Kermadec</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>Royaume d&apos;Eswatini</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>Île Kure</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>Koweït</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>Kirghizistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>Îles Lakshadweep</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>Laos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>Lettonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>Liban</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>Lesotho</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>Liberia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>Libye</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>Liechtenstein</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>Lituanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>Île Lord Howe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>Luxembourg</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>Macao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>Île Macquarie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>Madagascar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>Archipel de Madère</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>Malawi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>Maldives</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>Mali</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>Île de Malpelo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>Malte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>Îles Mariannes</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>Récif Market</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>Îles Marquises</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>Îles Marshall</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>Martinique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>Mauritanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>Maurice</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>Mayotte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>Récif Mellish</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>Mexique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>Micronésie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>Île Midway</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>Minami Torishima</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>Moldavie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>Monaco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>Mongolie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>Monténégro</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>Montserrat</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>Maroc</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>Mont Athos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>Mozambique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>Myanmar (Birmanie)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation>Is. subantarctiques de N.Z.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>Namibie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>Nauru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>Île de la Navasse</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>Népal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>Pays-Bas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>Nouvelle-Calédonie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>Nouvelle-Zélande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>Nicaragua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>Niger</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>Nigeria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>Niue</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>Île Norfolk</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>Îles Cook du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>Macédoine du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>Irlande du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>Norvège</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>Ogasawara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>Oman</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>Pakistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>Palaos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>Palestine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>Îles Palmyra &amp; Jarvis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>Panama</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>Papouasie-Nouvelle-Guinée</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>Paraguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>Pérou</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>Île Pierre 1er</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>Philippines</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>Île Pitcairn</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>Pologne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>Portugal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation>Is. du Prince-Édouard &amp; Marion</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>Île Pratas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>Porto Rico</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>Qatar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>République de Corée (Sud)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>République du Kosovo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>République du Soudan du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>République du Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>Île de la Réunion</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>Revillagigedo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>Île Rodrigues</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>Roumanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>Île Rotuma</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>Rwanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>Saba &amp; St. Eustache</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>Île de Sable</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>San Andrés &amp; Providencia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>San Félix &amp; San Ambrosio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>Saint-Marin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>Sao Tomé-et-Principe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>Sardaigne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>Arabie saoudite</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>Récif de Scarborough</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>Écosse</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>Sénégal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>Serbie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>Seychelles</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>Sierra Leone</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>Singapour</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>Saint-Martin (partie néerlandaise)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>Slovaquie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>Slovénie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>Îles Salomon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>Somalie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>Afrique du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>Îles Cook du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>Géorgie du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>Orcades du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>Îles Sandwich du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>Shetland du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>Ordre souverain de Malte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>Espagne</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>Îles Spratleys</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>Sri Lanka</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>Saint-Barthélemy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>Sainte-Hélène</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>Saint-Kitts-et-Nevis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>Sainte-Lucie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>Saint-Martin (partie française)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation>Île Saint-Paul (Alaska)</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>Rochers Saint-Pierre et Saint-Paul</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>Saint-Pierre-et-Miquelon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>Saint-Vincent-et-les-Grenadines</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>Soudan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>Suriname</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>Svalbard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>Île Swains</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>Suède</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>Suisse</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>Syrie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>Taïwan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>Tadjikistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>Tanzanie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>Province de Temotu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>Thaïlande</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>Gambie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>Timor oriental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>Togo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>Îles Tokelau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>Tonga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>Trindade &amp; Martim Vaz</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>Trinité-et-Tobago</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>Tristan da Cunha &amp; Îles Gough</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>Île Tromelin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>Tunisie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>Turkménistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>Îles Turques-et-Caïques</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>Tuvalu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation>Bases souveraines UK à Chypre</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>Îles Vierges américaines</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>Ouganda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>Ukraine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>Émirats arabes unis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>Siège des Nations unies</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation>États-Unis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>Uruguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>Ouzbékistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>Vanuatu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>Cité du Vatican</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>Venezuela</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>Vietnam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>Île Wake</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>Pays de Galles</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>Îles Wallis-et-Futuna</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>Malaisie occidentale</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>Kiribati occidental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>Sahara occidental</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>Île Willis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>Yémen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>Zambie</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>Zimbabwe</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation>Liste de soumission DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation>Options</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation>Mon entité DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation>Filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation>Catégorie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation>Mixte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation>Confirmé par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation>Afficher</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation>Pas encore soumis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation>Soumis (non accordé)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation>Déjà accordé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation>Plage de bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation>Sélectionner les bandes prédéfinies DXCC 5 bandes (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation>DXCC 5 bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation>Sélectionner toutes les bandes éligibles DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation>Toutes les bandes DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation>Bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation>Sélectionnez les options ci-dessus et la liste se mettra à jour automatiquement.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation>Exporter les contacts listés ci-dessus dans un fichier ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation>Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation>Aucun filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation>Toute bande (niveau entité)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation>DXCC 5 bandes (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation>Sélection personnalisée des bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation>Entité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation>Préfixe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation>Date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation>Soumis</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation>Accordé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation>Exporter ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation>Aucun contact à exporter.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation>Impossible de récupérer les enregistrements de contacts.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation>Exporter la liste de soumission DXCC en ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation>toute bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation>5 bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation>toutes les bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation>%1 bande(s) sélectionnée(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation>Aucun contact ne correspond aux critères sélectionnés.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation>%1 %2 %3 — DXCC %4 / %5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation>emplacement de bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation>entité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation>entrée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation>entrées</translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>Nouvelle entité</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>Nouvelle bande</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>Nouveau mode</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>Nouvelle bande &amp; mode</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>Nouveau créneau</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>Oui</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>Non</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>Demandé</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>En attente</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>Invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>Électronique</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>Modifié</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation>Ligne de gris</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>Autre</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation>Petit chemin</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation>Grand chemin</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>Non entendu</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>Incertain</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation>Pioche (Clé droite)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation>Sideswiper (Cootie)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation>Manipulateur semi-automatique (Bug)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation>Manipulateur entièrement automatique</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation>Simple levier</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation>Double levier (Iambique)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation>Piloté par ordinateur</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation>Confirmé (AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation>Confirmé (sans AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation>Inconnu</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <translation>Diffusion par avion</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation>Aurore-E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation>Aurore</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation>Rétrodiffusion</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation>EchoLink</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation>Terre-Lune-Terre (EME)</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation>E sporadique</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation>Réflexion F2</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation>Irrégularités alignées sur le champ</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation>Onde de sol</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation>Assisté par Internet</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation>Diffusion ionosphérique</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation>IRLP</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation>Ligne de vue</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation>Météor-scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation>Relais ou transpondeur terrestre/atmosphérique</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation>Diffusion par la pluie</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation>Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation>Trans-équatorial</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation>Guidage troposphérique</translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation>Outils dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation>Journal de débogage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation>Règles de journalisation:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation>p. ex. qlog.ui.*.runtime=true</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation>Appliquer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation>Générer un fichier de débogage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation>Exporter le fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation>Console SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation>Ouvrir SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation>Enregistrer SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation>Exécuter SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation>Exporter en tant que</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation>Saisissez la requête SQL ici... Ctrl+Entrée = exécuter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation>Ouvrir la requête SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation>Fichiers SQL (*.sql);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation>Erreur d’ouverture</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation>Impossible d’ouvrir le fichier:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation>Enregistrer la requête SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation>Erreur d’enregistrement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation>Impossible d’enregistrer le fichier:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation>Requête enregistrée dans %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation>Erreur : %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation>%1 ligne(s) affichée(s) (tronqué à %2) en %3 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation>%1 ligne(s) retournée(s) en %2 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation>Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation>Aucun résultat à exporter.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation>Erreur d’exportation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation>Impossible d’ouvrir le fichier en écriture:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation>%1 ligne(s) exportée(s) vers %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation>Fichiers texte (*.txt);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation>Fichiers CSV (*.csv);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation>Exporter ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation>Aucun identifiant de contact valide trouvé dans le jeu de résultats.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation>Impossible de récupérer les enregistrements de contacts:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation>Aucun contact correspondant trouvé dans la base de données.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation>Règles de journalisation réinitialisées (par défaut)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation>Règles de journalisation appliquées</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation>Enregistrer le journal de débogage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation>Aucun fichier de journal de débogage n’est actuellement en cours d’écriture</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation>Fichiers journaux (*.log);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation>Journal de débogage enregistré dans %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation>Impossible de copier le fichier de journal de débogage.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation>La journalisation dans un fichier est désactivée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation>Fichier de journal : %1</translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>Télécharger les QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>Profil QTH eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSL depuis le</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSO depuis le</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>Mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;Télécharger</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW n&apos;est pas configuré correctement.&lt;p&gt; Veuillez utiliser la fenêtre des &lt;b&gt;Paramètres&lt;/b&gt; pour le configurer.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL n&apos;est pas configuré correctement.&lt;p&gt; Veuillez utiliser la fenêtre des &lt;b&gt;Paramètres&lt;/b&gt; pour le configurer.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>Téléchargement depuis %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>Traitement de %1 QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>La mise à jour de %1 a échoué : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>Information QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>Aucun service sélectionné</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>Filtres DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>Filtres généraux</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>Bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>Modes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>Phonie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>Numérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>Amérique du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>Amérique du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>Océanie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>Antarctique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>Europe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>Afrique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>Statut du log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>Nouveau mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>Nouvelle entité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>Nouvelle bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>Nouveau créneau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>Filtres étendus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>Continent du spotteur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>Ne pas afficher les spots suivants s&apos;ils ont le même indicatif et que leur différence de temps est inférieure à Time Diff et leur différence de fréquence inférieure à Freq Diff</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>Déduplication des spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translation>Différence de temps</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translation>Différence de fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation> kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>Membre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>Aucune liste de club n&apos;est activée</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>Fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation>Spotteur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>Continent du spotteur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>Membre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>Pays</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>Entrez un &lt;b&gt;hôte:port&lt;/b&gt; de serveur DXC.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>Connecter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>Filtré</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation>Spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>À tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>Console</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation>Tendance 15 min</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>Recherche plein texte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>Rechercher</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>Fermer la recherche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>Envoyer une commande DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>Filtrer...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>Filtrer DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translation>Spotter le dernier QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>Envoyer le spot du dernier QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>Afficher stats HF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>Afficher stats VHF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>Afficher WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>Afficher WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilité des colonnes...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quelles colonnes doivent être affichées</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>Connecter au démarrage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>Connexion automatique après le démarrage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>Supprimer le serveur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>DXC - Supprimer le serveur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>Effacer le mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>Garder les spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>Les spots ne sont pas effacés lors de la connexion à un nouveau DX Cluster.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>Effacer toutes les données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>Rechercher...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC - Rechercher</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>Mon continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>Auto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>Connexion...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>Le DX Cluster est temporairement indisponible</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>Erreur serveur DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>Un indicatif invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>Mot de passe DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>Avis de sécurité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>Le mot de passe peut être envoyé via un canal non sécurisé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>Serveur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>Utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>Déconnecter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>Commande DX Cluster</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>Mot de passe ou ID de profil QTH incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation>Fichier ADIF non trouvé dans la réponse eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>Identifiant ou mot de passe incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>Erreur inconnue</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>Impossible d&apos;ouvrir le fichier temporaire</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>Impossible de sauvegarder l&apos;image dans le fichier</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>Réponse inconnue de eQSL</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>Modifier les activités</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>Activités</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>Exporter les QSO sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>Fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation>JSON</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>Type d&apos;exportation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>Jeu de colonnes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>Sélectionnez un des jeux de colonnes prédéfinis ou définissez le vôtre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>Modifier le jeu de colonnes actuel</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>Marquer les QSO exportés comme envoyés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>Exporter uniquement les QSO correspondant aux filtres actifs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>Filtres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>Exporter uniquement les QSO de la période sélectionnée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>Plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>Exporter uniquement les QSO correspondant à &quot;Mon Indicatif&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>Mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>Exporter uniquement les QSO correspondant à mon Locator (Gridsquare)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>Mon Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>Exporter uniquement les QSO avec ce mode d&apos;envoi de QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>Envoyer QSL via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>Inclure les statuts d&apos;envoi de QSO inhabituels</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>Inclure le statut d&apos;envoi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En temps normal, ce statut signifie &lt;b&gt;&quot;Ignorer/Invalide&quot;&lt;/b&gt;.&lt;br/&gt;Cependant, il peut être souhaitable d&apos;ignorer ce paramètre lors de l&apos;envoi d&apos;une QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>&quot;Ignorer&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En temps normal, ce statut signifie &lt;b&gt;&quot;ne pas envoyer&quot;&lt;/b&gt;.&lt;br/&gt;Cependant, il peut être souhaitable d&apos;ignorer ce paramètre lors de l&apos;envoi d&apos;une QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>&quot;Non&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>Renvoyer les QSO déjà envoyés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>Déjà envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>Filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>Exporter les QSO correspondant au filtre utilisateur sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation>Profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>Exporter les QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation>Exporter uniquement les QSO correspondant à ce profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation>Exportation en cours…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>Impossible de marquer les QSO exportés comme Envoyés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>Générique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>Tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation>Minimal</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>Spécifique aux QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>Personnalisé 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>Personnalisé 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>Personnalisé 3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation>Archiver les données et paramètres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation>Entrez un mot de passe pour chiffrer vos identifiants enregistrés.\nCe mot de passe sera nécessaire pour les restaurer ultérieurement.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation>Mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation>Aléatoire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation>Confirmer le mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation>Supprimer les mots de passe du gestionnaire d&apos;identifiants après export</translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>Délai expiré</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>Délai de réponse de FLRig expiré</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>Erreur réseau</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>Message de réponse mal formé</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translation>Aucun</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translation>CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translation>Impossible de définir le type de PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translation>Impossible de définir le partage du PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation>Impossible de définir l&apos;adresse CI-V</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>Pilote de transceiver non supporté</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>Impossible de définir auto_power_on</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation>Impossible de définir no_xchg à 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>Erreur d&apos;ouverture du transceiver</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation>Erreur lors du réglage de la fréquence TX</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>Erreur lors du réglage de la fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation>Erreur lors du réglage du split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>Erreur lors du réglage du mode</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation>Erreur lors du réglage du mode split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>Erreur lors du réglage du PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translation>Impossible d&apos;envoyer du Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translation>Impossible d&apos;arrêter le Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translation>Erreur lors de la lecture du PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>Erreur lors de la lecture de la fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>Erreur lors de la lecture du mode</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>Erreur lors de la lecture du VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translation>Erreur lors de la lecture de la puissance</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translation>Erreur lors de la lecture de puissance (mW)</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translation>Erreur lors de la lecture de la fonction RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translation>Erreur lors de la lecture du RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translation>Erreur lors de la lecture de la fonction XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translation>Erreur lors de la lecture du XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translation>Erreur lors de la lecture de la vitesse de manipulation</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translation>Erreur lors du réglage de la vitesse de manipulation</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>Pilote de rotor non supporté</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>Erreur d&apos;ouverture du rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>Erreur lors du réglage de la position</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>Erreur lors de la lecture de la position</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>Importation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>Plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>Importer tous les QSO ou seulement ceux d&apos;une période donnée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>Tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>Fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>Options</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>La valeur est utilisée lorsqu&apos;un enregistrement d&apos;entrée ne contient pas la valeur ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>Par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>Mon profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>Mon transceiver</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation>Si le DXCC manque dans l’enregistrement importé, il sera déterminé à partir de l’indicatif.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation>Compléter les informations d’entité DXCC manquantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>Sélectionner un fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Les valeurs ci-dessous seront utilisées lorsqu&apos;un enregistrement d&apos;entrée ne contient pas les valeurs ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;QSO dans le log :&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Importation :&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>QSO en double</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;Voulez-vous importer le QSO en double ?&lt;/p&gt;%1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>Sauvegarder dans un fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>Résumé de l&apos;importation QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>Date d&apos;importation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>Fichier importé</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>Importé : %n contact</numerusform>\n            <numerusform>Importés : %n contacts</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>Avertissement : %n</numerusform>\n            <numerusform>Avertissements : %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>Erreur : %n</numerusform>\n            <numerusform>Erreurs : %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>Détails</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>Résultat de l&apos;importation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>Enregistrer les détails...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translation>Fenêtre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>Le mot de passe sera enregistré dans le gestionnaire d&apos;identifiants.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>Retenir le mot de passe</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>Utilisateur inconnu</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>Mot de passe invalide</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>Messages de discussion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>Messages importants</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>Effacer l&apos;indicatif sélectionné et le message de discussion saisi.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>Envoyer le message</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>Visibilité des colonnes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quelles colonnes doivent être affichées</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>Préparer le QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>Transférer l&apos;indicatif et le Locator vers la fenêtre de nouveau QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>M&apos;afficher uniquement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>Afficher uniquement les messages mentionnant mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>Supprimer &quot;Utilisateur à Utilisateur&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>Supprimer les messages privés entre deux indicatifs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>Mise en évidence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>Mettre en évidence les messages selon les réglages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>Règles de mise en évidence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation>Azimut (Beam)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>Effacer les messages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>Effacer tous les messages de la fenêtre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>Vous</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>Modifier la règle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>Nom de la règle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>Salon de discussion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>Activé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>Mettre en évidence les messages correspondant à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>Toutes les conditions suivantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>L&apos;une des conditions suivantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>Ajouter une condition</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>Tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation>Expéditeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>Message</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>Contient</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>Commence par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>Ne doit pas être vide</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>Règles de mise en évidence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Règles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>État</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation>Déballer les données et les paramètres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation>Avertissement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;La base de données actuelle sera SUPPRIMÉE !&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Tous les mots de passe enregistrés seront SUPPRIMÉS !&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;L&apos;application redémarrera après le chargement&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Pour préserver les données, utilisez d&apos;abord Pack Data &amp;amp; Settings ou Export QSOs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation>Sélectionner la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation>Fichier :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation>Statut : Aucun fichier sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation>Déchiffrer les identifiants</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation>Entrez le mot de passe pour déchiffrer les identifiants</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation>Mot de passe :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation>Charger &amp;&amp; Redémarrer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation>Mot de passe invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation>Sélectionner le fichier de base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation>Export de base de données QLog (*.dbe);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation>Impossible de créer le fichier temporaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation>Décompression de la base de données...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation>Impossible de décompresser le fichier de base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation>Impossible d&apos;ouvrir la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation>Base de données valide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation>Plateforme différente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation>Mot de passe requis pour importer les identifiants</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation>Aucun identifiant chiffré dans la base de données</translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>Impossible de trouver mes informations d&apos;entité DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>Un ensemble minimal de champs est manquant (start_time, call, band, mode, station_callsign)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>En dehors de la plage de dates sélectionnée</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>Doublon</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>Les informations DXCC sont manquantes</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>aucun indicatif de station présent</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>Impossible d&apos;insérer dans la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>Importé</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>État DXCC :</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>Avertissement</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST Envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST Reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>Message QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>Notes</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL Reçue</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Envoyée</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translation>ID QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>Heure début</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>Heure fin</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RSTe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>Fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>Sous-mode</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>Nom (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>Pays (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>Préfixe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>État</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>Comté</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>Comté Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>Date QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>Date QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>Date LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>Date LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>TX PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>Champs additionnels</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>Adresse (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>Adresse</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>Âge</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>Altitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>Indice A</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>Azimut Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>Élévation Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>Chemin du Signal</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>Section ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation>Récompense soumise</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation>Récompense accordée</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>Bande RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>Locator étendu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation>Vérification Concours</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>Classe</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>Date d&apos;envoi ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>État d&apos;envoi ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>Commentaire (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>Opérateur contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>ID Concours</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation>Crédit soumis</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation>Crédit accordé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>Date DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>Date DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation>DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation>DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>Distance</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>Email</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>Indicatif du propriétaire</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation>eQSL AG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>Date eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>Date eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation>Numéro FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>Init EME</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>Fréquence RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>Opérateur invité</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>Date d&apos;envoi HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>Statut d&apos;envoi HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>Date d&apos;envoi HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>Statut d&apos;envoi HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>Date d&apos;envoi HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>Statut d&apos;envoi HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>ID Île IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>Indice K</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>Latitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>Longitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation>Rafales max (Bursts)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation>Infos clé CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation>Type de clé CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation>Essaim MS (Météor Scatter)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>Mon altitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>Mon antenne (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>Mon antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>Ma ville (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>Ma ville</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>Mon département/comté</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>Mon département (Alt)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>Mon pays (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>Mon pays</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>Ma zone CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>Mon DOK (DARC)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>Mon DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>Mon n° FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>Mon Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>Mon Locator (étendu)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>Mon IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>Mon ID d&apos;île IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>Ma zone ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>Ma latitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>Ma longitude</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation>Infos sur ma clé CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation>Mon type de clé CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>Mon nom (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>Mon nom</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>Mon code postal (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>Mon code postal</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>Ma réf. POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>Ma station/TRX (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>Ma station/TRX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation>Mon activité spéciale (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mon activité spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation>Infos activité spéc. (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation>Infos activité spéc.</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>Mon SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>Mon État/Province</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>Ma rue</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation>Mes comtés USA-CA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mes locators VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation>Nom</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>Notes (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation>Nb rafales MS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation>Nb pings MS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicatif de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation>Precedence (Contest)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>Mode de propagation</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>Clé de chiffrement publique</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>Date de téléchargement QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>Statut téléchargement QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>Date d&apos;envoi vers QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>Statut envoi vers QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation>Message QSL envoyée (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation>Message QSL envoyée</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation>Message QSL reçue</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSL reçue via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSL envoyée via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation>QSL via</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>QSO terminé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation>QSO aléatoire</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>Région</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation>TRX (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation>TRX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation>Puissance reçue</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>Mode Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>Nom du Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation>Flux solaire</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation>SIG (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation>Infos SIG (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation>Infos SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation>Silent Key (SK)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>Membre SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>N° reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>Échange reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicatif de la station de saisie</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation>N° envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation>Échange envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Numéro Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>Membre UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation>Comtés USA-CA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation>Province VE</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation>Ma section ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>Mon WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>Carnet de trafic - Supprimer QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>Envoyer vers Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>Rechercher sur le Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>Mise à jour via Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>Ajouter les infos manquantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation>Marquer QSL comme reçue</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation>Marquer QSL demandée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>Filtrer par indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>Modifier la valeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>Carnet de trafic - Modifier la valeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation>Visibilité des colonnes </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quelles colonnes afficher</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>Exporter la sélection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>Exporter les QSO sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translation>Envoyer un Spot DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>Carnet de trafic - Envoyer Spot DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>Toutes les bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>Tous les modes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>Tous les pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>Aucun filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>Avertissement QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>Chaque lot supporte jusqu&apos;à 100 QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>Progression de la mise à jour des QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>Échec de connexion au Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>Erreur Callbook : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>Tous les clubs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>Supprimer les contacts sélectionnés ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation>L&apos;option &lt;b&gt;Envoi immédiat&lt;/b&gt; de Clublog ne supporte que la suppression unitaire.&lt;br&gt;&lt;br&gt;Voulez-vous continuer sachant que l&apos;opération de SUPPRESSION ne sera pas transmise à Clublog ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>Suppression des QSO en cours</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>Mettre à jour</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>La mise à jour affectera toutes les lignes sélectionnées.&lt;br&gt;La valeur éditée dans la colonne sera appliquée à toute la sélection.&lt;br&gt;&lt;br&gt;Voulez-vous valider la modification ?</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translation>\n            <numerusform>Nombre : %n</numerusform>\n            <numerusform>Nombre : %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Téléchargement de l&apos;image eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Échec du téléchargement de l&apos;image eQSL : </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>Impossible d&apos;ouvrir le fichier temporaire</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation>Identifiant ou mot de passe incorrect</translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>Envoi annulé par l&apos;utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>Envoi rejeté par LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>Réponse inattendue du serveur TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>Erreur de l&apos;utilitaire TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>Erreur TQSLlib</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>Impossible d&apos;ouvrir le fichier d&apos;entrée</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>Impossible d&apos;ouvrir le fichier de sortie</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>Tous les QSO étaient des doublons ou hors plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>Certains QSO étaient des doublons ou hors plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>Erreur de syntaxe de commande</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>Erreur de connexion LoTW (pas de réseau ou LoTW injoignable)</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>Erreur inattendue de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>TQSL introuvable</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL a planté</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>&amp;Fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>&amp;Carnet de trafic</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>&amp;Équipement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>&amp;Fenêtre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation>Se&amp;rvices</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>Concours (Contest)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>Vérif. Doublons</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>Séquence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>Lier l&apos;échange avec</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>Barre d&apos;outils</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>Horloge</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>Carte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation>DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation>Carte des bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation>TRX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>Carte en ligne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation>Console CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>Image de profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>Alertes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>Quitter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>Quitter l&apos;application</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>&amp;Réglages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation>Sauvegarder données &amp;&amp; réglages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation>Restaurer données &amp;&amp; réglages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>Nouveau QSO - Effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Exporter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>Connecter le T&amp;RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>À &amp;propos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>Nouveau QSO - Enregistrer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>S&amp;tatistiques</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation>&amp;Galerie QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation>Outils dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation>Exécuter des requêtes SQL personnalisées en lecture seule sur la base de données du logbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation>&amp;Imprimer les étiquettes QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>Connecter le r&amp;otor</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>&amp;Filtres de QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation>&amp;Diplômes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation>&amp;Liste de soumission DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation>Générer une liste de contacts à soumettre pour le crédit ARRL DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>Modifier les règles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation>Bip</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>Connecter le manipulateur &amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>Signaler un &amp;bug...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>Saisie &amp;manuelle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>Passer la saisie de contact en mode manuel&lt;br/&gt;(l&apos;heure, la fréquence et les profils ne sont plus synchronisés)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation>Liste de diffusion...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>Enregistrer la disposition</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>Conserver les options</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>Restaurer les options de connexion au redémarrage</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>Carnet de trafic - Chercher indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>Nouveau QSO - Ajouter l&apos;indicatif à la carte des bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>TRX - Bande inférieure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>TRX - Bande supérieure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>Nouveau QSO - Utiliser l&apos;indicatif du Whisperer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>Console CW - Augmenter la vitesse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>Console CW - Diminuer la vitesse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>Console CW - Profil suivant</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>Console CW - Profil précédent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>TRX - PTT On/Off</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>Effacer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>Afficher les alertes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>Toutes bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>Par bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>Par bande &amp;&amp; mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>Pas de vérif.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>Simple</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>Par bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>Arrêt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>Réinitialiser</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>Aucun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>Envoyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>Service - Envoi des QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>Récupérer QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>Service - Récupération des QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation>Thème : Natif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation>Thème : QLog Clair</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation>Thème : QLog Sombre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation>Nouveautés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation>Exporter Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation>Thème de couleur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>Non activé pour le style hors-Fusion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>Appuyez pour régler l&apos;alerte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Erreur d&apos;envoi immédiat Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Détail de l&apos;erreur :&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>op : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>Nouvelle version disponible</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>Une nouvelle version %1 est disponible.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>Me le rappeler plus tard</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>Télécharger</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation>Échec du chiffrement des identifiants.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation>Fichiers base de données (*.dbe);;Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation>Échec de création du fichier temporaire.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation>Échec de l&apos;exportation de la base de données.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation>Compression de la base...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation>Base de données exportée avec succès vers\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation>Échec de la compression de la base de données.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation>Échec de la préparation de la base pour l&apos;importation.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>Classique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>Voulez-vous supprimer le filtre de concours %1 ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>Concours : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Basé sur Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icônes par &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Images satellites par &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect par &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;Base de données TimeZone par &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>À propos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation>N/D</translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>Grille/Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation>Ligne de gris (Gray-Line)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation>Rayon (Beam)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation>Aurore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation>MUF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation>IBP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - Appels CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>Chemin/Trajet</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>Fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DOUBLON !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation>RX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation>TX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation>80m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RST envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RST reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation>59</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>Enregistrer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>Rechercher l&apos;indicatif sur le web. L&apos;URL peut être modifiée dans Réglages -&gt; Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>Heure début</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>Réinit</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>Date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>Durée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation>Infos</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Détails</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>Statut envoi QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Oui&lt;/b&gt; - une carte QSL a été envoyée ; le QSO a été transmis et accepté par le service en ligne&lt;br/&gt;&lt;b&gt;Non&lt;/b&gt; - ne pas envoyer de QSL ; ne pas transmettre le QSO au service en ligne&lt;br/&gt;&lt;b&gt;Demandé&lt;/b&gt; - le correspondant a demandé une QSL ou un envoi vers un service en ligne&lt;br/&gt;&lt;b&gt;En file d&apos;attente&lt;/b&gt; - la QSL ou l&apos;envoi vers le service est programmé&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>QSL envoyée via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>Mode de propagation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>Stats D&amp;X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiques DXCC&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiques de la station&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>M&amp;a Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation>TRX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>Mes &amp;Notes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>Membre :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>Développer/Réduire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>Non</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>Oui</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>Demandé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>En file d&apos;attente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>Ignoré</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>Électronique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>Échec de connexion au Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>LP (Long Path)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>Nouvelle Entité !</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>Nouvelle Bande !</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>Nouveau Mode !</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>Nouveau Bande &amp; Mode !</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>Nouveau Slot !</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>Contacté (Worked)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GE (Good Evening)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM (Good Morning)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GA (Good Afternoon)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation> m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>Recherche Callbook inactive</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>Recherche Callbook active</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>L&apos;ID du Concours doit être renseigné pour l&apos;activation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>deux ou quatre locators adjacents (Maidenhead), chacun de quatre caractères (ex. JN18,JN19...)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>le DOK (District Location Code) DARC de la station contactée (ex. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation>World Wide Flora &amp; Fauna (WWFF)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation>Groupe d&apos;Activité Spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation>Informations du Groupe d&apos;Activité Spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation>Ce n&apos;est pas le nom complet du concours mais l&apos;ID attribué&lt;br&gt;(ex. CQ-WW-CW pour le CQ WW DX Contest CW)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>Description de l&apos;équipement de la station contactée</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>Transceiver 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>Transceiver 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>Le statut du poste a changé</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>Le transceiver n&apos;est pas connecté</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>Transceiver 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>Transceiver 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>Transceiver 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>Transceiver 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>Le statut du poste a changé</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>Le transceiver n&apos;est pas connecté</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation>Rotor 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>Impossible de lier un port</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>Impossible d&apos;obtenir l&apos;adresse IP pour</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>Pas d&apos;adresse IPv4 pour</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation>Une erreur est survenue</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>Délai d&apos;attente dépassé</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>Gérer la carte QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>QSL disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>Copie le fichier d&apos;entrée du dossier source vers le stockage QSL interne de QLog.&lt;br/&gt;Le fichier original reste inchangé dans le dossier source</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>Importer QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>Ajouter un fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>Retirer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>Supprimer la QSL ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>Ouvrir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation>Ajouter/Retirer des favoris</translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation>Paramètres spécifiques à la plateforme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation>La base de données a été exportée depuis une plateforme différente.\nVeuillez vérifier ou mettre à jour les paramètres suivants.\nVous pouvez laisser les champs vides et les configurer plus tard dans les Paramètres.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation>Paramètre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation>Valeur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation>Continuer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation>Sélectionner le fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation>Tous les fichiers (*)</translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>Image de profil</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>Aide de QLog</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>QLog Critique</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>Impossible de sauvegarder un mot de passe pour %1 dans le gestionnaire d&apos;identifiants</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>Impossible de récupérer un mot de passe pour %1 depuis le gestionnaire d&apos;identifiants</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>Avertissement QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>Mise à jour de la liste des clubs échouée. Impossible de supprimer les anciens enregistrements</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>Mise à jour de la liste des clubs échouée. Impossible de planifier les nouveaux téléchargements</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>Téléchargement inattendu de la liste des clubs. Annulation des téléchargements suivants</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>Contenu inattendu de la liste des clubs pour</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>Erreur réseau. Impossible de télécharger la liste des clubs pour</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>QLog est déjà en cours d&apos;exécution</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation>Échec du traitement de l&apos;importation de la base de données en attente.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation>La base de données a été importée avec succès, mais les mots de passe stockés n&apos;ont pas pu être restaurés (échec du déchiffrement ou données corrompues). Tous les mots de passe des services ont été effacés et doivent être saisis à nouveau dans les Paramètres.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>Impossible de se connecter à la base de données.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>Impossible d&apos;exporter la base QLog vers ADIF pour sauvegarde.&lt;p&gt;Essayez d&apos;exporter votre carnet de trafic en ADIF manuellement</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>La migration de la base de données a échoué.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>Info QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>Ce nom d&apos;activité existe déjà.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>Ce nom de règle existe déjà.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>L&apos;expression régulière de l&apos;indicatif est incorrecte.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>L&apos;expression régulière du commentaire est incorrecte.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>Impossible de mettre à jour les règles d&apos;alerte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>Erreur de nom de serveur DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>L&apos;adresse du serveur DXC doit être au format&lt;p&gt;&lt;b&gt;[utilisateur@]hôte:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>Mot de passe DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>Mot de passe invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>Erreur de connexion au serveur DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>Le nom de fichier est vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>Impossible d&apos;écrire dans le fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>Information QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>Exporté.</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>%n contact exporté.</numerusform>\n            <numerusform>%n contacts exportés.</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>Erreur de Chat : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>Ce nom de filtre existe déjà.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Erreur Transceiver :&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Erreur Rotor :&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Erreur Keyer CW :&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>Les champs &lt;b&gt;%0&lt;/b&gt; ne seront pas sauvegardés car &lt;b&gt;%1&lt;/b&gt; n&apos;est pas renseigné.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>Votre indicatif est vide. Veuillez configurer votre profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>Impossible de mettre à jour les conditions du filtre QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>Veuillez définir au moins un profil d&apos;emplacement de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>Le multicast WSJT-X est activé mais l&apos;adresse n&apos;est pas une adresse multicast.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation>Boucle détectée. Le transfert UDP brut utilise le même port que le port de réception WSJT-X.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Le port du transceiver doit être un port COM valide.&lt;br&gt;Pour Windows, utilisez COMxx, pour les OS de type Unix, utilisez un chemin vers le périphérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Le port PTT doit être un port COM valide.&lt;br&gt;Pour Windows, utilisez COMxx, pour les OS de type Unix, utilisez un chemin vers le périphérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;Plage TX&lt;/b&gt; : La fréquence max ne doit pas être 0.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;Plage TX&lt;/b&gt; : La fréquence max ne doit pas être inférieure à la fréquence min.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Le port du rotor doit être un port COM valide.&lt;br&gt;Pour Windows, utilisez COMxx, pour les OS de type Unix, utilisez un chemin vers le périphérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>Le port du keyer CW doit être un port COM valide.&lt;br&gt;Pour Windows, utilisez COMxx, pour les OS de type Unix, utilisez un chemin vers le périphérique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Impossible de changer le modèle de keyer CW en &lt;b&gt;Morse via CAT&lt;/b&gt;&lt;br&gt;Pas de support Morse via CAT pour le(s) poste(s) &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Impossible de supprimer le profil de keyer CW&lt;br&gt;Ce profil est utilisé par le(s) poste(s) : &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>Le format de l&apos;indicatif est invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>L&apos;indicatif de l&apos;opérateur a un format invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translation>Le format du Locator est invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>Les carrés VUCC ont un format invalide (doit être 2 ou 4 Locators séparés par des virgules)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>Le pays ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>La zone CQ ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>La zone ITU ne doit pas être vide</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation>Importation de la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>Ouverture de la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>Sauvegarde de la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>Migration de la base de données</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>Démarrage de l&apos;application</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>km</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>milles</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>Mon transceiver</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicatif de la station de log</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>Mon Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>Nom de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicatif de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>Ma ville</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>Mon pays</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>Mon département/comté</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>Mon IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>Mon SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mon activité spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>Info activité spéciale</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mes carrés VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>Mon WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>Ma réf. POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>Mon DOK (DARC)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>Ma zone ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>Ma zone CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>Mon DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>Connexion refusée</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>L&apos;hôte a fermé la connexion</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>Hôte introuvable</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>Délai d&apos;attente dépassé</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>Erreur Réseau</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>Erreur Interne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>Impossible de se connecter au serveur DXC &lt;p&gt;Raison &lt;b&gt; : </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;Importé&lt;/b&gt; : %n contact</numerusform>\n            <numerusform>&lt;b&gt;Importés&lt;/b&gt; : %n contacts</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Avertissement&lt;/b&gt; : %n</numerusform>\n            <numerusform>&lt;b&gt;Avertissements&lt;/b&gt; : %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Erreur&lt;/b&gt; : %n</numerusform>\n            <numerusform>&lt;b&gt;Erreurs&lt;/b&gt; : %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation>Base de données QLog invalide</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation>Version de la base trop récente (nécessite une version plus récente de QLog)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation>Le fichier n&apos;est pas un export QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation>Chemin TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation>(chemin interne Flatpak)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation>Poste</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation>PTT Poste</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation>rigctld Poste</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation>Rotor</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation>Keyer CW</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation>TOTAL contactés</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation>TOTAL confirmés</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>Erreur générale</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation>Galerie de cartes QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation>Chercher par indicatif...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation>Trier par :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation>Exporter filtrés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation>Date (plus récent)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation>Date (plus ancien)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation>Indicatif (A-Z)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation>Indicatif (Z-A)</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation>\n            <numerusform>%n carte QSL</numerusform>\n            <numerusform>%n cartes QSL</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation>Toutes les cartes QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation>Favoris</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation>Par Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation>Par Date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation>Par Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation>Par Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation>Par Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation>Retirer des favoris</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation>Ajouter aux favoris</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation>Ouvrir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation>Enregistrer...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation>Enregistrer la carte QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation>Exporter les cartes QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation>%1 cartes sur %2 exportées</translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>Résumé de l&apos;importation QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>Résumé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>Téléchargées :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>Mises à jour :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>Non appariées :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>Erreurs :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>Détails</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>Nouvelles QSL : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>QSO mis à jour : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translation>QSL non appariées : </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation>Imprimer les étiquettes QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation>Filtrer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation>Plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation>Mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation>Profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation>QSL Envoyée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation>Filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation>Modèle d’étiquette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation>Taille de page:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation>Colonne:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation>Ligne:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation>Largeur de l’étiquette :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation>Hauteur de l’étiquette:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation>Marge gauche:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation>Marge supérieure:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation>Espacement horizontal:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation>Espacement vertical:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation>Apparence de l’étiquette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation>Imprimer les bordures des étiquettes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation>QSO par étiquette:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation>Texte de pied de page gauche:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation>Texte de pied de page droit:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation>Ignorer l’étiquette:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation>Police sans-serif:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation>Police monospace:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation>Taille de l’indicatif:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation>Taille « To Radio » :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation>Texte « To Radio » :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation>Taille de l’en-tête:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation>Taille des données:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation>Texte d’en-tête de date:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation>Format de date:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation>Texte d’en-tête de l’heure:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation>Texte d’en-tête de bande:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation>Texte d’en-tête du mode:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation>Texte d’en-tête QSL:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation>Colonne supplémentaire:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation>Texte de la colonne supplémentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation>(nom de colonne BD)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation>Aucun QSO correspondant trouvé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation>Page 0 sur 0</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation>Étiquettes : 0 (0 pages)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation>Imprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation>Exporter en PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation>Personnalisé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation>Vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation>QSO correspondant à ce profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation>Étiquettes : %1 (%2 pages)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation>Page %1 sur %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation>Exporter en PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation>Fichiers PDF (*.pdf)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation>Marquer comme envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation>Marquer les QSO imprimés/exportés comme envoyés ?</translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation>dd/MM/yyyy HH:mm:ss</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>Heure début</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>Heure fin</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation>TX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation>RX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>Fréquence</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>Nom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>Mes notes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation>about:blank</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Détails</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>Cont.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation>CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>État</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>Comté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>Âge</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation>AF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation>AN</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation>AS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation>EU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation>NA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation>OC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>deux ou quatre locators adjacents, de quatre caractères chacun (ex. JN18,JN19,JN28,JN29)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation>Info SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>le DOK (District Location Code) DARC de la station contactée (ex. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation>E-mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>Mode de propagation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>Nom du satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>Mode satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>Stats D&amp;X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiques DXCC&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Statistiques de la station&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>M&amp;a station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>Nom de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicatif de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation>Info Sig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation>Équipement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>Puissance</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation>&amp;QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>Afficher la carte QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Oui&lt;/b&gt; - une carte QSL entrante a été reçue ; le QSO a été confirmé par le service en ligne&lt;br/&gt;&lt;b&gt;Non&lt;/b&gt; - aucune carte QSL n&apos;a été reçue ; le QSO n&apos;a pas été confirmé par le service en ligne&lt;br/&gt;&lt;b&gt;Demandée&lt;/b&gt; - la station a demandé une carte QSL ou le téléchargement du QSO vers le service en ligne&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>QSL envoyée via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation>QSL via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Oui&lt;/b&gt; - une carte QSL sortante a été envoyée ; le QSO a été accepté par le service en ligne&lt;br/&gt;&lt;b&gt;Non&lt;/b&gt; - ne pas envoyer de carte QSL ; ne pas envoyer le QSO au service en ligne&lt;br/&gt;&lt;b&gt;Demandée&lt;/b&gt; - la station contactée a demandé une carte QSL ou l&apos;envoi vers le service en ligne&lt;br/&gt;&lt;b&gt;En attente&lt;/b&gt; - une carte QSL ou un envoi vers le service en ligne a été mis en file d&apos;attente&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>Reçue</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>Gérer la carte QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>Envoyée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation>Message QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>Message QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation>&amp;Concours</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>ID du concours</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>N° Reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>Échange Reçu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>N° Envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>Échange Envoyé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>Membre :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>&amp;Réinitialiser</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>&amp;Recherche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>Non</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>Oui</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>Demandée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>En attente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>Ignorée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>Direct</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>Électronique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>Soumettre les modifications</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>Voulez-vous vraiment soumettre toutes les modifications ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>Erreur QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>Impossible de sauvegarder les modifications - erreur interne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>Impossible de sauvegarder - essayez de réinitialiser les modifications</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>Détail du QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>Modifier le QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Téléchargement de l&apos;image eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Échec du téléchargement de l&apos;image eQSL : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>L&apos;indicatif DX ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>Le format de l&apos;indicatif DX est incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>La fréquence TX ou la bande doit être renseignée</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>La bande TX devrait être </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>La bande RX devrait être </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>Le format du locator DX est incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation>D&apos;après l&apos;indicatif, le pays DXCC diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation>D&apos;après l&apos;indicatif, le continent DXCC diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation>D&apos;après l&apos;indicatif, la zone ITU diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation>D&apos;après l&apos;indicatif, la zone CQ diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>Le format VUCC est incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation>D&apos;après les fréquences, le mode Sat devrait être </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>Le nom du satellite ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>Votre indicatif ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>Le format de votre indicatif est incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>Le format de vos locators VUCC est incorrect</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation>D&apos;après votre indicatif, votre zone ITU diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation>D&apos;après votre indicatif, votre zone CQ diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation>D&apos;après votre indicatif, votre pays DXCC diffère de la valeur saisie - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>D&apos;après le sommet SOTA, le QTH ne correspond pas au nom du sommet - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation>D&apos;après le sommet SOTA, le locator ne correspond pas au locator SOTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation>D&apos;après la référence POTA, le QTH ne correspond pas au nom POTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation>D&apos;après la référence POTA, le locator ne correspond pas au locator POTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation>D&apos;après le sommet SOTA, mon QTH ne correspond pas au nom du sommet - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation>D&apos;après le sommet SOTA, mon locator ne correspond pas au locator SOTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation>D&apos;après la référence POTA, mon QTH ne correspond pas au nom POTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation>D&apos;après la référence POTA, mon locator ne correspond pas au locator POTA - attendu : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Le statut d&apos;envoi LoTW sur &lt;b&gt;Non&lt;/b&gt; est incohérent si une date d&apos;envoi QSL est définie. Mettez la date au 01/01/1900 pour laisser le champ vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Une date doit être renseignée si le statut d&apos;envoi LoTW est &lt;b&gt;Oui&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Le statut d&apos;envoi eQSL sur &lt;b&gt;Non&lt;/b&gt; est incohérent si une date d&apos;envoi QSL est définie. Mettez la date au 01/01/1900 pour laisser le champ vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Une date doit être renseignée si le statut d&apos;envoi eQSL est &lt;b&gt;Oui&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Le statut d&apos;envoi Papier sur &lt;b&gt;Non&lt;/b&gt; est incohérent si une date d&apos;envoi QSL est définie. Mettez la date au 01/01/1900 pour laisser le champ vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>Une date doit être renseignée si le statut d&apos;envoi Papier est &lt;b&gt;Oui&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>Erreur du callbook : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;Attention : &lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>Validation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>Les champs marqués en jaune sont invalides.&lt;p&gt;Sauvegarder tout de même les modifications ?&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>&amp;Sauvegarder</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Modifier</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>Détail du filtre QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>Nom du filtre :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>Trouver les QSO correspondant à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>Toutes les conditions suivantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>L&apos;une des conditions suivantes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>Ajouter une condition</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>Égal à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>Différent de</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>Contient</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>Ne contient pas</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>Supérieur à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>Inférieur à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>Commence par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation>Exp. Régulière</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>Ne doit pas être vide</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>Filtres de QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>Filtres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Supprimer</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>Aucun profil de déca (Rig) sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation>Erreur Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>Erreur interne</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>Impossible d&apos;ouvrir le poste</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation>RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation>Déconnecté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation>Désactiver le split</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation>RIT : 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation>XIT : 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation>PWR : %1W</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation>Paramètres avancés Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation>Chemin Rigctld :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Laisser vide pour une auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation>Auto-détecter le chemin de Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation>Auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation>Version de Rigctld :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation>Arguments supplémentaires :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation>ex: -v -v pour un log verbeux</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation>Ne peut pas être modifié</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation>Auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation>rigctld n&apos;a pas été trouvé sur ce système.\nVeuillez installer Hamlib ou spécifier le chemin manuellement.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation>Exécutable (*.exe);;Tous les fichiers (*.*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation>Tous les fichiers (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation>Sélectionner l&apos;exécutable rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation>Non trouvé</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation>L&apos;exécutable rigctld est introuvable dans /app/bin/. Cela ne devrait pas arriver avec un build Flatpak.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation>L&apos;exécutable rigctld est introuvable. Veuillez installer Hamlib ou spécifier le chemin dans les paramètres avancés.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation>Discordance de version majeure de Hamlib : QLog a été compilé avec Hamlib %1 mais rigctld indique la version %2.%3.%4. Les ID de modèles de postes sont incompatibles entre versions majeures.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation>Le port %1 est déjà utilisé. Une autre instance de rigctld ou une autre application utilise probablement ce port.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation>rigctld est démarré mais ne répond pas sur le port %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation>Échec du démarrage de rigctld : %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation>rigctld a planté.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation>Délai d&apos;attente dépassé pour rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation>Erreur d&apos;écriture avec rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation>Erreur de lecture avec rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation>Erreur rigctld inconnue.</translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>Aucun profil de rotor sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>Erreur d&apos;initialisation</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>Erreur interne</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>Impossible d&apos;ouvrir le rotor</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation>Az :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation>Aller à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation>Profil de boutons précédent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation>Profil de boutons suivant</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation>QSO LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation>QSO Grand Chemin (LP)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation>QSO SP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation>QSO Petit Chemin (SP)</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>Paramètres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>Station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> Profils</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>SIG (paramètre optionnel).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation>Zone ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>Zone CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>Comté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>Nom du QTH (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>WWFF (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>Nom de l&apos;opérateur (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>Carrés VUCC (optionnel). Ex: JN18,JN19,IN98</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation>Localisation du comté (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation>Info SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>Localisateur de la station (obligatoire)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>Nom du profil</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>Liste de tous les profils de station disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>Information SIG (paramètre optionnel)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>Nom du profil utilisé comme alias pour l&apos;indicatif, le localisateur, l&apos;opérateur et le QTH (obligatoire) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>Indicatif (paramètre obligatoire)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>Indicatif de l&apos;opérateur (optionnel, si différent de celui de la station)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>Nom de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>Indicatif de la station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>Indicatif de l&apos;opérateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>Ajouter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>Supprimer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>Équipement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>Antennes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>Profils</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>Description</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation>Largeur de faisceau azimutal </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation>Offset azimutal</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>La plage valide est 0° - 100° (0° = non spécifié)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>Non spécifié</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>Liste de toutes les antennes disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>Clés télégraphiques (CW)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>Profils de manipulateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>Liste de tous les manipulateurs CW disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation>Zone dangereuse</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation>&lt;b&gt;⚠ Ceci est une zone dangereuse. Procédez avec prudence, car les actions effectuées ne peuvent pas être annulées et peuvent avoir un impact important sur votre journal.&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation>Supprimer tous les QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation>Supprimer tous les mots de passe du coffre sécurisé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>Modèle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>Mode du manipulateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>Inverser les palettes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation>Sidetone (palettes uniquement)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation>Fréq. sidetone :</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>Vitesse par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation>N/D</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation> MPM (WPM)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation>Port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Utiliser COMxx pour Windows ou le chemin vers le port sous Linux/Unix</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>Vitesse (Bauds)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation>115200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation>57600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation>38400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation>19200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation>9600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation>4800</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation>2400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation>1200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation>Nom d&apos;hôte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib ne permet pas de changer le port de destination.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>Profils de raccourcis CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>Liste de tous les profils de raccourcis CW disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>Description courte du bouton (7 car. max)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation>Transceivers</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>Interface</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>Fréquences TX mini et maxi. Les plages spécifiques sont dérivées des bandes autorisées dans les paramètres.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>Plage TX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>Offsets</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>Entrer manuellement l&apos;offset RIT ou Transverter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>Entrer manuellement l&apos;offset XIT ou Transverter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation>TX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>Puissance par déf.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>Entrer la puissance par défaut (ex: si poste déconnecté)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>Manipulateur CW assigné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>Fonctionnalités du poste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation>VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>Fréq.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation>Effacement sur QSY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>Puissance</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>État du PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation>Offset TX (XIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation>Offset RX (RIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>Vitesse manipulateur CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>Synchro vitesse CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>Spots DX vers le poste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation>Lancer le démon rigctld pour partager le poste avec d&apos;autres applis (ex: WSJT-X)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation>Partager le poste via le port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation>Avancé...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation>Port du poste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation>Adresse CI-V</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation>Auto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation>Contrôle de flux</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation>Parité</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translation>Type de PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translation>Port PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>Bits de données</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation>8</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation>7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation>6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation>5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation>Bits d&apos;arrêt</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation>1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation>2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>Type de port</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation>Intervalle d&apos;interrogation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation> ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>Liste de tous les transceivers disponibles</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>Rotors</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>Série</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>Réseau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>Profils de boutons utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>Bouton 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>Bouton 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>Bouton 3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>Bouton 4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation>Nomenclature (Callbook)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>Ordre de requête</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>Primaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>Secondaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>Utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>Mot de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;Note :&lt;/b&gt; Un abonnement QRZ XML est recommandé pour accéder aux informations détaillées. Sans abonnement, les données seront limitées (localisateur ou autres champs manquants).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Bouton de recherche Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>Spécifier l&apos;URL pour la recherche rapide. La macro &lt;DXCALL&gt; sera remplacée par l&apos;indicatif courant</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>Tester l&apos;URL avec votre indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation>Test</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation>Clubs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>Listes actives</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation>Sync &amp;&amp; QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation>ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>Les QSOs sont envoyés immédiatement</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>Envoi immédiat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>Ce n&apos;est pas un mot de passe. C&apos;est le code d&apos;envoi reçu par email après l&apos;inscription sur HRDLOG.net</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translation>Code d&apos;envoi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>Si activé et le poste connecté, QLog envoie périodiquement des messages &quot;On-Air&quot; à HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>Envoyer &quot;On-Air&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>Chemin TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>Parcourir</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>Utiliser une instance TQSL interne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>Clé API par défaut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>Clés API par indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>Clé API</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>Point d&apos;accès (Endpoint)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>Autres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>Statut confirmé par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;Note de sécurité :&lt;/b&gt; QLog stocke les mots de passe de manière sécurisée. Hélas, ON4KST utilise un protocole où le mot de passe transite en clair sur un canal non sécurisé.&lt;/p&gt;&lt;p&gt;Soyez prudent lors du choix de votre mot de passe pour ce service.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>Bandes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>Modes</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>Le caractère &apos;&gt;&apos; sert de marqueur pour la position initiale du curseur dans la colonne Report. &lt;br/&gt;Ex: &apos;5&gt;9&apos; positionnera le curseur sur le second caractère.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation>WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>Redirection UDP brute</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog redirige les paquets UDP bruts de WSJT-X.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation>ex: 192.168.1.1:1234 192.168.2.1:1234</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation>Port </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>Port sur lequel QLog écoute le trafic provenant de WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>Rejoindre le Multicast</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>Activer/Désactiver l&apos;option Multicast pour WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>Adresse Multicast</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation>&lt;DXCALL&gt; = Indicatif du correspondant\n&lt;NAME&gt; = Prénom du correspondant\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Salutations (GM/GA/GE)\n&lt;QTH&gt; = QTH distant\n&lt;MYCALL&gt; = Mon indicatif\n&lt;MYNAME&gt; = Mon prénom\n&lt;MYQTH&gt; = Mon QTH\n&lt;MYLOCATOR&gt; = Mon localisateur (Grid)\n&lt;MYGRID&gt; = Mon localisateur (Grid)\n&lt;MYSIG&gt; = Mon SIG\n&lt;MYSIGINFO&gt; = Mes infos SIG\n&lt;MYIOTA&gt; = Mon IOTA\n&lt;MYSOTA&gt; = Mon SOTA\n&lt;MYWWFT&gt; = Mon WWFF\n&lt;MYVUCC&gt; = Mon VUCC\n&lt;MYPWR&gt; = Ma puissance (W)\n&lt;EXCHSTR&gt; = Message d&apos;échange concours\n&lt;EXCHNR&gt; = Numéro de série concours\n&lt;EXCHNRN&gt; = Numéro de série concours (9→N, 0→T)\n&lt;+&gt; = Vitesse +5 MPM (&lt;++&gt; = +10 MPM, etc.)\n&lt;-&gt; = Vitesse -5 MPM (&lt;--&gt; = -10 MPM, etc.)\n</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation>RX : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Laisser vide pour l&apos;auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation>Auto-détection du chemin TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation>Auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation>Version de TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>Spécifier l&apos;adresse Multicast. &lt;br&gt;Sur certains systèmes Linux, il peut être nécessaire d&apos;activer le multicast sur l&apos;interface de boucle locale (loop-back).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation>TTL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>Le TTL (Time-To-Live) détermine la portée de propagation&lt;br&gt; d&apos;un paquet multicast sur votre intranet. </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation>Colorer les spots CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation>Activer/Désactiver l&apos;envoi d&apos;indicateurs d&apos;état colorés à WSJT-X pour chaque indicatif appelant CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>Notifications</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation>LogID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;LogID assigné au carnet actuel.&lt;/p&gt;Le LogID est envoyé dans les notifications réseau comme identifiant unique d&apos;instance.&lt;p&gt;L&apos;ID est généré automatiquement et ne peut être modifié.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation>Spots DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog envoie les notifications UDP des spots du cluster DX.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation>Alertes de spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog envoie les notifications UDP pour les alertes de spots utilisateur.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>Modifications de QSO </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog envoie les notifications UDP lors de l&apos;ajout/modification/suppression d&apos;un QSO.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation>Spots CQ WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog envoie les notifications UDP des spots CQ de WSJT-X.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>État du poste</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Liste des adresses IP vers lesquelles QLog envoie les notifications UDP lors d&apos;un changement d&apos;état du poste.&lt;/p&gt;Les adresses sont séparées par des espaces (format IP:PORT).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>Interface (GUI)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>Format de date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>Système</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>Personnalisé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Documentation du format d&apos;heure&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>Format d&apos;heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24 heures</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation>AM/PM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation>Système d&apos;unités</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation>Métrique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation>Impérial</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>Spécial - Omnirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation>Ne peut pas être modifié</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>Nom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>Report</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>État / Province</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>Début (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>Fin (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>Mode SAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>Désactivé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation>Aucun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation>Matériel (Hard)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation>Logiciel (Soft)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation>Non</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation>Pair</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation>Impair</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation>Mark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation>Space</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation>Dummy (fictif)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>Morse via CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation>WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation>CWDaemon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation>FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation>Simple palette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation>IAMBIC A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation>IAMBIC B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation>Ultimatice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation>Haut (High)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation>Bas (Low)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation>Appuyez sur &lt;b&gt;Modifier&lt;/b&gt; pour confirmer les changements de profil ou sur &lt;b&gt;Annuler&lt;/b&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>Modifier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>Ne doit pas être vide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>Sélectionner un fichier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation>Auto-détection</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation>TQSL n&apos;a pas été trouvé sur ce système.\nVeuillez installer TQSL ou spécifier le chemin manuellement.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation>Non trouvé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation>Le partage du poste n&apos;est disponible qu&apos;avec le pilote Hamlib</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation>Le partage du poste n&apos;est pas disponible pour les connexions réseau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation>Supprimer les mots de passe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation>Tous les mots de passe ont été supprimés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation>Suppression de tous les QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation>Erreur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation>Impossible de supprimer tous les QSOs.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>membres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>Connexion internet requise au démarrage de l&apos;application</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>Description</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>Raccourci</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>Conflit avec un raccourci intégré</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>Conflit avec un raccourci utilisateur</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>QSO à envoyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>QSO sélectionné</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>Envoyer</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>Rechercher</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>Statistiques</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>Plage de dates</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>au</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation>Filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation>Confirmé par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>Papier</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>Type de graphique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSO par</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>Pourcentages</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation>Top 10</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>Histogramme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>Afficher sur la carte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>Mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>Mon locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>Ma station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>Mon antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>Dim</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>Lun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>Mar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>Mer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>Jeu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>Ven</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>Sam</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>Non spécifié</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation>Confirmé </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation>Non confirmé </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation>Aucun filtre utilisateur</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>Plus de 50 000 QSO. Les afficher ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation>Génération des QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>Année</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>Mois</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>Jour de la semaine</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>Mode de propagation</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>Confirmé / Non confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>Pays</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>Grands carrés Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>Distance</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation>QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>Locators confirmés/contactés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>Tout</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>Poste 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>Poste 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>Poste 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>Poste 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation>Une erreur est survenue</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>Le statut du poste a changé</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>Le poste n&apos;est pas connecté</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>Vide</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>Message</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>Envoyer les QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>Filtres</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>Profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>Mon indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>Inclure le statut des QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En temps normal, ce statut signifie &lt;b&gt;&quot;ne pas envoyer&quot;&lt;/b&gt;.&lt;br/&gt;Toutefois, il peut être souhaitable d&apos;ignorer ce réglage lors de l&apos;envoi d&apos;une QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>Non</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>En temps normal, ce statut signifie &lt;b&gt;&quot;Ignorer/Invalide&quot;&lt;/b&gt;.&lt;br/&gt;Toutefois, il peut être souhaitable d&apos;ignorer ce réglage lors de l&apos;envoi d&apos;une QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>Ignorer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>Aucun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>Message des QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>Champ de message QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>Profil QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>Cette option supprime tous les QSO sur Clublog&lt;br&gt;et, selon le filtre, renvoie tous les QSO quel que soit leur statut.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>Vider Clublog et renvoyer les QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation>LoTW / TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation>Emplacement de la station TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>ID du profil de station</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translation>Tout renvoyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>Afficher les QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;Envoyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation>Non spécifié</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>Masquer les QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>Envoi vers %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>Annuler</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>Avertissement QLog - %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>Impossible de mettre à jour le statut du QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>Impossible d&apos;envoyer le(s) QSO : </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>Information QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>Aucun QSO trouvé pour l&apos;envoi.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>Le(s) QSO a/ont été envoyé(s) aux services sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>Envoyer vers</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>Les valeurs ci-dessous seront utilisées lorsqu&apos;un enregistrement ne contient pas les valeurs ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>Tous</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation>L&apos;indicatif de l&apos;emplacement (%1) et le locator (%2) ne correspondent pas aux filtres sélectionnés</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation>L&apos;indicatif de l&apos;emplacement (%1) ne correspond pas à l&apos;indicatif sélectionné (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation>Le locator de l&apos;emplacement (%1) ne correspond pas au locator sélectionné (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>Inconnu</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>Le service n&apos;est pas configuré correctement.&lt;p&gt; Veuillez utiliser la boîte de dialogue &lt;b&gt;Paramètres&lt;/b&gt; pour le configurer.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>Distance</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation>Azimut</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>Commentaire</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation>expK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation>R</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation>GMF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation>Au</translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>Heure</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>Filtres WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>Filtres généraux</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Statut du log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>Nouvelle bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>Nouveau mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>Nouvelle entité (DXCC)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>Nouveau slot (bande/mode)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>Contacté</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>Confirmé</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>Continent</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>Amérique du Nord</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>Europe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>Amérique du Sud</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>Afrique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>Antarctique</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>Asie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>Océanie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>Distance supérieure à</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR meilleur que</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation> dB</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>Filtres étendus</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>Membre</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>Aucune liste de club n&apos;est activée</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>Indicatif</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>Locator</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>Distance</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation>SNR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>Dernière activité</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>Dernier message</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>Membre</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Formulaire</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>Filtré</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilité des colonnes...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quelles colonnes doivent être affichées</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>Filtrer...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>Filtrer les spots</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation>Exécuter avec l&apos;espace de noms (namespace) spécifique.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation>espace de noms</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation>Fichier de traduction - chemin absolu ou relatif et nom du fichier QM.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation>chemin/nom-du-fichier-QM</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation>Définir la langue. &lt;code&gt; exemple : &apos;en&apos; ou &apos;en_US&apos;. Ignore les paramètres d&apos;environnement.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation>code</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>Écrit les messages de débogage dans le fichier de debug</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation>Traiter l&apos;importation de base de données en attente (usage interne)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation>Forcer la mise à jour de toutes les listes (DXCC, SATs, etc.)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/qlog_it.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"it_IT\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>Editor delle attività</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>Nome dell&apos;attività</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>Layout</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>Disposizione delle finestre:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>Salvato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>Campi disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>Elenco di campi che possono essere utilizzati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>Riga A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>Sposta i campi selezionati dall&apos;elenco dei campi disponibili alla riga A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>Elimina il campo selezionato dalla riga A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>Elenco dei campi nella prima riga modificabile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>Cambia ordine. Muovi campo sesezionato in alto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>Cambia ordine. Muovi campo sesezionato in basso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>Riga B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>Sposta i campi selezionati dall&apos;elenco dei campi disponibili alla riga B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>Elimina il campo selezionato dalla riga B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>Elenco dei campi nella seconda riga modificabile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>Colonna A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>Elenco dei campi nella prima colonna dei dettagli del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>Colonna B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>Elenco dei campi nella seconda colonna dei dettagli del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>Colonna C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>Elenco dei campi nella terza colonna dei dettagli del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>Righe del Nuovo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>Colonne Dettagli del Nuovo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>Valori</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>Profili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>Se non selezionato, il profilo non cambia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>Antenna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>Connetti automaticamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>Connette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>Rotore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>Campi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>Non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>Non Salvato</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>Dettaglio Regola dell&apos;Allarme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>Nome della Regola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>Abilitato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>Sorgente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation>DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation>DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation>Nuovo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation>Nuova Entità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation>Nuovo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation>Nuova Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>DX Callsign</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>Utilizza espressioni regolari simili a Perl</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation>.*</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>Nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>Stato del Log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>Spot Comment</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>CQZone</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>Speciale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>Modi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>Fonia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>Nord America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>Africa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>Antartide</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>Sud America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>Tutti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>Non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>Nessuna Club List è abilitata</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>Regole sugli avvisi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nome</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Stato</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>Nome della Regola</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>Aggiornato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>Último Aggiornamento</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>Último Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>Avvisi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>Cancella più vecchio di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>Mai</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translation>Modifica Regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilità della colonna...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translation>Diplomi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translation>Opzioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translation>Diploma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translation>Mia Entità DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation>Filtro Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translation>Confermato da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>Fonia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation>Digi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translation>Solo non lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation>Non confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translation>Mostra</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation>WAC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation>WAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation>WAS</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation>WPX</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translation>POTA Hunter</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translation>POTA Activator</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation>Contee degli Stati Uniti</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation>Distretti della Russia</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation>Città giapponesi / Ku / Gun</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation>Contee della Nuova Zelanda</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation>DME spagnoli</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation>Distretti dell’Ucraina</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation>Nessun filtro utente</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation>Eliminato</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translation>Nord America</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translation>South America</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translation>Africa</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translation>Antartide</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>Slot: </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>In attesa</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>Creare una finestra aggiuntiva di Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>Cancella più vecchio di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>Cancella Tutto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>Cancellare la banda attuale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>Mai</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation> min(s)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>Mostra Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>Centra RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation>Mostra frequenze di emergenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>Nessuna Radio connessa</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>La radio non supporta Morse over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Impossibile inviare Testo alla Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer non connesso</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio non connessa</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossibile impostare velocità Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossibile fermare invio Testo</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>Profili Keyer CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>Profilo Scorciatoie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>Velocità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>Testo inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>Testo ripetuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation>&amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>Testo da inviare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>Passa dall&apos;invio di &lt;b&gt;parole&lt;/b&gt; singolarmente (separate da spazi)&lt;br&gt; all&apos;invio dell&apos;intero testo come un&apos;unica &lt;b&gt;parola&lt;/b&gt; (separata da una nuova riga).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>Ferma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>Console CW: Ferma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>Cancella Inviati ed Echo Console</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation>Interrompere immediatamente la trasmissione CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>La radio deve essere connessa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>Parola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>Tutto</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer non connesso</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>Impossibile inviare il Testo</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossibile impostare velocità Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossibile fermare invio Testo</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>Il dispositivo connesso non è FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer non connesso</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>Impossibile inviare Testo a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>Impossibile inviare comando Clear a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>Impossibile inviare comando TX a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>Impossibile inviare comando Text a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>Impossibile inviare comando Stop a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>Impossibile inviare comando Abort a FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>Impossibile ricevere dati da FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>Timeout connessione FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>Errore di connessione FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>Errore comando FLDigi</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>Nessun Profilo Keyer CW selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>Errore Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>Errore di connessione</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>Impossibile aprire la connessione Keyer</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>Il dispositivo connesso non è Winkey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>Impossibile inviare Testo alla Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>Keyer non connesso</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>Errore di comunicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>Impossibile impostare velocità Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>Impossibile fermare invio Testo</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation>4000 Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {2000 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {1333 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {1000 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {800 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {666 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {571 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {500 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {444 ?}</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation type=\"unfinished\">4000 Hz {400 ?}</translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation>Esporta Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation>File:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation>Modello di formato:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation>Gestisci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation>Filtro utente:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation>Data/Ora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation> - </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation>Stazione e categorie</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation>Indicativo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation>Operatori:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation>Banda:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation>Modo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation>Potenza:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation>Operatore:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation>Assistito:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation>Stazione:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation>Trasmettitore:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation>Ora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation>Aggiuntivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation>Nome:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation>Email:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation>Indirizzo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation>Max 6 righe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation>Posizione:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation>Club:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation>Commento libero:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation>File Cabrillo (*.log);;File CBR (*.cbr);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation>QSO(s): %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation>QSOs: ?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation>Avviso QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation>Selezionare un modello di contest.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation>Selezionare un file di output.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation>Nessun nominativo disponibile. Controlla i filtri.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation>Impossibile preparare la query di esportazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation>Impossibile interrogare i QSO per l’esportazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation>Impossibile aprire il file %1 in scrittura.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation>Esportazione Cabrillo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation>Informazioni QLog</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation>\n            <numerusform>Esportati %n QSO nel file Cabrillo.</numerusform>\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation>Tutte le Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation>2m (144 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation>1.25m (222 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation>70cm (432 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation>33cm (902 MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation>23cm (1.2 GHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation>Luce</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation>VHF a 3 bande</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation>Solo VHF FM</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation type=\"unfinished\">Misto</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation>Operatore singolo</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation>Multi operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation>Controlla log</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation>Non assistito</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation>Assistito</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation>Fisso</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation>Mobile</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation>Spedizione</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation>Scuola</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation>Distribuito</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation>Uno</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation>Due</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation>Limitato</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation>Illimitato</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation>6 ore</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation>12 ore</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation>24 ore</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation>Classico</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation>Novizio/Tecnico</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation>Oltre 50</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation>Testo (allineato a sinistra)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation>Frequenza (kHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation>Ora (HHMM)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation>Data (AAAA-MM-GG)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation>RST breve (senza l’ultima cifra)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation>Maiuscolo</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation>Modalità (Cabrillo)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation>Numero con zeri</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation>Gestore modelli Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation>Importa modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation>Importa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation>Esporta modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation>Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation>Nuovo modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation>Nuovo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation>Copia modello esistente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation>Copia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation>Elimina modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation>Nome del modello:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation>Nome del contest:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation>Modalità predefinita:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation>Colonne riga QSO:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation>Nome del contest secondo le regole. È possibile inserire una stringa personalizzata se non è inclusa nell’elenco.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation>N.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation>Campo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation>Formattatore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation>Larghezza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation>Etichetta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation>Aggiungi riga</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation>Rimuovi riga selezionata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation>Nuovo modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation>Copia – %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation>Elimina modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation>Eliminare il modello «%1»?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation>Importa modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation>Modello Cabrillo QLog (*.qct)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation>Importazione fallita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation>Esporta modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation>Esportazione fallita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation>Impossibile scrivere il file: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation>File non trovato: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation>Impossibile aprire il file: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation>File modello non valido: nome mancante</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation>Impossibile avviare la transazione del database.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation>Avviso QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation>Impossibile salvare il modello «%1»: %2</translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;Sarà usato il callbook secondario&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation>ON4KST Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>Chat Room</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>Connette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>Nuovo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>Avviso QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>La chat ON4KST non è configurata correttamente.&lt;p&gt; Utilizza la finestra di dialogo &lt;b&gt;Impostazioni&lt;/b&gt; per configurarla.&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>Abilitato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>Disabilitato</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>Alba</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>Tramonto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>Chiave API non valida</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>Operazione Clublog per il nominativo %1 non riuscita.&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Impostazione visibilità colonna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>Generale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>Mie informazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation>QSL &amp;&amp; Callbooks</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>Membri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>Condizionali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>Contests</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>Altri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>Fatto</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>Deseleziona tutto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>Seleziona tutto</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>Impostazione visibilità colonna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>Fatto</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation>Entità DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation>Info Satelliti</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation>SOTA Summits</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation>WWFF Records</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation>IOTA Records</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation>POTA Records</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation>Registro dell&apos;elenco dei membri</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation>Clublog CTY.XML</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation>Lista di valori</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation>In aggiornamento </translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation> Aggiornamento fallito</translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation>Fonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>Afghanistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>Agalega &amp; St. Brandon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>Aland Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>Alaska</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>Albania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>Algeria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>American Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>Amsterdam &amp; St. Paul Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>Andaman &amp; Nicobar Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>Andorra</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>Angola</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>Anguilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>Annobon Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>Antarctica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>Antigua y Barbuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>Argentina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>Armenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>Aruba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>Ascension Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>Asiatic Russia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>Asiatic Turkey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>Austral Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>Australia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>Austria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>Aves Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>Azerbaiyán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>Azores</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>Bahamas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>Bahrain</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>Baker &amp; Howland Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>Balearic Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>Banaba Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>Bangladesh</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>Barbados</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>Belarus</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>Belgium</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>Belice</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>Benín</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>Bermuda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>Bhutan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>Bolivia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>Bonaire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>Bosnia-Herzegovina</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>Botswana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>Bouvet</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>Brazil</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>British Virgin Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>Brunei Darussalam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>Bulgaria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>Burkina Faso</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>Burundi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>Cambodia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>Cameroon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>Canada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>Canary Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>Cape Verde</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>Cayman Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>Central African Republic</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>Central Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>Ceuta &amp; Melilla</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>Chad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>Chagos Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>Chatham Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>Chesterfield Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>Chile</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>China</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>Christmas Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>Clipperton Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>Cocos (Keeling) Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>Cocos Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>Colombia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>Comoros</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>Conway Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>Corsica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>Costa Rica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>Cote d&apos;Ivoire</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>Crete</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>Croatia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>Crozet Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>Cuba</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>Curacao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>Cyprus</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>Czech Republic</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>DPR of Korea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>Dem. Rep. of the Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>Denmark</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>Desecheo Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>Djibouti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>Dodecanese</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>Dominica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>Dominican Republic</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>Ducie Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>East Malaysia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>Easter Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>Eastern Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>Ecuador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>Egypt</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>El Salvador</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>England</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>Equatorial Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>Eritrea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>Estonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>Ethiopia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>European Russia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>Falkland Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>Faroe Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>Fed. Rep. of Germany</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>Fernando de Noronha</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>Fiji</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>Finland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>France</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>Franz Josef Land</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>French Guiana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>French Polynesia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>Gabon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>Galapagos Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>Georgia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>Ghana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>Gibraltar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>Glorioso Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>Greece</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>Greenland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>Grenada</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>Guadeloupe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>Guam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>Guantanamo Bay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>Guatemala</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>Guernsey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>Guinea-Bissau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>Guyana</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>Haiti</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>Hawaii</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>Heard Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>Honduras</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>Hong Kong</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>Hungary</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>ITU HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>Iceland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>India</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>Indonesia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>Irán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>Iraq</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>Ireland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>Isle of Man</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>Israel</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>Italy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>Jamaica</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>Jan Mayen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>Japan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>Jersey</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>Johnston Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>Jordan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>Juan Fernandez Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>Juan de Nova &amp; Europa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>Kaliningrad</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>Kazakhstan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>Kenya</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>Kerguelen Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>Kermadec Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>Kingdom of Eswatini</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>Kure Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>Kuwait</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>Kyrgyzstan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>Lakshadweep Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>Laos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>Latvia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>Lebanon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>Lesotho</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>Liberia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>Libya</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>Liechtenstein</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>Lithuania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>Lord Howe Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>Luxembourg</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>Macao</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>Macquarie Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>Madagascar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>Madeira Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>Malawi</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>Maldivas</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>Malí</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>Malpelo Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>Mariana Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>Market Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>Marquesas Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>Marshall Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>Martinique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>Mauritania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>Mauritius</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>Mayotte</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>Mellish Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>Mexico</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>Micronesia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>Midway Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>Minami Torishima</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>Moldova</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>Monaco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>Mongolia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>Montenegro</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>Montserrat</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>Morocco</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>Mount Athos</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>Mozambique</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>Myanmar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation>N.Z. Subantarctic Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>Namibia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>Nauru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>Navassa Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>Nepal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>Netherlands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>New Caledonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>New Zealand</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>Nicaragua</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>Niger</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>Nigeria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>Niue</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>Norfolk Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>North Cook Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>North Macedonia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>Northern Ireland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>Norway</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>Ogasawara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>Oman</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>Pakistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>Palau</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>Palestine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>Palmyra &amp; Jarvis Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>Panama</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>Papua New Guinea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>Paraguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>Peru</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>Peter 1 Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>Philippines</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>Pitcairn Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>Poland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>Portugal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation>Pr. Edward &amp; Marion Is.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>Pratas Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>Puerto Rico</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>Qatar</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>Republic of Korea</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>Republic of Kosovo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>Republic of South Sudan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>Republic of the Congo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>Reunion Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>Revillagigedo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>Rodriguez Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>Romania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>Rotuma Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>Rwanda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>Saba &amp; St. Eustatius</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>Sable Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>Samoa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>San Andres &amp; Providencia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>San Felix &amp; San Ambrosio</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>San Marino</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>Sao Tome &amp; Principe</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>Sardinia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>Saudi Arabia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>Scarborough Reef</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>Scotland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>Senegal</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>Serbia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>Seychelles</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>Sierra Leona</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>Singapore</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>Sint Maarten</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>Slovak Republic</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>Slovenia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>Solomon Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>Somalia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>South Africa</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>South Cook Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>South Georgia Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>South Orkney Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>South Sandwich Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>South Shetland Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>Sov Mil Order of Malta</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>Spain</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>Spratly Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>Sri Lanka</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>St. Barthelemy</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>St. Helena</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>St. Kitts &amp; Nevis</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>St. Lucia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>St. Martin</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation>St. Paul Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>St. Peter &amp; St. Paul</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>St. Pierre &amp; Miquelon</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>St. Vincent</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>Sudán</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>Suriname</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>Svalbard</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>Swains Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>Sweden</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>Switzerland</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>Syria</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>Taiwan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>Tajikistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>Tanzania</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>Temotu Province</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>Thailand</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>The Gambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>Timor - Leste</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>Togo</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>Tokelau Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>Tonga</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>Trindade &amp; Martim Vaz</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>Trinidad y Tobago</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>Tristan da Cunha &amp; Gough Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>Tromelin Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>Tunisia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>Turkmenistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>Turks &amp; Caicos Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>Tuvalu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation>UK Base Areas on Cyprus</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>US Virgin Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>Uganda</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>Ukraine</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>United Arab Emirates</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>United Nations HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation>United States</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>Uruguay</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>Uzbekistan</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>Vanuatu</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>Vatican City</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>Venezuela</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>Vietnam</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>Wake Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>Wales</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>Wallis &amp; Futuna Islands</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>West Malaysia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>Western Kiribati</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>Western Sahara</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>Willis Island</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>Yemen</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>Zambia</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>Zimbabwe</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation>Elenco di invio DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation>Opzioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation>Mia Entità DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation>Filtro Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation>Categoria</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation>Misto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation>Fonia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation>Confermato da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation>Mostra</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation>Non ancora inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation>Inviato (non confermato)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation>Già confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation>Intervallo di banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation>Seleziona bande predefinite DXCC a 5 bande (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation>DXCC a 5 bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation>Seleziona tutte le bande idonee per DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation>Tutte le bande DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation>Seleziona le opzioni sopra e l’elenco si aggiornerà automaticamente.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation>Esporta i contatti elencati sopra in un file ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation>Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation>Nessun filtro utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation>Qualsiasi banda (livello entità)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation>DXCC a 5 bande (80/40/20/15/10 m)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation>Selezione personalizzata delle bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation>Entità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation>Prefisso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation>Data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation>Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation>Esporta ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation>Nessun contatto da esportare.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation>Impossibile recuperare i record dei contatti.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation>Esporta l’elenco di invio DXCC come ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation>qualsiasi banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation>5 bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation>tutte le bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation>%1 banda/e selezionata/e</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation>Nessun contatto corrisponde ai criteri selezionati.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation>%1 %2 %3 — DXCC %4 / %5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation>slot di banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation>entità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation>voce</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation>voci</translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>Nuova Entità</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>Nuova Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>Nuovo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>Nuovi  Banda&amp;Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>Nuovo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>Richiesto</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>In coda</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>non valido</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>Diretto</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>Elettronica</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>Modificato</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation>Grayline</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>Altro</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation>Short Path</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation>Long Path</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>Non ascoltato</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>Incerto</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation>Tasto Verticale</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation>Tasto a coltello</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation>Tasto semiautomatico o Bug</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation>Tasto meccanico automatico o Bug</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation>Tasto a singola paletta</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation>Tasto a doppia paletta</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation>Comandato dal Computer</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation>Confermato (AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation>Confermato (non-AG)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation>Sconosciuto</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <translation>Aircraft Scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation>Aurora-E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation>Aurora</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation>Back scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation>EchoLink</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation>Earth-Moon-Earth</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation>E Sporadico</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation>F2 Reflection</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation>Field Aligned Irregularities</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation>Onda di Terra</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation>Internet-assisted</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation>Ionoscatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation>Linea di vista</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation>Meteor scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation>Ripetitore o transponder terrestre o atmosferico</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation>Rain scatter</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation>Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation>Trans-equatoriale</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation>Propagazione Troposferica</translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation>Strumenti dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation>Log di debug</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation>Regole di registrazione:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation>es. qlog.ui.*.runtime=true</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation>Applica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation>Genera file di debug</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation>Esporta file</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation>Console SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation>Apri SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation>Salva SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation>Esegui SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation>Esporta come</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation>Inserisci la query SQL qui... Ctrl+Invio = esegui</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation>Apri query SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation>File SQL (*.sql);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation>Errore di apertura</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation>Impossibile aprire il file:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation>Salva query SQL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation>Errore di salvataggio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation>Impossibile salvare il file:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation>Query salvata in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation>Errore: %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation>%1 riga/righe mostrate (troncato a %2) in %3 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation>%1 riga/righe restituite in %2 ms</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation>Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation>Nessun risultato da esportare.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation>Errore di esportazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation>Impossibile aprire il file in scrittura:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation>Esportate %1 righe in %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation>File di testo (*.txt);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation>File CSV (*.csv);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation>Esporta ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation>Nessun ID contatto valido trovato nel set di risultati.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation>Impossibile recuperare i record dei contatti:\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation>Nessun contatto corrispondente trovato nel database.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation>Regole di logging ripristinate (predefinite)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation>Regole di logging applicate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation>Salva log di debug</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation>Attualmente non viene scritto alcun file di log di debug</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation>File di log (*.log);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation>Log di debug salvato in %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation>Impossibile copiare il file di log di debug.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation>La registrazione su file è disabilitata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation>File di log: %1</translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>Scarica le QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>eQSL QTH Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSLs da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSO da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>Mio Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;Scarica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW non è configurato correttamente.&lt;p&gt; Utilizza la finestra di dialogo &lt;b&gt;Impostazioni&lt;/b&gt; per configurarlo.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL non è configurato correttamente.&lt;p&gt; Utilizza la finestra di dialogo &lt;b&gt;Impostazioni&lt;/b&gt; per configurarlo.&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>Download da %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>Elaborazione di %1 QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>Aggiornamento di %1 non riuscito: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>Informazioni QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>Nessun servizio selezionato</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>Filtri DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>Filtri Generici</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>Modi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>Fonia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>Digital</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>North America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>Africa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>Antarctica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>South America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>Europa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation>FTx (FT8/FT4)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>Stato del Log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>Nuovo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>Nuova Entità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>Nuova Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>Nuovo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>Filtri Estesi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>Continente Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>Non mostrare i seguenti spot quando hanno lo stesso nominativo e la loro differenza di tempo è inferiore a Time Diff e la loro differenza di frequenza è inferiore a Freq Diff</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>Deduplica Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translation>Differenza oraria</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>s</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translation>Differenza di Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation> kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>Nessuna Club List è abilitata</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>Continente Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>Nazione</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>Inserisci un &lt;b&gt;nome host:porta&lt;/b&gt; del Server DXC.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>Connette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>Filtrato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation>Spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>A tutti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>Console</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>Ricerca a testo completo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>Ricerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>Chiudi ricerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>Invia comando DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>Filtra...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>Filtro DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translatorcomment>Invia lo Spot dell&apos;ultimo QSO salvato completabile con altre informazioni nella riga di invio comando al cluster</translatorcomment>\n        <translation>Spot Ultimo QSO salvato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>Invia l&apos;ultimo spot QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>Mostra statistiche HF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>Mostra statistiche VHF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>Mostra WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>Mostra WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilità della colonna...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quali colonne devono essere visualizzate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>Connetti all&apos;avvio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>Connessione automatica dopo l&apos;avvio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>Cancella Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>DXC - Elimina server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>Cancella Password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>Mantieni Spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>Gli spot non vengono cancellati quando ci si connette a un nuovo DX Cluster.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>Cancella Tutti i Dati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>Ricerca...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC - Ricerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>Mio continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>Automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>Sta Connettendo...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>DX Cluster è temporaneamente non disponibile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>DXC Errore del server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>Indicativo non valido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster Password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>Avviso di sicurezza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>La password può essere inviata tramite un canale non protetto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>Server</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>Nome utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>Disconnette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>Comando del DX Cluster</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>Password o QTHProfile ID errati</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation>File ADIF non trovato nella risposta eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>Nome utente o password errati</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>Errore sconosciuto</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>Impossibile aprire il file temporaneo</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>Impossibile salvare l&apos;immagine su file</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>Risposta sconosciuta da eQSL</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>Modifica Attività</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>Attività</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>Esporta QSO selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation>JSON</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>Tipo di esportazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>Set di colonne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>Seleziona uno dei set di colonne predefiniti o definisci il tuo set di colonne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>Modifica il set di colonne corrente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>Segna QSO esportati come inviati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>Esporta solo i QSO che corrispondono ai filtri attivi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>Filtri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>Esporta solo i QSO che corrispondono all&apos;intervallo di date selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>Intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>Esporta solo i QSO che corrispondono al mio nominativo selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>Mio Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>Esporta solo i QSO che corrispondono alla Mia griglia selezionata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>Mia Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>Esporta solo i QSO che corrispondono al valore selezionato QSL Invia Via</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>Invia QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>Includere stati insoliti dei QSO inviati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>Includere lo stato Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>In circostanze normali questo stato significa &lt;b&gt;&quot;Ignora/Non valido&quot;&lt;/b&gt;.&lt;br/&gt;Tuttavia, a volte potrebbe essere necessario ignorare questa impostazione quando si invia una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>&quot;ignora&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>In circostanze normali, questo stato significa &lt;b&gt;&quot;non inviare&quot;.&lt;br/&gt;Tuttavia, a volte potresti voler ignorare questa impostazione quando invii una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>&quot;No&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>Reinviare i QSO già inviati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>Già inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>Filtro Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>Esporta QSO che corrispondono al filtro QSO utente selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation>Profilo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>Esporta QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation>Esportare solo i QSO che corrispondono a questo profilo di stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation>Esportazione in corso…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>Impossibile Segnare QSO esportati come Inviati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>Generico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>Tutte</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation>Mínimo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>Specifico per QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>Personalizzato 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>Personalizzato 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>Personalizzato 3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation>Impacchettare dati e impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation>Inserire una password per cifrare le credenziali memorizzate.\nQuesta password sarà necessaria in seguito per ripristinarle.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation>Password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation>Casuale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation>Conferma password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation>Eliminare le password dal Credential Store dopo l’esportazione</translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>Timeout</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>Timeout di risposta da FLRig</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>Errore di rete</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>Messaggio di risposta non valido</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translation>Nessuno</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translation>CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translation>Impossibile impostare Tipo PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translation>Impossibile impostare Condividi PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation>Impossibile impostare l’indirizzo CI-V</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>Driver della Radio non Supportato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>Impossibile impostare auto_power_on</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation>Impossibile impostare no_xchg su 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>Connessione Radio fallita</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation>Errore nell’impostazione della frequenza TX</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>Errore impostazione fequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation>Errore nell’impostazione dello split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>Errore impostazione Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation>Errore nell’impostazione della modalità split</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>Errore impostazione PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>impossibile inviare il codice Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>impossibile fermare codice Morse</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>Errore della Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>Errore del Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>Errore VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore PWR (power2mw)</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore funzione RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore RIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore funzione XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore XIT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore di KeySpeed</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translatorcomment>This cannot be displayed</translatorcomment>\n        <translation>Errore impostazione KeySpeed</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>Driver del rotore non supportato</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>Connessione Rotore fallita</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>Errore di impostazione della posizione</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>Errore della posizione</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>Importa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>Intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>Importa tutti o solo i QSO del periodo specificato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>Tutti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>Opzioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>Il valore viene utilizzato quando una registrazione inserita non contiene il valore ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>Valori di Defaults</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>Mio Profilo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>Mia Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation>Se il DXCC manca nel record importato, verrà determinato dal nominativo.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation>Compilare le informazioni mancanti dell’entità DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>Seleziona File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>I valori seguenti verranno utilizzati quando una registrazione inserita non contiene i valori ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;Importazione:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>QSO duplicato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;Vuoi importare QSO duplicati?&lt;/p&gt;%1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>Salva sul file</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>Riepilogo dell&apos;importazione QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>Data di importazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>File importato</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>Importato: %n contatto</numerusform>\n            <numerusform>Importati: %n contatti</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>Allarme: %n</numerusform>\n            <numerusform>Allarmi: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>Errore: %n</numerusform>\n            <numerusform>Errori: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>Dettagli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>Risultato importazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>Salva dettagli...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translation>finestra di dialogo per l&apos;immissione della password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>La password verrà archiviata nell&apos;archivio credenziali.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>Ricorda la password</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>Utente sconosciuto</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>password non corretta</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>Messaggi della Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>Messaggi preziosi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>Cancella Callsign e il messaggio di chat selezionati.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>Invia messaggio della chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>Visibilità della colonna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quali colonne devono essere visualizzate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>Prepara QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>Trasferisci le informazioni sul nominativo e sulla griglia nella finestra di dialogo Nuovo QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>Mostra solo informazioni su di me</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>Mostra solo i messaggi in cui è presente il mio nominativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>Sopprimi utente per utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>Sopprimi i messaggi privati ​​tra due nominativi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>Evidenzia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>Evidenzia i messaggi in base all&apos;impostazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>Evidenzia regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation>Direzione TX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>Cancella Messaggi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>Cancella tutti i messaggi nella finestra</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>Tu</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>Modifica Regola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>Nome della Regola</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>Chat Room</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>Abilitato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>Evidenzia il messaggio che corrisponde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>Tutte le seguenti condizioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>Una qualsiasi delle seguenti condizioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>Aggiungi condizione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>Tutti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation>Mittente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>Inizia con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>Non deve essere vuoto</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>Evidenzia regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>Regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>Nome</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>Stato</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation>Estrarre dati e impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation>Attenzione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Il database corrente sarà ELIMINATO!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Tutte le password memorizzate saranno ELIMINATE!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;L&apos;applicazione verrà riavviata dopo il caricamento&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;Per preservare i dati, utilizzare prima Pack Data &amp;amp; Settings o Export QSOs.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation>Seleziona database</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation>File:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation>Stato: Nessun file selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation>Decrittare credenziali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation>Inserire la password per decrittare le credenziali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation>Password:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation>Caricare e riavviare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation>password non corretta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation>Seleziona file di database</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation>Esportazione database QLog (*.dbe);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation>Impossibile creare il file temporaneo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation>Decompressione del database…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation>Impossibile decomprimere il file del database</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation>Impossibile aprire il database</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation>Database valida</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation>Piattaforma diversa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation>Password richiesta per importare le credenziali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation>Nessuna credenziale crittografata nel database</translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>Impossibile trovare le informazioni sulla mia entità DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>Un minimo set di campi non presenti (start_time, call, band, mode, station_callsign)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>Otre il range di Data selezionata</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>Duplicato</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>Le informazioni DXCC mancano</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>Nominativo di Stazione assente</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>Impossibile inserire nel Database</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>Importato</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>Stato DXCC:</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>Errore</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>Attenzione</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translation>QSO N°</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>Inizio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>Fine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>Submodo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>Nome (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>Nazione (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQZone</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>Prefisso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>Stato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>Contea</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>Data QSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>Data QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>Data LoTWr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>Data LoTWs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>TX PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>Campi aggiuntivi</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>Indirizzo (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>Indirizzo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>Età</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>Altitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>A-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>Antenna Azim</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>Antenna Elev</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>Percorso del segnale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>Sezione ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation>Award inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation>Award concesso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>Banda RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>Griglia Estesa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation>Controllo Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>Categoria</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>Data di caricamento su Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>Stato caricamento ClubLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>Commento (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>Operatore Contattato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>Identificativo Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>Nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>Contea Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation>Credito inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation>Credito concesso</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>Data DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>Data DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation>DCLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation>DCLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>Distanza</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>Email</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>Callsign del Titolare</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation>eQSL AG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>Data eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>Data eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSLr</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation>Numero FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>Inizio EME</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>Frequenza RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>Operatore ospite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>Data di caricamento HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>Stato di caricamento HamlogEU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>Data di caricamento HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>Stato di caricamento HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>Data di caricamento di HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>Stato di caricamento di HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>IOTA Island ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>K-Index</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>Latitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>Longitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation>Max Bursts</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation>Nome della doccia MeteorScatter</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>Mia Altitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>Mia Antenna (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>Mia Antenna</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>Mia Città (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>Mia Città</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>Mia contea</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>Mia contea Alt</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>Mia nazione (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>Mia nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>Mia CQ Zone</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>Mio DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>Mio DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>Mio FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>Mia Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>Mia Griglia Estesa</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>Mio IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>Mio IOTA Island ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>Mio ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>Mia Latitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>Mia Longitudine</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>Mio Nome (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>Mio nome</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>Mio Codice Postale (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>Mio Codice Postale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>Mia Ref POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>Mia Radio (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>Mia Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation>Mie attività di interesse specialel (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mie attività di interesse speciale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation>informazioni sulle mie attività di interesse speciale (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation>Informazioni sulle mie attività di interesse speciale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>Mio SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>Mio Stato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>Mia strada</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation>Mio USA-CA Counties</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mia Griglia VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation>Nome</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>Note (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>Data di scaricamento QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>Stato del download di QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation>QSLs Messaggio (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation>QSLr Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation>Potenza ricevuta</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>Numero Ricevuto</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>Scambio Ricevuto</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation>Numero Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation>Scambio Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>Note</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation>#MS Bursts</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation>#MS Pings</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation>Precedenza del Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo di Propagazione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>Chiave di crittografia pubblica</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>Data di caricamento QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>Stato caricamento QRZ</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>Messaggio della QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation>Info sul Tasto CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation>Tipo di Tasto CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation>Mie Info sul Tasto CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation>Mio Tipo di Tasto CW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>Call dell&apos;operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSLr Vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSLs Vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>QSO Completato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation>QSO occasionale</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>Regione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation>Radio (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>Nome del satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation>Flusso solare</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation>SIG (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation>SIG Info (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation>Silent Key</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>Miembro SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicativo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Ten-Ten Number</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>Miembro UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation>USA-CA Counties</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation>VE Prov</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation>Mia Sezione ARRL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>Mio WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST Ricevuto</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL Ricevuta</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL inviata</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>Elimina</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>Logbook - Elimina QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>Aggiornamento dal Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>Logbook - Modifica valore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translation>Invia DX Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>Logbook - Invia DX Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>Carica su Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>Ricerca sul Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>Aggiungere le informazioni mancanti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation>Contrassegna QSL come ricevuta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation>Contrassegnare QSL richiesta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>Filtro Callsign</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>Modifica Valore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation>Visibilità della colonna </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quali colonne devono essere visualizzate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>Esporta selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>Esporta QSO selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>Eliminare i contatti selezionati?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation>L&apos;&lt;b&gt;Invio immediato&lt;/b&gt; di Clublog supporta solo l&apos;eliminazione uno per uno&lt;br&gt;&lt;br&gt;Vuoi continuare nonostante il fatto&lt;br&gt;che l&apos;operazione DELETE non verrà inviata a Clublog?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>Elimina QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>Aggiornare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>L&apos;aggiornamento avrà effetto su tutte le righe selezionate.&lt;br&gt;Il valore attualmente modificato nella colonna verrà applicato a tutte le righe selezionate.&lt;br&gt;&lt;br&gt;Vuoi modificarle?</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translation>\n            <numerusform>Conteggio: %n</numerusform>\n            <numerusform>Conteggio: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Download immagine da eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>Elimina</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>Tutte le Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>Tutte le modalità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>Tutti i paesi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>Nessun filtro utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>Avviso QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>Ogni lotto supporta fino a 100 QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>Aggiornamento QSO Progressi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>Accesso al Logbook non riuscito</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>Errore del Callbook: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>Tutti i club</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Download immagine da eQSL fallito: </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>Impossibile aprire il file temporaneo</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation>Nome utente o password errati</translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>Upload cancellato dall&apos;utente</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>Upload rifiutato da LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>Risposta inaspettata dal server TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>Errore di TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>Errore di TQSLlib</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>Impossibile aprire il file di input</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>Impossibile aprire il file di output</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>Tutti i QSO erano duplicati o non rientravano nell&apos;intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>Alcuni QSO erano duplicati o non rientravano nell&apos;intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>Errore di Sintassi</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>Errore di connessione LoTW (nessuna rete o LoTW non è raggiungibile)</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>Errore inaspettato da TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>TQSL non trovato</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL si è bloccato</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>&amp;File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>&amp;Logbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>&amp;Apparati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>&amp;Aiuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>&amp;Finestra</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation>&amp;Servizi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>Barra degli strumenti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>Orologio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>Mappa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation>DX Cluster</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>Rotore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation>Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>Mappa Online</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation>Console CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>Foto su QRZ.com/HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>Avvisi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>&amp;Impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>&amp;Importa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>&amp;Esporta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>Connetti &amp;Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>&amp;A proposito di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>Caricamento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>Servizio – Carica QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>Scarica le QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>Servizion - Scarica le QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>Esci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>Chiudi applicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>Nuovo QSO - Pulisci</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>Nuovo QSO - Salva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>S&amp;tatistiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>Connetti R&amp;otore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>&amp;Filtri QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation>&amp;Diplomi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>Modifica Regole</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>Mostra Avvisi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation>Beep</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>Controllo Duplicati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>Sequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>Collega scambio con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation>Impacchettare dati e impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation>Estrarre dati e impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation>&amp;Galleria QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation>Strumenti dev</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation>Eseguire query SQL personalizzate in sola lettura sul database del logbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation>&amp;Stampa etichette QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation>&amp;Elenco di invio DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation>Generare un elenco di contatti da presentare per il credito del premio ARRL DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>Connetti &amp;CW Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>&amp;segnala un errore...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>&amp;Inserimento Manuale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>Passa alla modalità di inserimento manuale nella finestra di dialogo Nuovo contatto&lt;br/&gt;(ora, frequenza, profili ecc. non vengono presi dalle loro fonti comuni)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation>Mailing List...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>Salva disposizione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>Mantieni opzioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>Ripristina le opzioni di connessione dopo il riavvio dell&apos;applicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>Logbook - Cerca Callsign</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>Nuovo QSO: aggiungi testo dal campo del nominativo alla Bandmap</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>Radio - Banda Giù</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>Radio - Banda Su</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>Nuovo QSO: usa il nominativo del Whisperer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>Console CW: aumenta velocità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>Console CW: diminuisci velocità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>Console CW: carica profilo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>Console CW: scarica profilo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>Radio - PTT On/Off</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>Tutte le Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>Ogni Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>Ogni Banda &amp;&amp; Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>Nessun Controllo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>Singolo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>Per Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>Stop</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>Reset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>Nessuno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation>Tema: Native</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation>Tema: QLog Light</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation>Tema: QLog Dark</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation>Novità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation>Esporta Cabrillo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation>Tema colore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>Non abilitato per stili diversi da Fusion</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>Premi per sintonizzare l&apos;allarme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Errore di caricamento immediato di Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Dettagli errore:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>op: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>Una nuova versione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>Una nuova versione %1 è disponibile.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>Ricordamelo più tardi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>Download</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation>Impossibile cifrare le credenziali.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation>File di database (*.dbe);;Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation>Impossibile creare il file temporaneo.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation>Impossibile esportare il database.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation>Compressione del database…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation>Database esportato con successo in\n%1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation>Impossibile comprimere il database.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation>Impossibile preparare il database per l’importazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>Classico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>Vuoi rimuovere il Contest filter %1?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>Contest: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Basato su Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icona di &lt;a href=&apos; http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Immagini satellitari di &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect di &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;Database TimeZone di &lt;a href=&apos;https://github.com/evansiroky/timezone -boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>A proposito di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation>Gray-line</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation>Direzione TX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation>Aurora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation>MUF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation>IBP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>Direzioni</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DUPE !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>Salva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>Cerca il call sul web. L&apos;URL della query può essere modificato in Impostazioni -&gt; Rubrica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation>Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>Inizio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>Reset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>Data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>Durata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Dettagli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>Stato invio QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sì&lt;/b&gt; - è stata inviata una QSL in uscita; il QSO è stato caricato e accettato dal servizio online&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - non inviare una cartolina QSL in uscita; non caricare il QSO sul servizio online&lt;br/&gt;&lt;b&gt;Richiesto&lt;/b&gt; - la stazione contattata ha richiesto una QSL; la stazione contattata ha richiesto il caricamento del QSO sul servizio online&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - è stata selezionata una QSL in uscita da inviare; è stato selezionato un QSO da caricare sul servizio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>Invia QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo di Propagazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Statistiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC Statistics&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Station Statistics&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>M&amp;ia Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>Antenna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>Le mie N&amp;ote</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>Membro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>Espandi/Comprimi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>Richiesto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>In coda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>Ignorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>Diretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>Elettronica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>Accesso al Logbook non riuscito</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>Nuova Entità!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>Nuova Banda!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>Nuovo Modo!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>Nuova Banda e Modo!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>Nuovo Slot!</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GE</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>Ricerca sul Callbook inattiva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>Ricerca sul Callbook attiva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>L&apos;ID del contest deve essere compilato per attivare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>due o quattro localizzatori di griglia Maidenhead adiacenti, ciascuno lungo quattro caratteri, (es. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>il DARC DOK (District Location Code) della stazione contattata (ex. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation>World Wide Flora &amp; Fauna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation>Gruppo di Attività Speciali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation>Informazioni sul gruppo di attività speciali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation>Non è il nome del Contest ma è un ID del Contest assegnato (ad esempio CQ-WW-CW per CQ WW DX Contest (CW)) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>Descrizione dell&apos;attrezzatura della stazione contattata</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>Radio 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>Radio 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>Stato della Radio cambiato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio non connessa</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>Radio 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>Radio 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>Radio 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>Radio 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>Stato della Radio cambiato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio non connessa</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation>Rot 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>Impossibile associare una porta</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>Impossibile ottenere l&apos;indirizzo IP per</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>Nessun indirizzo IPv4 per</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation>Si è verificato un errore</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>Timeout operazione</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>Gestisci QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>QSLs Disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>Copia il file di input dalla cartella di origine alla cartella QLog Internal QSL Storage.&lt;br/&gt;Il file originale rimane invariato nella cartella di origine</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>Importa QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>Aggiungi File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>Cancellare QSL?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>Apri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation>Preferito</translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation>Impostazioni specifiche della piattaforma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation>Il database è stato esportato da una piattaforma diversa.\nVerificate o aggiornate le seguenti impostazioni.\nÈ possibile lasciare i campi vuoti e configurarli successivamente nelle Impostazioni.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation>Impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation>Valore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation>Continua</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation>Seleziona File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation>Tutti i file (*)</translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>Foto su QRZ.com/HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>QLog Help</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>QLog Crítico</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>Impossibile salvare una password per %1 nell&apos;archivio credenziali</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>Impossibile ottenere una password per %1 dall&apos;archivio credenziali</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>Avviso QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>50 / 5.000\nAggiornamento elenco club non riuscito. Impossibile rimuovere i vecchi record</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>Aggiornamento elenco club non riuscito. Impossibile pianificare nuovi download</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>Download imprevisto della Club-List. Annullamento dei download successivi</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>Contenuti imprevisti della Club-List per</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>Errore di rete. Impossibile scaricare l&apos;elenco dei club per</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>QLog è già in esecuzione</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation>Impossibile elaborare l’importazione in sospeso del database.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation>Il database è stato importato con successo, ma le password memorizzate non sono state ripristinate (decrittazione fallita o dati corrotti). Tutte le password dei servizi sono state cancellate e devono essere reinserite nelle Impostazioni.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>Impossibile collegare il Database.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>Impossibile esportare un database QLog in ADIF come backup.&lt;p&gt;Prova a esportare manualmente il tuo Log in ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>Errore nella Migrazione del database.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>QLog Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>Il Nome dell&apos;Attività esiste già.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>Il nome della regola esiste già.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>L&apos;espressione regolare dell&apos;indicativo non è corretta.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>L&apos;espressione regolare del commento non è corretta.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>Impossibile aggiornare le Regole di allarme</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>Errore nel nome del server DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>L&apos;indirizzo del server DXC deve essere nel formato&lt;p&gt;&lt;b&gt;[nomeutente@]nomehost:porta&lt;/b&gt; (es. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX Cluster Password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>Password non corretta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>Errore di connessione al server DXC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>Filename vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>Impossibile scrivere nel file</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>Informazioni QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>Esportati.</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>Esportato %n contatto.</numerusform>\n            <numerusform>Esportati %n contatti.</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>Errore Chat: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>Il nome del filtro esiste già.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Errore della Radio:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Errore del rotore:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;Errore Keyer CW:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>I campi &lt;b&gt;%0&lt;/b&gt; non verranno salvati perché &lt;b&gt;%1&lt;/b&gt; non è compilato.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>Il tuo nominativo è vuoto. Per favore, imposta il Profilo della tua Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>Per favore, definisci almeno un profilo di posizioni della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>WSJTX Multicast è abilitato ma l&apos;indirizzo non è un indirizzo multicast.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation>Rilevato loop. L’inoltro UDP grezzo utilizza la stessa porta del porto di ricezione WSJT-X.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>La porta della Radio deve essere una porta COM valida.&lt;br&gt;Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>La porta PTT della Radio deve essere una porta COM valida.&lt;br&gt;Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso al dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;Intervallo TX&lt;/b&gt;: la frequenza massima non deve essere 0.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;Intervallo TX&lt;/b&gt;: la frequenza massima non deve essere inferiore alla frequenza minima.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>La porta del rotore deve essere una porta COM valida.&lt;br&gt;Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>La porta del keyer CW deve essere una porta COM valida.&lt;br&gt;Per Windows utilizzare COMxx, per sistemi operativi di tipo Unix utilizzare un percorso per il dispositivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Impossibile modificare il modello CW Keyer in &lt;b&gt;Morse su CAT&lt;/b&gt;&lt;br&gt;Nessun supporto Morse su CAT per a Radio &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>Impossibile eliminare il profilo CW Keyer&lt;br&gt;Il profilo CW Keyer è utilizzato da Radio: &lt;b&gt;%1&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>L&apos;indicativo ha un formato non valido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>Il Call dell&apos;Operatore ha un formato non valido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translation>La Griglia ha un formato non valido</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>Le griglie VUCC hanno un formato non valido (devono essere 2 o 4 Gridsquare separati da &apos;,&apos;)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>Nazione non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>La CQ Zone non deve essere vuota</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>ITU non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>Impossibile aggiornare le Condizioni del Filtro QSO</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>km</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>miglia</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>Connessione rifiutata</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>Host ha chiuso la connessione</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>Host non trovato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>Timeout</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>Errore di rete</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>Errore Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation>Importazione database</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>Apertura Database</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>Backup del database</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>Migrazione del database</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>Avvio applicazione</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>Mia Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>Indicativo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>Mia Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>Nome dell&apos;operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>Call dell&apos;Operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>Mia Città</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>Mia nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>Mia Contea</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>Mio IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>Mio SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>Mie attività di interesse speciale</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>Informazioni sulle mie attività di interesse speciale</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>Mia Griglia VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>Mio WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>Mio Ref POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>Mio DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>Mio ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>Mia CQ Zone</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>Mio DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>Impossibile connettersi al server DXC &lt;p&gt;Motivo &lt;b&gt;: </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;Importato&lt;/b&gt;: %n contatto</numerusform>\n            <numerusform>&lt;b&gt;Importati&lt;/b&gt;: %n contatti</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Allarme&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Allarmi&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;Errore&lt;/b&gt;: %n</numerusform>\n            <numerusform>&lt;b&gt;Errori&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation>Database QLog non valida</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation>La versione del database è troppo recente (richiede una versione più recente di QLog)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation>Il database non è un file di esportazione QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation>TQSL Path</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation>(Percorso interno Flatpak)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation>Rotore</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation>Chiavistello CW</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation>TOTALE Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation>TOTALE Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>Errore generico</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation>Galleria delle schede QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation>Cerca per nominativo…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation>Ordina per:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation>Esporta filtrati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation>Data (più recente)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation>Data (più vecchia)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation>Nominativo (A-Z)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation>Nominativo (Z-A)</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation>\n            <numerusform>%n scheda(e) QSL</numerusform>\n            <numerusform>%n scheda(e) QSL</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation>Tutte le schede QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation>Preferiti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation>Per paese</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation>Per data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation>Per banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation>Per modalità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation>Per continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation>Rimuovi dai preferiti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation>Aggiungi ai preferiti</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation>Apri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation>Salva…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation>Salva scheda QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation>Esporta schede QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation>Esportate %1 di %2 schede</translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>Riepilogo importazione QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>Sommario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>Scaricato:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>Aggiornato:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>Senza corrispondenza:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>Errori:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>Dettagli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>Nuove QSLs: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>QSO aggiornati: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translation>QSL senza corrispondenza: </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation>Stampa etichette QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation>Filtra</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation>Intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation>Mio Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation>Profilo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation>QSL inviata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation>Filtro Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation>Modello etichetta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation>Dimensione pagina:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation>Colonna:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation>Riga:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation>Larghezza etichetta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation>Altezza etichetta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation>Margine sinistro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation>Margine superiore:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation>Spaziatura orizzontale:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation>Spaziatura verticale:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation>Aspetto etichetta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation>Stampa bordi etichette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation>QSO per etichetta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation>Testo piè di pagina sinistro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation>Testo piè di pagina destro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation>Salta etichetta:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation>Carattere sans-serif:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation>Carattere monospaziato:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation>Dimensione del nominativo:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation>Dimensione «To Radio»:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation>Testo «To Radio»:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation>Dimensione intestazione:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation>Dimensione dati:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation>Testo intestazione data:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation>Formato data:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation>Testo intestazione ora:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation>Testo intestazione banda:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation>Testo intestazione modalità:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation>Testo intestazione QSL:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation>Colonna aggiuntiva:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation>Testo della colonna aggiuntiva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation>(nome colonna DB)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation>Nessun QSO corrispondente trovato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation>Pagina 0 di 0</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation>Etichette: 0 (0 pagine)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation>Stampa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation>Esporta come PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation>Personalizzato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation>Vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation>QSO che corrispondono a questo profilo di stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation>Etichette: %1 (%2 pagine)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation>Pagina %1 di %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation>Esporta PDF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation>File PDF (*.pdf)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation>Contrassegna come inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation>Contrassegnare i QSO stampati/esportati come inviati?</translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RSTs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RSTr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>Inizio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>Fine</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>Nome</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>Le mie note</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>&amp;Dettagli</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>Nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>Cont</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation>CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>Stato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>Contea</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>Età</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation>AF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation>AN</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation>AS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation>EU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation>NA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation>OC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>due o quattro Gridsquare adiacenti, ciascuno lungo quattro caratteri, (es. EN98,FM08,EM97,FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>il DARC DOK (District Location Code) della stazione contattata (es. A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation>E-Mail</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo di Propagazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>Nome del Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>Modo del Satellite</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>M&amp;ia Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>Nome dell&apos;operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>Call dell&apos;Operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>Antenna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>Potenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation>QSLr Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>Contest ID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X Statistiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC Statistics&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;Station Statistics&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation>&amp;QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>Inviata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>Gestisci la cartolina QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>QSL inviata vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sì&lt;/b&gt; - è stata inviata una QSL in uscita; il QSO è stato caricato e accettato dal servizio online&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - non inviare una cartolina QSL in uscita; non caricare il QSO sul servizio online&lt;br/&gt;&lt;b&gt;Richiesto&lt;/b&gt; - la stazione contattata ha richiesto una QSL; la stazione contattata ha richiesto il caricamento del QSO sul servizio online&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - è stata selezionata una QSL in uscita da inviare; è stato selezionato un QSO da caricare sul servizio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>Mostra QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;Sì&lt;/b&gt; - è stata ricevuta una QSL in arrivo; il QSO è stato confermato dal servizio online&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - non è stata ricevuta una QSL in arrivo; il QSO non è stato confermato dal servizio online&lt;br/&gt;&lt;b&gt;Richiesto&lt;/b&gt; - la stazione logging ha richiesto una QSL; la stazione logging ha richiesto che il QSO venga caricato sul servizio online&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>Ricevuta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation>QSL vía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation>&amp;Contest</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>Numero Ricevuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>Scambio Ricevuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>Numero Inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>Scambio inviato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>Membro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>&amp;Reset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>&amp;Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>Sí</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>Richiesto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>In coda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>Ignorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>Bureau</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>Diretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>Elettronica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>Inviare le modifiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>Inviare davvero tutte le modifiche?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>Errore di QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>Impossibile salvare tutte le modifiche: errore interno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>Impossibile salvare tutte le modifiche: provare a ripristinare tutte le modifiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>Dettagli del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>Modifica QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>Download immagine da eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>Download immagine da eQSL fallito: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>Il nominativo DX non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>l&apos;indicativo DX ha un formato non corretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>La frequenza o la banda TX devono essere compilate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>La Banda TX dovrebbe essere </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>La Banda RX dovrebbe essere </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>La Griglia DX ha un formato non corretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation>In base al nominativo, il Paese DXCC è diverso dal valore inserito come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation>In base al nominativo, il continente DXCC è diverso dal valore inserito come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation>In base al nominativo, DXCC ITU è diverso dal valore inserito come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation>In base al nominativo, DXCC CQZ è diverso dal valore inserito come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>VUCC ha un formato non corretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation>In base alle frequenze, la modalità satellitare dovrebbe essere </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>Il nome del Satellite non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>Il proprio nominativo non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>Il proprio indicativo ha un formato non corretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>La propria Griglia VUCC ha un formato non corretto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation>In base al proprio nominativo, il proprio DXCC ITU è diverso dal valore inserito previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation>In base al proprio nominativo, il proprio DXCC CQZ è diverso dal valore inserito previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation>In base al proprio nominativo, il proprio Paese DXCC è diverso dal valore inserito previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Secondo il SOTA Summit, QTH non corrisponde al nome del SOTA Summit come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation>Secondo il SOTA Summit, la Griglia non corrisponde alla Griglia SOTA, come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation>Secondo i record POTA, il QTH non corrisponde al nome POTA come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation>Secondo i record POTA, la griglia non corrisponde alla griglia POTA come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation>Secondo il SOTA Summit, il mio QTH non corrisponde al nome SOTA Summit come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation>Secondo il SOTA Summit, la mia griglia non corrisponde alla griglia SOTA, come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation>Secondo i record POTA, il mio QTH non corrisponde al nome POTA come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation>Secondo i record POTA, la mia griglia non corrisponde alla griglia POTA, come previsto </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Lo stato di invio LoTW di &lt;b&gt;No&lt;/b&gt; non ha alcun senso se è impostata la data di invio della QSL. Imposta la data su 1.1.1900 per lasciare vuoto il campo della data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La data deve essere presente per lo stato inviato LoTW &lt;b&gt;Sì&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Lo stato di invio eQSL &lt;b&gt;No&lt;/b&gt; non ha alcun senso se è impostata la data di invio QSL. Imposta la data su 1.1.1900 per lasciare vuoto il campo della data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La data deve essere presente per lo stato inviato eQSL &lt;b&gt;Sì&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>Lo stato di invio QSL Cartacea pari a &lt;b&gt;No&lt;/b&gt; non ha alcun senso se è impostata la data di invio QSL. Imposta la data su 1.1.1900 per lasciare vuoto il campo della data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>La data deve essere presente per lo stato di invio cartaceo &lt;b&gt;Sì&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>Errore del Callbook: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;Allarme: &lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>Validazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>I campi contrassegnati in giallo non sono validi.&lt;p&gt;Salvare comunque le modifiche?&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>&amp;Salva</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>&amp;Modifica</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>Dettaglio filtro QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>Nome del filtro:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>Trova il QSO che corrisponde</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>Tutte le seguenti condizioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>Una qualsiasi delle seguenti condizioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>Aggiungi condizione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>Uguale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>Non uguale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>Non Contiene</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>Maggiore di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>Minore di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>Inizia con</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>Non deve essere vuoto</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>Filtri QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>Filtri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>Rimuovi</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>Nessun Profilo Radio selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation>Errore Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>Errore Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>Impossibile aprire Radio</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation>Disconnesso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation>Disattiva split</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation>Impostazioni avanzate Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation>Percorso Rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Lasciare vuoto per il rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation>Rileva automaticamente il percorso di Rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation>Rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation>Versione Rigctld:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation>Argomenti aggiuntivi:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation>es. -v -v per registrazione dettagliata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation>Non può essere modificato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation>Rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation>rigctld non è stato trovato su questo sistema.\nInstallare Hamlib o specificare manualmente il percorso.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation>Eseguibile (*.exe);;Tutti i file (*.*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation>Tutti i file (*)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation>Seleziona eseguibile rigctld</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation>Non trovato</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation>Eseguibile rigctld non trovato in /app/bin/. Questo non dovrebbe accadere nella build Flatpak.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation>Eseguibile rigctld non trovato. Installare Hamlib o specificare il percorso nelle impostazioni avanzate.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation>Incompatibilità della versione principale di Hamlib: QLog è stato compilato con Hamlib %1, ma rigctld riporta la versione %2.%3.%4. Gli ID dei modelli dei trasmettitori non sono compatibili tra le versioni principali.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation>La porta %1 è già in uso. Un altro rigctld o applicazione potrebbe essere in esecuzione su questa porta.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation>rigctld è stato avviato ma non risponde sulla porta %1.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation>Impossibile avviare rigctld: %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation>rigctld è crashato.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation>rigctld ha superato il tempo limite.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation>Errore di scrittura con rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation>Errore di lettura con rigctld.</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation>Errore rigctld sconosciuto.</translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>Nessun Profilo Rotore selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>Errore di inizializzazione</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>Errore Interno</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>Impossibile aprire Rotore</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation>Az:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation>Vai a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation>Profilo pulsante precedente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation>Profilo pulsante successivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation>QSO LP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation>QSO Long Path</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation>QSO SP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation>QSO Short Path</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>Impostazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>Stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> Profili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>World Wide Flora &amp; Fauna (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>Stazione Gridsquare (Parametro obbligatorio)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>Nome dell&apos;operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>SIG Information (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>Nome del profilo utilizzato come alias per Callsign, Gridsquare, Nome operatore e QTH (parametro obbligatorio) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>Elenco di tutti i profili delle stazioni disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>Nome del Profilo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>SIG (Opzionale).</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>Griglie VUCC (parametro opzionale). Es. EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation>SIG Info</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>Aggiungi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>Eliminare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>Nome del QTH (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>Nome dell&apos;Operatore (Opzionale)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>Indicativo (Obligatorio)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>CQZone</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>Call dell&apos;Operatore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>Nazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>Call della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>Call dell&apos;operatore (Parametro Opzionale, se differente dal Call della stazione)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>Contea</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation>Posizione della Contea della Stazione (parametro facoltativo)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>Apparato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>Antenne</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>Profili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>Descrizione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation>Larghezza del fascio azimutale </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation>Azimuth Offset</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>Il valore dell&apos;intervallo valido è 0° - 100° (0° non specificato)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>Non definito</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>Elenco di tutte le antenne disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>CW Keyers</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>Profili Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>Elenco di tutti i manipolatori CW disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>Modello</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>Keyer Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>Inverti le palette</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation>Frequenza del sidetone:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>Velocità di Default</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation>Porta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Utilizzare COMxx per Window o il percorso della porta COM in sistemi operativi simili a Unix</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>Baudrate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation>Nome Host</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib non supporta la modifica della porta di destinazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>Profili Scorciatoie CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>Elenco di tutti i profili di Shortcuts CW disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>Breve descrizione del Pulsante (fino a 7 caratteri)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>Elenco di tutte le Radio disponibili</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>Interfaccia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>Frequenze minime e massime TX. Intervalli specifici derivano dalla banda consentita nell&apos;impostazione.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>TX Range</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>Offsets</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>Immettere manualmente RIT o l&apos;offset del transverter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>Immettere manualmente XIT o l&apos;offset del transverter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation>TX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>Default PWR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>Inserisci PWR predefinita (es. quando la Radio è disconnessa)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>CW Keyer assegnato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>Caratteristiche della Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation>VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>Frequenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation>Cancella QSY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>Potenza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>Stato del PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation>TX Offset (XIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation>RX Offset (RIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>Velocità CW Keyer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>Sincronizza velocità CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation>Avviare il demone rigctld per condividere il trasmettitore con altre applicazioni (es. WSJT-X)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation>Condividi trasmettitore tramite porta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation>Avanzate…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation>Polling</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>Tipo di porta</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>Bits di dati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation>Controllo di flusso</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation>Parità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation>Bits di stop</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translation>Tipo PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translation>Porta PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>DX Spots alla radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation>CIV Addr</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation>Automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation>RTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation>DTR</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>Rotori</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>Seriale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>Rete</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>Profili dei Tasti Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>Pulsante 1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>Pulsante 2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>Pulsante 3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>Pulsante 4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation>Callbook</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>Ordine delle interrogazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>Primario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>Secondario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>Nome utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>Password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Pulsante di ricerca Web</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>Specificare l&apos;URL da utilizzare per la ricerca rapida. La macro &lt;DXCALL&gt; verrà sostituita dal nominativo corrente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>Prova l&apos;URL con il tuo nominativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation>Test</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation>Clubs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>Elenchi attivi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation>Sincronizza &amp;&amp; QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>I QSO vengono caricati immediatamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation>Zona pericolosa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation>&lt;b&gt;⚠ Questa è una zona pericolosa. Procedere con cautela, poiché le azioni eseguite non possono essere annullate e possono avere un impatto significativo sul tuo log.&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation>Elimina tutti i QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation>Elimina tutte le password dall’archivio sicuro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>Carica immediatamente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>Non è una password. È il codice di upload ricevuto via email dopo la registrazione a HRDLOG..net</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translation>Carica codice</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>Se è abilitato e la Radio è connessa, QLog invia periodicamente messaggi On-Air a HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>Invia On-Air</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>TQSL Path</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>Cerca</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation>Rileva automaticamente il percorso di TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation>Rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation>Versione di TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>In uso un&apos;istanza TQSL interna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>Altri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>Confermato da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation>Chat</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;Avviso di sicurezza:&lt;/b&gt; QLog memorizza tutte le password nell&apos;archivio sicuro. Sfortunatamente, ON4KST utilizza un protocollo in cui questa password viene inviata su un canale non protetto come testo normale.&lt;/p&gt;&lt;p&gt;Si prega di prestare attenzione quando si sceglie la password per questo servizio, poiché la password viene inviata su un canale non protetto in formato testo normale.&lt; /p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>Bande</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>Modi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>Il carattere &quot;&gt;&quot; è interpretato come un indicatore della posizione iniziale del cursore nella colonna Report.&lt;/br&gt;Es.: &quot;5&gt;9&quot; significa che il cursore sarà posizionato sul secondo carattere</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation>Colorare gli spot CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation>Abilitare/disabilitare l’invio di indicatori di stato codificati a colori verso WSJT-X per ogni nominativo che chiama CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>GUI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>Formato orario</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24 ore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation>AM/PM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation>Sistema di unità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation>Metrico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation>Imperiale</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>Formato data</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>Sistema</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>Personalizzato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Documentazione del formato orario&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;Avviso:&lt;/b&gt; Per accedere a informazioni dettagliate si raccomanda almeno un abbonamento QRZ XML. Senza un abbonamento, i dati ottenuti da QRZ sono limitati.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>Chiave API predefinita</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>Chiavi API specifiche per nominativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>Chiave API</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>Endpoint</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>Inoltro UDP non elaborato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Elenco di indirizzi IP a cui QLog inoltra i pacchetti UDP WSJT-X grezzi.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation>Porta </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>Porta dove QLog ascolta il traffico in entrata da WSJT-X</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>Unisciti a Multicast</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>Abilita/Disabilita opzione Multicast per WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>Indirizzo Multicast</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation>RX: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation>Lasciare vuoto per il rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>Specificare l&apos;indirizzo multicast. &lt;br&gt;Su alcuni sistemi Linux potrebbe essere necessario abilitare il multicast sull&apos;interfaccia di rete loopback.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation>TTL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>Time-To-Live determina l&apos;intervallo&lt;br&gt; entro il quale un pacchetto multicast viene propagato nella tua Intranet. </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>Notifiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;LogID assegnato al registro corrente.&lt;/p&gt;Il LogID viene inviato nei messaggi di notifica di rete come un&apos;istanza univoca identificata.&lt;p&gt; L&apos;ID viene generato automaticamente e non può essere modificato&lt;/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation>DX Spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP con DX Cluster Spots.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation>Allarmi Spot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP sugli Spot Alerts dell&apos;utente.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>Modifiche al QSO </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; Elenco degli indirizzi IP a cui QLog invia pacchetti di notifica UDP relativi a un QSO nuovo/aggiornato/eliminato nel log.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation>Wsjtx CQ Spots</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Elenco degli indirizzi IP a cui QLog invia pacchetti di notifiche UDP con WSJTX CQ Spots.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno la forma IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;Elenco di indirizzi IP a cui QLog invia pacchetti di notifica UDP quando cambia lo stato della Radio.&lt;/p&gt;Gli indirizzi IP sono separati da uno spazio e hanno il formato IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>Speciale - Omnirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation>Non può essere modificato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>Nome</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>Report</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>Stato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>Inizio (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>Fine (MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>SAT Mode</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>Disabilitato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation>Nessuno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation>Software</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation>Pari</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation>Dispari</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation>Segna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation>Spazio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation>Fittizio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>Morse Over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation>WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation>Single Paddle</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation>Definitivo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation>High</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation>Low</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation type=\"unfinished\">Premi &lt;b&gt;Modifica&lt;/b&gt; per confermare le modifiche al profilo o &lt;b&gt;Annulla&lt;/b&gt;.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>Modifica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>Non deve essere vuoto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>Seleziona File</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation>Rilevamento automatico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation>TQSL non è stato trovato su questo sistema.\nInstallare TQSL o specificare manualmente il percorso.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation>Non trovato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation>La condivisione del trasmettitore è disponibile solo per il driver Hamlib</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation>La condivisione del trasmettitore non è disponibile per connessioni di rete</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation>Elimina password</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation>Tutte le password sono state eliminate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation>Eliminazione di tutti i QSO...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation>Errore</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation>Impossibile eliminare tutti i QSO.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>Membri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>Connessione Internet richiesta durante l&apos;avvio dell&apos;applicazione</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>Descrizione</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>Scorciatoia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>Conflitto con una scorciatoia integrata</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>Conflitto con una scorciatoia definita dall&apos;utente</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>QSOs da Caricare</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>QSO Selezionato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>Caricamento</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>Ricerca</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>Statistiche</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>Mia Antenna</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>Mia Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation>Filtro Utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation>Confermato da</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSOs di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>Percentuali</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation>Top 10</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>Istogramma</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>Mostra sulla mappa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>Tipo di grafico</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>Mia Radio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>Mio Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>Intervallo di date</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>Cartaceo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>Anno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>Mese</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>Giorno della settimana</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>Modo di Propagazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>Confermato / Non Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>Nazioni</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>Grandi quadrati della griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>Distanza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation>QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>Griglia Confermata/Lavorata</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>Dom</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>Lun</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>Mar</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>Mer</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>Gio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>Ven</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>Sab</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>Non specificato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation>Confermato </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation>Non confermato </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation>Nessun filtro utente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>Oltre 50000 QSO. Visualizzarli?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation>Rendering dei QSO…</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>Tutti</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>Radio 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>Radio 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>Radio 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>Radio 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation>Si è verificato un errore</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>Stato della Radio cambiato</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>Radio non connessa</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>Vuoto</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation>Spotter</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>Messaggio</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>Carica QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>Filtri</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>Profilo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>Mio Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>Includi stato QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>In circostanze normali, questo stato significa &lt;b&gt;&quot;non inviare&quot;.&lt;br/&gt;Tuttavia, a volte potresti voler ignorare questa impostazione quando invii una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>No</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>In circostanze normali questo stato significa &lt;b&gt;&quot;Ignora/Non valido&quot;&lt;/b&gt;.&lt;br/&gt;Tuttavia, a volte potrebbe essere necessario ignorare questa impostazione quando si invia una QSL.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>Ignora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>Nessuno</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs Messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>Campo messaggio QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>QTH Profile</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>Questa opzione elimina tutti i QSO nel Clublog&lt;br&gt;e, in base al filtro, carica tutti i QSO indipendentemente dal loro stato.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>Cancella Clublog e ricarica i QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation>LoTW / TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation>Posizione stazione TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>Profilo della stazione</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translation>Ricarica tutto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>Mostra QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;Caricamento</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation>Non definito</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>Nascondi QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>Caricamento su %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>Cancella</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>Avviso QLog - %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>Impossibile aggiornare lo stato del QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>Impossibile caricare il/i QSO: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>Informazioni QLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>Nessun QSO trovato da caricare.</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>I QSOs sono stati caricati nei servizi selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>Carica su</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>I valori seguenti verranno utilizzati quando una registrazione inserita non contiene i valori ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>Qualsiasi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation>Il nominativo della posizione (%1) e la griglia (%2) non corrispondono ai filtri selezionati</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation>Il nominativo della posizione (%1) non corrisponde al nominativo selezionato (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation>La griglia della posizione (%1) non corrisponde alla griglia selezionata (%2)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>Sconosciuto</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>Distanza</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation>Azimuth</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>Commento</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation></translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>Ora</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation>Info</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>Filtri WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>Filtri Generici</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Stato del Log</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>Nuova Banda</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>Nuovo Modo</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>Nuova Entità</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>Nuovo Slot</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>Lavorato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>Confermato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>Continente</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>North America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>Europe</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>South America</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>Africa</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>Antarctica</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>Asia</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>Oceanía</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>Distanza superiore a</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR migliore di</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>Filtri Estesi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>Nessuna Club List è abilitata</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>Indicativo</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>Griglia</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>Distanza</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>Ultima Attività</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>Ultimo messaggio</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>Membro</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>Filtrato</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>Visibilità della colonna...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>Filtra...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>Quali colonne devono essere visualizzate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>Filtra Spots</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation>Esegui con lo spazio dei nomi specifico.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation>spazio dei nomi</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation>File di traduzione: percorso assoluto o relativo e nome file QM.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation>percorso/nome file QM</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation>Imposta la lingua. &lt;codice&gt; esempio: &apos;en&apos; o &apos;en_US&apos;. Ignora l&apos;impostazione dell&apos;ambiente.</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation>codice</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>Scrive messaggi di debug nel file di debug</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation>Elaborare l’importazione in sospeso del database (uso interno)</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation>Forza l’aggiornamento di tutte le liste di valori (DXCC, SAT, ecc.)</translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "i18n/qlog_zh_CN.ts",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!DOCTYPE TS>\n<TS version=\"2.1\" language=\"zh_CN\" sourcelanguage=\"en_US\">\n<context>\n    <name>ActivityEditor</name>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"14\"/>\n        <source>Activity Editor</source>\n        <translation>竞赛/活动 编辑器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"24\"/>\n        <source>Activity Name</source>\n        <translation>竞赛/活动 名称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"58\"/>\n        <source>Layout</source>\n        <translation>布局</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"75\"/>\n        <source>Window Arrangement:</source>\n        <translation>窗口排列:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"88\"/>\n        <source>Saved</source>\n        <translation>已保存</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"117\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"128\"/>\n        <source>Available Fields</source>\n        <translation>可用字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"146\"/>\n        <source>List of fields that can be used</source>\n        <translation>可用字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"198\"/>\n        <source>Row A</source>\n        <translation>行 A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"243\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"673\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"877\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1081\"/>\n        <source>Move selected fields from the Available Fields List to the Row A</source>\n        <translation>将选定的字段从“可用字段列表”移动到行A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"269\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"699\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"903\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1107\"/>\n        <source>Remove selected field from the Row A</source>\n        <translation>从行A中删除选定的字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"298\"/>\n        <source>List of fields in the first variable row</source>\n        <translation>第一可变行字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"344\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"554\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"774\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"978\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1182\"/>\n        <source>Change the order. Move selected field up</source>\n        <translation>改变顺序。上移所选字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"370\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"580\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"800\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1004\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1208\"/>\n        <source>Change the order. Move selected field down</source>\n        <translation>改变顺序。下移所选字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"402\"/>\n        <source>Row B</source>\n        <translation>行 B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"450\"/>\n        <source>Move selected fields from the Available Fields List to the Row B</source>\n        <translation>将选定的字段从“可用字段列表”移动到行B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"476\"/>\n        <source>Remove selected field from the Row B</source>\n        <translation>从行B中删除选定的字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"505\"/>\n        <source>List of fields in the second variable row</source>\n        <translation>第二可变行的字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"628\"/>\n        <source>Column A</source>\n        <translation>列 A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"728\"/>\n        <source>List of fields in the first QSO Detail Column</source>\n        <translation>第一列新通联详细列字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"832\"/>\n        <source>Column B</source>\n        <translation>列 B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"932\"/>\n        <source>List of fields in the second QSO Detail Column</source>\n        <translation>第二列新通联详细列字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1036\"/>\n        <source>Column C</source>\n        <translation>列 C</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1136\"/>\n        <source>List of fields in the third QSO Detail Column</source>\n        <translation>第三列新通联详细列字段列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1245\"/>\n        <source>New QSO Rows</source>\n        <translation>新通联行</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1250\"/>\n        <source>New QSO Detail Columns</source>\n        <translation>新通联详情列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1263\"/>\n        <source>Values</source>\n        <translation>配置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1269\"/>\n        <source>Profiles</source>\n        <translation>配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1275\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1296\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1317\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1360\"/>\n        <source>If unchecked, the profile does not change</source>\n        <translation>如果不勾选，配置文件不会更改</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1278\"/>\n        <source>Station</source>\n        <translation>电台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1299\"/>\n        <source>Antenna</source>\n        <translation>天线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1320\"/>\n        <source>Rig</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1345\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1388\"/>\n        <source>Connect automatically</source>\n        <translation>自动连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1348\"/>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1391\"/>\n        <source>Connect</source>\n        <translation>连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1363\"/>\n        <source>Rotator</source>\n        <translation>云台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.ui\" line=\"1406\"/>\n        <source>Fields</source>\n        <translation>字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"89\"/>\n        <source>Must not be empty</source>\n        <translation>不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.h\" line=\"116\"/>\n        <source>Unsaved</source>\n        <translation>未保存</translation>\n    </message>\n</context>\n<context>\n    <name>AlertRuleDetail</name>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"14\"/>\n        <source>Alert Rule Detail</source>\n        <translation>提醒规则详情</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"30\"/>\n        <source>Rule Name</source>\n        <translation>规则名称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"71\"/>\n        <source>Enabled</source>\n        <translation>启用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"83\"/>\n        <source>Sources</source>\n        <translation>源</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"92\"/>\n        <source>DX Cluster</source>\n        <translation>DX 集群</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"102\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"154\"/>\n        <source>DX</source>\n        <translation>DX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"180\"/>\n        <source>Worked</source>\n        <translation type=\"unfinished\">已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"187\"/>\n        <source>New Slot</source>\n        <translation type=\"unfinished\">新组合</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"194\"/>\n        <source>Confirmed</source>\n        <translation type=\"unfinished\">已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"201\"/>\n        <source>New Entity</source>\n        <translation type=\"unfinished\">新实体</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"208\"/>\n        <source>New Mode</source>\n        <translation type=\"unfinished\">新模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"215\"/>\n        <source>New Band</source>\n        <translation type=\"unfinished\">新波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"231\"/>\n        <source>DX Callsign</source>\n        <translation>DX 呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"238\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"408\"/>\n        <source>Use Perl-like regular expression</source>\n        <translation>使用 类Perl 正则表达式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"241\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"411\"/>\n        <source>.*</source>\n        <translation>.*</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"251\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"741\"/>\n        <source>Country</source>\n        <translation>国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"168\"/>\n        <source>Log Status</source>\n        <translation>日志状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"401\"/>\n        <source>Spot Comment</source>\n        <translation>报点备注</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"286\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"344\"/>\n        <source>CQZ</source>\n        <translation>CQ分区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"433\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"440\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"447\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"454\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"421\"/>\n        <source>Special Programs</source>\n        <translation>特别活动</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"471\"/>\n        <source>Modes</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"512\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"538\"/>\n        <source>Phone</source>\n        <translation>语音通话</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"551\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"525\"/>\n        <source>Digital</source>\n        <translation>数字模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"563\"/>\n        <source>Bands</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"603\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"760\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"652\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"814\"/>\n        <source>North America</source>\n        <translation>北美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"680\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"804\"/>\n        <source>Africa</source>\n        <translation>非洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"645\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"774\"/>\n        <source>Antarctica</source>\n        <translation>南极洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"638\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"834\"/>\n        <source>South America</source>\n        <translation>南美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"666\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"784\"/>\n        <source>Asia</source>\n        <translation>亚洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"673\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"794\"/>\n        <source>Europe</source>\n        <translation>欧洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"659\"/>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"824\"/>\n        <source>Oceania</source>\n        <translation>大洋洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"692\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"733\"/>\n        <source>Spotter</source>\n        <translation>报点者</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.ui\" line=\"222\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"54\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"63\"/>\n        <source>All</source>\n        <translation>全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"111\"/>\n        <source>Must not be empty</source>\n        <translation>不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"614\"/>\n        <source>No Club List is enabled</source>\n        <translation>未启用俱乐部列表</translation>\n    </message>\n</context>\n<context>\n    <name>AlertSettingDialog</name>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"14\"/>\n        <source>Alerts Rules</source>\n        <translation>提醒规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"92\"/>\n        <source>Add</source>\n        <translation>添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"99\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.ui\" line=\"106\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation>名称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>状态</translation>\n    </message>\n</context>\n<context>\n    <name>AlertTableModel</name>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"64\"/>\n        <source>Rule Name</source>\n        <translation>规则名</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"65\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"66\"/>\n        <source>Frequency</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"67\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"68\"/>\n        <source>Updated</source>\n        <translation>已更新</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"69\"/>\n        <source>Last Update</source>\n        <translation>最后更新</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"70\"/>\n        <source>Last Comment</source>\n        <translation>最后备注</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AlertTableModel.cpp\" line=\"71\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n</context>\n<context>\n    <name>AlertWidget</name>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"14\"/>\n        <source>Alerts</source>\n        <translation>提醒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"86\"/>\n        <source>Clear older than</source>\n        <translation>清除旧于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"96\"/>\n        <source>Never</source>\n        <translation>从不</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"99\"/>\n        <source> min(s)</source>\n        <translation> 分钟</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"124\"/>\n        <source>Edit Rules</source>\n        <translation>编辑规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"129\"/>\n        <source>Column Visibility...</source>\n        <translation>列可见性...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertWidget.ui\" line=\"134\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsDialog</name>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"14\"/>\n        <source>Awards</source>\n        <translation>奖项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"23\"/>\n        <source>Options</source>\n        <translation>选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"47\"/>\n        <source>Award</source>\n        <translation>奖项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"82\"/>\n        <source>My DXCC Entity</source>\n        <translation>我的 DXCC 实体</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"131\"/>\n        <source>User Filter</source>\n        <translation type=\"unfinished\">用户过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"179\"/>\n        <source>Confirmed by</source>\n        <translation>确认自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"188\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"198\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"208\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"220\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"229\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"239\"/>\n        <source>Phone</source>\n        <translation>语音通话</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"249\"/>\n        <source>Digi</source>\n        <translation>数字模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"270\"/>\n        <source>Not-Worked Only</source>\n        <translation>未通联</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"277\"/>\n        <source>Not-Confirmed Only</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.ui\" line=\"261\"/>\n        <source>Show</source>\n        <translation>显示</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"6\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardITU.cpp\" line=\"6\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"6\"/>\n        <source>WAC</source>\n        <translation>WAC</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAZ.cpp\" line=\"6\"/>\n        <source>WAZ</source>\n        <translation>WAZ</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAS.cpp\" line=\"6\"/>\n        <source>WAS</source>\n        <translation>WAS</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWPX.cpp\" line=\"6\"/>\n        <source>WPX</source>\n        <translation>WPX</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardIOTA.cpp\" line=\"6\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAHunter.cpp\" line=\"6\"/>\n        <source>POTA Hunter</source>\n        <translation>POTA猎人</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardPOTAActivator.cpp\" line=\"6\"/>\n        <source>POTA Activator</source>\n        <translation>POTA激活者</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSOTA.cpp\" line=\"6\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWWFF.cpp\" line=\"6\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"18\"/>\n        <source>Gridsquare 2-Chars</source>\n        <translation>网格坐标 2字符</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"19\"/>\n        <source>Gridsquare 4-Chars</source>\n        <translation>网格坐标 4字符</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"20\"/>\n        <source>Gridsquare 6-Chars</source>\n        <translation>网格坐标 6字符</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardGridsquare.cpp\" line=\"21\"/>\n        <source>Gridsquare %1-Chars</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUSCounty.cpp\" line=\"11\"/>\n        <source>US Counties</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardRDA.cpp\" line=\"11\"/>\n        <source>Russian Districts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardJapan.cpp\" line=\"11\"/>\n        <source>Japanese Cities/Ku/Guns</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardNZ.cpp\" line=\"11\"/>\n        <source>NZ Counties</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardSpanishDME.cpp\" line=\"11\"/>\n        <source>Spanish DMEs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardUKD.cpp\" line=\"11\"/>\n        <source>Ukrainian Districts</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AwardsDialog.cpp\" line=\"59\"/>\n        <source>No User Filter</source>\n        <translation type=\"unfinished\">无用户筛选器</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardDXCC.cpp\" line=\"19\"/>\n        <source>DELETED</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"29\"/>\n        <source>North America</source>\n        <translation>北美</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"30\"/>\n        <source>South America</source>\n        <translation>南美</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"31\"/>\n        <source>Europe</source>\n        <translation>欧洲</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"32\"/>\n        <source>Africa</source>\n        <translation>非洲</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"33\"/>\n        <source>Oceania</source>\n        <translation>大洋洲</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"34\"/>\n        <source>Asia</source>\n        <translation>亚洲</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/AwardWAC.cpp\" line=\"35\"/>\n        <source>Antarctica</source>\n        <translation>南极洲</translation>\n    </message>\n</context>\n<context>\n    <name>AwardsTableModel</name>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"31\"/>\n        <source>Slots: </source>\n        <translation>组合： </translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"51\"/>\n        <source>Confirmed</source>\n        <translation>已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"52\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../models/AwardsTableModel.cpp\" line=\"53\"/>\n        <source>Still Waiting</source>\n        <translation>等待中</translation>\n    </message>\n</context>\n<context>\n    <name>BandmapWidget</name>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"20\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"56\"/>\n        <source>Create an additional Bandmap Window</source>\n        <translation>创建额外的波段地图窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"83\"/>\n        <source>Clear older</source>\n        <translation>清除旧于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"118\"/>\n        <source>Clear All</source>\n        <translation>清除全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"216\"/>\n        <source>Clear the current band</source>\n        <translation>清除当前波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"102\"/>\n        <source>Never</source>\n        <translation>从不</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.ui\" line=\"105\"/>\n        <source> min(s)</source>\n        <translation> 分钟</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"619\"/>\n        <source>Bandmap</source>\n        <translation>波段地图</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"950\"/>\n        <source>Show Band</source>\n        <translation>显示波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"968\"/>\n        <source>Center RX</source>\n        <translation>居中 RX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"973\"/>\n        <source>Show Emergency Frequencies</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/BandmapWidget.cpp\" line=\"1092\"/>\n        <source>SOS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CWCatKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"36\"/>\n        <source>No Rig is connected</source>\n        <translation>尚未连接电台</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"46\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Rig does not support Morse over CAT</source>\n        <translation>电台不支持 Morse over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"120\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>无法发送文字至电台</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"106\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <source>Keyer is not connected</source>\n        <translation>电键未连接</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"113\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <source>Rig is not connected</source>\n        <translation>电台未连接</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"136\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"143\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>无法设置电键速度</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"161\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"168\"/>\n        <location filename=\"../cwkey/drivers/CWCatKey.cpp\" line=\"175\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>无法停止发送文字</translation>\n    </message>\n</context>\n<context>\n    <name>CWConsoleWidget</name>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"40\"/>\n        <source>CW Keyer Profile</source>\n        <translation>CW 电键配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"62\"/>\n        <source>Shortcuts profile</source>\n        <translation>快捷键配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"94\"/>\n        <source>Speed</source>\n        <translation>速度</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"97\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"106\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"140\"/>\n        <source>Sent text</source>\n        <translation>发送文字</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"154\"/>\n        <source>Echoed text</source>\n        <translation>回显文字</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"170\"/>\n        <source>&amp;CW</source>\n        <translation>&amp;CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"183\"/>\n        <source>Text to send</source>\n        <translation>待发送文字</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"193\"/>\n        <source>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</source>\n        <translation>切换「逐个发送单词」（空格分隔）与「整段发送文本」（换行分隔）模式。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"233\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"261\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"283\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"302\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"321\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"340\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"359\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"411\"/>\n        <source>Halt</source>\n        <translation>终止</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"468\"/>\n        <source>CW Console - Halt Sending</source>\n        <translation>CW控制台 - 终止发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"437\"/>\n        <source>Clear Sent and Echo Console</source>\n        <translation>清除发送及回显窗口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"408\"/>\n        <source>Immediately stop CW sending</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.ui\" line=\"440\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"383\"/>\n        <source>Rig must be connected</source>\n        <translation>必须先连接设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Word</source>\n        <translation>单词</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CWConsoleWidget.cpp\" line=\"449\"/>\n        <source>Whole</source>\n        <translation>整句</translation>\n    </message>\n</context>\n<context>\n    <name>CWDaemonKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"69\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"105\"/>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"123\"/>\n        <source>Keyer is not connected</source>\n        <translation>电键未连接</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"70\"/>\n        <source>Cannot send Text</source>\n        <translation>无法发送文字</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"106\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>无法设置电键速度</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWDaemonKey.cpp\" line=\"124\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>无法停止文字发送</translation>\n    </message>\n</context>\n<context>\n    <name>CWFldigiKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"57\"/>\n        <source>Connected device is not FLDigi</source>\n        <translation>已连接设备不是 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"110\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"176\"/>\n        <source>Keyer is not connected</source>\n        <translation>电键未连接</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"111\"/>\n        <source>Cannot send Text to FLDigi</source>\n        <translation>无法发送文字至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"121\"/>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"191\"/>\n        <source>Cannot send the Clear command to FLDigi</source>\n        <translation>无法发送清除命令至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"127\"/>\n        <source>Cannot send the TX command to FLDigi</source>\n        <translation>无法发送 TX 命令至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"148\"/>\n        <source>Cannot send the Text command to FLDigi</source>\n        <translation>无法发送文字命令至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"177\"/>\n        <source>Cannot send the Stop command to FLDigi</source>\n        <translation>无法发送停止命令至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"185\"/>\n        <source>Cannot send the Abort command to FLDigi</source>\n        <translation>无法发送中断命令至 FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"219\"/>\n        <source>Cannot receive data from FLDigi</source>\n        <translation>无法从 FLDigi 接收数据</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"297\"/>\n        <source>FLDigi connection timeout</source>\n        <translation>FLDigi 连接超时</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"313\"/>\n        <source>FLDigi connection error</source>\n        <translation>FLDigi 连接出错</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWFldigiKey.cpp\" line=\"325\"/>\n        <source>FLDigi command error</source>\n        <translation>FLDigi 命令出错</translation>\n    </message>\n</context>\n<context>\n    <name>CWKeyer</name>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"93\"/>\n        <source>No CW Keyer Profile selected</source>\n        <translation>未选择 CW 电键配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"144\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"145\"/>\n        <source>Internal Error</source>\n        <translation>内部错误</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"151\"/>\n        <source>Connection Error</source>\n        <translation>连接出错</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/CWKeyer.cpp\" line=\"152\"/>\n        <source>Cannot open the Keyer connection</source>\n        <translation>无法打开电键连接</translation>\n    </message>\n</context>\n<context>\n    <name>CWWinKey</name>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"125\"/>\n        <source>Connected device is not WinKey</source>\n        <translation>已连接的设备不是 WinKey</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <source>Cannot send Text to Rig</source>\n        <translation>无法发送文字至设备</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"260\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Keyer is not connected</source>\n        <translation>电键未连接</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"431\"/>\n        <source>Communication Error</source>\n        <translation>通讯出错</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"461\"/>\n        <source>Cannot set Keyer Speed</source>\n        <translation>无法设置电键速度</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"501\"/>\n        <source>Cannot stop Text Sending</source>\n        <translation>无法停止文字发送</translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"711\"/>\n        <source>4000 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"712\"/>\n        <source>2000 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"713\"/>\n        <source>1333 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"714\"/>\n        <source>1000 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"715\"/>\n        <source>800 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"716\"/>\n        <source>666 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"717\"/>\n        <source>571 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"718\"/>\n        <source>500 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"719\"/>\n        <source>444 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../cwkey/drivers/CWWinKey.cpp\" line=\"720\"/>\n        <source>400 Hz</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloExportDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"25\"/>\n        <source>File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"39\"/>\n        <source>Browse</source>\n        <translation type=\"unfinished\">浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"52\"/>\n        <source>Contest</source>\n        <translation type=\"unfinished\">比赛</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"58\"/>\n        <source>Format Template:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"86\"/>\n        <source>Manage</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"99\"/>\n        <source>User Filter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"119\"/>\n        <source>Date/Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"131\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"154\"/>\n        <source>yyyy-MM-dd HH:mm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"144\"/>\n        <source> - </source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"167\"/>\n        <source>UTC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"194\"/>\n        <source>Station &amp; Categories</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"200\"/>\n        <source>Callsign:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"217\"/>\n        <source>Operators:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"227\"/>\n        <source>Band:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"237\"/>\n        <source>Mode:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"247\"/>\n        <source>Power:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"257\"/>\n        <source>Operator:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"267\"/>\n        <source>Assisted:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"277\"/>\n        <source>Station:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"287\"/>\n        <source>Transmitter:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"297\"/>\n        <source>Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"307\"/>\n        <source>Overlay:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"317\"/>\n        <source>Transmitter ID:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"343\"/>\n        <source>Additional</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"349\"/>\n        <source>Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"359\"/>\n        <source>Email:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"369\"/>\n        <source>Address:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"382\"/>\n        <source>Max 6 lines</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"389\"/>\n        <source>Gridsquare</source>\n        <translation type=\"unfinished\">网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"399\"/>\n        <source>Location:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"409\"/>\n        <source>Club:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"419\"/>\n        <source>Soapbox:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"436\"/>\n        <source>Off-Time:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"449\"/>\n        <location filename=\"../ui/CabrilloExportDialog.ui\" line=\"452\"/>\n        <source>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"42\"/>\n        <source>&amp;Export</source>\n        <translation type=\"unfinished\">导出(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"123\"/>\n        <source>Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"265\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"285\"/>\n        <source>QSO(s): %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"278\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"287\"/>\n        <source>QSOs: ?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"438\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"445\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"452\"/>\n        <source>QLog Warning</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"439\"/>\n        <source>Please select a contest template.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"446\"/>\n        <source>Please select an output file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"453\"/>\n        <source>No callsign available. Check your filters.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"487\"/>\n        <source>QLog Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"468\"/>\n        <source>Failed to prepare export query.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"476\"/>\n        <source>Failed to query QSOs for export.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"488\"/>\n        <source>Cannot open file %1 for writing.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"498\"/>\n        <source>Exporting Cabrillo...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"511\"/>\n        <source>QLog Information</source>\n        <translation type=\"unfinished\">QLog 信息</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/CabrilloExportDialog.cpp\" line=\"512\"/>\n        <source>Exported %n QSO(s) to Cabrillo file.</source>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloFormat</name>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"211\"/>\n        <source>All Bands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"220\"/>\n        <source>2m (144 MHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"221\"/>\n        <source>1.25m (222 MHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"222\"/>\n        <source>70cm (432 MHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"223\"/>\n        <source>33cm (902 MHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"224\"/>\n        <source>23cm (1.2 GHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"225\"/>\n        <source>Light</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"226\"/>\n        <source>VHF 3-Band</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"227\"/>\n        <source>VHF FM Only</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"238\"/>\n        <source>Digital</source>\n        <translation type=\"unfinished\">数字模式</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"239\"/>\n        <source>Mixed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"246\"/>\n        <source>High</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"247\"/>\n        <source>Low</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"248\"/>\n        <source>QRP</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"255\"/>\n        <source>Single Operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"256\"/>\n        <source>Multi Operator</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"257\"/>\n        <source>Check Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"264\"/>\n        <source>Non-Assisted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"265\"/>\n        <source>Assisted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"272\"/>\n        <source>Fixed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"273\"/>\n        <source>Mobile</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"274\"/>\n        <source>Portable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"275\"/>\n        <source>Rover</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"276\"/>\n        <source>Rover Limited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"277\"/>\n        <source>Rover Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"278\"/>\n        <source>Expedition</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"279\"/>\n        <source>HQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"280\"/>\n        <source>School</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"281\"/>\n        <source>Distributed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"288\"/>\n        <source>One</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"289\"/>\n        <source>Two</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"290\"/>\n        <source>Limited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"291\"/>\n        <source>Unlimited</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"292\"/>\n        <source>SWL</source>\n        <translation type=\"unfinished\">SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"299\"/>\n        <source>6 Hours</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"300\"/>\n        <source>12 Hours</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"301\"/>\n        <source>24 Hours</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"308\"/>\n        <source>Classic</source>\n        <translation type=\"unfinished\">经典</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"309\"/>\n        <source>Rookie</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"310\"/>\n        <source>TB Wires</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"311\"/>\n        <source>Novice/Tech</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"312\"/>\n        <source>Over 50</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"319\"/>\n        <source>Text (left-aligned)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"320\"/>\n        <source>Frequency (kHz)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"321\"/>\n        <source>Time (HHMM)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"322\"/>\n        <source>Date (YYYY-MM-DD)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"323\"/>\n        <source>RST Short (drop last digit)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"324\"/>\n        <source>Uppercase</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"325\"/>\n        <source>Mode (Cabrillo)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"326\"/>\n        <source>Zero-Padded Nr.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/CabrilloFormat.cpp\" line=\"327\"/>\n        <source>Transmitter ID</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CabrilloTemplateDialog</name>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"14\"/>\n        <source>Cabrillo Template Manager</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"27\"/>\n        <source>Import template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"30\"/>\n        <source>Import</source>\n        <translation type=\"unfinished\">导入</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"40\"/>\n        <source>Export template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"43\"/>\n        <source>Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"67\"/>\n        <source>New template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"70\"/>\n        <source>New</source>\n        <translation type=\"unfinished\">新建</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"80\"/>\n        <source>Copy existing template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"83\"/>\n        <source>Copy</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"93\"/>\n        <source>Delete template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"96\"/>\n        <source>Delete</source>\n        <translation type=\"unfinished\">删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"114\"/>\n        <source>Template Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"124\"/>\n        <source>Contest Name:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"138\"/>\n        <source>Default Mode:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"160\"/>\n        <source>QSO Line Columns:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"172\"/>\n        <source>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"194\"/>\n        <source>Seq.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"199\"/>\n        <source>QSO Field</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"204\"/>\n        <source>Formatter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"209\"/>\n        <source>Width</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"214\"/>\n        <source>Label</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"303\"/>\n        <source>Add line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"306\"/>\n        <source>Add</source>\n        <translation type=\"unfinished\">添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"313\"/>\n        <source>Remove selected line</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.ui\" line=\"316\"/>\n        <source>Remove</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"376\"/>\n        <source>New Template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"410\"/>\n        <source>Copy - %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"432\"/>\n        <source>Delete Template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"433\"/>\n        <source>Delete template &apos;%1&apos;?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"500\"/>\n        <source>Import Template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"502\"/>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"555\"/>\n        <source>QLog Cabrillo Template (*.qct)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"512\"/>\n        <source>Import Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"552\"/>\n        <source>Export Template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"563\"/>\n        <source>Export Failed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"672\"/>\n        <source>Failed to write file: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"688\"/>\n        <source>File not found: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"699\"/>\n        <source>Cannot open file: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"711\"/>\n        <source>Invalid template file: missing name</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>QLog Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"748\"/>\n        <source>Cannot start database transaction.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"800\"/>\n        <source>QLog Warning</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/CabrilloTemplateDialog.cpp\" line=\"801\"/>\n        <source>Cannot save template &apos;%1&apos;: %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>CallbookManager</name>\n    <message>\n        <location filename=\"../core/CallbookManager.cpp\" line=\"107\"/>\n        <source>&lt;p&gt;The secondary callbook will be used&lt;/p&gt;</source>\n        <translation>&lt;p&gt;次选电台黄页将被使用&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>ChatWidget</name>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"101\"/>\n        <source>ON4KST Chat</source>\n        <translation>ON4KST 聊天室</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"117\"/>\n        <source>Chat Room</source>\n        <translation>聊天室</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.ui\" line=\"130\"/>\n        <source>Connect</source>\n        <translation>连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"27\"/>\n        <source>New</source>\n        <translation>新建</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>QLog Warning</source>\n        <translation>QLog 告警</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ChatWidget.cpp\" line=\"164\"/>\n        <source>ON4KST Chat is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>ON4KST 聊天配置不正确。&lt;p&gt;请使用&lt;b&gt;设置&lt;/b&gt;对话框进行配置。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>CheckBoxDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"391\"/>\n        <source>Enabled</source>\n        <translation>启用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"392\"/>\n        <source>Disabled</source>\n        <translation>禁用</translation>\n    </message>\n</context>\n<context>\n    <name>ClockWidget</name>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"144\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"247\"/>\n        <source>Sunrise</source>\n        <translation>日出</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"187\"/>\n        <location filename=\"../ui/ClockWidget.ui\" line=\"290\"/>\n        <source>Sunset</source>\n        <translation>日落</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/ClockWidget.cpp\" line=\"104\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n</context>\n<context>\n    <name>CloudlogUploader</name>\n    <message>\n        <location filename=\"../service/cloudlog/Cloudlog.cpp\" line=\"247\"/>\n        <source>Invalid API Key</source>\n        <translation>无效的API密钥</translation>\n    </message>\n</context>\n<context>\n    <name>ClubLogUploader</name>\n    <message>\n        <location filename=\"../service/clublog/ClubLog.cpp\" line=\"301\"/>\n        <source>Clublog Operation for Callsign %1 failed.&lt;br&gt;%2</source>\n        <translation>呼号 %1 的 Clublog 操作失败。&lt;br&gt;%2</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>列可见性设置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"24\"/>\n        <source>General</source>\n        <translation>常规</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"47\"/>\n        <source>My Info</source>\n        <translation>我的信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"70\"/>\n        <source>QSL &amp;&amp; Callbooks</source>\n        <translation>QSL &amp;&amp; 电台黄页</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"93\"/>\n        <source>Members</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"116\"/>\n        <source>Conditionals</source>\n        <translation>条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"139\"/>\n        <source>Contests</source>\n        <translation>竞赛</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.ui\" line=\"162\"/>\n        <source>Others</source>\n        <translation>其他</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"47\"/>\n        <source>Done</source>\n        <translation>完成</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingGenericDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"300\"/>\n        <source>Unselect All</source>\n        <translation>反选全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"301\"/>\n        <source>Select All</source>\n        <translation>选择全部</translation>\n    </message>\n</context>\n<context>\n    <name>ColumnSettingSimpleDialog</name>\n    <message>\n        <location filename=\"../ui/ColumnSettingSimpleDialog.ui\" line=\"14\"/>\n        <source>Column Visibility Setting</source>\n        <translation>列可见性设置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ColumnSettingDialog.cpp\" line=\"357\"/>\n        <source>Done</source>\n        <translation>完成</translation>\n    </message>\n</context>\n<context>\n    <name>DBSchemaMigration</name>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"395\"/>\n        <source>DXCC Entities</source>\n        <translation type=\"unfinished\">DXCC 实体</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"398\"/>\n        <source>Sats Info</source>\n        <translation type=\"unfinished\">卫星信息</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"401\"/>\n        <source>SOTA Summits</source>\n        <translation type=\"unfinished\">SOTA 山峰</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"404\"/>\n        <source>WWFF Records</source>\n        <translation type=\"unfinished\">WWFF 记录</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"407\"/>\n        <source>IOTA Records</source>\n        <translation type=\"unfinished\">IOTA 记录</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"410\"/>\n        <source>POTA Records</source>\n        <translation type=\"unfinished\">POTA 记录</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"413\"/>\n        <source>Membership Directory Records</source>\n        <translation type=\"unfinished\">会员名录记录</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"416\"/>\n        <source>Clublog CTY.XML</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"419\"/>\n        <source>List of Values</source>\n        <translation type=\"unfinished\">值列表</translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"423\"/>\n        <source>Updating </source>\n        <translation type=\"unfinished\">更新 </translation>\n    </message>\n    <message>\n        <location filename=\"../core/Migration.cpp\" line=\"436\"/>\n        <source> Update Failed</source>\n        <translation type=\"unfinished\"> 更新失败</translation>\n    </message>\n</context>\n<context>\n    <name>DBStrings</name>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"1\"/>\n        <source>PHONE</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"2\"/>\n        <source>CW</source>\n        <translation type=\"unfinished\">CW</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"3\"/>\n        <source>DIGITAL</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"4\"/>\n        <source>Afghanistan</source>\n        <translation>阿富汗</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"5\"/>\n        <source>Agalega &amp; St. Brandon</source>\n        <translation>阿加莱加 &amp; 圣布兰登群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"6\"/>\n        <source>Aland Islands</source>\n        <translation>奥兰群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"7\"/>\n        <source>Alaska</source>\n        <translation>阿拉斯加</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"8\"/>\n        <source>Albania</source>\n        <translation>阿尔巴尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"9\"/>\n        <source>Algeria</source>\n        <translation>阿尔及利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"10\"/>\n        <source>American Samoa</source>\n        <translation>美属萨摩亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"11\"/>\n        <source>Amsterdam &amp; St. Paul Is.</source>\n        <translation>阿姆斯特丹 &amp; 圣保罗群岛.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"12\"/>\n        <source>Andaman &amp; Nicobar Is.</source>\n        <translation>安达曼 &amp; 尼科巴群岛.</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"13\"/>\n        <source>Andorra</source>\n        <translation>安道尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"14\"/>\n        <source>Angola</source>\n        <translation>安哥拉</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"15\"/>\n        <source>Anguilla</source>\n        <translation>安圭拉岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"16\"/>\n        <source>Annobon Island</source>\n        <translation>安诺本岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"17\"/>\n        <source>Antarctica</source>\n        <translation>南极洲</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"18\"/>\n        <source>Antigua &amp; Barbuda</source>\n        <translation>安提瓜和巴布达</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"19\"/>\n        <source>Argentina</source>\n        <translation>阿根廷</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"20\"/>\n        <source>Armenia</source>\n        <translation>亚美尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"21\"/>\n        <source>Aruba</source>\n        <translation>阿鲁巴</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"22\"/>\n        <source>Ascension Island</source>\n        <translation>阿森松岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"23\"/>\n        <source>Asiatic Russia</source>\n        <translation>亚洲俄罗斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"24\"/>\n        <source>Asiatic Turkey</source>\n        <translation>亚洲土耳其</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"25\"/>\n        <source>Austral Islands</source>\n        <translation>南岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"26\"/>\n        <source>Australia</source>\n        <translation>澳大利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"27\"/>\n        <source>Austria</source>\n        <translation>奥地利</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"28\"/>\n        <source>Aves Island</source>\n        <translation>阿韦斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"29\"/>\n        <source>Azerbaijan</source>\n        <translation>阿塞拜疆</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"30\"/>\n        <source>Azores</source>\n        <translation>亚速尔群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"31\"/>\n        <source>Bahamas</source>\n        <translation>巴哈马群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"32\"/>\n        <source>Bahrain</source>\n        <translation>巴林</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"33\"/>\n        <source>Baker &amp; Howland Islands</source>\n        <translation>豪兰和贝克群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"34\"/>\n        <source>Balearic Islands</source>\n        <translation>巴利阿里群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"35\"/>\n        <source>Banaba Island</source>\n        <translation>巴纳巴岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"36\"/>\n        <source>Bangladesh</source>\n        <translation>孟加拉</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"37\"/>\n        <source>Barbados</source>\n        <translation>巴巴多斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"38\"/>\n        <source>Belarus</source>\n        <translation>白俄罗斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"39\"/>\n        <source>Belgium</source>\n        <translation>比利时</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"40\"/>\n        <source>Belize</source>\n        <translation>伯利兹</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"41\"/>\n        <source>Benin</source>\n        <translation>贝宁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"42\"/>\n        <source>Bermuda</source>\n        <translation>百慕大群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"43\"/>\n        <source>Bhutan</source>\n        <translation>不丹</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"44\"/>\n        <source>Bolivia</source>\n        <translation>玻利维亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"45\"/>\n        <source>Bonaire</source>\n        <translation>博奈尔岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"46\"/>\n        <source>Bosnia-Herzegovina</source>\n        <translation>波斯尼亚和黑塞哥维那</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"47\"/>\n        <source>Botswana</source>\n        <translation>博茨瓦纳</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"48\"/>\n        <source>Bouvet</source>\n        <translation>布韦特</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"49\"/>\n        <source>Brazil</source>\n        <translation>巴西</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"50\"/>\n        <source>British Virgin Islands</source>\n        <translation>英属维京群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"51\"/>\n        <source>Brunei Darussalam</source>\n        <translation>文莱达鲁萨兰国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"52\"/>\n        <source>Bulgaria</source>\n        <translation>保加利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"53\"/>\n        <source>Burkina Faso</source>\n        <translation>布基纳法索</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"54\"/>\n        <source>Burundi</source>\n        <translation>布隆迪</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"55\"/>\n        <source>Cambodia</source>\n        <translation>柬埔寨</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"56\"/>\n        <source>Cameroon</source>\n        <translation>喀麦隆</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"57\"/>\n        <source>Canada</source>\n        <translation>加拿大</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"58\"/>\n        <source>Canary Islands</source>\n        <translation>加纳利群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"59\"/>\n        <source>Cape Verde</source>\n        <translation>佛得角</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"60\"/>\n        <source>Cayman Islands</source>\n        <translation>开曼群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"61\"/>\n        <source>Central African Republic</source>\n        <translation>中非共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"62\"/>\n        <source>Central Kiribati</source>\n        <translation>中基里巴斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"63\"/>\n        <source>Ceuta &amp; Melilla</source>\n        <translation>休达 - 梅利利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"64\"/>\n        <source>Chad</source>\n        <translation>乍得</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"65\"/>\n        <source>Chagos Islands</source>\n        <translation>查戈斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"66\"/>\n        <source>Chatham Islands</source>\n        <translation>查塔姆群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"67\"/>\n        <source>Chesterfield Islands</source>\n        <translation>切斯特菲尔德群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"68\"/>\n        <source>Chile</source>\n        <translation>智利</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"69\"/>\n        <source>China</source>\n        <translation>中国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"70\"/>\n        <source>Christmas Island</source>\n        <translation>圣诞岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"71\"/>\n        <source>Clipperton Island</source>\n        <translation>克利珀顿岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"72\"/>\n        <source>Cocos (Keeling) Islands</source>\n        <translation>科科斯 (基林) 群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"73\"/>\n        <source>Cocos Island</source>\n        <translation>科科斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"74\"/>\n        <source>Colombia</source>\n        <translation>哥伦比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"75\"/>\n        <source>Comoros</source>\n        <translation>科摩罗</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"76\"/>\n        <source>Conway Reef</source>\n        <translation>康韦礁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"77\"/>\n        <source>Corsica</source>\n        <translation>科西嘉岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"78\"/>\n        <source>Costa Rica</source>\n        <translation>哥斯达黎加</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"79\"/>\n        <source>Cote d&apos;Ivoire</source>\n        <translation>科特迪瓦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"80\"/>\n        <source>Crete</source>\n        <translation>克里特岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"81\"/>\n        <source>Croatia</source>\n        <translation>克罗地亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"82\"/>\n        <source>Crozet Island</source>\n        <translation>克罗泽岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"83\"/>\n        <source>Cuba</source>\n        <translation>古巴</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"84\"/>\n        <source>Curacao</source>\n        <translation>库拉索岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"85\"/>\n        <source>Cyprus</source>\n        <translation>塞浦路斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"86\"/>\n        <source>Czech Republic</source>\n        <translation>捷克共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"87\"/>\n        <source>DPR of Korea</source>\n        <translation>朝鲜</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"88\"/>\n        <source>Dem. Rep. of the Congo</source>\n        <translation>刚果民主共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"89\"/>\n        <source>Denmark</source>\n        <translation>丹麦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"90\"/>\n        <source>Desecheo Island</source>\n        <translation>德塞切奥岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"91\"/>\n        <source>Djibouti</source>\n        <translation>吉布提</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"92\"/>\n        <source>Dodecanese</source>\n        <translation>多德卡尼斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"93\"/>\n        <source>Dominica</source>\n        <translation>多米尼克</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"94\"/>\n        <source>Dominican Republic</source>\n        <translation>多米尼加共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"95\"/>\n        <source>Ducie Island</source>\n        <translation>迪西岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"96\"/>\n        <source>East Malaysia</source>\n        <translation>东马来西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"97\"/>\n        <source>Easter Island</source>\n        <translation>复活节岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"98\"/>\n        <source>Eastern Kiribati</source>\n        <translation>东基里巴斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"99\"/>\n        <source>Ecuador</source>\n        <translation>厄瓜多尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"100\"/>\n        <source>Egypt</source>\n        <translation>埃及</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"101\"/>\n        <source>El Salvador</source>\n        <translation>萨尔瓦多</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"102\"/>\n        <source>England</source>\n        <translation>英格兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"103\"/>\n        <source>Equatorial Guinea</source>\n        <translation>赤道几内亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"104\"/>\n        <source>Eritrea</source>\n        <translation>厄立特里亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"105\"/>\n        <source>Estonia</source>\n        <translation>爱沙尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"106\"/>\n        <source>Ethiopia</source>\n        <translation>埃塞俄比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"107\"/>\n        <source>European Russia</source>\n        <translation>欧洲俄罗斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"108\"/>\n        <source>Falkland Islands</source>\n        <translation>福克兰群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"109\"/>\n        <source>Faroe Islands</source>\n        <translation>法罗群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"110\"/>\n        <source>Fed. Rep. of Germany</source>\n        <translation>德国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"111\"/>\n        <source>Fernando de Noronha</source>\n        <translation>费尔南多·迪诺罗尼亚群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"112\"/>\n        <source>Fiji</source>\n        <translation>斐济</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"113\"/>\n        <source>Finland</source>\n        <translation>芬兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"114\"/>\n        <source>France</source>\n        <translation>法国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"115\"/>\n        <source>Franz Josef Land</source>\n        <translation>法兰士约瑟夫地群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"116\"/>\n        <source>French Guiana</source>\n        <translation>法属圭亚那</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"117\"/>\n        <source>French Polynesia</source>\n        <translation>法属波利尼西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"118\"/>\n        <source>Gabon</source>\n        <translation>加蓬</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"119\"/>\n        <source>Galapagos Islands</source>\n        <translation>加拉帕戈斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"120\"/>\n        <source>Georgia</source>\n        <translation>格鲁吉亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"121\"/>\n        <source>Ghana</source>\n        <translation>加纳</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"122\"/>\n        <source>Gibraltar</source>\n        <translation>直布罗陀</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"123\"/>\n        <source>Glorioso Islands</source>\n        <translation>格洛里厄斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"124\"/>\n        <source>Greece</source>\n        <translation>希腊</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"125\"/>\n        <source>Greenland</source>\n        <translation>格陵兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"126\"/>\n        <source>Grenada</source>\n        <translation>格林纳达</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"127\"/>\n        <source>Guadeloupe</source>\n        <translation>瓜德罗普岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"128\"/>\n        <source>Guam</source>\n        <translation>关岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"129\"/>\n        <source>Guantanamo Bay</source>\n        <translation>关塔那摩湾</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"130\"/>\n        <source>Guatemala</source>\n        <translation>危地马拉</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"131\"/>\n        <source>Guernsey</source>\n        <translation>根西岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"132\"/>\n        <source>Guinea</source>\n        <translation>几内亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"133\"/>\n        <source>Guinea-Bissau</source>\n        <translation>几内亚比绍</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"134\"/>\n        <source>Guyana</source>\n        <translation>圭亚那</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"135\"/>\n        <source>Haiti</source>\n        <translation>海地</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"136\"/>\n        <source>Hawaii</source>\n        <translation>夏威夷</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"137\"/>\n        <source>Heard Island</source>\n        <translation>赫德岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"138\"/>\n        <source>Honduras</source>\n        <translation>洪都拉斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"139\"/>\n        <source>Hong Kong</source>\n        <translation>中国香港</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"140\"/>\n        <source>Hungary</source>\n        <translation>匈牙利</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"141\"/>\n        <source>ITU HQ</source>\n        <translation>ITU HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"142\"/>\n        <source>Iceland</source>\n        <translation>冰岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"143\"/>\n        <source>India</source>\n        <translation>印度</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"144\"/>\n        <source>Indonesia</source>\n        <translation>印度尼西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"145\"/>\n        <source>Iran</source>\n        <translation>伊朗</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"146\"/>\n        <source>Iraq</source>\n        <translation>伊拉克</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"147\"/>\n        <source>Ireland</source>\n        <translation>爱尔兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"148\"/>\n        <source>Isle of Man</source>\n        <translation>马恩岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"149\"/>\n        <source>Israel</source>\n        <translation>以色列</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"150\"/>\n        <source>Italy</source>\n        <translation>意大利</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"151\"/>\n        <source>Jamaica</source>\n        <translation>牙买加</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"152\"/>\n        <source>Jan Mayen</source>\n        <translation>扬马延岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"153\"/>\n        <source>Japan</source>\n        <translation>日本</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"154\"/>\n        <source>Jersey</source>\n        <translation>泽西岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"155\"/>\n        <source>Johnston Island</source>\n        <translation>约翰斯顿岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"156\"/>\n        <source>Jordan</source>\n        <translation>约旦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"157\"/>\n        <source>Juan Fernandez Islands</source>\n        <translation>胡安费尔南德斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"158\"/>\n        <source>Juan de Nova &amp; Europa</source>\n        <translation>新胡安 - 欧罗巴岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"159\"/>\n        <source>Kaliningrad</source>\n        <translation>加里宁格勒</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"160\"/>\n        <source>Kazakhstan</source>\n        <translation>哈萨克斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"161\"/>\n        <source>Kenya</source>\n        <translation>肯尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"162\"/>\n        <source>Kerguelen Islands</source>\n        <translation>凯尔盖朗群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"163\"/>\n        <source>Kermadec Islands</source>\n        <translation>克马德克群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"164\"/>\n        <source>Kingdom of Eswatini</source>\n        <translation>斯威士兰王国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"165\"/>\n        <source>Kure Island</source>\n        <translation>库雷环礁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"166\"/>\n        <source>Kuwait</source>\n        <translation>科威特</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"167\"/>\n        <source>Kyrgyzstan</source>\n        <translation>吉尔吉斯斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"168\"/>\n        <source>Lakshadweep Islands</source>\n        <translation>拉克沙群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"169\"/>\n        <source>Laos</source>\n        <translation>老挝</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"170\"/>\n        <source>Latvia</source>\n        <translation>拉脱维亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"171\"/>\n        <source>Lebanon</source>\n        <translation>黎巴嫩</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"172\"/>\n        <source>Lesotho</source>\n        <translation>莱索托</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"173\"/>\n        <source>Liberia</source>\n        <translation>利比里亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"174\"/>\n        <source>Libya</source>\n        <translation>利比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"175\"/>\n        <source>Liechtenstein</source>\n        <translation>列支敦士登</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"176\"/>\n        <source>Lithuania</source>\n        <translation>立陶宛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"177\"/>\n        <source>Lord Howe Island</source>\n        <translation>豪勋爵岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"178\"/>\n        <source>Luxembourg</source>\n        <translation>卢森堡</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"179\"/>\n        <source>Macao</source>\n        <translation>中国澳门</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"180\"/>\n        <source>Macquarie Island</source>\n        <translation>麦夸里岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"181\"/>\n        <source>Madagascar</source>\n        <translation>马达加斯加</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"182\"/>\n        <source>Madeira Islands</source>\n        <translation>马德拉群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"183\"/>\n        <source>Malawi</source>\n        <translation>马拉维</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"184\"/>\n        <source>Maldives</source>\n        <translation>马尔代夫</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"185\"/>\n        <source>Mali</source>\n        <translation>马里</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"186\"/>\n        <source>Malpelo Island</source>\n        <translation>马尔佩洛岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"187\"/>\n        <source>Malta</source>\n        <translation>马耳他</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"188\"/>\n        <source>Mariana Islands</source>\n        <translation>马里亚纳群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"189\"/>\n        <source>Market Reef</source>\n        <translation>马凯特礁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"190\"/>\n        <source>Marquesas Islands</source>\n        <translation>马克萨斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"191\"/>\n        <source>Marshall Islands</source>\n        <translation>马绍尔群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"192\"/>\n        <source>Martinique</source>\n        <translation>马提尼克</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"193\"/>\n        <source>Mauritania</source>\n        <translation>毛里塔尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"194\"/>\n        <source>Mauritius</source>\n        <translation>毛里求斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"195\"/>\n        <source>Mayotte</source>\n        <translation>马约特岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"196\"/>\n        <source>Mellish Reef</source>\n        <translation>梅利什礁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"197\"/>\n        <source>Mexico</source>\n        <translation>墨西哥</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"198\"/>\n        <source>Micronesia</source>\n        <translation>密克罗尼西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"199\"/>\n        <source>Midway Island</source>\n        <translation>中途岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"200\"/>\n        <source>Minami Torishima</source>\n        <translation>南鸟岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"201\"/>\n        <source>Moldova</source>\n        <translation>摩尔多瓦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"202\"/>\n        <source>Monaco</source>\n        <translation>摩纳哥</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"203\"/>\n        <source>Mongolia</source>\n        <translation>蒙古</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"204\"/>\n        <source>Montenegro</source>\n        <translation>黑山共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"205\"/>\n        <source>Montserrat</source>\n        <translation>蒙特塞拉特岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"206\"/>\n        <source>Morocco</source>\n        <translation>摩洛哥</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"207\"/>\n        <source>Mount Athos</source>\n        <translation>阿索斯山</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"208\"/>\n        <source>Mozambique</source>\n        <translation>莫桑比克</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"209\"/>\n        <source>Myanmar</source>\n        <translation>缅甸</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"210\"/>\n        <source>N.Z. Subantarctic Is.</source>\n        <translation>新西兰亚南极群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"211\"/>\n        <source>Namibia</source>\n        <translation>纳米比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"212\"/>\n        <source>Nauru</source>\n        <translation>瑙鲁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"213\"/>\n        <source>Navassa Island</source>\n        <translation>纳弗沙岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"214\"/>\n        <source>Nepal</source>\n        <translation>尼泊尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"215\"/>\n        <source>Netherlands</source>\n        <translation>荷兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"216\"/>\n        <source>New Caledonia</source>\n        <translation>新喀里多尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"217\"/>\n        <source>New Zealand</source>\n        <translation>新西兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"218\"/>\n        <source>Nicaragua</source>\n        <translation>尼加拉瓜</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"219\"/>\n        <source>Niger</source>\n        <translation>尼日尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"220\"/>\n        <source>Nigeria</source>\n        <translation>尼日利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"221\"/>\n        <source>Niue</source>\n        <translation>纽埃岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"222\"/>\n        <source>Norfolk Island</source>\n        <translation>诺福克岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"223\"/>\n        <source>North Cook Islands</source>\n        <translation>北库克群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"224\"/>\n        <source>North Macedonia</source>\n        <translation>北马其顿</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"225\"/>\n        <source>Northern Ireland</source>\n        <translation>北爱尔兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"226\"/>\n        <source>Norway</source>\n        <translation>挪威</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"227\"/>\n        <source>Ogasawara</source>\n        <translation>小笠原群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"228\"/>\n        <source>Oman</source>\n        <translation>阿曼</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"229\"/>\n        <source>Pakistan</source>\n        <translation>巴基斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"230\"/>\n        <source>Palau</source>\n        <translation>帕劳</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"231\"/>\n        <source>Palestine</source>\n        <translation>巴勒斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"232\"/>\n        <source>Palmyra &amp; Jarvis Islands</source>\n        <translation>巴尔米拉 - 贾维斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"233\"/>\n        <source>Panama</source>\n        <translation>巴拿马</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"234\"/>\n        <source>Papua New Guinea</source>\n        <translation>巴布亚新几內亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"235\"/>\n        <source>Paraguay</source>\n        <translation>巴拉圭</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"236\"/>\n        <source>Peru</source>\n        <translation>秘鲁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"237\"/>\n        <source>Peter 1 Island</source>\n        <translation>彼得一世岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"238\"/>\n        <source>Philippines</source>\n        <translation>菲律宾</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"239\"/>\n        <source>Pitcairn Island</source>\n        <translation>皮特克恩岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"240\"/>\n        <source>Poland</source>\n        <translation>波兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"241\"/>\n        <source>Portugal</source>\n        <translation>葡萄牙</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"242\"/>\n        <source>Pr. Edward &amp; Marion Is.</source>\n        <translation>爱德华王子群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"243\"/>\n        <source>Pratas Island</source>\n        <translation>东沙群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"244\"/>\n        <source>Puerto Rico</source>\n        <translation>波多黎各</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"245\"/>\n        <source>Qatar</source>\n        <translation>卡塔尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"246\"/>\n        <source>Republic of Korea</source>\n        <translation>韩国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"247\"/>\n        <source>Republic of Kosovo</source>\n        <translation>科索沃共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"248\"/>\n        <source>Republic of South Sudan</source>\n        <translation>南苏丹共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"249\"/>\n        <source>Republic of the Congo</source>\n        <translation>刚果共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"250\"/>\n        <source>Reunion Island</source>\n        <translation>留尼旺岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"251\"/>\n        <source>Revillagigedo</source>\n        <translation>雷维利亚希赫多群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"252\"/>\n        <source>Rodriguez Island</source>\n        <translation>罗德里格斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"253\"/>\n        <source>Romania</source>\n        <translation>罗马尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"254\"/>\n        <source>Rotuma Island</source>\n        <translation>罗图马岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"255\"/>\n        <source>Rwanda</source>\n        <translation>卢旺达</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"256\"/>\n        <source>Saba &amp; St. Eustatius</source>\n        <translation>萨巴 - 圣尤斯特歇斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"257\"/>\n        <source>Sable Island</source>\n        <translation>塞布尔岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"258\"/>\n        <source>Samoa</source>\n        <translation>萨摩亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"259\"/>\n        <source>San Andres &amp; Providencia</source>\n        <translation>圣安德烈斯 - 普罗维登斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"260\"/>\n        <source>San Felix &amp; San Ambrosio</source>\n        <translation>圣费利克斯 - 圣安布罗斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"261\"/>\n        <source>San Marino</source>\n        <translation>圣马力诺</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"262\"/>\n        <source>Sao Tome &amp; Principe</source>\n        <translation>圣多美和普林西比民主共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"263\"/>\n        <source>Sardinia</source>\n        <translation>撒丁岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"264\"/>\n        <source>Saudi Arabia</source>\n        <translation>沙特阿拉伯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"265\"/>\n        <source>Scarborough Reef</source>\n        <translation>斯卡伯勒礁</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"266\"/>\n        <source>Scotland</source>\n        <translation>苏格兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"267\"/>\n        <source>Senegal</source>\n        <translation>塞内加尔</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"268\"/>\n        <source>Serbia</source>\n        <translation>塞尔维亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"269\"/>\n        <source>Seychelles</source>\n        <translation>塞舌尔群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"270\"/>\n        <source>Sierra Leone</source>\n        <translation>塞拉利昂</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"271\"/>\n        <source>Singapore</source>\n        <translation>新加坡</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"272\"/>\n        <source>Sint Maarten</source>\n        <translation>圣马丁岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"273\"/>\n        <source>Slovak Republic</source>\n        <translation>斯洛伐克共和国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"274\"/>\n        <source>Slovenia</source>\n        <translation>斯洛文尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"275\"/>\n        <source>Solomon Islands</source>\n        <translation>所罗门群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"276\"/>\n        <source>Somalia</source>\n        <translation>索马里</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"277\"/>\n        <source>South Africa</source>\n        <translation>南非</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"278\"/>\n        <source>South Cook Islands</source>\n        <translation>南库克群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"279\"/>\n        <source>South Georgia Island</source>\n        <translation>南乔治亚岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"280\"/>\n        <source>South Orkney Islands</source>\n        <translation>南奥克尼群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"281\"/>\n        <source>South Sandwich Islands</source>\n        <translation>南桑威奇群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"282\"/>\n        <source>South Shetland Islands</source>\n        <translation>南谢特兰群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"283\"/>\n        <source>Sov Mil Order of Malta</source>\n        <translation>马耳他骑士团</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"284\"/>\n        <source>Spain</source>\n        <translation>西班牙</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"285\"/>\n        <source>Spratly Islands</source>\n        <translation>南沙群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"286\"/>\n        <source>Sri Lanka</source>\n        <translation>斯里兰卡</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"287\"/>\n        <source>St. Barthelemy</source>\n        <translation>圣巴特岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"288\"/>\n        <source>St. Helena</source>\n        <translation>圣赫勒拿岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"289\"/>\n        <source>St. Kitts &amp; Nevis</source>\n        <translation>圣基茨和尼维斯联邦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"290\"/>\n        <source>St. Lucia</source>\n        <translation>圣卢西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"291\"/>\n        <source>St. Martin</source>\n        <translation>圣马丁岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"292\"/>\n        <source>St. Paul Island</source>\n        <translation>圣保罗岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"293\"/>\n        <source>St. Peter &amp; St. Paul</source>\n        <translation>圣彼得 - 圣保罗岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"294\"/>\n        <source>St. Pierre &amp; Miquelon</source>\n        <translation>圣皮埃尔 - 密克隆群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"295\"/>\n        <source>St. Vincent</source>\n        <translation>圣文森特岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"296\"/>\n        <source>Sudan</source>\n        <translation>苏丹</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"297\"/>\n        <source>Suriname</source>\n        <translation>苏里南</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"298\"/>\n        <source>Svalbard</source>\n        <translation>斯瓦尔巴特群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"299\"/>\n        <source>Swains Island</source>\n        <translation>斯温斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"300\"/>\n        <source>Sweden</source>\n        <translation>瑞典</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"301\"/>\n        <source>Switzerland</source>\n        <translation>瑞士</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"302\"/>\n        <source>Syria</source>\n        <translation>叙利亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"303\"/>\n        <source>Taiwan</source>\n        <translation>中国台湾</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"304\"/>\n        <source>Tajikistan</source>\n        <translation>塔吉克斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"305\"/>\n        <source>Tanzania</source>\n        <translation>坦桑尼亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"306\"/>\n        <source>Temotu Province</source>\n        <translation>泰莫图省</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"307\"/>\n        <source>Thailand</source>\n        <translation>泰国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"308\"/>\n        <source>The Gambia</source>\n        <translation>冈比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"309\"/>\n        <source>Timor - Leste</source>\n        <translation>东帝汶</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"310\"/>\n        <source>Togo</source>\n        <translation>多哥</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"311\"/>\n        <source>Tokelau Islands</source>\n        <translation>托克劳群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"312\"/>\n        <source>Tonga</source>\n        <translation>汤加</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"313\"/>\n        <source>Trindade &amp; Martim Vaz</source>\n        <translation>特林达迪 - 马丁瓦斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"314\"/>\n        <source>Trinidad &amp; Tobago</source>\n        <translation>特立尼达和多巴哥</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"315\"/>\n        <source>Tristan da Cunha &amp; Gough Islands</source>\n        <translation>特里斯坦-达库尼亚群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"316\"/>\n        <source>Tromelin Island</source>\n        <translation>特罗姆兰岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"317\"/>\n        <source>Tunisia</source>\n        <translation>突尼斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"318\"/>\n        <source>Turkmenistan</source>\n        <translation>土库曼斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"319\"/>\n        <source>Turks &amp; Caicos Islands</source>\n        <translation>特克斯和凯科斯群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"320\"/>\n        <source>Tuvalu</source>\n        <translation>图瓦卢</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"321\"/>\n        <source>UK Base Areas on Cyprus</source>\n        <translation>塞浦路斯英属基地区</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"322\"/>\n        <source>US Virgin Islands</source>\n        <translation>美属维京群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"323\"/>\n        <source>Uganda</source>\n        <translation>乌干达</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"324\"/>\n        <source>Ukraine</source>\n        <translation>乌克兰</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"325\"/>\n        <source>United Arab Emirates</source>\n        <translation>阿拉伯联合酋长国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"326\"/>\n        <source>United Nations HQ</source>\n        <translation>联合国 HQ</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"327\"/>\n        <source>United States</source>\n        <translation>美国</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"328\"/>\n        <source>Uruguay</source>\n        <translation>乌拉圭</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"329\"/>\n        <source>Uzbekistan</source>\n        <translation>乌兹别克斯坦</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"330\"/>\n        <source>Vanuatu</source>\n        <translation>瓦努阿图</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"331\"/>\n        <source>Vatican City</source>\n        <translation>梵蒂冈</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"332\"/>\n        <source>Venezuela</source>\n        <translation>委内瑞拉</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"333\"/>\n        <source>Vietnam</source>\n        <translation>越南</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"334\"/>\n        <source>Wake Island</source>\n        <translation>威克岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"335\"/>\n        <source>Wales</source>\n        <translation>威尔士</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"336\"/>\n        <source>Wallis &amp; Futuna Islands</source>\n        <translation>瓦利斯和富图纳群岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"337\"/>\n        <source>West Malaysia</source>\n        <translation>西马来西亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"338\"/>\n        <source>Western Kiribati</source>\n        <translation>西基里巴斯</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"339\"/>\n        <source>Western Sahara</source>\n        <translation>西撒哈拉</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"340\"/>\n        <source>Willis Island</source>\n        <translation>威利斯岛</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"341\"/>\n        <source>Yemen</source>\n        <translation>也门</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"342\"/>\n        <source>Zambia</source>\n        <translation>赞比亚</translation>\n    </message>\n    <message>\n        <location filename=\"dbstrings.tri\" line=\"343\"/>\n        <source>Zimbabwe</source>\n        <translation>津巴布韦</translation>\n    </message>\n</context>\n<context>\n    <name>DXCCSubmissionDialog</name>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"14\"/>\n        <source>DXCC Submission List</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"20\"/>\n        <source>Options</source>\n        <translation type=\"unfinished\">选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"44\"/>\n        <source>My DXCC Entity</source>\n        <translation type=\"unfinished\">我的 DXCC 实体</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"79\"/>\n        <source>User Filter</source>\n        <translation type=\"unfinished\">用户过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"127\"/>\n        <source>Category</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"136\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"485\"/>\n        <source>Mixed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"149\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"482\"/>\n        <source>CW</source>\n        <translation type=\"unfinished\">CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"159\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"483\"/>\n        <source>Phone</source>\n        <translation type=\"unfinished\">语音通话</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"169\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"484\"/>\n        <source>Digital</source>\n        <translation type=\"unfinished\">数字模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"194\"/>\n        <source>Confirmed by</source>\n        <translation type=\"unfinished\">确认自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"206\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"339\"/>\n        <source>LoTW</source>\n        <translation type=\"unfinished\">LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"216\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"340\"/>\n        <source>Paper</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"241\"/>\n        <source>Show</source>\n        <translation type=\"unfinished\">显示</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"253\"/>\n        <source>Not Yet Submitted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"263\"/>\n        <source>Submitted (Not Granted)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"273\"/>\n        <source>Already Granted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"298\"/>\n        <source>Band Scope</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"333\"/>\n        <source>Select 5-Band DXCC preset bands (80/40/20/15/10m)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"336\"/>\n        <source>5-Band DXCC</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"359\"/>\n        <source>Select all DXCC-eligible bands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"362\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"81\"/>\n        <source>All DXCC Bands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"384\"/>\n        <source>Bands</source>\n        <translation type=\"unfinished\">波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"397\"/>\n        <source>Select options above and the list will update automatically.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"462\"/>\n        <source>Export the contacts listed above to an ADIF file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.ui\" line=\"465\"/>\n        <source>Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"69\"/>\n        <source>No User Filter</source>\n        <translation type=\"unfinished\">无用户筛选器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"77\"/>\n        <source>Any Band (Entity Level)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"79\"/>\n        <source>5-Band DXCC (80/40/20/15/10m)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"83\"/>\n        <source>Custom Band Selection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"333\"/>\n        <source>Entity</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"334\"/>\n        <source>Prefix</source>\n        <translation type=\"unfinished\">前缀</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"335\"/>\n        <source>Callsign</source>\n        <translation type=\"unfinished\">呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"336\"/>\n        <source>Band</source>\n        <translation type=\"unfinished\">波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"337\"/>\n        <source>Mode</source>\n        <translation type=\"unfinished\">模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"338\"/>\n        <source>Date</source>\n        <translation type=\"unfinished\">日期</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"341\"/>\n        <source>Submitted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"342\"/>\n        <source>Granted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"384\"/>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"395\"/>\n        <source>Export ADIF</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"385\"/>\n        <source>No contacts to export.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"396\"/>\n        <source>Failed to retrieve contact records.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"408\"/>\n        <source>Export DXCC Submission List as ADIF</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"491\"/>\n        <source>any band</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"492\"/>\n        <source>5-band</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"493\"/>\n        <source>all bands</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"495\"/>\n        <source>%1 selected band(s)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"500\"/>\n        <source>No contacts match the selected criteria.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"503\"/>\n        <source>%1 %2 %3 — DXCC %4 / %5</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>band-slot</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"505\"/>\n        <source>entity</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entry</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DXCCSubmissionDialog.cpp\" line=\"506\"/>\n        <source>entries</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Data</name>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"568\"/>\n        <source>New Entity</source>\n        <translation>新实体</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"570\"/>\n        <source>New Band</source>\n        <translation>新波段</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"572\"/>\n        <source>New Mode</source>\n        <translation>新模式</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"574\"/>\n        <source>New Band&amp;Mode</source>\n        <translation>新波段模式(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"576\"/>\n        <source>New Slot</source>\n        <translation>新组合</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"578\"/>\n        <source>Confirmed</source>\n        <translation>已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"580\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"637\"/>\n        <source>Hz</source>\n        <translation>Hz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"644\"/>\n        <source>kHz</source>\n        <translation>kHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"651\"/>\n        <source>GHz</source>\n        <translation>GHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.cpp\" line=\"656\"/>\n        <source>MHz</source>\n        <translation>MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"35\"/>\n        <location filename=\"../data/Data.h\" line=\"48\"/>\n        <location filename=\"../data/Data.h\" line=\"54\"/>\n        <location filename=\"../data/Data.h\" line=\"67\"/>\n        <location filename=\"../data/Data.h\" line=\"72\"/>\n        <location filename=\"../data/Data.h\" line=\"89\"/>\n        <source>Yes</source>\n        <translation>是</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"36\"/>\n        <location filename=\"../data/Data.h\" line=\"49\"/>\n        <location filename=\"../data/Data.h\" line=\"55\"/>\n        <location filename=\"../data/Data.h\" line=\"68\"/>\n        <location filename=\"../data/Data.h\" line=\"73\"/>\n        <location filename=\"../data/Data.h\" line=\"90\"/>\n        <source>No</source>\n        <translation>否</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"37\"/>\n        <location filename=\"../data/Data.h\" line=\"50\"/>\n        <source>Requested</source>\n        <translation>已请求</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"38\"/>\n        <source>Queued</source>\n        <translation>排队中</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"39\"/>\n        <location filename=\"../data/Data.h\" line=\"51\"/>\n        <location filename=\"../data/Data.h\" line=\"91\"/>\n        <source>Invalid</source>\n        <translation>无效</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"42\"/>\n        <source>Bureau</source>\n        <translation>卡片局</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"43\"/>\n        <source>Direct</source>\n        <translation>直邮</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"44\"/>\n        <source>Electronic</source>\n        <translation>电子卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"45\"/>\n        <location filename=\"../data/Data.h\" line=\"57\"/>\n        <location filename=\"../data/Data.h\" line=\"64\"/>\n        <location filename=\"../data/Data.h\" line=\"69\"/>\n        <location filename=\"../data/Data.h\" line=\"76\"/>\n        <location filename=\"../data/Data.h\" line=\"86\"/>\n        <location filename=\"../data/Data.h\" line=\"92\"/>\n        <location filename=\"../data/Data.h\" line=\"99\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"56\"/>\n        <source>Modified</source>\n        <translation>已修改</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"60\"/>\n        <source>Grayline</source>\n        <translation>灰线</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"61\"/>\n        <source>Other</source>\n        <translation>其他</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"62\"/>\n        <source>Short Path</source>\n        <translation>短路径</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"63\"/>\n        <source>Long Path</source>\n        <translation>长路径</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"74\"/>\n        <source>Not Heard</source>\n        <translation>没听到过</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"75\"/>\n        <source>Uncertain</source>\n        <translation>不确定</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"79\"/>\n        <source>Straight Key</source>\n        <translation>直键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"80\"/>\n        <source>Sideswiper</source>\n        <translation>扫拨键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"81\"/>\n        <source>Mechanical semi-automatic keyer or Bug</source>\n        <translation>机械半自动或臭虫键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"82\"/>\n        <source>Mechanical fully-automatic keyer or Bug</source>\n        <translation>机械全自动或臭虫键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"83\"/>\n        <source>Single Paddle</source>\n        <translation>单桨键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"84\"/>\n        <source>Dual Paddle</source>\n        <translation>双桨键</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"85\"/>\n        <source>Computer Driven</source>\n        <translation>电脑驱动</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"96\"/>\n        <source>Confirmed (AG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"97\"/>\n        <source>Confirmed (no AG)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../data/Data.h\" line=\"98\"/>\n        <source>Unknown</source>\n        <translation type=\"unfinished\">未知</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"1\"/>\n        <source>Aircraft Scatter</source>\n        <oldsource>Aircraft Scatte</oldsource>\n        <translation>飞机反射</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"2\"/>\n        <source>Aurora-E</source>\n        <translation>极光-E</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"3\"/>\n        <source>Aurora</source>\n        <translation>极光</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"4\"/>\n        <source>Back scatter</source>\n        <translation>反向散射</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"5\"/>\n        <source>EchoLink</source>\n        <translation>EchoLink</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"6\"/>\n        <source>Earth-Moon-Earth</source>\n        <translation>地球-月球-地球</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"7\"/>\n        <source>Sporadic E</source>\n        <translation>突发 E 层</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"8\"/>\n        <source>F2 Reflection</source>\n        <translation>F2 反射</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"9\"/>\n        <source>Field Aligned Irregularities</source>\n        <translation>场向不规则体</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"10\"/>\n        <source>Ground Wave</source>\n        <translation>地波</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"11\"/>\n        <source>Internet-assisted</source>\n        <translation>互联网协助</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"12\"/>\n        <source>Ionoscatter</source>\n        <translation>电离层散射</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"13\"/>\n        <source>IRLP</source>\n        <translation>IRLP</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"14\"/>\n        <source>Line of Sight</source>\n        <translation>视线</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"15\"/>\n        <source>Meteor scatter</source>\n        <translation>流星余迹</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"16\"/>\n        <source>Terrestrial or atmospheric repeater or transponder</source>\n        <translation>陆地或大气中的中继器或转发器</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"17\"/>\n        <source>Rain scatter</source>\n        <translation>雨滴散射</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"18\"/>\n        <source>Satellite</source>\n        <translation>卫星</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"19\"/>\n        <source>Trans-equatorial</source>\n        <translation>跨赤道</translation>\n    </message>\n    <message>\n        <location filename=\"datastrings.tri\" line=\"20\"/>\n        <source>Tropospheric ducting</source>\n        <translation>对流层波导</translation>\n    </message>\n</context>\n<context>\n    <name>DateFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"62\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n</context>\n<context>\n    <name>DevToolsDialog</name>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"14\"/>\n        <source>Developer Tools</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"26\"/>\n        <source>Debug Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"34\"/>\n        <source>Logging Rules:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"41\"/>\n        <source>e.g. qlog.ui.*.runtime=true</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"51\"/>\n        <source>Apply</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"62\"/>\n        <source>Generate Debug File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"69\"/>\n        <source>Export File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"105\"/>\n        <source>SQL Console</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"113\"/>\n        <source>Open SQL</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"123\"/>\n        <source>Save SQL</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"133\"/>\n        <source>Run SQL</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"143\"/>\n        <source>Export As</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.ui\" line=\"159\"/>\n        <source>Enter SQL query here... Ctrl+Return = run</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"82\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"382\"/>\n        <source>TXT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"84\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"400\"/>\n        <source>CSV</source>\n        <translation type=\"unfinished\">CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"86\"/>\n        <source>ADI</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"192\"/>\n        <source>Open SQL Query</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"193\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"220\"/>\n        <source>SQL Files (*.sql);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"201\"/>\n        <source>Open Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"202\"/>\n        <source>Cannot open file:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"219\"/>\n        <source>Save SQL Query</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"231\"/>\n        <source>Save Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"232\"/>\n        <source>Cannot save file:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"239\"/>\n        <source>Query saved to %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"264\"/>\n        <source>Error: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"281\"/>\n        <source>%1 row(s) shown (truncated at %2) in %3 ms</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"285\"/>\n        <source>%1 row(s) returned in %2 ms</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"325\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"413\"/>\n        <source>Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"326\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"414\"/>\n        <source>No results to export.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"337\"/>\n        <source>Export Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"338\"/>\n        <source>Cannot open file for writing:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"374\"/>\n        <source>Exported %1 row(s) to %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"383\"/>\n        <source>Text Files (*.txt);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"401\"/>\n        <source>CSV Files (*.csv);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"432\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"473\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"485\"/>\n        <source>ADIF Export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"433\"/>\n        <source>ADIF export requires the query to include the contacts &apos;id&apos; column.\n\nExample:\n  SELECT id, callsign FROM contacts WHERE ...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"453\"/>\n        <source>No valid contact IDs found in the result set.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"474\"/>\n        <source>Failed to retrieve contact records:\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"486\"/>\n        <source>No matching contacts found in the database.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"530\"/>\n        <source>Logging rules cleared (defaults)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"537\"/>\n        <source>Logging rules applied</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"550\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"559\"/>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"580\"/>\n        <source>Save Debug Log</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"551\"/>\n        <source>No debug log file is currently being written</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"561\"/>\n        <source>Log Files (*.log);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"576\"/>\n        <source>Debug log saved to %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"581\"/>\n        <source>Failed to copy the debug log file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"592\"/>\n        <source>File logging is disabled</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DevToolsDialog.cpp\" line=\"594\"/>\n        <source>Log file: %1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>DownloadQSLDialog</name>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"6\"/>\n        <source>Download QSLs</source>\n        <translation>下载QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"15\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"24\"/>\n        <source>eQSL QTH Profile</source>\n        <translation>eQSL QTH昵称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"42\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"88\"/>\n        <source>QSLs Since</source>\n        <translation>QSLs自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"47\"/>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"93\"/>\n        <source>QSOs Since</source>\n        <translation>QSOs自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"68\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.ui\" line=\"77\"/>\n        <source>My Callsign</source>\n        <translation>我的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"28\"/>\n        <source>&amp;Download</source>\n        <translation>&amp;下载</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"46\"/>\n        <source>LoTW is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>LoTW 配置不正确。&lt;p&gt;请使用&lt;b&gt;设置&lt;/b&gt;对话框进行配置。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"53\"/>\n        <source>eQSL is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>eQSL 配置不正确。&lt;p&gt;请使用&lt;b&gt;设置&lt;/b&gt;对话框进行配置。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"129\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"134\"/>\n        <source>Downloading from %1</source>\n        <translation>从%1下载</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"140\"/>\n        <source>Processing %1 QSLs</source>\n        <translation>正在处理 %1 QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>QLog Error</source>\n        <translation>QLog错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"163\"/>\n        <source>%1 update failed: </source>\n        <translation>%1 更新失败: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>QLog Information</source>\n        <translation>QLog 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DownloadQSLDialog.cpp\" line=\"210\"/>\n        <source>No service selected</source>\n        <translation>未选择服务</translation>\n    </message>\n</context>\n<context>\n    <name>DxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"20\"/>\n        <source>DX Cluster Filters</source>\n        <translation>DX动态过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"39\"/>\n        <source>General Filters</source>\n        <translation>通用过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"45\"/>\n        <source>Bands</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"82\"/>\n        <source>Modes</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"99\"/>\n        <source>Phone</source>\n        <translation>语音通话</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"112\"/>\n        <source>CW</source>\n        <translation>CW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"125\"/>\n        <source>Digital</source>\n        <translation>数字模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"150\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"158\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"296\"/>\n        <source>North America</source>\n        <translation>北美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"193\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"317\"/>\n        <source>Africa</source>\n        <translation>非洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"179\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"289\"/>\n        <source>Antarctica</source>\n        <translation>南极洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"165\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"282\"/>\n        <source>South America</source>\n        <translation>南美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"200\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"303\"/>\n        <source>Asia</source>\n        <translation>亚洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"186\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"310\"/>\n        <source>Europe</source>\n        <translation>欧洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"138\"/>\n        <source>FTx (FT8/FT4)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"172\"/>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"324\"/>\n        <source>Oceania</source>\n        <translation>大洋洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"212\"/>\n        <source>Log Status</source>\n        <translation>日志状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"220\"/>\n        <source>New Mode</source>\n        <translation>新模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"227\"/>\n        <source>New Entity</source>\n        <translation>新实体</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"234\"/>\n        <source>New Band</source>\n        <translation>新波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"241\"/>\n        <source>New Slot</source>\n        <translation>新组合</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"248\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"255\"/>\n        <source>Confirmed</source>\n        <translation>已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"268\"/>\n        <source>Extended Filters</source>\n        <translation>扩展过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"274\"/>\n        <source>Spotter Continent</source>\n        <translation>报点者大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"336\"/>\n        <source>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</source>\n        <translation>若以下报点满足：呼号相同、时间差小于【时间差阈值】且频率差小于【频率差阈值】，则自动过滤</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"339\"/>\n        <source>Spots Dedup</source>\n        <translation>报点去重</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"366\"/>\n        <source>Time difference</source>\n        <translation>时间偏差</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"373\"/>\n        <source>s</source>\n        <translation>秒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"386\"/>\n        <source>Frequency difference</source>\n        <translation>频率偏差</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"393\"/>\n        <source> kHz</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.ui\" line=\"412\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxFilterDialog.cpp\" line=\"214\"/>\n        <source>No Club List is enabled</source>\n        <translation>未启用俱乐部列表</translation>\n    </message>\n</context>\n<context>\n    <name>DxTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"194\"/>\n        <source>Time</source>\n        <translation>时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"195\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"196\"/>\n        <source>Frequency</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"197\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"198\"/>\n        <source>Spotter</source>\n        <translation>报点者</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"199\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"200\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"201\"/>\n        <source>Spotter Continent</source>\n        <translation>报点者大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"202\"/>\n        <source>Band</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"203\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"204\"/>\n        <source>Country</source>\n        <translation>国家/地区</translation>\n    </message>\n</context>\n<context>\n    <name>DxWidget</name>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"77\"/>\n        <source>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</source>\n        <translation>增加 DXC 服务器 &lt;b&gt;hostname:port&lt;/b&gt;。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"110\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"709\"/>\n        <source>Connect</source>\n        <translation>连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"126\"/>\n        <source>Filtered</source>\n        <translation>过滤的内容</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"156\"/>\n        <source>Spots</source>\n        <translation>报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"161\"/>\n        <source>WCY</source>\n        <translation>WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"166\"/>\n        <source>WWV</source>\n        <translation>WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"171\"/>\n        <source>To All</source>\n        <translation>对所有人</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"176\"/>\n        <source>Console</source>\n        <translation>控制台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"181\"/>\n        <source>15-min Trend</source>\n        <translation>15分钟趋势</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"276\"/>\n        <source>Full-text search</source>\n        <translation>全文搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"279\"/>\n        <source>Search</source>\n        <translation>搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"289\"/>\n        <source>Close Search</source>\n        <translation>关闭搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"591\"/>\n        <source>Send DX Cluster Command</source>\n        <translation>发送 DX 集群命令</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"632\"/>\n        <source>Filter...</source>\n        <translation>过滤器...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"668\"/>\n        <source>Column Visibility...</source>\n        <translation>列可见性...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"679\"/>\n        <source>Connect on startup</source>\n        <translation>启动时自动连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"682\"/>\n        <source>Automatic connection after start</source>\n        <translation>程序启动后自动连接服务器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"687\"/>\n        <source>Delete Server</source>\n        <translation>删除服务器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"690\"/>\n        <source>DXC - Delete Server</source>\n        <translation>DXC - 删除服务器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"695\"/>\n        <source>Clear Password</source>\n        <translation>清除密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"703\"/>\n        <source>Keep Spots</source>\n        <translation>保留报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"706\"/>\n        <source>Spots are not cleared when connecting to a new DX Cluster.</source>\n        <translation>连接至新的 DX 集群后，不清除旧的报点。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"711\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"714\"/>\n        <source>Clear all data</source>\n        <translation>清除所有数据</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"719\"/>\n        <source>Search...</source>\n        <translation>搜索...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"722\"/>\n        <source>DXC - Search</source>\n        <translation>DXC - 搜索</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"635\"/>\n        <source>Filter DXC</source>\n        <translation>DXC 过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"640\"/>\n        <source>Spot Last QSO</source>\n        <translation>最后通联报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"643\"/>\n        <source>Send last QSO spot</source>\n        <translation>发送最后的通联报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"648\"/>\n        <source>Show HF Stats</source>\n        <translation>显示 HF 状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"653\"/>\n        <source>Show VHF Stats</source>\n        <translation>显示 VHF 状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"658\"/>\n        <source>Show WCY</source>\n        <translation>显示 WCY</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"663\"/>\n        <source>Show WWV</source>\n        <translation>显示 WWV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.ui\" line=\"671\"/>\n        <source>Which columns should be displayed</source>\n        <translation>应该显示哪些列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"558\"/>\n        <source>My Continent</source>\n        <translation>我的大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"563\"/>\n        <source>Auto</source>\n        <translation>自动</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"658\"/>\n        <source>Connecting...</source>\n        <translation>正在连接...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"703\"/>\n        <source>DX Cluster is temporarily unavailable</source>\n        <translation>DX 集群暂时不可用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"991\"/>\n        <source>DXC Server Error</source>\n        <translation>DXC 服务器出错</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"992\"/>\n        <source>An invalid callsign</source>\n        <translation>无效的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1003\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX 集群密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>Security Notice</source>\n        <translation>安全注意</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1004\"/>\n        <source>The password can be sent via an unsecured channel</source>\n        <translation>密码可能通过不安全的通道发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1006\"/>\n        <source>Server</source>\n        <translation>服务器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1008\"/>\n        <source>Username</source>\n        <translation>用户名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1283\"/>\n        <source>Disconnect</source>\n        <translation>断开连接</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1284\"/>\n        <source>DX Cluster Command</source>\n        <translation>DX集群命令</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableModel</name>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"63\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"64\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"65\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/DxccTableModel.cpp\" line=\"66\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n</context>\n<context>\n    <name>DxccTableWidget</name>\n    <message>\n        <location filename=\"../ui/DxccTableWidget.cpp\" line=\"90\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLQSLDownloader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"435\"/>\n        <source>Incorrect Password or QTHProfile Id</source>\n        <translation>无效的密码或者 QTH 配置文件 ID</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"454\"/>\n        <source>ADIF file not found in eQSL response</source>\n        <translation>在 eQSL 响应中找不到 ADIF 文件</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"470\"/>\n        <source>Incorrect Username or password</source>\n        <translation>用户名或密码不正确</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"506\"/>\n        <source>Unknown Error</source>\n        <translation>未知错误</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"530\"/>\n        <source>Cannot opet temporary file</source>\n        <translation>无法打开临时文件</translation>\n    </message>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"581\"/>\n        <source>Cannot save the image to file</source>\n        <translation>无法保存图像至文件</translation>\n    </message>\n</context>\n<context>\n    <name>EQSLUploader</name>\n    <message>\n        <location filename=\"../service/eqsl/Eqsl.cpp\" line=\"262\"/>\n        <source>Unknown Reply from eQSL</source>\n        <translation>来自 eQSL 的未知回复</translation>\n    </message>\n</context>\n<context>\n    <name>EditActivitiesDialog</name>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"14\"/>\n        <source>Edit Activities</source>\n        <translation>编辑活动</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"22\"/>\n        <source>Activities</source>\n        <translation>活动</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/EditActivitiesDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n</context>\n<context>\n    <name>ExportDialog</name>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"20\"/>\n        <source>Export Selected QSOs</source>\n        <translation>导出已选择的QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"29\"/>\n        <source>File</source>\n        <translation>文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"45\"/>\n        <source>Browse</source>\n        <translation>浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"68\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"73\"/>\n        <source>CSV</source>\n        <translation>CSV</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"78\"/>\n        <source>JSON</source>\n        <translation>JSON</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"83\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"380\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"106\"/>\n        <source>Export Type</source>\n        <translation>导出类型</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"123\"/>\n        <source>Column set</source>\n        <translation>列设置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"141\"/>\n        <source>Select one of the pre-defined sets of columns or define your own set of columns</source>\n        <translation>选择一个预定义的列集或定义您自己的列集</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"154\"/>\n        <source>Edit current set of columns</source>\n        <translation>编辑当前列集</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"157\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"166\"/>\n        <source>Mark exported QSOs As Sent</source>\n        <translation>将已导出的 QSOs 标记为已发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"182\"/>\n        <source>Export only QSOs that match the active filters</source>\n        <translation>只导出与活动过滤器匹配的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"185\"/>\n        <source>Filters</source>\n        <translation>过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"197\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"221\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"259\"/>\n        <source>Export only QSOs that match the selected date range</source>\n        <translation>只导出与所选日期范围匹配的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"200\"/>\n        <source>Date Range</source>\n        <translation>时间范围</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"284\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"297\"/>\n        <source>Export only QSOs that match the selected My Callsign</source>\n        <translation>只导出与所选“我的呼号”匹配的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"287\"/>\n        <source>My Callsign</source>\n        <translation>我的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"304\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"317\"/>\n        <source>Export only QSOs that match the selected My Gridsquare</source>\n        <translation>仅导出与所选&quot;我的网格坐标&quot;匹配的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"307\"/>\n        <source>My Gridsquare</source>\n        <translation>我的网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"324\"/>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"337\"/>\n        <source>Export only QSOs that match the selected QSL Send Via value</source>\n        <translation>仅导出与所选 QSL 发送经由 值匹配的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"327\"/>\n        <source>QSL Send via</source>\n        <translation>QSL 发送经由</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"344\"/>\n        <source>Include unusual QSO Sent statuses</source>\n        <translation>包括不寻常的 QSO 发送状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"347\"/>\n        <source>Include Sent Status</source>\n        <translation>包含发送状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"381\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>在正常情况下，此状态表示&lt;b&gt;“忽略/无效”&lt;/b&gt;。&lt;br/&gt;然而，有时可能希望在发送 QSL 时忽略此设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"384\"/>\n        <source>&quot;Ignore&quot;</source>\n        <translation>“忽略”</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"403\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>在正常情况下，此状态表示&lt;b&gt;“不发送”&lt;/b&gt;。&lt;br/&gt;然而，有时可能希望在发送 QSL 时忽略此设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"406\"/>\n        <source>&quot;No&quot;</source>\n        <translation>&quot;否&quot;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"435\"/>\n        <source>Resend already sent QSOs</source>\n        <translation>重新发送已发送过的 QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"438\"/>\n        <source>Already Sent</source>\n        <translation>已经发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"454\"/>\n        <source>User Filter</source>\n        <translation>用户过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"464\"/>\n        <source>Export QSOs that match the selected user QSO Filter</source>\n        <translation>导出匹配已选择的用户QSO过滤器的通联记录</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.ui\" line=\"471\"/>\n        <source>Station Profile</source>\n        <translation type=\"unfinished\">台站配置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"25\"/>\n        <source>Export QSOs</source>\n        <translation>导出 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"55\"/>\n        <source>&amp;Export</source>\n        <translation>导出(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"157\"/>\n        <source>Export only QSOs matching this station profile</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Exporting...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"247\"/>\n        <source>Cancel</source>\n        <translation type=\"unfinished\">取消</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"270\"/>\n        <source>QLog Error</source>\n        <translation>QLog 错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"271\"/>\n        <source>Cannot mark exported QSOs as Sent</source>\n        <translation>无法标记已导出的 QSOs 为已发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"333\"/>\n        <source>Generic</source>\n        <translation>常规</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"337\"/>\n        <source>QSLs</source>\n        <translation>QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"378\"/>\n        <source>All</source>\n        <translation>全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"379\"/>\n        <source>Minimal</source>\n        <translation>最小化</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"381\"/>\n        <source>QSL-specific</source>\n        <translation>QSL-特定</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"382\"/>\n        <source>Custom 1</source>\n        <translation>自定义1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"383\"/>\n        <source>Custom 2</source>\n        <translation>自定义2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"384\"/>\n        <source>Custom 3</source>\n        <translation>自定义3</translation>\n    </message>\n</context>\n<context>\n    <name>ExportPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"14\"/>\n        <source>Pack Data &amp; Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"20\"/>\n        <source>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"39\"/>\n        <source>Password</source>\n        <translation type=\"unfinished\">密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"49\"/>\n        <source>Random</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"61\"/>\n        <source>Confirm Password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportPasswordDialog.ui\" line=\"68\"/>\n        <source>Delete passwords from Credential Store after export</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>FlrigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>Timeout</source>\n        <translation>超时</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"691\"/>\n        <source>FLRig response timeout</source>\n        <translation>FLRig响应超时</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"956\"/>\n        <location filename=\"../rig/drivers/FlrigRigDrv.cpp\" line=\"969\"/>\n        <source>Network Error</source>\n        <translation>网络错误</translation>\n    </message>\n</context>\n<context>\n    <name>HRDLogUploader</name>\n    <message>\n        <location filename=\"../service/hrdlog/HRDLog.cpp\" line=\"289\"/>\n        <source>Response message malformed</source>\n        <translation>响应消息格式错误</translation>\n    </message>\n</context>\n<context>\n    <name>HamQTHCallbook</name>\n    <message>\n        <location filename=\"../service/hamqth/HamQTH.cpp\" line=\"79\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"57\"/>\n        <source>None</source>\n        <translation>无</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"58\"/>\n        <source>CAT</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"59\"/>\n        <source>DTR</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"60\"/>\n        <source>RTS</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"168\"/>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"206\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"241\"/>\n        <source>Cannot set PTT Type</source>\n        <translation>无法设置PTT类型</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"248\"/>\n        <source>Cannot set PTT Share</source>\n        <translation>无法设置共享PTT</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"261\"/>\n        <source>Cannot set CIV Addr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"269\"/>\n        <source>Unsupported Rig Driver</source>\n        <translation>不支持的设备驱动</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"276\"/>\n        <source>Cannot set auto_power_on</source>\n        <translation>无法设置自动开机</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"283\"/>\n        <source>Cannot set no_xchg to 1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"290\"/>\n        <source>Rig Open Error</source>\n        <translation>打开电台出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"385\"/>\n        <source>Set TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"390\"/>\n        <source>Set Frequency Error</source>\n        <translation>设置频率出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"428\"/>\n        <source>Set Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"477\"/>\n        <source>Set Mode Error</source>\n        <translation>设置模式出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"492\"/>\n        <source>Set Split Mode Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"516\"/>\n        <source>Set PTT Error</source>\n        <translation>设置 PTT 出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"583\"/>\n        <source>Cannot sent Morse</source>\n        <translation>无法发送摩尔斯</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"602\"/>\n        <source>Cannot stop Morse</source>\n        <translation>无法停止摩尔斯</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"753\"/>\n        <source>Get PTT Error</source>\n        <translation>获取PTT出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"788\"/>\n        <source>Get Frequency Error</source>\n        <translation>获取频率出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"834\"/>\n        <source>Get Mode Error</source>\n        <translation>获取模式出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"883\"/>\n        <source>Get VFO Error</source>\n        <translation>获取VFO出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"921\"/>\n        <source>Get PWR Error</source>\n        <translation>获取功率出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"925\"/>\n        <source>Get PWR (power2mw) Error</source>\n        <translation>获取功率（power2mw）出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"963\"/>\n        <source>Get RIT Function Error</source>\n        <translation>获取RIT功能出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"969\"/>\n        <source>Get RIT Error</source>\n        <translation>获取RIT出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1020\"/>\n        <source>Get XIT Function Error</source>\n        <translation>获取XIT功能出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1026\"/>\n        <source>Get XIT Error</source>\n        <translation>获取XIT出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1079\"/>\n        <source>Get Split Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1110\"/>\n        <source>Get TX Frequency Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1147\"/>\n        <source>Get KeySpeed Error</source>\n        <translation>获取电键速度出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/HamlibRigDrv.cpp\" line=\"1199\"/>\n        <source>Set KeySpeed Error</source>\n        <translation>设置电键速度出错</translation>\n    </message>\n</context>\n<context>\n    <name>HamlibRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"83\"/>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"122\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"147\"/>\n        <source>Unsupported Rotator Driver</source>\n        <translation>不支持的云台驱动</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"166\"/>\n        <source>Rot Open Error</source>\n        <translation>打开云台出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"256\"/>\n        <source>Set Possition Error</source>\n        <translation>设置方位出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/HamlibRotDrv.cpp\" line=\"330\"/>\n        <source>Get Possition Error</source>\n        <translation>获取方位出错</translation>\n    </message>\n</context>\n<context>\n    <name>ImportDialog</name>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"6\"/>\n        <source>Import</source>\n        <translation>导入</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"68\"/>\n        <source>Date Range</source>\n        <translation>日期范围</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"80\"/>\n        <source>Import all or only QSOs from the given period</source>\n        <translation>导入所有或仅导入指定时间段的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"83\"/>\n        <source>All</source>\n        <translation>全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"15\"/>\n        <source>File</source>\n        <translation>文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"33\"/>\n        <source>ADX</source>\n        <translation>ADX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"51\"/>\n        <source>Browse</source>\n        <translation>浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"241\"/>\n        <source>Options</source>\n        <translation>选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"145\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"109\"/>\n        <source>The value is used when an input record does not contain the ADIF value</source>\n        <translation>当输入记录不包含ADIF值时使用该值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"148\"/>\n        <source>Defaults</source>\n        <translation>默认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"160\"/>\n        <source>My Profile</source>\n        <translation>我的配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"176\"/>\n        <source>My Rig</source>\n        <translation>我的设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"205\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"110\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"247\"/>\n        <source>If DXCC is missing in the imported record, it will be resolved from the callsign.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.ui\" line=\"257\"/>\n        <source>Fill missing DXCC Entity Information</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"48\"/>\n        <source>&amp;Import</source>\n        <translation>导入(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"63\"/>\n        <source>Select File</source>\n        <translation>选择文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"138\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"147\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>当输入记录不包含ADIF值时，将使用下面的值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"163\"/>\n        <source>&lt;p&gt;&lt;b&gt;In-Log QSO:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;在日志 QSO：&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"167\"/>\n        <source>&lt;p&gt;&lt;b&gt;Importing:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</source>\n        <translation>&lt;p&gt;&lt;b&gt;导入中:&lt;/b&gt;&lt;/p&gt;&lt;p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"172\"/>\n        <source>Duplicate QSO</source>\n        <translation>重复的 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"173\"/>\n        <source>&lt;p&gt;Do you want to import duplicate QSO?&lt;/p&gt;%1 %2</source>\n        <translation>&lt;p&gt;是否要导入重复的QSO?&lt;/p&gt; %1 %2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"206\"/>\n        <source>Save to File</source>\n        <translation>保存至文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"219\"/>\n        <source>QLog Import Summary</source>\n        <translation>QLog 导入摘要</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"221\"/>\n        <source>Import date</source>\n        <translation>导入日期</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"222\"/>\n        <source>Imported file</source>\n        <translation>导入的文件</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"224\"/>\n        <source>Imported: %n contact(s)</source>\n        <translation>\n            <numerusform>已导入: %n 通联记录</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"225\"/>\n        <source>Warning(s): %n</source>\n        <translation>\n            <numerusform>告警: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"226\"/>\n        <source>Error(s): %n</source>\n        <translation>\n            <numerusform>错误: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"228\"/>\n        <source>Details</source>\n        <translation>详情</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"316\"/>\n        <source>Import Result</source>\n        <translation>导入结果</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"324\"/>\n        <source>Save Details...</source>\n        <translation>保存详情...</translation>\n    </message>\n</context>\n<context>\n    <name>InputPasswordDialog</name>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"14\"/>\n        <source>Dialog</source>\n        <translation>对话框</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"34\"/>\n        <source>The password will be stored in the Credential Store.</source>\n        <translation>密码将存储在凭据存储库中。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/InputPasswordDialog.ui\" line=\"37\"/>\n        <source>Remember Password</source>\n        <translation>记住密码</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChat</name>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"403\"/>\n        <source>Unknown User</source>\n        <translation>未知用户</translation>\n    </message>\n    <message>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"409\"/>\n        <source>Invalid password</source>\n        <translation>无效的密码</translation>\n    </message>\n</context>\n<context>\n    <name>KSTChatWidget</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"52\"/>\n        <source>Chat messages</source>\n        <translation>聊天消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"96\"/>\n        <source>Valuable messages</source>\n        <translation>有价值的消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"173\"/>\n        <source>Clear selected Callsign and Chat message entry.</source>\n        <translation>清除选定的呼号和聊天消息条目。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"195\"/>\n        <source>Send chat message</source>\n        <translation>发送聊天消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"207\"/>\n        <source>Column Visibility</source>\n        <translation>列可见性</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"210\"/>\n        <source>Which columns should be displayed</source>\n        <translation>应该显示哪些列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"215\"/>\n        <source>Prepare QSO</source>\n        <translation>准备 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"218\"/>\n        <source>Transfer Callsign and Gridsquare Information to the New QSO dialog</source>\n        <translation>将呼号和网格信息转移到新 QSO 对话框</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"226\"/>\n        <source>Show About Me Only</source>\n        <translation>只显示跟我有关</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"229\"/>\n        <source>Show only messages where my callsign is present</source>\n        <translation>只显示带有我呼号的信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"237\"/>\n        <source>Suppress User To User</source>\n        <translation>禁止用户对用户</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"240\"/>\n        <source>Suppress private messages between two callsigns</source>\n        <translation>禁止两个呼号之间的私信</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"248\"/>\n        <source>Highlight</source>\n        <translation>高亮</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"251\"/>\n        <source>Highlight messages based on the setting</source>\n        <translation>根据设置突出显示消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"256\"/>\n        <source>Highlight Rules</source>\n        <translation>高亮规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"261\"/>\n        <source>Beam</source>\n        <translation>波束</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"266\"/>\n        <source>Clear Messages</source>\n        <translation>清除消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.ui\" line=\"269\"/>\n        <source>Clear all messages in the window</source>\n        <translation>清除窗口内的所有消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"187\"/>\n        <source>You</source>\n        <translation>你</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlightRuleDetail</name>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"14\"/>\n        <source>Edit Rule</source>\n        <translation>编辑规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"24\"/>\n        <source>Rule Name</source>\n        <translation>规则名称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"38\"/>\n        <source>Chat Room</source>\n        <translation>聊天室</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"48\"/>\n        <source>Enabled</source>\n        <translation>启用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"65\"/>\n        <source>Highlight message which match</source>\n        <translation>突出显示匹配的消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"79\"/>\n        <source>All the following conditions</source>\n        <translation>以下所有条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"84\"/>\n        <source>Any of the following conditions</source>\n        <translation>以下任一条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.ui\" line=\"123\"/>\n        <source>Add Condition</source>\n        <translation>添加条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"23\"/>\n        <source>All</source>\n        <translation>全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"64\"/>\n        <source>Sender</source>\n        <translation>发送者</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"65\"/>\n        <source>Message</source>\n        <translation>信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"66\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"79\"/>\n        <source>Contains</source>\n        <translation>包含</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"80\"/>\n        <source>Starts with</source>\n        <translation>开始自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"105\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"137\"/>\n        <source>Must not be empty</source>\n        <translation>不能为空</translation>\n    </message>\n</context>\n<context>\n    <name>KSTHighlighterSettingDialog</name>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"14\"/>\n        <source>Highlight Rules</source>\n        <translation>高亮规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"22\"/>\n        <source>Rules</source>\n        <translation>规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"86\"/>\n        <source>Add</source>\n        <translation>添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"93\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.ui\" line=\"100\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"17\"/>\n        <source>Name</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlighterSettingDialog.cpp\" line=\"18\"/>\n        <source>State</source>\n        <translation>状态</translation>\n    </message>\n</context>\n<context>\n    <name>KeySequenceEdit</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"502\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n</context>\n<context>\n    <name>LoadDatabaseDialog</name>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"14\"/>\n        <source>Unpack Data &amp; Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"23\"/>\n        <source>Warning</source>\n        <translation type=\"unfinished\">告警</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"29\"/>\n        <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"39\"/>\n        <source>Select Database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"47\"/>\n        <source>File:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"61\"/>\n        <source>Browse</source>\n        <translation type=\"unfinished\">浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"73\"/>\n        <source>Status: No file selected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"86\"/>\n        <source>Decrypt Credentials</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"92\"/>\n        <source>Enter password to decrypt credentials</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.ui\" line=\"101\"/>\n        <source>Password:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"29\"/>\n        <source>Load &amp;&amp; Restart</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"115\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"127\"/>\n        <source>Invalid password</source>\n        <translation type=\"unfinished\">无效的密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"144\"/>\n        <source>Select Database File</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"146\"/>\n        <source>QLog Database Export (*.dbe);;All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"172\"/>\n        <source>Cannot create temporary file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"186\"/>\n        <source>Decompressing database...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"189\"/>\n        <source>Cannot decompress database file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"224\"/>\n        <source>Cannot open database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"247\"/>\n        <source>Valid database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"252\"/>\n        <source>Different platform</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"261\"/>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"303\"/>\n        <source>Password required to import credentials</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LoadDatabaseDialog.cpp\" line=\"266\"/>\n        <source>No encrypted credentials in database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LogFormat</name>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"377\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"672\"/>\n        <source>Cannot find My DXCC Entity Info</source>\n        <translation>无法找到我的DXCC实体信息</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"435\"/>\n        <source>A minimal set of fields not present (start_time, call, band, mode, station_callsign)</source>\n        <translation>需要提供最小字段集 (start_time, call, band, mode, station_callsign)</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"456\"/>\n        <source>Outside the selected Date Range</source>\n        <translation>超出指定的日期范围</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"484\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"511\"/>\n        <source>Duplicate</source>\n        <translation>重复</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"538\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"544\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"559\"/>\n        <source>DXCC Info is missing</source>\n        <translation>DXCC信息丢失</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"616\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"636\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"656\"/>\n        <source>no Station Callsign present</source>\n        <translation>未提供电台呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"758\"/>\n        <source>Cannot insert to database</source>\n        <translation>无法插入到数据库中</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"770\"/>\n        <source>Imported</source>\n        <translation>已导入</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1020\"/>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1108\"/>\n        <source>DXCC State:</source>\n        <translation>DXCC状态：</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1232\"/>\n        <source>Error</source>\n        <translation>错误</translation>\n    </message>\n    <message>\n        <location filename=\"../logformat/LogFormat.cpp\" line=\"1235\"/>\n        <source>Warning</source>\n        <translation>告警</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookModel</name>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"589\"/>\n        <source>QSO ID</source>\n        <translation>QSO ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"590\"/>\n        <source>Time on</source>\n        <translation>开始时间</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"591\"/>\n        <source>Time off</source>\n        <translation>结束时间</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"592\"/>\n        <source>Call</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"593\"/>\n        <source>RSTs</source>\n        <translation>RST发</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"594\"/>\n        <source>RSTr</source>\n        <translation>RST收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"595\"/>\n        <source>Frequency</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"59\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"596\"/>\n        <source>Band</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"63\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"597\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"598\"/>\n        <source>Submode</source>\n        <translation>子模式</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"599\"/>\n        <source>Name (ASCII)</source>\n        <translation>姓名(ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"600\"/>\n        <source>QTH (ASCII)</source>\n        <translation>QTH (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"75\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"601\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"602\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"603\"/>\n        <source>Country (ASCII)</source>\n        <translation>国家(ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"604\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"605\"/>\n        <source>CQZ</source>\n        <translation>CQ分区</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"606\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"607\"/>\n        <source>Prefix</source>\n        <translation>前缀</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"608\"/>\n        <source>State</source>\n        <translation>省</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"609\"/>\n        <source>County</source>\n        <translation>县/郡</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"611\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"612\"/>\n        <source>QSLr</source>\n        <translation>QSL收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"613\"/>\n        <source>QSLr Date</source>\n        <translation>QSL收日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"614\"/>\n        <source>QSLs</source>\n        <translation>QSL发</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"615\"/>\n        <source>QSLs Date</source>\n        <translation>QSL发日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"616\"/>\n        <source>LoTWr</source>\n        <translation>LoTW收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"617\"/>\n        <source>LoTWr Date</source>\n        <translation>LoTW收日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"618\"/>\n        <source>LoTWs</source>\n        <translation>LoTW发</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"619\"/>\n        <source>LoTWs Date</source>\n        <translation>LoTW发日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"620\"/>\n        <source>TX PWR</source>\n        <translation>发送功率</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"621\"/>\n        <source>Additional Fields</source>\n        <translation>附加字段</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"622\"/>\n        <source>Address (ASCII)</source>\n        <translation>地址 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"623\"/>\n        <source>Address</source>\n        <translation>地址</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"624\"/>\n        <source>Age</source>\n        <translation>年龄</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"625\"/>\n        <source>Altitude</source>\n        <translation>海拔</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"626\"/>\n        <source>A-Index</source>\n        <translation>A-指数</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"627\"/>\n        <source>Antenna Az</source>\n        <translation>天线方位</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"628\"/>\n        <source>Antenna El</source>\n        <translation>天线单元数</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"629\"/>\n        <source>Signal Path</source>\n        <translation>信号路径</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"630\"/>\n        <source>ARRL Section</source>\n        <translation>ARRL 划分</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"631\"/>\n        <source>Award Submitted</source>\n        <translation>已提交奖项</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"632\"/>\n        <source>Award Granted</source>\n        <translation>已授予奖项</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"633\"/>\n        <source>Band RX</source>\n        <translation>波段 RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"634\"/>\n        <source>Gridsquare Extended</source>\n        <translation>网格坐标扩展</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"635\"/>\n        <source>Contest Check</source>\n        <translation>竞赛检查</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"636\"/>\n        <source>Class</source>\n        <translation>等级</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"637\"/>\n        <source>ClubLog Upload Date</source>\n        <translation>ClubLog 上传日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"638\"/>\n        <source>ClubLog Upload State</source>\n        <translation>ClubLog 上传状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"639\"/>\n        <source>Comment (ASCII)</source>\n        <translation>备注 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"83\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"640\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"641\"/>\n        <source>Contacted Operator</source>\n        <translation>联系过的操作员</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"642\"/>\n        <source>Contest ID</source>\n        <translation>竞赛标识</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"55\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"643\"/>\n        <source>Country</source>\n        <translation>国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"610\"/>\n        <source>County Alt</source>\n        <translation>县/郡备用标识</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"644\"/>\n        <source>Credit Submitted</source>\n        <translation>积分已提交</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"645\"/>\n        <source>Credit Granted</source>\n        <translation>已授予的积分</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"646\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"647\"/>\n        <source>DCLr Date</source>\n        <translation>DCLr 日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"648\"/>\n        <source>DCLs Date</source>\n        <translation>DCLs 日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"649\"/>\n        <source>DCLr</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"650\"/>\n        <source>DCLs</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"651\"/>\n        <source>Distance</source>\n        <translation>距离</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"652\"/>\n        <source>Email</source>\n        <translation>电子邮件</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"653\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"723\"/>\n        <source>Owner Callsign</source>\n        <translation>主人呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"654\"/>\n        <source>eQSL AG</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"655\"/>\n        <source>eQSLr Date</source>\n        <translation>eQSL 接收日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"656\"/>\n        <source>eQSLs Date</source>\n        <translation>eQSL 发送日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"657\"/>\n        <source>eQSLr</source>\n        <translation>eQSL 接收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"658\"/>\n        <source>eQSLs</source>\n        <translation>eQSL 发送</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"659\"/>\n        <source>FISTS Number</source>\n        <translation>FISTS 序号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"660\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"661\"/>\n        <source>EME Init</source>\n        <translation>EME Init</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"662\"/>\n        <source>Frequency RX</source>\n        <translation>频率 RX</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"663\"/>\n        <source>Guest Operator</source>\n        <translation>客座操作员</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"664\"/>\n        <source>HamlogEU Upload Date</source>\n        <translation>HamlogEU 上传日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"665\"/>\n        <source>HamlogEU Upload Status</source>\n        <translation>HamlogEU 上传状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"666\"/>\n        <source>HamQTH Upload Date</source>\n        <translation>HamQTH 上传日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"667\"/>\n        <source>HamQTH Upload Status</source>\n        <translation>HamQTH 上传状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"668\"/>\n        <source>HRDLog Upload Date</source>\n        <translation>HRDLog 上传日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"669\"/>\n        <source>HRDLog Upload Status</source>\n        <translation>HRDLog 上传状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"670\"/>\n        <source>IOTA Island ID</source>\n        <translation>IOTA 岛屿 ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"671\"/>\n        <source>K-Index</source>\n        <translation>K-指数</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"672\"/>\n        <source>Latitude</source>\n        <translation>纬度</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"673\"/>\n        <source>Longitude</source>\n        <translation>经度</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"674\"/>\n        <source>Max Bursts</source>\n        <translation>最大流星散射爆发</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"677\"/>\n        <source>MS Shower Name</source>\n        <translation>流星雨名称</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"678\"/>\n        <source>My Altitude</source>\n        <translation>我的海拔</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"679\"/>\n        <source>My Antenna (ASCII)</source>\n        <translation>我的天线 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"680\"/>\n        <source>My Antenna</source>\n        <translation>我的天线</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"681\"/>\n        <source>My City (ASCII)</source>\n        <translation>我的城市 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"682\"/>\n        <source>My City</source>\n        <translation>我的城市</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"683\"/>\n        <source>My County</source>\n        <translation>我的县/郡</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"684\"/>\n        <source>My County Alt</source>\n        <translation>我的县/郡备用标识</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"685\"/>\n        <source>My Country (ASCII)</source>\n        <translation>我的国家/地区 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"686\"/>\n        <source>My Country</source>\n        <translation>我的国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"687\"/>\n        <source>My CQZ</source>\n        <translation>我的 CQ 分区</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"688\"/>\n        <source>My DARC DOK</source>\n        <translation>我的DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"689\"/>\n        <source>My DXCC</source>\n        <translation>我的 DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"690\"/>\n        <source>My FISTS</source>\n        <translation>我的 FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"691\"/>\n        <source>My Gridsquare</source>\n        <translation>我的网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"692\"/>\n        <source>My Gridsquare Extended</source>\n        <translation>我的网格扩展</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"693\"/>\n        <source>My IOTA</source>\n        <translation>我的 IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"694\"/>\n        <source>My IOTA Island ID</source>\n        <translation>我的 IOTA 海岛 ID</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"695\"/>\n        <source>My ITU</source>\n        <translation>我的 ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"696\"/>\n        <source>My Latitude</source>\n        <translation>我的纬度</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"697\"/>\n        <source>My Longitude</source>\n        <translation>我的经度</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"700\"/>\n        <source>My Name (ASCII)</source>\n        <translation>我的姓名 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"701\"/>\n        <source>My Name</source>\n        <translation>我的姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"702\"/>\n        <source>My Postal Code (ASCII)</source>\n        <translation>我的邮编 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"703\"/>\n        <source>My Postal Code</source>\n        <translation>我的邮编</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"704\"/>\n        <source>My POTA Ref</source>\n        <translation>我的 POTA 编号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"705\"/>\n        <source>My Rig (ASCII)</source>\n        <translation>我的设备 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"706\"/>\n        <source>My Rig</source>\n        <translation>我的设备</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"707\"/>\n        <source>My Special Interest Activity (ASCII)</source>\n        <translation>我的特殊兴趣活动 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"708\"/>\n        <source>My Special Interest Activity</source>\n        <translation>我的特殊兴趣活动</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"709\"/>\n        <source>My Spec. Interes Activity Info (ASCII)</source>\n        <translation>我的特殊兴趣活动信息 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"710\"/>\n        <source>My Spec. Interest Activity Info</source>\n        <translation>我的特殊兴趣活动信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"711\"/>\n        <source>My SOTA</source>\n        <translation>我的 SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"712\"/>\n        <source>My State</source>\n        <translation>我的省/州</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"713\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"714\"/>\n        <source>My Street</source>\n        <translation>我的街道</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"715\"/>\n        <source>My USA-CA Counties</source>\n        <translation>我的 USA-CA 县</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"716\"/>\n        <source>My VUCC Grids</source>\n        <translation>我的 VUCC 网格</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"717\"/>\n        <source>Name</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"718\"/>\n        <source>Notes (ASCII)</source>\n        <translation>笔记(ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"728\"/>\n        <source>QRZ Download Date</source>\n        <translation>QRZ下载数据</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"729\"/>\n        <source>QRZ Download Status</source>\n        <translation>QRZ下载状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"732\"/>\n        <source>QSLs Message (ASCII)</source>\n        <translation>QSLs 信息 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"733\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"734\"/>\n        <source>QSLr Message</source>\n        <translation>QSLr 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"744\"/>\n        <source>RcvPWR</source>\n        <translation>接收功率</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"755\"/>\n        <source>RcvNr</source>\n        <translation>接收序号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"756\"/>\n        <source>RcvExch</source>\n        <translation>接收交换信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"758\"/>\n        <source>SentNr</source>\n        <translation>发送序号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"759\"/>\n        <source>SentExch</source>\n        <translation>发送交换信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"87\"/>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"719\"/>\n        <source>Notes</source>\n        <translation>笔记</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"720\"/>\n        <source>#MS Bursts</source>\n        <translation>流星散射爆发数</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"721\"/>\n        <source>#MS Pings</source>\n        <translation>流星散射 ping 数</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"724\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"725\"/>\n        <source>Contest Precedence</source>\n        <translation>比赛优先</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"726\"/>\n        <source>Propagation Mode</source>\n        <translation>传播模式</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"727\"/>\n        <source>Public Encryption Key</source>\n        <translation>公钥加密算法</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"730\"/>\n        <source>QRZ Upload Date</source>\n        <translation>QRZ 上传日期</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"731\"/>\n        <source>QRZ Upload Status</source>\n        <translation>QRZ 上传状态</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"79\"/>\n        <source>QSL Message</source>\n        <translation>QSL 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"675\"/>\n        <source>CW Key Info</source>\n        <translation>CW电键信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"676\"/>\n        <source>CW Key Type</source>\n        <translation>CW电键类型</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"698\"/>\n        <source>My CW Key Info</source>\n        <translation>我的CW电键信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"699\"/>\n        <source>My CW Key Type</source>\n        <translation>我的CW电键类型</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"722\"/>\n        <source>Operator Callsign</source>\n        <translation>操作员呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"735\"/>\n        <source>QSLr Via</source>\n        <translation>QSL 接收经由</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"736\"/>\n        <source>QSLs Via</source>\n        <translation>QSL 发送经由</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"737\"/>\n        <source>QSL Via</source>\n        <translation>QSL 经由</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"738\"/>\n        <source>QSO Completed</source>\n        <translation>通联完成</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"739\"/>\n        <source>QSO Random</source>\n        <translation>随机通联</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"740\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"741\"/>\n        <source>Region</source>\n        <translation>地区</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"742\"/>\n        <source>Rig (ASCII)</source>\n        <translation>设备 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"743\"/>\n        <source>Rig</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"745\"/>\n        <source>SAT Mode</source>\n        <translation>卫星模式</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"746\"/>\n        <source>SAT Name</source>\n        <translation>卫星名称</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"747\"/>\n        <source>Solar Flux</source>\n        <translation>太阳通量</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"748\"/>\n        <source>SIG (ASCII)</source>\n        <translation>特别活动或兴趣团体名 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"749\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"750\"/>\n        <source>SIG Info (ASCII)</source>\n        <translation>特别活动或兴趣团体信息 (ASCII)</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"751\"/>\n        <source>SIG Info</source>\n        <translation>SIG 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"752\"/>\n        <source>Silent Key</source>\n        <translation>静默电键</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"753\"/>\n        <source>SKCC Member</source>\n        <translation>SKCC 成员</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"754\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"757\"/>\n        <source>Logging Station Callsign</source>\n        <translation>日志电台呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"760\"/>\n        <source>SWL</source>\n        <translation>SWL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"761\"/>\n        <source>Ten-Ten Number</source>\n        <translation>Ten-Ten 序号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"762\"/>\n        <source>UKSMG Member</source>\n        <translation>UKSMG 成员</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"763\"/>\n        <source>USA-CA Counties</source>\n        <translation>USA-CA 县</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"764\"/>\n        <source>VE Prov</source>\n        <translation>VE 省</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"765\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"766\"/>\n        <source>Web</source>\n        <translation>网站</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"767\"/>\n        <source>My ARRL Section</source>\n        <translation>我的 ARRL 划分</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"768\"/>\n        <source>My WWFF</source>\n        <translation>我的 WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"769\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"67\"/>\n        <source>RST Sent</source>\n        <translation>RST 发</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"71\"/>\n        <source>RST Rcvd</source>\n        <translation>RST 收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"94\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"97\"/>\n        <source>QSL Received</source>\n        <translation>QSL 已接收</translation>\n    </message>\n    <message>\n        <location filename=\"../models/LogbookModel.cpp\" line=\"109\"/>\n        <source>QSL Sent</source>\n        <translation>QSL 已发送</translation>\n    </message>\n</context>\n<context>\n    <name>LogbookWidget</name>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"236\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"897\"/>\n        <source>Delete</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"239\"/>\n        <source>Logbook - Delete QSO</source>\n        <translation>日志本 - 删除 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"254\"/>\n        <source>Upload to Clublog</source>\n        <translation>上传至Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"263\"/>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"266\"/>\n        <source>Lookup on Web</source>\n        <translation>在网页中查看</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"275\"/>\n        <source>Update from Callbook</source>\n        <translation>从电台黄页更新</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"278\"/>\n        <source>Add Missing Info</source>\n        <translation>添加丢失的信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"283\"/>\n        <source>Mark QSL RCVD</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"288\"/>\n        <source>Mark QSL Requested</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"297\"/>\n        <source>Filter Callsign</source>\n        <translation>过滤呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"302\"/>\n        <source>Edit Value</source>\n        <translation>编辑值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"305\"/>\n        <source>Logbook - Edit Value</source>\n        <translation>日志本 - 编辑值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"310\"/>\n        <source>Column Visibility </source>\n        <translation>列可见性 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"313\"/>\n        <source>Which columns should be displayed</source>\n        <translation>应该显示哪些列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"322\"/>\n        <source>Export Selected</source>\n        <translation>导出已选择项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"325\"/>\n        <source>Export selected QSOs</source>\n        <translation>导出已选择的QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"330\"/>\n        <source>Send DX Spot</source>\n        <translation>发送DX报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"333\"/>\n        <source>Logbook - Send DX Spot</source>\n        <translation>Logbook - 发送DX报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"341\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"543\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"349\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"554\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"357\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"562\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"365\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"570\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"373\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"578\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"381\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"586\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.ui\" line=\"389\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"594\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"877\"/>\n        <source>Delete the selected contacts?</source>\n        <translation>删除选中的联系人?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"898\"/>\n        <source>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</source>\n        <translation>Clublog&apos;s &lt;b&gt;Immediately Send&lt;/b&gt; supports only one-by-one deletion&lt;br&gt;&lt;br&gt;Do you want to continue despite the fact&lt;br&gt;that the DELETE operation will not be sent to Clublog?</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"916\"/>\n        <source>Deleting QSOs</source>\n        <translation>删除 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"997\"/>\n        <source>Update</source>\n        <translation>更新</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"998\"/>\n        <source>By updating, all selected rows will be affected.&lt;br&gt;The value currently edited in the column will be applied to all selected rows.&lt;br&gt;&lt;br&gt;Do you want to edit them?</source>\n        <translation>通过更新，所有选定的行都将受到影响。&lt;br&gt;当前在列中编辑的值将应用于所有选定的行。&lt;br&gt;&lt;br&gt;您想要编辑他们吗？</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1048\"/>\n        <source>Count: %n</source>\n        <translation>\n            <numerusform>计数：%n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>正在下载 eQSL 图片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"374\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"917\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1144\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"262\"/>\n        <source>All Bands</source>\n        <translation>所有波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"270\"/>\n        <source>All Modes</source>\n        <translation>所有模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"280\"/>\n        <source>All Countries</source>\n        <translation>所有国家和地区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"291\"/>\n        <source>No User Filter</source>\n        <translation>无用户筛选器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>QLog Warning</source>\n        <translation>QLog警告</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"369\"/>\n        <source>Each batch supports up to 100 QSOs.</source>\n        <translation>每个批次最多支持 100 个 QSO。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"373\"/>\n        <source>QSOs Update Progress</source>\n        <translation>QSO更新进度</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>QLog Error</source>\n        <translation>QLog 错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"527\"/>\n        <source>Callbook login failed</source>\n        <translation>电台黄页登陆失败</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"535\"/>\n        <source>Callbook error: </source>\n        <translation>电台黄页错误: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"782\"/>\n        <source>All Clubs</source>\n        <translation>所有俱乐部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/LogbookWidget.cpp\" line=\"1162\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>eQSL 图片下载失败: </translation>\n    </message>\n</context>\n<context>\n    <name>LotwQSLDownloader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"503\"/>\n        <source>Cannot open temporary file</source>\n        <translation>无法打开临时文件</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"515\"/>\n        <source>Incorrect login or password</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>LotwUploader</name>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"333\"/>\n        <source>Upload cancelled by user</source>\n        <translation>用户取消上传</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"337\"/>\n        <source>Upload rejected by LoTW</source>\n        <translation>上传被 LoTW 拒绝</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"341\"/>\n        <source>Unexpected response from TQSL server</source>\n        <translation>来自 TQSL 服务器的意外响应</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"345\"/>\n        <source>TQSL utility error</source>\n        <translation>TQS L实用程序错误</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"349\"/>\n        <source>TQSLlib error</source>\n        <translation>TQSLlib 错误</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"353\"/>\n        <source>Unable to open input file</source>\n        <translation>无法打开输入文件</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"357\"/>\n        <source>Unable to open output file</source>\n        <translation>无法打开输出文件</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"361\"/>\n        <source>All QSOs were duplicates or out of date range</source>\n        <translation>所有 QSO 都是重复的或超出了日期范围</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"365\"/>\n        <source>Some QSOs were duplicates or out of date range</source>\n        <translation>部分 QSO 是重复的或超出了日期范围</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"369\"/>\n        <source>Command syntax error</source>\n        <translation>命令语法错误</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"373\"/>\n        <source>LoTW Connection error (no network or LoTW is unreachable)</source>\n        <translation>LoTW 连接错误 (没有网络或 LoTW 不可达)</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"377\"/>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"397\"/>\n        <source>Unexpected Error from TQSL</source>\n        <translation>来自 TQSL 的意外错误</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"390\"/>\n        <source>TQSL not found</source>\n        <translation>未找到 TQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../service/lotw/Lotw.cpp\" line=\"394\"/>\n        <source>TQSL crashed</source>\n        <translation>TQSL 已崩溃</translation>\n    </message>\n</context>\n<context>\n    <name>MainWindow</name>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"60\"/>\n        <source>&amp;File</source>\n        <translation>文件(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"71\"/>\n        <source>&amp;Logbook</source>\n        <translation>日志本(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"88\"/>\n        <source>&amp;Equipment</source>\n        <translation>设备(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"96\"/>\n        <source>&amp;Help</source>\n        <translation>帮助(&amp;H)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"109\"/>\n        <source>&amp;Window</source>\n        <translation>窗口(&amp;W)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"126\"/>\n        <source>Se&amp;rvice</source>\n        <translation>服务(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"182\"/>\n        <source>Toolbar</source>\n        <translation>工具栏</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"210\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"567\"/>\n        <source>Clock</source>\n        <translation>时钟</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"219\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"473\"/>\n        <source>Map</source>\n        <translation>地图</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"232\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"461\"/>\n        <source>DX Cluster</source>\n        <translation>DX动态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"241\"/>\n        <source>WSJTX</source>\n        <translation>WSJTX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"250\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"543\"/>\n        <source>Rotator</source>\n        <translation>云台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"259\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"551\"/>\n        <source>Bandmap</source>\n        <translation>波段地图</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"268\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"559\"/>\n        <source>Rig</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"277\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"587\"/>\n        <source>Online Map</source>\n        <translation>在线地图</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"286\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"646\"/>\n        <source>CW Console</source>\n        <translation>CW 控制台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"295\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"701\"/>\n        <source>Chat</source>\n        <translation>聊天</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"304\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"731\"/>\n        <source>Profile Image</source>\n        <translation>资料图片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"313\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"918\"/>\n        <source>Alerts</source>\n        <translation>提醒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"347\"/>\n        <source>&amp;Settings</source>\n        <translation>设置（&amp;S）</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"393\"/>\n        <source>&amp;Import</source>\n        <translation>导入(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"405\"/>\n        <source>&amp;Export</source>\n        <translation>导出(&amp;E)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"416\"/>\n        <source>Connect R&amp;ig</source>\n        <translation>连接设备(&amp;I)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"431\"/>\n        <source>&amp;About</source>\n        <translation>关于(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1042\"/>\n        <source>Upload</source>\n        <translation>上传</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1045\"/>\n        <source>Service - Upload QSOs</source>\n        <translation>服务-上传 QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1059\"/>\n        <source>Download QSLs</source>\n        <translation>下载 QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1062\"/>\n        <source>Service - Download QSLs</source>\n        <translation>服务-下载 QSLs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"326\"/>\n        <source>Quit</source>\n        <translation>退出</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"329\"/>\n        <source>Application - Quit</source>\n        <translation>程序 - 退出</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"375\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"378\"/>\n        <source>New QSO - Clear</source>\n        <translation>新 QSO - 清除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"443\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"446\"/>\n        <source>New QSO - Save</source>\n        <translation>新 QSO - 保存</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"485\"/>\n        <source>S&amp;tatistics</source>\n        <translation>统计(&amp;T)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"524\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"535\"/>\n        <source>Connect R&amp;otator</source>\n        <translation>连接云台(&amp;O)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"579\"/>\n        <source>QSO &amp;Filters</source>\n        <translation>QSO过滤(&amp;F)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"599\"/>\n        <source>&amp;Awards</source>\n        <translation>奖项(&amp;A)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"622\"/>\n        <source>Edit Rules</source>\n        <translation>编辑规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"926\"/>\n        <source>Clear</source>\n        <translation>清除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"934\"/>\n        <source>Show Alerts</source>\n        <translation>显示提醒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"633\"/>\n        <source>Beep</source>\n        <translation>鸣响</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"133\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1700\"/>\n        <source>Contest</source>\n        <translation>比赛</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"137\"/>\n        <source>Dupe Check</source>\n        <translation>查重</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"146\"/>\n        <source>Sequence</source>\n        <translation>序列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"155\"/>\n        <source>Linking Exchange With</source>\n        <translation>链接交换信息至</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"355\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1139\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1147\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1168\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1184\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1198\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1204\"/>\n        <source>Pack Data &amp;&amp; Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"363\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1271\"/>\n        <source>Unpack Data &amp;&amp; Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"493\"/>\n        <source>QSL &amp;Gallery</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"505\"/>\n        <source>Developer Tools</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"508\"/>\n        <source>Run custom read-only SQL queries against the logbook database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"516\"/>\n        <source>Print QSL &amp;Labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"611\"/>\n        <source>DXCC &amp;Submission List</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"614\"/>\n        <source>Generate a list of contacts to submit for ARRL DXCC award credit</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"641\"/>\n        <source>Connect &amp;CW Keyer</source>\n        <translation>连接CW键(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"658\"/>\n        <source>&amp;Wiki</source>\n        <translation>&amp;Wiki</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"666\"/>\n        <source>Report &amp;Bug...</source>\n        <translation>报告&amp;Bug...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"677\"/>\n        <source>&amp;Manual Entry</source>\n        <translation>手动输入(&amp;M)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"680\"/>\n        <source>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</source>\n        <translation>将 “新建联系人” 对话框切换到手动输入模式&lt;br/&gt;(时间、频率、配置文件等不是从它们的公共来源中获取)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"688\"/>\n        <source>Mailing List...</source>\n        <translation>邮件列表 ...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"696\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"709\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"712\"/>\n        <source>Save Arrangement</source>\n        <translation>保存布局</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"723\"/>\n        <source>Keep Options</source>\n        <translation>保持选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"726\"/>\n        <source>Restore connection options after application restart</source>\n        <translation>应用程序重新启动后恢复连接选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"742\"/>\n        <source>Logbook - Search Callsign</source>\n        <translation>日志本 - 查找呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"759\"/>\n        <location filename=\"../ui/MainWindow.ui\" line=\"762\"/>\n        <source>New QSO - Add text from Callsign field to Bandmap</source>\n        <translation>新 QSO - 将呼号字段文本添加到波段图上</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"779\"/>\n        <source>Rig - Band Down</source>\n        <translation>设备 - 波段向下</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"796\"/>\n        <source>Rig - Band Up</source>\n        <translation>设备 - 波段向上</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"813\"/>\n        <source>New QSO - Use Callsign from the Whisperer</source>\n        <translation>新 QSO - 使用来自 Whisperer 的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"830\"/>\n        <source>CW Console - Key Speed Up</source>\n        <translation>CW 控制台 - 增加键速</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"847\"/>\n        <source>CW Console - Key Speed Down</source>\n        <translation>CW 控制台 - 减慢键速</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"864\"/>\n        <source>CW Console - Profile Up</source>\n        <translation>CW 控制台 - 上一个配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"881\"/>\n        <source>CW Console - Profile Down</source>\n        <translation>CW 控制台 - 下一个配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"898\"/>\n        <source>Rig - PTT On/Off</source>\n        <translation>设备 - PTT ON/OFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"945\"/>\n        <source>All Bands</source>\n        <translation>全部波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"956\"/>\n        <source>Each Band</source>\n        <translation>每个波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"967\"/>\n        <source>Each Band &amp;&amp; Mode</source>\n        <translation>每个波段 &amp;&amp; 模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"978\"/>\n        <source>No Check</source>\n        <translation>不做检查</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"989\"/>\n        <source>Single</source>\n        <translation>统一值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1000\"/>\n        <source>Per Band</source>\n        <translation>各波段独立</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1011\"/>\n        <source>Stop</source>\n        <translation>停止</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1019\"/>\n        <source>Reset</source>\n        <translation>重置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1030\"/>\n        <source>None</source>\n        <translation>无</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1079\"/>\n        <source>Theme: Native</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1090\"/>\n        <source>Theme: QLog Light</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1101\"/>\n        <source>Theme: QLog Dark</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1109\"/>\n        <source>What&apos;s New</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.ui\" line=\"1117\"/>\n        <source>Export Cabrillo</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"75\"/>\n        <source>Color Theme</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"98\"/>\n        <source>Not enabled for non-Fusion style</source>\n        <translation>非融合样式不允许使用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"173\"/>\n        <source>Press to tune the alert</source>\n        <translation>按下调节提醒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"423\"/>\n        <source>Clublog Immediately Upload Error</source>\n        <translation>Clublog 立即上传出错</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"643\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"653\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"663\"/>\n        <source>&lt;b&gt;Error Detail:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;错误详情:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"687\"/>\n        <source>op: </source>\n        <translation>操作员: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"864\"/>\n        <source>A New Version</source>\n        <translation>新版本</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"865\"/>\n        <source>A new version %1 is available.</source>\n        <translation>新版本 %1 可用。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"869\"/>\n        <source>Remind Me Later</source>\n        <translation>稍后提醒我</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"870\"/>\n        <source>Download</source>\n        <translation>下载</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1140\"/>\n        <source>Failed to encrypt credentials.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1149\"/>\n        <source>Database files (*.dbe);;All files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1169\"/>\n        <source>Failed to create temporary file.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1185\"/>\n        <source>Failed to dump the database.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1190\"/>\n        <source>Compressing database...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1199\"/>\n        <source>Database successfully dumped to\n%1</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1205\"/>\n        <source>Failed to compress the database.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1272\"/>\n        <source>Failed to prepare database for import.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1449\"/>\n        <source>Classic</source>\n        <translation>经典</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1701\"/>\n        <source>Do you want to remove the Contest filter %1?</source>\n        <translation>你要删除比赛过滤器 %1 吗？</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1732\"/>\n        <source>Contest: </source>\n        <translation>比赛: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1927\"/>\n        <source>&lt;h1&gt;QLog %1&lt;/h1&gt;&lt;p&gt;&amp;copy; 2019 Thomas Gatzweiler DL2IC&lt;br/&gt;&amp;copy; 2021-2026 Ladislav Foldyna OK1MLG&lt;br/&gt;&amp;copy; 2025-2026 Michael Morgan AA5SH&lt;br/&gt;&amp;copy; 2025-2026 Kyle Boyle VE9KZ&lt;/p&gt;&lt;p&gt;Based on Qt %2&lt;br/&gt;%3&lt;br/&gt;%4&lt;br/&gt;%5&lt;/p&gt;&lt;p&gt;Icon by &lt;a href=&apos;http://www.iconshock.com&apos;&gt;Icon Shock&lt;/a&gt;&lt;br /&gt;Satellite images by &lt;a href=&apos;http://www.nasa.gov&apos;&gt;NASA&lt;/a&gt;&lt;br /&gt;ZoneDetect by &lt;a href=&apos;https://github.com/BertoldVdb/ZoneDetect&apos;&gt;Bertold Van den Bergh&lt;/a&gt;&lt;br /&gt;TimeZone Database by &lt;a href=&apos;https://github.com/evansiroky/timezone-boundary-builder&apos;&gt;Evan Siroky&lt;/a&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"1958\"/>\n        <source>About</source>\n        <translation>关于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"2009\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n</context>\n<context>\n    <name>MapWebChannelHandler</name>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"36\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"68\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"145\"/>\n        <source>Grid</source>\n        <translation>网格</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"39\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"71\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"148\"/>\n        <source>Gray-Line</source>\n        <translation>灰线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"42\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"74\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"139\"/>\n        <source>Beam</source>\n        <translation>波束</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"45\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"77\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"136\"/>\n        <source>Aurora</source>\n        <translation>极光</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"48\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"80\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"154\"/>\n        <source>MUF</source>\n        <translation>MUF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"51\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"83\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"151\"/>\n        <source>IBP</source>\n        <translation>IBP</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"54\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"86\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"142\"/>\n        <source>Chat</source>\n        <translation>聊天</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"57\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"89\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"157\"/>\n        <source>WSJTX - CQ</source>\n        <translation>WSJTX - CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"60\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"92\"/>\n        <location filename=\"../ui/MapWebChannelHandler.cpp\" line=\"160\"/>\n        <source>Path</source>\n        <translation>路径</translation>\n    </message>\n</context>\n<context>\n    <name>NewContactWidget</name>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"107\"/>\n        <source>Frequency</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"128\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"204\"/>\n        <source>RX: </source>\n        <translation>接收: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"252\"/>\n        <source>TX: </source>\n        <translation>发射: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"274\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"319\"/>\n        <source>80m</source>\n        <translation>80m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"328\"/>\n        <source>RSTs</source>\n        <translation>RST发</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"335\"/>\n        <source>RSTr</source>\n        <translation>RST收</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"390\"/>\n        <source>59</source>\n        <translation>59</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"439\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"594\"/>\n        <source>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</source>\n        <translation>在网络上查找呼号。查询 URL 可以在 &lt;b&gt;设置 -&gt; 电台黄页&lt;/b&gt; 中更改</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"597\"/>\n        <source>Web</source>\n        <translation>网站</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"677\"/>\n        <source>Time On</source>\n        <translation>开始时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"736\"/>\n        <source>Date</source>\n        <translation>日期</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1414\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X统计</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1429\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC 统计&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1494\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;电台统计&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"545\"/>\n        <source>Save</source>\n        <translation>保存</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"743\"/>\n        <source>Duration</source>\n        <translation>周期</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"693\"/>\n        <source>Reset</source>\n        <translation>重置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"176\"/>\n        <source>&lt;b&gt;DUPE !!!&lt;/b&gt;</source>\n        <translation>&lt;b&gt;重复通联 !!!&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"806\"/>\n        <source>Info</source>\n        <translation>信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1044\"/>\n        <source>&amp;Details</source>\n        <translation>详情(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1069\"/>\n        <source>QSL Send Status</source>\n        <translation>QSL 发送状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1084\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1222\"/>\n        <source>Paper</source>\n        <translation>卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1106\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1144\"/>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1182\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;是&lt;/b&gt; -已发出 QSL 卡; QSO 已上传至在线服务&lt;br/&gt;&lt;b&gt;否&lt;/b&gt; -不发送 QSL 卡;&lt;br/&gt;&lt;b&gt;已请求&lt;/b&gt; -被联系站点已请求一张 QSL 卡; 被联系站点已请求将 QSO 上传到在线服务&lt;br/&gt;&lt;b&gt;排队&lt;/b&gt; 已选择要发送的 QSL 卡; QSO 已上传至网上服务&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1122\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1160\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1207\"/>\n        <source>QSL Send via</source>\n        <translation>QSL 发送通过</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1266\"/>\n        <source>QSL via</source>\n        <translation>QSL 通过</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1379\"/>\n        <source>Propagation Mode</source>\n        <translation>传播模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1551\"/>\n        <source>M&amp;y Station</source>\n        <translation>我的电台(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1559\"/>\n        <source>Station</source>\n        <translation>电台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1576\"/>\n        <source>Rig</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1599\"/>\n        <source>Antenna</source>\n        <translation>天线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4151\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4152\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1644\"/>\n        <source>My &amp;Notes</source>\n        <translation>我的笔记(&amp;N)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.ui\" line=\"1687\"/>\n        <source>Member:</source>\n        <translation>成员:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"100\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"113\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"126\"/>\n        <source>No</source>\n        <translation>否</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"101\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"114\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"127\"/>\n        <source>Yes</source>\n        <translation>是</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"102\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"115\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"128\"/>\n        <source>Requested</source>\n        <translation>已请求</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"103\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"116\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"129\"/>\n        <source>Queued</source>\n        <translation>排队中</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"104\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"117\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"130\"/>\n        <source>Ignored</source>\n        <translation>已忽视</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"140\"/>\n        <source>Bureau</source>\n        <translation>卡片局</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"141\"/>\n        <source>Direct</source>\n        <translation>直邮</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"142\"/>\n        <source>Electronic</source>\n        <translation>电子卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>QLog Error</source>\n        <translation>QLog错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"226\"/>\n        <source>Callbook login failed</source>\n        <translation>电台黄页登陆失败</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2215\"/>\n        <source>LP</source>\n        <translation>长路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2267\"/>\n        <source>New Entity!</source>\n        <translation>新实体！</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2270\"/>\n        <source>New Band!</source>\n        <translation>新波段！</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2273\"/>\n        <source>New Mode!</source>\n        <translation>新模式！</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2276\"/>\n        <source>New Band &amp; Mode!</source>\n        <translation>新波段与模式！</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2279\"/>\n        <source>New Slot!</source>\n        <translation>新组合！</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2282\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"2285\"/>\n        <source>Confirmed</source>\n        <translation>已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3163\"/>\n        <source>GE</source>\n        <translation>GE</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3173\"/>\n        <source>GM</source>\n        <translation>GM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3179\"/>\n        <source>GA</source>\n        <translation>GA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3497\"/>\n        <source> m</source>\n        <translation> m</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3880\"/>\n        <source>Callbook search is active</source>\n        <translation>电台黄页搜索可用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3958\"/>\n        <source>Contest ID must be filled in to activate</source>\n        <translation>必须填写 竞赛标识 才能激活</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4139\"/>\n        <source>It is not the name of the contest but it is an assigned&lt;br&gt;Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) </source>\n        <translation>这里要填的不是比赛名称，而是分配的竞赛标识&lt;br&gt;（例如CQ-WW-CW 代表CQ WW DX比赛(CW)） </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4154\"/>\n        <source>Description of the contacted station&apos;s equipment</source>\n        <translation>已通联台站的设备描述</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"3875\"/>\n        <source>Callbook search is inactive</source>\n        <translation>电台黄页搜索不可用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"71\"/>\n        <source>Expand/Collapse</source>\n        <translation>展开/折叠</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4080\"/>\n        <source>two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>两个或四个相邻的梅登黑德网格定位器，每个四个字符长，(例如 EN98, FM08, EM97, FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4083\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>联络电台的DARC DOK (地区位置代码) (例如 A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4103\"/>\n        <source>World Wide Flora &amp; Fauna</source>\n        <translation>世界动植物 (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4107\"/>\n        <source>Special Activity Group</source>\n        <translation>特别活动或兴趣团体名称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"4111\"/>\n        <source>Special Activity Group Information</source>\n        <translation>特别活动或兴趣团体信息</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"48\"/>\n        <source>Rig 1</source>\n        <translation>设备 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"49\"/>\n        <source>Rig 2</source>\n        <translation>设备 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"129\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"221\"/>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"261\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1036\"/>\n        <source>Rig status changed</source>\n        <translation>设备状态已更改</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/OmnirigRigDrv.cpp\" line=\"1037\"/>\n        <source>Rig is not connected</source>\n        <translation>设备未连接</translation>\n    </message>\n</context>\n<context>\n    <name>OmnirigV2RigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"47\"/>\n        <source>Rig 1</source>\n        <translation>设备 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"48\"/>\n        <source>Rig 2</source>\n        <translation>设备 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"49\"/>\n        <source>Rig 3</source>\n        <translation>设备 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"50\"/>\n        <source>Rig 4</source>\n        <translation>设备 4</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"132\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"224\"/>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"266\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"936\"/>\n        <source>Rig status changed</source>\n        <translation>设备状态已更改</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/Omnirigv2RigDrv.cpp\" line=\"937\"/>\n        <source>Rig is not connected</source>\n        <translation>设备未连接</translation>\n    </message>\n</context>\n<context>\n    <name>PSTRotDrv</name>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"21\"/>\n        <source>Rot 1</source>\n        <translation>云台 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"60\"/>\n        <source>Cannot bind a port</source>\n        <translation>无法绑定端口</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"70\"/>\n        <source>Cannot get IP Address for</source>\n        <translation>无法获取 IP 地址给</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"89\"/>\n        <source>No IPv4 Address for</source>\n        <translation>无法获取 IPv4 地址给</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"107\"/>\n        <source>Error Occurred</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/drivers/PSTRotDrv.cpp\" line=\"108\"/>\n        <source>Operation Timeout</source>\n        <translation>操作超时</translation>\n    </message>\n</context>\n<context>\n    <name>PaperQSLDialog</name>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"14\"/>\n        <source>Manage QSL Card</source>\n        <translation>管理 QSL 卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"23\"/>\n        <source>Available QSLs</source>\n        <translation>可用的 QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"37\"/>\n        <source>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</source>\n        <translation>将输入文件从源文件夹复制到 “QLog 内部 QSL 存储” 文件夹中。&lt;br/&gt;原始文件在源文件夹中保持不变</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.ui\" line=\"40\"/>\n        <source>Import QSL</source>\n        <translation>导入 QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"48\"/>\n        <source>Add File</source>\n        <translation>添加文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"119\"/>\n        <source>Remove</source>\n        <translation>移除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"127\"/>\n        <source>Delete QSL?</source>\n        <translation>删除 QSL？</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"147\"/>\n        <source>Open</source>\n        <translation>打开</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PaperQSLDialog.cpp\" line=\"161\"/>\n        <source>Toggle Favorite</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>PlatformSettingsDialog</name>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"14\"/>\n        <source>Platform-specific Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"23\"/>\n        <source>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"54\"/>\n        <source>Setting</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.ui\" line=\"59\"/>\n        <source>Value</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"28\"/>\n        <source>Continue</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"178\"/>\n        <source>Select File</source>\n        <translation type=\"unfinished\">选择文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/PlatformSettingsDialog.cpp\" line=\"180\"/>\n        <source>All Files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>ProfileImageWidget</name>\n    <message>\n        <location filename=\"../ui/ProfileImageWidget.ui\" line=\"14\"/>\n        <source>Profile Image</source>\n        <translation>资料图片</translation>\n    </message>\n</context>\n<context>\n    <name>QCoreApplication</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"307\"/>\n        <source>QLog Help</source>\n        <translation>QLog 帮助</translation>\n    </message>\n</context>\n<context>\n    <name>QMessageBox</name>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"80\"/>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"123\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"323\"/>\n        <source>QLog Critical</source>\n        <translation>Qlog 临界值</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"81\"/>\n        <source>Cannot save a password for %1 to the Credential Store</source>\n        <translation>无法将 %1 的密码保存到凭据数据库</translation>\n    </message>\n    <message>\n        <location filename=\"../core/CredentialStore.cpp\" line=\"124\"/>\n        <source>Cannot get a password for %1 from the Credential Store</source>\n        <translation>无法从凭据数据库获取 %1 密码</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"204\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"211\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"338\"/>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"345\"/>\n        <location filename=\"../core/Migration.cpp\" line=\"435\"/>\n        <location filename=\"../core/main.cpp\" line=\"434\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"171\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"243\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"641\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"651\"/>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"661\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1373\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"358\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"383\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"403\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"426\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"444\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1122\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1195\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1240\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1423\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1431\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1438\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1447\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1455\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1462\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1469\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1946\"/>\n        <source>QLog Warning</source>\n        <translation>QLog 告警</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"205\"/>\n        <source>Club List Update failed. Cannot remove old records</source>\n        <translation>俱乐部列表更新失败。无法删除旧记录</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"212\"/>\n        <source>Club List Update failed. Cannot plan new downloads</source>\n        <translation>俱乐部列表更新失败。无法规划新下载</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"324\"/>\n        <source>Unexpected Club List download. Canceling next downloads</source>\n        <translation>无法预料的俱乐部列表下载。取消下次下载</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"339\"/>\n        <source>Unexpected Club List content for</source>\n        <translation>未知的俱乐部列表内容</translation>\n    </message>\n    <message>\n        <location filename=\"../core/MembershipQE.cpp\" line=\"346\"/>\n        <source>Network error. Cannot download Club List for</source>\n        <translation>网络错误。无法下载俱乐部列表</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"406\"/>\n        <location filename=\"../core/main.cpp\" line=\"427\"/>\n        <location filename=\"../core/main.cpp\" line=\"448\"/>\n        <location filename=\"../core/main.cpp\" line=\"460\"/>\n        <location filename=\"../core/main.cpp\" line=\"470\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"329\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"180\"/>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"311\"/>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1634\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"452\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"460\"/>\n        <source>QLog Error</source>\n        <translation>QLog 出错</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"407\"/>\n        <source>QLog is already running</source>\n        <translation>已经有 QLog 实例正在运行</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"428\"/>\n        <source>Failed to process pending database import.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"435\"/>\n        <source>The database was imported successfully, but the stored passwords could not be restored (decryption failed or the data is corrupted). All service passwords have been cleared and must be re-entered in Settings.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"449\"/>\n        <source>Could not connect to database.</source>\n        <translation>无法连接至数据库。</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"461\"/>\n        <source>Could not export a QLog database to ADIF as a backup.&lt;p&gt;Try to export your log to ADIF manually</source>\n        <translation>无法导出 QLog 数据库至 ADIF 备份。&lt;p&gt;请尝试手动导出您的日志至 ADIF</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"471\"/>\n        <source>Database migration failed.</source>\n        <translation>数据库迁移失败。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"95\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"117\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"127\"/>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"134\"/>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"143\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"475\"/>\n        <source>QLog Info</source>\n        <translation>QLog 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ActivityEditor.cpp\" line=\"96\"/>\n        <source>Activity name is already exists.</source>\n        <translation>活动名称已存在。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"118\"/>\n        <source>Rule name is already exists.</source>\n        <translation>规则名已存在。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"128\"/>\n        <source>Callsign Regular Expression is incorrect.</source>\n        <translation>呼号正则表达式不正确。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"135\"/>\n        <source>Comment Regular Expression is incorrect.</source>\n        <translation>备注正则表达式不正确。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/AlertRuleDetail.cpp\" line=\"330\"/>\n        <source>Cannot Update Alert Rules</source>\n        <translation>无法更新提醒规则</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"613\"/>\n        <source>DXC Server Name Error</source>\n        <translation>DXC 服务器名称错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"614\"/>\n        <source>DXC Server address must be in format&lt;p&gt;&lt;b&gt;[username@]hostname:port&lt;/b&gt; (ex. hamqth.com:7300)&lt;/p&gt;</source>\n        <translation>DXC 服务器地址格式必须为&lt;p&gt;&lt;b&gt;[用户名@]主机名:端口&lt;/b&gt; (例. hamqth.com:7300)&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1035\"/>\n        <source>DX Cluster Password</source>\n        <translation>DX 集群密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1036\"/>\n        <source>Invalid Password</source>\n        <translation>无效的密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1215\"/>\n        <source>DXC Server Connection Error</source>\n        <translation>DXC 服务器连接出错</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"172\"/>\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"244\"/>\n        <source>Filename is empty</source>\n        <translation>文件名为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"181\"/>\n        <source>Cannot write to the file</source>\n        <translation>无法写入文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"282\"/>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"285\"/>\n        <source>QLog Information</source>\n        <translation>QLog 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"283\"/>\n        <source>Exported.</source>\n        <translation>已导出。</translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ExportDialog.cpp\" line=\"286\"/>\n        <source>Exported %n contact(s).</source>\n        <translation>\n            <numerusform>已导出 %n 通联记录。</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"312\"/>\n        <source>Chat Error: </source>\n        <translation>聊天出错: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTHighlightRuleDetail.cpp\" line=\"144\"/>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"476\"/>\n        <source>Filter name is already exists.</source>\n        <translation>过滤器名称已存在。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"642\"/>\n        <source>&lt;b&gt;Rig Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;设备出错:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"652\"/>\n        <source>&lt;b&gt;Rotator Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;旋转云台出错:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/MainWindow.cpp\" line=\"662\"/>\n        <source>&lt;b&gt;CW Keyer Error:&lt;/b&gt; </source>\n        <translation>&lt;b&gt;CW 键控器出错:&lt;/b&gt; </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1374\"/>\n        <source>The fields &lt;b&gt;%0&lt;/b&gt; will not be saved because the &lt;b&gt;%1&lt;/b&gt; is not filled.</source>\n        <translation>不会保存字段&lt;b&gt;%0&lt;/b&gt;，因为&lt;b&gt;%1&lt;/b&gt;未填充。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/NewContactWidget.cpp\" line=\"1635\"/>\n        <source>Your callsign is empty. Please, set your Station Profile</source>\n        <translation>你的呼号为空。请先设置台站配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"359\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1947\"/>\n        <source>Please, define at least one Station Locations Profile</source>\n        <translation>请至少定义一个站点配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"393\"/>\n        <source>WSJTX Multicast is enabled but the Address is not a multicast address.</source>\n        <translation>WSJTX 多播已启用，但地址不是多播地址。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"404\"/>\n        <source>Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"427\"/>\n        <source>Rig port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>设备端口必须是一个有效的 COM 端口。&lt;br&gt;Windows 使用 COMxxx，对于unix-like OS 使用设备路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"445\"/>\n        <source>Rig PTT port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>电台PTT端口必须为可用的串口。&lt;br&gt;Windows是类似COMxx，类UNIX操作系统则为设备路径名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"453\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be 0.</source>\n        <translation>&lt;b&gt;TX 范围&lt;/b&gt;: 最大频率不能为 0。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"461\"/>\n        <source>&lt;b&gt;TX Range&lt;/b&gt;: Max Frequency must not be under Min Frequency.</source>\n        <translation>&lt;b&gt;TX 范围&lt;/b&gt;: 最大频率不能低于最小频率。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"798\"/>\n        <source>Rotator port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>旋转云台端口必须是一个有效的 COM 端口。&lt;br&gt;对于Windows 使用 COMxxx，对于unix-like OS 使用设备路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1123\"/>\n        <source>CW Keyer port must be a valid COM port.&lt;br&gt;For Windows use COMxx, for unix-like OS use a path to device</source>\n        <translation>CW 键控器端口必须是一个有效的 COM 端口。&lt;br&gt;对于Windows 使用 COMxxx，对于unix-like OS 使用设备路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1196\"/>\n        <source>Cannot change the CW Keyer Model to &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;No Morse over CAT support for Rig(s) &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>无法将 CW 键控器模型改为 &lt;b&gt;Morse over CAT&lt;/b&gt;&lt;br&gt;设备 &lt;b&gt;%1&lt;/b&gt;不支持Morse over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1241\"/>\n        <source>Cannot delete the CW Keyer Profile&lt;br&gt;The CW Key Profile is used by Rig(s): &lt;b&gt;%1&lt;/b&gt;</source>\n        <translation>无法删除 CW 键控器配置文件&lt;br&gt;本 CW 键控器配置文件正在被设备&lt;b&gt;%1&lt;/b&gt;使用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1424\"/>\n        <source>Callsign has an invalid format</source>\n        <translation>呼号格式无效</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1432\"/>\n        <source>Operator Callsign has an invalid format</source>\n        <translation>操作员呼号格式无效</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1439\"/>\n        <source>Gridsquare has an invalid format</source>\n        <translation>网格坐标格式无效</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1448\"/>\n        <source>VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by &apos;,&apos;)</source>\n        <translation>VUCC 网格格式无效 (必须是 2 或 4 个被 &apos;,&apos; 分隔的网格坐标)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1456\"/>\n        <source>Country must not be empty</source>\n        <translation>国家/地区 不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1463\"/>\n        <source>CQZ must not be empty</source>\n        <translation>CQ 分区不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1470\"/>\n        <source>ITU must not be empty</source>\n        <translation>ITU 不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"546\"/>\n        <source>Cannot update QSO Filter Conditions</source>\n        <translation>无法更新QSO过滤器条件</translation>\n    </message>\n</context>\n<context>\n    <name>QObject</name>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"137\"/>\n        <source>km</source>\n        <translation>公里</translation>\n    </message>\n    <message>\n        <location filename=\"../data/Gridsquare.cpp\" line=\"143\"/>\n        <source>miles</source>\n        <translation>英里</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"366\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"553\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1185\"/>\n        <source>Connection Refused</source>\n        <translation>连接被拒绝</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"370\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"556\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1188\"/>\n        <source>Host closed the connection</source>\n        <translation>主机关闭连接</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"375\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"561\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1193\"/>\n        <source>Host not found</source>\n        <translation>找不到主机</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"378\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"564\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1196\"/>\n        <source>Timeout</source>\n        <translation>超时</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"382\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"569\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1200\"/>\n        <source>Network Error</source>\n        <translation>网络错误</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"385\"/>\n        <location filename=\"../service/kstchat/KSTChat.cpp\" line=\"573\"/>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1203\"/>\n        <source>Internal Error</source>\n        <translation>内部错误</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"422\"/>\n        <source>Importing Database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"442\"/>\n        <source>Opening Database</source>\n        <translation>打开数据库</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"453\"/>\n        <source>Backuping Database</source>\n        <translation>备份数据库</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"464\"/>\n        <source>Migrating Database</source>\n        <translation>迁移数据库</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"476\"/>\n        <source>Starting Application</source>\n        <translation>启动应用程序</translation>\n    </message>\n    <message>\n        <location filename=\"../data/RigProfile.cpp\" line=\"292\"/>\n        <source>My Rig</source>\n        <translation>我的设备</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"200\"/>\n        <source>Logging Station Callsign</source>\n        <translation>记录电台呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"201\"/>\n        <source>My Gridsquare</source>\n        <translation>我的网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"202\"/>\n        <source>Operator Name</source>\n        <translation>操作员姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"203\"/>\n        <source>Operator Callsign</source>\n        <translation>操作员呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"204\"/>\n        <source>My City</source>\n        <translation>我的城市</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"205\"/>\n        <source>My Country</source>\n        <translation>我的国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"206\"/>\n        <source>My County</source>\n        <translation>我的县/郡</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"207\"/>\n        <source>My IOTA</source>\n        <translation>我的 IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"208\"/>\n        <source>My SOTA</source>\n        <translation>我的 SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"209\"/>\n        <source>My Special Interest Activity</source>\n        <translation>我的特殊兴趣活动</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"210\"/>\n        <source>My Spec. Interes Activity Info</source>\n        <translation>我的特殊兴趣活动信息</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"211\"/>\n        <source>My VUCC Grids</source>\n        <translation>我的 VUCC 网格</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"212\"/>\n        <source>My WWFF</source>\n        <translation>我的 WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"213\"/>\n        <source>My POTA Ref</source>\n        <translation>我的 POTA 编号</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"214\"/>\n        <source>My DARC DOK</source>\n        <translation>我的DARC DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"215\"/>\n        <source>My ITU</source>\n        <translation>我的 ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"216\"/>\n        <source>My CQZ</source>\n        <translation>我的 CQ 分区</translation>\n    </message>\n    <message>\n        <location filename=\"../data/StationProfile.cpp\" line=\"217\"/>\n        <source>My DXCC</source>\n        <translation>我的 DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"1178\"/>\n        <source>Cannot connect to DXC Server &lt;p&gt;Reason &lt;b&gt;: </source>\n        <translation>无法连接至 DXC 服务器 &lt;p&gt;原因 &lt;b&gt;: </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"309\"/>\n        <source>&lt;b&gt;Imported&lt;/b&gt;: %n contact(s)</source>\n        <translation>\n            <numerusform>&lt;b&gt;已导入&lt;/b&gt;: %n 通联</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"310\"/>\n        <source>&lt;b&gt;Warning(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;告警&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/ImportDialog.cpp\" line=\"311\"/>\n        <source>&lt;b&gt;Error(s)&lt;/b&gt;: %n</source>\n        <translation>\n            <numerusform>&lt;b&gt;错误&lt;/b&gt;: %n</numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"300\"/>\n        <source>Not a valid QLog database</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"310\"/>\n        <source>Database version too new (requires newer QLog version)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/LogDatabase.cpp\" line=\"323\"/>\n        <source>Database is not QLog Export file</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"25\"/>\n        <source>TQSL Path</source>\n        <translation type=\"unfinished\">TQSL路径</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"89\"/>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"228\"/>\n        <source>(Flatpak internal path)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"192\"/>\n        <source>Rig</source>\n        <translation type=\"unfinished\">设备</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"193\"/>\n        <source>Rig PTT</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"194\"/>\n        <source>Rig rigctld</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"195\"/>\n        <source>Rotator</source>\n        <translation type=\"unfinished\">云台</translation>\n    </message>\n    <message>\n        <location filename=\"../core/PlatformParameterManager.cpp\" line=\"196\"/>\n        <source>CW Keyer</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"165\"/>\n        <source>TOTAL Worked</source>\n        <translation type=\"unfinished\">全部已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"172\"/>\n        <source>TOTAL Confirmed</source>\n        <translation type=\"unfinished\">全部已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"174\"/>\n        <source>Confirmed</source>\n        <translation type=\"unfinished\">已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../awards/BandTableAward.cpp\" line=\"181\"/>\n        <source>Worked</source>\n        <translation type=\"unfinished\">已通联</translation>\n    </message>\n</context>\n<context>\n    <name>QRZCallbook</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"133\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n</context>\n<context>\n    <name>QRZUploader</name>\n    <message>\n        <location filename=\"../service/qrzcom/QRZ.cpp\" line=\"523\"/>\n        <source>General Error</source>\n        <translation>常见错误</translation>\n    </message>\n</context>\n<context>\n    <name>QSLGalleryDialog</name>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"14\"/>\n        <source>QSL Card Gallery</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"22\"/>\n        <source>Search by callsign...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"32\"/>\n        <source>Sort by:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.ui\" line=\"121\"/>\n        <source>Export Filtered</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"148\"/>\n        <source>Date (Newest)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"149\"/>\n        <source>Date (Oldest)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"150\"/>\n        <source>Callsign (A-Z)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"151\"/>\n        <source>Callsign (Z-A)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message numerus=\"yes\">\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"175\"/>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"434\"/>\n        <source>%n QSL card(s)</source>\n        <translation type=\"unfinished\">\n            <numerusform></numerusform>\n        </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"201\"/>\n        <source>All QSL Cards</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"207\"/>\n        <source>Favorites</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"215\"/>\n        <source>By Country</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"235\"/>\n        <source>By Date</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"264\"/>\n        <source>By Band</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"278\"/>\n        <source>By Mode</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"292\"/>\n        <source>By Continent</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Remove from Favorites</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"579\"/>\n        <source>Add to Favorites</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"581\"/>\n        <source>Open</source>\n        <translation type=\"unfinished\">打开</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"582\"/>\n        <source>Save...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"659\"/>\n        <source>Save QSL Card</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"707\"/>\n        <source>Export QSL Cards</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLGalleryDialog.cpp\" line=\"751\"/>\n        <source>Exported %1 of %2 cards</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QSLImportStatDialog</name>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"14\"/>\n        <source>QSL Import Summary</source>\n        <translation>QSL 导入摘要</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"20\"/>\n        <source>Summary</source>\n        <translation>摘要</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"26\"/>\n        <source>Downloaded:</source>\n        <translation>已下载:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"40\"/>\n        <source>Updated:</source>\n        <translation>已更新:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"54\"/>\n        <source>Unmatched:</source>\n        <translation>未匹配:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"68\"/>\n        <source>Errors:</source>\n        <translation>出错:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.ui\" line=\"85\"/>\n        <source>Details</source>\n        <translation>详情</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"78\"/>\n        <source>New QSLs: </source>\n        <translation>新 QSLs: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"87\"/>\n        <source>Updated QSOs: </source>\n        <translation>更新 QSOs： </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLImportStatDialog.cpp\" line=\"96\"/>\n        <source>Unmatched QSLs: </source>\n        <translatorcomment>未匹配的 QSLs: </translatorcomment>\n        <translation>不匹配的 QSL： </translation>\n    </message>\n</context>\n<context>\n    <name>QSLPrintLabelDialog</name>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"14\"/>\n        <source>Print QSL Labels</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"79\"/>\n        <source>Filter</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"119\"/>\n        <source>Date Range</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"162\"/>\n        <source>My Callsign</source>\n        <translation type=\"unfinished\">我的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"182\"/>\n        <source>Station Profile</source>\n        <translation type=\"unfinished\">台站配置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"196\"/>\n        <source>QSL Sent</source>\n        <translation type=\"unfinished\">QSL 已发送</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"210\"/>\n        <source>User Filter</source>\n        <translation type=\"unfinished\">用户过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"233\"/>\n        <source>Label Template</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"278\"/>\n        <source>Page Size:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"292\"/>\n        <source>Columns:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"312\"/>\n        <source>Rows:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"332\"/>\n        <source>Label Width:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"361\"/>\n        <source>Label Height:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"390\"/>\n        <source>Left Margin:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"419\"/>\n        <source>Top Margin:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"448\"/>\n        <source>H Spacing:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"477\"/>\n        <source>V Spacing:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"517\"/>\n        <source>Label Appearance</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"560\"/>\n        <source>Print Label Borders</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"567\"/>\n        <source>QSOs per Label:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"587\"/>\n        <source>Footer Left Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"597\"/>\n        <source>Footer Right Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"607\"/>\n        <source>Skip Label:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"624\"/>\n        <source>Sans Font:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"647\"/>\n        <source>Mono Font:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"673\"/>\n        <source>Callsign Size:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"702\"/>\n        <source>&quot;To Radio&quot; Size:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"731\"/>\n        <source>&quot;To Radio&quot; Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"745\"/>\n        <source>Header Size:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"774\"/>\n        <source>Data Size:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"803\"/>\n        <source>Date Header Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"817\"/>\n        <source>Date Format:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"831\"/>\n        <source>Time Header Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"845\"/>\n        <source>Band Header Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"859\"/>\n        <source>Mode Header Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"873\"/>\n        <source>QSL Header Text:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"887\"/>\n        <source>Extra Column:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"901\"/>\n        <source>Extra Column Text</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"908\"/>\n        <source>(DB column name)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"952\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"797\"/>\n        <source>No matching QSOs found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1052\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"814\"/>\n        <source>Page 0 of 0</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1105\"/>\n        <source>Labels: 0 (0 pages)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1128\"/>\n        <source>Print</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.ui\" line=\"1158\"/>\n        <source>Export as PDF</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"49\"/>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"297\"/>\n        <source>Custom</source>\n        <translation type=\"unfinished\">自定义</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"315\"/>\n        <source>Empty</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"388\"/>\n        <source>QSOs matching this station profile</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"769\"/>\n        <source>Labels: %1 (%2 pages)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"812\"/>\n        <source>Page %1 of %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"862\"/>\n        <source>Export PDF</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"864\"/>\n        <source>PDF Files (*.pdf)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"884\"/>\n        <source>Mark as Sent</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSLPrintLabelDialog.cpp\" line=\"885\"/>\n        <source>Mark printed/exported QSOs as sent?</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>QSODetailDialog</name>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"49\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"68\"/>\n        <source>dd/MM/yyyy HH:mm:ss</source>\n        <translation>dd/MM/yyyy HH:mm:ss</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"169\"/>\n        <source>RSTs</source>\n        <translation>RST发</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"176\"/>\n        <source>RSTr</source>\n        <translation>RST收</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"185\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"203\"/>\n        <source>Time On</source>\n        <translation>起始时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"216\"/>\n        <source>Time Off</source>\n        <translation>结束时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"369\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1383\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"386\"/>\n        <source>TX: </source>\n        <translation>发射: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"405\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"459\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1663\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1730\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1866\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1904\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2070\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"274\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"411\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"443\"/>\n        <source>RX: </source>\n        <translation>接收: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"499\"/>\n        <source>Frequency</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"522\"/>\n        <source>Band</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"551\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1483\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"558\"/>\n        <source>Name</source>\n        <translation>姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"565\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1473\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"594\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"637\"/>\n        <source>My Notes</source>\n        <translation>我的笔记</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"696\"/>\n        <source>about:blank</source>\n        <translation>about:blank</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"721\"/>\n        <source>&amp;Details</source>\n        <translation>详情(&amp;D)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"732\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1403\"/>\n        <source>Country</source>\n        <translation>国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"739\"/>\n        <source>Cont</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"746\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1412\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"775\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1435\"/>\n        <source>CQ</source>\n        <translation>CQ</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"804\"/>\n        <source>State</source>\n        <translation>省</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"830\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1493\"/>\n        <source>County</source>\n        <translation>县/郡</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"856\"/>\n        <source>Age</source>\n        <translation>年龄</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"903\"/>\n        <source>AF</source>\n        <translation>AF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"908\"/>\n        <source>AN</source>\n        <translation>AN</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"913\"/>\n        <source>AS</source>\n        <translation>AS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"918\"/>\n        <source>EU</source>\n        <translation>EU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"923\"/>\n        <source>NA</source>\n        <translation>NA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"928\"/>\n        <source>OC</source>\n        <translation>OC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"933\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"941\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1603\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"951\"/>\n        <source>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</source>\n        <translation>两个或四个相邻的网格坐标，每个网格坐标长四个字符，(如 EN98, FM08, EM97, FM07)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1076\"/>\n        <source>FISTS</source>\n        <translation>FISTS</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1086\"/>\n        <source>SKCC</source>\n        <translation>SKCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1093\"/>\n        <source>Ten-Ten</source>\n        <translation>Ten-Ten</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1100\"/>\n        <source>UKSMG</source>\n        <translation>UKSMG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1610\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1126\"/>\n        <source>the contacted station&apos;s DARC DOK (District Location Code) (ex. A01)</source>\n        <translation>联络电台的DARC DOK (地区位置代码) (例如 A01)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"978\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1540\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"998\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1550\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1008\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1560\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1028\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1570\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1038\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1580\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1052\"/>\n        <source>SIG Info</source>\n        <translation>SIG信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1133\"/>\n        <source>FISTS CC</source>\n        <translation>FISTS CC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1150\"/>\n        <source>E-Mail</source>\n        <translation>电子邮件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1170\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1190\"/>\n        <source>Propagation Mode</source>\n        <translation>传播模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1216\"/>\n        <source>Satellite Name</source>\n        <translation>卫星名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1239\"/>\n        <source>Satellite Mode</source>\n        <translation>卫星模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1372\"/>\n        <source>M&amp;y Station</source>\n        <translation>我的电台(&amp;Y)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1393\"/>\n        <source>Operator Name</source>\n        <translation>操作员姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1503\"/>\n        <source>Operator Callsign</source>\n        <translation>操作员呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1627\"/>\n        <source>Rig</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1637\"/>\n        <source>Antenna</source>\n        <translation>天线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1647\"/>\n        <source>Power</source>\n        <translation>功率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1666\"/>\n        <source> W</source>\n        <translation> W</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2100\"/>\n        <source>QSLr Message</source>\n        <translation>QSLr 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2125\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2161\"/>\n        <source>Contest ID</source>\n        <translation>竞赛标识</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1590\"/>\n        <source>Sig Info</source>\n        <translation>SIG 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1271\"/>\n        <source>D&amp;X Stats</source>\n        <translation>D&amp;X 统计</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1283\"/>\n        <source>&lt;b&gt;DXCC Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;DXCC 统计&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1330\"/>\n        <source>&lt;b&gt;Station Statistics&lt;/b&gt;</source>\n        <translation>&lt;b&gt;电台统计&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1685\"/>\n        <source>&amp;QSL</source>\n        <translation>&amp;QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2055\"/>\n        <source>Sent</source>\n        <translation>发出</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1784\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1791\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1995\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2002\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1986\"/>\n        <source>Manage QSL Card</source>\n        <translation>管理 QSL 卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1819\"/>\n        <source>QSL Sent via</source>\n        <translation>QSL 发送经由</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1887\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1943\"/>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2091\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;是&lt;/b&gt; -已发出 QSL卡; QSO 已上传至在线服务&lt;br/&gt;&lt;b&gt;否&lt;/b&gt; -不发送 QSL卡;&lt;br/&gt;&lt;b&gt;已请求&lt;/b&gt; -被联系站点已请求 QSL卡;被联系站点已请求将 QSO 上传到在线服务&lt;br/&gt;&lt;b&gt;排队&lt;/b&gt;—已选择要发送的 QSL 卡;已选定一个 QSO 上载至在线服务&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2029\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1715\"/>\n        <source>Show QSL Card</source>\n        <translation>显示 QSL 卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1766\"/>\n        <source>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</source>\n        <translation>&lt;b&gt;是&lt;/b&gt; -已收到 QSL 卡; QSO 已被在线服务确认&lt;br/&gt;&lt;b&gt;否&lt;/b&gt; -未收到 QSL 卡;在线服务请求的QSO未得到确认&lt;br&gt;&lt;b&gt;已请求&lt;/b&gt; -日志记录站已请求 QSL卡; 日志记录站要求将QSO上传到在线服务&lt;br/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1958\"/>\n        <source>Received</source>\n        <translation>收到</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1848\"/>\n        <source>QSL via</source>\n        <translation>QSL 通过</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2118\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"1976\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2151\"/>\n        <source>&amp;Contest</source>\n        <translation>比赛(&amp;C)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2171\"/>\n        <source>RcvNr</source>\n        <translation>接收序号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2185\"/>\n        <source>RcvExch</source>\n        <translation>接收交换信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2199\"/>\n        <source>SendNr</source>\n        <translation>发送序号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2213\"/>\n        <source>SendExch</source>\n        <translation>发送交换信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.ui\" line=\"2265\"/>\n        <source>Member:</source>\n        <translation>成员:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"64\"/>\n        <source>&amp;Reset</source>\n        <translation>重置(&amp;R)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"69\"/>\n        <source>&amp;Lookup</source>\n        <translation>查找(&amp;L)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"195\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"206\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"217\"/>\n        <source>No</source>\n        <translation>否</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"196\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"207\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"218\"/>\n        <source>Yes</source>\n        <translation>是</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"197\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"208\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"219\"/>\n        <source>Requested</source>\n        <translation>已请求</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"198\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"209\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"220\"/>\n        <source>Queued</source>\n        <translation>排队中</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"199\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"210\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"221\"/>\n        <source>Ignored</source>\n        <translation>已忽视</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"236\"/>\n        <source>Bureau</source>\n        <translation>卡片局</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"237\"/>\n        <source>Direct</source>\n        <translation>直邮</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"238\"/>\n        <source>Electronic</source>\n        <translation>电子卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Submit changes</source>\n        <translation>提交更改</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"430\"/>\n        <source>Really submit all changes?</source>\n        <translation>确认提交所有更改吗？</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>QLog Error</source>\n        <translation>QLog 错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"439\"/>\n        <source>Cannot save all changes - internal error</source>\n        <translation>无法保存所有更改 - 内部错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"485\"/>\n        <source>Cannot save all changes - try to reset all changes</source>\n        <translation>无法保存所有更改 - 尝试重置所有更改</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>QSO Detail</source>\n        <translation>QSO 详情</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"631\"/>\n        <source>Edit QSO</source>\n        <translation>编辑 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Downloading eQSL Image</source>\n        <translation>下载 eQSL 图片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"657\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"675\"/>\n        <source>eQSL Download Image failed: </source>\n        <translation>下载 eQSL 图片失败: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"860\"/>\n        <source>DX Callsign must not be empty</source>\n        <translation>DX 呼号不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"864\"/>\n        <source>DX callsign has an incorrect format</source>\n        <translation>DX 呼号格式不正确</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"868\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"879\"/>\n        <source>TX Frequency or Band must be filled</source>\n        <translation>必须填入发射频率或波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"875\"/>\n        <source>TX Band should be </source>\n        <translation>发射波段应该为 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"886\"/>\n        <source>RX Band should be </source>\n        <translation>接收波段应该为 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"890\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"936\"/>\n        <source>DX Grid has an incorrect format</source>\n        <translation>DX 网格格式错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"896\"/>\n        <source>Based on callsign, DXCC Country is different from the entered value - expecting </source>\n        <translation>根据呼号，DXCC 国家与输入值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"900\"/>\n        <source>Based on callsign, DXCC Continent is different from the entered value - expecting </source>\n        <translation>根据呼号，DXCC 大洲与输入值期望不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"904\"/>\n        <source>Based on callsign, DXCC ITU is different from the entered value - expecting </source>\n        <translation>根据呼号，DXCC ITU 与输入值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"908\"/>\n        <source>Based on callsign, DXCC CQZ is different from the entered value - expecting </source>\n        <translation>根据呼号，DXCC CQZ 与输入值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"912\"/>\n        <source>VUCC has an incorrect format</source>\n        <translation>VUCC 格式错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>Based on Frequencies, Sat Mode should be </source>\n        <translation>基于频率，卫星模式应该为 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"918\"/>\n        <source>blank</source>\n        <translation>空白</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"922\"/>\n        <source>Sat name must not be empty</source>\n        <translation>卫星名不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"928\"/>\n        <source>Own Callsign must not be empty</source>\n        <translation>自己的呼号不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"932\"/>\n        <source>Own callsign has an incorrect format</source>\n        <translation>自己的呼号格式错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"940\"/>\n        <source>Own VUCC Grids have an incorrect format</source>\n        <translation>自己的 VUCC 网格格式错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"944\"/>\n        <source>Based on own callsign, own DXCC ITU is different from the entered value - expecting </source>\n        <translation>基于自己的呼号,自己的 DXCC ITU 与输入的值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"948\"/>\n        <source>Based on own callsign, own DXCC CQZ is different from the entered value - expecting </source>\n        <translation>基于自己的呼号,自己的 DXCC CQ分区 与输入的值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"952\"/>\n        <source>Based on own callsign, own DXCC Country is different from the entered value - expecting </source>\n        <translation>基于自己的呼号,自己的 DXCC 国家/地区与输入的值不同 - 期望 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"971\"/>\n        <source>Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting </source>\n        <translation>基于 SOTA 山峰，QTH 不匹配 SOTA 山峰名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"980\"/>\n        <source>Based on SOTA Summit, Grid does not match SOTA Grid - expecting </source>\n        <translation>基于 SOTA 山峰，网格坐标不匹配 SOTA 山峰名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"986\"/>\n        <source>Based on POTA record, QTH does not match POTA Name - expecting </source>\n        <translation>基于 POTA 记录，QTH 不匹配 POTA 名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"995\"/>\n        <source>Based on POTA record, Grid does not match POTA Grid - expecting </source>\n        <translation>基于 POTA 记录，网格坐标不匹配 POTA 名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1014\"/>\n        <source>Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting </source>\n        <translation>基于 SOTA 山峰，我的 QTH 不匹配 SOTA 山峰名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1023\"/>\n        <source>Based on SOTA Summit, my Grid does not match SOTA Grid - expecting </source>\n        <translation>基于 SOTA 山峰，我的网格坐标不匹配 SOTA 山峰名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1029\"/>\n        <source>Based on POTA record, my QTH does not match POTA Name - expecting </source>\n        <translation>基于 POTA 记录，我的 QTH 不匹配 POTA 名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1038\"/>\n        <source>Based on POTA record, my Grid does not match POTA Grid - expecting </source>\n        <translation>基于 POTA 记录，我的网格坐标不匹配 POTA 名称 - 期待 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1043\"/>\n        <source>LoTW Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>如果已经设置了 QSL 发送日期, LoTW 发送状态设为&lt;b&gt;否&lt;/b&gt; 没有任何意义。设置日期为 1.1.1900 以让日期字段为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1051\"/>\n        <source>Date should be present for LoTW Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>需要为 LoTW 发送状态 提供日期。&lt;b&gt;是&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1056\"/>\n        <source>eQSL Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>如果已经设置了 QSL 发送日期, eQSL 发送状态设为&lt;b&gt;否&lt;/b&gt; 没有任何意义。设置日期为 1.1.1900 以让日期字段为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1064\"/>\n        <source>Date should be present for eQSL Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>需要为 eQSL 发送状态提供日期 &lt;b&gt;是&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1069\"/>\n        <source>Paper Sent Status to &lt;b&gt;No&lt;/b&gt; does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank</source>\n        <translation>如果已经设置了 QSL 发送日期, 纸质卡片发送状态设为&lt;b&gt;否&lt;/b&gt; 没有任何意义。设置日期为 1.1.1900 以让日期字段为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1077\"/>\n        <source>Date should be present for Paper Sent Status &lt;b&gt;Yes&lt;/b&gt;</source>\n        <translation>需要为纸质卡片发送状态提供日期 &lt;b&gt;是&lt;/b&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1206\"/>\n        <source>Callbook error: </source>\n        <translation>电台黄页错误: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1341\"/>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1346\"/>\n        <source>&lt;b&gt;Warning: &lt;/b&gt;</source>\n        <translation>&lt;b&gt;告警&lt;/b&gt;: %n</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Validation</source>\n        <translation>验证</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1587\"/>\n        <source>Yellow marked fields are invalid.&lt;p&gt;Nevertheless, save the changes?&lt;/p&gt;</source>\n        <translation>黄色标记的字段无效。&lt;p&gt;依然保存更改?&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1645\"/>\n        <source>&amp;Save</source>\n        <translation>保存(&amp;S)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSODetailDialog.cpp\" line=\"1646\"/>\n        <source>&amp;Edit</source>\n        <translation>编辑(&amp;E)</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDetail</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"14\"/>\n        <source>QSO Filter Detail</source>\n        <translation>QSO过滤器详情</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"24\"/>\n        <source>Filter Name:</source>\n        <translation>过滤器名称:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"31\"/>\n        <source>Find QSO which match</source>\n        <translation>查找QSO符合</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"52\"/>\n        <source>All the following conditions</source>\n        <translation>所有以下条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"57\"/>\n        <source>Any of the following conditions</source>\n        <translation>任意以下条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.ui\" line=\"112\"/>\n        <source>Add Condition</source>\n        <translation>添加条件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"83\"/>\n        <source>Equal</source>\n        <translation>等于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"84\"/>\n        <source>Not Equal</source>\n        <translation>不等于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"85\"/>\n        <source>Contains</source>\n        <translation>包含</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"86\"/>\n        <source>Not Contains</source>\n        <translation>不包含</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"87\"/>\n        <source>Greater Than</source>\n        <translation>大于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"88\"/>\n        <source>Less Than</source>\n        <translation>小于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"89\"/>\n        <source>Starts with</source>\n        <translation>起始自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"90\"/>\n        <source>RegExp</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"177\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDetail.cpp\" line=\"469\"/>\n        <source>Must not be empty</source>\n        <translation>不能为空</translation>\n    </message>\n</context>\n<context>\n    <name>QSOFilterDialog</name>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"14\"/>\n        <source>QSO Filters</source>\n        <translation>QSO过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"22\"/>\n        <source>Filters</source>\n        <translation>过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"53\"/>\n        <source>Add</source>\n        <translation>添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"60\"/>\n        <source>Edit</source>\n        <translation>编辑</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/QSOFilterDialog.ui\" line=\"67\"/>\n        <source>Remove</source>\n        <translation>删除</translation>\n    </message>\n</context>\n<context>\n    <name>Rig</name>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"196\"/>\n        <source>No Rig Profile selected</source>\n        <translation>未选择设备配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"215\"/>\n        <source>Rigctld Error</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"236\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"237\"/>\n        <source>Internal Error</source>\n        <translation>内部错误</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/Rig.cpp\" line=\"345\"/>\n        <source>Cannot open Rig</source>\n        <translation>无法打开设备</translation>\n    </message>\n</context>\n<context>\n    <name>RigWidget</name>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"99\"/>\n        <source>RX</source>\n        <translation>接收</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"204\"/>\n        <source>Disconnected</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"210\"/>\n        <location filename=\"../ui/RigWidget.ui\" line=\"259\"/>\n        <source> MHz</source>\n        <translation type=\"unfinished\"> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"278\"/>\n        <source>Disable Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"312\"/>\n        <source>RIT: 0.00000 MHz</source>\n        <translation>RIT: 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.ui\" line=\"324\"/>\n        <source>XIT: 0.00000 MHz</source>\n        <translation>XIT: 0.00000 MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigWidget.cpp\" line=\"147\"/>\n        <source>PWR: %1W</source>\n        <translation>功率: %1W</translation>\n    </message>\n</context>\n<context>\n    <name>RigctldAdvancedDialog</name>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"14\"/>\n        <source>Rigctld Advanced Settings</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"22\"/>\n        <source>Rigctld Path:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"31\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"47\"/>\n        <source>Browse</source>\n        <translation type=\"unfinished\">浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"64\"/>\n        <source>Auto-detect Rigctld path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"67\"/>\n        <source>Auto-Detect</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"76\"/>\n        <source>Rigctld Version:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"90\"/>\n        <source>Additional Arguments:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.ui\" line=\"97\"/>\n        <source>e.g. -v -v for verbose logging</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"24\"/>\n        <source>Cannot be changed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"75\"/>\n        <source>Auto Detect</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"76\"/>\n        <source>rigctld was not found on this system.\nPlease install Hamlib or specify the path manually.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"88\"/>\n        <source>Executable (*.exe);;All files (*.*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"90\"/>\n        <source>All files (*)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"96\"/>\n        <source>Select rigctld executable</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RigctldAdvancedDialog.cpp\" line=\"112\"/>\n        <source>Not found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>RigctldManager</name>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"46\"/>\n        <source>rigctld executable not found in /app/bin/. This should not happen in Flatpak build.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"48\"/>\n        <source>rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"66\"/>\n        <source>Hamlib major version mismatch: QLog was compiled with Hamlib %1 but rigctld reports version %2.%3.%4. Rig model IDs are incompatible between major versions.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"86\"/>\n        <source>Port %1 is already in use. Another rigctld or application may be running on this port.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"124\"/>\n        <source>rigctld started but not responding on port %1.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"426\"/>\n        <source>Failed to start rigctld: %1 %2</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"430\"/>\n        <source>rigctld crashed.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"433\"/>\n        <source>rigctld timed out.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"436\"/>\n        <source>Write error with rigctld.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"439\"/>\n        <source>Read error with rigctld.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/RigctldManager.cpp\" line=\"442\"/>\n        <source>Unknown rigctld error.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n<context>\n    <name>Rotator</name>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"175\"/>\n        <source>No Rotator Profile selected</source>\n        <translation>未选择旋转云台配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"187\"/>\n        <source>Initialization Error</source>\n        <translation>初始化出错</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"188\"/>\n        <source>Internal Error</source>\n        <translation>内部错误</translation>\n    </message>\n    <message>\n        <location filename=\"../rotator/Rotator.cpp\" line=\"217\"/>\n        <source>Cannot open Rotator</source>\n        <translation>无法打开云台</translation>\n    </message>\n</context>\n<context>\n    <name>RotatorWidget</name>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"64\"/>\n        <source>Az:</source>\n        <translation>方位:</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"86\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"105\"/>\n        <source>Goto</source>\n        <translation>转到</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"176\"/>\n        <source>Previous Button Profile</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"284\"/>\n        <source>Next Button Profile</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"313\"/>\n        <source>QSO LP</source>\n        <translation>QSO 长路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"316\"/>\n        <source>QSO Long Path</source>\n        <translation>QSO 长路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"321\"/>\n        <source>QSO SP</source>\n        <translation>QSO 短路经</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/RotatorWidget.ui\" line=\"324\"/>\n        <source>QSO Short Path</source>\n        <translation>QSO 短路径</translation>\n    </message>\n</context>\n<context>\n    <name>SettingsDialog</name>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"26\"/>\n        <source>Settings</source>\n        <translation>设置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"49\"/>\n        <source>Station</source>\n        <translation>电台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"55\"/>\n        <source> Profiles</source>\n        <translation> 配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"182\"/>\n        <source>World Wide Flora &amp; Fauna (Optional parameter)</source>\n        <translation>世界动植物 (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"203\"/>\n        <source>POTA</source>\n        <translation>POTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"376\"/>\n        <source>SIG</source>\n        <translation>SIG</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"248\"/>\n        <source>Station Gridsquare (Mandatory parameter)</source>\n        <translation>电台网格坐标 (梅登黑格网格)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"348\"/>\n        <source>Operator Name</source>\n        <translation>操作员姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"64\"/>\n        <source>SOTA</source>\n        <translation>SOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"261\"/>\n        <source>QTH</source>\n        <translation>QTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"305\"/>\n        <source>SIG Information (Optional parameter)</source>\n        <translation>特别活动或兴趣团体信息 (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"282\"/>\n        <source>WWFF</source>\n        <translation>WWFF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"168\"/>\n        <source>IOTA  (Optional parameter)</source>\n        <translation>IOTA (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3655\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"78\"/>\n        <source>SOTA (Optional parameter)</source>\n        <translation>SOTA (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"315\"/>\n        <source>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </source>\n        <translation>配置文件名称，用作呼号、网格坐标、操作员名称和 QTH 的别名 (必需参数) </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"295\"/>\n        <source>List of all available Station Profiles</source>\n        <translation>所有可用电台配置文件列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"369\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"71\"/>\n        <source>IOTA</source>\n        <translation>IOTA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"275\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"472\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"641\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"979\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1579\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2598\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2974\"/>\n        <source>Profile Name</source>\n        <translation>配置名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"355\"/>\n        <source>VUCC</source>\n        <translation>VUCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"85\"/>\n        <source>SIG (Optional parameter).</source>\n        <translation>特别活动或兴趣团体名 (可选参数)。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"210\"/>\n        <source>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</source>\n        <translation>VUCC 网格 (可选参数)。例. EN98,FM08,EM97,FM07</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"234\"/>\n        <source>SIG Info</source>\n        <translation>SIG 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"392\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"564\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"911\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1533\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2553\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2945\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3919\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"467\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"661\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"803\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"894\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"963\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1034\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1049\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1106\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1202\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1300\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1384\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1476\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1593\"/>\n        <source>Add</source>\n        <translation>添加</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"399\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"571\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"934\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"950\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2560\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2952\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3942\"/>\n        <source>Delete</source>\n        <translation>删除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"175\"/>\n        <source>QTH Name (Optional parameter)</source>\n        <translation>QTH 名 (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"196\"/>\n        <source>Operator name (Optional parameter)</source>\n        <translation>操作员姓名 (可选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"328\"/>\n        <source>Callsign (Mandatory parameter)</source>\n        <translation>呼号 (必选参数)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"106\"/>\n        <source>ITU</source>\n        <translation>ITU</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"129\"/>\n        <source>CQZ</source>\n        <translation>CQ分区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"220\"/>\n        <source>Country</source>\n        <translation>国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"408\"/>\n        <source>DOK</source>\n        <translation>DOK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"435\"/>\n        <source>Equipment</source>\n        <translation>设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"448\"/>\n        <source>Antennas</source>\n        <translation>天线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"454\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1505\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2547\"/>\n        <source>Profiles</source>\n        <translation>配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"486\"/>\n        <source>Description</source>\n        <translation>描述</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"500\"/>\n        <source>Azimuth Beamwidth </source>\n        <translation>方位波束宽度 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"507\"/>\n        <source>Azimuth Offset</source>\n        <translation>方位偏移</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"520\"/>\n        <source>Valid range value is 0° - 100° (0° Unspecified)</source>\n        <translation>有效值为 0° - 100° (0° 未指定)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"523\"/>\n        <source>Unspecified</source>\n        <translation>未指定</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"526\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"545\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3178\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3203\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3228\"/>\n        <source>°</source>\n        <translation>°</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"584\"/>\n        <source>List of all available Antennas</source>\n        <translation>所有可用天线列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"611\"/>\n        <source>CW Keyers</source>\n        <translation>CW电键</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"617\"/>\n        <source>Keyer Profiles</source>\n        <translation>电键配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"924\"/>\n        <source>List of all available CW Keyers</source>\n        <translation>所有可用CW电键列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"658\"/>\n        <source>Model</source>\n        <translation>型号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"668\"/>\n        <source>Keyer Mode</source>\n        <translation>电键模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"690\"/>\n        <source>Swap Paddles</source>\n        <translation>交换嘀/嗒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"704\"/>\n        <source>Paddle Only Sidetone</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"711\"/>\n        <source>Sidetone Freq:</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"730\"/>\n        <source>Default Speed</source>\n        <translation>默认速度</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"743\"/>\n        <source>N/A</source>\n        <translation>N/A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"746\"/>\n        <source> WPM</source>\n        <translation> WPM</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"881\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2488\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2694\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2885\"/>\n        <source>Port</source>\n        <translation>端口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"797\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2108\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2701\"/>\n        <source>Use COMxx for Window or path to COM port under Unix-like OS</source>\n        <translation>Windows 使用 COMxx，类unix操作系统使用路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"804\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2124\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2708\"/>\n        <source>Baudrate</source>\n        <translation>波特率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"812\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2716\"/>\n        <source>115200</source>\n        <translation>115200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"817\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2148\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2721\"/>\n        <source>57600</source>\n        <translation>57600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"822\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2153\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2726\"/>\n        <source>38400</source>\n        <translation>38400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"827\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2158\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2731\"/>\n        <source>19200</source>\n        <translation>19200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"832\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2163\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2736\"/>\n        <source>9600</source>\n        <translation>9600</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"837\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2168\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2741\"/>\n        <source>4800</source>\n        <translation>4800</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"842\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2173\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2746\"/>\n        <source>2400</source>\n        <translation>2400</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"847\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2751\"/>\n        <source>1200</source>\n        <translation>1200</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"871\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2473\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2870\"/>\n        <source>Host Name</source>\n        <translation>主机名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"888\"/>\n        <source>HamLib does not support to change a destination port.</source>\n        <translation>HamLib 不支持修改目的端口。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"944\"/>\n        <source>CW Shortcut Profiles</source>\n        <translation>CW 快捷配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1470\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2935\"/>\n        <source>List of all available CW Shortcuts Profiles</source>\n        <translation>所有可用 CW 快捷配置文件列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1001\"/>\n        <source>F1</source>\n        <translation>F1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1026\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1104\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1317\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1383\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1449\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3021\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3066\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3099\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3132\"/>\n        <source>Short Desciption of the Button (up to 7 chars)</source>\n        <translation>按钮的简短说明 (不超过7个字符)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1085\"/>\n        <source>F2</source>\n        <translation>F2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1304\"/>\n        <source>F3</source>\n        <translation>F3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1337\"/>\n        <source>F4</source>\n        <translation>F4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1370\"/>\n        <source>F5</source>\n        <translation>F5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1403\"/>\n        <source>F6</source>\n        <translation>F6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1436\"/>\n        <source>F7</source>\n        <translation>F7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1484\"/>\n        <source>Rigs</source>\n        <translation>电台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2186\"/>\n        <source>CIV Addr</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2205\"/>\n        <source>Auto</source>\n        <translation type=\"unfinished\">自动</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2333\"/>\n        <source>RTS</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2364\"/>\n        <source>DTR</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2527\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2573\"/>\n        <source>List of all available Rigs</source>\n        <translation>所有可用电台列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3764\"/>\n        <source>Leave empty for auto-detection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3785\"/>\n        <source>Auto-detect TQSL path</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3788\"/>\n        <source>Auto-Detect</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3797\"/>\n        <source>TQSL Version</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4404\"/>\n        <source>Color CQ Spots</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4417\"/>\n        <source>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4716\"/>\n        <source>Unit System</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4725\"/>\n        <source>Metric</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4735\"/>\n        <source>Imperial</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1596\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2615\"/>\n        <source>Interface</source>\n        <translation>界面</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1620\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1632\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1661\"/>\n        <source>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</source>\n        <translation>最小和最大 TX 频率。特定范围由设置中允许的波段导出。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1623\"/>\n        <source>TX Range</source>\n        <translation>发射范围</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1651\"/>\n        <source>-</source>\n        <translation>-</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1691\"/>\n        <source>Enter manually RIT or Transverter Offset</source>\n        <translation>手动输入 RIT 或变频器偏移量</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1635\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1664\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1697\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1744\"/>\n        <source> MHz</source>\n        <translation> MHz</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1044\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1116\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1146\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1176\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1206\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1236\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1266\"/>\n        <source>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1694\"/>\n        <source>RX: </source>\n        <translation type=\"unfinished\">接收: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1738\"/>\n        <source>Enter manually XIT or Transverter offset</source>\n        <translation>手动输入 XIT 或转换器偏移量</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1741\"/>\n        <source>TX: </source>\n        <translation type=\"unfinished\">发射: </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1762\"/>\n        <source>Default PWR</source>\n        <translation>默认功率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1769\"/>\n        <source>Enter default PWR (ex. when Rig is disconnected)</source>\n        <translation>输入默认功率 (例如，当设备断开连接时)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1772\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3150\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3175\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3200\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3225\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1775\"/>\n        <source> W</source>\n        <translation> 瓦</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1791\"/>\n        <source>Assigned CW Keyer</source>\n        <translation>指定CW电键</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1801\"/>\n        <source>Rig Features</source>\n        <translation>电台特性</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1816\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1826\"/>\n        <source>VFO</source>\n        <translation>VFO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1836\"/>\n        <source>Freq</source>\n        <translation>频率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1853\"/>\n        <source>QSY Wiping</source>\n        <translation>QSY擦除</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1860\"/>\n        <source>Power</source>\n        <translation>功率</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1870\"/>\n        <source>PTT State</source>\n        <translation>PTT状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1888\"/>\n        <source>TX Offset (XIT)</source>\n        <translation>发射偏移(XIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1895\"/>\n        <source>RX Offset (RIT)</source>\n        <translation>接收偏移(RIT)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1916\"/>\n        <source>CW Keyer Speed</source>\n        <translation>CW电键速度</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1923\"/>\n        <source>CW Speed Sync</source>\n        <translation>CW速度同步</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1951\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2233\"/>\n        <source>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1954\"/>\n        <source>Share Rig via port</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1974\"/>\n        <source>Advanced...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2027\"/>\n        <source>Poll Interval</source>\n        <translation>轮询间隔</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2040\"/>\n        <source> ms</source>\n        <translation> 毫秒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2095\"/>\n        <source>Rig Port</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2374\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2759\"/>\n        <source>Data Bits</source>\n        <translation>数据位</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2238\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2766\"/>\n        <source>Flow Control</source>\n        <translation>流控制</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2263\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2836\"/>\n        <source>Parity</source>\n        <translation>校验</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2393\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2779\"/>\n        <source>8</source>\n        <translation>8</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2398\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2784\"/>\n        <source>7</source>\n        <translation>7</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2403\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2789\"/>\n        <source>6</source>\n        <translation>6</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2408\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2794\"/>\n        <source>5</source>\n        <translation>5</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2416\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2802\"/>\n        <source>Stop Bits</source>\n        <translation>停止位</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2436\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2813\"/>\n        <source>1</source>\n        <translation>1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2441\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2818\"/>\n        <source>2</source>\n        <translation>2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2288\"/>\n        <source>PTT Type</source>\n        <translation>PTT类型</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2303\"/>\n        <source>PTT Port</source>\n        <translation>PTT端口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1937\"/>\n        <source>DX Spots to Rig</source>\n        <translation>DX 报点到电台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3575\"/>\n        <source>QSOs are uploaded immediately</source>\n        <translation>QSO 将立即上传</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3853\"/>\n        <source>Default API Key</source>\n        <translation>默认API密钥</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3883\"/>\n        <source>Callsign-specific API Keys</source>\n        <translation>特定呼号的API密匙</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3955\"/>\n        <source>Wavelog</source>\n        <translation>Wavelog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3991\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2680\"/>\n        <source>API Key</source>\n        <translation>API密钥</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3977\"/>\n        <source>Endpoint</source>\n        <translation>站点地址</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4006\"/>\n        <source>Others</source>\n        <translation>其他</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4024\"/>\n        <source>Status Confirmed By</source>\n        <translation>确认自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4046\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4231\"/>\n        <source>The &apos;&gt;&apos; character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: &apos;5&gt;9&apos; means the cursor will be positioned on the second character</source>\n        <translation>“&gt;” 字符被解读为 “报告” 列中初始光标位置的标记。 &lt;br/&gt;示例：“5&gt;9” 表示光标将定位在第二个字符上</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4527\"/>\n        <source>Rig Status</source>\n        <translation>设备状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4534\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;当设备状态发生变化时，QLog向其发送 UDP 通知数据包的 IP 地址列表。&lt;/p&gt;IP地址用空格分隔，形式为IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4561\"/>\n        <source>GUI</source>\n        <translation>用户界面</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4672\"/>\n        <source>Time Format</source>\n        <translation>时间格式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4681\"/>\n        <source>24-hour</source>\n        <translation>24小时</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4691\"/>\n        <source>AM/PM</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4569\"/>\n        <source>Date Format</source>\n        <translation>日期格式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4578\"/>\n        <source>System</source>\n        <translation>系统</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4588\"/>\n        <source>Custom</source>\n        <translation>自定义</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4647\"/>\n        <source>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</source>\n        <translation>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;时间格式文档&lt;/a&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1996\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2642\"/>\n        <source>Port Type</source>\n        <translation>端口类型</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2650\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"141\"/>\n        <source>Serial</source>\n        <translation>串口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2655\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4264\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"142\"/>\n        <source>Network</source>\n        <translation>网络</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2541\"/>\n        <source>Rotators</source>\n        <translation>旋转云台</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"383\"/>\n        <source>Operator Callsign</source>\n        <translation>操作员呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"362\"/>\n        <source>Station Callsign</source>\n        <translation>电台呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"341\"/>\n        <source>Callsign of operator (Optional parameter, if different from station callsign)</source>\n        <translation>操作员的呼号（可选参数，如果操作员呼号与电台呼号不相同）</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"161\"/>\n        <source>County</source>\n        <translation>县/郡</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"227\"/>\n        <source>Station County Location (Optional parameter)</source>\n        <translation>电台地址（可选参数）</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1676\"/>\n        <source>Offsets</source>\n        <translation>偏移</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"1902\"/>\n        <source>Split</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2923\"/>\n        <source>User Buttons Profiles</source>\n        <translation>用户按钮配置文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"2996\"/>\n        <source>Button 1</source>\n        <translation>按钮1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3047\"/>\n        <source>Button 2</source>\n        <translation>按钮2</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3086\"/>\n        <source>Button 3</source>\n        <translation>按钮3</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3119\"/>\n        <source>Button 4</source>\n        <translation>按钮4</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3271\"/>\n        <source>Callbook</source>\n        <translation>电台黄页</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3277\"/>\n        <source>Query Order</source>\n        <translation>查询顺序</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3283\"/>\n        <source>Primary</source>\n        <translation>首选</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3295\"/>\n        <source>Secondary</source>\n        <translation>次选</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3310\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"315\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2097\"/>\n        <source>HamQTH</source>\n        <translation>HamQTH</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3316\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3356\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3608\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3731\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4131\"/>\n        <source>Username</source>\n        <translation>用户名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3330\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3370\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3551\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3618\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3741\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4141\"/>\n        <source>Password</source>\n        <translation>密码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3350\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3831\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"316\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2090\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3387\"/>\n        <source>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</source>\n        <translation>&lt;b&gt;注意：&lt;/b&gt;建议使用 QRZ XML 订阅来获取详细信息。如果没有订阅，您只能从 QRZ 获取有限的数据，例如缺少网格和其他字段。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3407\"/>\n        <source>Web Lookup Button</source>\n        <translation>Web 查找按钮</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3413\"/>\n        <source>URL</source>\n        <translation>URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3422\"/>\n        <source>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</source>\n        <translation>指定要用于快速搜索的URL。&lt;DXCALL&gt; 宏将被当前的呼号替换</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3429\"/>\n        <source>Test URL with your Callsign</source>\n        <translation>使用您的呼号来测试 URL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3432\"/>\n        <source>Test</source>\n        <translation>测试</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3458\"/>\n        <source>Clubs</source>\n        <translation>俱乐部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3464\"/>\n        <source>Active Lists</source>\n        <translation>活跃列表</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3490\"/>\n        <source>Sync &amp;&amp; QSL</source>\n        <translation>同步 &amp;&amp; QSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3519\"/>\n        <source>ClubLog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3541\"/>\n        <source>E-Mail</source>\n        <translation>电子邮件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3565\"/>\n        <source>Immediately Upload</source>\n        <translation>立即上传</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3586\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4053\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3633\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3665\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3675\"/>\n        <source>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</source>\n        <translation>它不是密码。这是注册 HRDLOG.net 后通过电子邮件收到的上传代码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3668\"/>\n        <source>Upload Code</source>\n        <translation>上传代码</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3685\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3698\"/>\n        <source>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</source>\n        <translation>如果它被启用并且设备已连接，那么 QLog 会定期向 HRDLog 发送 On-Air 消息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3688\"/>\n        <source>Send On-Air</source>\n        <translation>发送 On-Air</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3709\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4039\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3755\"/>\n        <source>TQSL Path</source>\n        <translation>TQSL路径</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3774\"/>\n        <source>Browse</source>\n        <translation>浏览</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"3823\"/>\n        <source>Using an internal TQSL instance</source>\n        <translation>使用内部 TQSL 实例</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4096\"/>\n        <source>Chat</source>\n        <translation>聊天</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4168\"/>\n        <source>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</source>\n        <translation>&lt;b&gt;安全通知:&lt;/b&gt; QLog将所有密码存储在安全存储中。不幸的是，ON4KST使用一种协议，该协议将密码以明文形式通过不安全的通道发送。&lt;/p&gt;&lt;p&gt;请谨慎选择此服务的密码，因为您的密码以明文形式通过不安全的通道发送。&lt;/p&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4196\"/>\n        <source>Bands</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4225\"/>\n        <source>Modes</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4795\"/>\n        <source>Danger Zone</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4814\"/>\n        <source>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4849\"/>\n        <source>Delete All QSOs</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4878\"/>\n        <source>Delete All Passwords from the Secure Store</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4018\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"223\"/>\n        <source>DXCC</source>\n        <translation>DXCC</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4270\"/>\n        <source>Wsjtx</source>\n        <translation>Wsjtx</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4276\"/>\n        <source>Raw UDP Forward</source>\n        <translation>原始UDP转发</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4283\"/>\n        <source>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; QLog转发UDP WSJT-X原始报文的IP地址列表。&lt;/p&gt; IP地址之间用空格分隔，格式为IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4286\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4469\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4486\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4503\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4520\"/>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4537\"/>\n        <source>ex. 192.168.1.1:1234 192.168.2.1:1234</source>\n        <translation>例. 192.168.1.1:1234 192.168.2.1:1234</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4293\"/>\n        <source>Port </source>\n        <translation>端口 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4306\"/>\n        <source>Port where QLog listens an incoming traffic from WSJT-X</source>\n        <translation>QLog 监听来自 WSJT-X 的传入数据流的端口</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4322\"/>\n        <source>Join Multicast</source>\n        <translation>加入多播</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4388\"/>\n        <source>Enable/Disable Multicast option for WSJTX</source>\n        <translation>启用/禁用 WSJTX 的多播选项</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4375\"/>\n        <source>Multicast Address</source>\n        <translation>多播地址</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4337\"/>\n        <source>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</source>\n        <translation>指定组播地址。&lt;br&gt;在某些Linux系统上，可能需要在环路网络接口上启用多播。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4344\"/>\n        <source>TTL</source>\n        <translation>TTL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4357\"/>\n        <source>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </source>\n        <translation>生存时间 (Time-To-Live) 决定了组播数据包在内部网中传播的范围。 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4430\"/>\n        <source>Notifications</source>\n        <translation>通知</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4436\"/>\n        <source>LogID</source>\n        <translation>日志ID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4446\"/>\n        <source>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</source>\n        <translation>&lt;p&gt;为当前日志分配 LogID。&lt;/p&gt; LogID作为唯一实例标识在网络通知消息中发送。&lt;p&gt;该ID为自动生成，不可手动修改&lt;/&gt;</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4459\"/>\n        <source>DX Spots</source>\n        <translation>DX 报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4466\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; QLog 发送 DX 集群报点 UDP 通知报文的 IP 地址列表。&lt;/p&gt; IP 地址之间用空格分隔，格式为 IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4476\"/>\n        <source>Spot Alerts</source>\n        <translation>实时报点提醒</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4483\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; QLog 向用户发送 实时报点提醒 UDP 报文的 IP 地址列表。&lt;/p&gt; IP 地址之间用空格分隔，格式为 IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4493\"/>\n        <source>QSO Changes </source>\n        <translation>QSO 变更 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4500\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt;日志中 新增/更新/删 除QSO时，QLog 向其发送 UDP 通知报文的 IP 地址列表。&lt;/p&gt; IP地址之间用空格分隔，格式为 IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4510\"/>\n        <source>Wsjtx CQ Spots</source>\n        <translation>WSJTX CQ 报点</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.ui\" line=\"4517\"/>\n        <source>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</source>\n        <translation>&lt;p&gt; QLog 通过 WSJTX CQ 报点 发送 UDP 通知报文的 IP 地址列表。&lt;/p&gt; IP地址之间用空格分隔，格式为 IP:PORT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"143\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"750\"/>\n        <source>Special - Omnirig</source>\n        <translation>特别的 - Ominirig</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"148\"/>\n        <source>Cannot be changed</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"221\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"239\"/>\n        <source>Name</source>\n        <translation>姓名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"222\"/>\n        <source>Report</source>\n        <translation>报告</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"224\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"242\"/>\n        <source>State</source>\n        <translation>状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"240\"/>\n        <source>Start (MHz)</source>\n        <translation>起始(MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"241\"/>\n        <source>End (MHz)</source>\n        <translation>结束(MHz)</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"243\"/>\n        <source>SAT Mode</source>\n        <translation>卫星模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"314\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2089\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2096\"/>\n        <source>Disabled</source>\n        <translation>禁用</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"67\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"83\"/>\n        <source>None</source>\n        <translation>无</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"68\"/>\n        <source>Hardware</source>\n        <translation>硬件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"69\"/>\n        <source>Software</source>\n        <translation>软件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"74\"/>\n        <source>No</source>\n        <translation>否</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"75\"/>\n        <source>Even</source>\n        <translation>偶校验</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"76\"/>\n        <source>Odd</source>\n        <translation>奇校验</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"77\"/>\n        <source>Mark</source>\n        <translation>1校验</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"78\"/>\n        <source>Space</source>\n        <translation>0校验</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"323\"/>\n        <source>Dummy</source>\n        <translation>虚拟</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"324\"/>\n        <source>Morse Over CAT</source>\n        <translation>Morse Over CAT</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"325\"/>\n        <source>WinKey</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"326\"/>\n        <source>CWDaemon</source>\n        <translation>CWDaemon</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"327\"/>\n        <source>FLDigi</source>\n        <translation>FLDigi</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"330\"/>\n        <source>Single Paddle</source>\n        <translation>单桨电键</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"331\"/>\n        <source>IAMBIC A</source>\n        <translation>IAMBIC A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"332\"/>\n        <source>IAMBIC B</source>\n        <translation>IAMBIC B</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"333\"/>\n        <source>Ultimate</source>\n        <translation>Ultimate</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"84\"/>\n        <source>High</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"85\"/>\n        <source>Low</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"363\"/>\n        <source>Press &lt;b&gt;Modify&lt;/b&gt; to confirm the profile changes or &lt;b&gt;Cancel&lt;/b&gt;.</source>\n        <translation>按&lt;b&gt;修改&lt;/b&gt;确认更改配置文件或按&lt;b&gt;取消&lt;/b&gt;。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"378\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"466\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"620\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"802\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"873\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"961\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1016\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1047\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1091\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1200\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1280\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1313\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1366\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1474\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1564\"/>\n        <source>Modify</source>\n        <translation>修改</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"419\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"437\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"790\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"957\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1043\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1115\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1309\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1405\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1411\"/>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1417\"/>\n        <source>Must not be empty</source>\n        <translation>不能为空</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1791\"/>\n        <source>Select File</source>\n        <translation>选择文件</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1827\"/>\n        <source>Auto Detect</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1828\"/>\n        <source>TQSL was not found on this system.\nPlease install TQSL or specify the path manually.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"1844\"/>\n        <source>Not found</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2228\"/>\n        <source>Rig sharing is only available for Hamlib driver</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2230\"/>\n        <source>Rig sharing is not available for network connection</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>Delete Passwords</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2264\"/>\n        <source>All passwords have been deleted</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2275\"/>\n        <source>Deleting all QSOs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Error</source>\n        <translation type=\"unfinished\">错误</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2292\"/>\n        <source>Failed to delete all QSOs.</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2665\"/>\n        <source>members</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/SettingsDialog.cpp\" line=\"2672\"/>\n        <source>Required internet connection during application start</source>\n        <translation>在应用程序启动时需要互联网连接</translation>\n    </message>\n</context>\n<context>\n    <name>ShortcutEditorModel</name>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"35\"/>\n        <source>Description</source>\n        <translation>描述</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"36\"/>\n        <source>Shortcut</source>\n        <translation>快捷键</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"80\"/>\n        <source>Conflict with a built-in shortcut</source>\n        <translation>与内置快捷键发生冲突</translation>\n    </message>\n    <message>\n        <location filename=\"../models/ShortcutEditorModel.cpp\" line=\"86\"/>\n        <source>Conflict with a user-defined shortcut</source>\n        <translation>与用户定义快捷键发生冲突</translation>\n    </message>\n</context>\n<context>\n    <name>ShowUploadDialog</name>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"14\"/>\n        <source>QSOs to Upload</source>\n        <translation>需要上传的QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.ui\" line=\"20\"/>\n        <source>Selected QSO</source>\n        <translation>已选择的QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/ShowUploadDialog.cpp\" line=\"11\"/>\n        <source>Upload</source>\n        <translation>上传</translation>\n    </message>\n</context>\n<context>\n    <name>SmartSearchBox</name>\n    <message>\n        <location filename=\"../ui/component/SmartSearchBox.cpp\" line=\"32\"/>\n        <source>Search</source>\n        <translation>搜索</translation>\n    </message>\n</context>\n<context>\n    <name>StatisticsWidget</name>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"14\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Statistics</source>\n        <translation>统计分析</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"424\"/>\n        <source>My Antenna</source>\n        <translation>我的天线</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"385\"/>\n        <source>My Gridsquare</source>\n        <translation>我的网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"207\"/>\n        <source>User Filter</source>\n        <translation type=\"unfinished\">用户过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"220\"/>\n        <source>Confirmed by</source>\n        <translation type=\"unfinished\">确认自</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"308\"/>\n        <source>QSOs per</source>\n        <translation>QSOs 每</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"313\"/>\n        <source>Percents</source>\n        <translation>百分比</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"318\"/>\n        <source>Top 10</source>\n        <translation>前 10 名</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"323\"/>\n        <source>Histogram</source>\n        <translation>直方图</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"328\"/>\n        <source>Show on Map</source>\n        <translation>在地图上显示</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"285\"/>\n        <source>Graph Type</source>\n        <translation>图表类型</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"141\"/>\n        <source>to</source>\n        <translation>至</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"401\"/>\n        <source>My Rig</source>\n        <translation>我的设备</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"368\"/>\n        <source>My Callsign</source>\n        <translation>我的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"197\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"732\"/>\n        <source>Band</source>\n        <translation>波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"66\"/>\n        <source>Date Range</source>\n        <translation>日期范围</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"232\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"242\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.ui\" line=\"252\"/>\n        <source>Paper</source>\n        <translation>纸质卡片</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"727\"/>\n        <source>Year</source>\n        <translation>年</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"728\"/>\n        <source>Month</source>\n        <translation>月</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"729\"/>\n        <source>Day in Week</source>\n        <translation>星期几</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"730\"/>\n        <source>Hour</source>\n        <translation>小时</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"731\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"733\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"734\"/>\n        <source>Propagation Mode</source>\n        <translation>传播模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"741\"/>\n        <source>Confirmed / Not Confirmed</source>\n        <translation>已确认/未确认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"748\"/>\n        <source>Countries</source>\n        <translation>国家/地区</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"749\"/>\n        <source>Big Gridsquares</source>\n        <translation>大网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"758\"/>\n        <source>Distance</source>\n        <translation>距离</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"765\"/>\n        <source>QSOs</source>\n        <translation>QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"766\"/>\n        <source>Confirmed/Worked Grids</source>\n        <translation>确认/已通联 网格</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"767\"/>\n        <source>ODX</source>\n        <translation>ODX</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"140\"/>\n        <source>Sun</source>\n        <translation>星期日</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"141\"/>\n        <source>Mon</source>\n        <translation>星期一</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"142\"/>\n        <source>Tue</source>\n        <translation>星期二</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"143\"/>\n        <source>Wed</source>\n        <translation>星期三</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"144\"/>\n        <source>Thu</source>\n        <translation>星期四</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"145\"/>\n        <source>Fri</source>\n        <translation>星期五</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"146\"/>\n        <source>Sat</source>\n        <translation>星期六</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"178\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"182\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"189\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"194\"/>\n        <source>Not specified</source>\n        <translation>未指定</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"236\"/>\n        <source>Confirmed </source>\n        <translation>已确认 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"237\"/>\n        <source>Not Confirmed </source>\n        <translation>未确认 </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"437\"/>\n        <source>No User Filter</source>\n        <translation type=\"unfinished\">无用户筛选器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"640\"/>\n        <source>Over 50000 QSOs. Display them?</source>\n        <translation>超过50000个QSO。显示全部吗？</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"652\"/>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"654\"/>\n        <source>Rendering QSOs...</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/StatisticsWidget.cpp\" line=\"786\"/>\n        <source>All</source>\n        <translation>全部</translation>\n    </message>\n</context>\n<context>\n    <name>TCIRigDrv</name>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"20\"/>\n        <source>Rig 0</source>\n        <translation>设备 0</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"21\"/>\n        <source>Rig 1</source>\n        <translation>设备 1</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"22\"/>\n        <source>Rig 2</source>\n        <translation>设备 2</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"23\"/>\n        <source>Rig 3</source>\n        <translation>设备 3</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"388\"/>\n        <source>Error Occurred</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"618\"/>\n        <source>Rig status changed</source>\n        <translation>设备状态已更改</translation>\n    </message>\n    <message>\n        <location filename=\"../rig/drivers/TCIRigDrv.cpp\" line=\"619\"/>\n        <source>Rig is not connected</source>\n        <translation>设备未连接</translation>\n    </message>\n</context>\n<context>\n    <name>TimestampFormatDelegate</name>\n    <message>\n        <location filename=\"../ui/component/StyleItemDelegate.h\" line=\"120\"/>\n        <source>Blank</source>\n        <translation>空白</translation>\n    </message>\n</context>\n<context>\n    <name>ToAllTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"428\"/>\n        <source>Time</source>\n        <translation>时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"429\"/>\n        <source>Spotter</source>\n        <translation>报点者</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"430\"/>\n        <source>Message</source>\n        <translation>消息</translation>\n    </message>\n</context>\n<context>\n    <name>UploadQSODialog</name>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"20\"/>\n        <source>Upload QSOs</source>\n        <translation>上传 QSOs</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"44\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"319\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"39\"/>\n        <source>eQSL</source>\n        <translation>eQSL</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"68\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"30\"/>\n        <source>LoTW</source>\n        <translation>LoTW</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"102\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"66\"/>\n        <source>QRZ.com</source>\n        <translation>QRZ.com</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"126\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"410\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"48\"/>\n        <source>Clublog</source>\n        <translation>Clublog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"160\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"57\"/>\n        <source>HRDLog</source>\n        <translation>HRDLog</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"187\"/>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"507\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"75\"/>\n        <source>Wavelog</source>\n        <translation></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"210\"/>\n        <source>Filters</source>\n        <translation>过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"216\"/>\n        <source>Station Profile</source>\n        <translation>台站配置</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"233\"/>\n        <source>My Callsign</source>\n        <translation>我的呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"257\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"269\"/>\n        <source>Include QSOs Status</source>\n        <translation>包括 QSOs 状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"278\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>在正常情况下，此状态表示&lt;b&gt;“不发送”&lt;/b&gt;。&lt;br/&gt;然而，有时可能希望在发送 QSL 时忽略此设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"281\"/>\n        <source>No</source>\n        <translation>否</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"288\"/>\n        <source>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</source>\n        <translation>在正常情况下，此状态表示&lt;b&gt;“忽略/无效”&lt;/b&gt;。&lt;br/&gt;然而，有时可能希望在发送 QSL 时忽略此设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"291\"/>\n        <source>Ignore</source>\n        <translation>忽略</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"348\"/>\n        <source>None</source>\n        <translation>无</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"358\"/>\n        <source>QSLs Message</source>\n        <translation>QSLs 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"365\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"390\"/>\n        <source>QSL Message Field</source>\n        <translation>QSL 确认信息字段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"397\"/>\n        <source>QTH Profile</source>\n        <translation>QTH 昵称</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"443\"/>\n        <source>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</source>\n        <translation>该选项删除 Clublog 中的所有 QSO，&lt;br&gt;并根据过滤器上传所有 QSO，而不管它们的状态如何。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"453\"/>\n        <source>Clear Clublog and reupload QSOs</source>\n        <translation>清除 Clublog 并重新上传 QSO</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"463\"/>\n        <source>LoTW / TQSL</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"481\"/>\n        <source>TQSL Station Location</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"513\"/>\n        <source>Station Profile ID</source>\n        <translation>台站配置ID</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"576\"/>\n        <source>Reupload All</source>\n        <translatorcomment>点击后会触发 “重新上传全部已选定 / 历史上传过的内容” 的操作，常用于修复上传失败</translatorcomment>\n        <translation>重新上传全部</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.ui\" line=\"647\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Show QSOs...</source>\n        <translation>显示QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"83\"/>\n        <source>&amp;Upload</source>\n        <translation>&amp;上传</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"103\"/>\n        <source>Unspecified</source>\n        <translation type=\"unfinished\">未指定</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"182\"/>\n        <source>Hide QSOs...</source>\n        <translation>隐藏 QSOs...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"266\"/>\n        <source>Uploading to %1</source>\n        <translation>上传到 %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"267\"/>\n        <source>Cancel</source>\n        <translation>取消</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"372\"/>\n        <source>QLog Warning - %1</source>\n        <translation>QLog警告- %1</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"311\"/>\n        <source>Cannot update QSO Status</source>\n        <translation>无法更新 QSO 状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"373\"/>\n        <source>Cannot upload the QSO(s): </source>\n        <translation>无法上传该 QSO(s): </translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QLog Information</source>\n        <translation>QLog 信息</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"435\"/>\n        <source>No QSO found to upload.</source>\n        <translation>未找到要上传的QSO。</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"446\"/>\n        <source>QSO(s) were uploaded to the selected services</source>\n        <translation>QSO(s)已上传至选定的服务</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Time</source>\n        <translation>时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Mode</source>\n        <translation>模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"488\"/>\n        <source>Upload to</source>\n        <translation>上传到</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"544\"/>\n        <source>The values below will be used when an input record does not contain the ADIF values</source>\n        <translation>当输入记录不包含ADIF值时，将使用下面的值</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"674\"/>\n        <source>Any</source>\n        <translation>任何</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"733\"/>\n        <source>Location callsign (%1) and grid (%2) do not match selected filters</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"739\"/>\n        <source>Location callsign (%1) does not match selected callsign (%2)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"745\"/>\n        <source>Location grid (%1) does not match selected grid (%2)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.cpp\" line=\"763\"/>\n        <source>Unknown</source>\n        <translation>未知</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/UploadQSODialog.h\" line=\"76\"/>\n        <source>Service is not configured properly.&lt;p&gt; Please, use &lt;b&gt;Settings&lt;/b&gt; dialog to configure it.&lt;/p&gt;</source>\n        <translation>服务配置不正确。&lt;p&gt;请使用&lt;b&gt;设置&lt;/b&gt;对话框进行配置。&lt;/p&gt;</translation>\n    </message>\n</context>\n<context>\n    <name>UserListModel</name>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"739\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"740\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"741\"/>\n        <source>Distance</source>\n        <translation>距离</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"742\"/>\n        <source>Azimuth</source>\n        <translation>方位</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/KSTChatWidget.cpp\" line=\"743\"/>\n        <source>Comment</source>\n        <translation>备注</translation>\n    </message>\n</context>\n<context>\n    <name>WCYTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"297\"/>\n        <source>Time</source>\n        <translation>时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"298\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"299\"/>\n        <source>expK</source>\n        <translation>expK</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"300\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"301\"/>\n        <source>R</source>\n        <translation>R</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"302\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"303\"/>\n        <source>SA</source>\n        <translation>SA</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"304\"/>\n        <source>GMF</source>\n        <translation>GMF</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"305\"/>\n        <source>Au</source>\n        <translation>Au</translation>\n    </message>\n</context>\n<context>\n    <name>WWVTableModel</name>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"367\"/>\n        <source>Time</source>\n        <translation>时间</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"368\"/>\n        <source>SFI</source>\n        <translation>SFI</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"369\"/>\n        <source>A</source>\n        <translation>A</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"370\"/>\n        <source>K</source>\n        <translation>K</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/DxWidget.cpp\" line=\"371\"/>\n        <source>Info</source>\n        <translation>信息</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxFilterDialog</name>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"14\"/>\n        <source>WSJTX Filters</source>\n        <translation>WSJTX 过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"24\"/>\n        <source>General Filters</source>\n        <translation>通用过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"30\"/>\n        <source>Log Status</source>\n        <translation>Log 状态</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"38\"/>\n        <source>New Band</source>\n        <translation>新波段</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"45\"/>\n        <source>New Mode</source>\n        <translation>新模式</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"52\"/>\n        <source>New Entity</source>\n        <translation>新实体</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"59\"/>\n        <source>New Slot</source>\n        <translation>新组合</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"66\"/>\n        <source>Worked</source>\n        <translation>已通联</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"73\"/>\n        <source>Confirmed</source>\n        <translation>已确认</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"85\"/>\n        <source>Continent</source>\n        <translation>大洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"93\"/>\n        <source>North America</source>\n        <translation>北美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"100\"/>\n        <source>Europe</source>\n        <translation>欧洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"107\"/>\n        <source>South America</source>\n        <translation>南美洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"114\"/>\n        <source>Africa</source>\n        <translation>非洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"121\"/>\n        <source>Antarctica</source>\n        <translation>南极洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"128\"/>\n        <source>Asia</source>\n        <translation>亚洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"135\"/>\n        <source>Oceania</source>\n        <translation>大洋洲</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"149\"/>\n        <source>Distance more than</source>\n        <translation>距离大于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"173\"/>\n        <source>SNR better than</source>\n        <translation>SNR 好于</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"180\"/>\n        <source> dB</source>\n        <translation> dB</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"209\"/>\n        <source>Extended Filters</source>\n        <translation>扩展过滤器</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.ui\" line=\"215\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxFilterDialog.cpp\" line=\"140\"/>\n        <source>No Club List is enabled</source>\n        <translation>未启用俱乐部列表</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxTableModel</name>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"85\"/>\n        <source>Callsign</source>\n        <translation>呼号</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"86\"/>\n        <source>Gridsquare</source>\n        <translation>网格坐标</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"87\"/>\n        <source>Distance</source>\n        <translation>距离</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"88\"/>\n        <source>SNR</source>\n        <translation>SNR</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"89\"/>\n        <source>Last Activity</source>\n        <translation>前次活跃</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"90\"/>\n        <source>Last Message</source>\n        <translation>前次消息</translation>\n    </message>\n    <message>\n        <location filename=\"../models/WsjtxTableModel.cpp\" line=\"91\"/>\n        <source>Member</source>\n        <translation>成员</translation>\n    </message>\n</context>\n<context>\n    <name>WsjtxWidget</name>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"14\"/>\n        <source>Form</source>\n        <translation>Form</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"41\"/>\n        <source>Filtered</source>\n        <translation>过滤的内容</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"118\"/>\n        <source>Column Visibility...</source>\n        <translation>列可见性...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"130\"/>\n        <source>Filter...</source>\n        <translation>过滤器...</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"121\"/>\n        <source>Which columns should be displayed</source>\n        <translation>应该显示哪些列</translation>\n    </message>\n    <message>\n        <location filename=\"../ui/WsjtxWidget.ui\" line=\"133\"/>\n        <source>Filter Spots</source>\n        <translation>报点过滤器</translation>\n    </message>\n</context>\n<context>\n    <name>main</name>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"326\"/>\n        <source>Run with the specific namespace.</source>\n        <translation>使用特定的命名空间运行。</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"327\"/>\n        <source>namespace</source>\n        <translation>命名空间</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"329\"/>\n        <source>Translation file - absolute or relative path and QM file name.</source>\n        <translation>翻译文件 - 绝对或相对路径及 QM 文件名。</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"330\"/>\n        <source>path/QM-filename</source>\n        <translation>路径/QM-文件名</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"332\"/>\n        <source>Set language. &lt;code&gt; example: &apos;en&apos; or &apos;en_US&apos;. Ignore environment setting.</source>\n        <translation>设置语言。&lt;code&gt; 示例: &apos;en&apos; 或 &apos;en_US&apos;。忽略环境设置。</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"333\"/>\n        <source>code</source>\n        <translation>代码</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"335\"/>\n        <source>Writes debug messages to the debug file</source>\n        <translation>将调试信息写入debug文件</translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"337\"/>\n        <source>Process pending database import (internal use)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n    <message>\n        <location filename=\"../core/main.cpp\" line=\"339\"/>\n        <source>Force update of all value lists (DXCC, SATs, etc.)</source>\n        <translation type=\"unfinished\"></translation>\n    </message>\n</context>\n</TS>\n"
  },
  {
    "path": "installer/config/config.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Installer>\n    <Name>QLog</Name>\n    <Version>0.50.0</Version>\n    <Title>QLog</Title>\n    <Publisher>OK1MLG</Publisher>\n    <StartMenuDir>QLog</StartMenuDir>\n    <TargetDir>@ApplicationsDir@/QLog</TargetDir>\n</Installer>\n"
  },
  {
    "path": "installer/packages/de.dl2ic.qlog/meta/installscript.qs",
    "content": "var targetDirectoryPage = null;\n\nfunction Component()\n{\n    installer.gainAdminRights();\n    component.loaded.connect(this, this.installerLoaded);\n}\n\nComponent.prototype.createOperations = function() {\n    component.createOperations();\n\n    if (installer.value(\"os\") === \"win\") {\n       component.addOperation(\"CreateShortcut\",\n\t\t\t      \"@TargetDir@/qlog.exe\",\n\t\t\t      \"@StartMenuDir@/QLog.lnk\",\n\t\t\t      \"workingDirectory=@TargetDir@\");\n    }\n}\n\nComponent.prototype.installerLoaded = function()\n{\n    installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);\n    installer.addWizardPage(component, \"TargetWidget\", QInstaller.TargetDirectory);\n\n    targetDirectoryPage = gui.pageWidgetByObjectName(\"DynamicTargetWidget\");\n    targetDirectoryPage.windowTitle = \"Choose Installation Directory\";\n    targetDirectoryPage.description.setText(\"Please select where the QLog will be installed:\");\n    targetDirectoryPage.targetDirectory.textChanged.connect(this, this.targetDirectoryChanged);\n    targetDirectoryPage.targetDirectory.setText(installer.value(\"TargetDir\"));\n    targetDirectoryPage.targetChooser.released.connect(this, this.targetChooserClicked);\n\n    gui.pageById(QInstaller.ComponentSelection).entered.connect(this, this.componentSelectionPageEntered);\n}\n\nComponent.prototype.targetChooserClicked = function()\n{\n    var dir = QFileDialog.getExistingDirectory(\"\", targetDirectoryPage.targetDirectory.text);\n    targetDirectoryPage.targetDirectory.setText(dir);\n}\n\nComponent.prototype.targetDirectoryChanged = function()\n{\n    var dir = targetDirectoryPage.targetDirectory.text;\n    if (installer.fileExists(dir) && installer.fileExists(dir + \"/maintenancetool.exe\")) {\n        targetDirectoryPage.warning.setText(\"<p style=\\\"color: red\\\">Existing installation detected and will be overwritten.</p>\");\n    }\n    else if (installer.fileExists(dir)) {\n        targetDirectoryPage.warning.setText(\"<p style=\\\"color: red\\\">Installing in existing directory. It will be wiped on uninstallation.</p>\");\n    }\n    else {\n        targetDirectoryPage.warning.setText(\"\");\n    }\n    installer.setValue(\"TargetDir\", dir);\n}\n\nComponent.prototype.componentSelectionPageEntered = function()\n{\n    var dir = installer.value(\"TargetDir\");\n    if (installer.value(\"os\") === \"win\") {\n       if (installer.fileExists(dir) && installer.fileExists(dir + \"/maintenancetool.exe\")) {\n           installer.execute(dir + \"/maintenancetool.exe\", [\"purge\", \"-c\"]);\n       }\n    }\n}\n"
  },
  {
    "path": "installer/packages/de.dl2ic.qlog/meta/package.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Package>\n    <DisplayName>QLog</DisplayName>\n    <Description>The QLog main application.</Description>\n    <Version>0.50.0-1</Version>\n    <ReleaseDate>2026-04-26</ReleaseDate>\n    <Default>true</Default>\n    <Required>true</Required>\n    <Script>installscript.qs</Script>\n    <UserInterfaces>\n       <UserInterface>targetwidget.ui</UserInterface>\n    </UserInterfaces>\n</Package>\n"
  },
  {
    "path": "installer/packages/de.dl2ic.qlog/meta/targetwidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>TargetWidget</class>\n <widget class=\"QWidget\" name=\"TargetWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>491</width>\n    <height>190</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>491</width>\n    <height>190</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"description\">\n     <property name=\"text\">\n      <string/>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLineEdit\" name=\"targetDirectory\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QToolButton\" name=\"targetChooser\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>0</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string>...</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"warning\">\n       <property name=\"enabled\">\n        <bool>true</bool>\n       </property>\n       <property name=\"text\">\n        <string>TextLabel</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>122</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "logformat/AdiFormat.cpp",
    "content": "#include <QSqlRecord>\n#include <QDebug>\n#include <QSqlField>\n#include \"data/Data.h\"\n#include \"AdiFormat.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.adiformat\");\n\n#define ALWAYS_PRESENT true\n\nvoid AdiFormat::exportStart()\n{\n    FCT_IDENTIFICATION;\n\n    // ADIF Spec:\n    // A Header begins with any character other than < and terminates\n    // with a case-insensitive End-Of-Header tag\n    //\n    // Adding an extra space to be compliant with the ADIF specification.\n    // It is the same as in the example in the ADIF resource file.\n    stream << \" \";\n\n    writeField(\"ADIF_VER\", ALWAYS_PRESENT, ADIF_VERSION_STRING);\n    writeField(\"PROGRAMID\", ALWAYS_PRESENT, PROGRAMID_STRING);\n    writeField(\"PROGRAMVERSION\", ALWAYS_PRESENT, VERSION);\n    writeField(\"CREATED_TIMESTAMP\", ALWAYS_PRESENT,\n               QDateTime::currentDateTimeUtc().toString(\"yyyyMMdd hhmmss\"));\n    stream << \"<EOH>\\n\\n\";\n}\n\nvoid AdiFormat::exportContact(const QSqlRecord& record,\n                              QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<record;\n\n    writeSQLRecord(record, applTags);\n\n    stream << \"<eor>\\n\\n\";\n}\n\nvoid AdiFormat::writeField(const QString &name, bool presenceCondition,\n                           const QString &value, const QString &type)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< name\n                                << presenceCondition\n                                << value\n                                << type;\n\n    if (!presenceCondition) return;\n\n    /* ADIF does not support UTF-8 characterset therefore the Accents are remove */\n    QString accentless(Data::removeAccents(value));\n\n    qCDebug(runtime) << \"Accentless: \" << accentless;\n\n    if ( value.isEmpty() || accentless.isEmpty() ) return;\n\n    stream << \"<\" << name << \":\" << accentless.size();\n\n    if (!type.isEmpty()) stream << \":\" << type;\n\n    stream << \">\" << accentless << '\\n';\n}\n\nvoid AdiFormat::writeSQLRecord(const QSqlRecord &record,\n                               QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    for ( int i = 0; i <= record.count(); i++)\n    {\n        const QSqlField &tmpField = record.field(i);\n        const ExportParams &ExportParams = DB2ADIFExportParams.value(tmpField.name());\n\n        if ( ExportParams.isValid )\n            writeField(ExportParams.ADIFName,\n                       tmpField.isValid(),\n                       formatOuput(ExportParams.formatter, tmpField.value()),\n                       ExportParams.outputType );\n    }\n\n    const QVariant &startVariant = record.value(\"start_time\");\n\n    if ( startVariant.isValid() )\n    {\n        const QDateTime &time_start = startVariant.toDateTime().toTimeZone(QTimeZone::utc());\n        writeField(\"qso_date\", startVariant.isValid(),\n                   formatOuput(OutputFieldFormatter::TODATE, time_start));\n        writeField(\"time_on\", startVariant.isValid(),\n                   formatOuput(OutputFieldFormatter::TOTIME, time_start));\n    }\n\n    const QVariant &endVariant = record.value(\"end_time\");\n\n    if ( endVariant.isValid() )\n    {\n        const QDateTime &time_end = record.value(\"end_time\").toDateTime().toTimeZone(QTimeZone::utc());\n        writeField(\"qso_date_off\", endVariant.isValid(),\n                   formatOuput(OutputFieldFormatter::TODATE, time_end));\n        writeField(\"time_off\", endVariant.isValid(),\n                   formatOuput(OutputFieldFormatter::TOTIME, time_end));\n    }\n\n    const QJsonObject &fields = QJsonDocument::fromJson(record.value(\"fields\").toByteArray()).object();\n\n    const QStringList &keys = fields.keys();\n    for (const QString &key : keys)\n    {\n        writeField(key, ALWAYS_PRESENT, fields.value(key).toString());\n    }\n\n    /* Add application-specific tags */\n    if ( applTags )\n    {\n       const QStringList& appKeys = applTags->keys();\n       for (const QString &appkey : appKeys)\n       {\n           writeField(appkey, ALWAYS_PRESENT, applTags->value(appkey));\n       }\n    }\n}\n\nvoid AdiFormat::readField(QString& field, QString& value)\n{\n    FCT_IDENTIFICATION;\n\n    //qCDebug(function_parameters)<<field<< \" \" << value;\n\n    char c;\n\n    QString typeString;\n    QString lengthString;\n    int length = 0;\n\n    while (!stream.atEnd()) {\n        switch (state) {\n        case START:\n            stream >> c;\n            if (c == '<') {\n                inHeader = false;\n                state = KEY;\n                field = \"\";\n            }\n            else {\n                inHeader = true;\n                state = FIELD;\n            }\n            break;\n\n        case FIELD:\n            stream >> c;\n            if (c == '<') {\n                state = KEY;\n                field = \"\";\n            }\n            break;\n\n        case KEY:\n            stream >> c;\n            if (c == ':') {\n                state = SIZE;\n                lengthString = \"\";\n            }\n            else if (c == '>') {\n                state = FIELD;\n                if (inHeader && field.toLower() == \"eoh\") {\n                    inHeader = false;\n                }\n                else {\n                    value = \"\";\n                    return;\n                }\n            }\n            else {\n                field.append(c);\n            }\n            break;\n\n        case SIZE:\n            stream >> c;\n            if (c == ':') {\n                 if (!lengthString.isEmpty()) {\n                    length = lengthString.toInt();\n                 }\n                 state = DATA_TYPE;\n                 typeString = \"\";\n            }\n            else if (c == '>') {\n                if (!lengthString.isEmpty()) {\n                    length = lengthString.toInt();\n                }\n\n                if (length > 0) {\n                    state = VALUE;\n                    value = \"\";\n                }\n                else {\n                    state = FIELD;\n                    if (!inHeader) {\n                        value = \"\";\n                        return;\n                    }\n\n                }\n            }\n            else {\n                lengthString.append(c);\n            }\n            break;\n\n        case DATA_TYPE:\n            stream >> c;\n            if (c == '>') {\n                if (length > 0) {\n                    state = VALUE;\n                    value = \"\";\n                }\n                else {\n                    state = FIELD;\n                    if (!inHeader) {\n                        value = \"\";\n                        return;\n                    }\n                }\n            }\n            else {\n                typeString.append(c);\n            }\n            break;\n\n        case VALUE:\n            value = QString(stream.read(length));\n            state = FIELD;\n            if (!inHeader) {\n                return;\n            }\n            break;\n        }\n    }\n}\n\nvoid AdiFormat::mapContact2SQLRecord(QMap<QString, QVariant> &contact,\n                                     QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    preprocessINTLFields<QMap<QString, QVariant>>(contact);\n\n    /* Set default values if not present */\n    if ( defaults )\n    {\n        const QStringList &keys = defaults->keys();\n\n        for ( const QString &key : keys )\n        {\n            if ( contact.value(key).toString().isEmpty() )\n            {\n                contact.insert(key, defaults->value(key));\n            }\n        }\n        // re-evaluate the fields\n        preprocessINTLFields<QMap<QString, QVariant>>(contact);\n    }\n\n    contactFields2SQLRecord(contact, record);\n\n    /* If we have something unparsed then stored it as JSON to Field column */\n    if ( contact.count() > 0 )\n    {\n        QJsonDocument doc = QJsonDocument::fromVariant(QVariant(contact));\n        record.setValue(\"fields\", QString(doc.toJson()));\n    }\n}\n\nvoid AdiFormat::contactFields2SQLRecord(QMap<QString, QVariant> &contact, QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    record.setValue(\"callsign\", contact.take(\"call\").toString().toUpper());\n    record.setValue(\"rst_rcvd\", contact.take(\"rst_rcvd\"));\n    record.setValue(\"rst_sent\", contact.take(\"rst_sent\"));\n    record.setValue(\"gridsquare\", contact.take(\"gridsquare\").toString().toUpper());\n    record.setValue(\"cqz\", contact.take(\"cqz\"));\n    record.setValue(\"ituz\", contact.take(\"ituz\"));\n    record.setValue(\"freq\", contact.take(\"freq\"));\n    record.setValue(\"band\", contact.take(\"band\").toString().toLower());\n    record.setValue(\"cont\", contact.take(\"cont\").toString().toUpper());\n    record.setValue(\"dxcc\", contact.take(\"dxcc\"));\n    record.setValue(\"pfx\", contact.take(\"pfx\").toString().toUpper());\n    record.setValue(\"state\", contact.take(\"state\"));\n    record.setValue(\"cnty\", contact.take(\"cnty\"));\n    record.setValue(\"cnty_alt\", contact.take(\"cnty_alt\"));\n    record.setValue(\"iota\", contact.take(\"iota\").toString().toUpper());\n    record.setValue(\"qsl_rcvd\", parseQslRcvd(contact.take(\"qsl_rcvd\").toString()));\n    record.setValue(\"qsl_rdate\", parseDate(contact.take(\"qslrdate\").toString()));  //TODO: DIFF MAPPING\n    record.setValue(\"qsl_sent\", parseQslSent(contact.take(\"qsl_sent\").toString()));\n    record.setValue(\"qsl_sdate\", parseDate(contact.take(\"qslsdate\").toString()));   //TODO: DIFF MAPPING\n    record.setValue(\"lotw_qsl_rcvd\", parseQslRcvd(contact.take(\"lotw_qsl_rcvd\").toString()));\n    record.setValue(\"lotw_qslrdate\", parseDate(contact.take(\"lotw_qslrdate\").toString()));\n    record.setValue(\"lotw_qsl_sent\", parseQslSent(contact.take(\"lotw_qsl_sent\").toString()));\n    record.setValue(\"lotw_qslsdate\", parseDate(contact.take(\"lotw_qslsdate\").toString()));\n    record.setValue(\"tx_pwr\", contact.take(\"tx_pwr\"));\n    record.setValue(\"address\", contact.take(\"address\"));\n    record.setValue(\"address_intl\", contact.take(\"address_intl\"));\n    record.setValue(\"age\", contact.take(\"age\"));\n    record.setValue(\"altitude\", contact.take(\"altitude\"));\n    record.setValue(\"a_index\", contact.take(\"a_index\"));\n    record.setValue(\"ant_az\", contact.take(\"ant_az\"));\n    record.setValue(\"ant_el\", contact.take(\"ant_el\"));\n    record.setValue(\"ant_path\", contact.take(\"ant_path\").toString().toUpper());\n    record.setValue(\"arrl_sect\", contact.take(\"arrl_sect\"));\n    record.setValue(\"award_submitted\",contact.take(\"award_submitted\"));\n    record.setValue(\"award_granted\",contact.take(\"award_granted\"));\n    record.setValue(\"band_rx\",contact.take(\"band_rx\").toString().toLower());\n    record.setValue(\"check\",contact.take(\"check\"));\n    record.setValue(\"class\",contact.take(\"class\"));\n    record.setValue(\"clublog_qso_upload_date\",parseDate(contact.take(\"clublog_qso_upload_date\").toString()));\n    record.setValue(\"clublog_qso_upload_status\",parseUploadStatus(contact.take(\"clublog_qso_upload_status\").toString()));\n    record.setValue(\"contacted_op\",contact.take(\"contacted_op\"));\n    record.setValue(\"comment\",contact.take(\"comment\"));\n    record.setValue(\"comment_intl\",contact.take(\"comment_intl\"));\n    record.setValue(\"contest_id\",contact.take(\"contest_id\"));\n    record.setValue(\"country\",contact.take(\"country\"));\n    record.setValue(\"country_intl\",contact.take(\"country_intl\"));\n    record.setValue(\"credit_submitted\",contact.take(\"credit_submitted\"));\n    record.setValue(\"credit_granted\",contact.take(\"credit_granted\"));\n    record.setValue(\"darc_dok\",contact.take(\"darc_dok\").toString().toUpper());\n    record.setValue(\"dcl_qslrdate\",parseDate(contact.take(\"dcl_qslrdate\").toString()));\n    record.setValue(\"dcl_qslsdate\",parseDate(contact.take(\"dcl_qslsdate\").toString()));\n    record.setValue(\"dcl_qsl_rcvd\",parseQslRcvd(contact.take(\"dcl_qsl_rcvd\").toString()));\n    record.setValue(\"dcl_qsl_sent\",parseQslSent(contact.take(\"dcl_qsl_sent\").toString()));\n    record.setValue(\"distance\",contact.take(\"distance\"));\n    record.setValue(\"email\",contact.take(\"email\"));\n    record.setValue(\"eq_call\",contact.take(\"eq_call\"));\n    record.setValue(\"eqsl_ag\",parseEqslAg(contact.take(\"eqsl_ag\").toString()));\n    record.setValue(\"eqsl_qslrdate\",parseDate(contact.take(\"eqsl_qslrdate\").toString()));\n    record.setValue(\"eqsl_qslsdate\",parseDate(contact.take(\"eqsl_qslsdate\").toString()));\n    record.setValue(\"eqsl_qsl_rcvd\",parseQslRcvd(contact.take(\"eqsl_qsl_rcvd\").toString()));\n    record.setValue(\"eqsl_qsl_sent\",parseQslSent(contact.take(\"eqsl_qsl_sent\").toString()));\n    record.setValue(\"fists\",contact.take(\"fists\"));\n    record.setValue(\"fists_cc\",contact.take(\"fists_cc\"));\n    record.setValue(\"force_init\",contact.take(\"force_init\").toString().toUpper());\n    record.setValue(\"freq_rx\",contact.take(\"freq_rx\"));\n    record.setValue(\"gridsquare_ext\",contact.take(\"gridsquare_ext\"));\n    record.setValue(\"guest_op\",contact.take(\"guest_op\"));\n    record.setValue(\"hamlogeu_qso_upload_date\",parseDate(contact.take(\"hamlogeu_qso_upload_date\").toString()));\n    record.setValue(\"hamlogeu_qso_upload_status\",parseUploadStatus(contact.take(\"hamlogeu_qso_upload_status\").toString()));\n    record.setValue(\"hamqth_qso_upload_date\",parseDate(contact.take(\"hamqth_qso_upload_date\").toString()));\n    record.setValue(\"hamqth_qso_upload_status\",parseUploadStatus(contact.take(\"hamqth_qso_upload_status\").toString()));\n    record.setValue(\"hrdlog_qso_upload_date\",parseDate(contact.take(\"hrdlog_qso_upload_date\").toString()));\n    record.setValue(\"hrdlog_qso_upload_status\",parseUploadStatus(contact.take(\"hrdlog_qso_upload_status\").toString()));\n    record.setValue(\"iota_island_id\",contact.take(\"iota_island_id\").toString().toUpper());\n    record.setValue(\"k_index\",contact.take(\"k_index\"));\n    record.setValue(\"lat\",contact.take(\"lat\"));\n    record.setValue(\"lon\",contact.take(\"lon\"));\n    record.setValue(\"max_bursts\",contact.take(\"max_bursts\"));\n    record.setValue(\"morse_key_info\",contact.take(\"morse_key_info\"));\n    record.setValue(\"morse_key_type\", parseMorseKeyType(contact.take(\"morse_key_type\").toString()));\n    record.setValue(\"ms_shower\",contact.take(\"ms_shower\"));\n    record.setValue(\"my_antenna\",contact.take(\"my_antenna\"));\n    record.setValue(\"my_antenna_intl\",contact.take(\"my_antenna_intl\"));\n    record.setValue(\"my_altitude\",contact.take(\"my_altitude\"));\n    record.setValue(\"my_arrl_sect\",contact.take(\"my_arrl_sect\"));\n    record.setValue(\"my_city\",contact.take(\"my_city\"));\n    record.setValue(\"my_city_intl\",contact.take(\"my_city_intl\"));\n    record.setValue(\"my_country\",contact.take(\"my_country\"));\n    record.setValue(\"my_country_intl\",contact.take(\"my_country_intl\"));\n    record.setValue(\"my_cnty\",contact.take(\"my_cnty\"));\n    record.setValue(\"my_cnty_alt\",contact.take(\"my_cnty_alt\"));\n    record.setValue(\"my_cq_zone\",contact.take(\"my_cq_zone\"));\n    record.setValue(\"my_darc_dok\",contact.take(\"my_darc_dok\").toString().toUpper());\n    record.setValue(\"my_dxcc\",contact.take(\"my_dxcc\"));\n    record.setValue(\"my_fists\",contact.take(\"my_fists\"));\n    record.setValue(\"my_gridsquare\",contact.take(\"my_gridsquare\").toString().toUpper());\n    record.setValue(\"my_gridsquare_ext\",contact.take(\"my_gridsquare_ext\").toString().toUpper());\n    record.setValue(\"my_iota\",contact.take(\"my_iota\").toString().toUpper());\n    record.setValue(\"my_iota_island_id\",contact.take(\"my_iota_island_id\").toString().toUpper());\n    record.setValue(\"my_itu_zone\",contact.take(\"my_itu_zone\"));\n    record.setValue(\"my_lat\",contact.take(\"my_lat\"));\n    record.setValue(\"my_lon\",contact.take(\"my_lon\"));\n    record.setValue(\"my_morse_key_info\",contact.take(\"my_morse_key_info\"));\n    record.setValue(\"my_morse_key_type\", parseMorseKeyType(contact.take(\"my_morse_key_type\").toString()));\n    record.setValue(\"my_name\",contact.take(\"my_name\"));\n    record.setValue(\"my_name_intl\",contact.take(\"my_name_intl\"));\n    record.setValue(\"my_postal_code\",contact.take(\"my_postal_code\"));\n    record.setValue(\"my_postal_code_intl\",contact.take(\"my_postal_code_intl\"));\n    record.setValue(\"my_pota_ref\",contact.take(\"my_pota_ref\").toString().toUpper());\n    record.setValue(\"my_rig\",contact.take(\"my_rig\"));\n    record.setValue(\"my_rig_intl\",contact.take(\"my_rig_intl\"));\n    record.setValue(\"my_sig\",contact.take(\"my_sig\"));\n    record.setValue(\"my_sig_intl\",contact.take(\"my_sig_intl\"));\n    record.setValue(\"my_sig_info\",contact.take(\"my_sig_info\"));\n    record.setValue(\"my_sig_info_intl\",contact.take(\"my_sig_info_intl\"));\n    record.setValue(\"my_sota_ref\",contact.take(\"my_sota_ref\").toString().toUpper());\n    record.setValue(\"my_state\",contact.take(\"my_state\"));\n    record.setValue(\"my_street\",contact.take(\"my_street\"));\n    record.setValue(\"my_street_intl\",contact.take(\"my_street_intl\"));\n    record.setValue(\"my_usaca_counties\",contact.take(\"my_usaca_counties\"));\n    record.setValue(\"my_vucc_grids\",contact.take(\"my_vucc_grids\").toString().toUpper());\n    record.setValue(\"my_wwff_ref\",contact.take(\"my_wwff_ref\").toString().toUpper());\n    record.setValue(\"name\",contact.take(\"name\"));\n    record.setValue(\"name_intl\",contact.take(\"name_intl\"));\n    record.setValue(\"notes\",contact.take(\"notes\"));\n    record.setValue(\"notes_intl\",contact.take(\"notes_intl\"));\n    record.setValue(\"nr_bursts\",contact.take(\"nr_bursts\"));\n    record.setValue(\"nr_pings\",contact.take(\"nr_pings\"));\n    record.setValue(\"operator\",contact.take(\"operator\"));\n    record.setValue(\"owner_callsign\",contact.take(\"owner_callsign\"));\n    record.setValue(\"pota_ref\",contact.take(\"pota_ref\").toString().toUpper());\n    record.setValue(\"precedence\",contact.take(\"precedence\"));\n    record.setValue(\"prop_mode\",contact.take(\"prop_mode\"));\n    record.setValue(\"public_key\",contact.take(\"public_key\"));\n    record.setValue(\"qrzcom_qso_download_date\",parseDate(contact.take(\"qrzcom_qso_download_date\").toString()));\n    record.setValue(\"qrzcom_qso_download_status\",parseDownloadStatus(contact.take(\"qrzcom_qso_download_status\").toString()));\n    record.setValue(\"qrzcom_qso_upload_date\",parseDate(contact.take(\"qrzcom_qso_upload_date\").toString()));\n    record.setValue(\"qrzcom_qso_upload_status\",parseUploadStatus(contact.take(\"qrzcom_qso_upload_status\").toString()));\n    record.setValue(\"qsl_rcvd_via\",contact.take(\"qsl_rcvd_via\").toString().toUpper());\n    record.setValue(\"qsl_sent_via\",contact.take(\"qsl_sent_via\").toString().toUpper());\n    record.setValue(\"qsl_via\",contact.take(\"qsl_via\"));\n    record.setValue(\"qso_complete\",contact.take(\"qso_complete\").toString().toUpper());\n    record.setValue(\"qso_random\",contact.take(\"qso_random\").toString().toUpper());\n    record.setValue(\"qslmsg\",contact.take(\"qslmsg\"));\n    record.setValue(\"qslmsg_intl\",contact.take(\"qslmsg_intl\"));\n    record.setValue(\"qslmsg_rcvd\",contact.take(\"qslmsg_rcvd\"));\n    record.setValue(\"qth\",contact.take(\"qth\"));\n    record.setValue(\"qth_intl\",contact.take(\"qth_intl\"));\n    record.setValue(\"region\",contact.take(\"region\"));\n    record.setValue(\"rig\",contact.take(\"rig\"));\n    record.setValue(\"rig_intl\",contact.take(\"rig_intl\"));\n    record.setValue(\"rx_pwr\",contact.take(\"rx_pwr\"));\n    record.setValue(\"sat_mode\",contact.take(\"sat_mode\"));\n    record.setValue(\"sat_name\",contact.take(\"sat_name\"));\n    record.setValue(\"sfi\",contact.take(\"sfi\"));\n    record.setValue(\"sig\",contact.take(\"sig\"));\n    record.setValue(\"sig_intl\",contact.take(\"sig_intl\"));\n    record.setValue(\"sig_info\",contact.take(\"sig_info\"));\n    record.setValue(\"sig_info_intl\",contact.take(\"sig_info_intl\"));\n    record.setValue(\"silent_key\",contact.take(\"silent_key\").toString().toUpper());\n    record.setValue(\"skcc\",contact.take(\"skcc\"));\n    record.setValue(\"sota_ref\",contact.take(\"sota_ref\").toString().toUpper());\n    record.setValue(\"srx\",contact.take(\"srx\"));\n    record.setValue(\"srx_string\",contact.take(\"srx_string\"));\n    record.setValue(\"station_callsign\",contact.take(\"station_callsign\").toString().toUpper());\n    record.setValue(\"stx\",contact.take(\"stx\"));\n    record.setValue(\"stx_string\",contact.take(\"stx_string\"));\n    record.setValue(\"swl\",contact.take(\"swl\").toString().toUpper());\n    record.setValue(\"ten_ten\",contact.take(\"ten_ten\"));\n    record.setValue(\"uksmg\",contact.take(\"uksmg\"));\n    record.setValue(\"usaca_counties\",contact.take(\"usaca_counties\"));\n    record.setValue(\"ve_prov\",contact.take(\"ve_prov\"));\n    record.setValue(\"vucc_grids\",contact.take(\"vucc_grids\").toString().toUpper());\n    record.setValue(\"web\",contact.take(\"web\"));\n    record.setValue(\"wwff_ref\",contact.take(\"wwff_ref\").toString().toUpper());\n\n    QString mode = contact.take(\"mode\").toString().toUpper();\n    QString submode = contact.take(\"submode\").toString().toUpper();\n\n    const QPair<QString, QString>& legacy = Data::instance()->legacyMode(mode);\n\n    if ( !legacy.first.isEmpty() )\n    {\n        mode = legacy.first;\n        submode = legacy.second;\n    }\n\n    record.setValue(\"mode\", mode);\n    record.setValue(\"submode\", submode);\n\n    const QDate &date_on = parseDate(contact.take(\"qso_date\").toString());\n    QDate date_off = parseDate(contact.take(\"qso_date_off\").toString());\n\n    if ( date_off.isNull() || !date_off.isValid() )\n    {\n        date_off = date_on;\n    }\n\n    QTime time_on = parseTime(contact.take(\"time_on\").toString());\n    QTime time_off = parseTime(contact.take(\"time_off\").toString());\n\n    if ( time_on.isValid() && time_off.isNull() )\n    {\n        time_off = time_on;\n    }\n\n    if ( time_off.isValid() && time_on.isNull() )\n    {\n        time_on = time_off;\n    }\n\n    QDateTime start_time(date_on, time_on, QTimeZone::utc());\n    QDateTime end_time(date_off, time_off, QTimeZone::utc());\n\n    if ( end_time < start_time )\n    {\n        qCDebug(runtime) << \"End time before start time!\" << record;\n    }\n\n    record.setValue(\"start_time\", start_time);\n    record.setValue(\"end_time\", end_time);\n}\n\nconst QString AdiFormat::formatOuput(OutputFieldFormatter formatter, const QVariant &in)\n{\n    QString ret;\n\n    switch (formatter)\n    {\n    case TOLOWER:\n        ret = toLower(in);\n        break;\n    case TOUPPER:\n        ret = toUpper(in);\n        break;\n    case TODATE:\n        ret = toDate(in);\n        break;\n    case TOTIME:\n        ret = toTime(in);\n        break;\n    case REMOVEDEFAULTVALUEN:\n        ret = removeDefaulValueN(in);\n        break;\n    case TOSTRING:\n    default:\n        ret = toString(in);\n    }\n\n    return ret;\n}\n\nconst QString AdiFormat::toString(const QVariant &var)\n{\n    return var.toString();\n}\n\nconst QString AdiFormat::toLower(const QVariant &var)\n{\n    return var.toString().toLower();\n}\n\nconst QString AdiFormat::toUpper(const QVariant &var)\n{\n    return var.toString().toUpper();\n}\n\nconst QString AdiFormat::toDate(const QVariant &var)\n{\n    return var.toDate().toString(\"yyyyMMdd\");\n}\n\nconst QString AdiFormat::toTime(const QVariant &var)\n{\n    return var.toTime().toString(\"hhmmss\");\n}\n\n// There are fields with a default value of 'N'.\n// Therefore, it is not necessary to explicitly export them when\n// the local database also has the value 'N'. This approach can be\n// helpful, for example, in the case of new fields in ADIF, where\n// external systems are not yet prepared, and QLog would generate ADIF\n// with the default value 'N'.\nconst QString AdiFormat::removeDefaulValueN(const QVariant &var)\n{\n    const QString value = var.toString();\n    return (value == \"N\") ? QString() : value;\n}\n\nvoid AdiFormat::preprocessINTLField(const QString &fieldName,\n                                    const QString &fieldIntlName,\n                                    QMap<QString, QVariant> &contact)\n{\n    FCT_IDENTIFICATION;\n\n    // NOTE: If modify this, modify also function below!!!!\n\n    const QVariant &fld = contact.value(fieldName);\n    const QVariant &fldIntl = contact.value(fieldIntlName);\n\n    /* In general, it is a hack because ADI must not contain\n     * _INTL fields. But some applications generate _INTL fields in ADI files\n     * therefore it is needed to implement a logic how to convert INTL fields\n     * to standard\n     */\n    if ( !fld.toString().isEmpty() && !fldIntl.toString().isEmpty() )\n    {\n        /* ascii and intl are present */\n        //no action\n    }\n    else if ( !fld.toString().isEmpty() && fldIntl.toString().isEmpty() )\n    {\n        /* ascii is present but Intl is not present */\n        contact[fieldIntlName] = fld;\n    }\n    else if ( fld.toString().isEmpty() && !fldIntl.toString().isEmpty() )\n    {\n        /* ascii is empty but Intl is present */\n        contact[fieldName] = Data::removeAccents(fldIntl.toString());\n    }\n    else\n    {\n        /* both are empty */\n        /* do nothing */\n    }\n}\n\nvoid AdiFormat::preprocessINTLField(const QString &fieldName,\n                                    const QString &fieldIntlName,\n                                    QSqlRecord &contact)\n{\n    FCT_IDENTIFICATION;\n\n    // NOTE: If modify this, modify also function above!!!!\n    const QVariant &fld = contact.value(fieldName);\n    const QVariant &fldIntl = contact.value(fieldIntlName);\n\n    /* In general, it is a hack because ADI must not contain\n     * _INTL fields. But some applications generate _INTL fields in ADI files\n     * therefore it is needed to implement a logic how to convert INTL fields\n     * to standard\n     */\n    if ( !fld.toString().isEmpty() && !fldIntl.toString().isEmpty() )\n    {\n        /* ascii and intl are present */\n        //no action\n    }\n    else if ( !fld.toString().isEmpty() && fldIntl.toString().isEmpty() )\n    {\n        /* ascii is present but Intl is not present */\n        contact.setValue(fieldIntlName, fld);\n    }\n    else if ( fld.toString().isEmpty() && !fldIntl.toString().isEmpty() )\n    {\n        /* ascii is empty but Intl is present */\n        contact.setValue(fieldName, Data::removeAccents(fldIntl.toString()));\n    }\n    else\n    {\n        /* both are empty */\n        /* do nothing */\n    }\n}\n\nbool AdiFormat::readContact(QMap<QString, QVariant>& contact)\n{\n    FCT_IDENTIFICATION;\n\n    while (!stream.atEnd())\n    {\n        QString field;\n        QString value;\n\n        readField(field, value);\n        field = field.toLower();\n\n        if (field == \"eor\")\n        {\n            return true;\n        }\n\n        if (!value.isEmpty())\n        {\n            contact[field] = QVariant(value);\n        }\n    }\n\n    return false;\n}\n\nAdiFormat::AdiFormat(QTextStream &stream) :\n    LogFormat(stream)\n{\n    FCT_IDENTIFICATION;\n\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    stream.setEncoding(QStringConverter::Latin1);\n#else\n    stream.setCodec(\"ISO 8859-1\");\n#endif\n}\n\nbool AdiFormat::importNext(QSqlRecord& record)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<record;\n\n    QMap<QString, QVariant> contact;\n\n    if ( !readContact(contact) )\n    {\n        return false;\n    }\n\n    mapContact2SQLRecord(contact, record);\n\n    return true;\n}\n\nQDate AdiFormat::parseDate(const QString &date)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<date;\n\n    if (date.length() == 8) {\n        return QDate::fromString(date, \"yyyyMMdd\");\n    }\n    else {\n        return QDate();\n    }\n}\n\nQTime AdiFormat::parseTime(const QString &time)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<time;\n\n    switch (time.length()) {\n    case 4:\n        return QTime::fromString(time, \"hhmm\");\n\n    case 6:\n        return QTime::fromString(time, \"hhmmss\");\n\n    default:\n        return QTime();\n    }\n}\n\n\nQString AdiFormat::parseQslRcvd(const QString &value) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<value;\n\n    if (!value.isEmpty())\n    {\n        switch (value.toUpper().at(0).toLatin1())\n        {\n        case 'Y': return \"Y\";\n        case 'N': return \"N\";\n        case 'R': return \"R\";\n        case 'I': return \"I\";\n        case 'V': return \"Y\";\n        default: return \"N\";\n        }\n    }\n    return \"N\";\n}\n\nQString AdiFormat::parseQslSent(const QString &value) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<value;\n\n    if (!value.isEmpty())\n    {\n        switch (value.toUpper().at(0).toLatin1())\n        {\n        case 'Y': return \"Y\";\n        case 'N': return \"N\";\n        case 'R': return \"R\";\n        case 'Q': return \"Q\";\n        case 'I': return \"I\";\n        default: return \"N\";\n        }\n    }\n    return \"N\";\n}\n\nQString AdiFormat::parseUploadStatus(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<value;\n\n    if (!value.isEmpty())\n    {\n        switch (value.toUpper().at(0).toLatin1())\n        {\n        case 'Y': return \"Y\";\n        case 'N': return \"N\";\n        case 'M': return \"M\";\n        default: return QString();\n        }\n    }\n    return QString();\n}\n\nQString AdiFormat::parseDownloadStatus(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    if ( value.isEmpty() )\n        return QString();\n\n    char firstChar = value.toUpper().at(0).toLatin1();\n\n    return ( firstChar == 'Y' || firstChar == 'N' || firstChar == 'I' ) ? QString(firstChar)\n                                                                        : QString();\n}\n\nQString AdiFormat::parseMorseKeyType(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    static QList<QString> allowedValues({\"SK\", \"SS\", \"BUG\", \"FAB\", \"SP\", \"DP\", \"CPU\"});\n    const QString &inValue = value.toUpper();\n\n    return (allowedValues.contains(inValue)) ? inValue : QString();\n}\n\nQString AdiFormat::parseEqslAg(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    if ( value.isEmpty() ) return QString();\n\n    char firstChar = value.toUpper().at(0).toLatin1();\n\n    return ( firstChar == 'Y' || firstChar == 'N' || firstChar == 'U' ) ? QString(firstChar)\n                                                                        : QString();\n}\n\nQMap<QString, QString> AdiFormat::fieldname2INTLNameMapping =\n{\n    {\"address\", \"address_intl\"},\n    {\"comment\", \"comment_intl\"},\n    {\"country\", \"country_intl\"},\n    {\"my_antenna\", \"my_antenna_intl\"},\n    {\"my_city\", \"my_city_intl\"},\n    {\"my_country\", \"my_country_intl\"},\n    {\"my_name\", \"my_name_intl\"},\n    {\"my_postal_code\", \"my_postal_code_intl\"},\n    {\"my_rig\", \"my_rig_intl\"},\n    {\"my_sig\", \"my_sig_intl\"},\n    {\"my_sig_info\", \"my_sig_info_intl\"},\n    {\"my_street\", \"my_street_intl\"},\n    {\"name\", \"name_intl\"},\n    {\"notes\", \"notes_intl\"},\n    {\"qslmsg\", \"qslmsg_intl\"},\n    {\"qth\", \"qth_intl\"},\n    {\"rig\", \"rig_intl\"},\n    {\"sig\", \"sig_intl\"},\n    {\"sig_info\", \"sig_info_intl\"}\n};\n\nQHash<QString, AdiFormat::ExportParams> AdiFormat::DB2ADIFExportParams =\n{\n    { \"callsign\", ExportParams(\"call\")},\n//    { , ExportParams(\"qso_date\")},     //SPECIAL\n//    { , ExportParams(\"time_on\")},      //SPECIAL\n//    { , ExportParams(\"qso_date_off\")}, //SPECIAL\n//    { , ExportParams(\"time_off\")},     //SPECIAL\n    { \"rst_rcvd\", ExportParams(\"rst_rcvd\")},\n    { \"rst_sent\", ExportParams(\"rst_sent\")},\n    { \"name\", ExportParams(\"name\")},\n    { \"qth\", ExportParams(\"qth\")},\n    { \"gridsquare\", ExportParams(\"gridsquare\")},\n    { \"cqz\", ExportParams(\"cqz\")},\n    { \"ituz\", ExportParams(\"ituz\")},\n    { \"freq\", ExportParams(\"freq\", OutputFieldFormatter::TOSTRING)},\n    { \"band\", ExportParams(\"band\", OutputFieldFormatter::TOLOWER)},\n    { \"mode\", ExportParams(\"mode\")},\n    { \"submode\", ExportParams(\"submode\")},\n    { \"cont\", ExportParams(\"cont\")},\n    { \"dxcc\", ExportParams(\"dxcc\")},\n    { \"country\", ExportParams(\"country\")},\n    { \"pfx\", ExportParams(\"pfx\")},\n    { \"state\", ExportParams(\"state\")},\n    { \"cnty\", ExportParams(\"cnty\")},\n    { \"cnty_alt\", ExportParams(\"cnty_alt\")},\n    { \"iota\", ExportParams(\"iota\", OutputFieldFormatter::TOUPPER)},\n    { \"qsl_rcvd\", ExportParams(\"qsl_rcvd\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"qsl_rdate\", ExportParams(\"qslrdate\", OutputFieldFormatter::TODATE)},\n    { \"qsl_sent\", ExportParams(\"qsl_sent\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"qsl_sdate\", ExportParams(\"qslsdate\", OutputFieldFormatter::TODATE)},\n    { \"lotw_qsl_rcvd\", ExportParams(\"lotw_qsl_rcvd\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"lotw_qslrdate\", ExportParams(\"lotw_qslrdate\", OutputFieldFormatter::TODATE)},\n    { \"lotw_qsl_sent\", ExportParams(\"lotw_qsl_sent\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"lotw_qslsdate\", ExportParams(\"lotw_qslsdate\", OutputFieldFormatter::TODATE)},\n    { \"tx_pwr\", ExportParams(\"tx_pwr\")},\n    { \"address\", ExportParams(\"address\")},\n    { \"age\", ExportParams(\"age\")},\n    { \"altitude\", ExportParams(\"altitude\")},\n    { \"a_index\", ExportParams(\"a_index\")},\n    { \"ant_az\", ExportParams(\"ant_az\")},\n    { \"ant_el\", ExportParams(\"ant_el\")},\n    { \"ant_path\", ExportParams(\"ant_path\")},\n    { \"arrl_sect\", ExportParams(\"arrl_sect\")},\n    { \"award_submitted\", ExportParams(\"award_submitted\")},\n    { \"award_granted\", ExportParams(\"award_granted\")},\n    { \"band_rx\", ExportParams(\"band_rx\", OutputFieldFormatter::TOLOWER)},\n    { \"check\", ExportParams(\"check\")},\n    { \"class\", ExportParams(\"class\")},\n    { \"clublog_qso_upload_date\", ExportParams(\"clublog_qso_upload_date\", OutputFieldFormatter::TODATE)},\n    { \"clublog_qso_upload_status\", ExportParams(\"clublog_qso_upload_status\")},\n    { \"comment\", ExportParams(\"comment\")},\n    { \"contacted_op\", ExportParams(\"contacted_op\")},\n    { \"contest_id\", ExportParams(\"contest_id\")},\n    { \"credit_submitted\", ExportParams(\"credit_submitted\")},\n    { \"credit_granted\", ExportParams(\"credit_granted\")},\n    { \"darc_dok\", ExportParams(\"darc_dok\")},\n    { \"dcl_qslrdate\", ExportParams(\"dcl_qslrdate\", OutputFieldFormatter::TODATE)},\n    { \"dcl_qslsdate\", ExportParams(\"dcl_qslsdate\", OutputFieldFormatter::TODATE)},\n    { \"dcl_qsl_rcvd\", ExportParams(\"dcl_qsl_rcvd\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"dcl_qsl_sent\", ExportParams(\"dcl_qsl_sent\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"distance\", ExportParams(\"distance\")},\n    { \"email\", ExportParams(\"email\")},\n    { \"eq_call\", ExportParams(\"eq_call\")},\n    { \"eqsl_ag\", ExportParams(\"eqsl_ag\", OutputFieldFormatter::TOUPPER)},\n    { \"eqsl_qslrdate\", ExportParams(\"eqsl_qslrdate\", OutputFieldFormatter::TODATE)},\n    { \"eqsl_qslsdate\", ExportParams(\"eqsl_qslsdate\", OutputFieldFormatter::TODATE)},\n    { \"eqsl_qsl_rcvd\", ExportParams(\"eqsl_qsl_rcvd\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"eqsl_qsl_sent\", ExportParams(\"eqsl_qsl_sent\", OutputFieldFormatter::REMOVEDEFAULTVALUEN)},\n    { \"fists\", ExportParams(\"fists\")},\n    { \"fists_cc\", ExportParams(\"fists_cc\")},\n    { \"force_init\", ExportParams(\"force_init\")},\n    { \"freq_rx\", ExportParams(\"freq_rx\")},\n    { \"gridsquare_ext\", ExportParams(\"gridsquare_ext\")},\n    { \"guest_op\", ExportParams(\"guest_op\")},\n    { \"hamlogeu_qso_upload_date\", ExportParams(\"hamlogeu_qso_upload_date\", OutputFieldFormatter::TODATE)},\n    { \"hamlogeu_qso_upload_status\", ExportParams(\"hamlogeu_qso_upload_status\")},\n    { \"hamqth_qso_upload_date\", ExportParams(\"hamqth_qso_upload_date\", OutputFieldFormatter::TODATE)},\n    { \"hamqth_qso_upload_status\", ExportParams(\"hamqth_qso_upload_status\")},\n    { \"hrdlog_qso_upload_date\", ExportParams(\"hrdlog_qso_upload_date\", OutputFieldFormatter::TODATE)},\n    { \"hrdlog_qso_upload_status\", ExportParams(\"hrdlog_qso_upload_status\")},\n    { \"iota_island_id\", ExportParams(\"iota_island_id\", OutputFieldFormatter::TOUPPER)},\n    { \"k_index\", ExportParams(\"k_index\")},\n    { \"lat\", ExportParams(\"lat\")},\n    { \"lon\", ExportParams(\"lon\")},\n    { \"max_bursts\", ExportParams(\"max_bursts\")},\n    { \"morse_key_info\", ExportParams(\"morse_key_info\")},\n    { \"morse_key_type\", ExportParams(\"morse_key_type\", OutputFieldFormatter::TOUPPER)},\n    { \"ms_shower\", ExportParams(\"ms_shower\")},\n    { \"my_altitude\", ExportParams(\"my_altitude\")},\n    { \"my_arrl_sect\", ExportParams(\"my_arrl_sect\")},\n    { \"my_antenna\", ExportParams(\"my_antenna\")},\n    { \"my_city\", ExportParams(\"my_city\")},\n    { \"my_cnty\", ExportParams(\"my_cnty\")},\n    { \"my_cnty_alt\", ExportParams(\"my_cnty_alt\")},\n    { \"my_country\", ExportParams(\"my_country\")},\n    { \"my_cq_zone\", ExportParams(\"my_cq_zone\")},\n    { \"my_darc_dok\", ExportParams(\"my_darc_dok\")},\n    { \"my_dxcc\", ExportParams(\"my_dxcc\")},\n    { \"my_fists\", ExportParams(\"my_fists\")},\n    { \"my_gridsquare\", ExportParams(\"my_gridsquare\")},\n    { \"my_gridsquare_ext\", ExportParams(\"my_gridsquare_ext\")},\n    { \"my_iota\", ExportParams(\"my_iota\", OutputFieldFormatter::TOUPPER)},\n    { \"my_iota_island_id\", ExportParams(\"my_iota_island_id\", OutputFieldFormatter::TOUPPER)},\n    { \"my_itu_zone\", ExportParams(\"my_itu_zone\")},\n    { \"my_lat\", ExportParams(\"my_lat\")},\n    { \"my_lon\", ExportParams(\"my_lon\")},\n    { \"my_morse_key_info\", ExportParams(\"my_morse_key_info\")},\n    { \"my_morse_key_type\", ExportParams(\"my_morse_key_type\", OutputFieldFormatter::TOUPPER)},\n    { \"my_name\", ExportParams(\"my_name\")},\n    { \"my_postal_code\", ExportParams(\"my_postal_code\")},\n    { \"my_pota_ref\", ExportParams(\"my_pota_ref\", OutputFieldFormatter::TOUPPER)},\n    { \"my_rig\", ExportParams(\"my_rig\")},\n    { \"my_sig\", ExportParams(\"my_sig\")},\n    { \"my_sig_info\", ExportParams(\"my_sig_info\")},\n    { \"my_sota_ref\", ExportParams(\"my_sota_ref\", OutputFieldFormatter::TOUPPER)},\n    { \"my_state\", ExportParams(\"my_state\")},\n    { \"my_street\", ExportParams(\"my_street\")},\n    { \"my_usaca_counties\", ExportParams(\"my_usaca_counties\")},\n    { \"my_vucc_grids\", ExportParams(\"my_vucc_grids\", OutputFieldFormatter::TOUPPER)},\n    { \"my_wwff_ref\", ExportParams(\"my_wwff_ref\", OutputFieldFormatter::TOUPPER)},\n    { \"notes\", ExportParams(\"notes\")},\n    { \"nr_bursts\", ExportParams(\"nr_bursts\")},\n    { \"nr_pings\", ExportParams(\"nr_pings\")},\n    { \"operator\", ExportParams(\"operator\")},\n    { \"owner_callsign\", ExportParams(\"owner_callsign\")},\n    { \"pota_ref\", ExportParams(\"pota_ref\", OutputFieldFormatter::TOUPPER)},\n    { \"precedence\", ExportParams(\"precedence\")},\n    { \"prop_mode\", ExportParams(\"prop_mode\")},\n    { \"public_key\", ExportParams(\"public_key\")},\n    { \"qrzcom_qso_download_date\", ExportParams(\"qrzcom_qso_download_date\", OutputFieldFormatter::TODATE)},\n    { \"qrzcom_qso_download_status\", ExportParams(\"qrzcom_qso_download_status\")},\n    { \"qrzcom_qso_upload_date\", ExportParams(\"qrzcom_qso_upload_date\", OutputFieldFormatter::TODATE)},\n    { \"qrzcom_qso_upload_status\", ExportParams(\"qrzcom_qso_upload_status\")},\n    { \"qslmsg\", ExportParams(\"qslmsg\")},\n    { \"qslmsg_rcvd\", ExportParams(\"qslmsg_rcvd\")},\n    { \"qsl_rcvd_via\", ExportParams(\"qsl_rcvd_via\")},\n    { \"qsl_sent_via\", ExportParams(\"qsl_sent_via\")},\n    { \"qsl_via\", ExportParams(\"qsl_via\")},\n    { \"qso_complete\", ExportParams(\"qso_complete\")},\n    { \"qso_random\", ExportParams(\"qso_random\")},\n    { \"region\", ExportParams(\"region\")},\n    { \"rig\", ExportParams(\"rig\")},\n    { \"rx_pwr\", ExportParams(\"rx_pwr\")},\n    { \"sat_mode\", ExportParams(\"sat_mode\")},\n    { \"sat_name\", ExportParams(\"sat_name\")},\n    { \"sfi\", ExportParams(\"sfi\")},\n    { \"sig\", ExportParams(\"sig\")},\n    { \"sig_info\", ExportParams(\"sig_info\")},\n    { \"silent_key\", ExportParams(\"silent_key\")},\n    { \"skcc\", ExportParams(\"skcc\")},\n    { \"sota_ref\", ExportParams(\"sota_ref\", OutputFieldFormatter::TOUPPER)},\n    { \"srx\", ExportParams(\"srx\")},\n    { \"srx_string\", ExportParams(\"srx_string\")},\n    { \"station_callsign\", ExportParams(\"station_callsign\")},\n    { \"stx\", ExportParams(\"stx\")},\n    { \"stx_string\", ExportParams(\"stx_string\")},\n    { \"swl\", ExportParams(\"swl\")},\n    { \"ten_ten\", ExportParams(\"ten_ten\")},\n    { \"uksmg\", ExportParams(\"uksmg\")},\n    { \"usaca_counties\", ExportParams(\"usaca_counties\")},\n    { \"ve_prov\", ExportParams(\"ve_prov\")},\n    { \"vucc_grids\", ExportParams(\"vucc_grids\", OutputFieldFormatter::TOUPPER)},\n    { \"web\", ExportParams(\"web\")},\n    { \"wwff_ref\", ExportParams(\"wwff_ref\", OutputFieldFormatter::TOUPPER)}\n};\n\n#undef ALWAYS_PRESENT\n"
  },
  {
    "path": "logformat/AdiFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_ADIFORMAT_H\n#define QLOG_LOGFORMAT_ADIFORMAT_H\n\n#include \"LogFormat.h\"\n\nclass AdiFormat : public LogFormat\n{\npublic:\n    explicit AdiFormat(QTextStream& stream);\n\n    virtual bool importNext(QSqlRecord& ) override;\n\n    virtual void exportContact(const QSqlRecord&,\n                               QMap<QString, QString> *applTags = nullptr) override;\n    virtual void exportStart() override;\n\n    static QMap<QString, QString> fieldname2INTLNameMapping;\n\n    template<typename T>\n    static void preprocessINTLFields(T &contact)\n    {\n        {\n            const QStringList &fieldMappingList = fieldname2INTLNameMapping.keys();\n            for ( const QString& fieldName :  fieldMappingList )\n                preprocessINTLField(fieldName, fieldname2INTLNameMapping.value(fieldName), contact);\n        }\n    }\n\nprotected:\n    virtual void writeField(const QString &name,\n                            bool presenceCondition,\n                            const QString &value,\n                            const QString &type=\"\");\n    virtual void writeSQLRecord(const QSqlRecord& record,\n                                QMap<QString, QString> *applTags);\n    virtual bool readContact(QVariantMap &);\n    void mapContact2SQLRecord(QMap<QString, QVariant> &contact,\n                              QSqlRecord &record);\n    void contactFields2SQLRecord(QMap<QString, QVariant> &contact,\n                              QSqlRecord &record);\n\n    enum OutputFieldFormatter\n    {\n        TOSTRING,\n        TOLOWER,\n        TOUPPER,\n        TODATE,\n        TOTIME,\n        REMOVEDEFAULTVALUEN\n    };\n\n    const QString formatOuput(OutputFieldFormatter formatter, const QVariant &in);\n\n    virtual const QString toString(const QVariant &);\n    virtual const QString toLower(const QVariant &);\n    virtual const QString toUpper(const QVariant &);\n    virtual const QString toDate(const QVariant &);\n    virtual const QString toTime(const QVariant &);\n    virtual const QString removeDefaulValueN(const QVariant &);\n\n    class ExportParams\n    {\n    public:\n        ExportParams() :\n            ADIFName(QString()),\n            outputType(QString()),\n            formatter(TOSTRING),\n            isValid(false) {};\n        ExportParams(const QString &inADIFName,\n                     const OutputFieldFormatter formatter = OutputFieldFormatter::TOSTRING,\n                     const QString &inType = QString()) :\n            ADIFName(inADIFName),\n            outputType(inType),\n            formatter(formatter),\n            isValid(true) {};\n        QString ADIFName;\n        QString outputType;\n        OutputFieldFormatter formatter;\n        bool isValid;\n    };\n\n    static QHash<QString, AdiFormat::ExportParams> DB2ADIFExportParams;\n\n    const QString ADIF_VERSION_STRING = \"3.1.7\";\n    const QString PROGRAMID_STRING = \"QLog\";\n\nprivate:\n\n    void readField(QString& field,\n                   QString& value);\n    QDate parseDate(const QString &date);\n    QTime parseTime(const QString &time);\n    QString parseQslRcvd(const QString &value);\n    QString parseQslSent(const QString &value);\n    QString parseUploadStatus(const QString &value);\n    QString parseDownloadStatus(const QString &value);\n    QString parseMorseKeyType(const QString &value);\n    QString parseEqslAg(const QString &value);\n\n    enum ParserState {\n        START,\n        FIELD,\n        KEY,\n        SIZE,\n        DATA_TYPE,\n        VALUE\n    };\n\n    static void preprocessINTLField(const QString &fieldName,\n                                    const QString &fieldIntlName,\n                                    QMap<QString, QVariant> &contact);\n    static void preprocessINTLField(const QString &fieldName,\n                                    const QString &fieldIntlName,\n                                    QSqlRecord &contact);\n\n    ParserState state = START;\n    bool inHeader = false;\n};\n\n#endif // QLOG_LOGFORMAT_ADIFORMAT_H\n"
  },
  {
    "path": "logformat/AdxFormat.cpp",
    "content": "#include <QSqlRecord>\n#include <QtXml>\n#include \"logformat/AdxFormat.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.adxformat\");\n\nAdxFormat::AdxFormat(QTextStream &stream) :\n    AdiFormat(stream),\n    writer(nullptr),\n    reader(nullptr)\n{\n    FCT_IDENTIFICATION;\n#if QT_VERSION >= QT_VERSION_CHECK(6,0,0)\n    stream.setEncoding(QStringConverter::Utf8);\n#else\n    stream.setCodec(\"UTF-8\");\n#endif\n}\n\nvoid AdxFormat::importStart()\n{\n    FCT_IDENTIFICATION;\n\n    reader = new QXmlStreamReader(stream.device());\n\n    while ( reader->readNextStartElement() )\n    {\n        qCDebug(runtime)<<reader->name();\n        if ( reader->name() == QString(\"ADX\") )\n        {\n            while ( reader->readNextStartElement() )\n            {\n                qCDebug(runtime)<<reader->name();\n                if ( reader->name() == QString(\"HEADER\") )\n                {\n                    reader->skipCurrentElement();\n                }\n                else if ( reader->name() == QString(\"RECORDS\") )\n                {\n                    qCDebug(runtime)<<\"records found\";\n                    /* header is loaded, QLog is currently in Records sections\n                       which is loaded by importNext procedure */\n                    return;\n                }\n            }\n        }\n        else\n        {\n            reader->skipCurrentElement();\n        }\n    }\n}\n\nvoid AdxFormat::importEnd()\n{\n    FCT_IDENTIFICATION;\n\n    if ( reader )\n    {\n        delete reader;\n        reader = nullptr;\n    }\n}\n\nvoid AdxFormat::exportStart()\n{\n    FCT_IDENTIFICATION;\n\n    QString date = QDateTime::currentDateTimeUtc().toString(\"yyyyMMdd hhmmss\");\n\n    writer = new QXmlStreamWriter(stream.device());\n\n    writer->setAutoFormatting(true);\n\n    writer->writeStartDocument();\n    writer->writeStartElement(\"ADX\");\n\n    writer->writeStartElement(\"HEADER\");\n    writer->writeTextElement(\"ADIF_VER\", ADIF_VERSION_STRING);\n    writer->writeTextElement(\"PROGRAMID\", PROGRAMID_STRING);\n    writer->writeTextElement(\"PROGRAMVERSION\", VERSION);\n    writer->writeTextElement(\"CREATED_TIMESTAMP\", date);\n    writer->writeEndElement();\n\n    writer->writeStartElement(\"RECORDS\");\n}\n\nvoid AdxFormat::exportEnd()\n{\n    FCT_IDENTIFICATION;\n\n    if ( writer )\n    {\n        writer->writeEndDocument();\n        delete writer;\n        writer = nullptr;\n    }\n}\n\nvoid AdxFormat::exportContact(const QSqlRecord& record, QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<record;\n\n    if ( ! writer )\n    {\n        qWarning() << \"ADX Writer is not ready\";\n        return;\n    }\n\n    writer->writeStartElement(\"RECORD\");\n\n    writeSQLRecord(record, applTags);\n\n    writer->writeEndElement();\n}\n\nvoid AdxFormat::writeField(const QString &name,\n                           bool presenceCondition,\n                           const QString &value,\n                           const QString &type)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< name\n                                << presenceCondition\n                                << value\n                                << type;\n\n    if (value.isEmpty() || !presenceCondition ) return;\n\n    writer->writeTextElement(name.toUpper(), value);\n}\n\nvoid AdxFormat::writeSQLRecord(const QSqlRecord &record, QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    AdiFormat::writeSQLRecord(record, applTags);\n\n    // Add _INTL fields\n\n    const QStringList &fieldMappingList = fieldname2INTLNameMapping.values();\n    for ( const QString& value :  fieldMappingList )\n    {\n        const QVariant &tmp = record.value(value);\n        writeField(value, tmp.isValid(), tmp.toString());\n    }\n}\n\nbool AdxFormat::readContact(QVariantMap & contact)\n{\n    FCT_IDENTIFICATION;\n\n    while ( !reader->atEnd() )\n    {\n        reader->readNextStartElement();\n\n        qCDebug(runtime)<<reader->name();\n\n        if ( reader->name() == QString(\"RECORDS\") && reader->isEndElement() )\n        {\n            qCDebug(runtime)<<\"End Records Element\";\n            return false;\n        }\n        if ( reader->name() == QString(\"RECORD\") )\n        {\n            while (reader->readNextStartElement() )\n            {\n                qCDebug(runtime)<<\"adding element \" << reader->name();\n                contact[reader->name().toLatin1().toLower()] = QVariant(reader->readElementText());\n            }\n            return true;\n        }\n        else\n        {\n            reader->skipCurrentElement();\n        }\n    }\n    return false;\n}\n"
  },
  {
    "path": "logformat/AdxFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_ADXFORMAT_H\n#define QLOG_LOGFORMAT_ADXFORMAT_H\n\n#include <QXmlStreamWriter>\n\n#include \"AdiFormat.h\"\n\nclass AdxFormat : public AdiFormat\n{\npublic:\n    explicit AdxFormat(QTextStream& stream);\n\n    virtual void importStart() override;\n    virtual void importEnd() override;\n\n    virtual void exportContact(const QSqlRecord& record,\n                               QMap<QString, QString> *applTags = nullptr) override;\n    virtual void exportStart() override;\n    virtual void exportEnd() override;\n\nprotected:\n    virtual void writeField(const QString &name,\n                            bool presenceCondition,\n                            const QString &value,\n                            const QString &type=\"\") override;\n    virtual void writeSQLRecord(const QSqlRecord& record,\n                                QMap<QString, QString> *applTags) override;\n    virtual bool readContact(QVariantMap& ) override;\n\nprivate:\n    QXmlStreamWriter *writer;\n    QXmlStreamReader *reader;\n};\n\n#endif // QLOG_LOGFORMAT_ADXFORMAT_H\n"
  },
  {
    "path": "logformat/CSVFormat.cpp",
    "content": "#include <QSqlRecord>\n#include \"CSVFormat.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.csvformat\");\n\nCSVFormat::CSVFormat(QTextStream &stream) :\n    AdxFormat(stream),\n    delimiter(',')\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid CSVFormat::exportStart()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid CSVFormat::exportContact(const QSqlRecord &record, QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << record;\n\n    currectRecord.clear();\n    writeSQLRecord(record, applTags);\n    exportedRecords << currectRecord;\n}\n\nvoid CSVFormat::exportEnd()\n{\n    FCT_IDENTIFICATION;\n\n    // Print Header - QMap sorts keys automatically\n    const QList<QString> headerKeys(header.keys());\n    QStringList row;\n\n    for ( const QString& headerField : headerKeys )\n    {\n        row << headerField;\n    }\n\n    stream << row.join(delimiter) << \"\\n\";\n\n    // Normalize and print exported records\n    for ( const QHash<QString, QString> &record : static_cast<const QList<QHash<QString, QString>>&>(exportedRecords) )\n    {\n        row.clear();\n\n        for ( const QString& headerField : headerKeys )\n        {\n            row << record.value(headerField);\n        }\n        stream << row.join(delimiter) << \"\\n\";\n    }\n}\n\nvoid CSVFormat::setDelimiter(const QChar &inDelimiter)\n{\n    FCT_IDENTIFICATION;\n\n    delimiter = inDelimiter;\n}\n\nvoid CSVFormat::writeField(const QString &name,\n                           bool presenceCondition,\n                           const QString &value,\n                           const QString &type)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< name\n                                << presenceCondition\n                                << value\n                                << type;\n\n    if ( !presenceCondition ) return;\n\n    header[name] = 0; // using QMap only due to ordering and uniq, number is not used at this moment;\n    currectRecord[name] = csvStringValue(value);\n}\n\nconst QString CSVFormat::toDate(const QVariant &var)\n{\n    return var.toDate().toString(\"yyyy-MM-dd\");\n}\n\nconst QString CSVFormat::toTime(const QVariant &var)\n{\n    return var.toTime().toString(\"hh:mm:ss\");\n}\n\nQString CSVFormat::csvStringValue(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    return ((value.contains(delimiter))? \"\\\"\" + value + \"\\\"\" : value);\n}\n"
  },
  {
    "path": "logformat/CSVFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_CSVFORMAT_H\n#define QLOG_LOGFORMAT_CSVFORMAT_H\n\n#include \"LogFormat.h\"\n#include \"logformat/AdxFormat.h\"\n\n// derived from ADX because ADX format contains non-intl and intl fields\nclass CSVFormat : public AdxFormat\n{\npublic:\n    explicit CSVFormat(QTextStream& stream);\n\n    virtual void exportStart() override;\n    virtual void exportContact(const QSqlRecord& record, QMap<QString, QString> *) override;\n    virtual void exportEnd() override;\n\n    virtual void importStart() override {};\n    virtual void importEnd() override {};\n    void setDelimiter(const QChar&);\n\nprotected:\n    virtual void writeField(const QString &name,\n                            bool presenceCondition,\n                            const QString &value,\n                            const QString &type=\"\") override;\n    const QString toDate(const QVariant &) override;\n    const QString toTime(const QVariant &) override;\n\nprivate:\n    QMap<QString, int> header;\n    QList<QHash<QString, QString>> exportedRecords;\n    QHash<QString, QString> currectRecord;\n\n    QString csvStringValue(const QString&);\n    QChar delimiter;\n};\n\n#endif // QLOG_LOGFORMAT_CSVFORMAT_H\n"
  },
  {
    "path": "logformat/CabrilloFormat.cpp",
    "content": "#include \"CabrilloFormat.h\"\n\n#include <QSqlQuery>\n#include <QSqlRecord>\n#include <QSqlError>\n#include <QDateTime>\n\n#include \"core/debug.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.cabrilloformat\");\n\nconst QString CabrilloFormat::FMT_NONE;\nconst QString CabrilloFormat::FMT_FREQ_KHZ = \"freq_khz\";\nconst QString CabrilloFormat::FMT_TIME_HHMM = \"time_hhmm\";\nconst QString CabrilloFormat::FMT_DATE_YYYY_MM_DD = \"date_yyyy_mm_dd\";\nconst QString CabrilloFormat::FMT_RST_SHORT = \"rst_short\";\nconst QString CabrilloFormat::FMT_UPPER = \"upper\";\nconst QString CabrilloFormat::FMT_MODE_CABRILLO = \"mode_cabrillo\";\nconst QString CabrilloFormat::FMT_TRANSMITTER_ID = \"transmitter_id\";\nconst QString CabrilloFormat::FMT_PADDED_NR = \"padded_nr\";\n\nconst QString CabrilloFormat::BAND_ALL = \"ALL\";\nconst QString CabrilloFormat::BAND_160M = \"160M\";\nconst QString CabrilloFormat::BAND_80M = \"80M\";\nconst QString CabrilloFormat::BAND_40M = \"40M\";\nconst QString CabrilloFormat::BAND_20M = \"20M\";\nconst QString CabrilloFormat::BAND_15M = \"15M\";\nconst QString CabrilloFormat::BAND_10M = \"10M\";\nconst QString CabrilloFormat::BAND_6M = \"6M\";\nconst QString CabrilloFormat::BAND_4M = \"4M\";\nconst QString CabrilloFormat::BAND_2M = \"2M\";\nconst QString CabrilloFormat::BAND_222 = \"222\";\nconst QString CabrilloFormat::BAND_432 = \"432\";\nconst QString CabrilloFormat::BAND_902 = \"902\";\nconst QString CabrilloFormat::BAND_1_2G = \"1.2G\";\nconst QString CabrilloFormat::BAND_LIGHT = \"LIGHT\";\nconst QString CabrilloFormat::BAND_VHF_3_BAND = \"VHF-3-BAND\";\nconst QString CabrilloFormat::BAND_VHF_FM_ONLY = \"VHF-FM-ONLY\";\n\nconst QString CabrilloFormat::MODE_CW = \"CW\";\nconst QString CabrilloFormat::MODE_SSB = \"SSB\";\nconst QString CabrilloFormat::MODE_RTTY = \"RTTY\";\nconst QString CabrilloFormat::MODE_FM = \"FM\";\nconst QString CabrilloFormat::MODE_DIGI = \"DIGI\";\nconst QString CabrilloFormat::MODE_MIXED = \"MIXED\";\n\nconst QString CabrilloFormat::POWER_HIGH = \"HIGH\";\nconst QString CabrilloFormat::POWER_LOW = \"LOW\";\nconst QString CabrilloFormat::POWER_QRP = \"QRP\";\n\nconst QString CabrilloFormat::OPERATOR_SINGLE = \"SINGLE-OP\";\nconst QString CabrilloFormat::OPERATOR_MULTI = \"MULTI-OP\";\nconst QString CabrilloFormat::OPERATOR_CHECKLOG = \"CHECKLOG\";\n\nconst QString CabrilloFormat::ASSISTED_NO = \"NON-ASSISTED\";\nconst QString CabrilloFormat::ASSISTED_YES = \"ASSISTED\";\n\nconst QString CabrilloFormat::STATION_FIXED = \"FIXED\";\nconst QString CabrilloFormat::STATION_MOBILE = \"MOBILE\";\nconst QString CabrilloFormat::STATION_PORTABLE = \"PORTABLE\";\nconst QString CabrilloFormat::STATION_ROVER = \"ROVER\";\nconst QString CabrilloFormat::STATION_ROVER_LIMITED = \"ROVER-LIMITED\";\nconst QString CabrilloFormat::STATION_ROVER_UNLIMITED = \"ROVER-UNLIMITED\";\nconst QString CabrilloFormat::STATION_EXPEDITION = \"EXPEDITION\";\nconst QString CabrilloFormat::STATION_HQ = \"HQ\";\nconst QString CabrilloFormat::STATION_SCHOOL = \"SCHOOL\";\nconst QString CabrilloFormat::STATION_DISTRIBUTED = \"DISTRIBUTED\";\n\nconst QString CabrilloFormat::TRANSMITTER_ONE = \"ONE\";\nconst QString CabrilloFormat::TRANSMITTER_TWO = \"TWO\";\nconst QString CabrilloFormat::TRANSMITTER_LIMITED = \"LIMITED\";\nconst QString CabrilloFormat::TRANSMITTER_UNLIMITED = \"UNLIMITED\";\nconst QString CabrilloFormat::TRANSMITTER_SWL = \"SWL\";\n\nconst QString CabrilloFormat::TIME_6_HOURS = \"6-HOURS\";\nconst QString CabrilloFormat::TIME_12_HOURS = \"12-HOURS\";\nconst QString CabrilloFormat::TIME_24_HOURS = \"24-HOURS\";\n\nconst QString CabrilloFormat::OVERLAY_CLASSIC = \"CLASSIC\";\nconst QString CabrilloFormat::OVERLAY_ROOKIE = \"ROOKIE\";\nconst QString CabrilloFormat::OVERLAY_TB_WIRES = \"TB-WIRES\";\nconst QString CabrilloFormat::OVERLAY_NOVICE_TECH = \"NOVICE-TECH\";\nconst QString CabrilloFormat::OVERLAY_OVER_50 = \"OVER-50\";\n\nCabrilloFormat::CabrilloFormat(QTextStream &stream) :\n    LogFormat(stream),\n    templateId(-1),\n    transmitterId(0),\n    multiOpEnabled(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid CabrilloFormat::setTemplateId(int id)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << id;\n    templateId = id;\n}\n\nvoid CabrilloFormat::setHeaderData(const HeaderData &data)\n{\n    FCT_IDENTIFICATION;\n    headerData = data;\n}\n\nvoid CabrilloFormat::setTransmitterId(int id)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << id;\n    transmitterId = id;\n}\n\nQMap<QString, QString> CabrilloFormat::buildHeaderFields() const\n{\n    FCT_IDENTIFICATION;\n\n    QMap<QString, QString> fields;\n\n    fields[\"CALLSIGN\"] = headerData.callsign;\n\n    auto addIfNotEmpty = [&](const QString& key, const QString& value)\n    {\n        if (!value.isEmpty())\n            fields[key] = value;\n    };\n\n    addIfNotEmpty(\"NAME\", headerData.operatorName);\n    addIfNotEmpty(\"EMAIL\", headerData.email);\n    addIfNotEmpty(\"OPERATORS\", headerData.operators);\n    addIfNotEmpty(\"ADDRESS\", headerData.address);\n    addIfNotEmpty(\"GRID-LOCATOR\", headerData.gridLocator);\n\n    addIfNotEmpty(\"CATEGORY-OPERATOR\", headerData.categoryOperator);\n    addIfNotEmpty(\"CATEGORY-BAND\", headerData.categoryBand);\n    addIfNotEmpty(\"CATEGORY-POWER\", headerData.categoryPower);\n    addIfNotEmpty(\"CATEGORY-MODE\", headerData.categoryMode);\n    addIfNotEmpty(\"CATEGORY-ASSISTED\", headerData.categoryAssisted);\n    addIfNotEmpty(\"CATEGORY-STATION\", headerData.categoryStation);\n    addIfNotEmpty(\"CATEGORY-TRANSMITTER\", headerData.categoryTransmitter);\n    addIfNotEmpty(\"CATEGORY-TIME\", headerData.categoryTime);\n    addIfNotEmpty(\"CATEGORY-OVERLAY\", headerData.categoryOverlay);\n\n    addIfNotEmpty(\"LOCATION\", headerData.location);\n    addIfNotEmpty(\"CLUB\", headerData.club);\n    addIfNotEmpty(\"OFFTIME\", headerData.offtime);\n    addIfNotEmpty(\"SOAPBOX\", headerData.soapbox);\n\n    return fields;\n}\n\nQList<CabrilloFormat::TemplateInfo> CabrilloFormat::templateList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<TemplateInfo> result;\n\n    QSqlQuery query(\"SELECT id, name, \"\n                    \"contest_name_for_header, default_category_mode \"\n                    \"FROM cabrillo_templates ORDER BY name\");\n    while ( query.next() )\n    {\n        TemplateInfo info;\n        info.id = query.value(0).toInt();\n        info.name = query.value(1).toString();\n        info.contestName = query.value(2).toString();\n        info.defaultCategoryMode = query.value(3).toString();\n        result.append(info);\n    }\n\n    return result;\n}\n\nCabrilloFormat::TemplateInfo CabrilloFormat::templateInfo(int templateId)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << templateId;\n\n    TemplateInfo info;\n    info.id = -1;\n\n    QSqlQuery query;\n    if ( !query.prepare(\"SELECT id, name, \"\n                        \"contest_name_for_header, default_category_mode \"\n                        \"FROM cabrillo_templates WHERE id = :id\") )\n    {\n        qCWarning(runtime) << query.lastError().text();\n        return info;\n    }\n\n    query.bindValue(\":id\", templateId);\n    if ( query.exec() && query.next() )\n    {\n        info.id = query.value(0).toInt();\n        info.name = query.value(1).toString();\n        info.contestName = query.value(2).toString();\n        info.defaultCategoryMode = query.value(3).toString();\n    }\n    else\n    {\n        qCWarning(runtime) << \"Template not found:\" << templateId;\n    }\n\n    return info;\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::bandCategories()\n{\n    return {\n        { BAND_ALL,          QCoreApplication::translate(\"CabrilloFormat\",\"All Bands\") },\n        { BAND_160M,         \"160m\" },\n        { BAND_80M,          \"80m\" },\n        { BAND_40M,          \"40m\" },\n        { BAND_20M,          \"20m\" },\n        { BAND_15M,          \"15m\" },\n        { BAND_10M,          \"10m\" },\n        { BAND_6M,           \"6m\" },\n        { BAND_4M,           \"4m\" },\n        { BAND_2M,           QCoreApplication::translate(\"CabrilloFormat\",\"2m (144 MHz)\") },\n        { BAND_222,          QCoreApplication::translate(\"CabrilloFormat\",\"1.25m (222 MHz)\") },\n        { BAND_432,          QCoreApplication::translate(\"CabrilloFormat\",\"70cm (432 MHz)\") },\n        { BAND_902,          QCoreApplication::translate(\"CabrilloFormat\",\"33cm (902 MHz)\") },\n        { BAND_1_2G,         QCoreApplication::translate(\"CabrilloFormat\",\"23cm (1.2 GHz)\") },\n        { BAND_LIGHT,        QCoreApplication::translate(\"CabrilloFormat\",\"Light\") },\n        { BAND_VHF_3_BAND,   QCoreApplication::translate(\"CabrilloFormat\",\"VHF 3-Band\") },\n        { BAND_VHF_FM_ONLY,  QCoreApplication::translate(\"CabrilloFormat\",\"VHF FM Only\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::modeCategories()\n{\n    return {\n        { MODE_CW,     \"CW\" },\n        { MODE_SSB,    \"SSB\" },\n        { MODE_RTTY,   \"RTTY\" },\n        { MODE_FM,     \"FM\" },\n        { MODE_DIGI,   QCoreApplication::translate(\"CabrilloFormat\",\"Digital\") },\n        { MODE_MIXED,  QCoreApplication::translate(\"CabrilloFormat\",\"Mixed\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::powerCategories()\n{\n    return {\n        { POWER_HIGH, QCoreApplication::translate(\"CabrilloFormat\",\"High\") },\n        { POWER_LOW,  QCoreApplication::translate(\"CabrilloFormat\",\"Low\") },\n        { POWER_QRP,  QCoreApplication::translate(\"CabrilloFormat\",\"QRP\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::operatorCategories()\n{\n    return {\n        { OPERATOR_SINGLE,   QCoreApplication::translate(\"CabrilloFormat\", \"Single Operator\") },\n        { OPERATOR_MULTI,    QCoreApplication::translate(\"CabrilloFormat\",\"Multi Operator\") },\n        { OPERATOR_CHECKLOG, QCoreApplication::translate(\"CabrilloFormat\",\"Check Log\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::assistedCategories()\n{\n    return {\n        { ASSISTED_NO,  QCoreApplication::translate(\"CabrilloFormat\",\"Non-Assisted\") },\n        { ASSISTED_YES, QCoreApplication::translate(\"CabrilloFormat\",\"Assisted\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::stationCategories()\n{\n    return {\n        { STATION_FIXED,           QCoreApplication::translate(\"CabrilloFormat\",\"Fixed\") },\n        { STATION_MOBILE,          QCoreApplication::translate(\"CabrilloFormat\",\"Mobile\") },\n        { STATION_PORTABLE,        QCoreApplication::translate(\"CabrilloFormat\",\"Portable\") },\n        { STATION_ROVER,           QCoreApplication::translate(\"CabrilloFormat\",\"Rover\") },\n        { STATION_ROVER_LIMITED,   QCoreApplication::translate(\"CabrilloFormat\",\"Rover Limited\") },\n        { STATION_ROVER_UNLIMITED, QCoreApplication::translate(\"CabrilloFormat\",\"Rover Unlimited\") },\n        { STATION_EXPEDITION,      QCoreApplication::translate(\"CabrilloFormat\",\"Expedition\") },\n        { STATION_HQ,              QCoreApplication::translate(\"CabrilloFormat\",\"HQ\") },\n        { STATION_SCHOOL,          QCoreApplication::translate(\"CabrilloFormat\",\"School\") },\n        { STATION_DISTRIBUTED,     QCoreApplication::translate(\"CabrilloFormat\",\"Distributed\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::transmitterCategories()\n{\n    return {\n        { TRANSMITTER_ONE,       QCoreApplication::translate(\"CabrilloFormat\",\"One\") },\n        { TRANSMITTER_TWO,       QCoreApplication::translate(\"CabrilloFormat\",\"Two\") },\n        { TRANSMITTER_LIMITED,   QCoreApplication::translate(\"CabrilloFormat\",\"Limited\") },\n        { TRANSMITTER_UNLIMITED, QCoreApplication::translate(\"CabrilloFormat\",\"Unlimited\") },\n        { TRANSMITTER_SWL,       QCoreApplication::translate(\"CabrilloFormat\",\"SWL\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::timeCategories()\n{\n    return {\n        { TIME_6_HOURS,  QCoreApplication::translate(\"CabrilloFormat\",\"6 Hours\") },\n        { TIME_12_HOURS, QCoreApplication::translate(\"CabrilloFormat\",\"12 Hours\") },\n        { TIME_24_HOURS, QCoreApplication::translate(\"CabrilloFormat\",\"24 Hours\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::overlayCategories()\n{\n    return {\n        { OVERLAY_CLASSIC,     QCoreApplication::translate(\"CabrilloFormat\",\"Classic\") },\n        { OVERLAY_ROOKIE,      QCoreApplication::translate(\"CabrilloFormat\",\"Rookie\") },\n        { OVERLAY_TB_WIRES,    QCoreApplication::translate(\"CabrilloFormat\",\"TB Wires\") },\n        { OVERLAY_NOVICE_TECH, QCoreApplication::translate(\"CabrilloFormat\",\"Novice/Tech\") },\n        { OVERLAY_OVER_50,     QCoreApplication::translate(\"CabrilloFormat\",\"Over 50\") },\n    };\n}\n\nQList<CabrilloFormat::CategoryItem> CabrilloFormat::formatterTypes()\n{\n    return {\n        { FMT_NONE,            QCoreApplication::translate(\"CabrilloFormat\",\"Text (left-aligned)\") },\n        { FMT_FREQ_KHZ,        QCoreApplication::translate(\"CabrilloFormat\",\"Frequency (kHz)\") },\n        { FMT_TIME_HHMM,       QCoreApplication::translate(\"CabrilloFormat\",\"Time (HHMM)\") },\n        { FMT_DATE_YYYY_MM_DD, QCoreApplication::translate(\"CabrilloFormat\",\"Date (YYYY-MM-DD)\") },\n        { FMT_RST_SHORT,       QCoreApplication::translate(\"CabrilloFormat\",\"RST Short (drop last digit)\") },\n        { FMT_UPPER,           QCoreApplication::translate(\"CabrilloFormat\",\"Uppercase\") },\n        { FMT_MODE_CABRILLO,   QCoreApplication::translate(\"CabrilloFormat\",\"Mode (Cabrillo)\") },\n        { FMT_PADDED_NR,       QCoreApplication::translate(\"CabrilloFormat\",\"Zero-Padded Nr.\") },\n        { FMT_TRANSMITTER_ID,  QCoreApplication::translate(\"CabrilloFormat\",\"Transmitter ID\") },\n    };\n}\n\nvoid CabrilloFormat::loadTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    columns.clear();\n    const TemplateInfo info = templateInfo(templateId);\n    contestName = info.contestName;\n    columns = loadTemplateColumns(templateId);\n}\n\nQList<CabrilloFormat::ColumnDef> CabrilloFormat::loadTemplateColumns(int templateId)\n{\n    FCT_IDENTIFICATION;\n\n    QList<ColumnDef> result;\n\n    QSqlQuery colQuery;\n    if ( !colQuery.prepare(\"SELECT position, db_field, width, formatter, label \"\n                           \"FROM cabrillo_template_columns \"\n                           \"WHERE template_id = :tid ORDER BY position\") )\n    {\n        qCWarning(runtime) << colQuery.lastError().text();\n        return result;\n    }\n    colQuery.bindValue(\":tid\", templateId);\n    if ( !colQuery.exec() )\n    {\n        qCWarning(runtime) << colQuery.lastError().text();\n        return result;\n    }\n\n    while ( colQuery.next() )\n    {\n        ColumnDef col;\n        col.position = colQuery.value(0).toInt();\n        col.dbField = colQuery.value(1).toString();\n        col.width = colQuery.value(2).toInt();\n        col.formatter = colQuery.value(3).toString();\n        col.label = colQuery.value(4).toString();\n        result.append(col);\n    }\n\n    return result;\n}\n\nQString CabrilloFormat::formatField(const QString &value,\n                                    const QString &formatter,\n                                    int width)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << value << formatter << width;\n\n    QString result = value;\n\n    if ( !formatter.isEmpty() )\n    {\n        if ( formatter == FMT_FREQ_KHZ )\n        {\n            // MHz string -> kHz integer\n            bool ok;\n            double mhz = value.toDouble(&ok);\n            if ( ok )\n                result = QString::number(static_cast<int>(mhz * 1000));\n        }\n        else if ( formatter == FMT_TIME_HHMM )\n        {\n            QDateTime dt = QDateTime::fromString(value, Qt::ISODate);\n            if ( dt.isValid() )\n                result = dt.toString(\"HHmm\");\n        }\n        else if ( formatter == FMT_DATE_YYYY_MM_DD )\n        {\n            QDateTime dt = QDateTime::fromString(value, Qt::ISODate);\n            if ( dt.isValid() )\n                result = dt.toString(\"yyyy-MM-dd\");\n        }\n        else if ( formatter == FMT_RST_SHORT )\n        {\n            // 599 -> 59 (drop last digit)\n            if ( result.length() >= 2 )\n                result = result.left(result.length() - 1);\n        }\n        else if ( formatter == FMT_UPPER )\n        {\n            result = result.toUpper();\n        }\n        else if ( formatter == FMT_MODE_CABRILLO )\n        {\n            // ADIF mode -> Cabrillo mode: CW, PH, FM, RY, DG\n            if ( value == \"CW\" )\n                result = \"CW\";\n            else if ( value == \"FM\" )\n                result = \"FM\";\n            else if ( value == \"RTTY\" )\n                result = \"RY\";\n            else\n            {\n                QString dxcc = BandPlan::modeToDXCCModeGroup(value);\n                result = ( dxcc == \"PHONE\" ) ? \"PH\" : \"DG\";\n            }\n        }\n        else if ( formatter == FMT_PADDED_NR )\n        {\n            bool ok;\n            unsigned long nr = value.toLongLong(&ok);\n            result = (ok) ? QString::number(nr).rightJustified(3, '0') : \"\";\n        }\n    }\n\n    // Pad or truncate to exactly 'width' characters (left-aligned)\n    if ( width > 0 )\n        result = result.leftJustified(width, ' ', true);\n\n    qCDebug(runtime) << result;\n\n    return result;\n}\n\nvoid CabrilloFormat::writeMultiLineField(const QString &key, const QString &value,\n                                         int maxLines)\n{\n    FCT_IDENTIFICATION;\n\n    const QString prefix = key + \": \";\n    const int maxContent = MAX_LINE_LENGTH - prefix.length();\n\n    const QStringList inputLines = value.split('\\n');\n    int lineCount = 0;\n\n    for ( const QString &inputLine : inputLines )\n    {\n        if ( maxLines > 0 && lineCount >= maxLines )\n            break;\n\n        const QString trimmed = inputLine.trimmed();\n        if ( trimmed.isEmpty() )\n            continue;\n\n        if ( trimmed.length() <= maxContent )\n        {\n            stream << prefix << trimmed << '\\n';\n            ++lineCount;\n            continue;\n        }\n\n        // Word-wrap long lines\n        const QStringList words = trimmed.split(' ',\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                                                 Qt::SkipEmptyParts);\n#else\n                                                 QString::SkipEmptyParts);\n#endif\n\n        QString line;\n        line.reserve(maxContent);\n\n        for ( const QString &word : words )\n        {\n            if ( maxLines > 0 && lineCount >= maxLines )\n                break;\n\n            const int extra = line.isEmpty() ? word.length()\n                                             : word.length() + 1;\n\n            if ( !line.isEmpty() && line.length() + extra > maxContent )\n            {\n                stream << prefix << line << '\\n';\n                ++lineCount;\n                line.clear();\n            }\n\n            if ( !line.isEmpty() ) line += ' ';\n            line += word;\n        }\n\n        if ( !line.isEmpty() && (maxLines <= 0 || lineCount < maxLines) )\n        {\n            stream << prefix << line << '\\n';\n            ++lineCount;\n        }\n    }\n}\n\nvoid CabrilloFormat::exportStart()\n{\n    FCT_IDENTIFICATION;\n\n    loadTemplate();\n\n    const QMap<QString, QString> headerFields = buildHeaderFields();\n\n    stream << \"START-OF-LOG: \" + FORMAT_VERSION_STRING << \"\\n\";\n    stream << \"CREATED-BY: \" + PROGRAMID_STRING << \"\\n\";\n\n    if ( !contestName.isEmpty() )\n        stream << \"CONTEST: \" << contestName << \"\\n\";\n\n    for ( const QString &key : headerOrder )\n    {\n        if ( !headerFields.contains(key) )\n            continue;\n\n        const QString &val = headerFields.value(key);\n\n        if ( key == \"CATEGORY-OPERATOR\" && val == OPERATOR_MULTI )\n            multiOpEnabled = true;\n\n        if ( key == \"ADDRESS\" )\n            writeMultiLineField(key, val, MAX_ADDRESS_LINES);\n        else if ( key == \"SOAPBOX\" )\n            writeMultiLineField(key, val);\n        else if ( !val.isEmpty() )\n            stream << key << \": \" << val << \"\\n\";\n    }\n}\n\nvoid CabrilloFormat::exportContact(const QSqlRecord &record,\n                                   QMap<QString, QString> *)\n{\n    FCT_IDENTIFICATION;\n\n    QString line = \"QSO:\";\n\n    for ( const ColumnDef &col : static_cast<const QList<ColumnDef>&>(columns) )\n    {\n        if ( col.formatter == FMT_TRANSMITTER_ID )\n        {\n            line += \" \" + ((multiOpEnabled) ? QString::number(transmitterId).leftJustified(col.width, ' ', true)\n                                            : \" \");\n            continue;\n        }\n\n        int fieldIndex = record.indexOf(col.dbField);\n        QString value;\n        if ( fieldIndex >= 0 )\n            value = record.value(fieldIndex).toString();\n\n        line += \" \" + formatField(value, col.formatter, col.width);\n    }\n\n    qCDebug(runtime) << line;\n    stream << line << \"\\n\";\n}\n\nvoid CabrilloFormat::exportEnd()\n{\n    FCT_IDENTIFICATION;\n\n    stream << \"END-OF-LOG:\" << \"\\n\";\n}\n"
  },
  {
    "path": "logformat/CabrilloFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_CABRILLOFORMAT_H\n#define QLOG_LOGFORMAT_CABRILLOFORMAT_H\n\n#include \"LogFormat.h\"\n#include <QList>\n#include <QMap>\n\nclass CabrilloFormat : public LogFormat\n{\npublic:\n    explicit CabrilloFormat(QTextStream &stream);\n\n    struct HeaderData\n    {\n        QString callsign;\n        QString operatorName;\n        QString email;\n        QString operators;\n        QString address;\n        QString gridLocator;\n        QString categoryOperator;\n        QString categoryBand;\n        QString categoryPower;\n        QString categoryMode;\n        QString categoryAssisted;\n        QString categoryStation;\n        QString categoryTransmitter;\n        QString categoryTime;\n        QString categoryOverlay;\n        QString location;\n        QString club;\n        QString offtime;\n        QString soapbox;\n    };\n\n    void setTemplateId(int id);\n    void setHeaderData(const HeaderData &data);\n    void setTransmitterId(int id);\n\n    void exportStart() override;\n    void exportContact(const QSqlRecord &record,\n                       QMap<QString, QString> *appliedMap = nullptr) override;\n    void exportEnd() override;\n\n    struct TemplateInfo\n    {\n        int id;\n        QString name;\n        QString contestName;\n        QString defaultCategoryMode;\n    };\n\n    struct ColumnDef\n    {\n        int position;\n        QString dbField;\n        int width;\n        QString formatter;\n        QString label;\n    };\n\n    struct CategoryItem\n    {\n        QString value;\n        QString label;\n    };\n\n    static QList<TemplateInfo> templateList();\n    static TemplateInfo templateInfo(int templateId);\n    static QList<ColumnDef> loadTemplateColumns(int templateId);\n    static QString formatField(const QString &value,\n                               const QString &formatter,\n                               int width);\n\n    static QList<CategoryItem> bandCategories();\n    static QList<CategoryItem> modeCategories();\n    static QList<CategoryItem> powerCategories();\n    static QList<CategoryItem> operatorCategories();\n    static QList<CategoryItem> assistedCategories();\n    static QList<CategoryItem> stationCategories();\n    static QList<CategoryItem> transmitterCategories();\n    static QList<CategoryItem> timeCategories();\n    static QList<CategoryItem> overlayCategories();\n    static QList<CategoryItem> formatterTypes();\n\n    // Formatter type identifiers\n    static const QString FMT_NONE;\n    static const QString FMT_FREQ_KHZ;\n    static const QString FMT_TIME_HHMM;\n    static const QString FMT_DATE_YYYY_MM_DD;\n    static const QString FMT_RST_SHORT;\n    static const QString FMT_UPPER;\n    static const QString FMT_MODE_CABRILLO;\n    static const QString FMT_TRANSMITTER_ID;\n    static const QString FMT_PADDED_NR;\n\n    // Band category values\n    static const QString BAND_ALL;\n    static const QString BAND_160M;\n    static const QString BAND_80M;\n    static const QString BAND_40M;\n    static const QString BAND_20M;\n    static const QString BAND_15M;\n    static const QString BAND_10M;\n    static const QString BAND_6M;\n    static const QString BAND_4M;\n    static const QString BAND_2M;\n    static const QString BAND_222;\n    static const QString BAND_432;\n    static const QString BAND_902;\n    static const QString BAND_1_2G;\n    static const QString BAND_LIGHT;\n    static const QString BAND_VHF_3_BAND;\n    static const QString BAND_VHF_FM_ONLY;\n\n    // Mode category values\n    static const QString MODE_CW;\n    static const QString MODE_SSB;\n    static const QString MODE_RTTY;\n    static const QString MODE_FM;\n    static const QString MODE_DIGI;\n    static const QString MODE_MIXED;\n\n    // Power category values\n    static const QString POWER_HIGH;\n    static const QString POWER_LOW;\n    static const QString POWER_QRP;\n\n    // Operator category values\n    static const QString OPERATOR_SINGLE;\n    static const QString OPERATOR_MULTI;\n    static const QString OPERATOR_CHECKLOG;\n\n    // Assisted category values\n    static const QString ASSISTED_NO;\n    static const QString ASSISTED_YES;\n\n    // Station category values\n    static const QString STATION_FIXED;\n    static const QString STATION_MOBILE;\n    static const QString STATION_PORTABLE;\n    static const QString STATION_ROVER;\n    static const QString STATION_ROVER_LIMITED;\n    static const QString STATION_ROVER_UNLIMITED;\n    static const QString STATION_EXPEDITION;\n    static const QString STATION_HQ;\n    static const QString STATION_SCHOOL;\n    static const QString STATION_DISTRIBUTED;\n\n    // Transmitter category values\n    static const QString TRANSMITTER_ONE;\n    static const QString TRANSMITTER_TWO;\n    static const QString TRANSMITTER_LIMITED;\n    static const QString TRANSMITTER_UNLIMITED;\n    static const QString TRANSMITTER_SWL;\n\n    // Time category values\n    static const QString TIME_6_HOURS;\n    static const QString TIME_12_HOURS;\n    static const QString TIME_24_HOURS;\n\n    // Overlay category values\n    static const QString OVERLAY_CLASSIC;\n    static const QString OVERLAY_ROOKIE;\n    static const QString OVERLAY_TB_WIRES;\n    static const QString OVERLAY_NOVICE_TECH;\n    static const QString OVERLAY_OVER_50;\n\n    const QString FORMAT_VERSION_STRING = \"3.0\";\n    const QString PROGRAMID_STRING = \"QLog\";\n\nprivate:\n    static const int MAX_LINE_LENGTH = 75;\n    static const int MAX_ADDRESS_LINES = 6;\n\n    void loadTemplate();\n    void writeMultiLineField(const QString &key, const QString &value,\n                             int maxLines = 0);\n\n    QMap<QString, QString> buildHeaderFields() const;\n\n    int templateId;\n    int transmitterId;\n    HeaderData headerData;\n    QList<ColumnDef> columns;\n    QString contestName;\n    bool multiOpEnabled;\n\n    const QStringList headerOrder = {\n        \"CALLSIGN\", \"NAME\", \"EMAIL\", \"OPERATORS\", \"ADDRESS\",\n        \"GRID-LOCATOR\",\n        \"CATEGORY-OPERATOR\", \"CATEGORY-BAND\", \"CATEGORY-POWER\",\n        \"CATEGORY-MODE\", \"CATEGORY-ASSISTED\",\n        \"CATEGORY-STATION\", \"CATEGORY-TRANSMITTER\",\n        \"CATEGORY-TIME\", \"CATEGORY-OVERLAY\",\n        \"CLUB\", \"OFFTIME\", \"SOAPBOX\"\n    };\n};\n\n#endif // QLOG_LOGFORMAT_CABRILLOFORMAT_H\n"
  },
  {
    "path": "logformat/JsonFormat.cpp",
    "content": "#include <QJsonDocument>\n#include <QSqlRecord>\n#include \"JsonFormat.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.jsonformat\");\n\nvoid JsonFormat::exportStart()\n{\n    FCT_IDENTIFICATION;\n\n    data = QJsonArray();\n}\n\nvoid JsonFormat::exportContact(const QSqlRecord& record, QMap<QString, QString>*applTags)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<record;\n\n    contact = QJsonObject();\n    writeSQLRecord(record, applTags);\n    data.append(contact);\n}\n\nvoid JsonFormat::exportEnd()\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject msg;\n    QJsonObject headerData;\n    headerData[\"adif_ver\"] = ADIF_VERSION_STRING;\n    headerData[\"programid\"] = PROGRAMID_STRING;\n    headerData[\"programversion\"] = VERSION;\n    headerData[\"created_timestamp\"] = QDateTime::currentDateTimeUtc().toString(\"yyyyMMdd hhmmss\");\n    msg[\"header\"] = headerData;\n    msg[\"records\"] = data;\n    QJsonDocument doc(msg);\n    stream << doc.toJson();\n}\n\nvoid JsonFormat::writeField(const QString &name,\n                            bool presenceCondition,\n                            const QString &value,\n                            const QString &type)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< name\n                                << presenceCondition\n                                << value\n                                << type;\n\n    if (value.isEmpty() || !presenceCondition) return;\n\n    contact[name] = value;\n}\n\nbool JsonFormat::importNext(QSqlRecord&)\n{\n    return false;\n}\n\n"
  },
  {
    "path": "logformat/JsonFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_JSONFORMAT_H\n#define QLOG_LOGFORMAT_JSONFORMAT_H\n\n#include <QJsonArray>\n#include \"AdxFormat.h\"\n\nclass JsonFormat : public AdxFormat\n{\npublic:\n    explicit JsonFormat(QTextStream& stream) : AdxFormat(stream) {}\n\n    virtual bool importNext(QSqlRecord& contact) override;\n    virtual void importStart() override {};\n    virtual void importEnd() override {};\n\n    virtual void exportStart() override;\n    virtual void exportContact(const QSqlRecord& record, QMap<QString, QString> *) override;\n    virtual void exportEnd() override;\n\nprotected:\n    virtual void writeField(const QString &name,\n                            bool presenceCondition,\n                            const QString &value,\n                            const QString &type=\"\") override;\n\nprivate:\n   QJsonArray data;\n   QJsonObject contact;\n};\n\n#endif // QLOG_LOGFORMAT_JSONFORMAT_H\n"
  },
  {
    "path": "logformat/LogFormat.cpp",
    "content": "#include <QtSql>\n#include <QSqlDriver>\n#include \"LogFormat.h\"\n#include \"AdiFormat.h\"\n#include \"AdxFormat.h\"\n#include \"PotaAdiFormat.h\"\n#include \"JsonFormat.h\"\n#include \"CSVFormat.h\"\n#include \"CabrilloFormat.h\"\n#include \"data/Data.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/Callsign.h\"\n#include \"data/BandPlan.h\"\n#include \"service/lotw/Lotw.h\"\n#include \"models/LogbookModel.h\"\n#include \"core/QSOFilterManager.h\"\n\nMODULE_IDENTIFICATION(\"qlog.logformat.logformat\");\n\nLogFormat::LogFormat(QTextStream& stream) :\n    QObject(nullptr),\n    stream(stream),\n    exportedFields(\"*\"),\n    duplicateQSOFunc(nullptr)\n{\n    FCT_IDENTIFICATION;\n    this->defaults = nullptr;\n}\n\nLogFormat::~LogFormat() {\n    FCT_IDENTIFICATION;\n}\n\nLogFormat* LogFormat::open(QString type, QTextStream& stream) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<type;\n\n    type = type.toLower();\n\n    if (type == \"adi\") {\n        return open(LogFormat::ADI, stream);\n    }\n    else if (type == \"adx\") {\n        return open(LogFormat::ADX, stream);\n    }\n    else if (type == \"json\") {\n        return open(LogFormat::JSON, stream);\n    }\n    else if (type == \"csv\") {\n        return open(LogFormat::CSV, stream);\n    }\n    else if (type == \"cabrillo\") {\n        return open(LogFormat::CABRILLO, stream);\n    }\n    else if (type == \"pota\") {\n        return open(LogFormat::POTA, stream);\n    }\n    else {\n        return nullptr;\n    }\n}\n\nLogFormat* LogFormat::open(LogFormat::Type type, QTextStream& stream) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<type;\n\n    switch (type) {\n    case LogFormat::ADI:\n        return new AdiFormat(stream);\n\n    case LogFormat::ADX:\n        return new AdxFormat(stream);\n\n    case LogFormat::JSON:\n        return new JsonFormat(stream);\n\n    case LogFormat::CSV:\n        return new CSVFormat(stream);\n\n    case LogFormat::CABRILLO:\n        return new CabrilloFormat(stream);\n\n    case LogFormat::POTA:\n        return new PotaAdiFormat(stream);\n\n    default:\n        return nullptr;\n    }\n}\n\nvoid LogFormat::setDefaults(QMap<QString, QString>& defaults) {\n    FCT_IDENTIFICATION;\n\n    this->defaults = &defaults;\n}\n\nvoid LogFormat::setFilterDateRange(const QDate &start, const QDate &end)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<start << \" \" << end;\n    this->filterStartDate = start;\n    this->filterEndDate = end;\n}\n\nvoid LogFormat::setFilterMyCallsign(const QString &myCallsing)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << myCallsing;\n    this->filterMyCallsign = myCallsing;\n}\n\nvoid LogFormat::setFilterMyGridsquare(const QString &myGridsquare)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << myGridsquare;\n    this->filterMyGridsquare = myGridsquare;\n}\n\nvoid LogFormat::setFilterSentPaperQSL(bool includeNo, bool includeIgnore, bool includeAlreadySent)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << includeNo << includeIgnore << includeAlreadySent;\n\n    this->filterSentPaperQSL << \"'R'\" << \"'Q'\";\n\n    if ( includeNo )\n    {\n        this->filterSentPaperQSL << \"'N'\";\n    }\n    if ( includeIgnore )\n    {\n        this->filterSentPaperQSL << \"'I'\";\n    }\n    if ( includeAlreadySent )\n    {\n        this->filterSentPaperQSL << \"'Y'\";\n    }\n}\n\nvoid LogFormat::setFilterSendVia(const QString &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << value;\n\n    this->filterSendVia = value;\n}\n\nvoid LogFormat::setUserFilter(const QString &value)\n{\n    FCT_IDENTIFICATION;\n    userFilter = value;\n}\n\nvoid LogFormat::setFilterStationProfile(const StationProfile &profile)\n{\n    FCT_IDENTIFICATION;\n\n    filterStationProfile = profile;\n    filterStationProfileSet = true;\n}\n\nvoid LogFormat::setPotaOnly(bool only)\n{\n    FCT_IDENTIFICATION;\n    filterPOTAOnly = only;\n}\n\nQString LogFormat::getWhereClause()\n{\n    FCT_IDENTIFICATION;\n\n    whereClause.clear();\n\n    whereClause << \"1 = 1\"; //generic filter\n\n    if ( isDateRange() )\n        whereClause << \"(datetime(start_time) BETWEEN datetime(:start_date) AND datetime(:end_date))\";\n\n    if ( !filterMyCallsign.isEmpty() )\n        whereClause << \"upper(station_callsign) = upper(:stationCallsign)\";\n\n    if ( !filterMyGridsquare.isEmpty() )\n        whereClause << \"upper(my_gridsquare) = upper(:myGridsquare)\";\n\n    if ( !filterSentPaperQSL.isEmpty() )\n        whereClause << QString(\"upper(qsl_sent) in  (%1)\").arg(filterSentPaperQSL.join(\", \"));\n\n    if ( !filterSendVia.isEmpty() )\n        whereClause << ( ( filterSendVia == \" \" ) ? \"qsl_sent_via is NULL\"\n                                                  : \"upper(qsl_sent_via) = upper(:qsl_sent_via)\");\n\n    if ( filterPOTAOnly )\n        whereClause << QLatin1String(\"(my_pota_ref is not NULL OR pota_ref is not NULL OR lower(sig)='pota' OR lower(my_sig)='pota')\");\n\n    if ( filterStationProfileSet )\n    {\n        whereClause << QString(\"EXISTS (\"\n                               \"SELECT 1 FROM station_profiles\"\n                               \" WHERE station_profiles.profile_name = :stationProfileName\"\n                               \" AND %1\"\n                               \")\").arg(filterStationProfile.getContactInnerJoin());\n    }\n\n    if ( !userFilter.isEmpty() )\n        whereClause << QSOFilterManager::getWhereClause(userFilter);\n\n    return whereClause.join(\" AND \");\n}\n\nvoid LogFormat::bindWhereClause(QSqlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n    if ( isDateRange() )\n    {\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n        query.bindValue(\":start_date\", filterStartDate.startOfDay());\n        query.bindValue(\":end_date\", filterEndDate.endOfDay());\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n        query.bindValue(\":start_date\", QDateTime(filterStartDate));\n        query.bindValue(\":end_date\", QDateTime(filterEndDate));\n#endif\n    }\n\n    if ( !filterMyCallsign.isEmpty() )\n    {\n        query.bindValue(\":stationCallsign\", filterMyCallsign);\n    }\n\n    if ( !filterMyGridsquare.isEmpty() )\n    {\n        query.bindValue(\":myGridsquare\", filterMyGridsquare);\n    }\n\n    if ( !filterSendVia.isEmpty() )\n    {\n        if ( filterSendVia != \" \" )\n        {\n            query.bindValue(\":qsl_sent_via\", filterSendVia);\n        }\n    }\n\n    if ( filterStationProfileSet )\n    {\n        query.bindValue(\":stationProfileName\", filterStationProfile.profileName);\n    }\n}\n\nvoid LogFormat::setExportedFields(const QStringList &fieldsList)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << fieldsList;\n    exportedFields = fieldsList;\n}\n\nvoid LogFormat::setFillMissingDxcc(bool fillMissingDxcc)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<fillMissingDxcc;\n\n    this->fillMissingDxcc = fillMissingDxcc;\n}\n\nvoid LogFormat::setDuplicateQSOCallback(duplicateQSOBehaviour (*func)(QSqlRecord *, QSqlRecord *))\n{\n    FCT_IDENTIFICATION;\n\n    duplicateQSOFunc = func;\n}\n\n#define RECORDIDX(a) ( (a) - 1 )\n\nunsigned long LogFormat::runImport(QTextStream& importLogStream,\n                                   const StationProfile *defaultStationProfile,\n                                   unsigned long *warnings,\n                                   unsigned long *errors)\n{\n    FCT_IDENTIFICATION;\n\n    this->importStart();\n\n    unsigned long count = 0L;\n    *errors = 0L;\n    *warnings = 0L;\n    unsigned long processedRec = 0;\n\n    QSqlQuery dupQuery;\n    QSqlQuery insertQuery;\n\n    // It is important to use callsign index here\n    if ( ! dupQuery.prepare(\"SELECT * FROM contacts \"\n                            \"WHERE callsign=upper(:callsign) \"\n                            \"AND upper(mode)=upper(:mode) \"\n                            \"AND upper(band)=upper(:band) \"\n                            \"AND COALESCE(sat_name, '') = COALESCE(:sat_name, '') \"\n                            \"AND ABS(JULIANDAY(start_time)-JULIANDAY(datetime(:startdate)))*24*60<30\") )\n    {\n        qWarning() << \"cannot prepare Dup statement\";\n        return 0;\n    }\n\n\n    QSqlDatabase::database().transaction();\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    model.removeColumn(model.fieldIndex(\"id\"));\n    QSqlRecord record = model.record();\n    duplicateQSOBehaviour dupSetting = LogFormat::ASK_NEXT;\n\n    auto setIfEmpty = [&](int column, const QString &value)\n    {\n        if ( record.value(RECORDIDX(column)).toString().isEmpty() && !value.isEmpty() )\n            record.setValue(RECORDIDX(column), value);\n    };\n\n    auto setMyDefaultProfile = [&]()\n    {\n        setIfEmpty(LogbookModel::COLUMN_MY_DXCC, QString::number(defaultStationProfile->dxcc));\n        setIfEmpty(LogbookModel::COLUMN_STATION_CALLSIGN, defaultStationProfile->callsign);\n        setIfEmpty(LogbookModel::COLUMN_MY_GRIDSQUARE, defaultStationProfile->locator);\n        setIfEmpty(LogbookModel::COLUMN_MY_NAME, Data::removeAccents(defaultStationProfile->operatorName));\n        setIfEmpty(LogbookModel::COLUMN_MY_NAME_INTL, defaultStationProfile->operatorName);\n        setIfEmpty(LogbookModel::COLUMN_OPERATOR, defaultStationProfile->operatorCallsign);\n        setIfEmpty(LogbookModel::COLUMN_MY_CITY_INTL, defaultStationProfile->qthName);\n        setIfEmpty(LogbookModel::COLUMN_MY_CITY, Data::removeAccents(defaultStationProfile->qthName));\n        setIfEmpty(LogbookModel::COLUMN_MY_IOTA, defaultStationProfile->iota);\n        setIfEmpty(LogbookModel::COLUMN_MY_POTA_REF, defaultStationProfile->pota);\n        setIfEmpty(LogbookModel::COLUMN_MY_SOTA_REF, defaultStationProfile->sota);\n        setIfEmpty(LogbookModel::COLUMN_MY_SIG_INTL, defaultStationProfile->sig);\n        setIfEmpty(LogbookModel::COLUMN_MY_SIG, Data::removeAccents(defaultStationProfile->sig));\n        setIfEmpty(LogbookModel::COLUMN_MY_SIG_INFO_INTL, defaultStationProfile->sigInfo);\n        setIfEmpty(LogbookModel::COLUMN_MY_SIG_INFO, Data::removeAccents(defaultStationProfile->sigInfo));\n        setIfEmpty(LogbookModel::COLUMN_MY_VUCC_GRIDS, defaultStationProfile->vucc);\n        setIfEmpty(LogbookModel::COLUMN_MY_ITU_ZONE, QString::number(defaultStationProfile->ituz));\n        setIfEmpty(LogbookModel::COLUMN_MY_CQ_ZONE, QString::number(defaultStationProfile->cqz));\n        setIfEmpty(LogbookModel::COLUMN_MY_COUNTRY_INTL, defaultStationProfile->country);\n        setIfEmpty(LogbookModel::COLUMN_MY_COUNTRY, Data::removeAccents(defaultStationProfile->country));\n        setIfEmpty(LogbookModel::COLUMN_MY_CNTY, Data::removeAccents(defaultStationProfile->county));\n        setIfEmpty(LogbookModel::COLUMN_MY_DARC_DOK, Data::removeAccents(defaultStationProfile->darcDOK));\n    };\n\n    auto setMyEntity = [&](const DxccEntity &myEntity)\n    {\n        // force overwrite\n        record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_DXCC), myEntity.dxcc);\n        record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY), Data::removeAccents(myEntity.country));\n        record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_COUNTRY_INTL), myEntity.country);\n\n        // other DXCC related values ​​are not closely related to DXCC value and could have been filled\n        // therefore check if it is present or not.\n        setIfEmpty(LogbookModel::COLUMN_MY_ITU_ZONE, QString::number(myEntity.ituz));\n        setIfEmpty(LogbookModel::COLUMN_MY_CQ_ZONE, QString::number(myEntity.cqz));\n    };\n\n    auto lookupAndSetMyEntityByCallsign = [&] (const QString& recordMyDXCC)\n    {\n        const DxccEntity &myEntity = Data::instance()->lookupDxcc(recordMyDXCC);\n\n        if ( myEntity.dxcc == 0 )  // My DXCC not found\n        {\n            writeImportLog(importLogStream,\n                           WARNING_SEVERITY,\n                           errors,\n                           warnings,\n                           processedRec,\n                           record,\n                           tr(\"Cannot find My DXCC Entity Info\"));\n        }\n        else\n        {\n            setMyEntity(myEntity);\n        }\n    };\n\n    if ( !insertQuery.prepare( QSqlDatabase::database().driver()->sqlStatement(QSqlDriver::InsertStatement,\n                                                                               \"contacts\",\n                                                                               record,\n                                                                               true)) )\n    {\n        qWarning() << \"cannot prepare Insert statement\" << insertQuery.lastError();\n        return 0;\n    }\n\n    while (true)\n    {\n        record.clearValues();\n\n        if (!this->importNext(record)) break;\n\n        processedRec++;\n\n        /* Compute the Band if missing\n         *   Band is one of the mandatory fields\n         */\n\n        if ( record.value(RECORDIDX(LogbookModel::COLUMN_BAND)).toString().isEmpty()\n             && !record.value(RECORDIDX(LogbookModel::COLUMN_FREQUENCY)).toString().isEmpty() )\n        {\n            double freq = record.value(RECORDIDX(LogbookModel::COLUMN_FREQUENCY)).toDouble();\n            record.setValue(RECORDIDX(LogbookModel::COLUMN_BAND), BandPlan::freq2Band(freq).name);\n        }\n\n        // needed later\n        const QVariant &call = record.value(RECORDIDX(LogbookModel::COLUMN_CALL));\n        const QVariant &mycall = record.value(RECORDIDX(LogbookModel::COLUMN_STATION_CALLSIGN));\n        const QVariant &band = record.value(RECORDIDX(LogbookModel::COLUMN_BAND));\n        const QVariant &mode = record.value(RECORDIDX(LogbookModel::COLUMN_MODE));\n        const QDateTime &start_time = record.value(RECORDIDX(LogbookModel::COLUMN_TIME_ON)).toDateTime();\n        const QVariant &sota = record.value(RECORDIDX(LogbookModel::COLUMN_SOTA_REF));\n        const QVariant &mysota = record.value(RECORDIDX(LogbookModel::COLUMN_MY_SOTA_REF));\n        const QVariant &satName = record.value(RECORDIDX(LogbookModel::COLUMN_SAT_NAME));\n\n        /* checking matching fields if they are not empty */\n        if ( !start_time.isValid()\n             || call.toString().isEmpty()\n             || band.toString().isEmpty()\n             || mode.toString().isEmpty())\n        {\n            writeImportLog(importLogStream,\n                           ERROR_SEVERITY,\n                           errors,\n                           warnings,\n                           processedRec,\n                           record,\n                           tr(\"A minimal set of fields not present (start_time, call, band, mode, station_callsign)\"));\n            qWarning() << \"Import does not contain minimal set of fields (start_time, call, band, mode, station_callsign)\";\n            qCDebug(runtime) << record;\n            continue;\n        }\n\n        if ( processedRec % 1000 == 0)\n        {\n            emit importPosition(stream.pos());\n        }\n\n        if ( isDateRange() )\n        {\n            if (!inDateRange(start_time.date()))\n            {\n                writeImportLog(importLogStream,\n                               WARNING_SEVERITY,\n                               errors,\n                               warnings,\n                               processedRec,\n                               record,\n                               tr(\"Outside the selected Date Range\"));\n                continue;\n            }\n        }\n\n        if ( dupSetting != ACCEPT_ALL )\n        {\n            dupQuery.bindValue(\":callsign\", call);\n            dupQuery.bindValue(\":mode\", mode);\n            dupQuery.bindValue(\":band\", band);\n            dupQuery.bindValue(\":startdate\", start_time.toTimeZone(QTimeZone::utc()).toString(\"yyyy-MM-dd hh:mm:ss\"));\n            dupQuery.bindValue(\":sat_name\", satName);\n\n            if ( !dupQuery.exec() )\n            {\n                qWarning() << \"Cannot exect DUP statement\";\n            }\n\n            if ( dupQuery.next() )\n            {\n                if ( dupSetting == SKIP_ALL)\n                {\n                    writeImportLog(importLogStream,\n                                   WARNING_SEVERITY,\n                                   errors,\n                                   warnings,\n                                   processedRec,\n                                   record,\n                                   tr(\"Duplicate\"));\n                    continue;\n                }\n\n                /* Duplicate QSO found */\n                if ( duplicateQSOFunc )\n                {\n                    QSqlRecord dupRecord;\n                    dupRecord= dupQuery.record();\n                    dupSetting = duplicateQSOFunc(&record, &dupRecord);\n                }\n\n                switch ( dupSetting )\n                {\n                case ACCEPT_ALL:\n                case ACCEPT_ONE:\n                case ASK_NEXT:\n                    break;\n\n                case SKIP_ONE:\n                case SKIP_ALL:\n                    writeImportLog(importLogStream,\n                                   WARNING_SEVERITY,\n                                   errors,\n                                   warnings,\n                                   processedRec,\n                                   record,\n                                   tr(\"Duplicate\"));\n                    continue;\n                    break;\n                }\n            }\n        }\n\n        /* Adding information which are important for QLog or QLog knows/compute them */\n        /************************/\n        /* Add DXCC Entity Info */\n        /************************/\n        const int recordDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_DXCC)).toInt();  // 0 = NaN or not present\n                                                                                              // otherwise = DXCC ID\n        DxccEntity entity;\n\n        if ( recordDXCCId != 0 )\n        {\n            // get additional DXCC info\n            entity = Data::instance()->lookupDxccIDAD1C(recordDXCCId);\n\n            // if DXCC is not present on AD1C list, try Clublog, no CQZ and ITUZ info here\n            if ( entity.dxcc == 0 )\n                entity = Data::instance()->lookupDxccIDClublog(recordDXCCId);\n\n            // no record in clublog, only Warning, because DXCC number is present\n            if ( entity.dxcc == 0 )\n                writeImportLog(importLogStream, WARNING_SEVERITY, errors, warnings,\n                               processedRec, record, tr(\"DXCC Info is missing\"));\n        }\n        else if ( !fillMissingDxcc )\n        {\n            // DXCC info is missing in the source and fillMissingDXCC is disabled - ERROR - QLog needs DXCC\n            writeImportLog(importLogStream, ERROR_SEVERITY, errors, warnings,\n                           processedRec, record, tr(\"DXCC Info is missing\"));\n            continue;\n        }\n        else\n        {\n            // DXCC info is missing in the source and fillMissingDXCC is enabled, try to find on AD1C list\n            entity = Data::instance()->lookupDxccAD1C(call.toString());\n            if ( entity.dxcc == 0 )\n                // if DXCC is not present on AD1C list, try Clublog, no CQZ and ITUZ info here\n                entity = Data::instance()->lookupDxccClublog(call.toString(), start_time);\n\n            if ( entity.dxcc == 0 )\n            {\n                // no record in clublog - ERROR - QLog needs DXCC\n                writeImportLog(importLogStream, ERROR_SEVERITY, errors, warnings,\n                               processedRec, record, tr(\"DXCC Info is missing\"));\n                continue;\n            }\n        }\n\n        if ( entity.dxcc != 0 )\n        {\n            record.setValue(RECORDIDX(LogbookModel::COLUMN_DXCC), entity.dxcc);\n            record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY), Data::removeAccents(entity.country));\n            record.setValue(RECORDIDX(LogbookModel::COLUMN_COUNTRY_INTL), entity.country);\n\n            // other DXCC related values ​​are not closely related to DXCC value and could have been filled\n            // therefore check if it is present or not.\n            setIfEmpty(LogbookModel::COLUMN_CONTINENT, entity.cont);\n            setIfEmpty(LogbookModel::COLUMN_ITUZ, QString::number(entity.ituz));\n            setIfEmpty(LogbookModel::COLUMN_CQZ, QString::number(entity.cqz));\n        };\n\n        /************************/\n        /* Add My Station Info  */\n        /************************/\n\n        int recordMyDXCCId = record.value(RECORDIDX(LogbookModel::COLUMN_MY_DXCC)).toInt(); // 0 = NAN or not present\n                                                                                            // otherwise = DXCC ID\n        const QString &myCallString = mycall.toString();\n\n        if ( defaultStationProfile )\n        {\n            // default is enabled\n\n            // Case 1: Both recordMyDXCCId and myCallString are empty\n            if (  recordMyDXCCId == 0 && myCallString.isEmpty()  )\n            {\n                setMyDefaultProfile();\n            }\n            // Case 2: recordMyDXCCId is empty, myCallString is not\n            else if ( recordMyDXCCId == 0 )\n            {\n                if ( defaultStationProfile->callsign == myCallString )\n                    setMyDefaultProfile();\n                else\n                    lookupAndSetMyEntityByCallsign(myCallString);\n            }\n            // Case 3: myCallString is empty, recordMyDXCCId is not\n            else if ( myCallString.isEmpty() )\n            {\n                if ( defaultStationProfile->dxcc == recordMyDXCCId )\n                    setMyDefaultProfile();\n                else\n                {\n                    // no Station Callsign = ERROR\n                    writeImportLog(importLogStream,\n                                   ERROR_SEVERITY,\n                                   errors,\n                                   warnings,\n                                   processedRec,\n                                   record,\n                                   tr(\"no Station Callsign present\"));\n                    continue;\n                }\n            }\n             // Case 4: Both recordMyDXCCId and myCallString are not empty\n            else\n            {\n                if ( defaultStationProfile->callsign == myCallString )\n                {\n                    if ( defaultStationProfile->dxcc == recordMyDXCCId )\n                        setMyDefaultProfile();\n                    else   \n                    {\n                        // no Station Callsign = ERROR\n                        writeImportLog(importLogStream,\n                                       ERROR_SEVERITY,\n                                       errors,\n                                       warnings,\n                                       processedRec,\n                                       record,\n                                       tr(\"no Station Callsign present\"));\n                        continue;\n                    }\n                }\n                else\n                    lookupAndSetMyEntityByCallsign(myCallString);\n            }\n        }\n        else\n        {\n            // default is disabled\n            if ( myCallString.isEmpty() )\n            {\n                // no Station Callsign = ERROR\n                writeImportLog(importLogStream,\n                               ERROR_SEVERITY,\n                               errors,\n                               warnings,\n                               processedRec,\n                               record,\n                               tr(\"no Station Callsign present\"));\n                continue;\n            }\n            else\n            {\n                const DxccEntity &myEntity = ( recordMyDXCCId != 0 ) ? Data::instance()->lookupDxccID(recordMyDXCCId)\n                                                                     : Data::instance()->lookupDxcc(myCallString);\n\n                if ( myEntity.dxcc == 0 )  // My DXCC not found\n                {\n                    writeImportLog(importLogStream,\n                                   WARNING_SEVERITY,\n                                   errors,\n                                   warnings,\n                                   processedRec,\n                                   record,\n                                   tr(\"Cannot find My DXCC Entity Info\"));\n                }\n                else\n                    setMyEntity(myEntity);\n            }\n        }\n\n        /***********/\n        /* Add PFX */\n        /***********/\n\n        if ( record.value(RECORDIDX(LogbookModel::COLUMN_PREFIX)).toString().isEmpty() )\n        {\n            const QString &pfxRef = Callsign(call.toString()).getWPXPrefix();\n\n            if ( !pfxRef.isEmpty() )\n            {\n                record.setValue(RECORDIDX(LogbookModel::COLUMN_PREFIX), pfxRef);\n            }\n        }\n\n        /********************/\n        /* Compute Distance */\n        /********************/\n        const QString &gridsquare = record.value(RECORDIDX(LogbookModel::COLUMN_GRID)).toString();\n        const QString &my_gridsquare = record.value(RECORDIDX(LogbookModel::COLUMN_MY_GRIDSQUARE)).toString();\n\n        if ( !gridsquare.isEmpty()\n             && !my_gridsquare.isEmpty()\n             && record.value(RECORDIDX(LogbookModel::COLUMN_DISTANCE)).toString().isEmpty() )\n        {\n            const Gridsquare grid(gridsquare);\n            const Gridsquare my_grid(my_gridsquare);\n            double distance;\n\n            if ( my_grid.distanceTo(grid, distance) )\n            {\n                record.setValue(RECORDIDX(LogbookModel::COLUMN_DISTANCE), distance);\n            }\n        }\n\n        /*************************/\n        /* Compute Alt from SOTA */\n        /*************************/\n        if ( record.value(RECORDIDX(LogbookModel::COLUMN_ALTITUDE)).toString().isEmpty()\n             && !sota.toString().isEmpty() )\n        {\n            const SOTAEntity &sotaInfo = Data::instance()->lookupSOTA(sota.toString());\n            if ( sotaInfo.summitCode.compare(sota.toString(), Qt::CaseInsensitive)\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                record.setValue(RECORDIDX(LogbookModel::COLUMN_ALTITUDE),sotaInfo.altm);\n            }\n        }\n\n        /*******************************/\n        /* Compute My Alt from My SOTA */\n        /*******************************/\n        if ( record.value(RECORDIDX(LogbookModel::COLUMN_MY_ALTITUDE)).toString().isEmpty()\n             && !mysota.toString().isEmpty() )\n        {\n            const SOTAEntity &sotaInfo = Data::instance()->lookupSOTA(mysota.toString());\n            if ( sotaInfo.summitCode.compare(sota.toString(), Qt::CaseInsensitive)\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                record.setValue(RECORDIDX(LogbookModel::COLUMN_MY_ALTITUDE),sotaInfo.altm);\n            }\n        }\n\n        /******************/\n        /* PREPARE INSERT */\n        /******************/\n        // Bind all values\n        for ( int i = 0; i < record.count(); i++ )\n        {\n            insertQuery.bindValue(i, record.value(i));\n        }\n\n        if ( ! insertQuery.exec() )\n        {\n            writeImportLog(importLogStream,\n                           ERROR_SEVERITY,\n                           errors,\n                           warnings,\n                           processedRec,\n                           record,\n                           tr(\"Cannot insert to database\") + \" - \" + insertQuery.lastError().text());\n            qWarning() << \"Cannot insert a record to Contact Table - \" << insertQuery.lastError();\n            qCDebug(runtime) << record;\n        }\n        else\n        {\n            writeImportLog(importLogStream,\n                           INFO_SEVERITY,\n                           errors,\n                           warnings,\n                           processedRec,\n                           record,\n                           tr(\"Imported\"));\n            count++;\n        }\n    }\n\n    emit importPosition(stream.pos());\n    emit finished(count);\n\n    QSqlDatabase::database().commit();\n\n    this->importEnd();\n\n    return count;\n}\n\n#undef RECORDIDX\n\nvoid LogFormat::runQSLImport(QSLFrom fromService)\n{\n    FCT_IDENTIFICATION;\n\n    auto reportFormatter = [&](const QDateTime &qsoTime,\n                               const QString &callsign,\n                               const QString &mode,\n                               const QStringList addInfo = QStringList())\n    {\n        return QString(\"%0; %1; %2%3 %4\").arg(qsoTime.isValid() ? qsoTime.toString(locale.formatDateShortWithYYYY()) : \"-\",\n                                            callsign,\n                                            mode,\n                                            (addInfo.size() > 0 ) ? \";\" : \"\",\n                                            addInfo.join(\", \"));\n    };\n\n    static QRegularExpression reLeadingZero(\"^0+\");\n    QSLMergeStat stats = {QStringList(), QStringList(), QStringList(), QStringList(), 0};\n    this->importStart();\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    QSqlRecord QSLRecord = model.record(0);\n\n    // Cache for mode to dxcc group lookups; avoids repeated DB queries for the same\n    // mode value when processing large imports (LoTW fallback path only).\n    QMap<QString, QString> modeGroupCache;\n\n    while ( true )\n    {\n        QSLRecord.clearValues();\n\n        if ( !this->importNext(QSLRecord) ) break;\n\n        stats.qsosDownloaded++;\n\n        if ( stats.qsosDownloaded % 100 == 0 )\n        {\n            emit importPosition(stream.pos());\n        }\n\n        // needed later\n        const QVariant &call = QSLRecord.value(\"callsign\");\n        const QVariant &band = QSLRecord.value(\"band\");\n        const QVariant &mode = QSLRecord.value(\"mode\");\n        const QVariant &start_time = QSLRecord.value(\"start_time\");\n        const QVariant &satName = QSLRecord.value(\"sat_name\");\n\n        /* checking matching fields if they are not empty */\n        if ( !start_time.toDateTime().isValid()\n             || call.toString().isEmpty()\n             || band.toString().isEmpty()\n             || mode.toString().isEmpty() )\n        {\n            qWarning() << \"Import does not contain field start_time or callsign or band or mode \";\n            qCDebug(runtime) << QSLRecord;\n            stats.errorQSLs.append(reportFormatter(start_time.toDateTime(), call.toString(), mode.toString()));\n            continue;\n        }\n\n        const QString startTimeStr = start_time.toDateTime().toTimeZone(QTimeZone::utc()).toString(\"yyyy-MM-dd hh:mm:ss\");\n\n        // Common filter conditions — shared by all match attempts\n        const QString baseFilter = QString(\n            \"callsign=upper('%1') AND upper(band)=upper('%2') AND \"\n            \"COALESCE(sat_name, '') = upper('%3') AND \"\n            \"ABS(JULIANDAY(start_time)-JULIANDAY(datetime('%4')))*24*60<30\"\n        ).arg(call.toString(), band.toString(), satName.toString(), startTimeStr);\n\n        // First attempt: exact mode match (used for eQSL; also the fast path for LoTW)\n        model.setFilter(baseFilter + QString(\" AND upper(mode)=upper('%1')\").arg(mode.toString()));\n        model.select();\n\n        // LoTW fallback: LoTW confirms QSOs when both sides specify modes in the same\n        // group (CW / PHONE / DATA).\n\n        // Two submitted descriptions of a QSO match if\n\n        // https://lotw.arrl.org/lotw-help/frequently-asked-questions/#datamatch\n        // your QSO description specifies a callsign that matches the Callsign Certificate specified by the Station Location your QSO partner used to digitally sign the QSO\n        // your QSO partner's QSO description specifies a callsign that matches the Callsign Certificate specified by the Station Location you used to digitally sign the QSO\n        // both QSO descriptions specify start times within 30 minutes of each other\n        // both QSO descriptions specify the same band\n        // both QSO descriptions specify the same mode (an exact mode match), or must specify modes belonging to the same Mode Group\n        // for satellite QSOs, both QSO descriptions must specify the same satellite, and a propagation mode of SAT\n        if ( model.rowCount() != 1 && fromService == LOTW )\n        {\n            const QString modeStr = mode.toString();\n            QString dxccGroup = LotwBase::lotwGroupNameToDxcc(modeStr);\n\n            if ( dxccGroup.isEmpty() )\n            {\n                if ( !modeGroupCache.contains(modeStr) )\n                    modeGroupCache.insert(modeStr, BandPlan::modeToDXCCModeGroup(modeStr));\n                dxccGroup = modeGroupCache.value(modeStr);\n            }\n\n            if ( !dxccGroup.isEmpty() )\n            {\n                qCDebug(runtime) << \"LoTW: mode group fallback\" << mode << \"->\" << dxccGroup;\n                model.setFilter(baseFilter + QString(\n                    \" AND (SELECT dxcc FROM modes WHERE upper(name)=upper(mode) LIMIT 1) = '%1'\"\n                ).arg(dxccGroup));\n                model.select();\n            }\n        }\n\n        if ( model.rowCount() != 1 )\n        {\n            stats.unmatchedQSLs.append(reportFormatter(start_time.toDateTime(), call.toString(), mode.toString()));\n            continue;\n        }\n\n        /* we have one row for updating */\n        /* lets update it */\n        QSqlRecord originalRecord = model.record(0);\n\n        switch ( fromService )\n        {\n        case LOTW:\n        {\n            /* https://lotw.arrl.org/lotw-help/developer-query-qsos-qsls/?lang=en */\n            // always try to update contact from received QSL\n            if ( QSLRecord.value(\"qsl_rcvd\").toString() == 'Y' ) // qsl_rcvd is OK because LoTW sends lotw_qsl_rcvd value in qsl_rcvd\n            {\n                QStringList updatedFields;\n                bool callUpdate = false;\n                bool newlyReceived = (QSLRecord.value(\"qsl_rcvd\").toString() != originalRecord.value(\"lotw_qsl_rcvd\").toString());\n\n                qCDebug(runtime) << \"Attempt to\" << (newlyReceived ? \"force \" : \"\") << \"update QSO\" << call.toString()\n                                 << band.toString() << start_time.toString();\n\n                auto conditionUpdate = [&](const QString &contactKey,\n                                           const QString &qslKey,\n                                           bool forceUpdate = false)\n                {\n                    if ( !QSLRecord.value(qslKey).toString().isEmpty()\n                        && ( forceUpdate || originalRecord.value(contactKey).toString().isEmpty() ) )\n                    {\n                        qCDebug(runtime) << \"Updating:\" << contactKey\n                                         << \"to\" << QSLRecord.value(qslKey).toString()\n                                         << (forceUpdate ? \"force update\" : \"\");\n                        updatedFields.append(contactKey + \"(\" + QSLRecord.value(qslKey).toString()  +\")\");\n                        originalRecord.setValue(contactKey, QSLRecord.value(qslKey));\n                        return true;\n                    }\n                    return false;\n                };\n\n                auto conditionUpdateSpecial = [&](const QString &contactKey,\n                                                  const QString &qslKey,\n                                                  bool forceUpdate = false)\n                {\n                    QString contactValue = originalRecord.value(contactKey).toString();\n                    QString QSLValue = QSLRecord.value(qslKey).toString();\n                    contactValue.remove(reLeadingZero);\n                    QSLValue.remove(reLeadingZero);\n\n                    if ( !QSLValue.isEmpty()\n                        && ( forceUpdate || contactValue != QSLValue ) )\n                    {\n                        qCDebug(runtime) << \"Updating:\" << contactKey\n                                         << \"from\" << originalRecord.value(contactKey).toString()\n                                         << \"to\" << QSLValue\n                                         << (forceUpdate ? \"force update\" : \"\");\n                        updatedFields.append(contactKey + \"(\" + QSLRecord.value(qslKey).toString()  +\")\");\n                        originalRecord.setValue(contactKey, QSLValue);\n                        return true;\n                    }\n                    return false;\n                };\n\n                callUpdate |= conditionUpdate(\"lotw_qsl_rcvd\", \"qsl_rcvd\", newlyReceived);\n                callUpdate |= conditionUpdate(\"lotw_qslrdate\", \"qsl_rdate\", newlyReceived);\n                callUpdate |= conditionUpdate(\"credit_granted\", \"credit_granted\", newlyReceived);\n                callUpdate |= conditionUpdate(\"credit_submitted\", \"credit_submitted\", newlyReceived);\n                callUpdate |= conditionUpdate(\"pfx\", \"pfx\", newlyReceived);\n                callUpdate |= conditionUpdate(\"iota\", \"iota\", newlyReceived);\n                callUpdate |= conditionUpdate(\"vucc_grids\", \"vucc_grids\", newlyReceived);\n                callUpdate |= conditionUpdate(\"state\", \"state\", newlyReceived);\n                callUpdate |= conditionUpdate(\"cnty\", \"cnty\", newlyReceived);\n                callUpdate |= conditionUpdateSpecial(\"ituz\", \"ituz\", newlyReceived);\n                callUpdate |= conditionUpdateSpecial(\"cqz\", \"cqz\", newlyReceived);\n\n                if ( originalRecord.value(\"qsl_rcvd_via\").toString() != \"E\" )\n                {\n                    qCDebug(runtime) << \"Updating: qsl_rcvd_via from\" << originalRecord.value(\"qsl_rcvd_via\").toString() << \"to E\";\n                    originalRecord.setValue(\"qsl_rcvd_via\", \"E\");\n                    updatedFields.append(\"qsl_rcvd_via (E)\");\n                    callUpdate |= true;\n                }\n\n                const QString origGrig = originalRecord.value(\"gridsquare\").toString();\n                const Gridsquare dxNewGrid(QSLRecord.value(\"gridsquare\").toString());\n\n                if ( ( newlyReceived\n                       ||  origGrig.isEmpty()\n                       || ( origGrig.length() < QSLRecord.value(\"gridsquare\").toString().length()\n                            && dxNewGrid.isValid()\n                            && dxNewGrid.getGrid().contains(origGrig) ) )\n                    && !dxNewGrid.getGrid().isEmpty() )\n                {\n                    const Gridsquare myGrid(originalRecord.value(\"my_gridsquare\").toString());\n\n                    originalRecord.setValue(\"gridsquare\", dxNewGrid.getGrid());\n\n                    double distance;\n\n                    if ( myGrid.distanceTo(dxNewGrid, distance) )\n                    {\n                        originalRecord.setValue(\"distance\", QVariant(distance));\n                    }\n                    qCDebug(runtime) << \"Updating: grid from \" << origGrig << \"to\" << dxNewGrid.getGrid();\n                    updatedFields.append(\"gridsquare (\" + dxNewGrid.getGrid()  +\")\");\n                    callUpdate |= true;\n                }\n\n                if ( callUpdate )\n                {\n                    qCDebug(runtime) << \"Calling update for\" << call << band << mode << start_time << satName;\n                    if ( !model.setRecord(0, originalRecord) )\n                    {\n                        qWarning() << \"Cannot update a Contact record - \" << model.lastError();\n                        qCDebug(runtime) << originalRecord;\n                    }\n\n                    if ( !model.submitAll() )\n                    {\n                        qWarning() << \"Cannot commit changes to Contact Table - \" << model.lastError();\n                    }\n                    if ( newlyReceived )\n                    {\n                        const DxccStatus status = Data::instance()->dxccStatus(originalRecord.value(\"dxcc\").toInt(), band.toString(), mode.toString());\n                        stats.newQSLs.append(reportFormatter(start_time.toDateTime(), call.toString(), mode.toString(), {tr(\"DXCC State:\") + \" \" + Data::statusToText(status)}));\n                    }\n                    else\n                        stats.updatedQSOs.append(reportFormatter(start_time.toDateTime(), call.toString(), mode.toString(), updatedFields));\n                }\n            }\n            break;\n        }\n\n        case EQSL:\n        {\n            /* http://www.eqsl.cc/qslcard/DownloadInBox.txt */\n            /*   CALL\n                 QSO_DATE\n                 TIME_ON\n                 BAND\n                 MODE\n                 SUBMODE (tag only present if non-blank)\n                 PROP_MODE (tag only present if non-blank)\n                 RST_SENT (will be the sender's RST Sent, not yours)\n                 RST_RCVD (we do not capture this in uploads, so will normally be 0 length)\n                 QSL_SENT (always Y)\n                 QSL_SENT_VIA (always E)\n                 QSLMSG (if non-null and containing only valid printable ASCII characters)\n                 QSLMSG_INTL (if non-null and containing international characters - see ADIF V3 specs)\n                 APP_EQSL_SWL (tag only present if sender is SWL and then always Y)\n                 APP_EQSL_AG (tag only present if sender has Authenticity Guaranteed status and then always Y)\n                 GRIDSQUARE (tag only present if non-blank and at least 4 long)\n            */\n            // LF: Since I consider this source unreliable, I will not update it here, as I do with LoTW\n            // try to update contact from received QSL only in case when contact != Y\n            if ( originalRecord.value(\"eqsl_qsl_rcvd\").toString() != 'Y' )\n            {\n                originalRecord.setValue(\"eqsl_qsl_rcvd\", QSLRecord.value(\"qsl_sent\"));\n\n                originalRecord.setValue(\"eqsl_qslrdate\", QDateTime::currentDateTimeUtc().date().toString(\"yyyy-MM-dd\"));\n\n                Gridsquare dxNewGrid(QSLRecord.value(\"gridsquare\").toString());\n\n                if ( dxNewGrid.isValid()\n                     && ( originalRecord.value(\"gridsquare\").toString().isEmpty()\n                          ||\n                          dxNewGrid.getGrid().contains(originalRecord.value(\"gridsquare\").toString()))\n                     )\n                {\n                    Gridsquare myGrid(originalRecord.value(\"my_gridsquare\").toString());\n\n                    originalRecord.setValue(\"gridsquare\", dxNewGrid.getGrid());\n\n                    double distance;\n\n                    if ( myGrid.distanceTo(dxNewGrid, distance) )\n                    {\n                        originalRecord.setValue(\"distance\", QVariant(distance));\n                    }\n                }\n\n                const QString &prevValue = originalRecord.value(\"qslmsg_rcvd\").toString();\n                const QString &newValue = QSLRecord.value(\"qslmsg\").toString();\n\n                if ( !newValue.isEmpty() )\n                    originalRecord.setValue(\"qslmsg_rcvd\", prevValue.isEmpty() ? \"eQSL: \" + newValue : prevValue + \"| eQSL: \" + newValue);\n\n                // temporary removed - ADIF 3.1.5 has no INTL equivalent for qslmsg_rcvd\n                //originalRecord.setValue(\"qslmsg_int\", QSLRecord.value(\"qslmsg_int\"));\n\n                originalRecord.setValue(\"qsl_rcvd_via\", QSLRecord.value(\"qsl_sent_via\"));\n\n                /*\n                 * It appears that the life cycle of EQSL_AQ field is not fully understood\n                 * at the moment. Unfortunately, even on the ADIF forum there are differing opinions,\n                 * but I have gained the impression that the only authority that knows the correct\n                 * value of EQSL_AG is eQSL itself. Therefore, I believe that the value received from eQSL\n                 * should always be set here, even though the field’s value may vary at the time the QSL is received.\n                 */\n                originalRecord.setValue(\"eqsl_ag\", QSLRecord.value(\"eqsl_ag\"));\n\n                if ( !model.setRecord(0, originalRecord) )\n                {\n                    qWarning() << \"Cannot update a Contact record - \" << model.lastError();\n                    qCDebug(runtime) << originalRecord;\n                }\n\n                if ( !model.submitAll() )\n                {\n                    qWarning() << \"Cannot commit changes to Contact Table - \" << model.lastError();\n                }\n                const DxccStatus status = Data::instance()->dxccStatus(originalRecord.value(\"dxcc\").toInt(), band.toString(), mode.toString());\n                stats.newQSLs.append(reportFormatter(start_time.toDateTime(), call.toString(), mode.toString(), {tr(\"DXCC State:\") + \" \" + Data::statusToText(status)}));\n            }\n\n            break;\n        }\n\n        default:\n            qCDebug(runtime) << \"Unknown QSL import\";\n        }\n    }\n\n    emit importPosition(stream.pos());\n\n    this->importEnd();\n\n    emit QSLMergeFinished(stats);\n}\n\nlong LogFormat::runExport()\n{\n    FCT_IDENTIFICATION;\n\n    this->exportStart();\n\n    QSqlQuery query;\n\n    QString queryStmt = QString(\"SELECT %1 FROM contacts WHERE %2 ORDER BY start_time ASC\").arg(exportedFields.join(\", \"), getWhereClause());\n\n    qCDebug(runtime) << queryStmt;\n\n    if ( ! query.prepare(queryStmt) )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return 0;\n    }\n\n    bindWhereClause(query);\n\n    if ( ! query.exec() )\n    {\n        qWarning() << \"Cannot execute select statement\" << query.lastError();\n        return 0;\n    }\n\n    long count = 0L;\n\n    /* following 3 lines are a workaround - SQLite does not\n     * return a correct value for QSqlQuery.size\n     */\n    int rows = (query.last()) ? query.at() + 1 : 0;\n    query.first();\n    query.previous();\n\n    while (query.next())\n    {\n        this->exportContact(query.record());\n        count++;\n        if (count % 100 == 0)\n        {\n            emit exportProgress((int)(count * 100 / rows));\n        }\n    }\n\n    emit exportProgress(100);\n\n    this->exportEnd();\n    return count;\n}\n\nlong LogFormat::runExport(const QList<QSqlRecord> &selectedQSOs)\n{\n    FCT_IDENTIFICATION;\n\n    this->exportStart();\n\n    long count = 0L;\n    for (const QSqlRecord &qso: selectedQSOs)\n    {\n        QSqlRecord contactRecord;\n\n        if ( exportedFields.first() != \"*\" )\n        {\n            for ( const QString& fieldName : static_cast<const QStringList&>(exportedFields) )\n            {\n                contactRecord.append(qso.field(fieldName));\n            }\n        }\n        else\n        {\n            contactRecord = qso;\n        }\n        this->exportContact(contactRecord);\n        count++;\n        if ( count % 10 == 0 )\n        {\n            emit exportProgress((int)(count * 100 / selectedQSOs.size()));\n        }\n    }\n\n    emit exportProgress(100);\n    emit finished(count);\n    this->exportEnd();\n    return count;\n}\n\nbool LogFormat::isDateRange() {\n    FCT_IDENTIFICATION;\n\n    return !filterStartDate.isNull() && !filterEndDate.isNull();\n}\n\nbool LogFormat::inDateRange(QDate date) {\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<date;\n\n    return date >= filterStartDate && date <= filterEndDate;\n}\n\nQString LogFormat::importLogSeverityToString(ImportLogSeverity severity)\n{\n    switch ( severity )\n    {\n    case ERROR_SEVERITY:\n        return tr(\"Error\") + \" - \";\n        break;\n    case WARNING_SEVERITY:\n        return tr(\"Warning\") + \" - \";\n        break;\n    case INFO_SEVERITY:\n    default: //NOTHING\n        ;\n    }\n\n    return QString();\n}\n\nvoid LogFormat::writeImportLog(QTextStream &errorLogStream, ImportLogSeverity severity, const QString &msg)\n{\n    FCT_IDENTIFICATION;\n\n    errorLogStream << importLogSeverityToString(severity) << msg << \"\\n\";\n}\n\nvoid LogFormat::writeImportLog(QTextStream& errorLogStream,\n                               ImportLogSeverity severity,\n                               unsigned long *error,\n                               unsigned long *warning,\n                               const unsigned long recordNo,\n                               const QSqlRecord &record,\n                               const QString &msg)\n{\n    FCT_IDENTIFICATION;\n\n    errorLogStream << QString(\"[QSO#%1]: \").arg(recordNo)\n                   << importLogSeverityToString(severity)\n                   << msg\n                   << QString(\" (%1; %2; %3)\").arg(record.value(\"start_time\").toDateTime().toTimeZone(QTimeZone::utc()).toString(locale.formatDateShortWithYYYY()),\n                                                   record.value(\"callsign\").toString(),\n                                                   record.value(\"mode\").toString())\n                   << \"\\n\";\n    switch (severity)\n    {\n    case WARNING_SEVERITY: (*warning)++; break;\n    case ERROR_SEVERITY: (*error)++; break;\n    case INFO_SEVERITY: break;\n    }\n}\n"
  },
  {
    "path": "logformat/LogFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_LOGFORMAT_H\n#define QLOG_LOGFORMAT_LOGFORMAT_H\n\n#include <QtCore>\n#include <QMap>\n#include <QSqlQuery>\n\n#include \"core/LogLocale.h\"\n#include \"data/StationProfile.h\"\n\nclass QSqlRecord;\n\nstruct QSLMergeStat {\n    QStringList newQSLs;\n    QStringList updatedQSOs;\n    QStringList unmatchedQSLs;\n    QStringList errorQSLs;\n    int qsosDownloaded;\n};\n\nclass LogFormat : public QObject {\n    Q_OBJECT\n\npublic:\n    enum Type {\n        ADI,\n        ADX,\n        CABRILLO,\n        JSON,\n        CSV,\n        POTA\n    };\n\n    enum QSLFrom {\n        LOTW,\n        EQSL,\n        UNKNOW\n    };\n\n    enum duplicateQSOBehaviour {\n        ASK_NEXT,\n        SKIP_ONE,\n        SKIP_ALL,\n        ACCEPT_ONE,\n        ACCEPT_ALL\n    };\n\n    explicit LogFormat(QTextStream& stream);\n\n    virtual ~LogFormat();\n\n    static LogFormat* open(QString type, QTextStream& stream);\n    static LogFormat* open(Type type, QTextStream& stream);\n\n    unsigned long runImport(QTextStream& importLogStream,\n                            const StationProfile *defaultStationProfile,\n                            unsigned long *warnings,\n                            unsigned long *errors);\n    void runQSLImport(QSLFrom fromService);\n    long runExport();\n    long runExport(const QList<QSqlRecord>&);\n    void setDefaults(QMap<QString, QString>& defaults);\n    void setFilterDateRange(const QDate &start, const QDate &end);\n    void setFilterMyCallsign(const QString &myCallsing);\n    void setFilterMyGridsquare(const QString &myGridsquare);\n    void setFilterSentPaperQSL(bool includeNo, bool includeIgnore, bool includeAlreadySent);\n    void setFilterSendVia(const QString &value);\n    void setFilterStationProfile(const StationProfile &profile);\n    void setUserFilter(const QString&value);\n    void setPotaOnly(bool only);\n    QString getWhereClause();\n    void bindWhereClause(QSqlQuery &);\n    void setExportedFields(const QStringList& fieldsList);\n    void setFillMissingDxcc(bool fillMissingDxcc);\n    void setDuplicateQSOCallback(duplicateQSOBehaviour (*func)(QSqlRecord *, QSqlRecord *));\n\n    virtual void importStart() {}\n    virtual void importEnd() {}\n    virtual bool importNext(QSqlRecord&) { return false; }\n\n    virtual void exportStart() {}\n    virtual void exportEnd() {}\n    virtual void exportContact(const QSqlRecord&, QMap<QString, QString> * = nullptr) {}\n\nsignals:\n    void importPosition(qint64 value);\n    void exportProgress(float value);\n    void finished(int count);\n    void QSLMergeFinished(QSLMergeStat stats);\n\nprotected:\n    QTextStream& stream;\n    QMap<QString, QString>* defaults;\n\nprivate:\n    enum ImportLogSeverity\n    {\n        INFO_SEVERITY,\n        WARNING_SEVERITY,\n        ERROR_SEVERITY\n    };\n\n    bool isDateRange();\n    bool inDateRange(QDate date);\n\n    QString importLogSeverityToString(ImportLogSeverity);\n\n    void writeImportLog(QTextStream& errorLogStream,\n                        ImportLogSeverity severity,\n                        const QString &msg);\n    void writeImportLog(QTextStream& errorLogStream,\n                        ImportLogSeverity severity,\n                        unsigned long *error,\n                        unsigned long *warning,\n                        const unsigned long recordNo,\n                        const QSqlRecord &record,\n                        const QString &msg);\n    QDate filterStartDate, filterEndDate;\n    QString filterMyCallsign;\n    QString filterMyGridsquare;\n    QStringList filterSentPaperQSL;\n    QString filterSendVia;\n    StationProfile filterStationProfile;\n    bool filterStationProfileSet = false;\n    QStringList whereClause;\n    QStringList exportedFields;\n    QString userFilter;\n    bool filterPOTAOnly = false;\n    bool fillMissingDxcc = false;\n    duplicateQSOBehaviour (*duplicateQSOFunc)(QSqlRecord *, QSqlRecord *);\n    LogLocale locale;\n};\n\n#endif // QLOG_LOGFORMAT_LOGFORMAT_H\n"
  },
  {
    "path": "logformat/PotaAdiFormat.cpp",
    "content": "#include \"PotaAdiFormat.h\"\n#include <QDebug>\n#include <QSqlField>\n#include <QSqlRecord>\n#include \"core/debug.h\"\n#include <models/LogbookModel.h>\n\nMODULE_IDENTIFICATION(\"qlog.logformat.potalogformat\");\n\nPotaAdiFormat::PotaAdiFormat(QTextStream &stream) :\n    AdiFormat(stream),\n    currentDate(QDateTime::currentDateTime())\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid PotaAdiFormat::setExportDirectory(const QString &dir)\n{\n    FCT_IDENTIFICATION;\n\n    exportDir = dir;\n}\n\nvoid PotaAdiFormat::exportContact(const QSqlRecord &sourceRecord, QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    if ( exportDir.isEmpty() || !isValidPotaRecord(sourceRecord) )\n        return;\n\n    QSqlRecord inputRecord(sourceRecord);\n\n    preparePotaField(inputRecord, \"my_pota_ref\", \"my_sig_info\", \"my_sig\");\n    preparePotaField(inputRecord, \"pota_ref\", \"sig_info\", \"sig\");\n\n    QList<QSqlRecord> expandedRecords({inputRecord});\n\n    // Expand records based on specific fields - one record for the specific POTA Ref\n    expandParkRecord(expandedRecords, \"my_sig_info\");\n    expandParkRecord(expandedRecords, \"sig_info\");\n\n    for ( const QSqlRecord &record : static_cast<const QList<QSqlRecord>&>(expandedRecords) )\n    {\n        const QString &mySig = record.value(\"my_sig\").toString().toLower();\n\n        // export Activator Log\n        if ( mySig == \"pota\" )\n        {\n            if ( AdiFormat *parkOut = this->getActivatorParkFormatter(record) )\n            {\n                parkOut->exportContact(record, applTags);\n                continue;\n            }\n        }\n        // export Hunter Log\n        else if ( record.value(\"sig\").toString().toLower() == \"pota\" && mySig.isEmpty() )\n            AdiFormat::exportContact(record, applTags);\n    }\n}\n\nAdiFormat *PotaAdiFormat::getActivatorParkFormatter(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    // https://docs.pota.app/docs/activator_reference/logging_made_easy.html#naming-your-files\n    // station_callsign@park#-yyyymmdd\n    const QString parkFileName = QString(\"%1@%2-%3.adif\")\n                                .arg(record.value(\"station_callsign\").toString(),\n                                     record.value(\"my_sig_info\").toString(),\n                                     currentDate.toString(\"yyyyMMdd-hhmm\"));\n\n    if ( parkFormatters.contains(parkFileName) )\n    {\n        qCDebug(runtime) << \"Using park file \" << parkFileName;\n        return parkFormatters[parkFileName]->formatter;\n    }\n\n    ParkFormatter *parkFormatter = new ParkFormatter();\n\n    parkFormatter->file = new QFile(exportDir + QDir::separator() + parkFileName);\n    if ( !parkFormatter->file->open(QFile::WriteOnly | QFile::Text) )\n    {\n        qCWarning(runtime) << \"Could not open POTA park file for writing \"\n                           << exportDir + QDir::separator() + parkFileName;\n        delete parkFormatter;\n        return nullptr;\n    }\n\n    parkFormatter->stream = new QTextStream(parkFormatter->file);\n    if ( !parkFormatter->stream )\n    {\n        qCWarning(runtime) << \"Cannot allocate QTextStream\";\n        delete parkFormatter;\n        return nullptr;\n    }\n\n    parkFormatter->formatter = new AdiFormat(*parkFormatter->stream);\n    if ( !parkFormatter->formatter )\n    {\n        qCWarning(runtime) << \"Cannot allocate AdifFormatter\";\n        delete parkFormatter;\n        return nullptr;\n    }\n\n    parkFormatters[parkFileName] = parkFormatter;\n    parkFormatter->formatter->exportStart();\n    return parkFormatter->formatter;\n}\n\nvoid PotaAdiFormat::expandParkRecord(QList<QSqlRecord> &inputList, const QString &columnName)\n{\n    FCT_IDENTIFICATION;\n\n    QList<QSqlRecord> expandedNewRecords;\n\n    // can contain multiple parks as a csv:\n    // <MY_POTA_REF:40>K-0817,K-4566,K-4576,K-4573,K-4578@US-WY\n\n    for ( auto it = inputList.cbegin(); it != inputList.cend(); it++ )\n    {\n        QStringList activatedParks = it->value(columnName).toString().split(\",\",\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                                                                              Qt::SplitBehaviorFlags::SkipEmptyParts);\n#else\n                                                                              QString::SkipEmptyParts);\n#endif\n        for ( QString &str : activatedParks )\n            str = str.trimmed();\n\n        if ( activatedParks.size() <= 1 )\n        {\n            expandedNewRecords.append(*it);\n            continue;\n        }\n\n        for ( const QString &parkID : static_cast<const QStringList&>(activatedParks) )\n        {\n            QSqlRecord newRecord(*it);\n            newRecord.setValue(columnName, parkID);\n            expandedNewRecords.append(newRecord);\n        }\n    }\n\n    inputList.swap(expandedNewRecords);\n}\n\nvoid PotaAdiFormat::exportEnd()\n{\n    FCT_IDENTIFICATION;\n\n    const QList<ParkFormatter*> &formatters = parkFormatters.values();\n\n    for ( ParkFormatter *parkFormat :  formatters)\n        parkFormat->formatter->exportEnd();\n}\n\nvoid PotaAdiFormat::moveFieldValue(QSqlRecord &record,\n                                   const QString &fromFieldName,\n                                   const QString &toFieldName)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlField dupped(record.field(fromFieldName));\n    record.remove(record.indexOf(fromFieldName));\n    record.remove(record.indexOf(toFieldName));\n    dupped.setName(toFieldName);\n    record.append(dupped);\n}\n\nbool PotaAdiFormat::isValidPotaRecord(const QSqlRecord &record) const\n{\n    FCT_IDENTIFICATION;\n\n    auto isPotaWithEmptyInfo = [](const QString &sig, const QString &info)\n    {\n        return sig == \"pota\" && info.isEmpty();\n    };\n\n    const QString &sigField = record.value(\"sig\").toString().toLower();\n    const QString &mysigField = record.value(\"my_sig\").toString().toLower();\n\n    return !record.value(\"my_pota_ref\").toString().isEmpty()\n           || !record.value(\"pota_ref\").toString().isEmpty()\n           || (sigField == \"pota\" && !isPotaWithEmptyInfo(sigField, record.value(\"sig_info\").toString()))\n           || (mysigField == \"pota\" && !isPotaWithEmptyInfo(mysigField, record.value(\"my_sig_info\").toString()));\n}\n\nvoid PotaAdiFormat::preparePotaField(QSqlRecord &record, const QString &fromField, const QString &toField, const QString &toFieldSig)\n{\n    FCT_IDENTIFICATION;\n\n    if (record.value(fromField).toString().isEmpty())\n        return;\n\n    moveFieldValue(record, fromField, toField);\n    record.setValue(toFieldSig, \"POTA\");\n\n}\n\nPotaAdiFormat::~PotaAdiFormat()\n{\n    FCT_IDENTIFICATION;\n\n    qDeleteAll(parkFormatters);\n    parkFormatters.clear();\n}\n"
  },
  {
    "path": "logformat/PotaAdiFormat.h",
    "content": "#ifndef QLOG_LOGFORMAT_POTALOGFORMAT_H\n#define QLOG_LOGFORMAT_POTALOGFORMAT_H\n#include \"AdiFormat.h\"\n\n/*\n * A specialized case of ADI export, where each activated park gets T'd into its\n * own file with some denormalization and values set to satisfy the pota.app\n * upload processes.\n */\nclass PotaAdiFormat : public AdiFormat\n{\npublic:\n    explicit PotaAdiFormat(QTextStream &stream);\n\n    virtual void exportContact(const QSqlRecord &,\n                               QMap<QString, QString> *applTags = nullptr) override;\n    virtual void exportEnd() override;\n\n    virtual bool importNext(QSqlRecord &) override { return false; }\n\n    void setExportDirectory(const QString &dir);\n    ~PotaAdiFormat();\n\nprivate:\n    QString exportDir;\n    QDateTime currentDate;\n\n    struct ParkFormatter\n    {\n        AdiFormat *formatter = nullptr;\n        QFile *file = nullptr;\n        QTextStream *stream = nullptr;\n\n        ~ParkFormatter()\n        {\n            if ( formatter ) delete formatter;\n            if ( stream ) delete stream;\n            if ( file ) delete file;\n        }\n    };\n\n    QHash<QString, ParkFormatter *> parkFormatters;\n\n    AdiFormat *getActivatorParkFormatter(const QSqlRecord &record);\n    void moveFieldValue(QSqlRecord &record,\n                        const QString &fromFieldName,\n                        const QString &toFieldName);\n    bool isValidPotaRecord(const QSqlRecord &record) const;\n    void preparePotaField(QSqlRecord &record, const QString &fromField,\n                          const QString &toField, const QString &toFieldSig);\n    void expandParkRecord(QList<QSqlRecord> &inputList, const QString &columnName);\n};\n\n#endif // QLOG_LOGFORMAT_POTALOGFORMAT_H\n"
  },
  {
    "path": "models/AlertTableModel.cpp",
    "content": "#include <QColor>\n#include <QSqlRecord>\n\n#include \"AlertTableModel.h\"\n#include \"data/Data.h\"\n#include \"rig/macros.h\"\n\n//-+ FREQ_MATCH_TOLERANCE MHz is OK when QLog evaluates the same spot freq\n#define FREQ_MATCH_TOLERANCE 0.005\n\nint AlertTableModel::rowCount(const QModelIndex&) const\n{\n    return alertList.count();\n}\n\nint AlertTableModel::columnCount(const QModelIndex&) const\n{\n    return 8;\n}\n\nQVariant AlertTableModel::data(const QModelIndex& index, int role) const\n{\n    const AlertTableRecord &selectedRecord = alertList.at(index.row());\n\n    if (role == Qt::DisplayRole)\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_RULENAME: return selectedRecord.ruleName.join(\",\");\n        case COLUMN_CALLSIGN: return selectedRecord.alert.spot.callsign;\n        case COLUMN_FREQ: return QSTRING_FREQ(selectedRecord.alert.spot.freq);\n        case COLUMN_MODE: return selectedRecord.alert.spot.modeGroupString;\n        case COLUMN_UPDATED: return selectedRecord.counter;\n        case COLUMN_LAST_UPDATE: return locale.toString(selectedRecord.alert.spot.dateTime,locale.formatTimeLongWithoutTZ());\n        case COLUMN_LAST_COMMENT: return selectedRecord.alert.spot.comment;\n        case COLUMN_MEMBER: return selectedRecord.alert.spot.memberList2StringList().join(\",\");\n        default: return QVariant();\n        }\n    }\n    else if ( index.column() == COLUMN_CALLSIGN && role == Qt::BackgroundRole )\n    {\n        return Data::statusToColor(selectedRecord.alert.spot.status, selectedRecord.alert.spot.dupeCount, QColor(Qt::transparent));\n    }\n    else if ( role == Qt::UserRole )\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_FREQ: return data(index, Qt::DisplayRole).toDouble(); break;\n        case COLUMN_UPDATED: return data(index, Qt::DisplayRole).toULongLong(); break;\n        case COLUMN_LAST_UPDATE: return selectedRecord.alert.spot.dateTime; break;\n        default: return data(index, Qt::DisplayRole);\n        }\n    }\n\n    return QVariant();\n}\n\nQVariant AlertTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch (section)\n    {\n    case COLUMN_RULENAME: return tr(\"Rule Name\");\n    case COLUMN_CALLSIGN: return tr(\"Callsign\");\n    case COLUMN_FREQ: return tr(\"Frequency\");\n    case COLUMN_MODE: return tr(\"Mode\");\n    case COLUMN_UPDATED: return tr(\"Updated\");\n    case COLUMN_LAST_UPDATE: return tr(\"Last Update\");\n    case COLUMN_LAST_COMMENT: return tr(\"Last Comment\");\n    case COLUMN_MEMBER: return tr(\"Member\");\n    default: return QVariant();\n    }\n}\n\nvoid AlertTableModel::addAlert(const SpotAlert &entry)\n{\n    AlertTableRecord newRecord(entry);\n\n    QMutexLocker locker(&alertListMutex);\n\n    int spotIndex = alertList.indexOf(newRecord);\n\n    if ( spotIndex >= 0)\n    {\n        /* QLog already contains the spot, update it */\n        alertList[spotIndex].counter++;\n        alertList[spotIndex].ruleName << entry.ruleNameList;\n        alertList[spotIndex].ruleName.removeDuplicates();\n        alertList[spotIndex].ruleName.sort();\n\n        // QLog have WSJTX record and Spot from DXC is processed.\n        // only change a limited number of fields to preserve the WSJTX Decode for an WSJTX application tuning\n        if ( entry.source == SpotAlert::DXSPOT\n             && alertList[spotIndex].alert.source == SpotAlert::WSJTXCQSPOT )\n        {\n            alertList[spotIndex].alert.spot.comment = entry.spot.comment;\n            alertList[spotIndex].alert.spot.spotter = entry.spot.spotter;\n            alertList[spotIndex].alert.spot.dxcc_spotter = entry.spot.dxcc_spotter;\n        }\n        else\n        {\n            alertList[spotIndex].alert = entry;\n        }\n        emit dataChanged(createIndex(spotIndex,0), createIndex(spotIndex,5));\n    }\n    else\n    {\n        /* New spot, insert it */\n        beginInsertRows(QModelIndex(), 0, 0);\n        alertList.prepend(newRecord);\n        endInsertRows();\n    }\n}\n\nvoid AlertTableModel::clear()\n{\n    QMutexLocker locker(&alertListMutex);\n    beginResetModel();\n    alertList.clear();\n    endResetModel();\n}\n\nconst AlertTableModel::AlertTableRecord AlertTableModel::getTableRecord(const QModelIndex &index)\n{\n    QMutexLocker locker(&alertListMutex);\n    return alertList.at(index.row());\n}\n\nvoid AlertTableModel::aging(const int clear_interval_sec)\n{\n    if ( clear_interval_sec <= 0 ) return;\n\n    QMutexLocker locker(&alertListMutex);\n\n    QMutableListIterator<AlertTableRecord> alertIterator(alertList);\n\n    beginResetModel();\n    while ( alertIterator.hasNext() )\n    {\n        alertIterator.next();\n        if ( alertIterator.value().alert.spot.dateTime.addSecs(clear_interval_sec) <= QDateTime::currentDateTimeUtc() )\n        {\n            alertIterator.remove();\n        }\n    }\n    endResetModel();\n}\n\nvoid AlertTableModel::resetDupe()\n{\n    QMutexLocker locker(&alertListMutex);\n\n    beginResetModel();\n    for ( AlertTableRecord &alert : alertList )\n        alert.alert.spot.dupeCount = 0;\n    endResetModel();\n}\n\nvoid AlertTableModel::recalculateDupe()\n{\n    QMutexLocker locker(&alertListMutex);\n\n    beginResetModel();\n    for ( AlertTableRecord &alertRecord : alertList )\n    {\n        SpotAlert &alert = alertRecord.alert;\n        alert.spot.dupeCount = Data::countDupe(alert.spot.callsign,\n                                               alert.spot.band,\n                                               alert.spot.modeGroupString);\n    }\n    endResetModel();\n}\n\nvoid AlertTableModel::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    qint32 dxcc = record.value(\"dxcc\").toInt();\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n    const QString &callsign = record.value(\"callsign\").toString();\n\n    QMutexLocker locker(&alertListMutex);\n\n    beginResetModel();\n    for ( AlertTableRecord &alertRecord : alertList )\n    {\n        SpotAlert &alert = alertRecord.alert;\n\n        alert.spot.status = Data::dxccNewStatusWhenQSOAdded(alert.spot.status,\n                                                            alert.spot.dxcc.dxcc,\n                                                            alert.spot.band,\n                                                            ( ( alert.spot.modeGroupString == BandPlan::MODE_GROUP_STRING_FTx ) ? BandPlan::MODE_GROUP_STRING_DIGITAL\n                                                                                                                                : dxccModeGroup ),\n                                                            dxcc,\n                                                            band,\n                                                            dxccModeGroup);\n        if ( alert.spot.callsign == callsign )\n            alert.spot.dupeCount = Data::dupeNewCountWhenQSOAdded(alert.spot.dupeCount,\n                                                                  alert.spot.band,\n                                                                  alert.spot.modeGroupString,\n                                                                  band,\n                                                                  dxccModeGroup);\n    }\n    endResetModel();\n}\n\nvoid AlertTableModel::updateSpotsStatusWhenQSOUpdated(const QSqlRecord &)\n{\n    QMutexLocker locker(&alertListMutex);\n\n    // at this point, we don't know if callsign has been changed or other field.\n    // TODO: DXCC status\n    // TODO: Dupe status update\n\n    // beginResetModel();\n    // for ( AlertTableRecord &alert : alertList )\n    // {\n    //     SpotAlert &spot = alert.alert;\n    //     spot.dupeCount = Data::countDupe(spot.callsign, spot.band, spot.modeGroupString);\n    // }\n    // endResetModel();\n}\n\nvoid AlertTableModel::updateSpotsStatusWhenQSODeleted(const QSqlRecord &record)\n{\n    // Pay attention: this method is called before the QSO is added to contacts\n    const QString &callsign = record.value(\"callsign\").toString();\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n\n    QMutexLocker locker(&alertListMutex);\n\n    for ( AlertTableRecord &alertRecord : alertList )\n    {\n        SpotAlert &alert = alertRecord.alert;\n\n        if ( alert.spot.dupeCount && alert.spot.callsign == callsign )\n            alert.spot.dupeCount = Data::dupeNewCountWhenQSODelected(alert.spot.dupeCount,\n                                                                     alert.spot.band,\n                                                                     alert.spot.modeGroupString,\n                                                                     band,\n                                                                     dxccModeGroup);\n    }\n}\n\nvoid AlertTableModel::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    if ( entities.isEmpty() )\n        return;\n\n    QMutexLocker locker(&alertListMutex);\n\n    beginResetModel();\n    for ( AlertTableRecord &alertRecord : alertList  )\n    {\n        SpotAlert &alert = alertRecord.alert;\n\n        if ( !entities.contains(alert.spot.dxcc.dxcc) )\n            continue;\n\n        alert.spot.status = Data::instance()->dxccStatus(alert.spot.dxcc.dxcc, alert.spot.band, alert.spot.modeGroupString);\n    }\n    endResetModel();\n}\n\nvoid AlertTableModel::recalculateDxccStatus()\n{\n    QMutexLocker locker(&alertListMutex);\n\n    beginResetModel();\n    for ( AlertTableRecord &alertRecord : alertList  )\n    {\n        SpotAlert &alert = alertRecord.alert;\n\n        alert.spot.status = Data::instance()->dxccStatus(alert.spot.dxcc.dxcc, alert.spot.band, alert.spot.modeGroupString);\n    }\n    endResetModel();\n}\n\nbool AlertTableModel::AlertTableRecord::operator==(const AlertTableRecord &spot) const\n{\n   return ( (spot.alert.spot.callsign == this->alert.spot.callsign)\n            && (spot.alert.spot.modeGroupString == this->alert.spot.modeGroupString)\n            && (qAbs(this->alert.spot.freq - spot.alert.spot.freq) <= FREQ_MATCH_TOLERANCE)\n            );\n}\n\nAlertTableModel::AlertTableRecord::AlertTableRecord(const SpotAlert &spotAlert) :\n\n    ruleName(spotAlert.ruleNameList),\n    counter(0),\n    alert(spotAlert)\n{\n}\n"
  },
  {
    "path": "models/AlertTableModel.h",
    "content": "#ifndef QLOG_MODELS_ALERTTABLEMODEL_H\n#define QLOG_MODELS_ALERTTABLEMODEL_H\n\n#include <QAbstractTableModel>\n#include <data/SpotAlert.h>\n#include <QMutex>\n#include \"core/LogLocale.h\"\n\nclass AlertTableModel : public QAbstractTableModel\n{\n    Q_OBJECT\n\n\npublic:\n\n    enum column_id\n    {\n        COLUMN_RULENAME = 0,\n        COLUMN_CALLSIGN = 1,\n        COLUMN_FREQ = 2,\n        COLUMN_MODE = 3,\n        COLUMN_UPDATED = 4,\n        COLUMN_LAST_UPDATE = 5,\n        COLUMN_LAST_COMMENT = 6,\n        COLUMN_MEMBER = 7,\n    };\n\n    struct AlertTableRecord\n    {\n        QStringList ruleName;\n        long long counter;\n        SpotAlert alert;\n\n        AlertTableRecord() : counter(0){};\n\n        bool operator==(const AlertTableRecord &) const;\n        explicit AlertTableRecord(const SpotAlert&);\n    };\n\n    AlertTableModel(QObject* parent = nullptr) : QAbstractTableModel(parent){};\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    void addAlert(const SpotAlert &entry);\n    void clear();\n    const AlertTableRecord getTableRecord(const QModelIndex& index);\n    void aging(const int clear_interval_sec);\n    void resetDupe();\n    void recalculateDupe();\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsStatusWhenQSOUpdated(const QSqlRecord &);\n    void updateSpotsStatusWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n    void recalculateDxccStatus();\n\nprivate:\n    LogLocale locale;\n    QList<AlertTableRecord> alertList;\n    QMutex alertListMutex;\n};\n\n#endif // QLOG_MODELS_ALERTTABLEMODEL_H\n"
  },
  {
    "path": "models/AwardsTableModel.cpp",
    "content": "#include \"AwardsTableModel.h\"\n#include <QColor>\n#include <QFont>\n\nAwardsTableModel::AwardsTableModel(QObject* parent) :\n    QSqlQueryModel(parent)\n{\n\n}\n\nQVariant AwardsTableModel::data(const QModelIndex &index, int role) const\n{\n    /* using hiden column 0 to identify type of information */\n    /* 0 - Total Worked/Confirmed row\n     * 1 - Confirmed row\n     * 2 - Worked row\n     * 3 - Per DXCC Entity row\n     */\n    int originRowType = QSqlQueryModel::data(this->index(index.row(), 0), Qt::DisplayRole).toInt();\n    QVariant originCellValue = QSqlQueryModel::data(index, Qt::DisplayRole);\n    int cellIntValue = originCellValue.toInt();\n\n    if ( role == Qt::DisplayRole\n         && (originRowType == 1 || originRowType == 2)\n         && index.column() == 2 )\n    {\n        unsigned int count = 0;\n        for ( int i = 3; i <= columnCount(); i++ )\n            count += QSqlQueryModel::data(this->index(index.row(), i),\n                                          Qt::DisplayRole).toInt();\n        return tr(\"Slots: \") + QString::number(count) + \"  \";\n    }\n\n    if ( index.column() >= 3 )\n    {\n        switch (role)\n        {\n        case Qt::BackgroundRole:\n            if ( originRowType >= 3 )\n            {\n                if ( cellIntValue > 1 )\n                    return QColor(Qt::green);\n                else if ( cellIntValue == 1 )\n                    return QColor(255, 165, 0);\n            }\n            break;\n\n        case Qt::ToolTipRole:\n            if ( originRowType >= 3 )\n            {\n                return ( cellIntValue > 1 ) ? tr(\"Confirmed\")\n                                            : (cellIntValue == 1) ? tr(\"Worked\")\n                                                                  : tr(\"Still Waiting\");\n            }\n            break;\n\n        case Qt::DisplayRole:\n            if ( originRowType >= 3 )\n                return QString();\n            break;\n\n        case Qt::ForegroundRole:\n            if ( originRowType >= 3 )\n                return QColor(Qt::transparent);\n            break;\n        }\n    }\n    else if ( role == Qt::FontRole && originRowType <= 2 )\n    {\n        QFont font;\n        font.setBold(true);\n        return font;\n    }\n\n    return QSqlQueryModel::data(index, role);\n}\n"
  },
  {
    "path": "models/AwardsTableModel.h",
    "content": "#ifndef QLOG_MODELS_AWARDSTABLEMODEL_H\n#define QLOG_MODELS_AWARDSTABLEMODEL_H\n\n#include <QAbstractTableModel>\n#include <QSqlTableModel>\n\nclass AwardsTableModel : public QSqlQueryModel\n{\n    Q_OBJECT\n\npublic:\n    explicit AwardsTableModel(QObject *parent = nullptr);\n\n    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;\n\nprivate:\n};\n\n#endif // QLOG_MODELS_AWARDSTABLEMODEL_H\n"
  },
  {
    "path": "models/DxccTableModel.cpp",
    "content": "#include <QColor>\n#include <QSize>\n#include <QFont>\n#include <QDebug>\n#include <QBrush>\n#include \"DxccTableModel.h\"\n#include \"data/Data.h\"\n#include \"core/LogParam.h\"\n\nDxccTableModel::DxccTableModel(QObject* parent) : QSqlQueryModel(parent) {}\n\nQVariant DxccTableModel::data(const QModelIndex &index, int role) const\n{\n\n    if ( index.column() == 0 )\n        return QSqlQueryModel::data(index, role);\n\n    switch ( role )\n    {\n    case  Qt::TextAlignmentRole:\n       return int(Qt::AlignCenter | Qt::AlignVCenter);\n    case  Qt::BackgroundRole:\n    {\n        const QString &currData = data(index, Qt::DisplayRole).toString();\n\n        bool containsL = currData.contains('L');\n        bool containsP = currData.contains('P');\n        bool containsE = currData.contains('e');\n\n        if ( (LogParam::getDxccConfirmedByLotwState() && containsL)\n             || (LogParam::getDxccConfirmedByPaperState() && containsP)\n             || (LogParam::getDxccConfirmedByEqslState() && containsE) )\n            return Data::statusToColor(DxccStatus::NewMode, false, Qt::green);\n\n        if ( containsL || containsP ||containsE || currData.contains(\"W\") )\n            return Data::statusToColor(DxccStatus::Worked, false, Qt::transparent);\n    }\n        break;\n\n    case Qt::DisplayRole:\n    {\n        const QString &currData = QSqlQueryModel::data(index, Qt::DisplayRole).toString();\n\n        if ( currData.isEmpty() || currData.size() < 3 )\n            return QString();\n\n        if ( currData == \"111\" ) return QString(\"W\");\n\n        QString ret;\n\n        if ( currData[0] == '2' ) ret.append(\"e\");\n        if ( currData[1] == '2' ) ret.append(\"L\");\n        if ( currData[2] == '2' ) ret.append(\"P\");\n\n        return ret;\n    }\n\n    case Qt::ToolTipRole:\n    {\n        const QString &currData = data(index, Qt::DisplayRole).toString();\n        QStringList ret;\n\n        if ( currData.contains(\"W\") ) ret.append(tr(\"Worked\"));\n        if ( currData.contains(\"e\") ) ret.append(tr(\"eQSL\"));\n        if ( currData.contains(\"L\") ) ret.append(tr(\"LoTW\"));\n        if ( currData.contains(\"P\") ) ret.append(tr(\"Paper\"));\n\n        return ret.join(\", \");\n    }\n    }\n\n    return QSqlQueryModel::data(index, role);\n}\n"
  },
  {
    "path": "models/DxccTableModel.h",
    "content": "#ifndef QLOG_MODELS_DXCCTABLEMODEL_H\n#define QLOG_MODELS_DXCCTABLEMODEL_H\n\n#include <QObject>\n#include <QSqlTableModel>\n\nclass DxccTableModel : public QSqlQueryModel\n{\npublic:\n    explicit DxccTableModel(QObject* parent = nullptr);\n\n    QVariant data(const QModelIndex &, int role = Qt::DisplayRole) const;\n};\n\n#endif // QLOG_MODELS_DXCCTABLEMODEL_H\n"
  },
  {
    "path": "models/LogbookModel.cpp",
    "content": "#include \"LogbookModel.h\"\n#include \"data/Data.h\"\n#include \"data/Dxcc.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/Callsign.h\"\n#include \"data/BandPlan.h\"\n\n#include <QIcon>\n\nLogbookModel::LogbookModel(QObject* parent, QSqlDatabase db)\n        : QSqlTableModel(parent, db)\n{\n    setTable(\"contacts\");\n    setEditStrategy(QSqlTableModel::OnFieldChange);\n    setSort(COLUMN_TIME_ON, Qt::DescendingOrder);\n\n    for (auto it = fieldNameTranslationMap.begin(); it != fieldNameTranslationMap.end(); ++it)\n        setHeaderData(it.key(), Qt::Horizontal, getFieldNameTranslation(it.key()));\n}\n\nQVariant LogbookModel::data(const QModelIndex &index, int role) const\n{\n    if (!index.isValid())\n        return QVariant();\n\n    if (role == Qt::DecorationRole && index.column() == COLUMN_CALL) {\n        const QString &flag = Data::instance()->dxccFlag(QSqlTableModel::data(this->index(index.row(), COLUMN_DXCC), Qt::DisplayRole).toInt());\n\n        return ( !flag.isEmpty() ) ? QIcon(QString(\":/flags/16/%1.png\").arg(flag))\n                                   : QIcon(\":/flags/16/unknown.png\");\n    }\n\n    if (role == Qt::DecorationRole && (index.column() == COLUMN_QSL_RCVD || index.column() == COLUMN_QSL_SENT ||\n                                       index.column() == COLUMN_LOTW_RCVD || index.column() == COLUMN_LOTW_SENT ||\n                                       index.column() == COLUMN_EQSL_QSL_RCVD || index.column() == COLUMN_EQSL_QSL_SENT ||\n                                       index.column() == COLUMN_DCL_QSL_RCVD || index.column() == COLUMN_DCL_QSL_SENT ))\n    {\n        QVariant value = QSqlTableModel::data(index, Qt::DisplayRole);\n        if (value.toString() == \"Y\") {\n            return QIcon(\":/icons/done-24px.svg\");\n        }\n//        else {\n//            return QIcon(\":/icons/close-24px.svg\");\n//        }\n    }\n\n    if ( role == Qt::ToolTipRole && index.column() == COLUMN_CALL )\n    {\n        QString flag = Data::instance()->dxccFlag(QSqlTableModel::data(this->index(index.row(), COLUMN_DXCC), Qt::DisplayRole).toInt());\n\n        return QString(\"<img src=':/flags/64/%1.png'>\").arg(flag) +\n               \"<h2>\" + QSqlTableModel::data(index, Qt::DisplayRole).toString() + \"</h2>   \" +\n               \"<table>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"Country\") + \": </b></td>\" +\n                \"   <td>\" + QCoreApplication::translate(\"DBStrings\", QSqlTableModel::data(this->index(index.row(), COLUMN_COUNTRY), Qt::DisplayRole).toString().toUtf8().constData()) + \"</td>\" +\n                \" </tr>\" +\n               \" <tr>\" +\n               \"   <td><b>\" + tr(\"Band\") + \": </b></td>\" +\n               \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_BAND), Qt::DisplayRole).toString() + \"</td>\" +\n               \" </tr>\" +\n               \" <tr>\" +\n                \"   <td><b>\" + tr(\"Mode\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_MODE), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"RST Sent\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_RST_SENT), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"RST Rcvd\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_RST_RCVD), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"Gridsquare\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_GRID), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"QSL Message\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_QSLMSG), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"Comment\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_COMMENT_INTL), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n                \" <tr>\" +\n                \"   <td><b>\" + tr(\"Notes\") + \": </b></td>\" +\n                \"   <td>\" + QSqlTableModel::data(this->index(index.row(), COLUMN_NOTES_INTL), Qt::DisplayRole).toString() + \"</td>\" +\n                \" </tr>\" +\n               \"</table>\" +\n               \"<br>\" +\n               \"<table>\" +\n               \"  <tr> \" +\n               \"  <th></th><th>\" + tr(\"Paper\") + \"</th><th>\" + tr(\"LoTW\") +\"</th><th>\" + tr(\"eQSL\") +\"</th>\" +\n               \"  </tr>\" +\n               \"  <tr> \" +\n               \"  <td><b>\" + tr(\"QSL Received\") + \"</b></td>\" +\n               QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                           COLUMN_QSL_RCVD),\n                                                                                               Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n               QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                           COLUMN_LOTW_RCVD),\n                                                                                               Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n               QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                           COLUMN_EQSL_QSL_RCVD),\n                                                                                               Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n                \"  </tr> \" +\n                \"  <tr> \" +\n                \"  <td><b>\" + tr(\"QSL Sent\") + \"</b></td>\" +\n                QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                            COLUMN_QSL_SENT),\n                                                                                                Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n                QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                            COLUMN_LOTW_SENT),\n                                                                                                Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n                QString(\"  <td><img src=':/icons/%1-24px.svg'></td>\").arg((QSqlTableModel::data(this->index(index.row(),\n                                                                                                            COLUMN_EQSL_QSL_SENT),\n                                                                                                Qt::DisplayRole).toString() == \"Y\") ? \"done\" : \"close\") +\n                \"  </tr> \" +\n               \"</table>\";\n    }\n    else if ( role == Qt::ToolTipRole && (index.column() == COLUMN_FIELDS\n                                          || index.column() == COLUMN_NOTES\n                                          || index.column() == COLUMN_NOTES_INTL) )\n    {\n        return QSqlTableModel::data(index, Qt::DisplayRole);\n    }\n    else if ( role == Qt::DisplayRole && (index.column() == COLUMN_COUNTRY_INTL\n                                          || index.column() == COLUMN_MY_COUNTRY_INTL) )\n    {\n        return QCoreApplication::translate(\"DBStrings\", QSqlTableModel::data(index, Qt::DisplayRole).toString().toUtf8().constData());\n    }\n\n    return QSqlTableModel::data(index, role);\n}\n\nbool LogbookModel::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    bool main_update_result = true;\n    bool depend_update_result = true;\n\n    if ( role == Qt::EditRole )\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_TIME_ON:\n        {\n            QDateTime time_on = QSqlTableModel::data(this->index(index.row(), COLUMN_TIME_ON), Qt::DisplayRole).toDateTime();\n            QDateTime time_off = QSqlTableModel::data(this->index(index.row(), COLUMN_TIME_OFF), Qt::DisplayRole).toDateTime();\n            qint64 diff = time_on.secsTo(time_off);\n\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_TIME_OFF), QVariant(value.toDateTime().addSecs(diff)), role);\n\n            break;\n        }\n\n        case COLUMN_TIME_OFF:\n        {\n            QDateTime time_on = QSqlTableModel::data(this->index(index.row(), COLUMN_TIME_ON), Qt::DisplayRole).toDateTime();\n\n            if ( value.toDateTime() < time_on )\n            {\n                depend_update_result = false;\n            }\n            break;\n        }\n\n        case COLUMN_CALL:\n        {\n            QString new_callsign = value.toString();\n            DxccEntity dxccEntity = Data::instance()->lookupDxcc(new_callsign);\n            if ( dxccEntity.dxcc )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COUNTRY), QVariant(dxccEntity.country),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_CQZ), QVariant(dxccEntity.cqz),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_ITUZ), QVariant(dxccEntity.ituz),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_DXCC), QVariant(dxccEntity.dxcc),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_CONTINENT), QVariant(dxccEntity.cont),role);\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COUNTRY), QVariant(QString()),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_CQZ), QVariant(QString()),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_ITUZ), QVariant(QString()),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_DXCC), QVariant(QString()),role);\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_CONTINENT), QVariant(QString()),role);\n            }\n\n            const QString &pfxRef = Callsign(new_callsign).getWPXPrefix();\n\n            if ( !pfxRef.isEmpty() )\n            {\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_PREFIX), QVariant(pfxRef), role);\n            }\n            break;\n        }\n\n        case COLUMN_FREQUENCY:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_BAND), QVariant(BandPlan::freq2Band(value.toDouble()).name), role );\n            break;\n        }\n\n        case COLUMN_BAND:\n        {\n            double freq = QSqlTableModel::data(this->index(index.row(), COLUMN_FREQUENCY), Qt::DisplayRole).toDouble();\n            depend_update_result = ( freq == 0.0 && !value.toString().isEmpty() );\n            break;\n        }\n\n        case COLUMN_FREQ_RX:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_BAND_RX), QVariant(BandPlan::freq2Band(value.toDouble()).name), role );\n            break;\n        }\n\n        case COLUMN_BAND_RX:\n        {\n            double freq = QSqlTableModel::data(this->index(index.row(), COLUMN_FREQ_RX), Qt::DisplayRole).toDouble();\n            depend_update_result = ( freq == 0.0 && !value.toString().isEmpty() );\n            break;\n        }\n\n        case COLUMN_GRID:\n        {\n            if ( ! value.toString().isEmpty() )\n            {\n                Gridsquare newgrid(value.toString());\n\n                if ( newgrid.isValid() )\n                {\n                    Gridsquare mygrid(QSqlTableModel::data(this->index(index.row(), COLUMN_MY_GRIDSQUARE), Qt::DisplayRole).toString());\n                    double distance;\n\n                    if ( mygrid.distanceTo(newgrid, distance) )\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(distance),role);\n                    }\n                    else\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role);\n                    }\n                }\n                else\n                {\n                    /* do not update field with invalid Grid */\n                    depend_update_result = false;\n                }\n            }\n            else\n            {\n                /* empty grid is valid (when removing a value); need to remove also Distance */\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role);\n            }\n            break;\n        }\n\n        case COLUMN_MY_GRIDSQUARE:\n        {\n            if ( ! value.toString().isEmpty() )\n            {\n                Gridsquare mynewGrid(value.toString());\n\n                if ( mynewGrid.isValid() )\n                {\n                    Gridsquare dxgrid(QSqlTableModel::data(this->index(index.row(), COLUMN_GRID), Qt::DisplayRole).toString());\n                    double distance;\n\n                    if ( mynewGrid.distanceTo(dxgrid, distance) )\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(distance),role);\n                    }\n                    else\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role);\n                    }\n                }\n                else\n                {\n                    /* do not update field with invalid Grid */\n                    depend_update_result = false;\n                }\n            }\n            else\n            {\n                /* empty grid is valid (when removing a value); need to remove also Distance */\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role);\n            }\n            break;\n        }\n\n        case COLUMN_GRID_EXT:\n        case COLUMN_MY_GRIDSQUARE_EXT:\n        {\n            if ( ! value.toString().isEmpty() )\n            {\n                QRegularExpressionMatch match = Gridsquare::gridExtRegEx().match(value.toString());\n\n                if ( match.hasMatch() )\n                {\n                    depend_update_result = true;\n                }\n                else\n                {\n                    /* grid has an incorrect format */\n                    depend_update_result = false;\n                }\n            }\n            else\n            {\n                /* empty grid is valid (when removing a value) */\n                depend_update_result = true;\n            }\n            break;\n        }\n\n        case COLUMN_SAT_MODE:\n        case COLUMN_SAT_NAME:\n        {\n            if ( !value.toString().isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_PROP_MODE), \"SAT\");\n            }\n            break;\n        }\n\n        case COLUMN_PROP_MODE:\n        {\n            QString sat_mode = QSqlTableModel::data(this->index(index.row(), COLUMN_SAT_MODE), Qt::DisplayRole).toString();\n            QString sat_name = QSqlTableModel::data(this->index(index.row(), COLUMN_SAT_NAME), Qt::DisplayRole).toString();\n\n            /* If sat name or mode is not empty then do not allow to change propmode from SAT to any */\n            if ( !sat_name.isEmpty() || !sat_mode.isEmpty() )\n            {\n                depend_update_result = false;\n            }\n\n            break;\n        }\n\n        case COLUMN_ID: /* it is the primary key, do not update */\n        case COLUMN_COUNTRY:  /* it is a computed value, do not update */\n        case COLUMN_DISTANCE: /* it is a computed value, do not update */\n        case COLUMN_MY_COUNTRY:\n        {\n            /* Do not allow to edit them */\n            depend_update_result = false;\n            break;\n        }\n\n        case COLUMN_ADDRESS_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ADDRESS), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_COMMENT_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COMMENT), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_COUNTRY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COUNTRY), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_ANTENNA_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ANTENNA), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_CITY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_CITY), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_COUNTRY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_NAME_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_NAME), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_POSTAL_CODE_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_POSTAL_CODE), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_RIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_RIG), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_SIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_SIG), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_SIG_INFO_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_SIG_INFO), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_MY_STREET_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_STREET), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_NAME_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_NAME), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_NOTES_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_NOTES), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_QSLMSG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_QSLMSG), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_QTH_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_QTH), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_RIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_RIG), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_SIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_SIG), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_SIG_INFO_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_SIG_INFO), Data::removeAccents(value.toString()),role);\n            break;\n        }\n\n        case COLUMN_SOTA_REF:\n        {\n            SOTAEntity sotaInfo = Data::instance()->lookupSOTA(value.toString());\n            if ( sotaInfo.summitCode.toUpper() == value.toString().toUpper()\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ALTITUDE), sotaInfo.altm, role); // clazy:exclude=skipped-base-method\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ALTITUDE), QVariant(), role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        case COLUMN_MY_SOTA_REF:\n        {\n            SOTAEntity sotaInfo = Data::instance()->lookupSOTA(value.toString());\n            if ( sotaInfo.summitCode.toUpper() == value.toString().toUpper()\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ALTITUDE), sotaInfo.altm, role); // clazy:exclude=skipped-base-method\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ALTITUDE), QVariant(), role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n        case COLUMN_STATION_CALLSIGN:\n        {\n            DxccEntity dxccEntity = Data::instance()->lookupDxcc(value.toString().toUpper());\n\n            if ( dxccEntity.dxcc )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_DXCC), dxccEntity.dxcc, role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ITU_ZONE), dxccEntity.ituz, role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_CQ_ZONE), dxccEntity.cqz, role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY_INTL), dxccEntity.country, role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY), Data::removeAccents(dxccEntity.country), role); // clazy:exclude=skipped-base-method\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY), QVariant(QString()),role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_CQ_ZONE), QVariant(QString()),role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ITU_ZONE), QVariant(QString()),role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_DXCC), QVariant(QString()),role); // clazy:exclude=skipped-base-method\n                depend_update_result = depend_update_result && QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY_INTL), QVariant(QString()),role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        }\n\n        //updateExternalServicesUploadStatus(index, role, depend_update_result);\n\n        if ( depend_update_result )\n        {\n            switch ( index.column() )\n            {\n            case COLUMN_FREQUENCY:\n            case COLUMN_FREQ_RX:\n            case COLUMN_TX_POWER:\n                /* store NULL when 0.0MHz */\n                main_update_result = QSqlTableModel::setData(index, ( value.toDouble() == 0.0 ) ? QVariant()\n                                                                                                : value, role); // clazy:exclude=skipped-base-method\n                break;\n\n            case COLUMN_SOTA_REF:\n            case COLUMN_MY_SOTA_REF:\n            case COLUMN_IOTA:\n            case COLUMN_MY_IOTA:\n            case COLUMN_MY_GRIDSQUARE:\n            case COLUMN_CALL:\n            case COLUMN_GRID:\n            case COLUMN_VUCC_GRIDS:\n            case COLUMN_MY_VUCC_GRIDS:\n            case COLUMN_MY_ARRL_SECT:\n            case COLUMN_MY_WWFF_REF:\n            case COLUMN_WWFF_REF:\n            case COLUMN_MY_POTA_REF:\n            case COLUMN_POTA_REF:\n            case COLUMN_MY_GRIDSQUARE_EXT:\n            case COLUMN_GRID_EXT:\n            case COLUMN_STATION_CALLSIGN:\n                main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? value.toString().toUpper()\n                                                                                                    : QVariant(), role);\n                break;\n\n            case COLUMN_ADDRESS_INTL:\n            case COLUMN_COMMENT_INTL:\n            case COLUMN_COUNTRY_INTL:\n            case COLUMN_MY_ANTENNA_INTL:\n            case COLUMN_MY_CITY_INTL:\n            case COLUMN_MY_COUNTRY_INTL:\n            case COLUMN_MY_NAME_INTL:\n            case COLUMN_MY_POSTAL_CODE_INTL:\n            case COLUMN_MY_RIG_INTL:\n            case COLUMN_MY_SIG_INTL:\n            case COLUMN_MY_SIG_INFO_INTL:\n            case COLUMN_MY_STREET_INTL:\n            case COLUMN_NAME_INTL:\n            case COLUMN_NOTES_INTL:\n            case COLUMN_QSLMSG_INTL:\n            case COLUMN_QTH_INTL:\n            case COLUMN_RIG_INTL:\n            case COLUMN_SIG_INTL:\n            case COLUMN_SIG_INFO_INTL:\n                main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? value\n                                                                                                    : QVariant(), role);\n                break;\n\n            default:\n                main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? Data::removeAccents(value.toString())\n                                                                                                    : QVariant(), role);\n            }\n        }\n    }\n\n    return main_update_result && depend_update_result;\n}\n\nQMap<LogbookModel::ColumnID, QString> LogbookModel::fieldNameTranslationMap =\n{\n    {COLUMN_ID, QT_TR_NOOP(\"QSO ID\")},\n    {COLUMN_TIME_ON, QT_TR_NOOP(\"Time on\")},\n    {COLUMN_TIME_OFF, QT_TR_NOOP(\"Time off\")},\n    {COLUMN_CALL, QT_TR_NOOP(\"Call\")},\n    {COLUMN_RST_SENT, QT_TR_NOOP(\"RSTs\")},\n    {COLUMN_RST_RCVD, QT_TR_NOOP(\"RSTr\")},\n    {COLUMN_FREQUENCY, QT_TR_NOOP(\"Frequency\")},\n    {COLUMN_BAND, QT_TR_NOOP(\"Band\")},\n    {COLUMN_MODE, QT_TR_NOOP(\"Mode\")},\n    {COLUMN_SUBMODE, QT_TR_NOOP(\"Submode\")},\n    {COLUMN_NAME, QT_TR_NOOP(\"Name (ASCII)\")},\n    {COLUMN_QTH, QT_TR_NOOP(\"QTH (ASCII)\")},\n    {COLUMN_GRID, QT_TR_NOOP(\"Gridsquare\")},\n    {COLUMN_DXCC, QT_TR_NOOP(\"DXCC\")},\n    {COLUMN_COUNTRY, QT_TR_NOOP(\"Country (ASCII)\")},\n    {COLUMN_CONTINENT, QT_TR_NOOP(\"Continent\")},\n    {COLUMN_CQZ, QT_TR_NOOP(\"CQZ\")},\n    {COLUMN_ITUZ, QT_TR_NOOP(\"ITU\")},\n    {COLUMN_PREFIX, QT_TR_NOOP(\"Prefix\")},\n    {COLUMN_STATE, QT_TR_NOOP(\"State\")},\n    {COLUMN_COUNTY, QT_TR_NOOP(\"County\")},\n    {COLUMN_CNTY_ALT, QT_TR_NOOP(\"County Alt\")},\n    {COLUMN_IOTA, QT_TR_NOOP(\"IOTA\")},\n    {COLUMN_QSL_RCVD, QT_TR_NOOP(\"QSLr\")},\n    {COLUMN_QSL_RCVD_DATE, QT_TR_NOOP(\"QSLr Date\")},\n    {COLUMN_QSL_SENT, QT_TR_NOOP(\"QSLs\")},\n    {COLUMN_QSL_SENT_DATE, QT_TR_NOOP(\"QSLs Date\")},\n    {COLUMN_LOTW_RCVD, QT_TR_NOOP(\"LoTWr\")},\n    {COLUMN_LOTW_RCVD_DATE, QT_TR_NOOP(\"LoTWr Date\")},\n    {COLUMN_LOTW_SENT, QT_TR_NOOP(\"LoTWs\")},\n    {COLUMN_LOTW_SENT_DATE, QT_TR_NOOP(\"LoTWs Date\")},\n    {COLUMN_TX_POWER, QT_TR_NOOP(\"TX PWR\")},\n    {COLUMN_FIELDS, QT_TR_NOOP(\"Additional Fields\")},\n    {COLUMN_ADDRESS, QT_TR_NOOP(\"Address (ASCII)\")},\n    {COLUMN_ADDRESS_INTL, QT_TR_NOOP(\"Address\")},\n    {COLUMN_AGE, QT_TR_NOOP(\"Age\")},\n    {COLUMN_ALTITUDE, QT_TR_NOOP(\"Altitude\")},\n    {COLUMN_A_INDEX, QT_TR_NOOP(\"A-Index\")},\n    {COLUMN_ANT_AZ, QT_TR_NOOP(\"Antenna Az\")},\n    {COLUMN_ANT_EL, QT_TR_NOOP(\"Antenna El\")},\n    {COLUMN_ANT_PATH, QT_TR_NOOP(\"Signal Path\")},\n    {COLUMN_ARRL_SECT, QT_TR_NOOP(\"ARRL Section\")},\n    {COLUMN_AWARD_SUBMITTED, QT_TR_NOOP(\"Award Submitted\")},\n    {COLUMN_AWARD_GRANTED, QT_TR_NOOP(\"Award Granted\")},\n    {COLUMN_BAND_RX, QT_TR_NOOP(\"Band RX\")},\n    {COLUMN_GRID_EXT, QT_TR_NOOP(\"Gridsquare Extended\")},\n    {COLUMN_CHECK, QT_TR_NOOP(\"Contest Check\")},\n    {COLUMN_CLASS, QT_TR_NOOP(\"Class\")},\n    {COLUMN_CLUBLOG_QSO_UPLOAD_DATE, QT_TR_NOOP(\"ClubLog Upload Date\")},\n    {COLUMN_CLUBLOG_QSO_UPLOAD_STATUS, QT_TR_NOOP(\"ClubLog Upload State\")},\n    {COLUMN_COMMENT, QT_TR_NOOP(\"Comment (ASCII)\")},\n    {COLUMN_COMMENT_INTL, QT_TR_NOOP(\"Comment\")},\n    {COLUMN_CONTACTED_OP, QT_TR_NOOP(\"Contacted Operator\")},\n    {COLUMN_CONTEST_ID, QT_TR_NOOP(\"Contest ID\")},\n    {COLUMN_COUNTRY_INTL, QT_TR_NOOP(\"Country\")},\n    {COLUMN_CREDIT_SUBMITTED, QT_TR_NOOP(\"Credit Submitted\")},\n    {COLUMN_CREDIT_GRANTED, QT_TR_NOOP(\"Credit Granted\")},\n    {COLUMN_DARC_DOK, QT_TR_NOOP(\"DOK\")},\n    {COLUMN_DCL_QSLRDATE, QT_TR_NOOP(\"DCLr Date\")},\n    {COLUMN_DCL_QSLSDATE, QT_TR_NOOP(\"DCLs Date\")},\n    {COLUMN_DCL_QSL_RCVD, QT_TR_NOOP(\"DCLr\")},\n    {COLUMN_DCL_QSL_SENT, QT_TR_NOOP(\"DCLs\")},\n    {COLUMN_DISTANCE, QT_TR_NOOP(\"Distance\")},\n    {COLUMN_EMAIL, QT_TR_NOOP(\"Email\")},\n    {COLUMN_EQ_CALL, QT_TR_NOOP(\"Owner Callsign\")},\n    {COLUMN_EQSL_AG, QT_TR_NOOP(\"eQSL AG\")},\n    {COLUMN_EQSL_QSLRDATE, QT_TR_NOOP(\"eQSLr Date\")},\n    {COLUMN_EQSL_QSLSDATE, QT_TR_NOOP(\"eQSLs Date\")},\n    {COLUMN_EQSL_QSL_RCVD, QT_TR_NOOP(\"eQSLr\")},\n    {COLUMN_EQSL_QSL_SENT, QT_TR_NOOP(\"eQSLs\")},\n    {COLUMN_FISTS, QT_TR_NOOP(\"FISTS Number\")},\n    {COLUMN_FISTS_CC, QT_TR_NOOP(\"FISTS CC\")},\n    {COLUMN_FORCE_INIT, QT_TR_NOOP(\"EME Init\")},\n    {COLUMN_FREQ_RX, QT_TR_NOOP(\"Frequency RX\")},\n    {COLUMN_GUEST_OP, QT_TR_NOOP(\"Guest Operator\")},\n    {COLUMN_HAMLOGEU_QSO_UPLOAD_DATE, QT_TR_NOOP(\"HamlogEU Upload Date\")},\n    {COLUMN_HAMLOGEU_QSO_UPLOAD_STATUS, QT_TR_NOOP(\"HamlogEU Upload Status\")},\n    {COLUMN_HAMQTH_QSO_UPLOAD_DATE, QT_TR_NOOP(\"HamQTH Upload Date\")},\n    {COLUMN_HAMQTH_QSO_UPLOAD_STATUS, QT_TR_NOOP(\"HamQTH Upload Status\")},\n    {COLUMN_HRDLOG_QSO_UPLOAD_DATE, QT_TR_NOOP(\"HRDLog Upload Date\")},\n    {COLUMN_HRDLOG_QSO_UPLOAD_STATUS, QT_TR_NOOP(\"HRDLog Upload Status\")},\n    {COLUMN_IOTA_ISLAND_ID, QT_TR_NOOP(\"IOTA Island ID\")},\n    {COLUMN_K_INDEX, QT_TR_NOOP(\"K-Index\")},\n    {COLUMN_LAT, QT_TR_NOOP(\"Latitude\")},\n    {COLUMN_LON, QT_TR_NOOP(\"Longitude\")},\n    {COLUMN_MAX_BURSTS, QT_TR_NOOP(\"Max Bursts\")},\n    {COLUMN_MORSE_KEY_INFO, QT_TR_NOOP(\"CW Key Info\")},\n    {COLUMN_MORSE_KEY_TYPE, QT_TR_NOOP(\"CW Key Type\")},\n    {COLUMN_MS_SHOWER, QT_TR_NOOP(\"MS Shower Name\")},\n    {COLUMN_MY_ALTITUDE, QT_TR_NOOP(\"My Altitude\")},\n    {COLUMN_MY_ANTENNA, QT_TR_NOOP(\"My Antenna (ASCII)\")},\n    {COLUMN_MY_ANTENNA_INTL, QT_TR_NOOP(\"My Antenna\")},\n    {COLUMN_MY_CITY, QT_TR_NOOP(\"My City (ASCII)\")},\n    {COLUMN_MY_CITY_INTL, QT_TR_NOOP(\"My City\")},\n    {COLUMN_MY_CNTY, QT_TR_NOOP(\"My County\")},\n    {COLUMN_MY_CNTY_ALT, QT_TR_NOOP(\"My County Alt\")},\n    {COLUMN_MY_COUNTRY, QT_TR_NOOP(\"My Country (ASCII)\")},\n    {COLUMN_MY_COUNTRY_INTL, QT_TR_NOOP(\"My Country\")},\n    {COLUMN_MY_CQ_ZONE, QT_TR_NOOP(\"My CQZ\")},\n    {COLUMN_MY_DARC_DOK, QT_TR_NOOP(\"My DARC DOK\")},\n    {COLUMN_MY_DXCC, QT_TR_NOOP(\"My DXCC\")},\n    {COLUMN_MY_FISTS, QT_TR_NOOP(\"My FISTS\")},\n    {COLUMN_MY_GRIDSQUARE, QT_TR_NOOP(\"My Gridsquare\")},\n    {COLUMN_MY_GRIDSQUARE_EXT, QT_TR_NOOP(\"My Gridsquare Extended\")},\n    {COLUMN_MY_IOTA, QT_TR_NOOP(\"My IOTA\")},\n    {COLUMN_MY_IOTA_ISLAND_ID, QT_TR_NOOP(\"My IOTA Island ID\")},\n    {COLUMN_MY_ITU_ZONE, QT_TR_NOOP(\"My ITU\")},\n    {COLUMN_MY_LAT, QT_TR_NOOP(\"My Latitude\")},\n    {COLUMN_MY_LON, QT_TR_NOOP(\"My Longitude\")},\n    {COLUMN_MY_MORSE_KEY_INFO, QT_TR_NOOP(\"My CW Key Info\")},\n    {COLUMN_MY_MORSE_KEY_TYPE, QT_TR_NOOP(\"My CW Key Type\")},\n    {COLUMN_MY_NAME, QT_TR_NOOP(\"My Name (ASCII)\")},\n    {COLUMN_MY_NAME_INTL, QT_TR_NOOP(\"My Name\")},\n    {COLUMN_MY_POSTAL_CODE, QT_TR_NOOP(\"My Postal Code (ASCII)\")},\n    {COLUMN_MY_POSTAL_CODE_INTL, QT_TR_NOOP(\"My Postal Code\")},\n    {COLUMN_MY_POTA_REF, QT_TR_NOOP(\"My POTA Ref\")},\n    {COLUMN_MY_RIG, QT_TR_NOOP(\"My Rig (ASCII)\")},\n    {COLUMN_MY_RIG_INTL, QT_TR_NOOP(\"My Rig\")},\n    {COLUMN_MY_SIG, QT_TR_NOOP(\"My Special Interest Activity (ASCII)\")},\n    {COLUMN_MY_SIG_INTL, QT_TR_NOOP(\"My Special Interest Activity\")},\n    {COLUMN_MY_SIG_INFO, QT_TR_NOOP(\"My Spec. Interes Activity Info (ASCII)\")},\n    {COLUMN_MY_SIG_INFO_INTL, QT_TR_NOOP(\"My Spec. Interest Activity Info\")},\n    {COLUMN_MY_SOTA_REF, QT_TR_NOOP(\"My SOTA\")},\n    {COLUMN_MY_STATE, QT_TR_NOOP(\"My State\")},\n    {COLUMN_MY_STREET, QT_TR_NOOP(\"My Street\")},\n    {COLUMN_MY_STREET_INTL, QT_TR_NOOP(\"My Street\")},\n    {COLUMN_MY_USACA_COUNTIES, QT_TR_NOOP(\"My USA-CA Counties\")},\n    {COLUMN_MY_VUCC_GRIDS, QT_TR_NOOP(\"My VUCC Grids\")},\n    {COLUMN_NAME_INTL, QT_TR_NOOP(\"Name\")},\n    {COLUMN_NOTES, QT_TR_NOOP(\"Notes (ASCII)\")},\n    {COLUMN_NOTES_INTL, QT_TR_NOOP(\"Notes\")},\n    {COLUMN_NR_BURSTS, QT_TR_NOOP(\"#MS Bursts\")},\n    {COLUMN_NR_PINGS, QT_TR_NOOP(\"#MS Pings\")},\n    {COLUMN_OPERATOR, QT_TR_NOOP(\"Operator Callsign\")},\n    {COLUMN_OWNER_CALLSIGN, QT_TR_NOOP(\"Owner Callsign\")},\n    {COLUMN_POTA_REF, QT_TR_NOOP(\"POTA\")},\n    {COLUMN_PRECEDENCE, QT_TR_NOOP(\"Contest Precedence\")},\n    {COLUMN_PROP_MODE, QT_TR_NOOP(\"Propagation Mode\")},\n    {COLUMN_PUBLIC_KEY, QT_TR_NOOP(\"Public Encryption Key\")},\n    {COLUMN_QRZCOM_QSO_DOWNLOAD_DATE, QT_TR_NOOP(\"QRZ Download Date\")},\n    {COLUMN_QRZCOM_QSO_DOWNLOAD_STATUS, QT_TR_NOOP(\"QRZ Download Status\")},\n    {COLUMN_QRZCOM_QSO_UPLOAD_DATE, QT_TR_NOOP(\"QRZ Upload Date\")},\n    {COLUMN_QRZCOM_QSO_UPLOAD_STATUS, QT_TR_NOOP(\"QRZ Upload Status\")},\n    {COLUMN_QSLMSG, QT_TR_NOOP(\"QSLs Message (ASCII)\")},\n    {COLUMN_QSLMSG_INTL, QT_TR_NOOP(\"QSLs Message\")},\n    {COLUMN_QSLMSG_RCVD, QT_TR_NOOP(\"QSLr Message\")},\n    {COLUMN_QSL_RCVD_VIA, QT_TR_NOOP(\"QSLr Via\")},\n    {COLUMN_QSL_SENT_VIA, QT_TR_NOOP(\"QSLs Via\")},\n    {COLUMN_QSL_VIA, QT_TR_NOOP(\"QSL Via\")},\n    {COLUMN_QSO_COMPLETE, QT_TR_NOOP(\"QSO Completed\")},\n    {COLUMN_QSO_RANDOM, QT_TR_NOOP(\"QSO Random\")},\n    {COLUMN_QTH_INTL, QT_TR_NOOP(\"QTH\")},\n    {COLUMN_REGION, QT_TR_NOOP(\"Region\")},\n    {COLUMN_RIG, QT_TR_NOOP(\"Rig (ASCII)\")},\n    {COLUMN_RIG_INTL, QT_TR_NOOP(\"Rig\")},\n    {COLUMN_RX_PWR, QT_TR_NOOP(\"RcvPWR\")},\n    {COLUMN_SAT_MODE, QT_TR_NOOP(\"SAT Mode\")},\n    {COLUMN_SAT_NAME, QT_TR_NOOP(\"SAT Name\")},\n    {COLUMN_SFI, QT_TR_NOOP(\"Solar Flux\")},\n    {COLUMN_SIG, QT_TR_NOOP(\"SIG (ASCII)\")},\n    {COLUMN_SIG_INTL, QT_TR_NOOP(\"SIG\")},\n    {COLUMN_SIG_INFO, QT_TR_NOOP(\"SIG Info (ASCII)\")},\n    {COLUMN_SIG_INFO_INTL, QT_TR_NOOP(\"SIG Info\")},\n    {COLUMN_SILENT_KEY, QT_TR_NOOP(\"Silent Key\")},\n    {COLUMN_SKCC, QT_TR_NOOP(\"SKCC Member\")},\n    {COLUMN_SOTA_REF, QT_TR_NOOP(\"SOTA\")},\n    {COLUMN_SRX, QT_TR_NOOP(\"RcvNr\")},\n    {COLUMN_SRX_STRING, QT_TR_NOOP(\"RcvExch\")},\n    {COLUMN_STATION_CALLSIGN, QT_TR_NOOP(\"Logging Station Callsign\")},\n    {COLUMN_STX, QT_TR_NOOP(\"SentNr\")},\n    {COLUMN_STX_STRING, QT_TR_NOOP(\"SentExch\")},\n    {COLUMN_SWL, QT_TR_NOOP(\"SWL\")},\n    {COLUMN_TEN_TEN, QT_TR_NOOP(\"Ten-Ten Number\")},\n    {COLUMN_UKSMG, QT_TR_NOOP(\"UKSMG Member\")},\n    {COLUMN_USACA_COUNTIES, QT_TR_NOOP(\"USA-CA Counties\")},\n    {COLUMN_VE_PROV, QT_TR_NOOP(\"VE Prov\")},\n    {COLUMN_VUCC_GRIDS, QT_TR_NOOP(\"VUCC\")},\n    {COLUMN_WEB, QT_TR_NOOP(\"Web\")},\n    {COLUMN_MY_ARRL_SECT, QT_TR_NOOP(\"My ARRL Section\")},\n    {COLUMN_MY_WWFF_REF, QT_TR_NOOP(\"My WWFF\")},\n    {COLUMN_WWFF_REF, QT_TR_NOOP(\"WWFF\")}\n};\n\n\n#if 0\nvoid LogbookModel::updateExternalServicesUploadStatus(const QModelIndex &index, int role, bool &updateResult)\n{\n    switch (index.column() )\n    {\n    case COLUMN_TIME_ON:\n    case COLUMN_CALL:\n    case COLUMN_FREQUENCY:\n    case COLUMN_BAND:\n    case COLUMN_PROP_MODE:\n    case COLUMN_SAT_MODE:\n    case COLUMN_SAT_NAME:\n    case COLUMN_MODE:\n    case COLUMN_SUBMODE:\n    case COLUMN_STATION_CALLSIGN:\n    case COLUMN_RST_RCVD:\n    case COLUMN_RST_SENT:\n    case COLUMN_QSL_RCVD:\n    case COLUMN_QSL_SENT:\n    case COLUMN_QSL_RCVD_DATE:\n    case COLUMN_QSL_SENT_DATE:\n    case COLUMN_DXCC:\n    case COLUMN_CREDIT_GRANTED:\n    case COLUMN_VUCC_GRIDS:\n    case COLUMN_OPERATOR:\n    case COLUMN_GRID:\n    case COLUMN_NOTES:\n        updateUploadToModified(index, role, COLUMN_CLUBLOG_QSO_UPLOAD_STATUS, updateResult);\n        //updateUploadToModified(index, role, COLUMN_HRDLOG_QSO_UPLOAD_STATUS, updateResult);\n        break;\n    }\n\n    /* QRZ consumes all ADIF Fields */\n    updateUploadToModified(index, role, COLUMN_QRZCOM_QSO_UPLOAD_STATUS, updateResult);\n\n    /* HRDLOG consumes all ADIF Fields */\n    updateUploadToModified(index, role, COLUMN_HRDLOG_QSO_UPLOAD_STATUS, updateResult);\n}\n\nvoid LogbookModel::updateUploadToModified(const QModelIndex &index, int role, int column, bool &updateResult)\n{\n    QString status    = QSqlTableModel::data(this->index(index.row(), column), Qt::DisplayRole).toString();\n\n    if ( status == \"Y\" )\n    {\n        updateResult = updateResult && QSqlTableModel::setData(this->index(index.row(), column), QVariant(\"M\"), role);\n    }\n}\n#endif\n"
  },
  {
    "path": "models/LogbookModel.h",
    "content": "#ifndef QLOG_MODELS_LOGBOOKMODEL_H\n#define QLOG_MODELS_LOGBOOKMODEL_H\n\n#include <QObject>\n#include <QSqlTableModel>\n\nclass LogbookModel : public QSqlTableModel\n{\n    Q_OBJECT\n\npublic:\n    explicit LogbookModel(QObject* parent = nullptr, QSqlDatabase db = QSqlDatabase());\n\n    QVariant data(const QModelIndex &index, int role) const override;\n    bool setData(const QModelIndex &index, const QVariant &value, int role) override;\n    void updateExternalServicesUploadStatus( const QModelIndex &index, int role, bool &updateResult );\n    void updateUploadToModified( const QModelIndex &index, int role, int column, bool &updateResult );\n    enum ColumnID\n    {\n        COLUMN_INVALID = -1,\n        COLUMN_ID = 0,\n        COLUMN_TIME_ON = 1,\n        COLUMN_TIME_OFF = 2,\n        COLUMN_CALL = 3,\n        COLUMN_RST_SENT = 4,\n        COLUMN_RST_RCVD = 5,\n        COLUMN_FREQUENCY = 6,\n        COLUMN_BAND = 7,\n        COLUMN_MODE = 8,\n        COLUMN_SUBMODE = 9,\n        COLUMN_NAME = 10,\n        COLUMN_QTH = 11,\n        COLUMN_GRID = 12,\n        COLUMN_DXCC = 13,\n        COLUMN_COUNTRY = 14,\n        COLUMN_CONTINENT = 15,\n        COLUMN_CQZ = 16,\n        COLUMN_ITUZ = 17,\n        COLUMN_PREFIX = 18,\n        COLUMN_STATE = 19,\n        COLUMN_COUNTY = 20,\n        COLUMN_IOTA = 21,\n        COLUMN_QSL_RCVD = 22,\n        COLUMN_QSL_RCVD_DATE = 23,\n        COLUMN_QSL_SENT = 24,\n        COLUMN_QSL_SENT_DATE = 25,\n        COLUMN_LOTW_RCVD = 26,\n        COLUMN_LOTW_RCVD_DATE = 27,\n        COLUMN_LOTW_SENT = 28,\n        COLUMN_LOTW_SENT_DATE = 29,\n        COLUMN_TX_POWER = 30,\n        COLUMN_FIELDS = 31,\n        COLUMN_ADDRESS = 32,\n        COLUMN_ADDRESS_INTL = 33,\n        COLUMN_AGE = 34,\n        COLUMN_A_INDEX = 35,\n        COLUMN_ANT_AZ = 36,\n        COLUMN_ANT_EL = 37,\n        COLUMN_ANT_PATH = 38,\n        COLUMN_ARRL_SECT = 39,\n        COLUMN_AWARD_SUBMITTED = 40,\n        COLUMN_AWARD_GRANTED = 41,\n        COLUMN_BAND_RX = 42,\n        COLUMN_CHECK = 43,\n        COLUMN_CLASS = 44,\n        COLUMN_CLUBLOG_QSO_UPLOAD_DATE = 45,\n        COLUMN_CLUBLOG_QSO_UPLOAD_STATUS = 46,\n        COLUMN_COMMENT = 47,\n        COLUMN_COMMENT_INTL = 48,\n        COLUMN_CONTACTED_OP = 49,\n        COLUMN_CONTEST_ID = 50,\n        COLUMN_COUNTRY_INTL = 51,\n        COLUMN_CREDIT_SUBMITTED = 52,\n        COLUMN_CREDIT_GRANTED = 53,\n        COLUMN_DARC_DOK = 54,\n        COLUMN_DISTANCE = 55,\n        COLUMN_EMAIL = 56,\n        COLUMN_EQ_CALL = 57,\n        COLUMN_EQSL_QSLRDATE = 58,\n        COLUMN_EQSL_QSLSDATE = 59,\n        COLUMN_EQSL_QSL_RCVD = 60,\n        COLUMN_EQSL_QSL_SENT = 61,\n        COLUMN_FISTS = 62,\n        COLUMN_FISTS_CC = 63,\n        COLUMN_FORCE_INIT = 64,\n        COLUMN_FREQ_RX = 65,\n        COLUMN_GUEST_OP = 66,\n        COLUMN_HRDLOG_QSO_UPLOAD_DATE = 67,\n        COLUMN_HRDLOG_QSO_UPLOAD_STATUS = 68,\n        COLUMN_IOTA_ISLAND_ID = 69,\n        COLUMN_K_INDEX = 70,\n        COLUMN_LAT = 71,\n        COLUMN_LON = 72,\n        COLUMN_MAX_BURSTS = 73,\n        COLUMN_MS_SHOWER = 74,\n        COLUMN_MY_ANTENNA = 75,\n        COLUMN_MY_ANTENNA_INTL = 76,\n        COLUMN_MY_CITY = 77,\n        COLUMN_MY_CITY_INTL = 78,\n        COLUMN_MY_CNTY = 79,\n        COLUMN_MY_COUNTRY = 80,\n        COLUMN_MY_COUNTRY_INTL = 81,\n        COLUMN_MY_CQ_ZONE = 82,\n        COLUMN_MY_DXCC = 83,\n        COLUMN_MY_FISTS = 84,\n        COLUMN_MY_GRIDSQUARE = 85,\n        COLUMN_MY_IOTA = 86,\n        COLUMN_MY_IOTA_ISLAND_ID = 87,\n        COLUMN_MY_ITU_ZONE = 88,\n        COLUMN_MY_LAT = 89,\n        COLUMN_MY_LON = 90,\n        COLUMN_MY_NAME = 91,\n        COLUMN_MY_NAME_INTL = 92,\n        COLUMN_MY_POSTAL_CODE = 93,\n        COLUMN_MY_POSTAL_CODE_INTL = 94,\n        COLUMN_MY_RIG = 95,\n        COLUMN_MY_RIG_INTL = 96,\n        COLUMN_MY_SIG = 97,\n        COLUMN_MY_SIG_INTL = 98,\n        COLUMN_MY_SIG_INFO = 99,\n        COLUMN_MY_SIG_INFO_INTL = 100,\n        COLUMN_MY_SOTA_REF = 101,\n        COLUMN_MY_STATE = 102,\n        COLUMN_MY_STREET = 103,\n        COLUMN_MY_STREET_INTL = 104,\n        COLUMN_MY_USACA_COUNTIES = 105,\n        COLUMN_MY_VUCC_GRIDS = 106,\n        COLUMN_NAME_INTL = 107,\n        COLUMN_NOTES = 108,\n        COLUMN_NOTES_INTL = 109,\n        COLUMN_NR_BURSTS = 110,\n        COLUMN_NR_PINGS = 111,\n        COLUMN_OPERATOR = 112,\n        COLUMN_OWNER_CALLSIGN = 113,\n        COLUMN_PRECEDENCE = 114,\n        COLUMN_PROP_MODE = 115,\n        COLUMN_PUBLIC_KEY = 116,\n        COLUMN_QRZCOM_QSO_UPLOAD_DATE = 117,\n        COLUMN_QRZCOM_QSO_UPLOAD_STATUS = 118,\n        COLUMN_QSLMSG = 119,\n        COLUMN_QSLMSG_INTL = 120,\n        COLUMN_QSL_RCVD_VIA = 121,\n        COLUMN_QSL_SENT_VIA = 122,\n        COLUMN_QSL_VIA = 123,\n        COLUMN_QSO_COMPLETE = 124,\n        COLUMN_QSO_RANDOM = 125,\n        COLUMN_QTH_INTL = 126,\n        COLUMN_REGION = 127,\n        COLUMN_RIG = 128,\n        COLUMN_RIG_INTL = 129,\n        COLUMN_RX_PWR = 130,\n        COLUMN_SAT_MODE = 131,\n        COLUMN_SAT_NAME = 132,\n        COLUMN_SFI = 133,\n        COLUMN_SIG = 134,\n        COLUMN_SIG_INTL = 135,\n        COLUMN_SIG_INFO = 136,\n        COLUMN_SIG_INFO_INTL = 137,\n        COLUMN_SILENT_KEY = 138,\n        COLUMN_SKCC = 139,\n        COLUMN_SOTA_REF = 140,\n        COLUMN_SRX = 141,\n        COLUMN_SRX_STRING = 142,\n        COLUMN_STATION_CALLSIGN = 143,\n        COLUMN_STX = 144,\n        COLUMN_STX_STRING = 145,\n        COLUMN_SWL = 146,\n        COLUMN_TEN_TEN = 147,\n        COLUMN_UKSMG = 148,\n        COLUMN_USACA_COUNTIES = 149,\n        COLUMN_VE_PROV = 150,\n        COLUMN_VUCC_GRIDS = 151,\n        COLUMN_WEB = 152,\n        COLUMN_MY_ARRL_SECT = 153,\n        COLUMN_MY_WWFF_REF = 154,\n        COLUMN_WWFF_REF = 155,\n        COLUMN_ALTITUDE = 156,\n        COLUMN_GRID_EXT = 157,\n        COLUMN_HAMLOGEU_QSO_UPLOAD_DATE = 158,\n        COLUMN_HAMLOGEU_QSO_UPLOAD_STATUS = 159,\n        COLUMN_HAMQTH_QSO_UPLOAD_DATE = 160,\n        COLUMN_HAMQTH_QSO_UPLOAD_STATUS = 161,\n        COLUMN_MY_ALTITUDE = 162,\n        COLUMN_MY_GRIDSQUARE_EXT = 163,\n        COLUMN_MY_POTA_REF = 164,\n        COLUMN_POTA_REF = 165,\n        COLUMN_CNTY_ALT = 166,\n        COLUMN_DCL_QSLRDATE = 167,\n        COLUMN_DCL_QSLSDATE = 168,\n        COLUMN_DCL_QSL_RCVD = 169,\n        COLUMN_DCL_QSL_SENT = 170,\n        COLUMN_MORSE_KEY_INFO = 171,\n        COLUMN_MORSE_KEY_TYPE = 172,\n        COLUMN_MY_CNTY_ALT = 173,\n        COLUMN_MY_DARC_DOK = 174,\n        COLUMN_MY_MORSE_KEY_INFO = 175,\n        COLUMN_MY_MORSE_KEY_TYPE = 176,\n        COLUMN_QRZCOM_QSO_DOWNLOAD_DATE = 177,\n        COLUMN_QRZCOM_QSO_DOWNLOAD_STATUS = 178,\n        COLUMN_QSLMSG_RCVD = 179,\n        COLUMN_EQSL_AG = 180,\n        COLUMN_LAST_ELEMENT = 181\n    };\n\nprivate:\n    static QMap<LogbookModel::ColumnID, QString> fieldNameTranslationMap;\n\npublic:\n    static const QString getFieldNameTranslation(const LogbookModel::ColumnID key)\n    {\n        const QString value = fieldNameTranslationMap.value(key);\n        return value.isEmpty() ? QString () : tr(value.toStdString().c_str());\n    }\n};\n\n#endif // QLOG_MODELS_LOGBOOKMODEL_H\n"
  },
  {
    "path": "models/RigTypeModel.cpp",
    "content": "#include \"RigTypeModel.h\"\n#include \"rig/Rig.h\"\n\nRigTypeModel::RigTypeModel(QObject* parent)\n    : QAbstractListModel(parent)\n{\n\n}\n\nint RigTypeModel::rowCount(const QModelIndex&) const {\n    return rigList.count();\n}\n\nQVariant RigTypeModel::data(const QModelIndex& index, int role) const {\n    if (role == Qt::DisplayRole) {\n        return rigList.value(index.row());\n    }\n\n    if (role == Qt::UserRole )\n    {\n        return rigIds[rigList.value(index.row())];\n    }\n    return QVariant();\n}\n\nQModelIndex RigTypeModel::index(int row, int column, const QModelIndex& parent) const {\n    if (!hasIndex(row, column, parent)) {\n        return QModelIndex();\n    }\n\n    int rigId = rigIds[rigList.value(row)];\n    if (rigId)\n        return createIndex(row, column, rigId);\n    else\n        return QModelIndex();\n}\n\nvoid RigTypeModel::select(int driverID)\n{\n    beginResetModel();\n    rigIds.clear();\n    rigList.clear();\n\n    if ( driverID == 0 )\n        return;\n\n    const QList<QPair<int, QString>> models = Rig::instance()->getModelList(static_cast<Rig::DriverID>(driverID));\n    for ( const QPair<int, QString> &model : models )\n    {\n        const QString &name = model.second;\n        rigIds[name] = model.first;\n        rigList.append(name);\n    }\n    rigList.sort();\n    endResetModel();\n}\n"
  },
  {
    "path": "models/RigTypeModel.h",
    "content": "#ifndef QLOG_MODELS_RIGTYPEMODEL_H\n#define QLOG_MODELS_RIGTYPEMODEL_H\n\n#include <QAbstractListModel>\n#include <QStringList>\n\nclass RigTypeModel : public QAbstractListModel {\n    Q_OBJECT\n\npublic:\n    RigTypeModel(QObject* parent = 0);\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;\n    void select(int driverID);\n\nprivate:\n    QStringList rigList;\n    QMap<QString, int> rigIds;\n};\n\n#endif // QLOG_MODELS_RIGTYPEMODEL_H\n"
  },
  {
    "path": "models/RotTypeModel.cpp",
    "content": "#include \"rotator/Rotator.h\"\n#include \"RotTypeModel.h\"\n\nRotTypeModel::RotTypeModel(QObject* parent)\n    : QAbstractListModel(parent)\n{\n\n}\n\nint RotTypeModel::rowCount(const QModelIndex&) const {\n    return rotList.count();\n}\n\nQVariant RotTypeModel::data(const QModelIndex& index, int role) const {\n    if (role == Qt::DisplayRole) {\n        return rotList.value(index.row());\n    }\n\n    if (role == Qt::UserRole )\n    {\n        return rotIds[rotList.value(index.row())];\n    }\n    return QVariant();\n}\n\nQModelIndex RotTypeModel::index(int row, int column, const QModelIndex& parent) const {\n    if (!hasIndex(row, column, parent)) {\n        return QModelIndex();\n    }\n\n    int rotId = rotIds[rotList.value(row)];\n    if (rotId)\n        return createIndex(row, column, rotId);\n    else\n        return QModelIndex();\n}\n\nvoid RotTypeModel::select(int driverID)\n{\n    beginResetModel();\n    rotIds.clear();\n    rotList.clear();\n\n    if ( driverID == 0 )\n        return;\n\n    const QList<QPair<int, QString>> models = Rotator::instance()->getModelList(static_cast<Rotator::DriverID>(driverID));\n    for ( const QPair<int, QString> &model : models )\n    {\n        const QString &name = model.second;\n        rotIds[name] = model.first;\n        rotList.append(name);\n    }\n    rotList.sort();\n    endResetModel();\n}\n\n"
  },
  {
    "path": "models/RotTypeModel.h",
    "content": "#ifndef QLOG_MODELS_ROTTYPEMODEL_H\n#define QLOG_MODELS_ROTTYPEMODEL_H\n\n#include <QAbstractListModel>\n#include <QStringList>\n\nclass RotTypeModel : public QAbstractListModel {\n    Q_OBJECT\n\npublic:\n    RotTypeModel(QObject* parent = 0);\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QModelIndex index(int row, int column, const QModelIndex& parent = QModelIndex()) const;\n    void select(int driverID);\n\nprivate:\n    QStringList rotList;\n    QMap<QString, int> rotIds;\n};\n\n#endif // QLOG_MODELS_RIGTYPEMODEL_H\n"
  },
  {
    "path": "models/SearchFilterProxyModel.cpp",
    "content": "#include \"SearchFilterProxyModel.h\"\n\nSearchFilterProxyModel::SearchFilterProxyModel(QObject *parent)\n    : QSortFilterProxyModel{parent}\n{}\n\nvoid SearchFilterProxyModel::setSearchString(const QString &searchString)\n{\n    this->searchString = searchString;\n    invalidateFilter();\n}\n\nvoid SearchFilterProxyModel::setSearchSkippedCols(const QVector<int> &columns)\n{\n    searchSkippedCols = columns;\n    invalidateFilter();\n}\n\nbool SearchFilterProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const\n{\n    // full-text search\n    for ( int col = 0; col < sourceModel()->columnCount(); ++col )\n    {\n        if (searchSkippedCols.contains(col) )\n            continue;\n\n        QModelIndex index = sourceModel()->index(source_row, col, source_parent);\n        QString data = index.data(Qt::DisplayRole).toString();\n\n        if ( data.contains(searchString, Qt::CaseInsensitive) )\n            return true;\n    }\n    return false;\n}\n"
  },
  {
    "path": "models/SearchFilterProxyModel.h",
    "content": "#ifndef QLOG_MODELS_SEARCHFILTERPROXYMODEL_H\n#define QLOG_MODELS_SEARCHFILTERPROXYMODEL_H\n\n#include <QSortFilterProxyModel>\n\nclass SearchFilterProxyModel : public QSortFilterProxyModel\n{\n    Q_OBJECT\n\npublic:\n    SearchFilterProxyModel(QObject* parent = nullptr);\n    void setSearchString(const QString& searchString);\n    void setSearchSkippedCols(const QVector<int> &columns);\n\nprotected:\n    bool filterAcceptsRow(int source_row, const QModelIndex& source_parent) const override;\n\nprivate:\n    QString searchString;\n    QVector<int> searchSkippedCols;\n};\n\n#endif // QLOG_MODELS_SEARCHFILTERPROXYMODEL_H\n"
  },
  {
    "path": "models/ShortcutEditorModel.cpp",
    "content": "#include \"ShortcutEditorModel.h\"\n\nShortcutEditorModel::ShortcutEditorModel(const QList<QAction *> &actions,\n                                         const QStringList &builtInStaticActions,\n                                         QObject *parent)\n    : QAbstractTableModel{parent},\n      actionList(actions),\n      builtInStaticActionList(builtInStaticActions)\n{\n    std::sort(actionList.begin(),\n              actionList.end(),\n              [](const QAction *a, const QAction *b)\n    {\n        return a->toolTip().localeAwareCompare(b->toolTip()) < 0;\n    });\n}\n\nint ShortcutEditorModel::rowCount(const QModelIndex &) const\n{\n    return actionList.count();\n}\n\nint ShortcutEditorModel::columnCount(const QModelIndex &) const\n{\n    return 2;\n}\n\nQVariant ShortcutEditorModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if ( role != Qt::DisplayRole || orientation != Qt::Horizontal )\n        return QVariant();\n\n    switch ( section )\n    {\n    case COLUMN_DESCRIPTION: return tr(\"Description\");\n    case COLUMN_SHORTCUT: return tr(\"Shortcut\");\n    default: return QVariant();\n    }\n}\n\nQVariant ShortcutEditorModel::data(const QModelIndex &index, int role) const\n{\n    QAction *action = actionList.at(index.row());\n\n    if ( !action )\n        return QVariant();\n\n    if ( role == Qt::DisplayRole )\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_DESCRIPTION: return action->toolTip();\n        case COLUMN_SHORTCUT: return action->shortcut().toString(QKeySequence::NativeText);\n        default: return QVariant();\n        }\n    }\n\n    return QVariant();\n}\n\nbool ShortcutEditorModel::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    if ( role == Qt::EditRole && index.column() == COLUMN_SHORTCUT )\n    {\n        QAction *action = actionList.at(index.row());\n        const QString &newShortcutString = value.toString();\n\n        if ( !action )\n            return false;\n\n        if ( newShortcutString.isEmpty() )\n        {\n            action->setShortcut(QKeySequence());\n            emit dataChanged(index, index);\n            return true;\n        }\n\n        if ( builtInStaticActionList.contains(newShortcutString) )\n        {\n            emit conflictDetected(tr(\"Conflict with a built-in shortcut\"));\n            return false;\n        }\n\n        if ( findShortcut(actionList, action, newShortcutString) )\n        {\n            emit conflictDetected(tr(\"Conflict with a user-defined shortcut\"));\n            return false;\n        }\n\n        action->setShortcut(QKeySequence(newShortcutString));\n        emit dataChanged(index, index);\n        return true;\n    }\n\n    return QAbstractItemModel::setData(index, value, role);\n}\n\nQt::ItemFlags ShortcutEditorModel::flags(const QModelIndex &index) const\n{\n    if ( !index.isValid() )\n        return Qt::NoItemFlags;\n\n    Qt::ItemFlags modelFlags = QAbstractItemModel::flags(index);\n    if ( index.column() == COLUMN_SHORTCUT )\n        modelFlags |= Qt::ItemIsEditable;\n\n    return modelFlags;\n}\n\nconst QAction *ShortcutEditorModel::findShortcut(const QList<QAction *> &list,\n                                                 const QAction *currAction,\n                                                 const QString &shortcut) const\n{\n    for ( const QAction* action : list )\n    {\n        if ( action->shortcut().toString(QKeySequence::NativeText) == shortcut\n             && action != currAction )\n            return action;\n    }\n\n    return nullptr;\n}\n"
  },
  {
    "path": "models/ShortcutEditorModel.h",
    "content": "#ifndef QLOG_MODELS_SHORTCUTEDITORMODEL_H\n#define QLOG_MODELS_SHORTCUTEDITORMODEL_H\n\n#include <QAbstractTableModel>\n#include <QAction>\n\nclass ShortcutEditorModel : public QAbstractTableModel\n{\n    Q_OBJECT\npublic:\n    explicit ShortcutEditorModel(const QList<QAction *> &actions,\n                                 const QStringList &builtInStaticActions,\n                                 QObject *parent = nullptr);\n    int rowCount(const QModelIndex& parent = QModelIndex()) const override;\n    int columnCount(const QModelIndex& = QModelIndex()) const override;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override;\n    QVariant data(const QModelIndex& index, int role) const override;\n    bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;\n    Qt::ItemFlags flags(const QModelIndex &index) const override;\n\n    enum column_id\n    {\n        COLUMN_DESCRIPTION = 0,\n        COLUMN_SHORTCUT = 1,\n    };\n\nsignals:\n    void conflictDetected(const QString &);\n\nprivate:\n    QList<QAction *> actionList;\n    QStringList builtInStaticActionList;\n\n    const QAction *findShortcut(const QList<QAction *> &list,\n                                const QAction *currAction,\n                                const QString&) const;\n};\n\n#endif // QLOG_MODELS_SHORTCUTEDITORMODEL_H\n"
  },
  {
    "path": "models/SqlListModel.cpp",
    "content": "#include <QDebug>\n#include <QFile>\n#include <QSqlQuery>\n#include \"SqlListModel.h\"\n\nSqlListModel::SqlListModel(const QString &query, const QString &placeholder, QObject *parent)\n    : QSqlQueryModel(parent),\n      placeholder(placeholder),\n      stmt(query)\n{\n\n    this->setQuery(stmt);\n}\n\nQVariant SqlListModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    Q_UNUSED(section)\n    Q_UNUSED(orientation)\n    Q_UNUSED(role)\n    return QVariant();\n}\n\nint SqlListModel::rowCount(const QModelIndex &parent) const\n{\n    // For list models only the root node (an invalid parent) should return the list's size. For all\n    // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.\n    if (parent.isValid())\n        return 0;\n\n    return QSqlQueryModel::rowCount(parent) + (!placeholder.isEmpty() ? 1 : 0);\n}\n\nQVariant SqlListModel::data(const QModelIndex &index, int role) const\n{\n    if (!index.isValid()) return QVariant();\n\n    const int col = index.column();\n    const int row = index.row();\n    const bool hasPlaceholder = !placeholder.isEmpty();\n    const bool isTargetColumn = (col >= 0 && col <= 2);\n    const int realRow = row - (hasPlaceholder ? 1 : 0);\n\n    if (!isTargetColumn) return QVariant();\n\n    if ( role == Qt::DisplayRole )\n    {\n        if ( hasPlaceholder && row == 0 ) return placeholder;\n\n        const QModelIndex &sqlIndex = QSqlQueryModel::index(realRow, col);\n        return QSqlQueryModel::data(sqlIndex, role);\n    }\n\n    // get row index;\n    if (role == Qt::UserRole) return row - (hasPlaceholder ? 1 : 0);\n\n    // get (role - UserRole) Column\n    if (role >= Qt::UserRole + 1)\n    {\n        if (hasPlaceholder && row == 0) return QVariant();\n\n        const QModelIndex &sqlIndex = QSqlQueryModel::index(realRow, role - 1 - Qt::UserRole);\n        return QSqlQueryModel::data(sqlIndex, Qt::DisplayRole);\n    }\n\n    return QVariant();\n}\n\nvoid SqlListModel::refresh()\n{\n    setQuery(stmt);\n}\n"
  },
  {
    "path": "models/SqlListModel.h",
    "content": "#ifndef QLOG_MODELS_SQLLISTMODEL_H\n#define QLOG_MODELS_SQLLISTMODEL_H\n\n#include <QSqlQueryModel>\n\nclass SqlListModel : public QSqlQueryModel\n{\n    Q_OBJECT\n\npublic:\n    explicit SqlListModel(const QString &, const QString &, QObject *parent = nullptr);\n\n    // Header:\n    QVariant headerData(int, Qt::Orientation, int role = Qt::DisplayRole) const override;\n\n    // Basic functionality:\n    int rowCount(const QModelIndex &parent = QModelIndex()) const override;\n\n    QVariant data(const QModelIndex &, int role = Qt::DisplayRole) const override;\n\n    void refresh();\nprivate:\n    QString placeholder;\n    QString stmt;\n};\n\n#endif // QLOG_MODELS_SQLLISTMODEL_H\n"
  },
  {
    "path": "models/WsjtxTableModel.cpp",
    "content": "#include <QColor>\n#include \"WsjtxTableModel.h\"\n#include \"data/Data.h\"\n\nbool operator==(const WsjtxEntry& a, const WsjtxEntry& b)\n{\n    return a.callsign == b.callsign;\n}\n\nint WsjtxTableModel::rowCount(const QModelIndex&) const\n{\n    return wsjtxData.count();\n}\n\nint WsjtxTableModel::columnCount(const QModelIndex&) const\n{\n    return 7;\n}\n\nQVariant WsjtxTableModel::data(const QModelIndex& index, int role) const\n{\n    WsjtxEntry entry = wsjtxData.at(index.row());\n\n    if (role == Qt::DisplayRole)\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_CALLSIGN: return entry.callsign;\n        case COLUMN_GRID: return entry.grid;\n        case COLUMN_DISTANCE: if ( entry.distance > 0.0 ) return entry.distance; else return QVariant();\n        case COLUMN_SNR: return QString::number(entry.decode.snr);\n        case COLUMN_LAST_ACTIVITY: return entry.decode.time.toString();\n        case COLUMN_LAST_MESSAGE: return entry.comment;\n        case COLUMN_MEMBER: return entry.memberList2StringList().join(\", \");\n        default: return QVariant();\n        }\n    }\n    else if (index.column() == COLUMN_CALLSIGN && role == Qt::BackgroundRole)\n    {\n        return Data::statusToColor(entry.status, entry.dupeCount, QColor(Qt::transparent));\n    }\n    else if (index.column() > COLUMN_CALLSIGN && role == Qt::BackgroundRole)\n    {\n        if ( entry.receivedTime.secsTo(QDateTime::currentDateTimeUtc()) >= spotPeriod * 0.8)\n            /* -20% time of period because WSTX sends messages in waves and not exactly in time period */\n        {\n            return QColor(Qt::darkGray);\n        }\n    }\n    else if (index.column() == COLUMN_CALLSIGN && role == Qt::ForegroundRole)\n    {\n        //return Data::statusToInverseColor(entry.status, QColor(Qt::black));\n    }\n    else if (index.column() == COLUMN_CALLSIGN && role == Qt::ToolTipRole)\n    {\n        return  QCoreApplication::translate(\"DBStrings\", entry.dxcc.country.toUtf8().constData()) + \" [\" + Data::statusToText(entry.status) + \"]\";\n    }\n    else if ( role == Qt::UserRole )\n    {\n        switch ( index.column() )\n        {\n        case COLUMN_DISTANCE:\n            return data(index, Qt::DisplayRole).toDouble();\n            break;\n        case COLUMN_SNR:\n            return data(index, Qt::DisplayRole).toInt();\n            break;\n        case COLUMN_LAST_ACTIVITY:\n            return data(index, Qt::DisplayRole).toTime();\n            break;\n        default:\n            return data(index, Qt::DisplayRole);\n        }\n    }\n\n    return QVariant();\n}\n\nQVariant WsjtxTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch (section)\n    {\n    case COLUMN_CALLSIGN: return tr(\"Callsign\");\n    case COLUMN_GRID: return tr(\"Gridsquare\");\n    case COLUMN_DISTANCE: return tr(\"Distance\");\n    case COLUMN_SNR: return tr(\"SNR\");\n    case COLUMN_LAST_ACTIVITY: return tr(\"Last Activity\");\n    case COLUMN_LAST_MESSAGE: return tr(\"Last Message\");\n    case COLUMN_MEMBER: return tr(\"Member\");\n    default: return QVariant();\n    }\n}\n\nvoid WsjtxTableModel::addOrReplaceEntry(const WsjtxEntry &entry)\n{\n    int idx = wsjtxData.indexOf(entry);\n\n    if ( idx >= 0 )\n    {\n        if ( ! entry.grid.isEmpty() )\n        {\n            wsjtxData[idx].grid = entry.grid;\n        }\n\n        wsjtxData[idx].status = entry.status;\n        wsjtxData[idx].decode = entry.decode;\n        wsjtxData[idx].receivedTime = entry.receivedTime;\n        wsjtxData[idx].dupeCount = entry.dupeCount;\n        // does not update club info\n\n        emit dataChanged(createIndex(idx,0), createIndex(idx,4));\n    }\n    else\n    {\n        beginInsertRows(QModelIndex(), wsjtxData.count(), wsjtxData.count());\n        wsjtxData.append(entry);\n        endInsertRows();\n    }\n}\n\nvoid WsjtxTableModel::spotAging()\n{\n    beginResetModel();\n\n    QMutableListIterator<WsjtxEntry> entry(wsjtxData);\n\n    while ( entry.hasNext() )\n    {\n        const WsjtxEntry &current = entry.next();\n\n        // keep the entry longer than the spotPeriod, because it is used for querying from the Map.\n        if ( current.receivedTime.secsTo(QDateTime::currentDateTimeUtc()) > 3 * 60 )\n            entry.remove();\n    }\n\n    endResetModel();\n}\n\nbool WsjtxTableModel::callsignExists(const WsjtxEntry &call)\n{\n    return wsjtxData.contains(call);\n}\n\nconst WsjtxEntry WsjtxTableModel::getEntry(QModelIndex idx) const\n{\n    return wsjtxData.at(idx.row());\n}\n\nconst WsjtxEntry WsjtxTableModel::getEntry(const QString &callsign) const\n{\n    WsjtxEntry entry;\n    entry.callsign = callsign;\n    int index = wsjtxData.indexOf(entry);\n\n    return (index < 0) ? WsjtxEntry() : wsjtxData.at(index);\n}\n\nvoid WsjtxTableModel::setCurrentSpotPeriod(float period)\n{\n    spotPeriod = period;\n}\n\nvoid WsjtxTableModel::clear()\n{\n    beginResetModel();\n    wsjtxData.clear();\n    endResetModel();\n}\n\nvoid WsjtxTableModel::removeSpot(const QString &callsign)\n{\n    beginResetModel();\n\n    QMutableListIterator<WsjtxEntry> entry(wsjtxData);\n\n    while ( entry.hasNext() )\n    {\n        if ( entry.next().callsign == callsign )\n            entry.remove();\n    }\n\n    endResetModel();\n}\n\n"
  },
  {
    "path": "models/WsjtxTableModel.h",
    "content": "#ifndef QLOG_MODELS_WSJTXTABLEMODEL_H\n#define QLOG_MODELS_WSJTXTABLEMODEL_H\n\n#include <QAbstractTableModel>\n#include \"data/WsjtxEntry.h\"\n\nclass WsjtxTableModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    enum column_id\n    {\n        COLUMN_CALLSIGN = 0,\n        COLUMN_GRID = 1,\n        COLUMN_DISTANCE = 2,\n        COLUMN_SNR = 3,\n        COLUMN_LAST_ACTIVITY = 4,\n        COLUMN_LAST_MESSAGE = 5,\n        COLUMN_MEMBER = 6,\n    };\n\n    WsjtxTableModel(QObject* parent = nullptr) : QAbstractTableModel(parent) {spotPeriod = 120;}\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    void addOrReplaceEntry(const WsjtxEntry &entry);\n    void spotAging();\n    bool callsignExists(const WsjtxEntry &);\n    const WsjtxEntry getEntry(const QString &callsign) const;\n    const WsjtxEntry getEntry(QModelIndex idx) const;\n    void setCurrentSpotPeriod(float);\n    void clear();\n    void removeSpot(const QString &callsign);\n\nprivate:\n    QList<WsjtxEntry> wsjtxData;\n    float spotPeriod;\n};\n\n#endif // QLOG_MODELS_WSJTXTABLEMODEL_H\n"
  },
  {
    "path": "res/data/contests.json",
    "content": "[\n    {\"id\": \"070-160M-SPRINT\", \"name\": \"PODXS Great Pumpkin Sprint\"},\n    {\"id\": \"070-3-DAY\", \"name\": \"PODXS Three Day Weekend\"},\n    {\"id\": \"070-31-FLAVORS\", \"name\": \"PODXS 31 Flavors\"},\n    {\"id\": \"070-40M-SPRINT\", \"name\": \"PODXS 40m Firecracker Sprint\"},\n    {\"id\": \"070-80M-SPRINT\", \"name\": \"PODXS 80m Jay Hudak Memorial Sprint\"},\n    {\"id\": \"070-PSKFEST\", \"name\": \"PODXS PSKFest\"},\n    {\"id\": \"070-ST-PATS-DAY\", \"name\": \"PODXS St. Patricks Day\"},\n    {\"id\": \"070-VALENTINE-SPRINT\", \"name\": \"PODXS Valentine Sprint\"},\n    {\"id\": \"10-RTTY\", \"name\": \"Ten-Meter RTTY Contest (2011 onwards)\"},\n    {\"id\": \"1010-OPEN-SEASON\", \"name\": \"Open Season Ten Meter QSO Party\"},\n    {\"id\": \"7QP\", \"name\": \"7th-Area QSO Party\"},\n    {\"id\": \"AL-QSO-PARTY\", \"name\": \"Alabama QSO Party\"},\n    {\"id\": \"ALL-ASIAN-DX-CW\", \"name\": \"JARL All Asian DX Contest (CW)\"},\n    {\"id\": \"ALL-ASIAN-DX-PHONE\", \"name\": \"JARL All Asian DX Contest (PHONE)\"},\n    {\"id\": \"ANARTS-RTTY\", \"name\": \"ANARTS WW RTTY\"},\n    {\"id\": \"ANATOLIAN-RTTY\", \"name\": \"Anatolian WW RTTY\"},\n    {\"id\": \"AP-SPRINT\", \"name\": \"Asia - Pacific Sprint\"},\n    {\"id\": \"AR-QSO-PARTY\", \"name\": \"Arkansas QSO Party\"},\n    {\"id\": \"ARI-DX\", \"name\": \"ARI DX Contest\"},\n    {\"id\": \"ARI-EME\", \"name\": \"ARI Italian EME Trophy\"},\n    {\"id\": \"ARI-IAC-13CM\", \"name\": \"ARI Italian Activity Contest (13cm+)\"},\n    {\"id\": \"ARI-IAC-23CM\", \"name\": \"ARI Italian Activity Contest (23cm)\"},\n    {\"id\": \"ARI-IAC-6M\", \"name\": \"ARI Italian Activity Contest (6m)\"},\n    {\"id\": \"ARI-IAC-UHF\", \"name\": \"ARI Italian Activity Contest (UHF)\"},\n    {\"id\": \"ARI-IAC-VHF\", \"name\": \"ARI Italian Activity Contest (VHF)\"},\n    {\"id\": \"ARRL-10\", \"name\": \"ARRL 10 Meter Contest\"},\n    {\"id\": \"ARRL-160\", \"name\": \"ARRL 160 Meter Contest\"},\n    {\"id\": \"ARRL-222\", \"name\": \"ARRL 222 MHz and Up Distance Contest\"},\n    {\"id\": \"ARRL-DX-CW\", \"name\": \"ARRL International DX Contest (CW)\"},\n    {\"id\": \"ARRL-DX-SSB\", \"name\": \"ARRL International DX Contest (Phone)\"},\n    {\"id\": \"ARRL-EME\", \"name\": \"ARRL EME contest\"},\n    {\"id\": \"ARRL-FIELD-DAY\", \"name\": \"ARRL Field Day\"},\n    {\"id\": \"ARRL-RR-CW\", \"name\": \"ARRL Rookie Roundup (CW)\"},\n    {\"id\": \"ARRL-RR-RTTY\", \"name\": \"ARRL Rookie Roundup (RTTY)\"},\n    {\"id\": \"ARRL-RR-SSB\", \"name\": \"ARRL Rookie Roundup (Phone)\"},\n    {\"id\": \"ARRL-RTTY\", \"name\": \"ARRL RTTY Round-Up\"},\n    {\"id\": \"ARRL-SCR\", \"name\": \"ARRL School Club Roundup\"},\n    {\"id\": \"ARRL-SS-CW\", \"name\": \"ARRL November Sweepstakes (CW)\"},\n    {\"id\": \"ARRL-SS-SSB\", \"name\": \"ARRL November Sweepstakes (Phone)\"},\n    {\"id\": \"ARRL-UHF-AUG\", \"name\": \"ARRL August UHF Contest\"},\n    {\"id\": \"ARRL-VHF-JAN\", \"name\": \"ARRL January VHF Sweepstakes\"},\n    {\"id\": \"ARRL-VHF-JUN\", \"name\": \"ARRL June VHF QSO Party\"},\n    {\"id\": \"ARRL-VHF-SEP\", \"name\": \"ARRL September VHF QSO Party\"},\n    {\"id\": \"AZ-QSO-PARTY\", \"name\": \"Arizona QSO Party\"},\n    {\"id\": \"BANGGAI-DX\", \"name\": \"ORARI Banggai DX Contest\"},\n    {\"id\": \"BARTG-RTTY\", \"name\": \"BARTG Spring RTTY Contest\"},\n    {\"id\": \"BARTG-SPRINT\", \"name\": \"BARTG Sprint Contest\"},\n    {\"id\": \"BC-QSO-PARTY\", \"name\": \"British Columbia QSO Party\"},\n    {\"id\": \"BEKASI-MERDEKA-CONTEST\", \"name\": \"ORARI Bekasi Merdeka Contest\"},\n    {\"id\": \"CA-QSO-PARTY\", \"name\": \"California QSO Party\"},\n    {\"id\": \"CIS-DX\", \"name\": \"CIS DX Contest\"},\n    {\"id\": \"CO-QSO-PARTY\", \"name\": \"Colorado QSO Party\"},\n    {\"id\": \"CQ-160-CW\", \"name\": \"CQ WW 160 Meter DX Contest (CW)\"},\n    {\"id\": \"CQ-160-SSB\", \"name\": \"CQ WW 160 Meter DX Contest (SSB)\"},\n    {\"id\": \"CQ-M\", \"name\": \"CQ-M International DX Contest\"},\n    {\"id\": \"CQ-VHF\", \"name\": \"CQ World-Wide VHF Contest\"},\n    {\"id\": \"CQ-WPX-CW\", \"name\": \"CQ WW WPX Contest (CW)\"},\n    {\"id\": \"CQ-WPX-RTTY\", \"name\": \"CQ/RJ WW RTTY WPX Contest\"},\n    {\"id\": \"CQ-WPX-SSB\", \"name\": \"CQ WW WPX Contest (SSB)\"},\n    {\"id\": \"CQ-WW-CW\", \"name\": \"CQ WW DX Contest (CW)\"},\n    {\"id\": \"CQ-WW-RTTY\", \"name\": \"CQ/RJ WW RTTY DX Contest\"},\n    {\"id\": \"CQ-WW-SSB\", \"name\": \"CQ WW DX Contest (SSB)\"},\n    {\"id\": \"CT-QSO-PARTY\", \"name\": \"Connecticut QSO Party\"},\n    {\"id\": \"CVA-DX-CW\", \"name\": \"Concurso Verde e Amarelo DX CW Contest\"},\n    {\"id\": \"CVA-DX-SSB\", \"name\": \"Concurso Verde e Amarelo DX CW Contest\"},\n    {\"id\": \"CWOPS-CW-OPEN\", \"name\": \"CWops CW Open Competition\"},\n    {\"id\": \"CWOPS-CWT\", \"name\": \"CWops Mini-CWT Test\"},\n    {\"id\": \"DARC-10\", \"name\": \"DARC 10m Contest\"},\n    {\"id\": \"DARC-CWA\", \"name\": \"DARC CW Trainee Contest\"},\n    {\"id\": \"DARC-FT4\", \"name\": \"DARC FT4 Contest\"},\n    {\"id\": \"DARC-HELL\", \"name\": \"DARC Hell Contest\"},\n    {\"id\": \"DARC-MICROWAVE\", \"name\": \"DARC Microwave Contest\"},\n    {\"id\": \"DARC-TRAINEE\", \"name\": \"DARC Trainee Contest\"},\n    {\"id\": \"DARC-UKW-SPRING\", \"name\": \"DARC UKW Spring Contest\"},\n    {\"id\": \"DARC-UKW-FIELD-DAY\", \"name\": \"DARC UKW Summer Contest\"},\n    {\"id\": \"DARC-VHF-UHF-MICROWAVE\", \"name\": \"DARC VHF-, UHF-, Microwave Contest (May)\"},\n    {\"id\": \"DARC-WAEDC-CW\", \"name\": \"WAE DX Contest (CW)\"},\n    {\"id\": \"DARC-WAEDC-RTTY\", \"name\": \"WAE DX Contest (RTTY)\"},\n    {\"id\": \"DARC-WAEDC-SSB\", \"name\": \"WAE DX Contest (SSB)\"},\n    {\"id\": \"DARC-WAG\", \"name\": \"DARC Worked All Germany\"},\n    {\"id\": \"DE-QSO-PARTY\", \"name\": \"Delaware QSO Party\"},\n    {\"id\": \"DL-DX-RTTY\", \"name\": \"DL-DX RTTY Contest\"},\n    {\"id\": \"DMC-RTTY\", \"name\": \"DMC RTTY Contest\"},\n    {\"id\": \"EA-CNCW\", \"name\": \"Concurso Nacional de Telegrafía\"},\n    {\"id\": \"EA-DME\", \"name\": \"Municipios Españoles\"},\n    {\"id\": \"EA-PSK63\", \"name\": \"EA PSK63\"},\n    {\"id\": \"EA-SMRE-CW\", \"name\": \"Su Majestad El Rey de España - CW\"},\n    {\"id\": \"EA-SMRE-SSB\", \"name\": \"Su Majestad El Rey de España - SSB\"},\n    {\"id\": \"EA-VHF-ATLANTIC\", \"name\": \"Atlántico V-UHF\"},\n    {\"id\": \"EA-VHF-COM\", \"name\": \"Combinado de V-UHF\"},\n    {\"id\": \"EA-VHF-COSTA-SOL\", \"name\": \"Costa del Sol V-UHF\"},\n    {\"id\": \"EA-VHF-EA\", \"name\": \"Nacional VHF\"},\n    {\"id\": \"EA-VHF-EA1RCS\", \"name\": \"Segovia EA1RCS V-UHF\"},\n    {\"id\": \"EA-VHF-QSL\", \"name\": \"QSL V-UHF & 50MHz\"},\n    {\"id\": \"EA-VHF-SADURNI\", \"name\": \"Sant Sadurni V-UHF\"},\n    {\"id\": \"EA-WW-RTTY\", \"name\": \"Unión de Radioaficionados Españoles RTTY Contest\"},\n    {\"id\": \"EASTER\", \"name\": \"DARC Easter Contest\"},\n    {\"id\": \"EPC-PSK63\", \"name\": \"PSK63 QSO Party\"},\n    {\"id\": \"EU Sprint\", \"name\": \"EU Sprint\"},\n    {\"id\": \"EU-HF\", \"name\": \"EU HF Championship\"},\n    {\"id\": \"EU-PSK-DX\", \"name\": \"EU PSK DX Contest\"},\n    {\"id\": \"EUCW160M\", \"name\": \"European CW Association 160m CW Party\"},\n    {\"id\": \"FALL SPRINT\", \"name\": \"FISTS Fall Sprint\"},\n    {\"id\": \"FL-QSO-PARTY\", \"name\": \"Florida QSO Party\"},\n    {\"id\": \"GA-QSO-PARTY\", \"name\": \"Georgia QSO Party\"},\n    {\"id\": \"HA-DX\", \"name\": \"Hungarian DX Contest\"},\n    {\"id\": \"HELVETIA\", \"name\": \"Helvetia Contest\"},\n    {\"id\": \"HI-QSO-PARTY\", \"name\": \"Hawaiian QSO Party\"},\n    {\"id\": \"HOLYLAND\", \"name\": \"IARC Holyland Contest\"},\n    {\"id\": \"IA-QSO-PARTY\", \"name\": \"Iowa QSO Party\"},\n    {\"id\": \"IARU-FIELD-DAY\", \"name\": \"DARC IARU Region 1 Field Day\"},\n    {\"id\": \"IARU-HF\", \"name\": \"IARU HF World Championship\"},\n    {\"id\": \"ID-QSO-PARTY\", \"name\": \"Idaho QSO Party\"},\n    {\"id\": \"IL QSO Party\", \"name\": \"Illinois QSO Party\"},\n    {\"id\": \"IN-QSO-PARTY\", \"name\": \"Indiana QSO Party\"},\n    {\"id\": \"JARTS-WW-RTTY\", \"name\": \"JARTS WW RTTY\"},\n    {\"id\": \"JIDX-CW\", \"name\": \"Japan International DX Contest (CW)\"},\n    {\"id\": \"JIDX-SSB\", \"name\": \"Japan International DX Contest (SSB)\"},\n    {\"id\": \"JT-DX-RTTY\", \"name\": \"Mongolian RTTY DX Contest\"},\n    {\"id\": \"K1USN-SSO\", \"name\": \"K1USN Slow Speed Open\"},\n    {\"id\": \"KS-QSO-PARTY\", \"name\": \"Kansas QSO Party\"},\n    {\"id\": \"KY-QSO-PARTY\", \"name\": \"Kentucky QSO Party\"},\n    {\"id\": \"LA-QSO-PARTY\", \"name\": \"Louisiana QSO Party\"},\n    {\"id\": \"LDC-RTTY\", \"name\": \"DRCG Long Distance Contest (RTTY)\"},\n    {\"id\": \"LZ DX\", \"name\": \"LZ DX Contest\"},\n    {\"id\": \"MAR-QSO-PARTY\", \"name\": \"Maritimes QSO Party\"},\n    {\"id\": \"MD-QSO-PARTY\", \"name\": \"Maryland QSO Party\"},\n    {\"id\": \"ME-QSO-PARTY\", \"name\": \"Maine QSO Party\"},\n    {\"id\": \"MI-QSO-PARTY\", \"name\": \"Michigan QSO Party\"},\n    {\"id\": \"MIDATLANTIC-QSO-PARTY\", \"name\": \"Mid-Atlantic QSO Party\"},\n    {\"id\": \"MN-QSO-PARTY\", \"name\": \"Minnesota QSO Party\"},\n    {\"id\": \"MO-QSO-PARTY\", \"name\": \"Missouri QSO Party\"},\n    {\"id\": \"MS-QSO-PARTY\", \"name\": \"Mississippi QSO Party\"},\n    {\"id\": \"MT-QSO-PARTY\", \"name\": \"Montana QSO Party\"},\n    {\"id\": \"NA-SPRINT-CW\", \"name\": \"North America Sprint (CW)\"},\n    {\"id\": \"NA-SPRINT-RTTY\", \"name\": \"North America Sprint (RTTY)\"},\n    {\"id\": \"NA-SPRINT-SSB\", \"name\": \"North America Sprint (Phone)\"},\n    {\"id\": \"NAQP-CW\", \"name\": \"North America QSO Party (CW)\"},\n    {\"id\": \"NAQP-RTTY\", \"name\": \"North America QSO Party (RTTY)\"},\n    {\"id\": \"NAQP-SSB\", \"name\": \"North America QSO Party (Phone)\"},\n    {\"id\": \"NAVAL\", \"name\": \"International Naval Contest (INC)\"},\n    {\"id\": \"NC-QSO-PARTY\", \"name\": \"North Carolina QSO Party\"},\n    {\"id\": \"ND-QSO-PARTY\", \"name\": \"North Dakota QSO Party\"},\n    {\"id\": \"NE-QSO-PARTY\", \"name\": \"Nebraska QSO Party\"},\n    {\"id\": \"NEQP\", \"name\": \"New England QSO Party\"},\n    {\"id\": \"NH-QSO-PARTY\", \"name\": \"New Hampshire QSO Party\"},\n    {\"id\": \"NJ-QSO-PARTY\", \"name\": \"New Jersey QSO Party\"},\n    {\"id\": \"NM-QSO-PARTY\", \"name\": \"New Mexico QSO Party\"},\n    {\"id\": \"NRAU-BALTIC-CW\", \"name\": \"NRAU-Baltic Contest (CW)\"},\n    {\"id\": \"NRAU-BALTIC-SSB\", \"name\": \"NRAU-Baltic Contest (SSB)\"},\n    {\"id\": \"NV-QSO-PARTY\", \"name\": \"Nevada QSO Party\"},\n    {\"id\": \"NY-QSO-PARTY\", \"name\": \"New York QSO Party\"},\n    {\"id\": \"OCEANIA-DX-CW\", \"name\": \"Oceania DX Contest (CW)\"},\n    {\"id\": \"OCEANIA-DX-SSB\", \"name\": \"Oceania DX Contest (SSB)\"},\n    {\"id\": \"OH-QSO-PARTY\", \"name\": \"Ohio QSO Party\"},\n    {\"id\": \"OK-DX-RTTY\", \"name\": \"Czech Radio Club OK DX Contest\"},\n    {\"id\": \"OK-OM-DX\", \"name\": \"Czech Radio Club OK-OM DX Contest\"},\n    {\"id\": \"OK-QSO-PARTY\", \"name\": \"Oklahoma QSO Party\"},\n    {\"id\": \"OMISS-QSO-PARTY\", \"name\": \"Old Man International Sideband Society QSO Party\"},\n    {\"id\": \"ON-QSO-PARTY\", \"name\": \"Ontario QSO Party\"},\n    {\"id\": \"OR-QSO-PARTY\", \"name\": \"Oregon QSO Party\"},\n    {\"id\": \"ORARI-DX\", \"name\": \"ORARI DX Contest\"},\n    {\"id\": \"PA-QSO-PARTY\", \"name\": \"Pennsylvania QSO Party\"},\n    {\"id\": \"PACC\", \"name\": \"Dutch PACC Contest\"},\n    {\"id\": \"PCC\", \"name\": \"PCC Pro CW Contest\"},\n    {\"id\": \"QC-QSO-PARTY\", \"name\": \"Quebec QSO Party\"},\n    {\"id\": \"RAC-CANADA-DAY\", \"name\": \"RAC Canada Day Contest\"},\n    {\"id\": \"RAC-CANADA-WINTER\", \"name\": \"RAC Canada Winter Contest\"},\n    {\"id\": \"RDAC\", \"name\": \"Russian District Award Contest\"},\n    {\"id\": \"RDXC\", \"name\": \"Russian DX Contest\"},\n    {\"id\": \"REF-160M\", \"name\": \"Reseau des Emetteurs Francais 160m Contest\"},\n    {\"id\": \"REF-CW\", \"name\": \"Reseau des Emetteurs Francais Contest (CW)\"},\n    {\"id\": \"REF-SSB\", \"name\": \"Reseau des Emetteurs Francais Contest (SSB)\"},\n    {\"id\": \"REP-PORTUGAL-DAY-HF\", \"name\": \"Rede dos Emissores Portugueses Portugal Day HF Contest\"},\n    {\"id\": \"RI-QSO-PARTY\", \"name\": \"Rhode Island QSO Party\"},\n    {\"id\": \"RSGB-160\", \"name\": \"1.8MHz Contest\"},\n    {\"id\": \"RSGB-21/28-CW\", \"name\": \"21/28 MHz Contest (CW)\"},\n    {\"id\": \"RSGB-21/28-SSB\", \"name\": \"21/28 MHz Contest (SSB)\"},\n    {\"id\": \"RSGB-80M-CC\", \"name\": \"80m Club Championships\"},\n    {\"id\": \"RSGB-AFS-CW\", \"name\": \"Affiliated Societies Team Contest (CW)\"},\n    {\"id\": \"RSGB-AFS-SSB\", \"name\": \"Affiliated Societies Team Contest (SSB)\"},\n    {\"id\": \"RSGB-CLUB-CALLS\", \"name\": \"Club Calls\"},\n    {\"id\": \"RSGB-COMMONWEALTH\", \"name\": \"Commonwealth Contest\"},\n    {\"id\": \"RSGB-IOTA\", \"name\": \"IOTA Contest\"},\n    {\"id\": \"RSGB-LOW-POWER\", \"name\": \"Low Power Field Day\"},\n    {\"id\": \"RSGB-NFD\", \"name\": \"National Field Day\"},\n    {\"id\": \"RSGB-ROPOCO\", \"name\": \"RoPoCo\"},\n    {\"id\": \"RSGB-SSB-FD\", \"name\": \"SSB Field Day\"},\n    {\"id\": \"RUSSIAN-RTTY\", \"name\": \"Russian Radio RTTY Worldwide Contest\"},\n    {\"id\": \"SAC-CW\", \"name\": \"Scandinavian Activity Contest (CW)\"},\n    {\"id\": \"SAC-SSB\", \"name\": \"Scandinavian Activity Contest (SSB)\"},\n    {\"id\": \"SARTG-RTTY\", \"name\": \"SARTG WW RTTY\"},\n    {\"id\": \"SC-QSO-PARTY\", \"name\": \"South Carolina QSO Party\"},\n    {\"id\": \"SCC-RTTY\", \"name\": \"SCC RTTY Championship\"},\n    {\"id\": \"SD-QSO-PARTY\", \"name\": \"South Dakota QSO Party\"},\n    {\"id\": \"ShortRY\", \"name\": \"DARC RTTY Short Contest\"},\n    {\"id\": \"SMP-AUG\", \"name\": \"SSA Portabeltest\"},\n    {\"id\": \"SMP-MAY\", \"name\": \"SSA Portabeltest\"},\n    {\"id\": \"SP-DX-RTTY\", \"name\": \"PRC SPDX Contest (RTTY)\"},\n    {\"id\": \"SPAR-WINTER-FD\", \"name\": \"SPAR Winter Field Day\"},\n    {\"id\": \"SPDXContest\", \"name\": \"SP DX Contest\"},\n    {\"id\": \"SPRING SPRINT\", \"name\": \"FISTS Spring Sprint\"},\n    {\"id\": \"SR-MARATHON\", \"name\": \"Scottish-Russian Marathon\"},\n    {\"id\": \"STEW-PERRY\", \"name\": \"Stew Perry Topband Distance Challenge\"},\n    {\"id\": \"SUMMER SPRINT\", \"name\": \"FISTS Summer Sprint\"},\n    {\"id\": \"TARA-GRID-DIP\", \"name\": \"TARA Grid Dip PSK-RTTY Shindig\"},\n    {\"id\": \"TARA-RTTY\", \"name\": \"TARA RTTY Mêlée\"},\n    {\"id\": \"TARA-RUMBLE\", \"name\": \"TARA Rumble PSK Contest\"},\n    {\"id\": \"TARA-SKIRMISH\", \"name\": \"TARA Skirmish Digital Prefix Contest\"},\n    {\"id\": \"TMC-RTTY\", \"name\": \"The Makrothen Contest\"},\n    {\"id\": \"TN-QSO-PARTY\", \"name\": \"Tennessee QSO Party\"},\n    {\"id\": \"TX-QSO-PARTY\", \"name\": \"Texas QSO Party\"},\n    {\"id\": \"UBA-DX-CW\", \"name\": \"UBA Contest (CW)\"},\n    {\"id\": \"UBA-DX-SSB\", \"name\": \"UBA Contest (SSB)\"},\n    {\"id\": \"UK-DX-BPSK63\", \"name\": \"European PSK Club BPSK63 Contest\"},\n    {\"id\": \"UK-DX-RTTY\", \"name\": \"UK DX RTTY Contest\"},\n    {\"id\": \"UKR-CHAMP-RTTY\", \"name\": \"Open Ukraine RTTY Championship\"},\n    {\"id\": \"UKRAINIAN DX\", \"name\": \"Ukrainian DX\"},\n    {\"id\": \"UKSMG-6M-MARATHON\", \"name\": \"UKSMG 6m Marathon\"},\n    {\"id\": \"UKSMG-SUMMER-ES\", \"name\": \"UKSMG Summer Es Contest\"},\n    {\"id\": \"US-COUNTIES-QSO\", \"name\": \"Mobile Amateur Awards Club\"},\n    {\"id\": \"UT-QSO-PARTY\", \"name\": \"Utah QSO Party\"},\n    {\"id\": \"VA-QSO-PARTY\", \"name\": \"Virginia QSO Party\"},\n    {\"id\": \"VENEZ-IND-DAY\", \"name\": \"RCV Venezuelan Independence Day Contest\"},\n    {\"id\": \"VIRGINIA QSO PARTY (import-only)\", \"name\": \"Virginia QSO Party\"},\n    {\"id\": \"VOLTA-RTTY\", \"name\": \"Alessandro Volta RTTY DX Contest\"},\n    {\"id\": \"WA-QSO-PARTY\", \"name\": \"Washington QSO Party\"},\n    {\"id\": \"WI-QSO-PARTY\", \"name\": \"Wisconsin QSO Party\"},\n    {\"id\": \"WIA-HARRY ANGEL\", \"name\": \"WIA Harry Angel Memorial 80m Sprint\"},\n    {\"id\": \"WIA-JMMFD\", \"name\": \"WIA John Moyle Memorial Field Day\"},\n    {\"id\": \"WIA-OCDX\", \"name\": \"WIA Oceania DX (OCDX) Contest\"},\n    {\"id\": \"WIA-REMEMBRANCE\", \"name\": \"WIA Remembrance Day\"},\n    {\"id\": \"WIA-ROSS HULL\", \"name\": \"WIA Ross Hull Memorial VHF/UHF Contest\"},\n    {\"id\": \"WIA-TRANS TASMAN\", \"name\": \"WIA Trans Tasman Low Bands Challenge\"},\n    {\"id\": \"WIA-VHF/UHF FD\", \"name\": \"WIA VHF UHF Field Days\"},\n    {\"id\": \"WIA-VK SHIRES\", \"name\": \"WIA VK Shires\"},\n    {\"id\": \"WINTER SPRINT\", \"name\": \"FISTS Winter Sprint\"},\n    {\"id\": \"WV-QSO-PARTY\", \"name\": \"West Virginia QSO Party\"},\n    {\"id\": \"WY-QSO-PARTY\", \"name\": \"Wyoming QSO Party\"},\n    {\"id\": \"XE-INTL-RTTY\", \"name\": \"Mexico International Contest (RTTY)\"},\n    {\"id\": \"YOHFDX\", \"name\": \"YODX HF contest\"},\n    {\"id\": \"YUDXC\", \"name\": \"YU DX Contest\"}\n]\n"
  },
  {
    "path": "res/data/dxcc.json",
    "content": "[\n    {\"id\":1,\"name\":\"Canada\",\"cqz\":5,\"ituz\":9,\"flag\":\"CA\"},\n    {\"id\":2,\"name\":\"Abu Ail Is.\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":3,\"name\":\"Afghanistan\",\"cqz\":21,\"ituz\":40,\"flag\":\"AF\"},\n    {\"id\":4,\"name\":\"Agalega & St. Brandon\",\"cqz\":39,\"ituz\":53,\"flag\":\"MP\"},\n    {\"id\":5,\"name\":\"Aland Islands\",\"cqz\":15,\"ituz\":18,\"flag\":\"AX\"},\n    {\"id\":6,\"name\":\"Alaska\",\"cqz\":1,\"ituz\":1,\"flag\":\"US\"},\n    {\"id\":7,\"name\":\"Albania\",\"cqz\":15,\"ituz\":28,\"flag\":\"AL\"},\n    {\"id\":8,\"name\":\"Aldabra\",\"cqz\":39,\"ituz\":53,\"flag\":\"SC\"},\n    {\"id\":9,\"name\":\"American Samoa\",\"cqz\":32,\"ituz\":62,\"flag\":\"AS\"},\n    {\"id\":10,\"name\":\"Amsterdam & St. Paul Is.\",\"cqz\":39,\"ituz\":68,\"flag\":\"FR\"},\n    {\"id\":11,\"name\":\"Andaman & Nicobar Is.\",\"cqz\":26,\"ituz\":49,\"flag\":\"IN\"},\n    {\"id\":12,\"name\":\"Anguilla\",\"cqz\":8,\"ituz\":11,\"flag\":\"AI\"},\n    {\"id\":13,\"name\":\"Antarctica\",\"cqz\":13,\"ituz\":74,\"flag\":\"AQ\"},\n    {\"id\":14,\"name\":\"Armenia\",\"cqz\":21,\"ituz\":29,\"flag\":\"AM\"},\n    {\"id\":15,\"name\":\"Asiatic Russia\",\"cqz\":17,\"ituz\":30,\"flag\":\"RU\"},\n    {\"id\":16,\"name\":\"N.Z. Subantarctic Is.\",\"cqz\":32,\"ituz\":60,\"flag\":\"NZ\"},\n    {\"id\":17,\"name\":\"Aves Island\",\"cqz\":8,\"ituz\":11,\"flag\":\"VE\"},\n    {\"id\":18,\"name\":\"Azerbaijan\",\"cqz\":21,\"ituz\":29,\"flag\":\"AZ\"},\n    {\"id\":19,\"name\":\"Bajo Nuevo\",\"cqz\":8,\"ituz\":11,\"flag\":\"CO\"},\n    {\"id\":20,\"name\":\"Baker & Howland Islands\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":21,\"name\":\"Balearic Islands\",\"cqz\":14,\"ituz\":37,\"flag\":\"ES\"},\n    {\"id\":22,\"name\":\"Palau\",\"cqz\":27,\"ituz\":64,\"flag\":\"PW\"},\n    {\"id\":23,\"name\":\"Blenheim Reef\",\"cqz\":39,\"ituz\":41,\"flag\":\"MU\"},\n    {\"id\":24,\"name\":\"Bouvet\",\"cqz\":38,\"ituz\":67,\"flag\":\"NO\"},\n    {\"id\":25,\"name\":\"British North Borneo\",\"cqz\":28,\"ituz\":54,\"flag\":\"GB\"},\n    {\"id\":26,\"name\":\"British Somaliland\",\"cqz\":37,\"ituz\":48,\"flag\":\"GB\"},\n    {\"id\":27,\"name\":\"Belarus\",\"cqz\":16,\"ituz\":29,\"flag\":\"BY\"},\n    {\"id\":28,\"name\":\"Canal Zone\",\"cqz\":7,\"ituz\":11,\"flag\":null},\n    {\"id\":29,\"name\":\"Canary Islands\",\"cqz\":33,\"ituz\":36,\"flag\":\"IC\"},\n    {\"id\":30,\"name\":\"Celebe & Molucca Is.\",\"cqz\":28,\"ituz\":54,\"flag\":\"ID\"},\n    {\"id\":31,\"name\":\"Central Kiribati\",\"cqz\":31,\"ituz\":62,\"flag\":\"KI\"},\n    {\"id\":32,\"name\":\"Ceuta & Melilla\",\"cqz\":33,\"ituz\":37,\"flag\":\"ES\"},\n    {\"id\":33,\"name\":\"Chagos Islands\",\"cqz\":39,\"ituz\":41,\"flag\":\"GB\"},\n    {\"id\":34,\"name\":\"Chatham Islands\",\"cqz\":32,\"ituz\":60,\"flag\":\"NZ\"},\n    {\"id\":35,\"name\":\"Christmas Island\",\"cqz\":29,\"ituz\":54,\"flag\":\"CX\"},\n    {\"id\":36,\"name\":\"Clipperton Island\",\"cqz\":7,\"ituz\":10,\"flag\":\"FR\"},\n    {\"id\":37,\"name\":\"Cocos Island\",\"cqz\":7,\"ituz\":11,\"flag\":\"CR\"},\n    {\"id\":38,\"name\":\"Cocos (Keeling) Islands\",\"cqz\":29,\"ituz\":54,\"flag\":\"CC\"},\n    {\"id\":39,\"name\":\"Comoros\",\"cqz\":39,\"ituz\":53,\"flag\":null},\n    {\"id\":40,\"name\":\"Crete\",\"cqz\":20,\"ituz\":28,\"flag\":\"GR\"},\n    {\"id\":41,\"name\":\"Crozet Island\",\"cqz\":39,\"ituz\":68,\"flag\":\"FR\"},\n    {\"id\":42,\"name\":\"Damao Diu\",\"cqz\":22,\"ituz\":41,\"flag\":null},\n    {\"id\":43,\"name\":\"Desecheo Island\",\"cqz\":8,\"ituz\":11,\"flag\":\"PR\"},\n    {\"id\":44,\"name\":\"Desroches\",\"cqz\":39,\"ituz\":53,\"flag\":null},\n    {\"id\":45,\"name\":\"Dodecanese\",\"cqz\":20,\"ituz\":28,\"flag\":\"GR\"},\n    {\"id\":46,\"name\":\"East Malaysia\",\"cqz\":28,\"ituz\":54,\"flag\":\"MY\"},\n    {\"id\":47,\"name\":\"Easter Island\",\"cqz\":12,\"ituz\":63,\"flag\":\"CL\"},\n    {\"id\":48,\"name\":\"Eastern Kiribati\",\"cqz\":31,\"ituz\":61,\"flag\":\"KI\"},\n    {\"id\":49,\"name\":\"Equatorial Guinea\",\"cqz\":36,\"ituz\":47,\"flag\":\"GQ\"},\n    {\"id\":50,\"name\":\"Mexico\",\"cqz\":6,\"ituz\":10,\"flag\":\"MX\"},\n    {\"id\":51,\"name\":\"Eritrea\",\"cqz\":37,\"ituz\":48,\"flag\":\"ER\"},\n    {\"id\":52,\"name\":\"Estonia\",\"cqz\":15,\"ituz\":29,\"flag\":\"EE\"},\n    {\"id\":53,\"name\":\"Ethiopia\",\"cqz\":37,\"ituz\":48,\"flag\":\"ET\"},\n    {\"id\":54,\"name\":\"European Russia\",\"cqz\":16,\"ituz\":29,\"flag\":\"RU\"},\n    {\"id\":55,\"name\":\"Farquhar\",\"cqz\":39,\"ituz\":53,\"flag\":\"SC\"},\n    {\"id\":56,\"name\":\"Fernando de Noronha\",\"cqz\":11,\"ituz\":13,\"flag\":\"BR\"},\n    {\"id\":57,\"name\":\"Fr. Equatorial Africa\",\"cqz\":36,\"ituz\":47,\"flag\":\"FR\"},\n    {\"id\":58,\"name\":\"French Indo-China\",\"cqz\":26,\"ituz\":49,\"flag\":\"FR\"},\n    {\"id\":59,\"name\":\"French West Africa\",\"cqz\":35,\"ituz\":46,\"flag\":\"FR\"},\n    {\"id\":60,\"name\":\"Bahamas\",\"cqz\":8,\"ituz\":11,\"flag\":\"BS\"},\n    {\"id\":61,\"name\":\"Franz Josef Land\",\"cqz\":40,\"ituz\":75,\"flag\":\"RU\"},\n    {\"id\":62,\"name\":\"Barbados\",\"cqz\":8,\"ituz\":11,\"flag\":\"BB\"},\n    {\"id\":63,\"name\":\"French Guiana\",\"cqz\":9,\"ituz\":12,\"flag\":\"FR\"},\n    {\"id\":64,\"name\":\"Bermuda\",\"cqz\":5,\"ituz\":11,\"flag\":\"BM\"},\n    {\"id\":65,\"name\":\"British Virgin Islands\",\"cqz\":8,\"ituz\":11,\"flag\":\"VG\"},\n    {\"id\":66,\"name\":\"Belize\",\"cqz\":7,\"ituz\":11,\"flag\":\"BZ\"},\n    {\"id\":67,\"name\":\"French India\",\"cqz\":22,\"ituz\":41,\"flag\":\"FR\"},\n    {\"id\":68,\"name\":\"Kuwait/Saudi Arabia Neut. Zone\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":69,\"name\":\"Cayman Islands\",\"cqz\":8,\"ituz\":11,\"flag\":\"KY\"},\n    {\"id\":70,\"name\":\"Cuba\",\"cqz\":8,\"ituz\":11,\"flag\":\"CU\"},\n    {\"id\":71,\"name\":\"Galapagos Islands\",\"cqz\":10,\"ituz\":12,\"flag\":\"EC\"},\n    {\"id\":72,\"name\":\"Dominican Republic\",\"cqz\":8,\"ituz\":11,\"flag\":\"DO\"},\n    {\"id\":74,\"name\":\"El Salvador\",\"cqz\":7,\"ituz\":11,\"flag\":\"SV\"},\n    {\"id\":75,\"name\":\"Georgia\",\"cqz\":21,\"ituz\":29,\"flag\":\"GE\"},\n    {\"id\":76,\"name\":\"Guatemala\",\"cqz\":7,\"ituz\":11,\"flag\":\"GT\"},\n    {\"id\":77,\"name\":\"Grenada\",\"cqz\":8,\"ituz\":11,\"flag\":\"GD\"},\n    {\"id\":78,\"name\":\"Haiti\",\"cqz\":8,\"ituz\":11,\"flag\":\"HT\"},\n    {\"id\":79,\"name\":\"Guadeloupe\",\"cqz\":8,\"ituz\":11,\"flag\":\"FR\"},\n    {\"id\":80,\"name\":\"Honduras\",\"cqz\":7,\"ituz\":11,\"flag\":\"HN\"},\n    {\"id\":81,\"name\":\"Germany\",\"cqz\":14,\"ituz\":28,\"flag\":\"DE\"},\n    {\"id\":82,\"name\":\"Jamaica\",\"cqz\":8,\"ituz\":11,\"flag\":\"JM\"},\n    {\"id\":84,\"name\":\"Martinique\",\"cqz\":8,\"ituz\":11,\"flag\":\"MQ\"},\n    {\"id\":85,\"name\":\"Bonaire Curacao (Neth Antilles)\",\"cqz\":9,\"ituz\":11,\"flag\":null},\n    {\"id\":86,\"name\":\"Nicaragua\",\"cqz\":7,\"ituz\":11,\"flag\":\"NI\"},\n    {\"id\":88,\"name\":\"Panama\",\"cqz\":7,\"ituz\":11,\"flag\":\"PA\"},\n    {\"id\":89,\"name\":\"Turks & Caicos Islands\",\"cqz\":8,\"ituz\":11,\"flag\":\"TC\"},\n    {\"id\":90,\"name\":\"Trinidad & Tobago\",\"cqz\":9,\"ituz\":11,\"flag\":\"TT\"},\n    {\"id\":91,\"name\":\"Aruba\",\"cqz\":9,\"ituz\":11,\"flag\":\"AW\"},\n    {\"id\":93,\"name\":\"Geyser Reef\",\"cqz\":39,\"ituz\":53,\"flag\":null},\n    {\"id\":94,\"name\":\"Antigua & Barbuda\",\"cqz\":8,\"ituz\":11,\"flag\":\"AG\"},\n    {\"id\":95,\"name\":\"Dominica\",\"cqz\":8,\"ituz\":11,\"flag\":\"DM\"},\n    {\"id\":96,\"name\":\"Montserrat\",\"cqz\":8,\"ituz\":11,\"flag\":\"MS\"},\n    {\"id\":97,\"name\":\"St. Lucia\",\"cqz\":8,\"ituz\":11,\"flag\":\"LC\"},\n    {\"id\":98,\"name\":\"St. Vincent\",\"cqz\":8,\"ituz\":11,\"flag\":\"VC\"},\n    {\"id\":99,\"name\":\"Glorioso Islands\",\"cqz\":39,\"ituz\":53,\"flag\":\"FR\"},\n    {\"id\":100,\"name\":\"Argentina\",\"cqz\":13,\"ituz\":14,\"flag\":\"AR\"},\n    {\"id\":101,\"name\":\"Goa\",\"cqz\":22,\"ituz\":41,\"flag\":null},\n    {\"id\":102,\"name\":\"Gold Coast Togoland\",\"cqz\":35,\"ituz\":46,\"flag\":null},\n    {\"id\":103,\"name\":\"Guam\",\"cqz\":27,\"ituz\":64,\"flag\":\"GU\"},\n    {\"id\":104,\"name\":\"Bolivia\",\"cqz\":10,\"ituz\":12,\"flag\":\"BO\"},\n    {\"id\":105,\"name\":\"Guantanamo Bay\",\"cqz\":8,\"ituz\":11,\"flag\":\"US\"},\n    {\"id\":106,\"name\":\"Guernsey\",\"cqz\":14,\"ituz\":27,\"flag\":\"GG\"},\n    {\"id\":107,\"name\":\"Guinea\",\"cqz\":35,\"ituz\":46,\"flag\":\"GN\"},\n    {\"id\":108,\"name\":\"Brazil\",\"cqz\":11,\"ituz\":15,\"flag\":\"BR\"},\n    {\"id\":109,\"name\":\"Guinea-Bissau\",\"cqz\":35,\"ituz\":46,\"flag\":\"GW\"},\n    {\"id\":110,\"name\":\"Hawaii\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":111,\"name\":\"Heard Island\",\"cqz\":39,\"ituz\":68,\"flag\":\"AU\"},\n    {\"id\":112,\"name\":\"Chile\",\"cqz\":12,\"ituz\":14,\"flag\":\"CL\"},\n    {\"id\":113,\"name\":\"Ifni\",\"cqz\":33,\"ituz\":37,\"flag\":null},\n    {\"id\":114,\"name\":\"Isle of Man\",\"cqz\":14,\"ituz\":27,\"flag\":\"IM\"},\n    {\"id\":115,\"name\":\"Italian Somaliland\",\"cqz\":37,\"ituz\":48,\"flag\":\"IT\"},\n    {\"id\":116,\"name\":\"Colombia\",\"cqz\":9,\"ituz\":12,\"flag\":\"CO\"},\n    {\"id\":117,\"name\":\"ITU HQ\",\"cqz\":14,\"ituz\":28,\"flag\":\"CH\"},\n    {\"id\":118,\"name\":\"Jan Mayen\",\"cqz\":40,\"ituz\":18,\"flag\":\"NO\"},\n    {\"id\":119,\"name\":\"Java\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":120,\"name\":\"Ecuador\",\"cqz\":10,\"ituz\":12,\"flag\":\"EC\"},\n    {\"id\":122,\"name\":\"Jersey\",\"cqz\":14,\"ituz\":27,\"flag\":\"JE\"},\n    {\"id\":123,\"name\":\"Johnston Island\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":124,\"name\":\"Juan de Nova & Europa\",\"cqz\":39,\"ituz\":53,\"flag\":\"FR\"},\n    {\"id\":125,\"name\":\"Juan Fernandez Islands\",\"cqz\":12,\"ituz\":14,\"flag\":\"CL\"},\n    {\"id\":126,\"name\":\"Kaliningrad\",\"cqz\":15,\"ituz\":29,\"flag\":\"RU\"},\n    {\"id\":127,\"name\":\"Kamaran Is.\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":128,\"name\":\"Karelo-Finnish Rep.\",\"cqz\":16,\"ituz\":19,\"flag\":null},\n    {\"id\":129,\"name\":\"Guyana\",\"cqz\":9,\"ituz\":12,\"flag\":\"GY\"},\n    {\"id\":130,\"name\":\"Kazakhstan\",\"cqz\":17,\"ituz\":30,\"flag\":\"KZ\"},\n    {\"id\":131,\"name\":\"Kerguelen Islands\",\"cqz\":39,\"ituz\":68,\"flag\":\"FR\"},\n    {\"id\":132,\"name\":\"Paraguay\",\"cqz\":11,\"ituz\":14,\"flag\":\"PY\"},\n    {\"id\":133,\"name\":\"Kermadec Islands\",\"cqz\":32,\"ituz\":60,\"flag\":\"NZ\"},\n    {\"id\":134,\"name\":\"Kingman Reef\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":135,\"name\":\"Kyrgyzstan\",\"cqz\":17,\"ituz\":30,\"flag\":\"KG\"},\n    {\"id\":136,\"name\":\"Peru\",\"cqz\":10,\"ituz\":12,\"flag\":\"PE\"},\n    {\"id\":137,\"name\":\"Republic of Korea\",\"cqz\":25,\"ituz\":44,\"flag\":\"KR\"},\n    {\"id\":138,\"name\":\"Kure Island\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":139,\"name\":\"Kuria Muria I.\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":140,\"name\":\"Suriname\",\"cqz\":9,\"ituz\":12,\"flag\":\"SR\"},\n    {\"id\":141,\"name\":\"Falkland Islands\",\"cqz\":13,\"ituz\":16,\"flag\":\"FK\"},\n    {\"id\":142,\"name\":\"Lakshadweep Islands\",\"cqz\":22,\"ituz\":41,\"flag\":\"IN\"},\n    {\"id\":143,\"name\":\"Laos\",\"cqz\":26,\"ituz\":49,\"flag\":\"LA\"},\n    {\"id\":144,\"name\":\"Uruguay\",\"cqz\":13,\"ituz\":14,\"flag\":\"UY\"},\n    {\"id\":145,\"name\":\"Latvia\",\"cqz\":15,\"ituz\":29,\"flag\":\"LV\"},\n    {\"id\":146,\"name\":\"Lithuania\",\"cqz\":15,\"ituz\":29,\"flag\":\"LT\"},\n    {\"id\":147,\"name\":\"Lord Howe Island\",\"cqz\":30,\"ituz\":60,\"flag\":\"AU\"},\n    {\"id\":148,\"name\":\"Venezuela\",\"cqz\":9,\"ituz\":12,\"flag\":\"VE\"},\n    {\"id\":149,\"name\":\"Azores\",\"cqz\":14,\"ituz\":36,\"flag\":\"PT\"},\n    {\"id\":150,\"name\":\"Australia\",\"cqz\":30,\"ituz\":59,\"flag\":\"AU\"},\n    {\"id\":151,\"name\":\"Malyj Vysotskij Island\",\"cqz\":16,\"ituz\":29,\"flag\":null},\n    {\"id\":152,\"name\":\"Macao\",\"cqz\":24,\"ituz\":44,\"flag\":\"MO\"},\n    {\"id\":153,\"name\":\"Macquarie Island\",\"cqz\":30,\"ituz\":60,\"flag\":\"AU\"},\n    {\"id\":154,\"name\":\"Yemen Arab Rep.\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":155,\"name\":\"Malaya\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":157,\"name\":\"Nauru\",\"cqz\":31,\"ituz\":65,\"flag\":\"NR\"},\n    {\"id\":158,\"name\":\"Vanuatu\",\"cqz\":32,\"ituz\":56,\"flag\":\"VU\"},\n    {\"id\":159,\"name\":\"Maldives\",\"cqz\":22,\"ituz\":41,\"flag\":\"MV\"},\n    {\"id\":160,\"name\":\"Tonga\",\"cqz\":32,\"ituz\":62,\"flag\":\"TO\"},\n    {\"id\":161,\"name\":\"Malpelo Island\",\"cqz\":9,\"ituz\":12,\"flag\":\"CO\"},\n    {\"id\":162,\"name\":\"New Caledonia\",\"cqz\":32,\"ituz\":56,\"flag\":\"NC\"},\n    {\"id\":163,\"name\":\"Papua New Guinea\",\"cqz\":28,\"ituz\":51,\"flag\":\"PG\"},\n    {\"id\":164,\"name\":\"Manchuria\",\"cqz\":24,\"ituz\":33,\"flag\":null},\n    {\"id\":165,\"name\":\"Mauritius\",\"cqz\":39,\"ituz\":53,\"flag\":\"MU\"},\n    {\"id\":166,\"name\":\"Mariana Islands\",\"cqz\":27,\"ituz\":64,\"flag\":\"US\"},\n    {\"id\":167,\"name\":\"Market Reef\",\"cqz\":15,\"ituz\":18,\"flag\":\"SE\"},\n    {\"id\":168,\"name\":\"Marshall Islands\",\"cqz\":31,\"ituz\":65,\"flag\":\"MH\"},\n    {\"id\":169,\"name\":\"Mayotte\",\"cqz\":39,\"ituz\":53,\"flag\":\"YT\"},\n    {\"id\":170,\"name\":\"New Zealand\",\"cqz\":32,\"ituz\":60,\"flag\":\"NZ\"},\n    {\"id\":171,\"name\":\"Mellish Reef\",\"cqz\":30,\"ituz\":56,\"flag\":\"AU\"},\n    {\"id\":172,\"name\":\"Pitcairn Island\",\"cqz\":32,\"ituz\":63,\"flag\":\"PN\"},\n    {\"id\":173,\"name\":\"Micronesia\",\"cqz\":27,\"ituz\":65,\"flag\":\"FM\"},\n    {\"id\":174,\"name\":\"Midway Island\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":175,\"name\":\"French Polynesia\",\"cqz\":32,\"ituz\":63,\"flag\":\"PF\"},\n    {\"id\":176,\"name\":\"Fiji\",\"cqz\":32,\"ituz\":56,\"flag\":\"FJ\"},\n    {\"id\":177,\"name\":\"Minami Torishima\",\"cqz\":27,\"ituz\":90,\"flag\":\"JP\"},\n    {\"id\":178,\"name\":\"Minerva Reef\",\"cqz\":32,\"ituz\":62,\"flag\":null},\n    {\"id\":179,\"name\":\"Moldova\",\"cqz\":16,\"ituz\":29,\"flag\":\"MD\"},\n    {\"id\":180,\"name\":\"Mount Athos\",\"cqz\":20,\"ituz\":28,\"flag\":\"GR\"},\n    {\"id\":181,\"name\":\"Mozambique\",\"cqz\":37,\"ituz\":53,\"flag\":\"MZ\"},\n    {\"id\":182,\"name\":\"Navassa Island\",\"cqz\":8,\"ituz\":11,\"flag\":\"US\"},\n    {\"id\":183,\"name\":\"Netherlands Borneo\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":184,\"name\":\"Netherlands N. Guinea\",\"cqz\":28,\"ituz\":51,\"flag\":null},\n    {\"id\":185,\"name\":\"Solomon Islands\",\"cqz\":28,\"ituz\":51,\"flag\":\"SB\"},\n    {\"id\":186,\"name\":\"Newfoundland Labrador\",\"cqz\":5,\"ituz\":9,\"flag\":null},\n    {\"id\":187,\"name\":\"Niger\",\"cqz\":35,\"ituz\":46,\"flag\":\"NE\"},\n    {\"id\":188,\"name\":\"Niue\",\"cqz\":32,\"ituz\":62,\"flag\":\"NU\"},\n    {\"id\":189,\"name\":\"Norfolk Island\",\"cqz\":32,\"ituz\":60,\"flag\":\"NF\"},\n    {\"id\":190,\"name\":\"Samoa\",\"cqz\":32,\"ituz\":62,\"flag\":\"WS\"},\n    {\"id\":191,\"name\":\"North Cook Islands\",\"cqz\":32,\"ituz\":62,\"flag\":\"NZ\"},\n    {\"id\":192,\"name\":\"Ogasawara\",\"cqz\":27,\"ituz\":45,\"flag\":\"JP\"},\n    {\"id\":193,\"name\":\"Okinawa (Ryukyu Is.)\",\"cqz\":25,\"ituz\":45,\"flag\":null},\n    {\"id\":194,\"name\":\"Okino Tori-shima\",\"cqz\":27,\"ituz\":45,\"flag\":null},\n    {\"id\":195,\"name\":\"Annobon Island\",\"cqz\":36,\"ituz\":52,\"flag\":\"GQ\"},\n    {\"id\":196,\"name\":\"Palestine\",\"cqz\":20,\"ituz\":39,\"flag\":null},\n    {\"id\":197,\"name\":\"Palmyra & Jarvis Islands\",\"cqz\":31,\"ituz\":61,\"flag\":\"US\"},\n    {\"id\":198,\"name\":\"Papua Territory\",\"cqz\":28,\"ituz\":51,\"flag\":null},\n    {\"id\":199,\"name\":\"Peter 1 Island\",\"cqz\":12,\"ituz\":72,\"flag\":\"NO\"},\n    {\"id\":200,\"name\":\"Portuguese Timor\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":201,\"name\":\"Pr. Edward & Marion Is.\",\"cqz\":38,\"ituz\":57,\"flag\":\"ZA\"},\n    {\"id\":202,\"name\":\"Puerto Rico\",\"cqz\":8,\"ituz\":11,\"flag\":\"PR\"},\n    {\"id\":203,\"name\":\"Andorra\",\"cqz\":14,\"ituz\":27,\"flag\":\"AD\"},\n    {\"id\":204,\"name\":\"Revillagigedo\",\"cqz\":6,\"ituz\":10,\"flag\":\"MX\"},\n    {\"id\":205,\"name\":\"Ascension Island\",\"cqz\":36,\"ituz\":66,\"flag\":\"GB\"},\n    {\"id\":206,\"name\":\"Austria\",\"cqz\":15,\"ituz\":28,\"flag\":\"AT\"},\n    {\"id\":207,\"name\":\"Rodriguez Island\",\"cqz\":39,\"ituz\":53,\"flag\":\"MU\"},\n    {\"id\":208,\"name\":\"Ruanda-Urundi\",\"cqz\":36,\"ituz\":52,\"flag\":null},\n    {\"id\":209,\"name\":\"Belgium\",\"cqz\":14,\"ituz\":27,\"flag\":\"BE\"},\n    {\"id\":210,\"name\":\"Saar\",\"cqz\":14,\"ituz\":28,\"flag\":null},\n    {\"id\":211,\"name\":\"Sable Island\",\"cqz\":5,\"ituz\":9,\"flag\":\"CA\"},\n    {\"id\":212,\"name\":\"Bulgaria\",\"cqz\":20,\"ituz\":28,\"flag\":\"BG\"},\n    {\"id\":213,\"name\":\"St. Martin\",\"cqz\":8,\"ituz\":11,\"flag\":\"FR\"},\n    {\"id\":214,\"name\":\"Corsica\",\"cqz\":15,\"ituz\":28,\"flag\":\"FR\"},\n    {\"id\":215,\"name\":\"Cyprus\",\"cqz\":20,\"ituz\":39,\"flag\":\"CY\"},\n    {\"id\":216,\"name\":\"San Andres & Providencia\",\"cqz\":7,\"ituz\":11,\"flag\":\"NI\"},\n    {\"id\":217,\"name\":\"San Felix & San Ambrosio\",\"cqz\":12,\"ituz\":14,\"flag\":\"CL\"},\n    {\"id\":218,\"name\":\"Czechoslovakia\",\"cqz\":15,\"ituz\":28,\"flag\":\"CZ\"},\n    {\"id\":219,\"name\":\"Sao Tome & Principe\",\"cqz\":36,\"ituz\":47,\"flag\":\"ST\"},\n    {\"id\":220,\"name\":\"Sarawak\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":221,\"name\":\"Denmark\",\"cqz\":14,\"ituz\":18,\"flag\":\"DK\"},\n    {\"id\":222,\"name\":\"Faroe Islands\",\"cqz\":14,\"ituz\":18,\"flag\":\"FO\"},\n    {\"id\":223,\"name\":\"England\",\"cqz\":14,\"ituz\":27,\"flag\":\"england\"},\n    {\"id\":224,\"name\":\"Finland\",\"cqz\":15,\"ituz\":18,\"flag\":\"FI\"},\n    {\"id\":225,\"name\":\"Sardinia\",\"cqz\":15,\"ituz\":28,\"flag\":\"IT\"},\n    {\"id\":226,\"name\":\"Saudi Arabia/Iraq Neut. Zone\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":227,\"name\":\"France\",\"cqz\":14,\"ituz\":27,\"flag\":\"FR\"},\n    {\"id\":228,\"name\":\"Serrana Bank & Roncador Cay\",\"cqz\":7,\"ituz\":11,\"flag\":null},\n    {\"id\":229,\"name\":\"German Dem. Rep.\",\"cqz\":14,\"ituz\":28,\"flag\":\"DE\"},\n    {\"id\":230,\"name\":\"Fed. Rep. of Germany\",\"cqz\":14,\"ituz\":28,\"flag\":\"DE\"},\n    {\"id\":231,\"name\":\"Sikkim\",\"cqz\":22,\"ituz\":41,\"flag\":null},\n    {\"id\":232,\"name\":\"Somalia\",\"cqz\":37,\"ituz\":48,\"flag\":\"SO\"},\n    {\"id\":233,\"name\":\"Gibraltar\",\"cqz\":14,\"ituz\":37,\"flag\":\"GI\"},\n    {\"id\":234,\"name\":\"South Cook Islands\",\"cqz\":32,\"ituz\":63,\"flag\":\"GS\"},\n    {\"id\":235,\"name\":\"South Georgia Island\",\"cqz\":13,\"ituz\":73,\"flag\":\"GS\"},\n    {\"id\":236,\"name\":\"Greece\",\"cqz\":20,\"ituz\":28,\"flag\":\"GR\"},\n    {\"id\":237,\"name\":\"Greenland\",\"cqz\":40,\"ituz\":5,\"flag\":\"GL\"},\n    {\"id\":238,\"name\":\"South Orkney Islands\",\"cqz\":13,\"ituz\":73,\"flag\":\"GB\"},\n    {\"id\":239,\"name\":\"Hungary\",\"cqz\":15,\"ituz\":28,\"flag\":\"HU\"},\n    {\"id\":240,\"name\":\"South Sandwich Islands\",\"cqz\":13,\"ituz\":73,\"flag\":\"GS\"},\n    {\"id\":241,\"name\":\"South Shetland Islands\",\"cqz\":13,\"ituz\":73,\"flag\":\"GB\"},\n    {\"id\":242,\"name\":\"Iceland\",\"cqz\":40,\"ituz\":17,\"flag\":\"IS\"},\n    {\"id\":243,\"name\":\"People's Dem. Rep. of Yemen\",\"cqz\":21,\"ituz\":39,\"flag\":null},\n    {\"id\":244,\"name\":\"Southern Sudan\",\"cqz\":34,\"ituz\":47,\"flag\":null},\n    {\"id\":245,\"name\":\"Ireland\",\"cqz\":14,\"ituz\":27,\"flag\":\"IE\"},\n    {\"id\":246,\"name\":\"Sov Mil Order of Malta\",\"cqz\":15,\"ituz\":28,\"flag\":\"MT\"},\n    {\"id\":247,\"name\":\"Spratly Islands\",\"cqz\":26,\"ituz\":50,\"flag\":\"PH\"},\n    {\"id\":248,\"name\":\"Italy\",\"cqz\":15,\"ituz\":28,\"flag\":\"IT\"},\n    {\"id\":249,\"name\":\"St. Kitts & Nevis\",\"cqz\":8,\"ituz\":11,\"flag\":\"KN\"},\n    {\"id\":250,\"name\":\"St. Helena\",\"cqz\":36,\"ituz\":66,\"flag\":\"SH\"},\n    {\"id\":251,\"name\":\"Liechtenstein\",\"cqz\":14,\"ituz\":28,\"flag\":\"LI\"},\n    {\"id\":252,\"name\":\"St. Paul Island\",\"cqz\":5,\"ituz\":9,\"flag\":\"CA\"},\n    {\"id\":253,\"name\":\"St. Peter & St. Paul\",\"cqz\":11,\"ituz\":13,\"flag\":\"BR\"},\n    {\"id\":254,\"name\":\"Luxembourg\",\"cqz\":14,\"ituz\":27,\"flag\":\"LU\"},\n    {\"id\":255,\"name\":\"Sint Maarten Saba St Eustatius\",\"cqz\":8,\"ituz\":11,\"flag\":\"NL\"},\n    {\"id\":256,\"name\":\"Madeira Islands\",\"cqz\":33,\"ituz\":36,\"flag\":\"PT\"},\n    {\"id\":257,\"name\":\"Malta\",\"cqz\":15,\"ituz\":28,\"flag\":\"MT\"},\n    {\"id\":258,\"name\":\"Sumatra\",\"cqz\":28,\"ituz\":54,\"flag\":null},\n    {\"id\":259,\"name\":\"Svalbard\",\"cqz\":40,\"ituz\":18,\"flag\":\"NO\"},\n    {\"id\":260,\"name\":\"Monaco\",\"cqz\":14,\"ituz\":27,\"flag\":\"MC\"},\n    {\"id\":261,\"name\":\"Swan Is.\",\"cqz\":7,\"ituz\":11,\"flag\":null},\n    {\"id\":262,\"name\":\"Tajikistan\",\"cqz\":17,\"ituz\":30,\"flag\":\"TJ\"},\n    {\"id\":263,\"name\":\"Netherlands\",\"cqz\":14,\"ituz\":27,\"flag\":\"NL\"},\n    {\"id\":264,\"name\":\"Tangier\",\"cqz\":33,\"ituz\":37,\"flag\":null},\n    {\"id\":265,\"name\":\"Northern Ireland\",\"cqz\":14,\"ituz\":27,\"flag\":\"GB\"},\n    {\"id\":266,\"name\":\"Norway\",\"cqz\":14,\"ituz\":18,\"flag\":\"NO\"},\n    {\"id\":267,\"name\":\"Terr. New Guinea\",\"cqz\":28,\"ituz\":51,\"flag\":null},\n    {\"id\":268,\"name\":\"Tibet\",\"cqz\":23,\"ituz\":41,\"flag\":null},\n    {\"id\":269,\"name\":\"Poland\",\"cqz\":15,\"ituz\":28,\"flag\":\"PL\"},\n    {\"id\":270,\"name\":\"Tokelau Islands\",\"cqz\":31,\"ituz\":62,\"flag\":\"TK\"},\n    {\"id\":271,\"name\":\"Trieste\",\"cqz\":15,\"ituz\":28,\"flag\":null},\n    {\"id\":272,\"name\":\"Portugal\",\"cqz\":14,\"ituz\":37,\"flag\":\"PT\"},\n    {\"id\":273,\"name\":\"Trindade & Martim Vaz\",\"cqz\":11,\"ituz\":15,\"flag\":\"BR\"},\n    {\"id\":274,\"name\":\"Tristan da Cunha & Gough Islands\",\"cqz\":38,\"ituz\":66,\"flag\":\"GB\"},\n    {\"id\":275,\"name\":\"Romania\",\"cqz\":20,\"ituz\":28,\"flag\":\"RO\"},\n    {\"id\":276,\"name\":\"Tromelin Island\",\"cqz\":39,\"ituz\":53,\"flag\":\"FR\"},\n    {\"id\":277,\"name\":\"St. Pierre & Miquelon\",\"cqz\":5,\"ituz\":9,\"flag\":\"CA\"},\n    {\"id\":278,\"name\":\"San Marino\",\"cqz\":15,\"ituz\":28,\"flag\":\"SM\"},\n    {\"id\":279,\"name\":\"Scotland\",\"cqz\":14,\"ituz\":27,\"flag\":\"scotland\"},\n    {\"id\":280,\"name\":\"Turkmenistan\",\"cqz\":17,\"ituz\":30,\"flag\":\"TM\"},\n    {\"id\":281,\"name\":\"Spain\",\"cqz\":14,\"ituz\":37,\"flag\":\"ES\"},\n    {\"id\":282,\"name\":\"Tuvalu\",\"cqz\":31,\"ituz\":65,\"flag\":\"TV\"},\n    {\"id\":283,\"name\":\"UK Base Areas on Cyprus\",\"cqz\":20,\"ituz\":39,\"flag\":\"CY\"},\n    {\"id\":284,\"name\":\"Sweden\",\"cqz\":14,\"ituz\":18,\"flag\":\"SE\"},\n    {\"id\":285,\"name\":\"US Virgin Islands\",\"cqz\":8,\"ituz\":11,\"flag\":\"VI\"},\n    {\"id\":286,\"name\":\"Uganda\",\"cqz\":37,\"ituz\":48,\"flag\":\"UG\"},\n    {\"id\":287,\"name\":\"Switzerland\",\"cqz\":14,\"ituz\":28,\"flag\":\"CH\"},\n    {\"id\":288,\"name\":\"Ukraine\",\"cqz\":16,\"ituz\":29,\"flag\":\"UA\"},\n    {\"id\":289,\"name\":\"United Nations HQ\",\"cqz\":5,\"ituz\":8,\"flag\":\"united-nations\"},\n    {\"id\":291,\"name\":\"United States\",\"cqz\":5,\"ituz\":8,\"flag\":\"US\"},\n    {\"id\":292,\"name\":\"Uzbekistan\",\"cqz\":17,\"ituz\":30,\"flag\":\"UZ\"},\n    {\"id\":293,\"name\":\"Vietnam\",\"cqz\":26,\"ituz\":49,\"flag\":\"VN\"},\n    {\"id\":294,\"name\":\"Wales\",\"cqz\":14,\"ituz\":27,\"flag\":\"wales\"},\n    {\"id\":295,\"name\":\"Vatican City\",\"cqz\":15,\"ituz\":28,\"flag\":\"VA\"},\n    {\"id\":296,\"name\":\"Serbia\",\"cqz\":15,\"ituz\":28,\"flag\":\"RS\"},\n    {\"id\":297,\"name\":\"Wake Island\",\"cqz\":31,\"ituz\":65,\"flag\":\"US\"},\n    {\"id\":298,\"name\":\"Wallis & Futuna Islands\",\"cqz\":32,\"ituz\":62,\"flag\":\"WF\"},\n    {\"id\":299,\"name\":\"West Malaysia\",\"cqz\":28,\"ituz\":54,\"flag\":\"MY\"},\n    {\"id\":301,\"name\":\"Western Kiribati\",\"cqz\":31,\"ituz\":65,\"flag\":\"KI\"},\n    {\"id\":302,\"name\":\"Western Sahara\",\"cqz\":33,\"ituz\":46,\"flag\":\"EH\"},\n    {\"id\":303,\"name\":\"Willis Island\",\"cqz\":30,\"ituz\":55,\"flag\":\"AU\"},\n    {\"id\":304,\"name\":\"Bahrain\",\"cqz\":21,\"ituz\":39,\"flag\":\"BH\"},\n    {\"id\":305,\"name\":\"Bangladesh\",\"cqz\":22,\"ituz\":41,\"flag\":\"BD\"},\n    {\"id\":306,\"name\":\"Bhutan\",\"cqz\":22,\"ituz\":41,\"flag\":\"BT\"},\n    {\"id\":307,\"name\":\"Zanzibar\",\"cqz\":37,\"ituz\":53,\"flag\":null},\n    {\"id\":308,\"name\":\"Costa Rica\",\"cqz\":7,\"ituz\":11,\"flag\":\"CR\"},\n    {\"id\":309,\"name\":\"Myanmar\",\"cqz\":26,\"ituz\":49,\"flag\":\"MM\"},\n    {\"id\":312,\"name\":\"Cambodia\",\"cqz\":26,\"ituz\":49,\"flag\":\"KH\"},\n    {\"id\":315,\"name\":\"Sri Lanka\",\"cqz\":22,\"ituz\":41,\"flag\":\"LK\"},\n    {\"id\":318,\"name\":\"China\",\"cqz\":24,\"ituz\":44,\"flag\":\"CN\"},\n    {\"id\":321,\"name\":\"Hong Kong\",\"cqz\":24,\"ituz\":44,\"flag\":\"HK\"},\n    {\"id\":324,\"name\":\"India\",\"cqz\":22,\"ituz\":41,\"flag\":\"IN\"},\n    {\"id\":327,\"name\":\"Indonesia\",\"cqz\":28,\"ituz\":54,\"flag\":\"ID\"},\n    {\"id\":330,\"name\":\"Iran\",\"cqz\":21,\"ituz\":40,\"flag\":\"IR\"},\n    {\"id\":333,\"name\":\"Iraq\",\"cqz\":21,\"ituz\":39,\"flag\":\"IQ\"},\n    {\"id\":336,\"name\":\"Israel\",\"cqz\":20,\"ituz\":39,\"flag\":\"IL\"},\n    {\"id\":339,\"name\":\"Japan\",\"cqz\":25,\"ituz\":45,\"flag\":\"JP\"},\n    {\"id\":342,\"name\":\"Jordan\",\"cqz\":20,\"ituz\":39,\"flag\":\"JO\"},\n    {\"id\":344,\"name\":\"DPR of Korea\",\"cqz\":25,\"ituz\":44,\"flag\":\"KP\"},\n    {\"id\":345,\"name\":\"Brunei Darussalam\",\"cqz\":28,\"ituz\":54,\"flag\":\"BN\"},\n    {\"id\":348,\"name\":\"Kuwait\",\"cqz\":21,\"ituz\":39,\"flag\":\"KW\"},\n    {\"id\":354,\"name\":\"Lebanon\",\"cqz\":20,\"ituz\":39,\"flag\":\"LB\"},\n    {\"id\":363,\"name\":\"Mongolia\",\"cqz\":23,\"ituz\":32,\"flag\":\"MN\"},\n    {\"id\":369,\"name\":\"Nepal\",\"cqz\":22,\"ituz\":42,\"flag\":\"NP\"},\n    {\"id\":370,\"name\":\"Oman\",\"cqz\":21,\"ituz\":39,\"flag\":\"OM\"},\n    {\"id\":372,\"name\":\"Pakistan\",\"cqz\":21,\"ituz\":41,\"flag\":\"PK\"},\n    {\"id\":375,\"name\":\"Philippines\",\"cqz\":27,\"ituz\":50,\"flag\":\"PH\"},\n    {\"id\":376,\"name\":\"Qatar\",\"cqz\":21,\"ituz\":39,\"flag\":\"QA\"},\n    {\"id\":378,\"name\":\"Saudi Arabia\",\"cqz\":21,\"ituz\":39,\"flag\":\"SA\"},\n    {\"id\":379,\"name\":\"Seychelles\",\"cqz\":39,\"ituz\":53,\"flag\":\"SC\"},\n    {\"id\":381,\"name\":\"Singapore\",\"cqz\":28,\"ituz\":54,\"flag\":\"SG\"},\n    {\"id\":382,\"name\":\"Djibouti\",\"cqz\":37,\"ituz\":48,\"flag\":\"DJ\"},\n    {\"id\":384,\"name\":\"Syria\",\"cqz\":20,\"ituz\":39,\"flag\":\"SY\"},\n    {\"id\":386,\"name\":\"Taiwan\",\"cqz\":24,\"ituz\":44,\"flag\":\"TW\"},\n    {\"id\":387,\"name\":\"Thailand\",\"cqz\":26,\"ituz\":49,\"flag\":\"TH\"},\n    {\"id\":390,\"name\":\"Asiatic Turkey\",\"cqz\":20,\"ituz\":39,\"flag\":\"TR\"},\n    {\"id\":391,\"name\":\"United Arab Emirates\",\"cqz\":21,\"ituz\":39,\"flag\":\"AE\"},\n    {\"id\":400,\"name\":\"Algeria\",\"cqz\":33,\"ituz\":37,\"flag\":\"DZ\"},\n    {\"id\":401,\"name\":\"Angola\",\"cqz\":36,\"ituz\":52,\"flag\":\"AO\"},\n    {\"id\":402,\"name\":\"Botswana\",\"cqz\":38,\"ituz\":57,\"flag\":\"BW\"},\n    {\"id\":404,\"name\":\"Burundi\",\"cqz\":36,\"ituz\":52,\"flag\":\"BI\"},\n    {\"id\":406,\"name\":\"Cameroon\",\"cqz\":36,\"ituz\":47,\"flag\":\"CM\"},\n    {\"id\":408,\"name\":\"Central African Republic\",\"cqz\":36,\"ituz\":47,\"flag\":\"CF\"},\n    {\"id\":409,\"name\":\"Cape Verde\",\"cqz\":35,\"ituz\":46,\"flag\":\"CV\"},\n    {\"id\":410,\"name\":\"Chad\",\"cqz\":36,\"ituz\":47,\"flag\":\"TD\"},\n    {\"id\":411,\"name\":\"Comoros\",\"cqz\":39,\"ituz\":53,\"flag\":\"KM\"},\n    {\"id\":412,\"name\":\"Republic of the Congo\",\"cqz\":36,\"ituz\":52,\"flag\":\"CG\"},\n    {\"id\":414,\"name\":\"Dem. Rep. of the Congo\",\"cqz\":36,\"ituz\":52,\"flag\":\"CD\"},\n    {\"id\":416,\"name\":\"Benin\",\"cqz\":35,\"ituz\":46,\"flag\":\"BJ\"},\n    {\"id\":420,\"name\":\"Gabon\",\"cqz\":36,\"ituz\":52,\"flag\":\"GA\"},\n    {\"id\":422,\"name\":\"The Gambia\",\"cqz\":35,\"ituz\":46,\"flag\":\"GM\"},\n    {\"id\":424,\"name\":\"Ghana\",\"cqz\":35,\"ituz\":46,\"flag\":\"GH\"},\n    {\"id\":428,\"name\":\"Cote d'Ivoire\",\"cqz\":35,\"ituz\":46,\"flag\":\"CI\"},\n    {\"id\":430,\"name\":\"Kenya\",\"cqz\":37,\"ituz\":48,\"flag\":\"KE\"},\n    {\"id\":432,\"name\":\"Lesotho\",\"cqz\":38,\"ituz\":57,\"flag\":\"LS\"},\n    {\"id\":434,\"name\":\"Liberia\",\"cqz\":35,\"ituz\":46,\"flag\":\"LR\"},\n    {\"id\":436,\"name\":\"Libya\",\"cqz\":34,\"ituz\":38,\"flag\":\"LY\"},\n    {\"id\":438,\"name\":\"Madagascar\",\"cqz\":39,\"ituz\":53,\"flag\":\"MG\"},\n    {\"id\":440,\"name\":\"Malawi\",\"cqz\":37,\"ituz\":53,\"flag\":\"MW\"},\n    {\"id\":442,\"name\":\"Mali\",\"cqz\":35,\"ituz\":46,\"flag\":\"ML\"},\n    {\"id\":444,\"name\":\"Mauritania\",\"cqz\":35,\"ituz\":46,\"flag\":\"MR\"},\n    {\"id\":446,\"name\":\"Morocco\",\"cqz\":33,\"ituz\":37,\"flag\":\"MA\"},\n    {\"id\":450,\"name\":\"Nigeria\",\"cqz\":35,\"ituz\":46,\"flag\":\"NG\"},\n    {\"id\":452,\"name\":\"Zimbabwe\",\"cqz\":38,\"ituz\":53,\"flag\":\"ZW\"},\n    {\"id\":453,\"name\":\"Reunion Island\",\"cqz\":39,\"ituz\":53,\"flag\":\"FR\"},\n    {\"id\":454,\"name\":\"Rwanda\",\"cqz\":36,\"ituz\":52,\"flag\":\"RW\"},\n    {\"id\":456,\"name\":\"Senegal\",\"cqz\":35,\"ituz\":46,\"flag\":\"SN\"},\n    {\"id\":458,\"name\":\"Sierra Leone\",\"cqz\":35,\"ituz\":46,\"flag\":\"SL\"},\n    {\"id\":460,\"name\":\"Rotuma Island\",\"cqz\":32,\"ituz\":56,\"flag\":\"FJ\"},\n    {\"id\":462,\"name\":\"South Africa\",\"cqz\":38,\"ituz\":57,\"flag\":\"ZA\"},\n    {\"id\":464,\"name\":\"Namibia\",\"cqz\":38,\"ituz\":57,\"flag\":\"NA\"},\n    {\"id\":466,\"name\":\"Sudan\",\"cqz\":34,\"ituz\":48,\"flag\":\"SD\"},\n    {\"id\":468,\"name\":\"Kingdom of Eswatini\",\"cqz\":38,\"ituz\":57,\"flag\":\"SZ\"},\n    {\"id\":470,\"name\":\"Tanzania\",\"cqz\":37,\"ituz\":53,\"flag\":\"TZ\"},\n    {\"id\":474,\"name\":\"Tunisia\",\"cqz\":33,\"ituz\":37,\"flag\":\"TN\"},\n    {\"id\":478,\"name\":\"Egypt\",\"cqz\":34,\"ituz\":38,\"flag\":\"EG\"},\n    {\"id\":480,\"name\":\"Burkina Faso\",\"cqz\":35,\"ituz\":46,\"flag\":\"BF\"},\n    {\"id\":482,\"name\":\"Zambia\",\"cqz\":36,\"ituz\":53,\"flag\":\"ZM\"},\n    {\"id\":483,\"name\":\"Togo\",\"cqz\":35,\"ituz\":46,\"flag\":\"TG\"},\n    {\"id\":488,\"name\":\"Walvis Bay\",\"cqz\":38,\"ituz\":57,\"flag\":null},\n    {\"id\":489,\"name\":\"Conway Reef\",\"cqz\":32,\"ituz\":56,\"flag\":\"FJ\"},\n    {\"id\":490,\"name\":\"Banaba Island\",\"cqz\":31,\"ituz\":65,\"flag\":\"KI\"},\n    {\"id\":492,\"name\":\"Yemen\",\"cqz\":21,\"ituz\":39,\"flag\":\"YE\"},\n    {\"id\":493,\"name\":\"Penguin Is.\",\"cqz\":38,\"ituz\":57,\"flag\":null},\n    {\"id\":497,\"name\":\"Croatia\",\"cqz\":15,\"ituz\":28,\"flag\":\"HR\"},\n    {\"id\":499,\"name\":\"Slovenia\",\"cqz\":15,\"ituz\":28,\"flag\":\"SI\"},\n    {\"id\":501,\"name\":\"Bosnia-Herzegovina\",\"cqz\":15,\"ituz\":28,\"flag\":\"BA\"},\n    {\"id\":502,\"name\":\"North Macedonia\",\"cqz\":15,\"ituz\":28,\"flag\":\"MK\"},\n    {\"id\":503,\"name\":\"Czech Republic\",\"cqz\":15,\"ituz\":28,\"flag\":\"CZ\"},\n    {\"id\":504,\"name\":\"Slovak Republic\",\"cqz\":15,\"ituz\":28,\"flag\":\"SK\"},\n    {\"id\":505,\"name\":\"Pratas Island\",\"cqz\":24,\"ituz\":44,\"flag\":\"TW\"},\n    {\"id\":506,\"name\":\"Scarborough Reef\",\"cqz\":27,\"ituz\":50,\"flag\":\"PH\"},\n    {\"id\":507,\"name\":\"Temotu Province\",\"cqz\":32,\"ituz\":51,\"flag\":\"SB\"},\n    {\"id\":508,\"name\":\"Austral Islands\",\"cqz\":32,\"ituz\":63,\"flag\":\"PF\"},\n    {\"id\":509,\"name\":\"Marquesas Islands\",\"cqz\":31,\"ituz\":63,\"flag\":\"FR\"},\n    {\"id\":510,\"name\":\"Palestine\",\"cqz\":20,\"ituz\":39,\"flag\":\"PS\"},\n    {\"id\":511,\"name\":\"Timor - Leste\",\"cqz\":28,\"ituz\":54,\"flag\":\"TL\"},\n    {\"id\":512,\"name\":\"Chesterfield Islands\",\"cqz\":30,\"ituz\":56,\"flag\":\"GB\"},\n    {\"id\":513,\"name\":\"Ducie Island\",\"cqz\":32,\"ituz\":63,\"flag\":\"PN\"},\n    {\"id\":514,\"name\":\"Montenegro\",\"cqz\":15,\"ituz\":28,\"flag\":\"ME\"},\n    {\"id\":515,\"name\":\"Swains Island\",\"cqz\":32,\"ituz\":62,\"flag\":\"US\"},\n    {\"id\":516,\"name\":\"St. Barthelemy\",\"cqz\":8,\"ituz\":11,\"flag\":\"FR\"},\n    {\"id\":517,\"name\":\"Curacao\",\"cqz\":9,\"ituz\":11,\"flag\":\"CW\"},\n    {\"id\":518,\"name\":\"Sint Maarten\",\"cqz\":8,\"ituz\":11,\"flag\":\"NL\"},\n    {\"id\":519,\"name\":\"Saba & St. Eustatius\",\"cqz\":8,\"ituz\":11,\"flag\":\"AN\"},\n    {\"id\":520,\"name\":\"Bonaire\",\"cqz\":9,\"ituz\":11,\"flag\":\"NL\"},\n    {\"id\":521,\"name\":\"Republic of South Sudan\",\"cqz\":34,\"ituz\":48,\"flag\":\"SS\"},\n    {\"id\":522,\"name\":\"Republic of Kosovo\",\"cqz\":15,\"ituz\":28,\"flag\":\"XK\"}\n]\n"
  },
  {
    "path": "res/data/legacy_modes.json",
    "content": "{\n  \"AMTORFEC\": { \"mode\": \"TOR\", \"submode\": \"AMTORFEC\" },\n  \"ASCI\": { \"mode\": \"RTTY\", \"submode\": \"ASCI\" },\n  \"C4FM\": { \"mode\": \"DIGITALVOICE\", \"submode\": \"C4FM\" },\n  \"CHIP64\": { \"mode\": \"CHIP\", \"submode\": \"CHIP64\" },\n  \"CHIP128\": { \"mode\": \"CHIP\", \"submode\": \"CHIP128\" },\n  \"CONTESTI4/125\": { \"mode\": \"CONTESTI\", \"submode\": \"CT4/125\" },\n  \"CONTESTI4/250\": { \"mode\": \"CONTESTI\", \"submode\": \"CT4/250\" },\n  \"CONTESTI4/500\": { \"mode\": \"CONTESTI\", \"submode\": \"CT4/500\" },\n  \"CONTESTI4/1000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT4/1K\" },\n  \"CONTESTI4/2000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT4/2K\" },\n  \"CONTESTI8/125\": { \"mode\": \"CONTESTI\", \"submode\": \"CT8/125\" },\n  \"CONTESTI8/250\": { \"mode\": \"CONTESTI\", \"submode\": \"CT8/250\" },\n  \"CONTESTI8/500\": { \"mode\": \"CONTESTI\", \"submode\": \"CT8/500\" },\n  \"CONTESTI8/1000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT8/1K\" },\n  \"CONTESTI8/2000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT8/2K\" },\n  \"CONTESTI16/250\": { \"mode\": \"CONTESTI\", \"submode\": \"CT16/250\" },\n  \"CONTESTI16/500\": { \"mode\": \"CONTESTI\", \"submode\": \"CT16/500\" },\n  \"CONTESTI16/1000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT16/1K\" },\n  \"CONTESTI16/2000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT16/2K\" },\n  \"CONTESTI32/1000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT32/1K\" },\n  \"CONTESTI32/2000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT32/2K\" },\n  \"CONTESTI64/500\": { \"mode\": \"CONTESTI\", \"submode\": \"CT64/500\" },\n  \"CONTESTI64/1000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT64/1K\" },\n  \"CONTESTI64/2000\": { \"mode\": \"CONTESTI\", \"submode\": \"CT64/2K\" },\n  \"DOMINOF\": { \"mode\": \"DOMINO\", \"submode\": \"DOMINOF\" },\n  \"DMR\": { \"mode\": \"DIGITALVOICE\", \"submode\": \"DMR\" },\n  \"DSTAR\": { \"mode\": \"DIGITALVOICE\", \"submode\": \"DSTAR\" },\n  \"FMHELL\": { \"mode\": \"HELL\", \"submode\": \"FMHELL\" },\n  \"FREEDV\": { \"mode\": \"DIGITALVOICE\", \"submode\": \"FREEDV\" },\n  \"FSKH245\": { \"mode\": \"HELL\", \"submode\": \"FSKH245\" },\n  \"FSKH105\": { \"mode\": \"HELL\", \"submode\": \"FSKH105\" },\n  \"FSK31\": { \"mode\": \"PSK\", \"submode\": \"FSK31\" },\n  \"GTOR\": { \"mode\": \"TOR\", \"submode\": \"GTOR\" },\n  \"HELL80\": { \"mode\": \"HELL\", \"submode\": \"HELL80\" },\n  \"HFSK\": { \"mode\": \"HELL\", \"submode\": \"HFSK\" },\n  \"JS8\": { \"mode\": \"MFSK\", \"submode\": \"JS8\" },\n  \"JT4A\": { \"mode\": \"JT4\", \"submode\": \"JT4A\" },\n  \"JT4B\": { \"mode\": \"JT4\", \"submode\": \"JT4B\" },\n  \"JT4C\": { \"mode\": \"JT4\", \"submode\": \"JT4C\" },\n  \"JT4D\": { \"mode\": \"JT4\", \"submode\": \"JT4D\" },\n  \"JT4E\": { \"mode\": \"JT4\", \"submode\": \"JT4E\" },\n  \"JT4F\": { \"mode\": \"JT4\", \"submode\": \"JT4F\" },\n  \"JT4G\": { \"mode\": \"JT4\", \"submode\": \"JT4G\" },\n  \"JT65A\": { \"mode\": \"JT65\", \"submode\": \"JT65A\" },\n  \"JT65B\": { \"mode\": \"JT65\", \"submode\": \"JT65B\" },\n  \"JT65C\": { \"mode\": \"JT65\", \"submode\": \"JT65C\" },\n  \"M17\": { \"mode\": \"DIGITALVOICE\", \"submode\": \"M17\" },\n  \"MFSK8\": { \"mode\": \"MFSK\", \"submode\": \"MFSK8\" },\n  \"MFSK16\": { \"mode\": \"MFSK\", \"submode\": \"MFSK16\" },\n  \"MFSK32\": { \"mode\": \"MFSK\", \"submode\": \"MFSK32\" },\n  \"MFSK4\": { \"mode\": \"MFSK\", \"submode\": \"MFSK4\" },\n  \"MFSK11\": { \"mode\": \"MFSK\", \"submode\": \"MFSK11\" },\n  \"MFSK22\": { \"mode\": \"MFSK\", \"submode\": \"MFSK22\" },\n  \"MFSK31\": { \"mode\": \"MFSK\", \"submode\": \"MFSK31\" },\n  \"MFSK64\": { \"mode\": \"MFSK\", \"submode\": \"MFSK64\" },\n  \"MFSK128\": { \"mode\": \"MFSK\", \"submode\": \"MFSK128\" },\n  \"MFSK64L\": { \"mode\": \"MFSK\", \"submode\": \"MFSK64\" },\n  \"MFSK128L\": { \"mode\": \"MFSK\", \"submode\": \"MFSK128\" },\n  \"MT63-500S\": { \"mode\": \"MT63\", \"submode\": \"MT63-500S\" },\n  \"MT63-500L\": { \"mode\": \"MT63\", \"submode\": \"MT63-500L\" },\n  \"MT63-1KS\": { \"mode\": \"MT63\", \"submode\": \"MT63\" },\n  \"MT63-1KL\": { \"mode\": \"MT63\", \"submode\": \"MT63\" },\n  \"MT63-2KS\": { \"mode\": \"MT63\", \"submode\": \"MT63\" },\n  \"MT63-2KL\": { \"mode\": \"MT63\", \"submode\": \"MT63\" },\n  \"SCAMP_OO\": { \"mode\": \"MTONE\", \"submode\": \"SCAMP_OO\" },\n  \"SCAMP_OO_SLW\": { \"mode\": \"MTONE\", \"submode\": \"SCAMP_OO_SLW\" },\n  \"OLIVIA 4/125\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 4/125\" },\n  \"OLIVIA 4/250\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 4/250\" },\n  \"OLIVIA 4/500\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 4/500\" },\n  \"OLIVIA 4/1K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 4/1K\" },\n  \"OLIVIA 4/2K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 4/1K\" },\n  \"OLIVIA 8/125\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 8/125\" },\n  \"OLIVIA 8/250\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 8/250\" },\n  \"OLIVIA 8/500\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 8/500\" },\n  \"OLIVIA 8/1K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 8/1K\" },\n  \"OLIVIA 8/2K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 8/2K\" },\n  \"OLIVIA 16/500\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 16/500\" },\n  \"OLIVIA 16/1K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 16/1K\" },\n  \"OLIVIA 16/2K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 16/2K\" },\n  \"OLIVIA 32/1K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 32/1K\" },\n  \"OLIVIA 32/2K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 32/2K\" },\n  \"OLIVIA 64/500\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 64/500\" },\n  \"OLIVIA 64/1K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 64/1K\" },\n  \"OLIVIA 64/2K\": { \"mode\": \"OLIVIA\", \"submode\": \"OLIVIA 64/2K\" },\n  \"PAC2\": { \"mode\": \"PAC\", \"submode\": \"PAC2\" },\n  \"PAC3\": { \"mode\": \"PAC\", \"submode\": \"PAC3\" },\n  \"PAX2\": { \"mode\": \"PAX\", \"submode\": \"PAX2\" },\n  \"PCW\": { \"mode\": \"CW\", \"submode\": \"PCW\" },\n  \"PSK10\": { \"mode\": \"PSK\", \"submode\": \"PSK10\" },\n  \"PSK31\": { \"mode\": \"PSK\", \"submode\": \"PSK31\" },\n  \"PSK63\": { \"mode\": \"PSK\", \"submode\": \"PSK63\" },\n  \"PSK63F\": { \"mode\": \"PSK\", \"submode\": \"PSK63F\" },\n  \"PSK125\": { \"mode\": \"PSK\", \"submode\": \"PSK125\" },\n  \"PSK125\": { \"mode\": \"PSK\", \"submode\": \"PSK125\" },\n  \"PSK250\": { \"mode\": \"PSK\", \"submode\": \"PSK250\" },\n  \"PSK500\": { \"mode\": \"PSK\", \"submode\": \"PSK500\" },\n  \"PSK1000\": { \"mode\": \"PSK\", \"submode\": \"PSK1000\" },\n  \"PSK125C12\": { \"mode\": \"PSK\", \"submode\": \"P125C12\" },\n  \"PSK250C6\": { \"mode\": \"PSK\", \"submode\": \"P2506\" },\n  \"PSK500C2\": { \"mode\": \"PSK\", \"submode\": \"2xP500\" },\n  \"PSK500C4\": { \"mode\": \"PSK\", \"submode\": \"4xP500\" },\n  \"PSK800C2\": { \"mode\": \"PSK\", \"submode\": \"P800RC2\" },\n  \"PSK1000C2\": { \"mode\": \"PSK\", \"submode\": \"P1KC2\" },\n  \"PSK125R\": { \"mode\": \"PSK\", \"submode\": \"P125R\" },\n  \"PSK250R\": { \"mode\": \"PSK\", \"submode\": \"P250R\" },\n  \"PSK500R\": { \"mode\": \"PSK\", \"submode\": \"P500R\" },\n  \"PSK1000R\": { \"mode\": \"PSK\", \"submode\": \"PSK1000R\" },\n  \"PSK63RC4\": { \"mode\": \"PSK\", \"submode\": \"P63R4\" },\n  \"PSK63RC5\": { \"mode\": \"PSK\", \"submode\": \"P63R5\" },\n  \"PSK63RC10\": { \"mode\": \"PSK\", \"submode\": \"P63R10\" },\n  \"PSK63RC20\": { \"mode\": \"PSK\", \"submode\": \"P63R20\" },\n  \"PSK63RC32\": { \"mode\": \"PSK\", \"submode\": \"P63R32\" },\n  \"PSK125RC4\": { \"mode\": \"PSK\", \"submode\": \"P125R4\" },\n  \"PSK125RC5\": { \"mode\": \"PSK\", \"submode\": \"P125R5\" },\n  \"PSK125RC10\": { \"mode\": \"PSK\", \"submode\": \"P125R10\" },\n  \"PSK125RC12\": { \"mode\": \"PSK\", \"submode\": \"P125R12\" },\n  \"PSK125RC16\": { \"mode\": \"PSK\", \"submode\": \"P125R16\" },\n  \"PSK250RC2\": { \"mode\": \"PSK\", \"submode\": \"P250R2\" },\n  \"PSK250RC3\": { \"mode\": \"PSK\", \"submode\": \"P250R3\" },\n  \"PSK250RC5\": { \"mode\": \"PSK\", \"submode\": \"P250R5\" },\n  \"PSK250RC6\": { \"mode\": \"PSK\", \"submode\": \"P250R6\" },\n  \"PSK250RC7\": { \"mode\": \"PSK\", \"submode\": \"P250R7\" },\n  \"PSK500RC2\": { \"mode\": \"PSK\", \"submode\": \"P500R2\" },\n  \"PSK500RC3\": { \"mode\": \"PSK\", \"submode\": \"P500R3\" },\n  \"PSK500RC4\": { \"mode\": \"PSK\", \"submode\": \"P500R4\" },\n  \"PSK800RC2\": { \"mode\": \"PSK\", \"submode\": \"P800RC2\" },\n  \"PSK1000RC2\": { \"mode\": \"PSK\", \"submode\": \"P1KRC2\" },\n  \"PSKAM10\": { \"mode\": \"PSK\", \"submode\": \"PSKAM10\" },\n  \"PSKAM31\": { \"mode\": \"PSK\", \"submode\": \"PSKAM31\" },\n  \"PSKAM50\": { \"mode\": \"PSK\", \"submode\": \"PSKAM50\" },\n  \"PSKFEC31\": { \"mode\": \"PSK\", \"submode\": \"PSKFEC31\" },\n  \"PSKHELL\": { \"mode\": \"HELL\", \"submode\": \"PSKHELL\" },\n  \"QPSK31\": { \"mode\": \"PSK\", \"submode\": \"QPSK31\" },\n  \"QPSK63\": { \"mode\": \"PSK\", \"submode\": \"QPSK63\" },\n  \"QPSK125\": { \"mode\": \"PSK\", \"submode\": \"QPSK125\" },\n  \"QPSK250\": { \"mode\": \"PSK\", \"submode\": \"QPSK250\" },\n  \"QPSK500\": { \"mode\": \"PSK\", \"submode\": \"QPSK500\" },\n  \"8PSK125\": { \"mode\": \"PSK\", \"submode\": \"8PSK125\" },\n  \"8PSK125FL\": { \"mode\": \"PSK\", \"submode\": \"8PSK125FL\" },\n  \"8PSK125F\": { \"mode\": \"PSK\", \"submode\": \"8PSK125F\" },\n  \"8PSK250\": { \"mode\": \"PSK\", \"submode\": \"8PSK250\" },\n  \"8PSK250F\": { \"mode\": \"PSK\", \"submode\": \"8PSK250FL\" },\n  \"8PSK250F\": { \"mode\": \"PSK\", \"submode\": \"8PSK250F\" },\n  \"8PSK500\": { \"mode\": \"PSK\", \"submode\": \"8PSK500\" },\n  \"8PSK500F\": { \"mode\": \"PSK\", \"submode\": \"8PSK500F\" },\n  \"8PSK1000\": { \"mode\": \"PSK\", \"submode\": \"8PSK1000\" },\n  \"8PSK1000F\": { \"mode\": \"PSK\", \"submode\": \"8PSK1000F\" },\n  \"8PSK1200F\": { \"mode\": \"PSK\", \"submode\": \"8PSK1200F\" },\n  \"SCAMP_FAST\": { \"mode\": \"FSK\", \"submode\": \"SCAMP_FAST\" },\n  \"SCAMP_SLOW\": { \"mode\": \"FSK\", \"submode\": \"SCAMP_SLOW\" },\n  \"SCAMP_VSLOW\": { \"mode\": \"FSK\", \"submode\": \"SCAMP_VSLOW\" },\n  \"THOR4\": { \"mode\": \"THOR\", \"submode\": \"THOR4\" },\n  \"THOR5\": { \"mode\": \"THOR\", \"submode\": \"THOR5\" },\n  \"THOR8\": { \"mode\": \"THOR\", \"submode\": \"THOR8\" },\n  \"THOR11\": { \"mode\": \"THOR\", \"submode\": \"THOR11\" },\n  \"THOR16\": { \"mode\": \"THOR\", \"submode\": \"THOR16\" },\n  \"THOR22\": { \"mode\": \"THOR\", \"submode\": \"THOR22\" },\n  \"THOR-25X4\": { \"mode\": \"THOR\", \"submode\": \"THOR25\" },\n  \"THOR-50X1\": { \"mode\": \"THOR\", \"submode\": \"THOR51\" },\n  \"THOR-50X2\": { \"mode\": \"THOR\", \"submode\": \"THOR52\" },\n  \"THOR-100\": { \"mode\": \"THOR\", \"submode\": \"THOR100\" },\n  \"THRB\": { \"mode\": \"THRB\", \"submode\": \"TB1\" },\n  \"THRBX\": { \"mode\": \"THRB\", \"submode\": \"THRBX\" },\n  \"TOR\": { \"mode\": \"NAVTEX\", \"submode\": \"NAVTEX\" },\n  \"TOR\": { \"mode\": \"SITORB\", \"submode\": \"SITORB\" },\n  \"USB\": { \"mode\": \"SSB\", \"submode\": \"USB\" },\n  \"LSB\": { \"mode\": \"SSB\", \"submode\": \"LSB\" },\n  \"FT4\": { \"mode\": \"MFSK\", \"submode\": \"FT4\" },\n  \"FST4\": { \"mode\": \"MFSK\", \"submode\": \"FST4\"},\n  \"FST4W\": { \"mode\": \"MFSK\", \"submode\": \"FST4W\"},\n  \"Q65\": { \"mode\": \"MFSK\", \"submode\": \"Q65\"},\n  \"FT2\": { \"mode\": \"MFSK\", \"submode\": \"FT2\" },\n  \"RIBBIT_PIX\": { \"mode\": \"OFDM\", \"submode\": \"RIBBIT_PIX\" },\n  \"RIBBIT_SMS\": { \"mode\": \"OFDM\", \"submode\": \"RIBBIT_SMS\" },\n  \"FREEDATA\": { \"mode\": \"DYNAMIC\", \"submode\": \"FREEDATA\" }\n}\n"
  },
  {
    "path": "res/data/propagation_modes.json",
    "content": "[\n    {\"id\": \"AS\", \"name\": \"Aircraft Scatter\"},\n    {\"id\": \"AUE\", \"name\": \"Aurora-E\"},\n    {\"id\": \"AUR\", \"name\": \"Aurora\"},\n    {\"id\": \"BS\", \"name\": \"Back scatter\"},\n    {\"id\": \"ECH\", \"name\": \"EchoLink\"},\n    {\"id\": \"EME\", \"name\": \"Earth-Moon-Earth\"},\n    {\"id\": \"ES\", \"name\": \"Sporadic E\"},\n    {\"id\": \"F2\", \"name\": \"F2 Reflection\"},\n    {\"id\": \"FAI\", \"name\": \"Field Aligned Irregularities\"},\n    {\"id\": \"GWAVE\", \"name\": \"Ground Wave\"},\n    {\"id\": \"INTERNET\", \"name\": \"Internet-assisted\"},\n    {\"id\": \"ION\", \"name\": \"Ionoscatter\"},\n    {\"id\": \"IRL\", \"name\": \"IRLP\"},\n    {\"id\": \"LOS\", \"name\": \"Line of Sight\"},\n    {\"id\": \"MS\", \"name\": \"Meteor scatter\"},\n    {\"id\": \"RPT\", \"name\": \"Terrestrial or atmospheric repeater or transponder\"},\n    {\"id\": \"RS\", \"name\": \"Rain scatter\"},\n    {\"id\": \"SAT\", \"name\": \"Satellite\"},\n    {\"id\": \"TEP\", \"name\": \"Trans-equatorial\"},\n    {\"id\": \"TR\", \"name\": \"Tropospheric ducting\"}\n]\n"
  },
  {
    "path": "res/data/sat_modes.json",
    "content": "[\n    {\"id\": \"HU\", \"name\": \"H/U (21 / 435)\"},\n    {\"id\": \"AU\", \"name\": \"A/U (29 / 435)\"},\n    {\"id\": \"VV\", \"name\": \"V/V (145 / 145)\"},\n    {\"id\": \"VU\", \"name\": \"V/U (145 / 435)\"},\n    {\"id\": \"VS\", \"name\": \"V/S (145 / 2400)\"},\n    {\"id\": \"UV\", \"name\": \"U/V (435 / 145)\"},\n    {\"id\": \"UU\", \"name\": \"U/U (435 / 435)\"},\n    {\"id\": \"US\", \"name\": \"U/S (435 / 2400)\"},\n    {\"id\": \"LV\", \"name\": \"L/V (1268 / 145)\"},\n    {\"id\": \"LU\", \"name\": \"L/U (1268 / 435)\"},\n    {\"id\": \"LS\", \"name\": \"L/S (1268 / 2400)\"},\n    {\"id\": \"LX\", \"name\": \"L/X (1268 / 10450)\"},\n    {\"id\": \"SX\", \"name\": \"S/X (2400 / 10450)\"}\n]\n"
  },
  {
    "path": "res/flags/flags.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/flags\">\n        <file>16/abkhazia.png</file>\n        <file>16/AD.png</file>\n        <file>16/AE.png</file>\n        <file>16/AF.png</file>\n        <file>16/AG.png</file>\n        <file>16/AI.png</file>\n        <file>16/AL.png</file>\n        <file>16/AM.png</file>\n        <file>16/AN.png</file>\n        <file>16/AO.png</file>\n        <file>16/AQ.png</file>\n        <file>16/AR.png</file>\n        <file>16/AS.png</file>\n        <file>16/AT.png</file>\n        <file>16/AU.png</file>\n        <file>16/AW.png</file>\n        <file>16/AX.png</file>\n        <file>16/AZ.png</file>\n        <file>16/BA.png</file>\n        <file>16/basque-country.png</file>\n        <file>16/BB.png</file>\n        <file>16/BD.png</file>\n        <file>16/BE.png</file>\n        <file>16/BF.png</file>\n        <file>16/BG.png</file>\n        <file>16/BH.png</file>\n        <file>16/BI.png</file>\n        <file>16/BJ.png</file>\n        <file>16/BL.png</file>\n        <file>16/BM.png</file>\n        <file>16/BN.png</file>\n        <file>16/BO.png</file>\n        <file>16/BR.png</file>\n        <file>16/british-antarctic-territory.png</file>\n        <file>16/BS.png</file>\n        <file>16/BT.png</file>\n        <file>16/BW.png</file>\n        <file>16/BY.png</file>\n        <file>16/BZ.png</file>\n        <file>16/CA.png</file>\n        <file>16/CC.png</file>\n        <file>16/CD.png</file>\n        <file>16/CF.png</file>\n        <file>16/CG.png</file>\n        <file>16/CH.png</file>\n        <file>16/CI.png</file>\n        <file>16/CK.png</file>\n        <file>16/CL.png</file>\n        <file>16/CM.png</file>\n        <file>16/CN.png</file>\n        <file>16/CO.png</file>\n        <file>16/commonwealth.png</file>\n        <file>16/CR.png</file>\n        <file>16/CU.png</file>\n        <file>16/CV.png</file>\n        <file>16/CW.png</file>\n        <file>16/CX.png</file>\n        <file>16/CY.png</file>\n        <file>16/CZ.png</file>\n        <file>16/DE.png</file>\n        <file>16/DJ.png</file>\n        <file>16/DK.png</file>\n        <file>16/DM.png</file>\n        <file>16/DO.png</file>\n        <file>16/DZ.png</file>\n        <file>16/EC.png</file>\n        <file>16/EE.png</file>\n        <file>16/EG.png</file>\n        <file>16/EH.png</file>\n        <file>16/england.png</file>\n        <file>16/ER.png</file>\n        <file>16/ES.png</file>\n        <file>16/ET.png</file>\n        <file>16/EU.png</file>\n        <file>16/FI.png</file>\n        <file>16/FJ.png</file>\n        <file>16/FK.png</file>\n        <file>16/FM.png</file>\n        <file>16/FO.png</file>\n        <file>16/FR.png</file>\n        <file>16/GA.png</file>\n        <file>16/GB.png</file>\n        <file>16/GD.png</file>\n        <file>16/GE.png</file>\n        <file>16/GG.png</file>\n        <file>16/GH.png</file>\n        <file>16/GI.png</file>\n        <file>16/GL.png</file>\n        <file>16/GM.png</file>\n        <file>16/GN.png</file>\n        <file>16/GQ.png</file>\n        <file>16/GR.png</file>\n        <file>16/GS.png</file>\n        <file>16/GT.png</file>\n        <file>16/GU.png</file>\n        <file>16/GW.png</file>\n        <file>16/GY.png</file>\n        <file>16/HK.png</file>\n        <file>16/HN.png</file>\n        <file>16/HR.png</file>\n        <file>16/HT.png</file>\n        <file>16/HU.png</file>\n        <file>16/IC.png</file>\n        <file>16/ID.png</file>\n        <file>16/IE.png</file>\n        <file>16/IL.png</file>\n        <file>16/IM.png</file>\n        <file>16/IN.png</file>\n        <file>16/IQ.png</file>\n        <file>16/IR.png</file>\n        <file>16/IS.png</file>\n        <file>16/IT.png</file>\n        <file>16/JE.png</file>\n        <file>16/JM.png</file>\n        <file>16/JO.png</file>\n        <file>16/JP.png</file>\n        <file>16/KE.png</file>\n        <file>16/KG.png</file>\n        <file>16/KH.png</file>\n        <file>16/KI.png</file>\n        <file>16/KM.png</file>\n        <file>16/KN.png</file>\n        <file>16/kosovo.png</file>\n        <file>16/KP.png</file>\n        <file>16/KR.png</file>\n        <file>16/KW.png</file>\n        <file>16/KY.png</file>\n        <file>16/KZ.png</file>\n        <file>16/LA.png</file>\n        <file>16/LB.png</file>\n        <file>16/LC.png</file>\n        <file>16/LI.png</file>\n        <file>16/LK.png</file>\n        <file>16/LR.png</file>\n        <file>16/LS.png</file>\n        <file>16/LT.png</file>\n        <file>16/LU.png</file>\n        <file>16/LV.png</file>\n        <file>16/LY.png</file>\n        <file>16/MA.png</file>\n        <file>16/mars.png</file>\n        <file>16/MC.png</file>\n        <file>16/MD.png</file>\n        <file>16/ME.png</file>\n        <file>16/MF.png</file>\n        <file>16/MG.png</file>\n        <file>16/MH.png</file>\n        <file>16/MK.png</file>\n        <file>16/ML.png</file>\n        <file>16/MM.png</file>\n        <file>16/MN.png</file>\n        <file>16/MO.png</file>\n        <file>16/MP.png</file>\n        <file>16/MQ.png</file>\n        <file>16/MR.png</file>\n        <file>16/MS.png</file>\n        <file>16/MT.png</file>\n        <file>16/MU.png</file>\n        <file>16/MV.png</file>\n        <file>16/MW.png</file>\n        <file>16/MX.png</file>\n        <file>16/MY.png</file>\n        <file>16/MZ.png</file>\n        <file>16/NA.png</file>\n        <file>16/nagorno-karabakh.png</file>\n        <file>16/nato.png</file>\n        <file>16/NC.png</file>\n        <file>16/NE.png</file>\n        <file>16/NF.png</file>\n        <file>16/NG.png</file>\n        <file>16/NI.png</file>\n        <file>16/NL.png</file>\n        <file>16/NO.png</file>\n        <file>16/northern-cyprus.png</file>\n        <file>16/NP.png</file>\n        <file>16/NR.png</file>\n        <file>16/NU.png</file>\n        <file>16/NZ.png</file>\n        <file>16/olympics.png</file>\n        <file>16/OM.png</file>\n        <file>16/PA.png</file>\n        <file>16/PE.png</file>\n        <file>16/PF.png</file>\n        <file>16/PG.png</file>\n        <file>16/PH.png</file>\n        <file>16/PK.png</file>\n        <file>16/PL.png</file>\n        <file>16/PN.png</file>\n        <file>16/PR.png</file>\n        <file>16/PS.png</file>\n        <file>16/PT.png</file>\n        <file>16/PW.png</file>\n        <file>16/PY.png</file>\n        <file>16/QA.png</file>\n        <file>16/red-cross.png</file>\n        <file>16/RO.png</file>\n        <file>16/RS.png</file>\n        <file>16/RU.png</file>\n        <file>16/RW.png</file>\n        <file>16/SA.png</file>\n        <file>16/SB.png</file>\n        <file>16/SC.png</file>\n        <file>16/scotland.png</file>\n        <file>16/SD.png</file>\n        <file>16/SE.png</file>\n        <file>16/SG.png</file>\n        <file>16/SH.png</file>\n        <file>16/SI.png</file>\n        <file>16/SK.png</file>\n        <file>16/SL.png</file>\n        <file>16/SM.png</file>\n        <file>16/SN.png</file>\n        <file>16/SO.png</file>\n        <file>16/somaliland.png</file>\n        <file>16/south-ossetia.png</file>\n        <file>16/SR.png</file>\n        <file>16/SS.png</file>\n        <file>16/ST.png</file>\n        <file>16/SV.png</file>\n        <file>16/SY.png</file>\n        <file>16/SZ.png</file>\n        <file>16/TC.png</file>\n        <file>16/TD.png</file>\n        <file>16/TF.png</file>\n        <file>16/TG.png</file>\n        <file>16/TH.png</file>\n        <file>16/TJ.png</file>\n        <file>16/TK.png</file>\n        <file>16/TL.png</file>\n        <file>16/TM.png</file>\n        <file>16/TN.png</file>\n        <file>16/TO.png</file>\n        <file>16/TR.png</file>\n        <file>16/TT.png</file>\n        <file>16/TV.png</file>\n        <file>16/TW.png</file>\n        <file>16/TZ.png</file>\n        <file>16/UA.png</file>\n        <file>16/UG.png</file>\n        <file>16/united-nations.png</file>\n        <file>16/unknown.png</file>\n        <file>16/US.png</file>\n        <file>16/UY.png</file>\n        <file>16/UZ.png</file>\n        <file>16/VA.png</file>\n        <file>16/VC.png</file>\n        <file>16/VE.png</file>\n        <file>16/VG.png</file>\n        <file>16/VI.png</file>\n        <file>16/VN.png</file>\n        <file>16/VU.png</file>\n        <file>16/wales.png</file>\n        <file>16/WF.png</file>\n        <file>16/WS.png</file>\n        <file>16/XK.png</file>\n        <file>16/YE.png</file>\n        <file>16/YT.png</file>\n        <file>16/ZA.png</file>\n        <file>16/ZM.png</file>\n        <file>16/ZW.png</file>\n        <file>24/abkhazia.png</file>\n        <file>24/AD.png</file>\n        <file>24/AE.png</file>\n        <file>24/AF.png</file>\n        <file>24/AG.png</file>\n        <file>24/AI.png</file>\n        <file>24/AL.png</file>\n        <file>24/AM.png</file>\n        <file>24/AN.png</file>\n        <file>24/AO.png</file>\n        <file>24/AQ.png</file>\n        <file>24/AR.png</file>\n        <file>24/AS.png</file>\n        <file>24/AT.png</file>\n        <file>24/AU.png</file>\n        <file>24/AW.png</file>\n        <file>24/AX.png</file>\n        <file>24/AZ.png</file>\n        <file>24/BA.png</file>\n        <file>24/basque-country.png</file>\n        <file>24/BB.png</file>\n        <file>24/BD.png</file>\n        <file>24/BE.png</file>\n        <file>24/BF.png</file>\n        <file>24/BG.png</file>\n        <file>24/BH.png</file>\n        <file>24/BI.png</file>\n        <file>24/BJ.png</file>\n        <file>24/BL.png</file>\n        <file>24/BM.png</file>\n        <file>24/BN.png</file>\n        <file>24/BO.png</file>\n        <file>24/BR.png</file>\n        <file>24/british-antarctic-territory.png</file>\n        <file>24/BS.png</file>\n        <file>24/BT.png</file>\n        <file>24/BW.png</file>\n        <file>24/BY.png</file>\n        <file>24/BZ.png</file>\n        <file>24/CA.png</file>\n        <file>24/CC.png</file>\n        <file>24/CD.png</file>\n        <file>24/CF.png</file>\n        <file>24/CG.png</file>\n        <file>24/CH.png</file>\n        <file>24/CI.png</file>\n        <file>24/CK.png</file>\n        <file>24/CL.png</file>\n        <file>24/CM.png</file>\n        <file>24/CN.png</file>\n        <file>24/CO.png</file>\n        <file>24/commonwealth.png</file>\n        <file>24/CR.png</file>\n        <file>24/CU.png</file>\n        <file>24/CV.png</file>\n        <file>24/CW.png</file>\n        <file>24/CX.png</file>\n        <file>24/CY.png</file>\n        <file>24/CZ.png</file>\n        <file>24/DE.png</file>\n        <file>24/DJ.png</file>\n        <file>24/DK.png</file>\n        <file>24/DM.png</file>\n        <file>24/DO.png</file>\n        <file>24/DZ.png</file>\n        <file>24/EC.png</file>\n        <file>24/EE.png</file>\n        <file>24/EG.png</file>\n        <file>24/EH.png</file>\n        <file>24/england.png</file>\n        <file>24/ER.png</file>\n        <file>24/ES.png</file>\n        <file>24/ET.png</file>\n        <file>24/EU.png</file>\n        <file>24/FI.png</file>\n        <file>24/FJ.png</file>\n        <file>24/FK.png</file>\n        <file>24/FM.png</file>\n        <file>24/FO.png</file>\n        <file>24/FR.png</file>\n        <file>24/GA.png</file>\n        <file>24/GB.png</file>\n        <file>24/GD.png</file>\n        <file>24/GE.png</file>\n        <file>24/GG.png</file>\n        <file>24/GH.png</file>\n        <file>24/GI.png</file>\n        <file>24/GL.png</file>\n        <file>24/GM.png</file>\n        <file>24/GN.png</file>\n        <file>24/GQ.png</file>\n        <file>24/GR.png</file>\n        <file>24/GS.png</file>\n        <file>24/GT.png</file>\n        <file>24/GU.png</file>\n        <file>24/GW.png</file>\n        <file>24/GY.png</file>\n        <file>24/HK.png</file>\n        <file>24/HN.png</file>\n        <file>24/HR.png</file>\n        <file>24/HT.png</file>\n        <file>24/HU.png</file>\n        <file>24/IC.png</file>\n        <file>24/ID.png</file>\n        <file>24/IE.png</file>\n        <file>24/IL.png</file>\n        <file>24/IM.png</file>\n        <file>24/IN.png</file>\n        <file>24/IQ.png</file>\n        <file>24/IR.png</file>\n        <file>24/IS.png</file>\n        <file>24/IT.png</file>\n        <file>24/JE.png</file>\n        <file>24/JM.png</file>\n        <file>24/JO.png</file>\n        <file>24/JP.png</file>\n        <file>24/KE.png</file>\n        <file>24/KG.png</file>\n        <file>24/KH.png</file>\n        <file>24/KI.png</file>\n        <file>24/KM.png</file>\n        <file>24/KN.png</file>\n        <file>24/kosovo.png</file>\n        <file>24/KP.png</file>\n        <file>24/KR.png</file>\n        <file>24/KW.png</file>\n        <file>24/KY.png</file>\n        <file>24/KZ.png</file>\n        <file>24/LA.png</file>\n        <file>24/LB.png</file>\n        <file>24/LC.png</file>\n        <file>24/LI.png</file>\n        <file>24/LK.png</file>\n        <file>24/LR.png</file>\n        <file>24/LS.png</file>\n        <file>24/LT.png</file>\n        <file>24/LU.png</file>\n        <file>24/LV.png</file>\n        <file>24/LY.png</file>\n        <file>24/MA.png</file>\n        <file>24/mars.png</file>\n        <file>24/MC.png</file>\n        <file>24/MD.png</file>\n        <file>24/ME.png</file>\n        <file>24/MF.png</file>\n        <file>24/MG.png</file>\n        <file>24/MH.png</file>\n        <file>24/MK.png</file>\n        <file>24/ML.png</file>\n        <file>24/MM.png</file>\n        <file>24/MN.png</file>\n        <file>24/MO.png</file>\n        <file>24/MP.png</file>\n        <file>24/MQ.png</file>\n        <file>24/MR.png</file>\n        <file>24/MS.png</file>\n        <file>24/MT.png</file>\n        <file>24/MU.png</file>\n        <file>24/MV.png</file>\n        <file>24/MW.png</file>\n        <file>24/MX.png</file>\n        <file>24/MY.png</file>\n        <file>24/MZ.png</file>\n        <file>24/NA.png</file>\n        <file>24/nagorno-karabakh.png</file>\n        <file>24/nato.png</file>\n        <file>24/NC.png</file>\n        <file>24/NE.png</file>\n        <file>24/NF.png</file>\n        <file>24/NG.png</file>\n        <file>24/NI.png</file>\n        <file>24/NL.png</file>\n        <file>24/NO.png</file>\n        <file>24/northern-cyprus.png</file>\n        <file>24/NP.png</file>\n        <file>24/NR.png</file>\n        <file>24/NU.png</file>\n        <file>24/NZ.png</file>\n        <file>24/olympics.png</file>\n        <file>24/OM.png</file>\n        <file>24/PA.png</file>\n        <file>24/PE.png</file>\n        <file>24/PF.png</file>\n        <file>24/PG.png</file>\n        <file>24/PH.png</file>\n        <file>24/PK.png</file>\n        <file>24/PL.png</file>\n        <file>24/PN.png</file>\n        <file>24/PR.png</file>\n        <file>24/PS.png</file>\n        <file>24/PT.png</file>\n        <file>24/PW.png</file>\n        <file>24/PY.png</file>\n        <file>24/QA.png</file>\n        <file>24/red-cross.png</file>\n        <file>24/RO.png</file>\n        <file>24/RS.png</file>\n        <file>24/RU.png</file>\n        <file>24/RW.png</file>\n        <file>24/SA.png</file>\n        <file>24/SB.png</file>\n        <file>24/SC.png</file>\n        <file>24/scotland.png</file>\n        <file>24/SD.png</file>\n        <file>24/SE.png</file>\n        <file>24/SG.png</file>\n        <file>24/SH.png</file>\n        <file>24/SI.png</file>\n        <file>24/SK.png</file>\n        <file>24/SL.png</file>\n        <file>24/SM.png</file>\n        <file>24/SN.png</file>\n        <file>24/SO.png</file>\n        <file>24/somaliland.png</file>\n        <file>24/south-ossetia.png</file>\n        <file>24/SR.png</file>\n        <file>24/SS.png</file>\n        <file>24/ST.png</file>\n        <file>24/SV.png</file>\n        <file>24/SY.png</file>\n        <file>24/SZ.png</file>\n        <file>24/TC.png</file>\n        <file>24/TD.png</file>\n        <file>24/TF.png</file>\n        <file>24/TG.png</file>\n        <file>24/TH.png</file>\n        <file>24/TJ.png</file>\n        <file>24/TK.png</file>\n        <file>24/TL.png</file>\n        <file>24/TM.png</file>\n        <file>24/TN.png</file>\n        <file>24/TO.png</file>\n        <file>24/TR.png</file>\n        <file>24/TT.png</file>\n        <file>24/TV.png</file>\n        <file>24/TW.png</file>\n        <file>24/TZ.png</file>\n        <file>24/UA.png</file>\n        <file>24/UG.png</file>\n        <file>24/united-nations.png</file>\n        <file>24/unknown.png</file>\n        <file>24/US.png</file>\n        <file>24/UY.png</file>\n        <file>24/UZ.png</file>\n        <file>24/VA.png</file>\n        <file>24/VC.png</file>\n        <file>24/VE.png</file>\n        <file>24/VG.png</file>\n        <file>24/VI.png</file>\n        <file>24/VN.png</file>\n        <file>24/VU.png</file>\n        <file>24/wales.png</file>\n        <file>24/WF.png</file>\n        <file>24/WS.png</file>\n        <file>24/XK.png</file>\n        <file>24/YE.png</file>\n        <file>24/YT.png</file>\n        <file>24/ZA.png</file>\n        <file>24/ZM.png</file>\n        <file>24/ZW.png</file>\n        <file>32/abkhazia.png</file>\n        <file>32/AD.png</file>\n        <file>32/AE.png</file>\n        <file>32/AF.png</file>\n        <file>32/AG.png</file>\n        <file>32/AI.png</file>\n        <file>32/AL.png</file>\n        <file>32/AM.png</file>\n        <file>32/AN.png</file>\n        <file>32/AO.png</file>\n        <file>32/AQ.png</file>\n        <file>32/AR.png</file>\n        <file>32/AS.png</file>\n        <file>32/AT.png</file>\n        <file>32/AU.png</file>\n        <file>32/AW.png</file>\n        <file>32/AX.png</file>\n        <file>32/AZ.png</file>\n        <file>32/BA.png</file>\n        <file>32/basque-country.png</file>\n        <file>32/BB.png</file>\n        <file>32/BD.png</file>\n        <file>32/BE.png</file>\n        <file>32/BF.png</file>\n        <file>32/BG.png</file>\n        <file>32/BH.png</file>\n        <file>32/BI.png</file>\n        <file>32/BJ.png</file>\n        <file>32/BL.png</file>\n        <file>32/BM.png</file>\n        <file>32/BN.png</file>\n        <file>32/BO.png</file>\n        <file>32/BR.png</file>\n        <file>32/british-antarctic-territory.png</file>\n        <file>32/BS.png</file>\n        <file>32/BT.png</file>\n        <file>32/BW.png</file>\n        <file>32/BY.png</file>\n        <file>32/BZ.png</file>\n        <file>32/CA.png</file>\n        <file>32/CC.png</file>\n        <file>32/CD.png</file>\n        <file>32/CF.png</file>\n        <file>32/CG.png</file>\n        <file>32/CH.png</file>\n        <file>32/CI.png</file>\n        <file>32/CK.png</file>\n        <file>32/CL.png</file>\n        <file>32/CM.png</file>\n        <file>32/CN.png</file>\n        <file>32/CO.png</file>\n        <file>32/commonwealth.png</file>\n        <file>32/CR.png</file>\n        <file>32/CU.png</file>\n        <file>32/CV.png</file>\n        <file>32/CW.png</file>\n        <file>32/CX.png</file>\n        <file>32/CY.png</file>\n        <file>32/CZ.png</file>\n        <file>32/DE.png</file>\n        <file>32/DJ.png</file>\n        <file>32/DK.png</file>\n        <file>32/DM.png</file>\n        <file>32/DO.png</file>\n        <file>32/DZ.png</file>\n        <file>32/EC.png</file>\n        <file>32/EE.png</file>\n        <file>32/EG.png</file>\n        <file>32/EH.png</file>\n        <file>32/england.png</file>\n        <file>32/ER.png</file>\n        <file>32/ES.png</file>\n        <file>32/ET.png</file>\n        <file>32/EU.png</file>\n        <file>32/FI.png</file>\n        <file>32/FJ.png</file>\n        <file>32/FK.png</file>\n        <file>32/FM.png</file>\n        <file>32/FO.png</file>\n        <file>32/FR.png</file>\n        <file>32/GA.png</file>\n        <file>32/GB.png</file>\n        <file>32/GD.png</file>\n        <file>32/GE.png</file>\n        <file>32/GG.png</file>\n        <file>32/GH.png</file>\n        <file>32/GI.png</file>\n        <file>32/GL.png</file>\n        <file>32/GM.png</file>\n        <file>32/GN.png</file>\n        <file>32/GQ.png</file>\n        <file>32/GR.png</file>\n        <file>32/GS.png</file>\n        <file>32/GT.png</file>\n        <file>32/GU.png</file>\n        <file>32/GW.png</file>\n        <file>32/GY.png</file>\n        <file>32/HK.png</file>\n        <file>32/HN.png</file>\n        <file>32/HR.png</file>\n        <file>32/HT.png</file>\n        <file>32/HU.png</file>\n        <file>32/IC.png</file>\n        <file>32/ID.png</file>\n        <file>32/IE.png</file>\n        <file>32/IL.png</file>\n        <file>32/IM.png</file>\n        <file>32/IN.png</file>\n        <file>32/IQ.png</file>\n        <file>32/IR.png</file>\n        <file>32/IS.png</file>\n        <file>32/IT.png</file>\n        <file>32/JE.png</file>\n        <file>32/JM.png</file>\n        <file>32/JO.png</file>\n        <file>32/JP.png</file>\n        <file>32/KE.png</file>\n        <file>32/KG.png</file>\n        <file>32/KH.png</file>\n        <file>32/KI.png</file>\n        <file>32/KM.png</file>\n        <file>32/KN.png</file>\n        <file>32/kosovo.png</file>\n        <file>32/KP.png</file>\n        <file>32/KR.png</file>\n        <file>32/KW.png</file>\n        <file>32/KY.png</file>\n        <file>32/KZ.png</file>\n        <file>32/LA.png</file>\n        <file>32/LB.png</file>\n        <file>32/LC.png</file>\n        <file>32/LI.png</file>\n        <file>32/LK.png</file>\n        <file>32/LR.png</file>\n        <file>32/LS.png</file>\n        <file>32/LT.png</file>\n        <file>32/LU.png</file>\n        <file>32/LV.png</file>\n        <file>32/LY.png</file>\n        <file>32/MA.png</file>\n        <file>32/mars.png</file>\n        <file>32/MC.png</file>\n        <file>32/MD.png</file>\n        <file>32/ME.png</file>\n        <file>32/MF.png</file>\n        <file>32/MG.png</file>\n        <file>32/MH.png</file>\n        <file>32/MK.png</file>\n        <file>32/ML.png</file>\n        <file>32/MM.png</file>\n        <file>32/MN.png</file>\n        <file>32/MO.png</file>\n        <file>32/MP.png</file>\n        <file>32/MQ.png</file>\n        <file>32/MR.png</file>\n        <file>32/MS.png</file>\n        <file>32/MT.png</file>\n        <file>32/MU.png</file>\n        <file>32/MV.png</file>\n        <file>32/MW.png</file>\n        <file>32/MX.png</file>\n        <file>32/MY.png</file>\n        <file>32/MZ.png</file>\n        <file>32/NA.png</file>\n        <file>32/nagorno-karabakh.png</file>\n        <file>32/nato.png</file>\n        <file>32/NC.png</file>\n        <file>32/NE.png</file>\n        <file>32/NF.png</file>\n        <file>32/NG.png</file>\n        <file>32/NI.png</file>\n        <file>32/NL.png</file>\n        <file>32/NO.png</file>\n        <file>32/northern-cyprus.png</file>\n        <file>32/NP.png</file>\n        <file>32/NR.png</file>\n        <file>32/NU.png</file>\n        <file>32/NZ.png</file>\n        <file>32/olympics.png</file>\n        <file>32/OM.png</file>\n        <file>32/PA.png</file>\n        <file>32/PE.png</file>\n        <file>32/PF.png</file>\n        <file>32/PG.png</file>\n        <file>32/PH.png</file>\n        <file>32/PK.png</file>\n        <file>32/PL.png</file>\n        <file>32/PN.png</file>\n        <file>32/PR.png</file>\n        <file>32/PS.png</file>\n        <file>32/PT.png</file>\n        <file>32/PW.png</file>\n        <file>32/PY.png</file>\n        <file>32/QA.png</file>\n        <file>32/red-cross.png</file>\n        <file>32/RO.png</file>\n        <file>32/RS.png</file>\n        <file>32/RU.png</file>\n        <file>32/RW.png</file>\n        <file>32/SA.png</file>\n        <file>32/SB.png</file>\n        <file>32/SC.png</file>\n        <file>32/scotland.png</file>\n        <file>32/SD.png</file>\n        <file>32/SE.png</file>\n        <file>32/SG.png</file>\n        <file>32/SH.png</file>\n        <file>32/SI.png</file>\n        <file>32/SK.png</file>\n        <file>32/SL.png</file>\n        <file>32/SM.png</file>\n        <file>32/SN.png</file>\n        <file>32/SO.png</file>\n        <file>32/somaliland.png</file>\n        <file>32/south-ossetia.png</file>\n        <file>32/SR.png</file>\n        <file>32/SS.png</file>\n        <file>32/ST.png</file>\n        <file>32/SV.png</file>\n        <file>32/SY.png</file>\n        <file>32/SZ.png</file>\n        <file>32/TC.png</file>\n        <file>32/TD.png</file>\n        <file>32/TF.png</file>\n        <file>32/TG.png</file>\n        <file>32/TH.png</file>\n        <file>32/TJ.png</file>\n        <file>32/TK.png</file>\n        <file>32/TL.png</file>\n        <file>32/TM.png</file>\n        <file>32/TN.png</file>\n        <file>32/TO.png</file>\n        <file>32/TR.png</file>\n        <file>32/TT.png</file>\n        <file>32/TV.png</file>\n        <file>32/TW.png</file>\n        <file>32/TZ.png</file>\n        <file>32/UA.png</file>\n        <file>32/UG.png</file>\n        <file>32/united-nations.png</file>\n        <file>32/unknown.png</file>\n        <file>32/US.png</file>\n        <file>32/UY.png</file>\n        <file>32/UZ.png</file>\n        <file>32/VA.png</file>\n        <file>32/VC.png</file>\n        <file>32/VE.png</file>\n        <file>32/VG.png</file>\n        <file>32/VI.png</file>\n        <file>32/VN.png</file>\n        <file>32/VU.png</file>\n        <file>32/wales.png</file>\n        <file>32/WF.png</file>\n        <file>32/WS.png</file>\n        <file>32/XK.png</file>\n        <file>32/YE.png</file>\n        <file>32/YT.png</file>\n        <file>32/ZA.png</file>\n        <file>32/ZM.png</file>\n        <file>32/ZW.png</file>\n        <file>64/abkhazia.png</file>\n        <file>64/AD.png</file>\n        <file>64/AE.png</file>\n        <file>64/AF.png</file>\n        <file>64/AG.png</file>\n        <file>64/AI.png</file>\n        <file>64/AL.png</file>\n        <file>64/AM.png</file>\n        <file>64/AN.png</file>\n        <file>64/AO.png</file>\n        <file>64/AQ.png</file>\n        <file>64/AR.png</file>\n        <file>64/AS.png</file>\n        <file>64/AT.png</file>\n        <file>64/AU.png</file>\n        <file>64/AW.png</file>\n        <file>64/AX.png</file>\n        <file>64/AZ.png</file>\n        <file>64/BA.png</file>\n        <file>64/basque-country.png</file>\n        <file>64/BB.png</file>\n        <file>64/BD.png</file>\n        <file>64/BE.png</file>\n        <file>64/BF.png</file>\n        <file>64/BG.png</file>\n        <file>64/BH.png</file>\n        <file>64/BI.png</file>\n        <file>64/BJ.png</file>\n        <file>64/BL.png</file>\n        <file>64/BM.png</file>\n        <file>64/BN.png</file>\n        <file>64/BO.png</file>\n        <file>64/BR.png</file>\n        <file>64/british-antarctic-territory.png</file>\n        <file>64/BS.png</file>\n        <file>64/BT.png</file>\n        <file>64/BW.png</file>\n        <file>64/BY.png</file>\n        <file>64/BZ.png</file>\n        <file>64/CA.png</file>\n        <file>64/CC.png</file>\n        <file>64/CD.png</file>\n        <file>64/CF.png</file>\n        <file>64/CG.png</file>\n        <file>64/CH.png</file>\n        <file>64/CI.png</file>\n        <file>64/CK.png</file>\n        <file>64/CL.png</file>\n        <file>64/CM.png</file>\n        <file>64/CN.png</file>\n        <file>64/CO.png</file>\n        <file>64/commonwealth.png</file>\n        <file>64/CR.png</file>\n        <file>64/CU.png</file>\n        <file>64/CV.png</file>\n        <file>64/CW.png</file>\n        <file>64/CX.png</file>\n        <file>64/CY.png</file>\n        <file>64/CZ.png</file>\n        <file>64/DE.png</file>\n        <file>64/DJ.png</file>\n        <file>64/DK.png</file>\n        <file>64/DM.png</file>\n        <file>64/DO.png</file>\n        <file>64/DZ.png</file>\n        <file>64/EC.png</file>\n        <file>64/EE.png</file>\n        <file>64/EG.png</file>\n        <file>64/EH.png</file>\n        <file>64/england.png</file>\n        <file>64/ER.png</file>\n        <file>64/ES.png</file>\n        <file>64/ET.png</file>\n        <file>64/EU.png</file>\n        <file>64/FI.png</file>\n        <file>64/FJ.png</file>\n        <file>64/FK.png</file>\n        <file>64/FM.png</file>\n        <file>64/FO.png</file>\n        <file>64/FR.png</file>\n        <file>64/GA.png</file>\n        <file>64/GB.png</file>\n        <file>64/GD.png</file>\n        <file>64/GE.png</file>\n        <file>64/GG.png</file>\n        <file>64/GH.png</file>\n        <file>64/GI.png</file>\n        <file>64/GL.png</file>\n        <file>64/GM.png</file>\n        <file>64/GN.png</file>\n        <file>64/GQ.png</file>\n        <file>64/GR.png</file>\n        <file>64/GS.png</file>\n        <file>64/GT.png</file>\n        <file>64/GU.png</file>\n        <file>64/GW.png</file>\n        <file>64/GY.png</file>\n        <file>64/HK.png</file>\n        <file>64/HN.png</file>\n        <file>64/HR.png</file>\n        <file>64/HT.png</file>\n        <file>64/HU.png</file>\n        <file>64/IC.png</file>\n        <file>64/ID.png</file>\n        <file>64/IE.png</file>\n        <file>64/IL.png</file>\n        <file>64/IM.png</file>\n        <file>64/IN.png</file>\n        <file>64/IQ.png</file>\n        <file>64/IR.png</file>\n        <file>64/IS.png</file>\n        <file>64/IT.png</file>\n        <file>64/JE.png</file>\n        <file>64/JM.png</file>\n        <file>64/JO.png</file>\n        <file>64/JP.png</file>\n        <file>64/KE.png</file>\n        <file>64/KG.png</file>\n        <file>64/KH.png</file>\n        <file>64/KI.png</file>\n        <file>64/KM.png</file>\n        <file>64/KN.png</file>\n        <file>64/kosovo.png</file>\n        <file>64/KP.png</file>\n        <file>64/KR.png</file>\n        <file>64/KW.png</file>\n        <file>64/KY.png</file>\n        <file>64/KZ.png</file>\n        <file>64/LA.png</file>\n        <file>64/LB.png</file>\n        <file>64/LC.png</file>\n        <file>64/LI.png</file>\n        <file>64/LK.png</file>\n        <file>64/LR.png</file>\n        <file>64/LS.png</file>\n        <file>64/LT.png</file>\n        <file>64/LU.png</file>\n        <file>64/LV.png</file>\n        <file>64/LY.png</file>\n        <file>64/MA.png</file>\n        <file>64/mars.png</file>\n        <file>64/MC.png</file>\n        <file>64/MD.png</file>\n        <file>64/ME.png</file>\n        <file>64/MF.png</file>\n        <file>64/MG.png</file>\n        <file>64/MH.png</file>\n        <file>64/MK.png</file>\n        <file>64/ML.png</file>\n        <file>64/MM.png</file>\n        <file>64/MN.png</file>\n        <file>64/MO.png</file>\n        <file>64/MP.png</file>\n        <file>64/MQ.png</file>\n        <file>64/MR.png</file>\n        <file>64/MS.png</file>\n        <file>64/MT.png</file>\n        <file>64/MU.png</file>\n        <file>64/MV.png</file>\n        <file>64/MW.png</file>\n        <file>64/MX.png</file>\n        <file>64/MY.png</file>\n        <file>64/MZ.png</file>\n        <file>64/NA.png</file>\n        <file>64/nagorno-karabakh.png</file>\n        <file>64/nato.png</file>\n        <file>64/NC.png</file>\n        <file>64/NE.png</file>\n        <file>64/NF.png</file>\n        <file>64/NG.png</file>\n        <file>64/NI.png</file>\n        <file>64/NL.png</file>\n        <file>64/NO.png</file>\n        <file>64/northern-cyprus.png</file>\n        <file>64/NP.png</file>\n        <file>64/NR.png</file>\n        <file>64/NU.png</file>\n        <file>64/NZ.png</file>\n        <file>64/olympics.png</file>\n        <file>64/OM.png</file>\n        <file>64/PA.png</file>\n        <file>64/PE.png</file>\n        <file>64/PF.png</file>\n        <file>64/PG.png</file>\n        <file>64/PH.png</file>\n        <file>64/PK.png</file>\n        <file>64/PL.png</file>\n        <file>64/PN.png</file>\n        <file>64/PR.png</file>\n        <file>64/PS.png</file>\n        <file>64/PT.png</file>\n        <file>64/PW.png</file>\n        <file>64/PY.png</file>\n        <file>64/QA.png</file>\n        <file>64/red-cross.png</file>\n        <file>64/RO.png</file>\n        <file>64/RS.png</file>\n        <file>64/RU.png</file>\n        <file>64/RW.png</file>\n        <file>64/SA.png</file>\n        <file>64/SB.png</file>\n        <file>64/SC.png</file>\n        <file>64/scotland.png</file>\n        <file>64/SD.png</file>\n        <file>64/SE.png</file>\n        <file>64/SG.png</file>\n        <file>64/SH.png</file>\n        <file>64/SI.png</file>\n        <file>64/SK.png</file>\n        <file>64/SL.png</file>\n        <file>64/SM.png</file>\n        <file>64/SN.png</file>\n        <file>64/SO.png</file>\n        <file>64/somaliland.png</file>\n        <file>64/south-ossetia.png</file>\n        <file>64/SR.png</file>\n        <file>64/SS.png</file>\n        <file>64/ST.png</file>\n        <file>64/SV.png</file>\n        <file>64/SY.png</file>\n        <file>64/SZ.png</file>\n        <file>64/TC.png</file>\n        <file>64/TD.png</file>\n        <file>64/TF.png</file>\n        <file>64/TG.png</file>\n        <file>64/TH.png</file>\n        <file>64/TJ.png</file>\n        <file>64/TK.png</file>\n        <file>64/TL.png</file>\n        <file>64/TM.png</file>\n        <file>64/TN.png</file>\n        <file>64/TO.png</file>\n        <file>64/TR.png</file>\n        <file>64/TT.png</file>\n        <file>64/TV.png</file>\n        <file>64/TW.png</file>\n        <file>64/TZ.png</file>\n        <file>64/UA.png</file>\n        <file>64/UG.png</file>\n        <file>64/united-nations.png</file>\n        <file>64/unknown.png</file>\n        <file>64/US.png</file>\n        <file>64/UY.png</file>\n        <file>64/UZ.png</file>\n        <file>64/VA.png</file>\n        <file>64/VC.png</file>\n        <file>64/VE.png</file>\n        <file>64/VG.png</file>\n        <file>64/VI.png</file>\n        <file>64/VN.png</file>\n        <file>64/VU.png</file>\n        <file>64/wales.png</file>\n        <file>64/WF.png</file>\n        <file>64/WS.png</file>\n        <file>64/XK.png</file>\n        <file>64/YE.png</file>\n        <file>64/YT.png</file>\n        <file>64/ZA.png</file>\n        <file>64/ZM.png</file>\n        <file>64/ZW.png</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "res/icons/icons.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/icons\">\n        <file>baseline-play_arrow-24px.svg</file>\n        <file>baseline-pause-24px.svg</file>\n        <file>baseline-search-24px.svg</file>\n        <file>baseline-stop-24px.svg</file>\n        <file>skip_next-24px.svg</file>\n        <file>skip_previous-24px.svg</file>\n        <file>cloud_upload-24px.svg</file>\n        <file>cloud_download-24px.svg</file>\n        <file>filter_list-24px.svg</file>\n        <file>zoom_out-24px.svg</file>\n        <file>zoom_in-24px.svg</file>\n        <file>done-24px.svg</file>\n        <file>check_circle-24px.svg</file>\n        <file>help-24px.svg</file>\n        <file>cancel-24px.svg</file>\n        <file>info-24px.svg</file>\n        <file>close-24px.svg</file>\n        <file>alert.svg</file>\n        <file>connect.svg</file>\n        <file>disconnect.svg</file>\n        <file>warning.svg</file>\n        <file>loading.gif</file>\n        <file>baseline-play_back-24px.svg</file>\n        <file>baseline-play_down-24px.svg</file>\n        <file>baseline-play_up-24px.svg</file>\n        <file>password.png</file>\n        <file>menu.svg</file>\n        <file>search-globe.svg</file>\n        <file>search-globe_red.svg</file>\n        <file>search-globe_green.svg</file>\n        <file>search-globe_orange.svg</file>\n        <file>delete-button.svg</file>\n        <file>new-window.svg</file>\n        <file>clear-button.svg</file>\n        <file>color-palette-light.svg</file>\n        <file>color-palette-dark.svg</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "res/io.github.foldynl.QLog.metainfo.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop-application\">\n  <id>io.github.foldynl.QLog</id>\n  <launchable type=\"desktop-id\">qlog.desktop</launchable>\n  <metadata_license>CC0-1.0</metadata_license>\n  <project_license>GPL-3.0-or-later</project_license>\n  <name>QLog</name>\n  <developer_name>Ladislav Foldyna</developer_name>\n  <developer id=\"io.github.foldynl\">\n    <name>Ladislav Foldyna</name>\n  </developer>\n  <summary>Amateur radio logbook</summary>\n  <description>\n    <p>\n      QLog is an Amateur Radio logging application for Linux, Windows. It is based on the Qt framework and uses SQLite as database backend.\n      QLog aims to be as simple as possible, but to provide everything the operator expects from the log to be. This log is not currently focused on contests.\n    </p>\n    <p>Features:</p>\n    <ul>\n      <li>Customizable GUI</li>\n      <li>Rig control via Hamlib, TCI, FLRig</li>\n      <li>Rotator control via Hamlib</li>\n      <li>HamQTH and QRZ.com callbook integration</li>\n      <li>DX cluster integration</li>\n      <li>LoTW, eQSL, QRZ.com, Clublog, HRDLog.net, ON4KST Chat, Cloudlog/Wavelog integration (eQSL includes QSL pictures download)</li>\n      <li>Secure Password Storage for all services with password or security token</li>\n      <li>Online and Offline map</li>\n      <li>Club Member lookup</li>\n      <li>CW Keyer Support - CWDaemon, FLDigi (all supported modes), Morse Over CAT, WinKey v1 or v2</li>\n      <li>Bandmap</li>\n      <li>CW Console</li>\n      <li>WSJT-X integration</li>\n      <li>Station Location Profile support</li>\n      <li>Various station statistics</li>\n      <li>Basic Awards support</li>\n      <li>Custom QSO Filters</li>\n      <li>NO ads, NO user tracking, NO hidden telemetry - simply free and open-source</li>\n      <li>SQLite backend</li>\n    </ul>\n  </description>\n  <screenshots>\n    <screenshot type=\"default\">\n      <caption>The QLog main window</caption>\n      <image type=\"source\">https://foldynl.github.io/QLog/screens/qlog_main.png</image>\n    </screenshot>\n  </screenshots>\n  <url type=\"homepage\">https://github.com/foldynl/QLog</url>\n  <url type=\"bugtracker\">https://github.com/foldynl/QLog/issues</url>\n  <url type=\"help\">https://github.com/foldynl/QLog/wiki</url>\n  <url type=\"contact\">https://github.com/foldynl</url>\n  <url type=\"vcs-browser\">https://github.com/foldynl/QLog</url>\n  <url type=\"contribute\">https://github.com/foldynl/QLog/blob/master/CONTRIBUTING.md</url>\n  <releases>\n    <release version=\"0.50.0\" date=\"2026-04-26\">\n      <description>\n        <ul>\n          <li>[NEW] - Added Split detection</li>\n          <li>[NEW] - Added Developer and Support tools (PR #991 @aa5sh @foldynl)</li>\n          <li>[NEW] - Added a simple QSL label printing dialog (issue #562)</li>\n          <li>[NEW] - Added Cabrillo contest export</li>\n          <li>[NEW] - Added direct labeling of QSL Requested and QSL Received to the QSO context menu (PR #982 @aa5sh)</li>\n          <li>[NEW] - DXCC Submission Report (PR #967 @aa5sh)</li>\n          <li>[NEW] - DXC - Search pre-fills the callsign from New Contact if callsign is present</li>\n          <li>[NEW] - Settings - Added Danger Zone tab with Delete all passwords and QSOs</li>\n          <li>[CHANGED] - Mutex-free Omnirig1 and Omnirig2</li>\n          <li>[CHANGED] - POTA/SOTA/WWFF/SAT list are download from QLog LOV-repo</li>\n          <li>[CHANGED] - Used an external lib for CSV parsing for LOV Download</li>\n          <li>[CHANGED] - Import - ADIF import updates DXCC only if it is missing in the QSO (issue #983)</li>\n          <li>[REMOVED] - Import - ADIF import does not include the option to update DXCC during the import - no longer needed</li>\n          <li>Fixed Callsign disappears when calling a DX in a split via VFO-B (issue #799)</li>\n          <li>Fixing Rendering issue (issue #989)</li>\n          <li>Updated debian packaging (PR @979 thx @dawkagaming)</li>\n          <li>Hamlib rigctld switching between VFO A/B doesnt change the band mode - added workaround (issue #999)</li>\n          <li>Awards internal redesign</li>\n          <li>Removed AN from the WAC award (issue #1010)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.49.1\" date=\"2026-03-19\">\n      <description>\n        <ul>\n          <li>Fixed Online Map OSM Access Blocked banner (issue #956)</li>\n          <li>Fixed Package build process issue - openssl-dev is missing (issue #957)</li>\n          <li>Fixed Missing dependence for QTKeychain (issue #964)</li>\n          <li>Added French Translation (PR #969 thx @fillods)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.49.0\" date=\"2026-03-13\">\n      <description>\n        <ul>\n          <li>[NEW] - Added Pack and Unpack Data and Setting - Computer to Computer Migration (issue #535)</li>\n          <li>[NEW] - Added Rig Sharing via Rigctld (PR #736 issue #159 @aa5sh @foldynl)</li>\n          <li>[NEW] - Added QSL Gallery</li>\n          <li>[NEW] - QSO Filter - Added REGEXP operator</li>\n          <li>[NEW] - Settings - TQSL - Added Path auto-detect and validation</li>\n          <li>[NEW] - Upload QSO - Added LoTW Station Location Combo (PR #929 @TrgoSk @foldynl)</li>\n          <li>[NEW] - QSO Export - Added Station Profile Filter</li>\n          <li>[NEW] - BandMap shows emergency frequencies (issue #462)</li>\n          <li>[NEW] - Added Speed Up Down Macros - WinKey and CWDaemon (issue #491)</li>\n          <li>[NEW] - Settings Winkey v2 - Added PaddleOnly Sidetone (issue #739)</li>\n          <li>[NEW] - Settings Winkey v2 and CWDaemon - Added Sidetone Freq</li>\n          <li>[NEW] - All County fields contain Completer for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)</li>\n          <li>[NEW] - Added County Awards for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)</li>\n          <li>[NEW] - ADIF 3.1.7 - Added new modes FT2, FREEDATA, RIBBIT_PIX, RIBBIT_SMS (issue #934)</li>\n          <li>[CHANGED] - Generic FTx for FT8/FT4 (FT2) in Alert and DXC filter (issue #937)</li>\n          <li>[CHANGED] - LoTW QSL matching algorithm uses Mode and Mode Group matching (issue #942)</li>\n          <li>[CHANGED] - Reduced download period for DXCC Entities from 21 to 7 days</li>\n          <li>LogbookWidget: Delete Performance Optimization</li>\n          <li>Fixed Awards POTA Activator Filter</li>\n          <li>Fixed man page</li>\n          <li>Fixing SATmode Activity is blank (issue #948)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.48.0\" date=\"2026-01-30\">\n      <description>\n        <ul>\n          <li>[NEW] - Rig Widget - tuning rig with mouse (issue #855)</li>\n          <li>[NEW] - Awards - Added User Filter Combo (issue #870)</li>\n          <li>[NEW] - Statistics - Added User Filter; new Dialog layout (issue #870)</li>\n          <li>[NEW] - Alerts - Added detailed Log Status settings (issue #817)</li>\n          <li>[NEW] - Settings - Enable/Disable sending color-coded status indicators back to WSJT-X (issue #885 @aa5sh @foldynl)</li>\n          <li>[CHANGED] - Omnirig Drivers: Removed QT AXContainers - pure Windows API code</li>\n          <li>[CHANGED] - Enabled Chekbox in Alerts Table (issue #867)</li>\n          <li>[CHANGED] - Serial Port Completer contains Horizontal ScrollBar</li>\n          <li>[CHANGED] - TCI - Settings - Default PWR defines the maximum output power</li>\n          <li>Fixed Omnirig drivers keep sending frequency change (issue #872)</li>\n          <li>Fixed ADIF import does not accept a default operator name (issue #884)</li>\n          <li>Fixed HamQTH URL from http to https (PR #886 @aa5sh)</li>\n          <li>Fixed Missing Band value when QSO from FLDigi (issue #892)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.47.1\" date=\"2025-12-19\">\n      <description>\n        <ul>\n          <li>[CHANGED] - DXC - VE7CC-type Cluster is correctly detected (PR #851 @kyleboyle)</li>\n          <li>[CHANGED] - Chat - Changed ON4KST URL (issue #857)</li>\n          <li>Fixed missing clear button for Search Callsign (issue #753)</li>\n          <li>Fixed Updated QSOs are not sent to wavelog (issue #847)</li>\n          <li>Fixed Fixed Omnirig(v2) getFreq, getVFO, setFreq (issue #853)</li>\n          <li>Fixed ADI Header does not follow ADIF Spec (issue #859)</li>\n          <li>Fixed OmniRig settings are not saved (issue #862)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.47.0\" date=\"2025-12-06\">\n      <description>\n        <ul>\n          <li>[NEW] - Adds theme options - native, light, dark (PR #718 @kyleboyle)</li>\n          <li>[NEW] - Implemented ADIF 3.1.6</li>\n          <li>[NEW] - ADIF 3.1.6 - Added new modes FSK and MTONE</li>\n          <li>[NEW] - ADIF 3.1.6 - Added new contest IDs</li>\n          <li>[NEW] - ADIF 3.1.6 - Added new column EQSL_AG (Import/Export only)</li>\n          <li>[NEW] - Statistics, QSODetail contain deleted DXCC Entities (PR #728 @aa5sh @foldynl)</li>\n          <li>[NEW] - Settings Hamlib - Added support to define CIV Addr for Icom and Ten-Tec (issue #747)</li>\n          <li>[NEW] - Settings Hamlib - Added RTS and DTR control (PR #809 @aa5sh)</li>\n          <li>[NEW] - Settings GUI - Added options to switch distance unit</li>\n          <li>[NEW] - Added Linux manpage (PR #791 @dawkagaming)</li>\n          <li>[NEW] - Added a link to the GitHub release notes under Help-Whats New</li>\n          <li>[NEW] - Added workaround for WriteLog - always call callbook lookups (PR #833 @sjwoodr)</li>\n          <li>[NEW] - Awards - Added Not-Confirmed filter (PR #836 @aa5sh)</li>\n          <li>[NEW] - Rotator Widget - Added buttons to change button profiles</li>\n          <li>[CHANGED] - Settings - Added network loop detection for WSJTX Forward (issue #815 @aa5sh @foldynl)</li>\n          <li>[CHANGED] - Rotator - Rotator timeout is set to 5s (PR #823 @aa5sh)</li>\n          <li>[CHANGED] - Double Spin Boxes - the decimal separator is forced to be a period</li>\n          <li>[DELETED] - WSJTX Widget - Removed Freq and Mode</li>\n          <li>Fixed QSODetail - Anti-meridian bug on map (issue #786)</li>\n          <li>Fixed Statistics: Center maps on QTH longitude (issue #824)</li>\n          <li>Fixed OmniRig disconnecting when its status changed unexpectedly (issue #832)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.46.2\" date=\"2025-10-31\">\n      <description>\n        <ul>\n          <li>Fixed Spaces after QRZ.com name (issue #767)</li>\n          <li>Fixed SPID Rot1Prog Rotator more 360 deg (issue #775)</li>\n          <li>Fixed build instructions on Debian (PR #777 @leventelist)</li>\n          <li>Fixed Bandmap truncated output despite having space (issue #779)</li>\n          <li>Fixed Statistics - Anti-meridian bug on map (issue #786)</li>\n          <li>Fixed Binary file in the tarballs (issue #794)</li>\n          <li>Fixed LOTW and eQSL upload status updated even when nothing is uploaded (issue #807)</li>\n          <li>Fixed Imported QSOs contain incorrect My DXCC info (issue #812)</li>\n          <li>Fixed Statistics Dialog does not show confirmed grids</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.46.1\" date=\"2025-09-26\">\n      <description>\n        <ul>\n          <li>Fixed QSO filter incorrectly displays inserted date (issue #752)</li>\n          <li>Fixed Logbook Search Icon is not centered (issue #753)</li>\n          <li>Fixed Using CQRLog API Key for Clublog (issue #759)</li>\n          <li>Fixed Online Service Password leaking via debug files (issue #760)</li>\n          <li>Fixed Tabs are not showed properly (PR #762 @aa5sh)</li>\n          <li>Fixed inability to edit Power in QSO Detail (issue #763)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.46.0\" date=\"2025-09-12\">\n      <description>\n        <ul>\n          <li>[NEW] - NewContact: POTA/SOTA/WWFF/IOTA info is taken from the nearest spot (@aa5sh @foldynl)</li>\n          <li>[NEW] - DXSpots are sent to Flex Radio (PR #694 @aa5sh)</li>\n          <li>[NEW] - CWConsole - Added support for automatic periodic sending of CW Macros (issue #708)</li>\n          <li>[NEW] - Added mapping of Winkey hardware buttons to CW macro keys F1–F4 (issue #711)</li>\n          <li>[NEW] - Added Search Types to the Logbook Search Editbox (issue #733)</li>\n          <li>[NEW] - Rig - Periodic Rig status reporting independent of its changes (PR #730 @aa5sh)</li>\n          <li>[NEW] - Settings - Serial Port Completer for MacOS and Linux (PR #737 @aa5sh)</li>\n          <li>[NEW] - Hamlib - Attempt to send Power On when connecting the Rig</li>\n          <li>[NEW] - POTA Spots Info is received from the API at api.pota.app to improve POTA detection</li>\n          <li>[CHANGED] - Logbook Search Filter Widget - Added Search Widget</li>\n          <li>[CHANGED] - QSO Detail Country boxes use the new Search Filter Widget</li>\n          <li>[CHANGED] - NewContact - RST field uses the Overwrite Mode</li>\n          <li>[CHANGED] - NewContact - Default cursor position in RST is at the first character</li>\n          <li>[CHANGED] - Setting Dialog - Modes - Default Report can define cursor position</li>\n          <li>[CHANGED] - HamlibRot - Changed Poll Interval from 500 to 2000ms</li>\n          <li>Fixed DUPE is not detected for the first Contest QSO (issue #699)</li>\n          <li>Fixed FREQ_RX/BAND_RX is present only when RX and TX freqs are different (issue #714)</li>\n          <li>Fixed Repeated log recording (issue #722)</li>\n          <li>Fixed QSO Filter contains untranslated QSO items (issue #732)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.45.0\" date=\"2025-07-11\">\n      <description>\n        <ul>\n          <li>[NEW] - Single Dialog for Upload/Download Online Services (issue #448)</li>\n          <li>[NEW] - Added option to swap paddles to Winkey settings (issue #676)</li>\n          <li>[NEW] - Added native support for the FLRig interface (issue #679)</li>\n          <li>[NEW] - Added New Version Notification - only for MacOS and Windows (PR #669 @aa5sh)</li>\n          <li>[NEW] - QRZ Upload - Added support for multiple API Keys</li>\n          <li>[NEW] - Logbook - Added highlighting to the filter button when a filter is active</li>\n          <li>[NEW] - WSJTX - Filtered label is shown when filter is enabled</li>\n          <li>[NEW] - DXC - Filtered label is shown when filter is enabled</li>\n          <li>[NEW] - Added support to Upload Cloudlog/Wavelog</li>\n          <li>[NEW] - Add JS8 to legacy_modes.json (issue #677)</li>\n          <li>[CHANGED] - Unification Settings storage</li>\n          <li>[CHANGED] - Calculate distances according to IARU rules</li>\n          <li>Fixed missing Wsjtx Spot values in the AlertWindow</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.44.1\" date=\"2025-05-11\">\n      <description>\n        <ul>\n          <li>Fixed Rotator Widget Seg Fault for new users (issue #666)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.44.0\" date=\"2025-05-09\">\n      <description>\n        <ul>\n          <li>[NEW] - Activity Manager - Added SKCC, UKSMG and FISTS as Dynamic Fields</li>\n          <li>[NEW] - QSO - FISTS, SKCC, and UKSMG are auto-filled from MembershipQE (issue #628)</li>\n          <li>[NEW] - Rotator - Added QSO destination needle (issue #644)</li>\n          <li>[NEW] - QSO Detail - Adds grayline and short path (PR #653 @kyleboyle)</li>\n          <li>[CHANGED] - Rotator - Needle colors correspond to the online map (issue #644)</li>\n          <li>Fixed TCI cw_macros must contain RigID (issue #663)</li>\n          <li>Fixed TCI setKeySpeed sets keyer and macros speed (issue #663)</li>\n          <li>Fixed Data mode missing in rig control window - rigctld (issue #660 @aa5sh)</li>\n          <li>Improved DXC Mode detection</li>\n          <li>Updated Simplified Chinese translation</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.43.1\" date=\"2025-04-19\">\n      <description>\n        <ul>\n          <li>Fixed Click on PHONE DX Spots sets wrong mode (issue #453)</li>\n          <li>Fixed No freq via Omnirig for IC7400 (issue #639)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.43.0\" date=\"2025-04-04\">\n      <description>\n        <ul>\n          <li>[NEW] - Added support to receive QSOs from CSN SAT Device (PR #610 @aa5sh)</li>\n          <li>[NEW] - Bandmap - Multiple independent bandmap windows (PR #593 @kyleboyle @foldynl)</li>\n          <li>[NEW] - Winkey Keyer driver currently supports v1 and v2 hardware</li>\n          <li>[NEW] - QSO Detail - QSLs QSLr Msg is editable</li>\n          <li>[NEW] - Activity Manager - Added new dynamic field - QSL Message Send</li>\n          <li>[CHANGED] - HamlibDrv - Enabled Power, RIT, XIT, Morse for RIG Netctl</li>\n          <li>[CHANGED] - QSO Detail - QSLMSG replaced by QSLMSG_RCVD (issue #633)</li>\n          <li>[CHANGED] - eQSL Upload - Added an option to choose a QSLMsg field</li>\n          <li>[CHANGED] - eQSL Download - eQSL QSLMSG is stored to QLog QSLMSG_RCVD</li>\n          <li>[CHANGED] - eQSL Download - Added QSLMSG_RCVD merging - eQSL message is appended</li>\n          <li>Fixed Speed pot doesn't seem to work with a WinKeyer; double chars (issue #618)</li>\n          <li>Fixed BandMap Spots colour change after a QSO (issue #632)</li>\n          <li>Fixed Incorrect Field Mapping for Received eQSL Messages (issue #633)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.42.2\" date=\"2025-03-07\">\n      <description>\n        <ul>\n          <li>Fixed Logbook country translations (issue #608)</li>\n          <li>Fixed Unexpected dialog when QSO after contest (issue #614)</li>\n          <li>Fixed Statistics Widget does not display NULL continents (@aa5sh)</li>\n          <li>Fixed Statistics Widget does not display NULL Band, Mode</li>\n          <li>Fixed Statistics Widget TOP10 does not display removed DXCCs</li>\n          <li>Fixed Statistics Widget TOP10 does not display translated country names</li>\n          <li>Fixed Awards Widget does not display removed DXCCs</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.42.1\" date=\"2025-02-22\">\n      <description>\n        <ul>\n          <li>Fixed Unexpected timezone info (issue #600)</li>\n          <li>Fixed DXCC Statistics picks more entities (issue #601)</li>\n          <li>Fixed a crash when no internet connection</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.42.0\" date=\"2025-02-14\">\n      <description>\n        <ul>\n          <li>[NEW] - Awards - Added Slots - total over each band (issue #538)</li>\n          <li>[NEW] - Awards - Added Grid Award - 2/4/6 Chars grid (issue #564)</li>\n          <li>[NEW] - Settings - Added options to switch 12/24 time and date format (issue #573)</li>\n          <li>[NEW] - Activity Manager - Added new dynamic fields - Rig (issue #575)</li>\n          <li>[NEW] - LoTW Import - Fill missing information also for confirmed QSOs (@aa5sh)</li>\n          <li>[NEW] - Added CW macro QTH</li>\n          <li>[NEW] - DXC - Added 15min Trend</li>\n          <li>[CHANGED] - Changed IOTA LOV Source, the official web is used</li>\n          <li>[CHANGED] - CSV Export: Time and Date formats use ISO8601 format (issue #562)</li>\n          <li>[CHANGED] - Settings - Renamed Shortcuts to GUI tab</li>\n          <li>[CHANGED] - LOV - Improved LOV download performance (PR #582 @aa5sh)</li>\n          <li>Partial fix Windows State/Size does not save in case of fullscreen (issue #418)</li>\n          <li>Fixing TCI error when you change Rig (issue #526)</li>\n          <li>Fixed DXCC Award total worked confirmed counts included deleted entities (PR #588 @aa5sh)</li>\n          <li>Fixed Raspberry PI Flatpak - Import Select file dialog crashes (issue #589)</li>\n          <li>Suppressed the ability to edit Contest fields after the start (issue #590)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.41.1\" date=\"2025-01-21\">\n      <description>\n        <ul>\n          <li>Fixed compilation issue under Debian 12 (issue #571)</li>\n          <li>Fixed Incorrect GPL version in rpm/deb packages (issue #572)</li>\n          <li>Fixed MacOS floating utility window bug (PR #576 @kyleboyle)</li>\n          <li>Updated IT translation</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.41.0\" date=\"2025-01-11\">\n      <description>\n        <ul>\n          <li>[NEW] - Logbook - Added a new context menu item - Update QSO from Callbook (issue #450 @aa5sh)</li>\n          <li>[NEW] - DIGI mode is used in case of DXC Digi Spots (issue #480)</li>\n          <li>[NEW] - DXC - Retrieve information about SOTA, POTA, IOTA and WWFF from comment (issue #482)</li>\n          <li>[NEW] - Alert - Added SOTA, POTA, IOTA and WWFF filter</li>\n          <li>[NEW] - Added the COM Port Completer for Windows platform (issue #490)</li>\n          <li>[NEW] - Settings - Added DXCC Confirmed By options (issue #508)</li>\n          <li>[NEW] - Added POTA Export Formatter (activator/hunter) (PR #514 @kyleboyle)</li>\n          <li>[NEW] - CW Console - CW Halt with the user-defined shortcut (issue #518)</li>\n          <li>[NEW] - Added an input parameter to save debug message to file</li>\n          <li>[NEW] - Logbook - Added sorting function to logbook table columns (PR #540 @kyleboyle)</li>\n          <li>[NEW] - Network Notification - Added Rig Status Notification</li>\n          <li>[NEW] - Implemented ADIF 3.1.5</li>\n          <li>[NEW] - ADIF 3.1.5 - Added new submodes FSKH245 and FSKH105 for HELL</li>\n          <li>[NEW] - ADIF 3.1.5 - Added new contest IDs</li>\n          <li>[NEW] - ADIF 3.1.5 - Added new columns (Import/Export only)</li>\n          <li>[NEW] - ADIF 3.1.5 - Added My DARC DOK to Station Profile</li>\n          <li>[CHANGED] - Settings: disabled band and mode name modification</li>\n          <li>[CHANGED] - DX Stats contain all enabled bands (issue #538)</li>\n          <li>[CHANGED] - Removed Freq, TimeDate On/Off Data Type Indicators (issue #552)</li>\n          <li>[CHANGED] - ADIF 3.1.5 - VUCC and MY_VUCC can contain 6 or 4-chars locators</li>\n          <li>[CHANGED] - Stop exporting default value N for qsl_rcvd, qsl_sent, lotw/dcl/eslq_qsl_rcvd/sent</li>\n          <li>[CHANGED] - Extended QSL/Import Dupe matching rule to Callsign, Band, Mode, Time and Sat_Name (issue #563)</li>\n          <li>Fixed MacOS - keep floating windows visible on app unfocus (issue #530)</li>\n          <li>Fixed Contest Filter ignores the first QSO (issue #529)</li>\n          <li>Fixed It is not possible to quit Qlog with detached widgets Rot and Rig (issue #534)</li>\n          <li>Fixed ADX/CSV/JSON do not export non-ASCII chars (issue #542)</li>\n          <li>Fixed Checking the 60m checkbox in cluster filters allows 160m spots to appear (issue #543 @aa5sh)</li>\n          <li>Fixed Problems uploading to QRZ.com (issue #559 PR #561 @aa5sh)</li>\n          <li>Fixed DX Stat screen is jumping up/down</li>\n          <li>Fixed Omnirig drivers: Digi modes are not correclty recognized</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.40.1\" date=\"2024-11-29\">\n      <description>\n        <ul>\n          <li>Fixed Bands - Added missing 8m band (issue #515)</li>\n          <li>Fixed CW Console - EXCSTR does not work properly (issue #517)</li>\n          <li>Fixed Activity Manager - Missing Propagation Mode None (issue #519)</li>\n          <li>Fixed QSO Filter - filter fields with random order (PR #525 @aa5sh)</li>\n          <li>Fixed TCI error when you change Rig (issue #526)</li>\n          <li>Fixed NewContact - satellite mode too wide (issue #527)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.40.0\" date=\"2024-11-24\">\n      <description>\n        <ul>\n          <li>[NEW] - Activity Manager - merged Layout Manager and profiles (issue #408)</li>\n          <li>[NEW] - Activity Manager - Added new dynamic fields - Contest fields, RX/TX Power</li>\n          <li>[NEW] - Added light support for contests (issue #345)</li>\n          <li>[NEW] - Added CW macros EXCHSTR, EXCHNR, EXCHNRN</li>\n          <li>[NEW] - Export Filter - Added user filter combo (original idea PR #476 @aa5sh)</li>\n          <li>[NEW] - New Contact -  Added expand/collapse button to QSO field tab widget (PR #495 @kyleboyle)</li>\n          <li>[NEW] - Alert - Added CQZ and ITUZ filters</li>\n          <li>[NEW] - KSTChat - Added a new 40MHz room (PR #496 @kyleboyle)</li>\n          <li>[NEW] - Station Profile contains Operator Callsign (issue #441 @kyleboyle)</li>\n          <li>[NEW] - Station Profile contains County (issue #493 @kyleboyle)</li>\n          <li>[NEW] - Statistics - Adds time of day and better qso mapping (PR #501 @kyleboyle)</li>\n          <li>[NEW] - Bandmap - Tooltip shows a spotter callsign (PR #507 @Skittlebrau)</li>\n          <li>[CHANGED] - New Contact - Renamed DXCC Tab to DX Stats contains DXCC and Station Statistics (issue #477)</li>\n          <li>[CHANGED] - QSL Import dialog - Detail text is selectable by mouse and keyboard</li>\n          <li>[CHANGED] - Removed Main Menu Layout; Activity Manager is in the bottom-left corner</li>\n          <li>[CHANGED] - Removed Keep Options from the Equipment Menu - use Activity Manager for it</li>\n          <li>Fixed issue when CW is always selected after Settings exiting or connecting the Rig</li>\n          <li>Updated Timezone definition file - version 2024b</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.39.0\" date=\"2024-10-05\">\n      <description>\n        <ul>\n          <li>[NEW] - DXC - Added Full-text search</li>\n          <li>[NEW] - Select S in RST Edit when focused (issue #454)</li>\n          <li>[NEW] - Alerts - Added Member Column</li>\n          <li>[CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep</li>\n          <li>[CHANGED] - Changed Backup policy</li>\n          <li>[CHANGED] - Logbook page size - improved performance</li>\n          <li>[CHANGED] - Logbook - CTRL-A (Select All) is disabled</li>\n          <li>[CHANGED] - Awards - Bands are displayed based on the Settings (issue #452)</li>\n          <li>[CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh)</li>\n          <li>[CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh)</li>\n          <li>[CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map</li>\n          <li>[CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received</li>\n          <li>[CHANGED] - Added a postponed handling for Rig soft errors (issue #472)</li>\n          <li>Fixed WSJT-X does not emit band change if rig is disconnected (issue #447)</li>\n          <li>Fixed Wrong import of ADIF file of another log program (issue #455)</li>\n          <li>Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458)</li>\n          <li>Fixed ADIF import does not import records with old DXCC Entities (issue #459)</li>\n          <li>Fixed ADIF import incorrectly uses Station Profile parameters (issue #461)</li>\n          <li>Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464)</li>\n          <li>Fixed Alerts Window displays OOB Spots (issue #469)</li>\n          <li>Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.38.0\" date=\"2024-08-29\">\n      <description>\n        <ul>\n          <li>[NEW] - Logbook - Added Send DX Spot to the QSO Context Menu</li>\n          <li>[NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh)</li>\n          <li>[NEW] - Rig Setting - Added RTS/DTR PTT Type support (issue #353)</li>\n          <li>[NEW] - Bandmap - Scrollbar position is saved per band (issue #415)</li>\n          <li>[NEW] - New Contact - Added a dynamic value completer for SIG field (issue #425)</li>\n          <li>[NEW] - Awards - Added SOTA/POTA/WWFF (@aa5sh issue #311)</li>\n          <li>[NEW] - Awards - Added Not-Worked Filter</li>\n          <li>[NEW] - New Contact - Added Long Path Azimuth info</li>\n          <li>[NEW] - POTA Fields allow a comma-delimited list of one or more POTA Refs</li>\n          <li>[NEW] - WSJTX tunes freq/mode like Rig if rig is disconnected</li>\n          <li>[CHANGED] - Alert Widget is a Dock Widget (issue #399)</li>\n          <li>[CHANGED] - QLog adds more information from callbook for WSJTX QSOs (issues #403 #405 #420)</li>\n          <li>[CHANGED] - File Open dialogs are not a native dialog under Linux (issue #427)</li>\n          <li>[CHANGED] - Profiles transferred to DB</li>\n          <li>[CHANGED] - LOV last_dates transferred to DB</li>\n          <li>[CHANGED] - DX Cluster - Login Callsign is always the base Callsign</li>\n          <li>[REMOVED] - Setting DXCC Date</li>\n          <li>Fix for MacOS Layout Geometry Restore (@aa5sh)</li>\n          <li>Fixed TQSL does not block GUI thread</li>\n          <li>Fixed MacOS build process (@aa5sh)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.37.2\" date=\"2024-07-26\">\n      <description>\n        <ul>\n          <li>Fixed Field QSL Send Via should be retained (issue #413)</li>\n          <li>Fixed Set rotator position fails if azimuth > 180 (issue #417)</li>\n          <li>Fixed Windows State/Size does not save in case of fullscreen (issue #418)</li>\n          <li>Fixed Significant rounding during azimuth calculation (issue #422)</li>\n          <li>Updated Simplified Chinese translation</li>\n          <li>Updated Spanish translaction</li>\n          <li>Added Italian translation (thx IK1VQY)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.37.1\" date=\"2024-07-10\">\n      <description>\n        <ul>\n          <li>Fixed QSO Table Callsign filter is not filled properly (issue #401)</li>\n          <li>Fixed DXC zero frequency for last QSO in case of FT8 QSOs (issue #404)</li>\n          <li>Fixed Callsign Context Menu does not work (issue #409)</li>\n          <li>Fixed QSO Detail Save and Edit buttons are not translated (issue #410)</li>\n        </ul>\n      </description>\n    </release>\n    <release version=\"0.37.0\" date=\"2024-07-01\">\n      <description>\n        <ul>\n          <li>[NEW] - Added Shortcuts Editor (issue #293)</li>\n          <li>[NEW] - Added QO100 Bandplan to correctly categorize the DX Spots</li>\n          <li>[NEW] - Improveded detection of SH/DX SHF Spots</li>\n          <li>[NEW] - Online Map - Added WSJTX CQ Spots</li>\n          <li>[NEW] - WSJTX - Sortable View</li>\n          <li>[NEW] - Alerts - Sortable View</li>\n          <li>[NEW] - Added Spanish translation (thx LU1IDC)</li>\n          <li>[NEW[ - Added Search Callsign Clear Button (issue #396)</li>\n          <li>[CHANGED] - QRZ auth should be over POST with form data (issue #389)</li>\n          <li>[CHANGED] - Big CTY file is used</li>\n          <li>[CHANGED] - Callbook Country DXCC ID is used in case of difference from Big CTY</li>\n          <li>[CHANGED] - Removed ALT+W and CTRL+DEL shortcuts</li>\n          <li>[CHANGED] - Removed New Contact and Save Contact from Logbook Main Menu</li>\n          <li>Fixed Guantanamo KG4 Issue (issue #372)</li>\n          <li>Fixed QRZ Lookup Not Including Full Name - History (issue #388)</li>\n          <li>Fixed Spot Last QSO contains TX freq, should contain RX freq (issue #390)</li>\n          <li>Fixed Spot Last QSO must contain Freq in kHz (issue #391)</li>\n          <li>Fixed Bandmap select previous selected callsign issue (issue #394)</li>\n          <li>Fixed Malfunctioning tuning of WSJTX Alert spot</li>\n          <li>Fixed DXCC Status for FT4 Spots incorrectly identified in WSJTX</li>\n        </ul>\n      </description>\n    </release>\n  </releases>\n  <content_rating type=\"oars-1.1\"/>\n</component>\n"
  },
  {
    "path": "res/map/onlinemap.html",
    "content": "<!DOCTYPE html>\n<html>\n\n<head>\n  <title>Online Map</title>\n  <meta charset=\"utf8\" />\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no\" />\n  <link rel=\"stylesheet\" href=\"https://unpkg.com/leaflet@1.7.1/dist/leaflet.css\" integrity=\"sha512-xodZBNTC5n17Xt2atTPuE1HxjVMSvLVW9ocqUKLsCC5CXdbqCmblAshOMAS6/keqq/sMZMZ19scR4PsZChSR7A==\" crossorigin=\"\"/>\n  <script src=\"https://unpkg.com/leaflet@1.7.1/dist/leaflet.js\" integrity=\"sha512-XQoYMqMTK8LvdxXYG3nZ448hOEQiglfqkJs1NOQV44cWnUrBc8PkAOcXy20w0vlaXaVUearIOBhiXZ5V3ynxwA==\" crossorigin=\"\"></script>\n  <script src=\"https://foldynl.github.io/QLog/js/L.MaidenheadConfWorked.js\"></script>\n  <script src=\"https://unpkg.com/@joergdietrich/leaflet.terminator\"></script>\n  <script src=\"https://foldynl.github.io/QLog/js/heatmap.js\"></script>\n  <script src=\"https://foldynl.github.io/QLog/js/leaflet-heatmap.js\"></script>\n  <script src=\"https://unpkg.com/leaflet.geodesic@2.6.1/dist/leaflet.geodesic.umd.min.js\"></script>\n  <style>\n    body {\n      padding: 0;\n      margin: 0;\n    }\n    html, body, #map {\n      height: 100%;\n    }\n    .leaflet-tooltip {\n        border: 0px;\n        color: #232D45;\n        box-shadow: none;\n        margin: 0px !important;\n        line-height: 10px;\n        font-weight: 900;\n      }\n    .leaflet-tooltip-top:before,\n    .leaflet-tooltip-bottom:before,\n    .leaflet-tooltip-left:before,\n    .leaflet-tooltip-right:before {\n        border: none !important;\n    }\n    .leaflet-tooltip.muf-tooltip {\n        border-radius: 20px;\n        background-color: transparent;\n        padding: 5px;\n        font-weight: bold;\n    }\n    .leaflet-tooltip.chat-tooltip {\n        border-radius: 20px;\n        background-color: transparent;\n        padding: 5px;\n        font-weight: bold;\n    }\n    .leaflet-tooltip.wsjtx-tooltip {\n        border-radius: 20px;\n        background-color: transparent;\n        padding: 5px;\n        font-weight: bold;\n    }\n    .leaflet-tooltip.wsjtx-tooltip.fade-out75 {\n        opacity: 0.75 !important; /* !important zajistí, že tato hodnota má přednost */\n    }\n\n    .leaflet-tooltip.wsjtx-tooltip.fade-out50 {\n        opacity: 0.5 !important; /* !important zajistí, že tato hodnota má přednost */\n    }\n\n    .busy{\n      position: fixed;\n      inset: 0;\n      background: rgba(255,255,255,0.65);\n      display: flex;\n      align-items: center;\n      justify-content: center;\n      flex-direction: column;\n      z-index: 9999;\n    }\n    .busy.hidden{ display:none; }\n\n    .spinner{\n      width: 42px;\n      height: 42px;\n      border: 4px solid rgba(0,0,0,0.15);\n      border-top-color: rgba(0,0,0,0.6);\n      border-radius: 50%;\n      animation: spin 0.9s linear infinite;\n    }\n    @keyframes spin { to { transform: rotate(360deg); } }\n\n    .label{ margin-top: 10px; font: 14px sans-serif; color:#333; }\n\n  </style>\n</head>\n\n<body>\n\n  <div id=\"map\"></div>\n\n  <div id=\"busyOverlay\" class=\"busy hidden\">\n    <div class=\"spinner\"></div>\n    <div class=\"label\">Rendering…</div>\n  </div>\n\n  <script>\n\n    var grids_worked = [];    //field of Grids used for rendering Worked Grids\n    var grids_confirmed = []; //field of Grids used for rendering Confirmed Grids\n    var mylocations = [];     //field of My Locations\n    var locations = [];\n    var staticMapTime = null;\n\n    var map = L.map('map', {center: [0,0], zoom: 2, minZoom: 1});\n\n    map.createPane('lowestPane');\n    map.getPane('lowestPane').style.zIndex = 200;\n    map.getPane('lowestPane').style.pointerEvents = 'none';\n\n\n    // green Icon definition. It is usually used for confirmed QSOs\n    const greenIcon = new L.Icon({\n      iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png',\n      shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png',\n      iconSize: [25, 41],\n      iconAnchor: [12, 41],\n      popupAnchor: [1, -34],\n      shadowSize: [41, 41]\n    });\n    const greenIconSmall = new L.Icon({\n      iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-green.png',\n      shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png',\n      iconSize: [14, 23],\n      iconAnchor: [7, 23],\n      popupAnchor: [1, -18],\n      shadowSize: [23, 23]\n    });\n\n    // yellow Icon definition. It is usually used for generic QSOs or generic point\n    const yellowIcon = new L.Icon({\n      iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-2x-gold.png',\n      shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png',\n      iconSize: [25, 41],\n      iconAnchor: [12, 41],\n      popupAnchor: [1, -34],\n      shadowSize: [41, 41]\n    });\n\n    const yellowIconSmall = new L.Icon({\n      iconUrl: 'https://raw.githubusercontent.com/pointhi/leaflet-color-markers/master/img/marker-icon-gold.png',\n      shadowUrl: 'https://unpkg.com/leaflet@1.7.1/dist/images/marker-shadow.png',\n      iconSize: [14, 23],\n      iconAnchor: [7, 23],\n      popupAnchor: [1, -18],\n      shadowSize: [23, 23]\n    });\n\n    // home Icon definition. It is usually used for own location\n    const homeIcon = new L.Icon({\n      iconUrl: 'https://img.icons8.com/officel/30/000000/radio-tower.png',\n      iconSize: [30, 30],\n      iconAnchor: [15, 25],\n      popupAnchor: [1, -14]\n    });\n\n\n    var language = navigator.language || navigator.userLanguage;\n    var mapUrl;\n\n    // based on the language setting, qlog uses the map tile server\n    if (language === 'de') {\n      mapUrl = 'https://tile.openstreetmap.de/{z}/{x}/{y}.png';\n    } else if (language === 'fr') {\n      mapUrl = 'https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png';\n    } else {\n      mapUrl = 'https://tile.openstreetmap.org/{z}/{x}/{y}.png';\n    }\n\n    L.tileLayer(mapUrl, {\n      attribution: '&copy; <a href=\"https://www.openstreetmap.org/copyright\">OpenStreetMap</a> contributors'\n    }).addTo(map);\n\n    var maidenheadConfWorked = L.maidenheadConfWorked({color : 'rgba(255, 0, 0, 0.5)'}).addTo(map);\n    var grayline = L.terminator({fillOpacity: 0.2})\n\n    setInterval(function(){updateTerminator(grayline)}, 60000);\n\n    function updateTerminator(grayline)\n    {\n      if (!staticMapTime) {\n        grayline.setTime();\n        grayline.redraw();\n      }\n    }\n\n    let busyToken = 0;\n\n    function busyShow(msg) {\n      const el = document.getElementById('busyOverlay');\n      el.querySelector('.label').textContent = msg;\n      el.classList.remove('hidden');\n    }\n\n    function busyHide() {\n      document.getElementById('busyOverlay').classList.add('hidden');\n    }\n\n    async function runBusy(msg, fn) {\n      const token = ++busyToken;\n      busyShow(msg);\n\n      await new Promise(requestAnimationFrame);\n      await new Promise(requestAnimationFrame);\n      fn();\n      await new Promise(requestAnimationFrame);\n      await new Promise(requestAnimationFrame);\n\n      if (token === busyToken) busyHide();\n    }\n\n    // Configuration for Aurora Heatmap\n    const auroraCfg = {\n      // radius should be small ONLY if scaleRadius is true (or small radius is intended)\n      \"radius\": 2,\n      \"maxOpacity\": .3,\n      // scales the radius based on map zoom\n      \"scaleRadius\": true,\n      // if set to false the heatmap uses the global maximum for colorization\n      // if activated: uses the data maximum within the current map boundaries\n      //   (there will always be a red spot with useLocalExtremas true)\n      \"useLocalExtrema\": false,\n      // which field name in your data represents the latitude - default \"lat\"\n      latField: 'lat',\n      // which field name in your data represents the longitude - default \"lng\"\n      lngField: 'lng',\n      // which field name in your data represents the data value - default \"value\"\n      valueField: 'count'\n    };\n\n    var auroraLayer = new HeatmapOverlay(auroraCfg);\n\n    // Path 1 - usually used for rendering Path between my station and QSO station\n    var pathLayer = L.layerGroup().addTo(map);\n    const geodesic = new L.Geodesic([],{ wrap: false, color: \"Fuchsia\", steps: 5});\n    pathLayer.addLayer(geodesic);\n\n    var antPathLayer = L.layerGroup().addTo(map);\n    var antGeodesic1 = new L.Geodesic([],{ wrap: false, color: \"orange\", steps: 5,\n                                           dashArray: '10,10', dashOffset: '10'});\n    var antGeodesic2 = new L.Geodesic([],{ wrap: false, color: \"orange\", steps: 5,\n                                           dashArray: '10,10', dashOffset: '10'});\n    antPathLayer.addLayer(antGeodesic1);\n    antPathLayer.addLayer(antGeodesic2);\n\n    function drawPath(points) {\n        geodesic.setLatLngs([]);\n\n        if (points.length != 2)\n            return;\n        geodesic.setLatLngs([points[0], points[1]]);\n        map.fitBounds(geodesic.getBounds(), {animate:false});\n    }\n\n    function drawShortPaths(coords) {\n        pathLayer.clearLayers();\n        coords.forEach(function(coord) {\n            let geodesic = new L.Geodesic([],{ wrap: false, color: \"#cc2e41\", steps: 5, opacity: 0.7, weight: 1});\n            pathLayer.addLayer(geodesic);\n            geodesic.setLatLngs([{lat: coord[0], lng: coord[1]}, {lat: coord[2], lng: coord[3]}]);\n        });\n    }\n\n    function drawShortPathsBusy(coords, text) {\n      return runBusy(text, () => drawShortPaths(coords));\n    }\n\n    // function computes a destination point based on distance and azimuth\n    function beamEndPosition(fromPoint, distance, azimuth) {\n        const M_PI = Math.PI;\n        const d = distance / 6371;\n        let lat1 = fromPoint.lat * M_PI / 180;\n        let lon1 = fromPoint.lng * M_PI / 180;\n        const alpha1 = azimuth * M_PI / 180;\n\n        let lat2 = Math.asin(Math.sin(lat1) * Math.cos(d) + Math.cos(lat1) * Math.sin(d) * Math.cos(alpha1));\n        let lon2 = lon1 + Math.atan2(Math.sin(alpha1) * Math.sin(d) * Math.cos(lat1), Math.cos(d) - Math.sin(lat1) * Math.sin(lat2));\n\n        let newLat = lat2 * 180 / M_PI;\n        return {\"lat\": newLat, \"lng\": (lon2 * 180 / M_PI)};\n    }\n\n    // generic function to render Ant Path\n    function drawAntPath(fromPoint, distance, azimuth, antAngle) {\n        let line1 = []; // empty field means delete the line;\n        let line2 = []; // empty field means delete the line;\n        if (fromPoint && Object.keys(fromPoint).length != 0) {\n            line1 = [fromPoint, beamEndPosition(fromPoint, distance, azimuth - (antAngle/2))];\n            line2 = [fromPoint, beamEndPosition(fromPoint, distance, azimuth + (antAngle/2))];\n        }\n        antGeodesic1.setLatLngs(line1);\n        antGeodesic2.setLatLngs(line2);\n        // too many movements if focusing also antenna path, disable it\n        //fitQSOAnt();\n    }\n\n    function fitQSOAnt() {\n       let bound = geodesic.getBounds();\n       if ( map.hasLayer(antPathLayer) ) {\n          bound.extend(antGeodesic1.getBounds());\n          bound.extend(antGeodesic2.getBounds());\n       }\n       //map.fitBounds(bound, {animate:false});\n       map.panTo(bound.getCenter(), {animate:false});\n    }\n\n    var markersLayer = L.layerGroup().addTo(map);\n\n    // generic function to render point on the map\n    function drawPoints(points) {\n        markersLayer.clearLayers();\n        points.forEach(function(point) {\n           let marker = L.marker([point[1], point[2]], {\n                        icon: point[3]})\n                        .bindPopup(point[0]);\n           markersLayer.addLayer(marker);\n        });\n     }\n\n    function drawPointsBusy(points, text) {\n      return runBusy(text, () => drawPoints(points));\n    }\n\n     // generic function for flying to the point\n     function flyToPoint(point, zoom) {\n        map.flyTo([point[1], point[2]],zoom);\n     }\n\n     var markersLayer2 = L.layerGroup().addTo(map);\n\n     // generic function to render the sencond layer of the points\n     // It is usually used to render My QTHs\n     function drawPointsGroup2(points) {\n        markersLayer2.clearLayers();\n        points.forEach(function(point) {\n           let marker = L.marker([point[1], point[2]], {\n                        icon: point[3]})\n                        .bindPopup(point[0]);\n           markersLayer2.addLayer(marker);\n        });\n     }\n\n    // compute 3-color gradient\n    function colorGradient(fadeFraction, rgbColor1, rgbColor2, rgbColor3) {\n      let color1 = rgbColor1;\n      let color2 = rgbColor2;\n      let fade = fadeFraction;\n\n      if (rgbColor3) {\n        fade = fade * 2;\n\n        if (fade >= 1) {\n          fade -= 1;\n          color1 = rgbColor2;\n          color2 = rgbColor3;\n        }\n      }\n\n      let diffRed = color2.red - color1.red;\n      let diffGreen = color2.green - color1.green;\n      let diffBlue = color2.blue - color1.blue;\n\n      let gradient = {\n        red: parseInt(Math.floor(color1.red + (diffRed * fade)), 10),\n        green: parseInt(Math.floor(color1.green + (diffGreen * fade)), 10),\n        blue: parseInt(Math.floor(color1.blue + (diffBlue * fade)), 10),\n      };\n\n      return 'rgb(' + gradient.red + ',' + gradient.green + ',' + gradient.blue + ')';\n    }\n\n    var mufLayer = L.layerGroup();\n\n    // Render MUF points\n    function drawMuf(points) {\n\n       // definition of the color used to render the MUF\n       // LOW Color for low frequency\n       const lowColor = {\n            red: 0,\n            green: 131,\n            blue: 255\n       };\n\n       // MEDIUM Color for frequencies in the middle\n       const mediumColor = {\n           red: 255,\n           green: 162,\n           blue: 0\n       };\n\n       // HIGH Color for high frequency\n       const highColor = {\n           red: 255,\n           green: 255,\n           blue: 0\n       };\n\n       mufLayer.clearLayers();\n       points.forEach(function(point) {\n            let marker = new L.marker([point[1], point[2]], {opacity: 0.001 });\n            marker.bindTooltip(point[0], {permanent: true, direction : 'bottom', offset: [-16, 8], className: 'muf-tooltip' });\n            // color gradient is calculated for number interval 0 - 1.\n            // MUF value is a fgrequency. Threfore is it needed to recalculate Freq to interval 0 - 1\n            // QLog currently recalculate the interval 0 - 50 MHz. This is due to the fact that\n            // most of the values move in this interval and it is easy to see the individual frequency ranges\n            const oldValue = parseFloat(point[0]);\n            const oldMin = 0; const oldMax = 50; //frequency input range (0 - 50MHz)\n            const newMin = 0; const newMax = 1; //mapped to range 0 - 1\n            const newValue = (oldValue - oldMin) / (oldMax - oldMin) * (newMax - newMin) + newMin;\n            const color = colorGradient(newValue, lowColor, mediumColor, highColor);\n\n            marker.getTooltip().setContent(`<div style=\"background-color: ${color};border-radius: 20px;padding: 5px;font-weight: bold;\">${marker.getTooltip().getContent()}</div>`);\n            mufLayer.addLayer(marker);\n         });\n     }\n\n    // Definition for IBP\n    const band = [{band_name :\"20m\", freq : 14.1},\n                  {band_name :\"17m\", freq : 18.11},\n                  {band_name :\"15m\", freq : 21.15},\n                  {band_name :\"12m\", freq : 24.93},\n                  {band_name :\"10m\", freq : 28.2},\n               ];\n\n    const beacons = [{name: '4U1UN', lat: 40.7501,   lon: -73.9682,  active: true},\n                   {name: 'VE8AT', lat: 79.9949,   lon: -85.8451,  active: true},\n                   {name: 'W6WX',  lat: 37.1599,   lon: -121.9083, active: true},\n                   {name: 'KH6RS', lat: 20.7652,   lon: -156.3502, active: true},\n                   {name: 'ZL6B',  lat: -41.04350, lon: 175.5952,  active: false},\n                   {name: 'VK6RBP',lat: -32.1093,  lon: 116.0712,  active: true},\n                   {name: 'JA2IGY',lat: 34.4613,   lon: 136.7818,  active: true},\n                   {name: 'RR9O',  lat: 55.0484,   lon: 82.9227,   active: true},\n                   {name: 'VR2B',  lat: 22.2705,   lon: 114.1507,  active: true},\n                   {name: '4S7B',  lat: 6.8915,    lon: 79.8559,   active: true},\n                   {name: 'ZS6DN', lat: -26.6531,  lon: 27.9474,   active: true},\n                   {name: '5Z4B',  lat: -1.2687,   lon: 36.8094,   active: false},\n                   {name: '4X6TU', lat: 32.0622,   lon: 34.8069,   active: true},\n                   {name: 'OH2B',  lat: 60.2920,   lon: 24.3942,   active: true},\n                   {name: 'CS3B',  lat: 32.8217,   lon: -17.2325,  active: true},\n                   {name: 'LU4AA', lat: -34.6439,  lon: -58.4138,  active: true},\n                   {name: 'OA4B',  lat: -12.0940,  lon: -77.0165,  active: true},\n                   {name: 'YV5B',  lat: 9.0964,    lon: -67.8239,  active: true}]\n    var currentBand=\"\"; // to control which band is displayed - QLog core sets it.\n    var IBPLayer = L.layerGroup().addTo(map);\n    var prevStationIndex = -1;\n\n    function IBPCallsignPressed(e) {\n       let currentIndex = band.findIndex(object => {return object.band_name === currentBand;});\n       foo.IBPCallsignClicked(this.callsign, band[currentIndex].freq);\n     }\n\n    // render IPB Beacon Point\n    function beaconPoint(beacon, color) {\n       let pointColor = color\n       if ( !beacon.active ) {\n         pointColor = 'red';\n       }\n\n       let marker = new L.marker([beacon.lat, beacon.lon], {opacity: 0.001 });\n       let mirrorLon = beacon.lon - 360;\n       if ( mirrorLon < -360 ) {\n          mirrorLon = beacon.lon + 360;\n       }\n       let markerMirror = new L.marker([beacon.lat, mirrorLon], {opacity: 0.001 });\n       marker.bindTooltip(beacon.name, {permanent: true, direction : 'bottom', offset: [-16, 8], className: 'muf-tooltip' });\n       marker.on('dblclick', IBPCallsignPressed);\n       marker.callsign = beacon.name;\n       markerMirror.bindTooltip(beacon.name, {permanent: true, direction : 'bottom', offset: [-16, 8], className: 'muf-tooltip' });\n       markerMirror.on('dblclick', IBPCallsignPressed);\n       markerMirror.callsign = beacon.name;\n       marker.getTooltip().setContent(`<div style=\"background-color: ${pointColor};border-radius: 20px;padding: 5px;font-weight: bold;\">${marker.getTooltip().getContent()}</div>`);\n       markerMirror.getTooltip().setContent(`<div style=\"background-color: ${pointColor};border-radius: 20px;padding: 5px;font-weight: bold;\">${markerMirror.getTooltip().getContent()}</div>`);\n       IBPLayer.addLayer(marker);\n       IBPLayer.addLayer(markerMirror);\n    }\n\n    // Update IPB Beacon Points\n    function updateBeacon() {\n\n       currentBandIndex = band.findIndex(object => {return object.band_name === currentBand;});\n\n       if ( currentBandIndex == -1 ) {\n           IBPLayer.clearLayers();\n           return;\n       }\n\n       let today = new Date();\n       let n = Math.floor(today.getTime()/10000) % 18;\n       let currentStationIndex = (18 + n - currentBandIndex) % 18;\n       let nextStationIndex = (19 + n - currentBandIndex) % 18;\n\n       if ( currentStationIndex == prevStationIndex ) {\n           return;\n       }\n\n       IBPLayer.clearLayers();\n\n       prevStationIndex = currentStationIndex;\n\n       // show current\n       let b = beacons[currentStationIndex]\n       beaconPoint(b, '#FFFF33');\n\n       // show next\n       b = beacons[nextStationIndex]\n       beaconPoint(b, '#1AA260');\n    }\n\n    var chatStationsLayer = L.layerGroup().addTo(map);\n\n    function chatCallsignPressed(e) {\n       foo.chatCallsignClicked(this.callsign);\n    }\n\n    // generic function to render the third layer of the points\n    // It is usually used to render Chat Stations\n    function drawPointsGroup3(points) {\n       chatStationsLayer.clearLayers();\n       points.forEach(function(point) {\n          let marker = new L.marker([point[1], point[2]], {opacity: 0.001 });\n          marker.bindTooltip(point[0], {pane: 'lowestPane', permanent: true, direction : 'bottom', offset: [-16, 8], className: 'chat-tooltip' });\n          marker.on('dblclick', chatCallsignPressed);\n          marker.callsign = point[0];\n          marker.getTooltip().setContent(`<div style=\"background-color: aqua;border-radius: 20px;padding: 5px;font-weight: bold;\">${marker.getTooltip().getContent()}</div>`);\n          chatStationsLayer.addLayer(marker);\n       });\n    }\n\n    setInterval(function(){updateBeacon()}, 250);\n\n    function wsjtxCallsignPressed(e) {\n       foo.wsjtxCallsignClicked(this.callsign);\n    }\n\n    var wsjtxStationsLayer = L.layerGroup();\n\n    // this function show WSJTX spots\n    function addWSJTXSpot(lat, lng, callsign, color) {\n        const fadeSchedule = [\n            { timeout: 30000, className: 'fade-out75' },\n            { timeout: 45000, className: 'fade-out50' },\n        ];\n\n        const tooltipHTML = content =>\n            `<div style=\"background-color: ${color};border-radius:20px;padding:5px;font-weight:bold;\">${content}</div>`;\n\n        function createSpotMarker(latitude, longitude) {\n            const marker = new L.marker([latitude, longitude], { opacity: 0.001 });\n            marker.callsign = callsign;\n\n            marker.bindTooltip(callsign, {\n                pane: 'lowestPane',\n                permanent: true,\n                direction: 'bottom',\n                offset: [-16, 8],\n                className: 'wsjtx-tooltip'\n            });\n\n            marker.on('dblclick', wsjtxCallsignPressed);\n\n            const tooltip = marker.getTooltip();\n            tooltip.setContent(tooltipHTML(tooltip.getContent()));\n\n            return marker;\n        }\n\n        // the main marker\n        const marker = createSpotMarker(lat, lng);\n\n        // mirror marker\n        const mirrorLon = lng >= 0 ? lng - 360 : lng + 360;\n        const markerMirror = createSpotMarker(lat, mirrorLon);\n\n        wsjtxStationsLayer.addLayer(marker);\n        wsjtxStationsLayer.addLayer(markerMirror);\n\n        fadeSchedule.forEach(item => {\n            setTimeout(() => {\n                marker.getTooltip().getElement().classList.add(item.className);\n                markerMirror.getTooltip().getElement().classList.add(item.className);\n            }, item.timeout);\n        });\n\n        setTimeout(() => {\n            map.removeLayer(marker);\n            map.removeLayer(markerMirror);\n        }, 60000);\n    }\n\n    function clearWSJTXSpots() {\n        wsjtxStationsLayer.clearLayers();\n    }\n\n    function setStaticMapTime(newDate) {\n        staticMapTime = newDate;\n        grayline.setTime(staticMapTime);\n        grayline.redraw();\n    }\n  </script>\n\n</body>\n\n</html>\n"
  },
  {
    "path": "res/qlog.1",
    "content": ".TH QLOG 1 \"2026-03-13\" \"QLog\" \"User Commands\"\n.SH NAME\nqlog \\- Amateur Radio logging application\n.SH SYNOPSIS\n.B qlog\n.RI [ OPTIONS ]\n.SH DESCRIPTION\nQLog is a multiplatform Amateur Radio logging application.\nIt is based on the Qt framework and uses SQLite as database backend.\n.PP\nQLog aims to be as simple as possible, but to provide everything\nthe operator expects from the log.\n.SH OPTIONS\n.TP\n.BR \\-d \", \" \\-\\-debug\nWrite debug messages to\n.I ~/.local/share/hamradio/QLog/qlog_debug_YYYYMMDDhhmmss.log\n.TP\n.BR \\-f \", \" \\-\\-force\\-update\nForce update of all value lists (DXCC, SATs, etc.).\n.TP\n.BR \\-l \", \" \\-\\-language \" \" \\fIcode\\fR\nSet language (e.g.\\& \\fBen\\fR or \\fBen_US\\fR). Ignores environment setting.\n.TP\n.BR \\-t \", \" \\-\\-translation \" \" \\fIpath\\fR\nLoad a translation file (absolute or relative path to a QM file).\n.TP\n.BR \\-h \", \" \\-\\-help\nDisplay help message and exit.\n.TP\n.BR \\-v \", \" \\-\\-version\nDisplay version information and exit.\n.SH FILES\n.TP\n.I ~/.config/hamradio/QLog.conf\nMachine-specific settings.\n.TP\n.I ~/.local/share/hamradio/QLog/\nData directory.\n.SH BUGS\nReport bugs at <https://github.com/foldynl/QLog/issues>.\n.SH SEE ALSO\n.UR https://github.com/foldynl/QLog/wiki\nQLog Wiki\n.UE\n.SH AUTHOR\nLadislav Foldyna (OK1MLG) <ok1mlg@gmail.com>\n"
  },
  {
    "path": "res/qlog.desktop",
    "content": "[Desktop Entry]\nVersion=1.0\nType=Application\nName=QLog\nComment=Amateur Radio Logbook\nExec=qlog\nIcon=qlog\nCategories=Utility;HamRadio;\nKeywords=QLog;Ham;Radio;HamRadio;AmateurRadio;Log;\n"
  },
  {
    "path": "res/res.qrc",
    "content": "<RCC>\n    <qresource prefix=\"/res\">\n        <file>map/nasabluemarble.jpg</file>\n        <file>map/nasaearthlights.jpg</file>\n        <file>stylesheet.css</file>\n        <file>qlog.png</file>\n        <file>data/dxcc.json</file>\n        <file>data/legacy_modes.json</file>\n        <file>data/contests.json</file>\n        <file>data/propagation_modes.json</file>\n        <file>sql/migration_001.sql</file>\n        <file>sql/contests.sql</file>\n        <file>sql/migration_002.sql</file>\n        <file>data/sat_modes.json</file>\n        <file>qlog_screen.png</file>\n        <file>map/onlinemap.html</file>\n        <file>sql/migration_003.sql</file>\n        <file>sql/migration_004.sql</file>\n        <file>sql/migration_005.sql</file>\n        <file>sql/migration_006.sql</file>\n        <file>sql/migration_007.sql</file>\n        <file>data/timezone21.bin</file>\n        <file>sql/migration_008.sql</file>\n        <file>sql/migration_009.sql</file>\n        <file>sql/migration_010.sql</file>\n        <file>sql/migration_011.sql</file>\n        <file>sql/migration_012.sql</file>\n        <file>sql/migration_013.sql</file>\n        <file>sql/migration_014.sql</file>\n        <file>sql/migration_015.sql</file>\n        <file>sql/migration_016.sql</file>\n        <file>sql/migration_017.sql</file>\n        <file>sql/migration_018.sql</file>\n        <file>sql/migration_019.sql</file>\n        <file>sql/migration_020.sql</file>\n        <file>sql/migration_021.sql</file>\n        <file>sql/migration_022.sql</file>\n        <file>sql/migration_023.sql</file>\n        <file>sql/migration_024.sql</file>\n        <file>sql/migration_025.sql</file>\n        <file>sql/migration_026.sql</file>\n        <file>sql/migration_027.sql</file>\n        <file>sql/migration_028.sql</file>\n        <file>sql/migration_029.sql</file>\n        <file>sql/migration_030.sql</file>\n        <file>sql/migration_031.sql</file>\n        <file>sql/migration_032.sql</file>\n        <file>sql/migration_033.sql</file>\n        <file>sql/migration_034.sql</file>\n        <file>sql/migration_035.sql</file>\n        <file>sql/migration_036.sql</file>\n        <file>sql/migration_037.sql</file>\n        <file>sql/migration_038.sql</file>\n    </qresource>\n</RCC>\n"
  },
  {
    "path": "res/sql/contests.sql",
    "content": "INSERT INTO contests (contest_id, descrption) VALUES\n('070-160M-SPRINT', 'PODXS Great Pumpkin Sprint'),\n('070-3-DAY', 'PODXS Three Day Weekend'),\n('070-31-FLAVORS', 'PODXS 31 Flavors'),\n('070-40M-SPRINT', 'PODXS 40m Firecracker Sprint'),\n('070-80M-SPRINT', 'PODXS 80m Jay Hudak Memorial Sprint'),\n('070-PSKFEST', 'PODXS PSKFest'),\n('070-ST-PATS-DAY', 'PODXS St. Patricks Day'),\n('070-VALENTINE-SPRINT', 'PODXS Valentine Sprint'),\n('10-RTTY', 'Ten-Meter RTTY Contest (2011 onwards)'),\n('1010-OPEN-SEASON', 'Open Season Ten Meter QSO Party'),\n('7QP', '7th-Area QSO Party'),\n('AL-QSO-PARTY', 'Alabama QSO Party'),\n('ALL-ASIAN-DX-CW', 'JARL All Asian DX Contest (CW)'),\n('ALL-ASIAN-DX-PHONE', 'JARL All Asian DX Contest (PHONE)'),\n('ANARTS-RTTY', 'ANARTS WW RTTY'),\n('ANATOLIAN-RTTY', 'Anatolian WW RTTY'),\n('AP-SPRINT', 'Asia - Pacific Sprint'),\n('AR-QSO-PARTY', 'Arkansas QSO Party'),\n('ARI-DX', 'ARI DX Contest'),\n('ARRL-10', 'ARRL 10 Meter Contest'),\n('ARRL-160', 'ARRL 160 Meter Contest'),\n('ARRL-222', 'ARRL 222 MHz and Up Distance Contest'),\n('ARRL-DX-CW', 'ARRL International DX Contest (CW)'),\n('ARRL-DX-SSB', 'ARRL International DX Contest (Phone)'),\n('ARRL-EME', 'ARRL EME contest'),\n('ARRL-FIELD-DAY', 'ARRL Field Day'),\n('ARRL-RR-CW', 'ARRL Rookie Roundup (CW)'),\n('ARRL-RR-RTTY', 'ARRL Rookie Roundup (RTTY)'),\n('ARRL-RR-SSB', 'ARRL Rookie Roundup (Phone)'),\n('ARRL-RTTY', 'ARRL RTTY Round-Up'),\n('ARRL-SCR', 'ARRL School Club Roundup'),\n('ARRL-SS-CW', 'ARRL November Sweepstakes (CW)'),\n('ARRL-SS-SSB', 'ARRL November Sweepstakes (Phone)'),\n('ARRL-UHF-AUG', 'ARRL August UHF Contest'),\n('ARRL-VHF-JAN', 'ARRL January VHF Sweepstakes'),\n('ARRL-VHF-JUN', 'ARRL June VHF QSO Party'),\n('ARRL-VHF-SEP', 'ARRL September VHF QSO Party'),\n('AZ-QSO-PARTY', 'Arizona QSO Party'),\n('BARTG-RTTY', 'BARTG Spring RTTY Contest'),\n('BARTG-SPRINT', 'BARTG Sprint Contest'),\n('BC-QSO-PARTY', 'British Columbia QSO Party'),\n('CA-QSO-PARTY', 'California QSO Party'),\n('CIS-DX', 'CIS DX Contest'),\n('CO-QSO-PARTY', 'Colorado QSO Party'),\n('CQ-160-CW', 'CQ WW 160 Meter DX Contest (CW)'),\n('CQ-160-SSB', 'CQ WW 160 Meter DX Contest (SSB)'),\n('CQ-M', 'CQ-M International DX Contest'),\n('CQ-VHF', 'CQ World-Wide VHF Contest'),\n('CQ-WPX-CW', 'CQ WW WPX Contest (CW)'),\n('CQ-WPX-RTTY', 'CQ/RJ WW RTTY WPX Contest'),\n('CQ-WPX-SSB', 'CQ WW WPX Contest (SSB)'),\n('CQ-WW-CW', 'CQ WW DX Contest (CW)'),\n('CQ-WW-RTTY', 'CQ/RJ WW RTTY DX Contest'),\n('CQ-WW-SSB', 'CQ WW DX Contest (SSB)'),\n('CT-QSO-PARTY', 'Connecticut QSO Party'),\n('CVA-DX-CW', 'Concurso Verde e Amarelo DX CW Contest'),\n('CVA-DX-SSB', 'Concurso Verde e Amarelo DX CW Contest'),\n('CWOPS-CW-OPEN', 'CWops CW Open Competition'),\n('CWOPS-CWT', 'CWops Mini-CWT Test'),\n('DARC-WAEDC-CW', 'WAE DX Contest (CW)'),\n('DARC-WAEDC-RTTY', 'WAE DX Contest (RTTY)'),\n('DARC-WAEDC-SSB', 'WAE DX Contest (SSB)'),\n('DARC-WAG', 'DARC Worked All Germany'),\n('DE-QSO-PARTY', 'Delaware QSO Party'),\n('DL-DX-RTTY', 'DL-DX RTTY Contest'),\n('DMC-RTTY', 'DMC RTTY Contest'),\n('EA-CNCW', 'Concurso Nacional de Telegrafía'),\n('EA-DME', 'Municipios Españoles'),\n('EA-PSK63', 'EA PSK63'),\n('EA-SMRE-CW', 'Su Majestad El Rey de España - CW'),\n('EA-SMRE-SSB', 'Su Majestad El Rey de España - SSB'),\n('EA-VHF-ATLANTIC', 'Atlántico V-UHF'),\n('EA-VHF-COM', 'Combinado de V-UHF'),\n('EA-VHF-COSTA-SOL', 'Costa del Sol V-UHF'),\n('EA-VHF-EA', 'Nacional VHF'),\n('EA-VHF-EA1RCS', 'Segovia EA1RCS V-UHF'),\n('EA-VHF-QSL', 'QSL V-UHF & 50MHz'),\n('EA-VHF-SADURNI', 'Sant Sadurni V-UHF'),\n('EA-WW-RTTY', 'Unión de Radioaficionados Españoles RTTY Contest'),\n('EPC-PSK63', 'PSK63 QSO Party'),\n('EU Sprint', 'EU Sprint'),\n('EU-HF', 'EU HF Championship'),\n('EU-PSK-DX', 'EU PSK DX Contest'),\n('EUCW160M', 'European CW Association 160m CW Party'),\n('FALL SPRINT', 'FISTS Fall Sprint'),\n('FL-QSO-PARTY', 'Florida QSO Party'),\n('GA-QSO-PARTY', 'Georgia QSO Party'),\n('HA-DX', 'Hungarian DX Contest'),\n('HELVETIA', 'Helvetia Contest'),\n('HI-QSO-PARTY', 'Hawaiian QSO Party'),\n('HOLYLAND', 'IARC Holyland Contest'),\n('IA-QSO-PARTY', 'Iowa QSO Party'),\n('IARU-FIELD-DAY', 'DARC IARU Region 1 Field Day'),\n('IARU-HF', 'IARU HF World Championship'),\n('ID-QSO-PARTY', 'Idaho QSO Party'),\n('IL QSO Party', 'Illinois QSO Party'),\n('IN-QSO-PARTY', 'Indiana QSO Party'),\n('JARTS-WW-RTTY', 'JARTS WW RTTY'),\n('JIDX-CW', 'Japan International DX Contest (CW)'),\n('JIDX-SSB', 'Japan International DX Contest (SSB)'),\n('JT-DX-RTTY', 'Mongolian RTTY DX Contest'),\n('KS-QSO-PARTY', 'Kansas QSO Party'),\n('KY-QSO-PARTY', 'Kentucky QSO Party'),\n('LA-QSO-PARTY', 'Louisiana QSO Party'),\n('LDC-RTTY', 'DRCG Long Distance Contest (RTTY)'),\n('LZ DX', 'LZ DX Contest'),\n('MAR-QSO-PARTY', 'Maritimes QSO Party'),\n('MD-QSO-PARTY', 'Maryland QSO Party'),\n('ME-QSO-PARTY', 'Maine QSO Party'),\n('MI-QSO-PARTY', 'Michigan QSO Party'),\n('MIDATLANTIC-QSO-PARTY', 'Mid-Atlantic QSO Party'),\n('MN-QSO-PARTY', 'Minnesota QSO Party'),\n('MO-QSO-PARTY', 'Missouri QSO Party'),\n('MS-QSO-PARTY', 'Mississippi QSO Party'),\n('MT-QSO-PARTY', 'Montana QSO Party'),\n('NA-SPRINT-CW', 'North America Sprint (CW)'),\n('NA-SPRINT-RTTY', 'North America Sprint (RTTY)'),\n('NA-SPRINT-SSB', 'North America Sprint (Phone)'),\n('NAQP-CW', 'North America QSO Party (CW)'),\n('NAQP-RTTY', 'North America QSO Party (RTTY)'),\n('NAQP-SSB', 'North America QSO Party (Phone)'),\n('NC-QSO-PARTY', 'North Carolina QSO Party'),\n('ND-QSO-PARTY', 'North Dakota QSO Party'),\n('NE-QSO-PARTY', 'Nebraska QSO Party'),\n('NEQP', 'New England QSO Party'),\n('NH-QSO-PARTY', 'New Hampshire QSO Party'),\n('NJ-QSO-PARTY', 'New Jersey QSO Party'),\n('NM-QSO-PARTY', 'New Mexico QSO Party'),\n('NRAU-BALTIC-CW', 'NRAU-Baltic Contest (CW)'),\n('NRAU-BALTIC-SSB', 'NRAU-Baltic Contest (SSB)'),\n('NV-QSO-PARTY', 'Nevada QSO Party'),\n('NY-QSO-PARTY', 'New York QSO Party'),\n('OCEANIA-DX-CW', 'Oceania DX Contest (CW)'),\n('OCEANIA-DX-SSB', 'Oceania DX Contest (SSB)'),\n('OH-QSO-PARTY', 'Ohio QSO Party'),\n('OK-DX-RTTY', 'Czech Radio Club OK DX Contest'),\n('OK-OM-DX', 'Czech Radio Club OK-OM DX Contest'),\n('OK-QSO-PARTY', 'Oklahoma QSO Party'),\n('OMISS-QSO-PARTY', 'Old Man International Sideband Society QSO Party'),\n('ON-QSO-PARTY', 'Ontario QSO Party'),\n('OR-QSO-PARTY', 'Oregon QSO Party'),\n('PA-QSO-PARTY', 'Pennsylvania QSO Party'),\n('PACC', 'Dutch PACC Contest'),\n('QC-QSO-PARTY', 'Quebec QSO Party'),\n('RAC-CANADA-DAY', 'RAC Canada Day Contest'),\n('RAC-CANADA-WINTER', 'RAC Canada Winter Contest'),\n('RDAC', 'Russian District Award Contest'),\n('RDXC', 'Russian DX Contest'),\n('REF-160M', 'Reseau des Emetteurs Francais 160m Contest'),\n('REF-CW', 'Reseau des Emetteurs Francais Contest (CW)'),\n('REF-SSB', 'Reseau des Emetteurs Francais Contest (SSB)'),\n('REP-PORTUGAL-DAY-HF', 'Rede dos Emissores Portugueses Portugal Day HF Contest'),\n('RI-QSO-PARTY', 'Rhode Island QSO Party'),\n('RSGB-160', '1.8MHz Contest'),\n('RSGB-21/28-CW', '21/28 MHz Contest (CW)'),\n('RSGB-21/28-SSB', '21/28 MHz Contest (SSB)'),\n('RSGB-80M-CC', '80m Club Championships'),\n('RSGB-AFS-CW', 'Affiliated Societies Team Contest (CW)'),\n('RSGB-AFS-SSB', 'Affiliated Societies Team Contest (SSB)'),\n('RSGB-CLUB-CALLS', 'Club Calls'),\n('RSGB-COMMONWEALTH', 'Commonwealth Contest'),\n('RSGB-IOTA', 'IOTA Contest'),\n('RSGB-LOW-POWER', 'Low Power Field Day'),\n('RSGB-NFD', 'National Field Day'),\n('RSGB-ROPOCO', 'RoPoCo'),\n('RSGB-SSB-FD', 'SSB Field Day'),\n('RUSSIAN-RTTY', 'Russian Radio RTTY Worldwide Contest'),\n('SAC-CW', 'Scandinavian Activity Contest (CW)'),\n('SAC-SSB', 'Scandinavian Activity Contest (SSB)'),\n('SARTG-RTTY', 'SARTG WW RTTY'),\n('SC-QSO-PARTY', 'South Carolina QSO Party'),\n('SCC-RTTY', 'SCC RTTY Championship'),\n('SD-QSO-PARTY', 'South Dakota QSO Party'),\n('SMP-AUG', 'SSA Portabeltest'),\n('SMP-MAY', 'SSA Portabeltest'),\n('SP-DX-RTTY', 'PRC SPDX Contest (RTTY)'),\n('SPAR-WINTER-FD', 'SPAR Winter Field Day'),\n('SPDXContest', 'SP DX Contest'),\n('SPRING SPRINT', 'FISTS Spring Sprint'),\n('SR-MARATHON', 'Scottish-Russian Marathon'),\n('STEW-PERRY', 'Stew Perry Topband Distance Challenge'),\n('SUMMER SPRINT', 'FISTS Summer Sprint'),\n('TARA-GRID-DIP', 'TARA Grid Dip PSK-RTTY Shindig'),\n('TARA-RTTY', 'TARA RTTY Mêlée'),\n('TARA-RUMBLE', 'TARA Rumble PSK Contest'),\n('TARA-SKIRMISH', 'TARA Skirmish Digital Prefix Contest'),\n('TMC-RTTY', 'The Makrothen Contest'),\n('TN-QSO-PARTY', 'Tennessee QSO Party'),\n('TX-QSO-PARTY', 'Texas QSO Party'),\n('UBA-DX-CW', 'UBA Contest (CW)'),\n('UBA-DX-SSB', 'UBA Contest (SSB)'),\n('UK-DX-BPSK63', 'European PSK Club BPSK63 Contest'),\n('UK-DX-RTTY', 'UK DX RTTY Contest'),\n('UKR-CHAMP-RTTY', 'Open Ukraine RTTY Championship'),\n('UKRAINIAN DX', 'Ukrainian DX'),\n('UKSMG-6M-MARATHON', 'UKSMG 6m Marathon'),\n('UKSMG-SUMMER-ES', 'UKSMG Summer Es Contest'),\n('US-COUNTIES-QSO', 'Mobile Amateur Awards Club'),\n('UT-QSO-PARTY', 'Utah QSO Party'),\n('VA-QSO-PARTY', 'Virginia QSO Party'),\n('VENEZ-IND-DAY', 'RCV Venezuelan Independence Day Contest'),\n('VIRGINIA QSO PARTY (import-only)', 'Virginia QSO Party'),\n('VOLTA-RTTY', 'Alessandro Volta RTTY DX Contest'),\n('WA-QSO-PARTY', 'Washington QSO Party'),\n('WI-QSO-PARTY', 'Wisconsin QSO Party'),\n('WIA-HARRY ANGEL', 'WIA Harry Angel Memorial 80m Sprint'),\n('WIA-JMMFD', 'WIA John Moyle Memorial Field Day'),\n('WIA-OCDX', 'WIA Oceania DX (OCDX) Contest'),\n('WIA-REMEMBRANCE', 'WIA Remembrance Day'),\n('WIA-ROSS HULL', 'WIA Ross Hull Memorial VHF/UHF Contest'),\n('WIA-TRANS TASMAN', 'WIA Trans Tasman Low Bands Challenge'),\n('WIA-VHF/UHF FD', 'WIA VHF UHF Field Days'),\n('WIA-VK SHIRES', 'WIA VK Shires'),\n('WINTER SPRINT', 'FISTS Winter Sprint'),\n('WV-QSO-PARTY', 'West Virginia QSO Party'),\n('WY-QSO-PARTY', 'Wyoming QSO Party'),\n('XE-INTL-RTTY', 'Mexico International Contest (RTTY)'),\n('YOHFDX', 'YODX HF contest'),\n('YUDXC', 'YU DX Contest');\n"
  },
  {
    "path": "res/sql/migration_001.sql",
    "content": "CREATE TABLE IF NOT EXISTS schema_versions (\n        version INTEGER PRIMARY KEY,\n        updated TEXT NOT NULL\n);\n\nCREATE TABLE IF NOT EXISTS contacts (\n        id INTEGER PRIMARY KEY,\n        start_time TEXT,\n        end_time TEXT,\n        callsign TEXT NOT NULL,\n        rst_sent TEXT,\n        rst_rcvd TEXT,\n        freq REAL,\n        band TEXT,\n        mode TEXT,\n        submode TEXT,\n        name TEXT,\n        qth TEXT,\n        gridsquare TEXY,\n        dxcc INTEGER,\n        country TEXT,\n        cont TEXT,\n        cqz INTEGER,\n        ituz INTEGER,\n        pfx TEXT,\n        state TEXT,\n        cnty TEXT,\n        iota TEXT,\n        qsl_rcvd CHECK(qsl_rcvd IN ('N', 'Y', 'R', 'I')) NOT NULL DEFAULT 'N',\n        qsl_rdate TEXT,\n        qsl_sent CHECK(qsl_sent IN ('N', 'Y', 'R', 'Q', 'I')) NOT NULL DEFAULT 'N',\n        qsl_sdate TEXT,\n        lotw_qsl_rcvd CHECK(qsl_rcvd IN ('N', 'Y', 'R', 'I')) NOT NULL DEFAULT 'N',\n        lotw_qslrdate TEXT,\n        lotw_qsl_sent CHECK(qsl_sent IN ('N', 'Y', 'R', 'Q', 'I')) NOT NULL DEFAULT 'N',\n        lotw_qslsdate TEXT,\n        tx_pwr REAL,\n        fields JSON\n);\n\n\nCREATE TABLE IF NOT EXISTS bands (\n        id INTEGER PRIMARY KEY,\n        name TEXT UNIQUE NOT NULL,\n        start_freq FLOAT,\n        end_freq FLOAT,\n        enabled BOOLEAN\n);\n\nCREATE TABLE IF NOT EXISTS modes (\n        id INTEGER PRIMARY KEY,\n        name TEXT UNIQUE NOT NULL,\n        submodes JSON,\n        rprt TEXT,\n        dxcc TEXT CHECK(dxcc IN ('CW', 'PHONE', 'DIGITAL')) NOT NULL,\n        enabled INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS dxcc_entities (\n        id INTEGER PRIMARY KEY,\n        name TEXT NOT NULL,\n        prefix TEXT,\n        cont TEXT,\n        cqz INTEGER,\n        ituz INTEGER,\n        lat REAL,\n        lon REAL,\n        tz REAL\n);\n\nCREATE TABLE IF NOT EXISTS dxcc_prefixes (\n        id INTEGER PRIMARY KEY,\n        prefix TEXT UNIQUE NOT NULL,\n        exact INTEGER,\n        dxcc INTEGER REFERENCES dxcc_entities(id),\n        cqz INTEGER,\n        ituz INTEGER,\n        cont TEXT,\n        lat REAL,\n        lon REAL\n);\n\nCREATE INDEX prefix_idx ON dxcc_prefixes(prefix);\nCREATE INDEX callsign_idx ON contacts(callsign);\n\n\nINSERT INTO modes (name, rprt, dxcc, enabled, submodes) VALUES\n('CW', '599', 'CW', true, NULL),\n('SSB', '59', 'PHONE', true, '[\"LSB\", \"USB\"]'),\n('AM', '59', 'PHONE', true, NULL),\n('FM', '59', 'PHONE', true, NULL),\n('PSK', '599', 'DIGITAL', true, '[\n        \"PSK31\",\n        \"PSK63\",\n        \"PSK63F\",\n        \"PSK125\",\n        \"PSK250\",\n        \"PSK500\",\n        \"PSK1000\",\n        \"QPSK31\",\n        \"QPSK63\",\n        \"QPSK125\",\n        \"QPSK250\",\n        \"QPSK500\"\n]'),\n('RTTY', '599', 'DIGITAL', true, NULL),\n('MFSK', '599', 'DIGITAL', true, '[\n        \"FT4\",\n        \"MFSK4\",\n        \"MFSK8\",\n        \"MFSK11\",\n        \"MFSK16\",\n        \"MFSK22\",\n        \"MFSK31\",\n        \"MFSK32\"\n]'),\n('OLIVIA', NULL, 'DIGITAL', true, '[\n        \"OLIVIA 4/125\",\n        \"OLIVIA 4/250\",\n        \"OLIVIA 8/250\",\n        \"OLIVIA 8/500\",\n        \"OLIVIA 16/500\",\n        \"OLIVIA 16/1000\",\n        \"OLIVIA 32/1000\"\n]'),\n('JT65', '-1', 'DIGITAL', true, '[\n        \"JT65A\",\n        \"JT65B\",\n        \"JT65B2\",\n        \"JT65C\",\n        \"JT65C2\"\n]'),\n('JT9', '-1', 'DIGITAL', true, '[\n        \"JT9-1\",\n        \"JT9-2\",\n        \"JT9-5\",\n        \"JT9-10\",\n        \"JT9-30\"\n]'),\n('FT8', '-1', 'DIGITAL', true, NULL),\n('HELL', NULL, 'DIGITAL', true, '[\n        \"FMHELL\",\n        \"FSKHELL\",\n        \"HELL80\",\n        \"HFSK\",\n        \"PSKHELL\"\n]'),\n('CONTESTIA', NULL, 'DIGITAL', true, NULL),\n('DOMINO', NULL, 'DIGITAL', true, '[\n        \"DOMINOEX\",\n        \"DOMINOF\"\n]'),\n('MT63', NULL, 'DIGITAL', true, NULL),\n('JT6M', '26', 'DIGITAL', true, NULL),\n('JTMSK', '-1', 'DIGITAL', true, NULL),\n('MSK144', '0', 'DIGITAL', true, NULL),\n('FSK441', '26', 'DIGITAL', true, NULL),\n('DIGITALVOICE', '59', 'PHONE', true, NULL),\n('DSTAR', '59', 'PHONE', true, NULL),\n('PKT', NULL, 'DIGITAL', true, NULL),\n('ATV', NULL, 'DIGITAL', true, NULL),\n('SSTV', NULL, 'DIGITAL', true, NULL);\n\nINSERT INTO bands (name, start_freq, end_freq, enabled) VALUES\n('2190m', 0.136, 0.137, false),\n('630m', 0.472, 0.479, false),\n('560m', 0.501, 0.504, false),\n('160m', 1.8, 2.0, true),\n('80m', 3.5, 4.0, true),\n('60m', 5.102, 5.4065, true),\n('40m', 7.0, 7.3, true),\n('30m', 10.1, 10.15, true),\n('20m', 14.0, 14.35, true),\n('17m', 18.068, 18.168, true),\n('15m', 21.0, 21.45, true),\n('12m', 24.89, 24.99, true),\n('10m', 28.0, 29.7, true),\n('6m', 50.0, 54.0, true),\n('4m', 70.0, 71.0, true),\n('2m', 144.0, 148.0, true),\n('1.25m', 222.0, 225.0, false),\n('70cm', 420.0, 450.0, true),\n('33cm', 902.0, 928.0, false),\n('23cm', 1240.0, 1300.0, false),\n('13cm', 2300.0, 2450.0, false),\n('9cm', 3300.0, 3500.0, false),\n('6cm', 5650.0, 5925.0, false),\n('3cm', 10000.0, 10500.0, false),\n('1.25cm', 24000.0, 24250.0, false),\n('6mm', 47000.0, 47200.0, false),\n('4mm', 75500.0, 81000.0, false),\n('2.5mm', 119980.0, 120020.0, false),\n('2mm', 142000.0, 149000.0, false),\n('1mm', 241000.0, 250000.0, false);\n"
  },
  {
    "path": "res/sql/migration_002.sql",
    "content": "ALTER TABLE contacts  ADD address TEXT;\nALTER TABLE contacts  ADD address_intl TEXT;\nALTER TABLE contacts  ADD age INTEGER;\nALTER TABLE contacts  ADD a_index INTEGER;\nALTER TABLE contacts  ADD ant_az INTEGER;\nALTER TABLE contacts  ADD ant_el INTEGER;\nALTER TABLE contacts  ADD ant_path CHECK(ant_path IN ('G', 'O', 'S', 'L'));\nALTER TABLE contacts  ADD arrl_sect TEXT;\nALTER TABLE contacts ADD award_submitted TEXT;\nALTER TABLE contacts ADD award_granted TEXT;\nALTER TABLE contacts ADD band_rx TEXT;\nALTER TABLE contacts ADD \"check\" TEXT;\nALTER TABLE contacts ADD \"class\" TEXT;\nALTER TABLE contacts ADD clublog_qso_upload_date TEXT;\nALTER TABLE contacts ADD clublog_qso_upload_status CHECK(clublog_qso_upload_status IN ('N', 'Y', 'M')) DEFAULT 'N';\nALTER TABLE contacts ADD \"comment\" TEXT;\nALTER TABLE contacts ADD comment_intl TEXT;\nALTER TABLE contacts ADD contacted_op TEXT;\nALTER TABLE contacts ADD contest_id TEXT;\nALTER TABLE contacts ADD country_intl TEXT;\nALTER TABLE contacts ADD credit_submitted TEXT;\nALTER TABLE contacts ADD credit_granted TEXT;\nALTER TABLE contacts ADD darc_dok TEXT;\nALTER TABLE contacts ADD distance REAL;\nALTER TABLE contacts ADD email TEXT;\nALTER TABLE contacts ADD eq_call TEXT;\nALTER TABLE contacts ADD eqsl_qslrdate TEXT;\nALTER TABLE contacts ADD eqsl_qslsdate TEXT;\nALTER TABLE contacts ADD eqsl_qsl_rcvd CHECK(eqsl_qsl_rcvd IN ('N', 'Y', 'R', 'I')) DEFAULT 'N';\nALTER TABLE contacts ADD eqsl_qsl_sent CHECK(eqsl_qsl_sent IN ('N', 'Y', 'R', 'I')) DEFAULT 'N';\nALTER TABLE contacts ADD fists INTEGER;\nALTER TABLE contacts ADD fists_cc INTEGER;\nALTER TABLE contacts ADD force_init CHECK(force_init IN ('N', 'Y'));\nALTER TABLE contacts ADD freq_rx REAL;\nALTER TABLE contacts ADD guest_op TEXT;\nALTER TABLE contacts ADD hrdlog_qso_upload_date TEXT;\nALTER TABLE contacts ADD hrdlog_qso_upload_status CHECK(hrdlog_qso_upload_status IN ('N', 'Y', 'R', 'I')) DEFAULT 'N';\nALTER TABLE contacts ADD iota_island_id INTEGER;\nALTER TABLE contacts ADD k_index INTEGER;\nALTER TABLE contacts ADD lat TEXT;\nALTER TABLE contacts ADD lon TEXT;\nALTER TABLE contacts ADD max_bursts REAL;\nALTER TABLE contacts ADD ms_shower TEXT;\nALTER TABLE contacts ADD my_antenna TEXT;\nALTER TABLE contacts ADD my_antenna_intl TEXT;\nALTER TABLE contacts ADD my_city TEXT;\nALTER TABLE contacts ADD my_city_intl TEXT;\nALTER TABLE contacts ADD my_cnty TEXT;\nALTER TABLE contacts ADD my_country TEXT;\nALTER TABLE contacts ADD my_country_intl TEXT;\nALTER TABLE contacts ADD my_cq_zone INTEGER;\nALTER TABLE contacts ADD my_dxcc INTEGER;\nALTER TABLE contacts ADD my_fists INTEGER;\nALTER TABLE contacts ADD my_gridsquare TEXT;\nALTER TABLE contacts ADD my_iota TEXT;\nALTER TABLE contacts ADD my_iota_island_id INTEGER;\nALTER TABLE contacts ADD my_itu_zone INTEGER;\nALTER TABLE contacts ADD my_lat TEXT;\nALTER TABLE contacts ADD my_lon TEXT;\nALTER TABLE contacts ADD my_name TEXT;\nALTER TABLE contacts ADD my_name_intl TEXT;\nALTER TABLE contacts ADD my_postal_code TEXT;\nALTER TABLE contacts ADD my_postal_code_intl TEXT;\nALTER TABLE contacts ADD my_rig TEXT;\nALTER TABLE contacts ADD my_rig_intl TEXT;\nALTER TABLE contacts ADD my_sig TEXT;\nALTER TABLE contacts ADD my_sig_intl TEXT;\nALTER TABLE contacts ADD my_sig_info TEXT;\nALTER TABLE contacts ADD my_sig_info_intl TEXT;\nALTER TABLE contacts ADD my_sota_ref TEXT;\nALTER TABLE contacts ADD my_state TEXT;\nALTER TABLE contacts ADD my_street TEXT;\nALTER TABLE contacts ADD my_street_intl TEXT;\nALTER TABLE contacts ADD my_usaca_counties TEXT;\nALTER TABLE contacts ADD my_vucc_grids TEXT;\nALTER TABLE contacts ADD name_intl TEXT;\nALTER TABLE contacts ADD notes TEXT;\nALTER TABLE contacts ADD notes_intl TEXT;\nALTER TABLE contacts ADD nr_bursts INTEGER;\nALTER TABLE contacts ADD nr_pings INTEGER;\nALTER TABLE contacts ADD \"operator\" TEXT;\nALTER TABLE contacts ADD owner_callsign TEXT;\nALTER TABLE contacts ADD precedence TEXT;\nALTER TABLE contacts ADD prop_mode TEXT;\nALTER TABLE contacts ADD public_key TEXT;\nALTER TABLE contacts ADD qrzcom_qso_upload_date TEXT;\nALTER TABLE contacts ADD qrzcom_qso_upload_status CHECK(qrzcom_qso_upload_status IN ('N', 'Y', 'M')) DEFAULT 'N';\nALTER TABLE contacts ADD qslmsg TEXT;\nALTER TABLE contacts ADD qslmsg_intl TEXT;\nALTER TABLE contacts ADD qsl_rcvd_via CHECK(qsl_rcvd_via IN ('B', 'D', 'E', 'M'));\nALTER TABLE contacts ADD qsl_sent_via CHECK(qsl_sent_via IN ('B', 'D', 'E', 'M'));\nALTER TABLE contacts ADD qsl_via TEXT;\nALTER TABLE contacts ADD qso_complete CHECK(qso_complete IN ('Y', 'N', 'NIL', '?' ));\nALTER TABLE contacts ADD qso_random CHECK(qso_random IN ('N', 'Y'));\nALTER TABLE contacts ADD qth_intl TEXT;\nALTER TABLE contacts ADD region TEXT;\nALTER TABLE contacts ADD rig TEXT;\nALTER TABLE contacts ADD rig_intl TEXT;\nALTER TABLE contacts ADD rx_pwr REAL;\nALTER TABLE contacts ADD sat_mode CHECK(sat_mode IN ('K', 'T', 'A', 'A', 'J', 'B', 'S', 'L', 'VU', 'UV', 'US', 'LU', 'LS', 'LX', 'VS'));\nALTER TABLE contacts ADD sat_name TEXT;\nALTER TABLE contacts ADD sfi INTEGER;\nALTER TABLE contacts ADD sig TEXT;\nALTER TABLE contacts ADD sig_intl TEXT;\nALTER TABLE contacts ADD sig_info TEXT;\nALTER TABLE contacts ADD sig_info_intl TEXT;\nALTER TABLE contacts ADD silent_key CHECK(silent_key IN ('N', 'Y'));\nALTER TABLE contacts ADD skcc TEXT;\nALTER TABLE contacts ADD sota_ref TEXT;\nALTER TABLE contacts ADD srx INTEGER;\nALTER TABLE contacts ADD srx_string TEXT;\nALTER TABLE contacts ADD station_callsign TEXT;\nALTER TABLE contacts ADD stx INTEGER;\nALTER TABLE contacts ADD stx_string TEXT;\nALTER TABLE contacts ADD swl CHECK(swl IN ('N', 'Y'));\nALTER TABLE contacts ADD ten_ten INTEGER;\nALTER TABLE contacts ADD uksmg INTEGER;\nALTER TABLE contacts ADD usaca_counties TEXT;\nALTER TABLE contacts ADD ve_prov TEXT;\nALTER TABLE contacts ADD vucc_grids TEXT;\nALTER TABLE contacts ADD web TEXT;\n\nCREATE TABLE IF NOT EXISTS sat_info (\n        name TEXT NOT NULL,\n        number INTEGER,\n        uplink TEXT,\n        downlink TEXT,\n        beacon TEXT,\n        \"mode\" TEXT,\n        callsign TEXT,\n        status TEXT\n);\n\nCREATE TABLE IF NOT EXISTS qso_filter_matching_types (\n        matching_id INTEGER PRIMARY KEY,\n        sql_operator TEXT NOT NULL\n);\n\nINSERT INTO qso_filter_matching_types values (0,'AND');\nINSERT INTO qso_filter_matching_types values (1,'OR');\n\nCREATE TABLE IF NOT EXISTS qso_filter_operators (\n        operator_id INTEGER PRIMARY KEY,\n        sql_operator TEXT NOT NULL\n);\n\nINSERT INTO qso_filter_operators values (0,'=');\nINSERT INTO qso_filter_operators values (1,'<>');\nINSERT INTO qso_filter_operators values (2,'like');\nINSERT INTO qso_filter_operators values (3,'not like');\nINSERT INTO qso_filter_operators values (4,'>');\nINSERT INTO qso_filter_operators values (5,'<');\n\nCREATE TABLE IF NOT EXISTS qso_filters (\n        filter_name text PRIMARY KEY,\n        matching_type INTEGER REFERENCES qso_filter_matching_types(matching_id)\n);\n\nCREATE TABLE IF NOT EXISTS qso_filter_rules (\n        filter_name       TEXT REFERENCES qso_filters(filter_name) ON DELETE CASCADE,\n        table_field_index INTEGER NOT NULL,\n        operator_id       INTEGER REFERENCES qso_filter_operators(operator_id) ,\n        \"value\"           TEXT\n);\n"
  },
  {
    "path": "res/sql/migration_003.sql",
    "content": "CREATE TABLE IF NOT EXISTS station_profiles (\n        profile_name TEXT PRIMARY KEY,\n        callsign TEXT NOT NULL,\n        locator TEXT NOT NULL,\n        operator_name TEXT,\n        qth_name TEXT,\n        iota TEXT,\n        sota TEXT,\n        sig TEXT,\n        sig_info TEXT,\n        vucc TEXT\n);\n"
  },
  {
    "path": "res/sql/migration_004.sql",
    "content": "INSERT INTO modes (name, rprt, dxcc, enabled, submodes) VALUES\n('C4FM', '59', 'PHONE', true, NULL),\n('CHIP', NULL, 'DIGITAL', true, '[\"CHIP64\", \"CHIP128\"]'),\n('CLO', NULL, 'DIGITAL', true, NULL),\n('FAX', NULL, 'DIGITAL', true, NULL),\n('ISCAT', NULL, 'DIGITAL', true, NULL),\n('JT4', NULL, 'DIGITAL', true, '[\"JT4A\", \"JT4B\", \"JT4C\", \"JT4D\", \"JT4E\", \"JT4F\", \"JT4G\"]'),\n('PAX', NULL, 'DIGITAL', true, '[\"PAX2\"]'),\n('PSK2', NULL, 'DIGITAL', true, NULL),\n('Q15', NULL, 'DIGITAL', true, NULL),\n('QRA64', NULL, 'DIGITAL', true, '[\"QRA64A\", \"QRA64B\", \"QRA64C\", \"QRA64D\", \"QRA64E\"]'),\n('ROS', NULL, 'DIGITAL', true, '[\"ROS-EME\", \"ROS-HF\", \"ROS-MF\"]'),\n('RTTYM', NULL, 'DIGITAL', true, NULL),\n('T10', NULL, 'DIGITAL', true, NULL),\n('THOR', NULL, 'DIGITAL', true, '[\"THOR-M\", \"THOR4\", \"THOR5\", \"THOR8\", \"THOR11\", \"THOR16\", \"THOR22\", \"THOR25X4\", \"THOR50X1\", \"THOR50X2\", \"THOR100\"]'),\n('THRB', NULL, 'DIGITAL', true, '[\"THRBX\", \"THRBX1\", \"THRBX2\", \"THRBX4\", \"THROB1\", \"THROB2\", \"THROB4\"]'),\n('TOR', NULL, 'DIGITAL', true, '[\"TOR\", \"AMTORFEC\", \"GTOR\", \"NAVTEX\", \"SITORB\"]'),\n('V4', NULL, 'DIGITAL', true, NULL),\n('VOI', NULL, 'DIGITAL', true, NULL),\n('WINMOR', NULL, 'DIGITAL', true, NULL),\n('WSPR', NULL, 'DIGITAL', true, NULL);\n\nUPDATE modes SET submodes='[\"DOM-M\", \"DOM4\", \"DOM5\", \"DOM8\", \"DOM11\", \"DOM16\", \"DOM22\", \"DOM44\", \"DOM88\", \"DOMINOEX\", \"DOMINOF\"]'\nWHERE name = 'DOMINO';\n\nUPDATE modes SET submodes='[\"FMHELL\", \"FSKHELL\", \"HELL80\", \"HELLX5\", \"HELLX9\", \"HFSK\", \"PSKHELL\", \"SLOWHELL\"]'\nWHERE name = 'HELL';\n\nUPDATE modes SET submodes='[\"FSQCALL\", \"FST4\", \"FST4W\", \"FT4\", \"JS8\", \"JTMS\", \"MFSK4\", \"MFSK8\", \"MFSK11\", \"MFSK16\", \"MFSK22\", \"MFSK31\", \"MFSK32\", \"MFSK64\", \"MFSK64L\", \"MFSK128\", \"MFSK128L\", \"Q65\"]'\nWHERE name = 'MFSK';\n\nUPDATE modes SET submodes='[\"8PSK125\", \"8PSK125F\", \"8PSK125FL\", \"8PSK250\", \"8PSK250F\", \"8PSK250FL\", \"8PSK500\", \"8PSK500F\", \"8PSK1000\", \"8PSK1000F\", \"8PSK1200F\", \"FSK31\", \"PSK10\", \"PSK31\", \"PSK63\", \"PSK63F\", \"PSK63RC4\", \"PSK63RC5\", \"PSK63RC10\", \"PSK63RC20\", \"PSK63RC32\", \"PSK125\", \"PSK125C12\", \"PSK125R\", \"PSK125RC10\", \"PSK125RC12\", \"PSK125RC16\", \"PSK125RC4\", \"PSK125RC5\", \"PSK250\", \"PSK250C6\", \"PSK250R\", \"PSK250RC2\", \"PSK250RC3\", \"PSK250RC5\", \"PSK250RC6\", \"PSK250RC7\", \"PSK500\", \"PSK500C2\", \"PSK500C4\", \"PSK500R\", \"PSK500RC2\", \"PSK500RC3\", \"PSK500RC4\", \"PSK800C2\", \"PSK800RC2\", \"PSK1000\", \"PSK1000C2\", \"PSK1000R\", \"PSK1000RC2\", \"PSKAM10\", \"PSKAM31\", \"PSKAM50\", \"PSKFEC31\", \"QPSK31\", \"QPSK63\", \"QPSK125\", \"QPSK250\", \"QPSK500\", \"SIM31\"]'\nWHERE name = 'PSK';\n\n\nUPDATE contacts SET name_intl = name WHERE name_intl IS NULL;\nUPDATE contacts SET qth_intl = qth WHERE qth_intl IS NULL;\nUPDATE contacts SET comment_intl = comment WHERE comment_intl IS NULL;\nUPDATE contacts SET my_antenna_intl = my_antenna WHERE my_antenna_intl IS NULL;\nUPDATE contacts SET my_city_intl = my_city WHERE my_city_intl IS NULL;\nUPDATE contacts SET my_rig_intl = my_rig WHERE my_rig_intl IS NULL;\nUPDATE contacts SET my_sig_intl = my_sig WHERE my_sig_intl IS NULL;\nUPDATE contacts SET my_sig_info_intl = my_sig_info WHERE my_sig_info_intl IS NULL;\nUPDATE contacts SET sig_intl = sig WHERE sig_intl IS NULL;\nUPDATE contacts SET sig_info_intl = sig_info WHERE sig_info_intl IS NULL;\n"
  },
  {
    "path": "res/sql/migration_005.sql",
    "content": "INSERT INTO modes (name, rprt, dxcc, enabled, submodes) VALUES\n('CW', '599', 'CW', true, NULL),\n('SSB', '59', 'PHONE', true, '[\"LSB\", \"USB\"]'),\n('AM', '59', 'PHONE', true, NULL),\n('FM', '59', 'PHONE', true, NULL),\n('PSK', '599', 'DIGITAL', true, '[\n        \"PSK31\",\n        \"PSK63\",\n        \"PSK63F\",\n        \"PSK125\",\n        \"PSK250\",\n        \"PSK500\",\n        \"PSK1000\",\n        \"QPSK31\",\n        \"QPSK63\",\n        \"QPSK125\",\n        \"QPSK250\",\n        \"QPSK500\"\n]'),\n('RTTY', '599', 'DIGITAL', true, NULL),\n('MFSK', '599', 'DIGITAL', true, '[\n        \"FT4\",\n        \"MFSK4\",\n        \"MFSK8\",\n        \"MFSK11\",\n        \"MFSK16\",\n        \"MFSK22\",\n        \"MFSK31\",\n        \"MFSK32\"\n]'),\n('OLIVIA', NULL, 'DIGITAL', true, '[\n        \"OLIVIA 4/125\",\n        \"OLIVIA 4/250\",\n        \"OLIVIA 8/250\",\n        \"OLIVIA 8/500\",\n        \"OLIVIA 16/500\",\n        \"OLIVIA 16/1000\",\n        \"OLIVIA 32/1000\"\n]'),\n('JT65', '-1', 'DIGITAL', true, '[\n        \"JT65A\",\n        \"JT65B\",\n        \"JT65B2\",\n        \"JT65C\",\n        \"JT65C2\"\n]'),\n('JT9', '-1', 'DIGITAL', true, '[\n        \"JT9-1\",\n        \"JT9-2\",\n        \"JT9-5\",\n        \"JT9-10\",\n        \"JT9-30\"\n]'),\n('FT8', '-1', 'DIGITAL', true, NULL),\n('HELL', NULL, 'DIGITAL', true, '[\n        \"FMHELL\",\n        \"FSKHELL\",\n        \"HELL80\",\n        \"HFSK\",\n        \"PSKHELL\"\n]'),\n('CONTESTIA', NULL, 'DIGITAL', true, NULL),\n('DOMINO', NULL, 'DIGITAL', true, '[\n        \"DOMINOEX\",\n        \"DOMINOF\"\n]'),\n('MT63', NULL, 'DIGITAL', true, NULL),\n('JT6M', '26', 'DIGITAL', true, NULL),\n('JTMSK', '-1', 'DIGITAL', true, NULL),\n('MSK144', '0', 'DIGITAL', true, NULL),\n('FSK441', '26', 'DIGITAL', true, NULL),\n('DIGITALVOICE', '59', 'PHONE', true, NULL),\n('DSTAR', '59', 'PHONE', true, NULL),\n('PKT', NULL, 'DIGITAL', true, NULL),\n('ATV', NULL, 'DIGITAL', true, NULL),\n('SSTV', NULL, 'DIGITAL', true, NULL)\nON CONFLICT DO NOTHING;\n"
  },
  {
    "path": "res/sql/migration_006.sql",
    "content": "CREATE TABLE IF NOT EXISTS log_param (\n        name TEXT PRIMARY KEY,\n        value TEXT\n);\n\nCREATE TABLE IF NOT EXISTS rig_profiles (\n        profile_name TEXT PRIMARY KEY,\n        model NUMBER NOT NULL,\n        port_pathname TEXT,\n        hostname TEXT,\n        netport NUMBER,\n        baudrate NUMBER,\n        databits NUMBER,\n        stopbits REAL,\n        flowcontrol TEXT,\n        parity TEXT,\n        pollinterval INTEGER,\n        txfreq_start REAL,\n        txfreq_end REAL,\n        get_freq INTEGER,\n        get_mode INTEGER,\n        get_vfo  INTEGER,\n        get_pwr  INTEGER,\n        rit_offset REAL,\n        xit_offset REAL,\n        get_rit  INTEGER,\n        get_xit  INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS rot_profiles (\n        profile_name TEXT PRIMARY KEY,\n        model NUMBER NOT NULL,\n        port_pathname TEXT,\n        hostname TEXT,\n        netport NUMBER,\n        baudrate NUMBER,\n        databits NUMBER,\n        stopbits REAL,\n        flowcontrol TEXT,\n        parity TEXT\n);\n\nCREATE TABLE IF NOT EXISTS ant_profiles (\n        profile_name TEXT PRIMARY KEY,\n        desc TEXT\n);\n"
  },
  {
    "path": "res/sql/migration_007.sql",
    "content": "UPDATE contacts SET address_intl = address WHERE address_intl IS NULL AND address IS NOT NULL;\nUPDATE contacts SET comment_intl = comment WHERE comment_intl IS NULL AND comment IS NOT NULL;\nUPDATE contacts SET country_intl = country WHERE country_intl IS NULL AND country IS NOT NULL;\nUPDATE contacts SET my_antenna_intl = my_antenna WHERE my_antenna_intl IS NULL AND my_antenna IS NOT NULL;\nUPDATE contacts SET my_city_intl = my_city WHERE my_city_intl IS NULL AND my_city IS NOT NULL;\nUPDATE contacts SET my_country_intl = my_country WHERE my_country_intl IS NULL AND my_country IS NOT NULL;\nUPDATE contacts SET my_name_intl = my_name WHERE my_name_intl IS NULL AND my_name IS NOT NULL;\nUPDATE contacts SET my_postal_code_intl = my_postal_code WHERE my_postal_code_intl IS NULL AND my_postal_code IS NOT NULL;\nUPDATE contacts SET my_rig_intl = my_rig WHERE my_rig_intl IS NULL AND my_rig IS NOT NULL;\nUPDATE contacts SET my_sig_intl = my_sig WHERE my_sig_intl IS NULL AND my_sig IS NOT NULL;\nUPDATE contacts SET my_sig_info_intl = my_sig_info WHERE my_sig_info_intl IS NULL AND my_sig_info IS NOT NULL;\nUPDATE contacts SET my_street_intl = my_street WHERE my_street_intl IS NULL AND my_street IS NOT NULL;\nUPDATE contacts SET name_intl = name WHERE name_intl IS NULL AND name IS NOT NULL;\nUPDATE contacts SET notes_intl = notes WHERE notes_intl IS NULL AND notes IS NOT NULL;\nUPDATE contacts SET qth_intl = qth WHERE qth_intl IS NULL AND qth IS NOT NULL;\nUPDATE contacts SET rig_intl = rig WHERE rig_intl IS NULL AND rig IS NOT NULL;\nUPDATE contacts SET sig_intl = sig WHERE sig_intl IS NULL AND sig IS NOT NULL;\nUPDATE contacts SET sig_info_intl = sig_info WHERE sig_info_intl IS NULL AND sig_info IS NOT NULL;\nUPDATE contacts SET clublog_qso_upload_status='N' WHERE clublog_qso_upload_status IS NULL;\nUPDATE contacts SET qrzcom_qso_upload_status='N' WHERE qrzcom_qso_upload_status IS NULL;\nUPDATE contacts SET hrdlog_qso_upload_status='N' WHERE hrdlog_qso_upload_status IS NULL;\nUPDATE contacts SET eqsl_qsl_rcvd='N' WHERE eqsl_qsl_rcvd IS NULL;\nUPDATE contacts SET eqsl_qsl_sent='N' WHERE eqsl_qsl_sent IS NULL;\n\n\nALTER TABLE rig_profiles ADD default_pwr REAL DEFAULT 100.0;\n"
  },
  {
    "path": "res/sql/migration_008.sql",
    "content": "CREATE TABLE IF NOT EXISTS alert_rules\n(\n        rule_name text PRIMARY KEY,\n        enabled INTEGER,\n        source INTEGER,\n        dx_callsign TEXT,\n        dx_country INTEGER,\n        dx_logstatus INTEGER,\n        dx_continent TEXT,\n        spot_comment TEXT,\n        mode TEXT,\n        band TEXT,\n        spotter_country INTEGER,\n        spotter_continent TEXT\n);\n\nCREATE INDEX \"dxcc_idx\" ON \"contacts\" (\n        \"dxcc\"\n);\n\nINSERT INTO qso_filter_operators VALUES(6, \"starts with\");\n"
  },
  {
    "path": "res/sql/migration_009.sql",
    "content": "ALTER TABLE rig_profiles ADD get_ptt INTEGER DEFAULT 0;\n"
  },
  {
    "path": "res/sql/migration_010.sql",
    "content": "ALTER TABLE bands ADD last_seen_freq FLOAT;\n\nDELETE FROM modes WHERE name IN ('C4FM', 'DMR', 'DSTAR');\nUPDATE modes SET submodes = '[\"C4FM\", \"DMR\", \"DSTAR\"]' WHERE name = 'DIGITALVOICE';\n\nINSERT INTO modes (name, rprt, dxcc, enabled, submodes) VALUES\n('DYNAMIC', NULL, 'DIGITAL', false, '[\"VARA HF\", \"VARA SATELLITE\", \"VARA FM 1200\", \"VARA FM 9600\"]')\nON CONFLICT DO NOTHING;\n\nALTER TABLE contacts ADD my_arrl_sect TEXT;\nALTER TABLE contacts ADD my_wwff_ref TEXT;\nALTER TABLE contacts ADD wwff_ref TEXT;\nALTER TABLE station_profiles ADD wwff TEXT;\n"
  },
  {
    "path": "res/sql/migration_011.sql",
    "content": "ALTER TABLE rig_profiles ADD qsy_wiping INTEGER DEFAULT 0;\n\nUPDATE rig_profiles SET qsy_wiping = get_freq;\n"
  },
  {
    "path": "res/sql/migration_012.sql",
    "content": "CREATE TABLE IF NOT EXISTS cwkey_profiles(\n        profile_name TEXT PRIMARY KEY,\n        model NUMBER NOT NULL,\n        default_speed NUMBER NOT NULL,\n        key_mode NUMBER,\n        port_pathname TEXT,\n        baudrate NUMBER\n);\n\nCREATE TABLE IF NOT EXISTS cwshortcut_profiles(\n        profile_name TEXT PRIMARY KEY,\n        f1_short  TEXT,\n        f1_macro  TEXT,\n        f2_short  TEXT,\n        f2_macro  TEXT,\n        f3_short  TEXT,\n        f3_macro  TEXT,\n        f4_short  TEXT,\n        f4_macro  TEXT,\n        f5_short  TEXT,\n        f5_macro  TEXT,\n        f6_short  TEXT,\n        f6_macro  TEXT,\n        f7_short  TEXT,\n        f7_macro  TEXT\n);\n\nINSERT INTO cwshortcut_profiles(\nprofile_name,\nf1_short, f1_macro,\nf2_short, f2_macro,\nf3_short, f3_macro,\nf4_short, f4_macro,\nf5_short, f5_macro\n)\nVALUES (\n\"Run\",\n\"CQ\", \"CQ CQ CQ DE <MYCALL> <MYCALL> <MYCALL> K\",\n\"QRZ?\", \"QRZ?\",\n\"AGN?\", \"AGN?\",\n\"Text\", \"<DXCALL> DE <MYCALL> <GREETING> OM TNX FER CALL UR RST <RST> <RST> NAME <MYNAME> <MYNAME> QTH <MYQTH> <MYQTH> HW CPY? <DXCALL> DE <MYCALL> K\",\n\"End\", \"<DXCALL> DE <MYCALL> TNX FER QSO GL 73 <DXCALL> DE <MYCALL>\"\n);\n\n\nALTER TABLE rig_profiles ADD get_key_speed INTEGER DEFAULT 1;\nALTER TABLE rig_profiles ADD assigned_cw_key TEXT DEFAULT ' ';\n"
  },
  {
    "path": "res/sql/migration_013.sql",
    "content": "CREATE TABLE IF NOT EXISTS sota_summits(\n        summit_code TEXT PRIMARY KEY,\n        association_name TEXT,\n        region_name TEXT,\n        summit_name TEXT,\n        altm INTEGER,\n        altft INTEGER,\n        gridref1 REAL,\n        gridref2 REAL,\n        longitude REAL,\n        latitude REAL,\n        points INTEGER,\n        bonus_points INTEGER,\n        valid_from TEXT,\n        valid_to TEXT\n);\n\nCREATE TABLE IF NOT EXISTS wwff_directory(\n        reference TEXT PRIMARY KEY,\n        status TEXT,\n        name TEXT,\n        program TEXT,\n        dxcc TEXT,\n        state TEXT,\n        county TEXT,\n        continent TEXT,\n        iota TEXT,\n        iaruLocator TEXT,\n        latitude REAL,\n        longitude REAL,\n        iucncat TEXT,\n        valid_from TEXT,\n        valid_to TEXT\n);\n\nCREATE TABLE IF NOT EXISTS iota(\n        iotaid TEXT PRIMARY KEY,\n        islandname TEXT\n);\n\n"
  },
  {
    "path": "res/sql/migration_014.sql",
    "content": "ALTER TABLE rig_profiles ADD key_speed_sync INTEGER DEFAULT 0;\n\n"
  },
  {
    "path": "res/sql/migration_015.sql",
    "content": "UPDATE modes SET submodes = '[\"C4FM\", \"DMR\", \"DSTAR\", \"FREEDV\", \"M17\" ]' WHERE name = 'DIGITALVOICE';\n\nINSERT INTO bands (name, start_freq, end_freq, enabled) VALUES\n('submm',300000.0, 7500000.0, 0);\n\nALTER TABLE contacts ADD altitude REAL;\nALTER TABLE contacts ADD gridsquare_ext TEXT;\nALTER TABLE contacts ADD hamlogeu_qso_upload_date TEXT;\nALTER TABLE contacts ADD hamlogeu_qso_upload_status CHECK(clublog_qso_upload_status IN ('N', 'Y', 'M')) DEFAULT 'N';\nALTER TABLE contacts ADD hamqth_qso_upload_date TEXT;\nALTER TABLE contacts ADD hamqth_qso_upload_status CHECK(clublog_qso_upload_status IN ('N', 'Y', 'M')) DEFAULT 'N';\nALTER TABLE contacts ADD my_altitude REAL;\nALTER TABLE contacts ADD my_gridsquare_ext TEXT;\nALTER TABLE contacts ADD my_pota_ref TEXT;\nALTER TABLE contacts ADD pota_ref TEXT;\n\nCREATE TABLE IF NOT EXISTS pota_directory(\n        reference TEXT PRIMARY KEY,\n        name TEXT,\n        active INTEGER,\n        entityID INTEGER,\n        locationDesc TEXT,\n        latitude REAL,\n        longitude REAL,\n        grid TEXT\n);\n\nALTER TABLE station_profiles ADD pota TEXT;\n"
  },
  {
    "path": "res/sql/migration_016.sql",
    "content": "ALTER TABLE contacts RENAME TO contacts_old;\n\nDROP INDEX callsign_idx;\nDROP INDEX dxcc_idx;\n\nCREATE TABLE IF NOT EXISTS adif_enum_qsl_rcvd (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_qsl_rcvd VALUES ('Y');\nINSERT INTO adif_enum_qsl_rcvd VALUES ('N');\nINSERT INTO adif_enum_qsl_rcvd VALUES ('R');\nINSERT INTO adif_enum_qsl_rcvd VALUES ('I');\nINSERT INTO adif_enum_qsl_rcvd VALUES ('V');\n\nCREATE TABLE IF NOT EXISTS adif_enum_qsl_sent (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_qsl_sent VALUES ('Y');\nINSERT INTO adif_enum_qsl_sent VALUES ('N');\nINSERT INTO adif_enum_qsl_sent VALUES ('R');\nINSERT INTO adif_enum_qsl_sent VALUES ('Q');\nINSERT INTO adif_enum_qsl_sent VALUES ('I');\n\nCREATE TABLE IF NOT EXISTS adif_enum_ant_path (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_ant_path VALUES ('G');\nINSERT INTO adif_enum_ant_path VALUES ('O');\nINSERT INTO adif_enum_ant_path VALUES ('S');\nINSERT INTO adif_enum_ant_path VALUES ('L');\n\nCREATE TABLE IF NOT EXISTS adif_enum_qso_upload_status (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_qso_upload_status VALUES ('Y');\nINSERT INTO adif_enum_qso_upload_status VALUES ('N');\nINSERT INTO adif_enum_qso_upload_status VALUES ('M');\n\nCREATE TABLE IF NOT EXISTS adif_enum_qsl_via (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_qsl_via VALUES ('B');\nINSERT INTO adif_enum_qsl_via VALUES ('D');\nINSERT INTO adif_enum_qsl_via VALUES ('E');\nINSERT INTO adif_enum_qsl_via VALUES ('M');\n\nCREATE TABLE IF NOT EXISTS adif_enum_qso_complete (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_qso_complete VALUES ('Y');\nINSERT INTO adif_enum_qso_complete VALUES ('N');\nINSERT INTO adif_enum_qso_complete VALUES ('NIL');\nINSERT INTO adif_enum_qso_complete VALUES ('?');\n\nCREATE TABLE IF NOT EXISTS adif_enum_boolean (\n        \"value\"    TEXT PRIMARY KEY);\nINSERT INTO adif_enum_boolean VALUES ('Y');\nINSERT INTO adif_enum_boolean VALUES ('N');\n\nCREATE TABLE \"contacts\" (\n \"id\"                            INTEGER,\n \"start_time\"                    TEXT,\n \"end_time\"                      TEXT,\n \"callsign\"                      TEXT NOT NULL,\n \"rst_sent\"                      TEXT,\n \"rst_rcvd\"                      TEXT,\n \"freq\"                          REAL,\n \"band\"                          TEXT,\n \"mode\"                          TEXT,\n \"submode\"                       TEXT,\n \"name\"                          TEXT,\n \"qth\"                           TEXT,\n \"gridsquare\"                    TEXT,\n \"dxcc\"                          INTEGER,\n \"country\"                       TEXT,\n \"cont\"                          TEXT,\n \"cqz\"                           INTEGER,\n \"ituz\"                          INTEGER,\n \"pfx\"                           TEXT,\n \"state\"                         TEXT,\n \"cnty\"                          TEXT,\n \"iota\"                          TEXT,\n \"qsl_rcvd\"                      TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_rcvd(\"value\"),\n \"qsl_rdate\"                     TEXT,\n \"qsl_sent\"                      TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_sent(\"value\"),\n \"qsl_sdate\"                     TEXT,\n \"lotw_qsl_rcvd\"                 TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_rcvd(\"value\"),\n \"lotw_qslrdate\"                 TEXT,\n \"lotw_qsl_sent\"                 TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_sent(\"value\"),\n \"lotw_qslsdate\"                 TEXT,\n \"tx_pwr\"                        REAL,\n \"fields\"                        JSON,\n \"address\"                       TEXT,\n \"address_intl\"                  TEXT,\n \"age\"                           INTEGER,\n \"a_index\"                       INTEGER,\n \"ant_az\"                        INTEGER,\n \"ant_el\"                        INTEGER,\n \"ant_path\"                      TEXT REFERENCES adif_enum_ant_path(\"value\"),\n \"arrl_sect\"                     TEXT,\n \"award_submitted\"               TEXT,\n \"award_granted\"                 TEXT,\n \"band_rx\"                       TEXT,\n \"check\"                         TEXT,\n \"class\"                         TEXT,\n \"clublog_qso_upload_date\"       TEXT,\n \"clublog_qso_upload_status\"     TEXT REFERENCES adif_enum_qso_upload_status(\"value\"),\n \"comment\"                       TEXT,\n \"comment_intl\"                  TEXT,\n \"contacted_op\"                  TEXT,\n \"contest_id\"                    TEXT,\n \"country_intl\"                  TEXT,\n \"credit_submitted\"              TEXT,\n \"credit_granted\"                TEXT,\n \"darc_dok\"                      TEXT,\n \"distance\"                      REAL,\n \"email\"                         TEXT,\n \"eq_call\"                       TEXT,\n \"eqsl_qslrdate\"                 TEXT,\n \"eqsl_qslsdate\"                 TEXT,\n \"eqsl_qsl_rcvd\"                 TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_rcvd(\"value\"),\n \"eqsl_qsl_sent\"                 TEXT NOT NULL DEFAULT 'N' REFERENCES adif_enum_qsl_sent(\"value\"),\n \"fists\"                         INTEGER,\n \"fists_cc\"                      INTEGER,\n \"force_init\"                    TEXT REFERENCES adif_enum_boolean(\"value\"),\n \"freq_rx\"                       REAL,\n \"guest_op\"                      TEXT,\n \"hrdlog_qso_upload_date\"        TEXT,\n \"hrdlog_qso_upload_status\"      TEXT REFERENCES adif_enum_qso_upload_status(\"value\"),\n \"iota_island_id\"                INTEGER,\n \"k_index\"                       INTEGER,\n \"lat\"                           TEXT,\n \"lon\"                           TEXT,\n \"max_bursts\"                    REAL,\n \"ms_shower\"                     TEXT,\n \"my_antenna\"                    TEXT,\n \"my_antenna_intl\"               TEXT,\n \"my_city\"                       TEXT,\n \"my_city_intl\"                  TEXT,\n \"my_cnty\"                       TEXT,\n \"my_country\"                    TEXT,\n \"my_country_intl\"               TEXT,\n \"my_cq_zone\"                    INTEGER,\n \"my_dxcc\"                       INTEGER,\n \"my_fists\"                      INTEGER,\n \"my_gridsquare\"                 TEXT,\n \"my_iota\"                       TEXT,\n \"my_iota_island_id\"             INTEGER,\n \"my_itu_zone\"                   INTEGER,\n \"my_lat\"                        TEXT,\n \"my_lon\"                        TEXT,\n \"my_name\"                       TEXT,\n \"my_name_intl\"                  TEXT,\n \"my_postal_code\"                TEXT,\n \"my_postal_code_intl\"           TEXT,\n \"my_rig\"                        TEXT,\n \"my_rig_intl\"                   TEXT,\n \"my_sig\"                        TEXT,\n \"my_sig_intl\"                   TEXT,\n \"my_sig_info\"                   TEXT,\n \"my_sig_info_intl\"              TEXT,\n \"my_sota_ref\"                   TEXT,\n \"my_state\"                      TEXT,\n \"my_street\"                     TEXT,\n \"my_street_intl\"                TEXT,\n \"my_usaca_counties\"             TEXT,\n \"my_vucc_grids\"                 TEXT,\n \"name_intl\"                     TEXT,\n \"notes\"                         TEXT,\n \"notes_intl\"                    TEXT,\n \"nr_bursts\"                     INTEGER,\n \"nr_pings\"                      INTEGER,\n \"operator\"                      TEXT,\n \"owner_callsign\"                TEXT,\n \"precedence\"                    TEXT,\n \"prop_mode\"                     TEXT,\n \"public_key\"                    TEXT,\n \"qrzcom_qso_upload_date\"        TEXT,\n \"qrzcom_qso_upload_status\"      TEXT REFERENCES adif_enum_qso_upload_status(\"value\"),\n \"qslmsg\"                        TEXT,\n \"qslmsg_intl\"                   TEXT,\n \"qsl_rcvd_via\"                  TEXT REFERENCES adif_enum_qsl_via(\"value\"),\n \"qsl_sent_via\"                  TEXT REFERENCES adif_enum_qsl_via(\"value\"),\n \"qsl_via\"                       TEXT,\n \"qso_complete\"                  TEXT REFERENCES adif_enum_qso_complete(\"value\"),\n \"qso_random\"                    TEXT REFERENCES adif_enum_boolean(\"value\"),\n \"qth_intl\"                      TEXT,\n \"region\"                        TEXT,\n \"rig\"                           TEXT,\n \"rig_intl\"                      TEXT,\n \"rx_pwr\"                        REAL,\n \"sat_mode\"                      TEXT,\n \"sat_name\"                      TEXT,\n \"sfi\"                           INTEGER,\n \"sig\"                           TEXT,\n \"sig_intl\"                      TEXT,\n \"sig_info\"                      TEXT,\n \"sig_info_intl\"                 TEXT,\n \"silent_key\"                    TEXT REFERENCES adif_enum_boolean(\"value\"),\n \"skcc\"                          TEXT,\n \"sota_ref\"                      TEXT,\n \"srx\"                           INTEGER,\n \"srx_string\"                    TEXT,\n \"station_callsign\"              TEXT,\n \"stx\"                           INTEGER,\n \"stx_string\"                    TEXT,\n \"swl\"                           TEXT REFERENCES adif_enum_boolean(\"value\"),\n \"ten_ten\"                       INTEGER,\n \"uksmg\"                         INTEGER,\n \"usaca_counties\"                TEXT,\n \"ve_prov\"                       TEXT,\n \"vucc_grids\"                    TEXT,\n \"web\"                           TEXT,\n \"my_arrl_sect\"                  TEXT,\n \"my_wwff_ref\"                   TEXT,\n \"wwff_ref\"                      TEXT,\n \"altitude\"                      REAL,\n \"gridsquare_ext\"                TEXT,\n \"hamlogeu_qso_upload_date\"      TEXT,\n \"hamlogeu_qso_upload_status\"    TEXT REFERENCES adif_enum_qso_upload_status(\"value\"),\n \"hamqth_qso_upload_date\"        TEXT,\n \"hamqth_qso_upload_status\"      TEXT REFERENCES adif_enum_qso_upload_status(\"value\"),\n \"my_altitude\"                   REAL,\n \"my_gridsquare_ext\"             TEXT,\n \"my_pota_ref\"                   TEXT,\n \"pota_ref\"                      TEXT,\n PRIMARY KEY(\"id\")\n);\n\nCREATE INDEX \"callsign_idx\" ON \"contacts\" (\"callsign\");\nCREATE INDEX \"dxcc_idx\" ON \"contacts\" (\"dxcc\");\n\nINSERT INTO contacts SELECT * FROM contacts_old;\n\nUPDATE contacts SET altitude = NULL where altitude = 0.0;\nUPDATE contacts SET my_altitude = NULL where my_altitude = 0.0;\nUPDATE contacts SET tx_pwr = NULL where tx_pwr = 0.0;\n"
  },
  {
    "path": "res/sql/migration_017.sql",
    "content": "CREATE TABLE IF NOT EXISTS rot_user_buttons_profiles(\n        profile_name TEXT PRIMARY KEY,\n        button1_short  TEXT,\n        button1_value  REAL DEFAULT '-1',\n        button2_short  TEXT,\n        button2_value  REAL DEFAULT '-1',\n        button3_short  TEXT,\n        button3_value  REAL DEFAULT '-1',\n        button4_short  TEXT,\n        button4_value  REAL DEFAULT '-1'\n);\n\nINSERT INTO rot_user_buttons_profiles(\nprofile_name,\nbutton1_short, button1_value,\nbutton2_short, button2_value,\nbutton3_short, button3_value,\nbutton4_short, button4_value\n)\nVALUES (\n\"Basic\",\n\"N\", 0,\n\"S\", 180,\n\"W\", 270,\n\"E\", 90\n);\n\nUPDATE contacts SET ant_az = 360 + ant_az WHERE ant_az < 0;\n\nCREATE TABLE IF NOT EXISTS membership_directory(\n        short_desc  TEXT,\n        long_desc   TEXT,\n        filename    TEXT,\n        last_update TEXT,\n        num_records INTEGER\n);\n\nCREATE TABLE IF NOT EXISTS membership (\n        callsign     TEXT,\n        member_id    TEXT,\n        valid_from   TEXT,\n        valid_to     TEXT,\n        clubid       TEXT\n);\n\nCREATE TABLE IF NOT EXISTS membership_versions (\n        clubid     TEXT PRIMARY KEY,\n        version    INTEGER\n);\n\nCREATE INDEX IF NOT EXISTS membership_callsign_idx ON membership(callsign);\nCREATE INDEX IF NOT EXISTS membership_clubid_idx ON membership(clubid);\n\nCREATE TABLE IF NOT EXISTS contacts_autovalue(\n   contactid INTEGER PRIMARY KEY REFERENCES contacts(\"id\") ON DELETE CASCADE,\n   base_callsign TEXT\n);\n\nCREATE INDEX IF NOT EXISTS contacts_autovalue_call_idx on contacts_autovalue(base_callsign);\n\nCREATE VIEW IF NOT EXISTS contact_clubs_view AS\nSELECT contactid, clubid\nFROM contacts_autovalue c, membership m\nWHERE c.base_callsign = m.callsign;\n\n\nINSERT INTO contacts_autovalue SELECT ID, ((WITH tokenizedCallsign(word, csv) AS ( SELECT '', callsign||'/'\n                                                                             UNION ALL\n                                                                             SELECT substr(csv, 0, instr(csv, '/')), substr(csv, instr(csv, '/') + 1)\n                                                                             FROM tokenizedCallsign\n                                                                             WHERE csv != '' )\n                                           SELECT word FROM tokenizedCallsign\n                                           WHERE word != ''\n                                           AND word REGEXP '^([A-Z][0-9]|[A-Z]{1,2}|[0-9][A-Z])([0-9]|[0-9]+)([A-Z]+)$' LIMIT 1)\n                                           ) FROM contacts;\n\nALTER TABLE alert_rules ADD dx_member TEXT DEFAULT '*';\n"
  },
  {
    "path": "res/sql/migration_018.sql",
    "content": "ALTER TABLE cwkey_profiles ADD hostname TEXT;\nALTER TABLE cwkey_profiles ADD netport NUMBER;\n"
  },
  {
    "path": "res/sql/migration_019.sql",
    "content": "UPDATE contacts SET clublog_qso_upload_status = 'M' WHERE mode IN ('FT4', 'FST4', 'FST4W', 'Q65') AND UPPER(clublog_qso_upload_status) = 'Y';\nUPDATE contacts SET qrzcom_qso_upload_status = 'M' WHERE mode IN ('FT4', 'FST4', 'FST4W', 'Q65') AND UPPER(qrzcom_qso_upload_status) = 'Y';\n\nUPDATE contacts SET mode = 'MFSK', submode = 'FT4' WHERE mode = 'FT4';\nUPDATE contacts SET mode = 'MFSK', submode = 'FST4' WHERE mode = 'FST4';\nUPDATE contacts SET mode = 'MFSK', submode = 'FST4W' WHERE mode = 'FST4W';\nUPDATE contacts SET mode = 'MFSK', submode = 'Q65' WHERE mode = 'Q65';\n\nUPDATE modes SET name = 'CONTESTI' WHERE name = 'CONTESTIA';\n"
  },
  {
    "path": "res/sql/migration_020.sql",
    "content": "CREATE TABLE IF NOT EXISTS newcontact_layout_profiles(\n        profile_name TEXT PRIMARY KEY,\n        row_A  TEXT,\n        row_B TEXT\n);\n"
  },
  {
    "path": "res/sql/migration_021.sql",
    "content": "CREATE TABLE IF NOT EXISTS chat_highlight_rules(\n   rule_name TEXT PRIMARY KEY,\n   room_id TEXT,\n   enabled INTEGER,\n   rule_definition TEXT\n);\n\nALTER TABLE ant_profiles ADD azimuth_beamwidth DOUBLE DEFAULT 0.0;\nALTER TABLE ant_profiles ADD azimuth_offset DOUBLE DEFAULT 0.0;\n"
  },
  {
    "path": "res/sql/migration_022.sql",
    "content": "ALTER TABLE newcontact_layout_profiles RENAME TO main_layout_profiles;\n\nALTER TABLE main_layout_profiles ADD detail_col_A TEXT;\nALTER TABLE main_layout_profiles ADD detail_col_B TEXT;\nALTER TABLE main_layout_profiles ADD detail_col_C TEXT;\nALTER TABLE main_layout_profiles ADD main_geometry TEXT;\nALTER TABLE main_layout_profiles ADD main_state TEXT;\nALTER TABLE main_layout_profiles ADD dark_mode INTEGER;\n\nUPDATE main_layout_profiles\nSET detail_col_A = '15,17,16,19,20,34,151',\n    detail_col_B = '54,21,165,140,155,135,137',\n    detail_col_C = '56,152',\n    dark_mode = 0\nWHERE detail_col_A IS NULL;\n\nDROP TABLE IF EXISTS contacts_old;\n\nCREATE INDEX IF NOT EXISTS start_time_idx ON contacts(start_time);\nCREATE INDEX IF NOT EXISTS band_idx ON contacts(band);\nCREATE INDEX IF NOT EXISTS mode_idx ON contacts(mode);\n\nCREATE TABLE IF NOT EXISTS adif_enum_primary_subdivision(\n        code TEXT,\n        subdivision_name  TEXT,\n        dxcc INTEGER,\n        PRIMARY KEY (code, dxcc)\n);\n\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('AK', 'Alaska', 6);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('HI', 'Hawaii', 110);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('CT', 'Connecticut', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('ME', 'Maine', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MA', 'Massachusetts', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NH', 'New Hampshire', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('RI', 'Rhode Island', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('VT', 'Vermont', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NJ', 'New Jersey', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NY', 'New York', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('DE', 'Delaware', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('DC', 'District of Columbia', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MD', 'Maryland', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('PA', 'Pennsylvania', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('AL', 'Alabama', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('FL', 'Florida', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('GA', 'Georgia', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('KY', 'Kentucky', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NC', 'North Carolina', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('SC', 'South Carolina', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('TN', 'Tennessee', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('VA', 'Virginia', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('AR', 'Arkansas', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('LA', 'Louisiana', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MS', 'Mississippi', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NM', 'New Mexico', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('OK', 'Oklahoma', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('TX', 'Texas', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('CA', 'California', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('AZ', 'Arizona', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('ID', 'Idaho', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MT', 'Montana', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NV', 'Nevada', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('OR', 'Oregon', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('UT', 'Utah', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('WA', 'Washington', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('WY', 'Wyoming', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MI', 'Michigan', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('OH', 'Ohio', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('WV', 'West Virginia', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('IL', 'Illinois', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('IN', 'Indiana', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('WI', 'Wisconsin', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('CO', 'Colorado', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('IA', 'Iowa', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('KS', 'Kansas', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MN', 'Minnesota', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('MO', 'Missouri', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('NE', 'Nebraska', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('ND', 'North Dakota', 291);\nINSERT INTO adif_enum_primary_subdivision(code, subdivision_name, dxcc) values ('SD', 'South Dakota', 291);\n\n"
  },
  {
    "path": "res/sql/migration_023.sql",
    "content": "CREATE TABLE contacts_qsl_cards (\n        contactid INTEGER REFERENCES contacts(\"id\") ON DELETE CASCADE,\n        \"source\" TEXT,\n        name TEXT,\n        \"data\" TEXT);\n\nCREATE UNIQUE INDEX IF NOT EXISTS contacts_qsl_id_idx ON contacts_qsl_cards(contactid, \"source\", name);\n"
  },
  {
    "path": "res/sql/migration_024.sql",
    "content": "ALTER TABLE rig_profiles ADD driver INTEGER DEFAULT 0;\n\nUPDATE rig_profiles SET driver = 1;\n"
  },
  {
    "path": "res/sql/migration_025.sql",
    "content": "ALTER TABLE rig_profiles ADD dxspot2rig INTEGER DEFAULT 0;\n"
  },
  {
    "path": "res/sql/migration_026.sql",
    "content": "ALTER TABLE rot_profiles ADD driver INTEGER DEFAULT 0;\nALTER TABLE station_profiles ADD ituz INTEGER;\nALTER TABLE station_profiles ADD cqz INTEGER;\nALTER TABLE station_profiles ADD dxcc INTEGER;\nALTER TABLE station_profiles ADD country TEXT;\n\nUPDATE rot_profiles SET driver = 1;\n"
  },
  {
    "path": "res/sql/migration_027.sql",
    "content": "ALTER TABLE bands ADD sat_designator TEXT;\n\nUPDATE bands SET sat_designator='H' WHERE lower(name) = '15m';\nUPDATE bands SET sat_designator='A' WHERE lower(name) = '10m';\nUPDATE bands SET sat_designator='V' WHERE lower(name) = '2m';\nUPDATE bands SET sat_designator='U' WHERE lower(name) = '70cm';\nUPDATE bands SET sat_designator='L' WHERE lower(name) = '23cm';\nUPDATE bands SET sat_designator='S' WHERE lower(name) = '13cm';\nUPDATE bands SET sat_designator='S2' WHERE lower(name) = '9cm';\nUPDATE bands SET sat_designator='C' WHERE lower(name) = '6cm';\nUPDATE bands SET sat_designator='X' WHERE lower(name) = '3cm';\nUPDATE bands SET sat_designator='K' WHERE lower(name) = '1.25cm';\nUPDATE bands SET sat_designator='R' WHERE lower(name) = '6mm';\n"
  },
  {
    "path": "res/sql/migration_028.sql",
    "content": "DROP TABLE dxcc_prefixes;\n\nCREATE TABLE \"dxcc_prefixes\" (\n        \"prefix\"   TEXT NOT NULL,\n        \"exact\"    INTEGER,\n        \"dxcc\"     INTEGER,\n        \"cqz\"      INTEGER,\n        \"ituz\"     INTEGER,\n        \"cont\"     TEXT,\n        \"lat\"      REAL,\n        \"lon\"      REAL,\n        FOREIGN KEY(\"dxcc\") REFERENCES \"dxcc_entities\"(\"id\")\n);\n\nCREATE INDEX prefix_idx ON dxcc_prefixes(prefix);\nDELETE FROM dxcc_entities;\n"
  },
  {
    "path": "res/sql/migration_029.sql",
    "content": "ALTER TABLE ant_profiles ADD selected INTEGER;\nALTER TABLE cwkey_profiles ADD selected INTEGER;\nALTER TABLE cwshortcut_profiles ADD selected INTEGER;\nALTER TABLE rig_profiles ADD selected INTEGER;\nALTER TABLE rot_profiles ADD selected INTEGER;\nALTER TABLE rot_user_buttons_profiles ADD selected INTEGER;\nALTER TABLE station_profiles ADD selected INTEGER;\nALTER TABLE main_layout_profiles ADD selected INTEGER;\n\nCREATE INDEX IF NOT EXISTS contacts_pota_idx ON contacts (pota_ref);\nCREATE INDEX IF NOT EXISTS contacts_my_pota_idx ON contacts (my_pota_ref);\nCREATE INDEX IF NOT EXISTS contacts_sota_idx ON contacts (sota_ref);\nCREATE INDEX IF NOT EXISTS contacts_my_sota_idx ON contacts (my_sota_ref);\nCREATE INDEX IF NOT EXISTS contacts_wwff_ref_idx ON contacts (wwff_ref);\nCREATE INDEX IF NOT EXISTS contacts_my_wwff_ref_idx ON contacts (my_wwff_ref);\nCREATE INDEX IF NOT EXISTS contacts_iota_idx ON contacts (iota);\nCREATE INDEX IF NOT EXISTS contacts_sig_intl_idx ON contacts (sig_intl);\n\nDROP INDEX band_idx;\nCREATE INDEX IF NOT EXISTS contacts_band_idx ON contacts (band);\n\nDROP INDEX callsign_idx;\nCREATE INDEX IF NOT EXISTS contacts_callsign_idx ON contacts (callsign);\n\nDROP INDEX dxcc_idx;\nCREATE INDEX IF NOT EXISTS contacts_dxcc_idx ON contacts (dxcc);\n\nDROP INDEX mode_idx;\nCREATE INDEX IF NOT EXISTS contacts_mode_idx ON contacts (mode);\n\nDROP INDEX start_time_idx;\nCREATE INDEX IF NOT EXISTS contacts_start_time_idx ON contacts (start_time);\n\nDROP INDEX prefix_idx;\nCREATE INDEX IF NOT EXISTS dxcc_prefixes_prefix_idx ON dxcc_prefixes (prefix);\n\nALTER TABLE rig_profiles ADD ptt_type TEXT;\nALTER TABLE rig_profiles ADD ptt_port_pathname TEXT;\n\nUPDATE rig_profiles SET ptt_type = 'RIG' WHERE driver = 1;\n"
  },
  {
    "path": "res/sql/migration_030.sql",
    "content": "CREATE TABLE IF NOT EXISTS activity_profiles(\n        profile_name TEXT PRIMARY KEY,\n        config TEXT,\n        selected INTEGER\n);\n\nINSERT INTO activity_profiles\nSELECT profile_name, json_object(\n           'activityName', profile_name,\n           'profiles', json_array(\n               json_object(\n                   'profileType', 4,\n                   'name', profile_name\n               )\n           )\n       ) AS config,\n       selected\nFROM main_layout_profiles;\n\n\nALTER TABLE alert_rules ADD COLUMN ituz INTEGER;\nALTER TABLE alert_rules ADD COLUMN cqz INTEGER;\n\nALTER TABLE main_layout_profiles ADD tabsexpanded INTEGER DEFAULT 1;\n\nALTER TABLE station_profiles ADD county TEXT;\nALTER TABLE station_profiles ADD operator_callsign TEXT;\n"
  },
  {
    "path": "res/sql/migration_031.sql",
    "content": "INSERT INTO bands (name, start_freq, end_freq, enabled) VALUES\n('8m',40.0, 45.0, 0);\n"
  },
  {
    "path": "res/sql/migration_032.sql",
    "content": "UPDATE modes SET submodes = '[\"FMHELL\", \"FSKHELL\", \"FSKH105\", \"FSKH245\", \"HELL80\", \"HELLX5\", \"HELLX9\", \"HFSK\", \"PSKHELL\", \"SLOWHELL\"]' WHERE name = 'HELL';\n\nALTER TABLE contacts ADD cnty_alt TEXT;\nALTER TABLE contacts ADD dcl_qslrdate TEXT;\nALTER TABLE contacts ADD dcl_qslsdate TEXT;\nALTER TABLE contacts ADD dcl_qsl_rcvd TEXT NOT NULL DEFAULT 'N';\nALTER TABLE contacts ADD dcl_qsl_sent TEXT NOT NULL DEFAULT 'N';\nALTER TABLE contacts ADD morse_key_info TEXT;\nALTER TABLE contacts ADD morse_key_type TEXT;\nALTER TABLE contacts ADD my_cnty_alt TEXT;\nALTER TABLE contacts ADD my_darc_dok TEXT;\nALTER TABLE contacts ADD my_morse_key_info TEXT;\nALTER TABLE contacts ADD my_morse_key_type TEXT;\nALTER TABLE contacts ADD qrzcom_qso_download_date TEXT;\nALTER TABLE contacts ADD qrzcom_qso_download_status TEXT;\nALTER TABLE contacts ADD qslmsg_rcvd TEXT;\n\nALTER TABLE station_profiles ADD darc_dok TEXT;\n\nALTER TABLE alert_rules ADD pota INTEGER DEFAULT 0;\nALTER TABLE alert_rules ADD sota INTEGER DEFAULT 0;\nALTER TABLE alert_rules ADD iota INTEGER DEFAULT 0;\nALTER TABLE alert_rules ADD wwff INTEGER DEFAULT 0;\n"
  },
  {
    "path": "res/sql/migration_033.sql",
    "content": "ALTER TABLE main_layout_profiles ADD addlbandmaps TEXT;\n"
  },
  {
    "path": "res/sql/migration_034.sql",
    "content": "ALTER TABLE cwkey_profiles ADD paddle_swap INTEGER DEFAULT 0;\nALTER TABLE contacts_autovalue ADD wavelog_qso_upload_status TEXT REFERENCES adif_enum_qso_upload_status(\"value\");\nALTER TABLE contacts_autovalue ADD wavelog_qso_upload_date TEXT;\n"
  },
  {
    "path": "res/sql/migration_035.sql",
    "content": "INSERT INTO modes (name, submodes, rprt, dxcc, enabled) VALUES ('FSK', '[\"SCAMP_FAST\", \"SCAMP_SLOW\", \"SCAMP_VSLOW\"]', NULL, 'DIGITAL', 0);\nINSERT INTO modes (name, submodes, rprt, dxcc, enabled) VALUES ('MTONE', '[\"SCAMP_OO\", \"SCAMP_OO_SLW\"]', NULL, 'DIGITAL', 0);\n\nALTER TABLE contacts ADD eqsl_ag TEXT;\n\nDROP TABLE IF EXISTS DXCC_PREFIXES;\nDROP TABLE IF EXISTS DXCC_ENTITIES;\n\nCREATE TABLE IF NOT EXISTS dxcc_entities_ad1c (\n        id     INTEGER PRIMARY KEY,\n        name   TEXT NOT NULL,\n        prefix TEXT,\n        cont   TEXT,\n        cqz    INTEGER,\n        ituz   INTEGER,\n        lat    REAL,\n        lon    REAL,\n        tz     REAL\n);\n\nCREATE TABLE \"dxcc_prefixes_ad1c\" (\n        prefix   TEXT NOT NULL,\n        exact    INTEGER NOT NULL,\n        dxcc     INTEGER NOT NULL,\n        cqz      INTEGER,\n        ituz     INTEGER,\n        cont     TEXT,\n        lat      REAL,\n        lon      REAL\n);\n\nCREATE INDEX dxcc_prefixes_ad1c_idx ON dxcc_prefixes_ad1c (prefix, exact);\n\nCREATE TABLE IF NOT EXISTS dxcc_entities_clublog (\n        id      INTEGER PRIMARY KEY,\n        name    TEXT NOT NULL,\n        prefix  TEXT,\n        deleted INTEGER NOT NULL,\n        cont    TEXT,\n        cqz     INTEGER,\n        ituz    INTEGER,\n        lat     REAL,\n        lon     REAL,\n        start   TEXT,\n        \"end\"   TEXT\n);\n\nCREATE TABLE \"dxcc_prefixes_clublog\" (\n        prefix   TEXT NOT NULL,\n        exact    INTEGER NOT NULL,\n        dxcc     INTEGER NOT NULL,\n        cqz      INTEGER,\n        ituz     INTEGER,\n        cont     TEXT,\n        lat      REAL,\n        lon      REAL,\n        start    TEXT,\n        \"end\"    TEXT\n);\n\nCREATE INDEX dxcc_prefixes_clublog_idx on dxcc_prefixes_clublog (prefix, exact);\n\nCREATE TABLE \"dxcc_zone_exceptions_clublog\" (\n        record INTEGER PRIMARY KEY,\n        call   TEXT NOT NULL,\n        cqz    INTEGER NOT NULL,\n        start  TEXT,\n        \"end\"  TEXT\n);\n\nALTER TABLE rig_profiles ADD COLUMN rts TEXT;\nALTER TABLE rig_profiles ADD COLUMN dtr TEXT;\nALTER TABLE rig_profiles ADD civaddr INTEGER;\n"
  },
  {
    "path": "res/sql/migration_036.sql",
    "content": "ALTER TABLE rig_profiles ADD COLUMN share_rigctld INTEGER DEFAULT 0;\nALTER TABLE rig_profiles ADD COLUMN rigctld_port INTEGER DEFAULT 4532;\nALTER TABLE rig_profiles ADD COLUMN rigctld_path TEXT;\nALTER TABLE rig_profiles ADD COLUMN rigctld_args TEXT;\nALTER TABLE contacts_qsl_cards ADD COLUMN favorite INTEGER DEFAULT 0;\n\nALTER TABLE cwkey_profiles ADD paddle_only_sidetone INTEGER DEFAULT 0;\nALTER TABLE cwkey_profiles ADD sidetone_frequency INTEGER DEFAULT 800;\n\nINSERT INTO qso_filter_operators VALUES(7, \"regexp\");\n\nUPDATE log_param\n   SET value = REPLACE(value, '|FT8', '|FTx')\n WHERE name = 'dxc/filter/dx/moderegexp'\n   AND value LIKE '%|FT8%';\n\nUPDATE alert_rules\n   SET mode = REPLACE(mode, '|FT8', '|FTx')\n WHERE mode LIKE '%|FT8%';\n\nCREATE TABLE IF NOT EXISTS adif_enum_secondary_subdivision (\n    dxcc             INTEGER NOT NULL,\n    code             TEXT NOT NULL,\n    subdivision_name TEXT NOT NULL,\n    primary_code     TEXT,\n    aux              TEXT,\n    PRIMARY KEY (dxcc, code)\n);\n\nCREATE INDEX IF NOT EXISTS contacts_dxcc_upper_cnty_idx ON contacts(dxcc, upper(cnty)) WHERE cnty IS NOT NULL AND cnty != '';\n\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Haines','Haines','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Juneau','Juneau','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Ketchikan Gateway','Ketchikan Gateway','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Prince of Wales-Hyder','Prince of Wales-Hyder','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Sitka','Sitka','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Skagway','Skagway','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Yakutat','Yakutat','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Wrangell','Wrangell','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Hoonah-Angoon','Hoonah-Angoon','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Petersburg','Petersburg','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Wales-Hyder','Wales-Hyder','AK','Alaska First Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Denali','Denali','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Bethel','Bethel','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Fairbanks North Star','Fairbanks North Star','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Southeast Fairbanks','Southeast Fairbanks','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Saint Matthew Island','Saint Matthew Island','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Yukon-Koyukuk','Yukon-Koyukuk','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Fairbanks','Fairbanks','AK','Alaska Fourth Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Nome','Nome','AK','Alaska Second Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,North Slope','North Slope','AK','Alaska Second Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Northwest Arctic','Northwest Arctic','AK','Alaska Second Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Kusilvak','Kusilvak','AK','Alaska Second Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Aleutians East','Aleutians East','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Aleutians West','Aleutians West','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Lake and Peninsula','Lake and Peninsula','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Pribilof Islands','Pribilof Islands','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Anchorage','Anchorage','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Bristol Bay','Bristol Bay','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Dillingham','Dillingham','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Kenai Peninsula','Kenai Peninsula','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Kodiak Island','Kodiak Island','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Matanuska-Susitna','Matanuska-Susitna','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (6,'AK,Valdez-Cordova','Valdez-Cordova','AK','Alaska Third Judicial District');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-01','Zheleznodorozhny district of Barnaul','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-02','Industrial district of Barnaul','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-03','Leninsky district of Barnaul','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-04','Oktyabrsky district of Barnaul','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-05','Centalny District of Barnaul','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-08','Rubtsovsk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-09','Slavgorod','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-10','Yarovoye','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-11','Aleysky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-12','Altaisky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-13','Bayevsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-14','Biysky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-15','Blagoveshchensk Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-16','Burlinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-17','Bystroistoksky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-18','Volchihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-19','Egoryevsky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-20','Eltsovsky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-21','Zavyalovsky Area ','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-22','Zalesovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-23','Zarinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-24','Zmeinogorsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-25','Zonalnyj Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-26','Kalmansky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-27','Kamensky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-28','Klyuchevsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-29','Kosihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-30','Krasnogorsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-31','Krasnoshchekovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-32','Krutikhinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-33','Kulundinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-34','Kuryinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-35','Kytmanovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-36','Loktevsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-37','Mamontovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-38','Mihajlovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-39','Nemetsky National Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-40','Novichihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-41','Pavlovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-42','Pankrushihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-43','Pervomajsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-44','Petropavlovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-45','Pospelihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-46','Rebrihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-47','Rodinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-48','Romanovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-49','Rubtsovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-50','Slavgorodsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-51','Smolensky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-52','Sovietsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-53','Soloneshensky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-54','Soltonsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-55','Suyetsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-56','Tabunsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-57','Talmensky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-58','Togulsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-59','Topchihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-60','Tretyakovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-61','Troitsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-62','Tyumentsevsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-63','Uglovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-64','Ust-Kalmanskiy Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-65','Ust-Pristanskiy Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-66','Habarsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-67','Tselinny Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-68','Charyshsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-69','Shelabolihinsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-70','Shipunovsky Area','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-71','Alejsk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-72','Belokurikha','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-73','Biysk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-74','Gornjak','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-75','Zarinsk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-76','Zmeinogorsk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-77','Kamen-Na-Obi','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-78','Novoaltaisk','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AL-79','Zato Sibirsky','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-01','Blagoveshchensk','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-02','Belogorsk','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-03','Zeya','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-04','Raychikhinsk','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-05','Svobodnyj','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-06','Tynda','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-07','Shimanovsk','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-08','Arharinsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-09','Belogorsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-10','Blagoveshchensky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-11','Bureysky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-12','Zavitinsky Area / incl. Zavitinsk','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-13','Zeysky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-14','Ivanovsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-15','Konstantinovsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-16','Magdagachinsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-17','Mazanovsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-18','Mikhaylovsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-19','Oktyabrsky district','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-20','Romnensky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-21','Svobodnensky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-22','Selemdzhinsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-23','Seryshevsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-24','Skovorodinsky Area / incl. Skovorodino','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-25','Tambovsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-26','Tyndinsky Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-27','Shimanowski Area','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-28','Zato Tsiolkovsky','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'AM-29','Progress','AM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-01','Demsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-02','Kalininsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-03','Kirovsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-04','Leninsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-05','Oktyabrsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-06','Ordzhonikidzevsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-07','Sovetsky District of Ufa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-08','Agidel','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-17','Kumertau','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-19','Neftekamsk','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-20','Oktjabrsky','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-21','Salavat','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-22','Sibaj','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-23','Sterlitamak','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-27','Zato Mezhgore','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-28','Abzelilovsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-29','Alsheevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-30','Arkhangelsk Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-31','Askinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-32','Aurgazinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-33','Baymaksky Area / incl. Baymak','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-34','Bakalinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-35','Baltachevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-36','Belebeevsky Area / incl. Belebey','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-37','Belokatajsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-38','Beloretsky Area / incl. Beloreck','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-39','Bizhbulyaksky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-40','Birsky Area / incl. Birsk','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-41','Blagovarsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-42','Blagoveshchensk Area / incl. Blagoveshchensk','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-43','Buzdjaksky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-44','Buraevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-45','Burzjansky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-46','Gafurijsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-47','Davlekanovsky / incl. Davlekanovo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-48','Duvansky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-49','Dyurtyulinsky Area / incl. Dyurtyuli','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-50','Ermekeevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-51','Zianchurinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-52','Zilairsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-53','Iglinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-54','Ilishevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-55','Ishimbaysky Area / incl. Ishimbay','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-56','Kaltasinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-57','Karaidelsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-58','Karmaskalinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-59','Kiginsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-60','Krasnokamsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-61','Kugarchinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-62','Kuyurgazinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-63','Kushnarenkovsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-64','Meleuzovsky Area / incl. Meleuz','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-65','Mechetlinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-66','Mishkinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-67','Miyakinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-68','Nurimanovsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-69','Salavatsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-70','Sterlibashevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-71','Sterlitamaksky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-72','Tatyshlinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-73','Tuymazinsky Area / incl. Tuymazy','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-74','Ufimsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-75','Uchalinsky Area / incl. Uchaly','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-76','Fedorovsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-77','Haybullinsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-78','Chekmagushevsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-79','Chishminsky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-80','Sharansky Area','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BA-81','Yanaulsky Area / incl. Yanaul','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-01','Zheleznodorozhny districd of Ulan-Ude','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-02','Oktyabrsky district of Ulan-Ude','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-03','Sovetsky district of Ulan-Ude','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-04','Severobaykalsk','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-05','Barguzinsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-06','Bauntovsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-07','Bichursky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-08','Dzhidinsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-09','Eravninsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-10','Zaigrayevsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-11','Zakamensky Area / incl. Zakamensk','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-12','Ivolginsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-13','Kabansky Area / incl. Grandmother''s','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-14','Kizhinginsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-15','Kurumkansky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-16','Kyakhtinsky district / incl. Kyakhta','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-17','Muysky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-18','Okinsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-19','Pribaykalsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-20','Severo-Baikaljsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-21','Selenginsky Area / incl. Gusinoozersk','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-22','Tarbagatajsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-23','Tunkinsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-24','Horinsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'BU-25','Mukhorshibirsky Area','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-01','Kalininsky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-02','Kurchatovsky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-03','Leninsky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-04','Metallurgichesky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-05','Sovetsky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-06','Traktorozavodsky district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-07','Centralny district of Chelyabinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-08','Leninsky district of Magnitogorsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-09','Ordzhonikidzevsky district of Magnitogorsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-10','Pravoberezhny district of Magnitogorsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-12','Verhnij Ufalej','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-13','Emanzhelinsky Area / incl. Emanzhelinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-14','Zlatoust','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-15','Karabash','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-19','Kopeysk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-20','Korkinsky Area / incl. Korkino','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-21','Kyshtym','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-22','Miass','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-23','Plastovsky Area / incl. Plast','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-25','Troitsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-26','Ust-Katav','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-27','Tchebarkul','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-28','Yuzhnouralsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-29','Zato Snezhinsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-30','Zato Trehgorny','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-31','Zato Ozersk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-32','Agapovsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-33','Argajashsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-34','Ashinsky Area / incl. Asha, Minyar, Sim','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-35','Bredinsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-36','Varnensky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-37','Verkhneuralsky Area / incl. Verhneuralsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-38','Etkulsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-39','Kartalinsky Area / incl. Kartaly','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-40','Kaslinsky Area / incl. Kasli','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-41','Katav-Ivanovskiy Area / incl. Katav-Ivanovsk, Yuryuzan','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-42','Kizilsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-43','Krasnoarmeisky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-44','Kunashaksky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-45','Kusinsky Area / incl. Kusa','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-46','Nagajbaksky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-47','Nyazepetrovsky Area / incl. Nyazepetrovsk','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-48','Oktyabrsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-49','Satkinsky Area / incl. Satka, Bakal','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-50','Sosnovsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-51','Troitsk Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-52','Uvelsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-53','Uysky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-54','Chebarkulsky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-55','Chesmensky Area','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CB-56','Locomotivny','CB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-01','Anadyr','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-02','Anadyrsky Area','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-04','Bilibinsky Area / incl. Bilibino','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-05','Iultinsky Area','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-06','Providensky Area','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-07','Chaunsky Area / incl. Pevek','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'CK-08','Chukotsky Area','CK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-01','Birobidzhan','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-02','Birobidzhansky Area','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-03','Leninsky Area','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-04','Obluchensky Area / incl. Obluche','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-05','Oktyabrsky Area','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'EA-06','Smidovichsky Area','EA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-01','Gorno-Altaysk','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-02','Kosh-Agachskiy Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-03','Mayminsky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-04','Ongudaysky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-05','Turochaksky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-06','Ulagansky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-07','Ust-Kansky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-08','Ust-Koksinskiy Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-09','Chemalsky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-10','Choysky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'GA-11','Shebalinsky Area','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-01','Abakan','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-02','Sayanogorsk','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-03','Chernogorsk','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-04','Altaysky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-05','Askizsky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-06','Biysky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-07','Bogradsky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-08','Ordzhonikidzevsky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-09','Tashtypsky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-10','Ust-Abakanskiy Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-11','Shirinsky Area','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-12','Abaza','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HA-13','Sorsk','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-01','Zheleznodorozhny district of Khabarovsk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-02','Industrialny district of Khabarovsk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-03','Kirovsky district of Khabarovsk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-04','Krasnoflotsky district of Khabarovsk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-05','Centralny district of Khabarovsk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-06','Leninsky district of Komsomolsk-on-Amur','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-07','Centralny district of Komsomolsk-on-Amur','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-08','Amursk','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-09','Bikin','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-10','Nikolaevsk-na-Amure','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-11','Sovietskaya Gavan','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-12','Amursky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-13','Ayano-Mayskiy Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-14','Bikinsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-15','Vaninsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-16','Verhnebureinsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-17','Vyazemsky Area / incl. Vyazemsky','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-18','Komsomolsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-19','Lazo Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-20','Nanajsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-21','Nikolaevsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-22','Okhotsky Area / incl. Okhotck','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-23','Poliny Osipenko Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-24','Sovetsko-Havansky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-25','Solnechny Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-26','Tuguro-Chumikansky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-27','Ulchsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HK-28','Khabarovsky Area','HK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-01','Hanty-Mansijsk','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-02','Beloyarsky','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-03','Kogalym','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-04','Langepas','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-05','Megion','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-06','Nefteyugansk','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-07','Nizhnevartovsk','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-08','Nyagan','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-09','Pokachi','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-10','Pyt-Yakh','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-11','Raduzhny','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-12','Surgut','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-13','Uraj','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-14','Yugorsk','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-15','Beloyarsky Area / incl. Beloyarsk','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-16','Berezovsky Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-17','Kondinsky Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-18','Nefteyugansky Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-19','Nizhnevartovsk Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-20','Oktyabrsky Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-21','Sovetsky Area  / incl. Sovietsky','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-22','Surgutsky Area / incl. Lyantor','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'HM-23','Khanty-Mansijsky Area','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-01','Leninsky District of Irkutsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-02','Oktiabrsky District of Irkutsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-03','Pravoberezhny District of Irkutsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-04','Sverdlovsky District of Irkutsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-05','Padunsky District of Bratsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-06','Centralny District of Bratsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-09','Zima','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-11','Sayansk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-13','Tulun','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-14','Usolye-Sibirskoye','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-15','Ust-Ilimsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-17','Cheremhovo','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-19','Zalarinsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-20','Angarsky Area / incl. Angarsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-21','Balagansky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-22','Bodaybinsky Area / incl. Bodaibo','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-23','Bratsky Area / incl. Vihorevka','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-24','Zhigalovsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-25','Ziminsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-26','Irkutsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-27','Kazachinsko-Lensky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-28','Katangsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-29','Kachugsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-30','Kirensky Area / incl. Kirensk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-31','Kuytunsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-32','Mamsko-Chujsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-33','Nizhneilimsky Area / incl. Zheleznogorsk-Ilimskiy','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-34','Nizhneudinsk Area / incl. Nizhneudinsk, Alzamay','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-35','Olkhonsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-36','Slyudyansky Area / incl. Slyudyanka, Baikalsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-37','Tayshetsky Area / incl. Tayshet, Biryusinsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-38','Tulunsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-39','Usolsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-40','Ust-Ilimsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-41','Ust-Kutskiy Area / incl. Ust-Kut','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-42','Ust-Udinskiy Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-43','Cheremhovsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-44','Chunsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-45','Shelekhovsky Area / incl. Shelehov','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-46','Pravoberezhny District of Bratsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-47','Svirsk','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-48','Alarsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-49','Bayandayevsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-50','Bokhansky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-51','Nukutsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-52','Osinsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-53','Ehirit-Bulagatsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-54','Kirovsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'IR-55','Kujbyshevsky Area','IR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-01','Zavodskoj District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-02','Kirovsky District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-03','Leninsky District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-04','Rudnichny District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-05','Centralny District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-06','Zavodsky District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-07','Kuznetsky District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-08','Kuibyshevsky District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-09','Ordzhonikidzevsky District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-10','Centralny District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-11','Zenkovsky District of Prokopevsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-12','Rudnichny District of Prokopevsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-13','Centralny District of Prokopevsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-14','Anzhero-Sudzhensk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-15','Belovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-16','Berezovsky','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-17','Gur`evsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-18','Kaltan','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-19','Kiselevsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-20','Leninsk-Kuznetskiy','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-21','Krasnobrodsky Okrug','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-22','Mezhdurechensky District','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-23','Myski','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-24','Osinniki','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-25','Taiga','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-26','Tashtagol','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-27','Polysaevo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-28','Yurga','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-29','Belovsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-30','Guryevsky Area / incl. Gurevsk, Salair','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-31','Izhmorsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-32','Kemerovsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-33','Krapivinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-34','Leninsk-Kuznetsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-35','Mariinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-36','Mezhdurechensky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-37','Novokuznetsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-38','Prokopyevsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-39','Promyshlennovsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-40','Tashtagolsky Area / incl. G.Tashtagol','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-41','Tisulsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-42','Topkinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-43','Tjazhinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-44','Chebulinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-45','Yurginsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-46','Jajsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-47','Yashkinsky Area','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-48','Novoilyinsky District of Novokuznetsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-49','Lesnaja Polyana of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-50','Kedrovka and Promyshlennovsky District of Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-51','Yagunovskiy and Pioner District Kemerovo','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-52','Mariinsk','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KE-53','Topki','KE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-01','Zheleznodorozhny District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-02','Kirovsky District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-03','Leninsky District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-04','Oktyabrsky District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-05','Sverdlovsky District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-06','Sovetsky District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-07','Centralny District of Krasnoyarsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-08','Achinsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-09','Bogotol','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-10','Borodino','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-11','Divnogorsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-12','Yeniseisk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-15','Kansk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-16','Lesosibirsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-17','Minusinsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-18','Nazarovo','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-19','Sosnovoborsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-20','Sharypovo','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-21','Zato Zheleznogorsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-22','Zato Zelenogorsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-23','Abansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-24','Achinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-25','Balakhtinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-26','Berezovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-27','Biriljussky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-28','Bogotolsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-29','Boguchansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-30','Bolshemurtinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-31','Bolsheuluysky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-32','Dzerzhinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-33','Emelyanovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-34','Yeniseisky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-35','Yermakovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-36','Idrinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-37','Ilansky Area / incl. Ilanskiy','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-38','Irbeysky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-39','Kazachinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-40','Kansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-41','Karatuzsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-42','Kezhemsky Area / incl. Kodinskiy','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-43','Kozulsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-44','Krasnoturansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-45','Kuraginsky Area / incl. Artemivsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-46','Mansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-47','Minusinsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-48','Motyginsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-49','Nazarovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-50','Nizhneingashsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-51','Novoselovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-52','Partizansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-53','Pirovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-54','Rybinsky Area / incl. Zaozyorny','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-55','Sayansky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-56','Severo-Yeniseisky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-57','Suhobuzimsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-58','Taseevsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-59','Turukhansky Area / incl. Igarka','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-60','Tyukhtetsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-61','Uzhursky Area / incl. Uzhur','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-62','Uyarsky Area / incl. Uyar','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-63','Sharypovsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-64','Shushensky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-65','Tajmysky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-66','Norilsk','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-67','Evenkijsky Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-68','Zato Solnechny','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-69','Kedrovy','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-70','Kajerkan Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KK-71','Talnakh Area','KK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-01','Kurgan','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-02','Shadrinsk','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-03','Almenevsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-04','Belozersky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-05','Vargashinsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-06','Dalmatovsky Area / incl. Dalmatovo','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-07','Zverinogolovsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-08','Kargapol''Sky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-09','Kataysky Area / incl. Kataysk','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-10','Ketovsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-11','Kurtamyshsky Area / incl. Kurtamysh','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-12','Lebyazhyevsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-13','Makushinsky Area / incl. Makushino','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-14','Mishkinsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-15','Mokrousovsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-16','Petukhovsky Area / incl. Petuhovo','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-17','Polovinsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-18','Pritobolny Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-19','Safakulevsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-20','Tselinny Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-21','Chastoozersky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-22','Shatrovsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-23','Shumikhinsky Area / incl. Sensation','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-24','Shchuchansky Area / incl. Pike','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-25','Yurgamyshsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KN-26','Shadrinsky Area','KN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-01','Syktyvkar','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-02','Vorkuta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-03','Vuktylsky Area / incl. Vuktyl','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-04','Inta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-05','Pechorsky Area / incl. Pechora','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-06','Sosnogorsky Area / incl. Sosnogorsk and suburbs','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-07','Usinsk / incl. suburb','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-08','Ukhta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-09','Izhemsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-10','Knyazhpogostsky Area / incl. Emba','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-11','Kojgorodsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-12','Kortkerossky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-13','Priluzsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-14','Syktyvdinsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-15','Sysolsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-16','Troitsko-Pechorsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-17','Udorsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-18','Ust-Vymskiy Area / incl. Mikun','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-19','Ust-Kulomskiy Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-20','Ust-Tsilemskiy Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KO-21','Ezhvinsky Syktyvkar','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-01','Petropavlovsk-Kamchatsky','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-02','Elizovo','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-03','Zato Vilyuchinsk','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-04','Aleutsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-05','Bystrinsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-06','Elizovsky Area / incl. Elizovo','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-07','Milkovsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-08','Sobolevsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-09','Ust-Bolsheretskiy Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-10','Ust-Kamchatskiy Area / incl. Kljuchi','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-11','Karaginsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-12','Oljutorsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-13','Penzhinsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-14','Tigilsky Area','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'KT-15','Palana','KT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-01','Magadan','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-02','Olsky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-03','Omsukchansky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-04','Severo-Evensky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-05','Srednekansky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-06','Susuman Area / incl. Susuman','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-07','Tenkinsky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-08','Hasynsky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'MG-09','Yagodninsky Area','MG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-01','Dzerzhinsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-02','Zheleznodorozhny District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-03','Zayeltsovsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-04','Kalininsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-05','Kirovsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-06','Leninsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-07','Oktyabrsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-08','Pervomajsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-09','Sovetsky District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-10','Centralny District of Novosibirsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-11','Bagansky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-12','Barabinsk Area / incl. Barabinsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-13','Bolotninsky Area / incl. Bolotnoe','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-14','Vengerovsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-15','Dovolensky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-16','Zdvinsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-17','Iskitimsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-18','Karasuksky Area / incl. Karasuk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-19','Kargatsky Area / incl. Kargat','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-20','Kolyvansky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-21','Kochenevsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-22','Kochkovsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-23','Krasnozersky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-24','Kuibyshevsky Area / incl. Kuibyshev','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-25','Kupinsky Area Including Kupino','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-26','Kyshtovsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-27','Maslyaninsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-28','Moszkowski Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-29','Novosibirsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-30','Ordynsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-31','Severny Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-32','Suzunsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-33','Tatarsky Area / incl. Tatarsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-34','Toguchinsky Area / incl. Toguchin','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-35','Ubinsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-36','Ust-Tarkskiy Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-37','Chanovsky Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-38','Cherepanovsky Area / incl. Cherepanovo','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-39','Chistoozerny Area','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-40','Chulym Area / incl. Chulym','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-41','Barabinsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-42','Berdsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-43','Iskitim','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-44','Kujbyshev','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-45','Ob','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-46','Tatarsk','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'NS-47','Koltsovo','NS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-01','Dzerzhinsky District of Orenburg ','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-02','Leninsky District of Orenburg','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-03','Industrialny District of Orenburg','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-04','Centralny District of Orenburg','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-05','Leninsky District of Orsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-06','Oktyabrsky District of Orsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-07','Sovetsky District of Orsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-08','Abdulino','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-09','Buguruslan','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-10','Buzuluk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-11','Guy','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-12','Kuvandyk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-13','Mednogorsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-14','Novotroitsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-15','Sorochinsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-16','Yasny','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-17','Abdulinsky Area / incl. Abdulino','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-18','Adamovsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-19','Akbulaksky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-20','Aleksandrovsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-21','Asekeevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-22','Beljaevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-23','Buguruslansky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-24','Buzuluksky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-25','Gaysky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-26','Grachevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-27','Dombarovsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-28','Ileksky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-29','Kvarkensky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-30','Krasnogvardeisky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-31','Kuvandyksky Area / incl. Kuvandyk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-32','Kurmanayevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-33','Matveevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-34','Novoorsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-35','Novosergievsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-36','Oktyabrsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-37','Orenburgsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-38','Pervomajsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-39','Perevolotsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-40','Ponomarevsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-41','Sakmarsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-42','Saraktashsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-43','Svetlinsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-44','Severny Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-45','Sol-Iletskiy Area / incl. Sol-Iletsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-46','Sorochinsky City District','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-47','Tashlinsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-48','Totsky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-49','Tyulgansky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-50','Sharlyksky Area','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-51','Yasnensky Area / incl. Yasny','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-52','Sol`-Iletsk','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OB-53','Zato Komarovskiy','OB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-01','Kirovsky District of Omsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-02','Leninsky District of Omsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-03','Oktiabrsky District of Omsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-04','Sovetsky District of Omsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-05','Centralny District of Omsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-06','Isil`Kul`','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-07','Kalachinsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-08','Nazyvaevsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-09','Tara','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-10','Tyukalinsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-11','Azovsky Nemetsky National Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-12','Bol''Sherechensky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-13','Bolsheukovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-14','Gor''Kovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-15','Znamensky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-16','Isilkulsky Area / incl. Isilkul','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-17','Kalachinsky Area / incl. Kalachinsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-18','Kolosovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-19','Kormilovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-20','Krutinsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-21','Ljubinsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-22','Mar''Janovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-23','Moskalensky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-24','Muromtsevsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-25','Nazyvayevsky Area / incl. Nazyvaevsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-26','Nizhneomsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-27','Novovarshavsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-28','Odessky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-29','Okoneshnikovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-30','Omsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-31','Pavlogradsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-32','Poltavsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-33','Russko-Polyansky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-34','Sargatsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-35','Sedelnikovsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-36','Tavrichesky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-37','Tarsky Area / incl. Tara ','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-38','Tevrizsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-39','Tyukalinsky Area / incl. Tyukalinsk','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-40','Ust-Ishimskiy Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-41','Cherlaksky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'OM-42','Sherbakulsky Area','OM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-01','Leninsky District of Vladivostok','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-02','Pervomajsky District of Vladivostok','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-03','Pervorechensky District of Vladivostok','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-04','Sovetsky District of Vladivostok','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-05','Frunzensky District of Vladivostok','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-06','Arsenyev','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-07','Artem','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-08','Dalnegorsk','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-09','Dalnerechensk','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-10','Lesozavodsk','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-11','Nahodka','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-12','Partizansk','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-13','Spassk-Dalniy','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-14','Ussuriisk District','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-15','Bolshoy Kamen','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-16','Zato Fokino','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-17','Anuchinsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-18','Dalnerechensky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-19','Kavalerovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-20','Kirovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-21','Krasnoarmeisky District','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-22','Lazovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-24','Mikhaylovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-25','Nadezhdinsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-26','Oktyabrsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-27','Olginsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-28','Partizansky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-29','Pogranichny Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-30','Pozharsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-31','Spassky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-32','Terneysky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-34','Hankaysky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-35','Hasansky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-36','Horolsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-37','Chernigovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-38','Chuguyevsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-39','Shkotovsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PK-40','Yakovlevsky Area','PK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-01','Dzerzhinsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-02','Industrialny District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-03','Kirovsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-04','Leninsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-05','Motovilikhinsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-06','Ordzhonikidzevsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-07','Sverdlovsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-08','Aleksandrovsky Area / incl. Aleksandrovsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-09','Berezniki','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-10','Gremyachinsky Area / incl. Gremyachinsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-11','Gubakhinsky Area / incl. Gubakha','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-13','Kizelovsky Area / incl. Kizel','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-14','Krasnokamsky Area / incl. Krasnokamsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-15','Kungur','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-17','Solikamsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-20','Bardymsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-21','Berezovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-22','Bolshesosnovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-23','Vereshchaginsky Area / incl. Vereshchagino','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-24','Gornozavodsky Area / incl. Gornozavodsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-25','Elovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-26','Ilyinsky Area / incl. Chermoz','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-27','Karagaysky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-28','Kishertsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-29','Krasnovishersky District / incl. Krasnovishersk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-30','Kuedinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-31','Kungursky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-32','Lysvensky Area / incl. Lysva','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-33','Nytvensky Area / incl. Nytva','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-34','Oktyabrsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-35','Ordinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-36','Osinsky Area / incl. Osa','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-37','Ohansky Area Including Ohansk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-38','Ochersky Area Including Ocher','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-39','Permsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-40','Sivinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-41','Solikamsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-42','Suksunsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-43','Uinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-44','Usolsky Area / incl. Usolye','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-45','Chastinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-46','Cherdynsky Area / incl. Cherdyn','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-47','Chernushinsky Area / incl. Chernushka','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-48','Chusovskoy Area / incl. Chusovoy','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-49','Tchaikovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-50','Dobryansky Area / incl. Dobryanka','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-51','Zato Zvezdny ','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-52','Kudymkar','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-53','Gaynsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-54','Kosinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-55','Kochevsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-56','Kudymkarsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-57','Yurlinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'PM-58','Yusvinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-01','Yuzhno-Sakhalinsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-10','Aleksandrovsk-Sahalinskiy Area / incl. Aleksandrov-Sahalinskiy','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-11','Anivsky Area / incl. Aniva','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-12','Dolinsky Area / incl. Dolinsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-13','Korsakovsky Area / incl. Korsakov','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-14','Kurilsky Area / incl. Kurilsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-15','Makarovsky Area / incl. Makarov ','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-16','Nevelsky Area / incl. Nevelsk, Gornozavodsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-17','Nogliksky Area','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-18','Okhinsky Area / incl. Okha','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-19','Poronaysky Area / incl. Poronaysk, Vahrushev','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-20','Severo-Kurilsky Area / incl. Severo-Kurilsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-21','Tomarinsky Area / incl. Tomari, Krasnogorsk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-22','Tymovsky Area','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-23','Uglegorsk Area / incl. Uglegorsk, Shahtersk','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-24','Holmsky Area / incl. Kholmsk, Chekhov','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-25','Juzhno-Kurilsky Area','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SL-26','Smirnykhovsky Area','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-01','Verkh-Isetsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-02','Zheleznodorozhny District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-03','Kirovsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-04','Leninsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-05','Oktyabrsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-06','Ordzhonikidzevsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-07','Chkalovsky District of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-08','Krasnogorsk District of Kamensk-Uralsky','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-09','Sinarsky District of Kamensk-Uralsky','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-10','Dzerzhinsky District of Nizhni Tagil','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-11','Leninsky District of Nizhni Tagil','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-12','Tagilstroyevsky District of Nizhni Tagil','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-13','City of Alapaevsk','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-14','Artemovsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-15','Asbestovsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-16','Berezovsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-17','Bogdanovich City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-18','Verhnaya Pyshma City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-19','Verkhnesaldinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-20','City District Zarechny','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-21','Ivdel City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-22','City of Irbit','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-23','Kamyshlovsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-24','Karpinsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-25','Kachkanar City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-26','Kirovgrad City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-27','Krasnoturyinsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-28','Krasnouralsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-29','Kushva City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-30','Nevyansk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-31','Nizhnyaya Salda City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-32','Nizhnyaya Tura City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-33','Pervouralsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-34','Polevskoy City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-35','Revda City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-36','Rezhevsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-37','Severouralsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-38','Serov City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-39','Suhoj Log City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-40','Tavdinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-41','Zato Lesnoj','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-42','Novouralsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-43','Alapaevsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-45','Artinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-46','Achitsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-47','Bajkalovsky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-48','Beloyarsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-51','Verkhotursky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-52','Garinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-53','Irbitsky Education','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-54','Kamensk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-55','Kamyshlovsky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-56','Krasnoufimsky District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-58','Nizhneserginsky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-60','Gornouralsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-61','Pyshminsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-63','Servosky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-64','Slobodo-Turinsky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-66','Sysertsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-67','Taborinsky Area','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-69','Talitsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-70','Tugulymsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-71','Turinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-72','Shalinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-74','Krasnoufimsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-76','Novaya Lyalya City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-77','Zato Svobodny','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-78','Zato Ural`Sky','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-79','Aramilsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-80','Bisertsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-81','Verhnee Dubrovo City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-82','Verh-Neyvinskiy City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-83','Verhny Tagil City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-84','Verhnyaya Tura City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-85','Volchansky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-86','Degtyarsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-87','Malyshevsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-88','Makhnevsky Municipality','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-89','Pelym City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-90','Reftinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-91','Sosvinsky City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-92','Sredneuralsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-93','Staroutkinsk City District','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'SV-94','Academic District Of Ekaterinburg','SV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-01','Kalininsky District of Tyumen','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-02','Leninsky District of Tyumen','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-03','Centralny District of Tyumen','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-04','Zavodoukovsky City District','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-05','Ishim','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-06','Tobolsk','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-07','Yalutorovsk','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-08','Abatsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-09','Armizonsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-10','Aromashevsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-11','Berdjuzhsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-12','Vagaysky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-13','Vikulovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-14','Golyshmanovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-15','Zavodoukovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-16','Isetsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-17','Ishimsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-18','Kazansky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-19','Nizhnetavdinsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-20','Omutinsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-21','Sladkovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-22','Sorokinsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-23','Tobolsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-24','Tyumensky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-25','Uvatsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-26','Uporovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-27','Yurginsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-28','Yalutorovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-29','Yarkovsky Area','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TN-30','East District of Tyumen','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-01','Kirovsky District of Tomsk','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-02','Leninsky District of Tomsk','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-03','Oktyabrsky District of Tomsk','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-04','Sovetsky District of Tomsk','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-07','Kedrovy','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-08','Strezhevoj','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-09','Seversk','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-10','Aleksandrovsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-11','Asinovsky Area / incl. Asino','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-12','Bakcharsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-13','Verhneketsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-14','Zyrjansky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-15','Kargasoksky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-16','Kozhevnikovsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-17','Kolpashevsky Area / incl. Kolpashevo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-18','Krivosheinsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-19','Molchanovsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-20','Parabel''Sky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-21','Pervomajsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-22','Tegul''Detsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-23','Tomsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-24','Chainsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TO-25','Shegarsky Area','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-01','Kyzyl','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-02','Ak-Dovurak','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-03','Bay-Tayginskiy Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-04','Barun-Hemchiksky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-05','Dzun-Hemchiksky Kozhuun / incl. Chadan','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-06','Kaa-Hemsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-07','Kyzylsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-08','Mongun-Tayginsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-09','Ovyursky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-10','Piy-Hemskiy Kozhuun / incl. Turan','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-11','Sut-Holskiy Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-12','Tandinsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-13','Tes-Hemsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-14','Todzhinsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-15','Ulug-Hemsky Area Including Shagonar','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-16','Ulug- Hemsky Kozhuun / incl. Shagonar','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-17','Chedi- Holsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-18','Erzinsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'TU-19','Tere - Holsky Kozhuun','TU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-01','Yakutsk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-06','Abyjsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-07','Aldansky Area / incl. Aldan, Tommot','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-08','Allaihovsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-09','Amginsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-10','Anabarsky National Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-11','Bulunsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-12','Verhneviljujsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-13','Verhnekolymsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-14','Verkhoyansky Area / incl. Verkhoyansk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-15','Vilyuysky Area / incl. Vilyuysk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-16','Gorny Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-17','Zhigansky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-18','Kobyaysky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-19','Lensky Area / incl. Lensk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-20','Megino-Kangalassky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-21','Mirninsky Area / incl. Mirny, Udachny','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-22','Momsky National Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-23','Namsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-24','Nizhnekolymsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-25','Nyurbinsky Area / incl. Nyurba','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-26','Ojmjakonsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-27','Olekminsky Area / incl. Olekminsk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-28','Oleneksky National Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-29','Srednekolymsky Area / incl. Srednekolymsk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-30','Suntarsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-31','Tattinsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-32','Tomponsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-33','Ust''-Aldansky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-34','Ust''-Majsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-35','Ust''-Jansky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-36','Hangalassky Area / incl. Pokrovsk','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-37','Churapchinsky Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-38','Eveno-Bytantajsky National Area','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-39','Neryungrinsky Area / incl. Neryungri','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YA-40','Zhataj','YA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-01','Salekhard','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-02','Gubkinsky','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-03','Labytnangi','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-04','Muravlenko','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-05','Nadym','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-06','Novyj Urengoy','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-07','Noyabrsk','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-08','Krasnoselkupsky Area','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-09','Nadymsky Area / incl. Nadym ','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-10','Priural''Sky Area','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-11','Purovsky Area','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-12','Tazovsky District','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-13','Shuryshkarsky Area','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'YN-14','Yamalsky Area','YN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-01','Zheleznodorozhny District of Chita','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-02','Ingodinsky District of Chita','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-03','Centralny District of Chita','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-04','Chernovsky District of Chita','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-05','Balej','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-06','Borzja','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-07','Krasnokamensk','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-08','Petrovsk-Zabajkalsky','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-09','Akshinsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-10','Aleksandrovo-Zavodsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-11','Balejsky Area / incl. Baley','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-12','Borzinsky Area / incl. Borzya','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-13','Gazimuro-Zavodsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-14','Transbaikalsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-15','Kalarsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-16','Kalgansky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-17','Karymsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-18','Krasnokamensky Area / incl. Krasnokamensk','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-19','Krasnochikoysky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-20','Kyrinsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-21','Mogochinsky Area / incl. Mogocha','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-22','Nerchinsky Area / incl. Nerchinsk ','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-23','Nerchinsko-Zavodsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-24','Olovyanninsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-25','Ononsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-26','Petrovsk-Zabaykalsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-27','Priargunsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-28','Sretensky Area / incl. Sretensk','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-29','Tungiro-Olekminsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-30','Uletovsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-31','Hiloksky Area / incl. Hilok','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-32','Chernyshevsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-33','Chitinsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-34','Shelopuginsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-35','Shilkinsky Area / incl. Shilka','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-36','Tungokochensky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-37','Aginsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-38','Duldurginsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-39','Mogojtujsky Area','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-40','Aginskoe','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (15,'ZK-41','Zato Poselok Gorny','ZK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07001','Alaró','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07002','Alaior','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07003','Alcúdia','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07004','Algaida','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07005','Andratx','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07006','Artà','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07007','Banyalbufar','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07008','Binissalem','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07009','Búger','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07010','Bunyola','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07011','Calvià','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07012','Campanet','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07013','Campos','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07014','Capdepera','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07015','Ciutadella de Menorca','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07016','Consell','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07017','Costitx','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07018','Deiá','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07019','Escorca','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07020','Esporles','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07021','Estellencs','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07022','Felanitx','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07023','Ferreries','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07024','Formentera','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07025','Fornalutx','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07026','Eivissa','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07027','Inca','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07028','Lloret de Vistalegre','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07029','Lloseta','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07030','Llubí','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07031','Llucmajor','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07032','Maó-Mahón','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07033','Manacor','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07034','Mancor de la Vall','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07035','Maria de la Salut','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07036','Marratxí','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07037','Mercadal (Es)','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07038','Montuïri','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07039','Muro','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07040','Palma','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07041','Petra','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07042','Pollença','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07043','Porreres','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07044','Pobla (Sa)','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07045','Puigpunyent','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07046','Sant Antoni de Portmany','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07047','Sencelles','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07048','Sant Josep de sa Talaia','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07049','Sant Joan','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07050','Sant Joan de Labritja','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07051','Sant Llorenç des Cardassar','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07052','Sant Lluís','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07053','Santa Eugènia','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07054','Santa Eulària des Riu','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07055','Santa Margalida','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07056','Santa María del Camí','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07057','Santanyí','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07058','Selva','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07059','Salines (Ses)','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07060','Sineu','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07061','Sóller','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07062','Son Servera','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07063','Valldemossa','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07064','Castell (Es)','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07065','Vilafranca de Bonany','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07901','Ariany','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (21,'07902','Migjorn Gran (Es)','IB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35001','Agaete','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35002','Agüimes','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35003','Antigua','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35004','Arrecife','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35005','Artenara','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35006','Arucas','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35007','Betancuria','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35008','Firgas','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35009','Gáldar','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35010','Haría','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35011','Ingenio','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35012','Mogán','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35013','Moya','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35014','Oliva (La)','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35015','Pájara','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35016','Palmas de Gran Canaria (Las)','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35017','Puerto del Rosario','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35018','San Bartolomé','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35019','San Bartolomé de Tirajana','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35020','Aldea de San Nicolás (La)','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35021','Santa Brígida','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35022','Santa Lucía de Tirajana','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35023','Santa María de Guía de Gran Canaria','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35024','Teguise','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35025','Tejeda','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35026','Telde','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35027','Teror','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35028','Tías','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35029','Tinajo','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35030','Tuineje','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35031','Valsequillo de Gran Canaria','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35032','Valleseco','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35033','Vega de San Mateo','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'35034','Yaiza','GC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38001','Adeje','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38002','Agulo','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38003','Alajeró','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38004','Arafo','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38005','Arico','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38006','Arona','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38007','Barlovento','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38008','Breña Alta','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38009','Breña Baja','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38010','Buenavista del Norte','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38011','Candelaria','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38012','Fasnia','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38013','Frontera','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38014','Fuencaliente de la Palma','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38015','Garachico','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38016','Garafía','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38017','Granadilla de Abona','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38018','Guancha (La)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38019','Guía de Isora','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38020','Güímar','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38021','Hermigua','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38022','Icod de los Vinos','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38023','San Cristóbal de La Laguna','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38024','Llanos de Aridane (Los)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38025','Matanza de Acentejo (La)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38026','Orotava (La)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38027','Paso (El)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38028','Puerto de la Cruz','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38029','Puntagorda','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38030','Puntallana','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38031','Realejos (Los)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38032','Rosario (El)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38033','San Andrés y Sauces','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38034','San Juan de la Rambla','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38035','San Miguel de Abona','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38036','San Sebastián de la Gomera','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38037','Santa Cruz de la Palma','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38038','Santa Cruz de Tenerife','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38039','Santa Úrsula','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38040','Santiago del Teide','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38041','Sauzal (El)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38042','Silos (Los)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38043','Tacoronte','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38044','Tanque (El)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38045','Tazacorte','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38046','Tegueste','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38047','Tijarafe','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38048','Valverde','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38049','Valle Gran Rey','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38050','Vallehermoso','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38051','Victoria de Acentejo (La)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38052','Vilaflor de Chasna','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38053','Villa de Mazo','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (29,'38901','Pinar de El Hierro (El)','TF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (32,'51001','Ceuta','CE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (32,'52001','Melilla','ML','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-01','Maikop','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-02','Adygeysk','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-03','Giaginsky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-04','Koshekhablsky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-05','Krasnogvardeisky district','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-06','Maikopsky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-07','Takhtamukaysky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-08','Teuchezhsky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AD-09','Shovgenovsky Area','AD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-01','Kirovsky district of Astrakhan','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-02','Leninsky district of Astrakhan','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-03','Sovetsky district of Astrakhan','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-04','Trusovsky district of Astrakhan','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-06','Zato Znamensk','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-07','Akhtubinsky Area / incl. Akhtubinsk','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-08','Volodarsky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-09','Enotayevsky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-10','Ikryaninsky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-11','Kamyzyaksky Area / incl. Kamyzyak','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-12','Krasnoyarsk Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-13','Limansky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-14','Narimanovsky Area / incl. Narimanov','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-15','Privolzhsky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-16','Harabalinsky Area / incl. Harabali','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AO-17','Chernoyarsky Area','AO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-01','Isakogorsky district of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-02','Lomonosov District of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-03','Oktiabrsky District of Arkhangels','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-04','Solombalsky District of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-05','Koryazhma','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-06','Kotlas','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-07','Novodvinsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-08','Onega','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-09','Severodvinsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-10','Zato Mirny','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-11','Velsky Area / incl. Velsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-12','Verhnetoemsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-13','Vilegodsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-14','Vinogradovsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-15','Kargopolsky Area / incl. Kargopol','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-16','Konoshsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-17','Kotlassky Area / incl. Solvychegodsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-18','Krasnoborsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-19','Lensky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-20','Leshukonsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-21','Mezensky Area / incl. Mezen','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-22','Nyandomsky Area / incl. Nyandoma','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-23','Onezhsky Area / incl. Onega','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-24','Pinezhsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-25','Plesetsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-26','Primorsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-27','Solovetsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-28','Ustyansky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-29','Holmogorsky Area','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-30','Shenkursky Area / incl. Shenkursk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-31','Novaya Zemlya','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-32','Franz Joseph Land','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-33','Varavino-Factoriya District of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-34','Maymaksansky District of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-35','Majskaya Gorka District of Arkhangelsk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-36','Severny District of Arkhangelsk ','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'AR-37','Tsiglomensky District of Arkhangelsk ','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-01','Vostochny District of Belgorod','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-02','Zapadny District of Belgorod','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-05','Gubkinsky District','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-06','Stary Oskol District','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-08','Alexeyevsky District / incl. Alekseyevka','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-09','Belgorodsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-10','Borisovsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-11','Valuysky Area / incl. Valuyki','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-12','Veydelevsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-13','Volokonovsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-14','Grayvoronsky Area / incl. Grayvoron','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-16','Ivnyansky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-17','Korochansky Area / incl. Korocha','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-18','Krasnensky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-19','Krasnogvardeisky District','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-20','Krasnoyaruzhsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-21','Novooskolsky Area / incl. New Oskol','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-22','Prohorov''s Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-23','Rakityansky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-24','Rovensky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-26','Chernyansky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-27','Shebekinsky Area / incl. Shebekino','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-28','Yakovlevsky Area','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-29','Alekseevka','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-30','Valuiki','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-31','Gubkin','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BO-32','Stary Oskol','BO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-01','Bezhitsky District of Bryansk','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-02','Volodarsky District of Bryansk','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-03','Sovetsky District of Bryansk','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-04','Fokinsky District of Bryansk','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-06','Klintsy','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-07','Novozybkov','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-08','Seltso','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-09','Brasovsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-10','Bryansky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-11','Vygonichsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-12','Gordeevsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-13','Dubrovsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-14','Dyatkovsky Area / incl. Dyatkovo','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-15','Zhiryatinsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-16','Zhukovsky Area / incl. Zhukovka','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-17','Zlynkovsky Area / incl. Zlynka','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-18','Karachevsky Area / incl. Karachev','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-19','Kletnyansky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-20','Klimovsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-21','Klintsovsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-22','Komarichsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-23','Krasnogorsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-24','Mglinsky Area / incl. Mglin','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-25','Navlinsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-26','Novozybkovsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-27','Pogarsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-28','Pochepsky Area / incl. Pochep','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-29','Rognedinsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-30','Sevsky Area / incl. Cebck','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-31','Starodubsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-32','Suzemsky Area','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-33','Surazhsky Area / incl. Surazh','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-34','Trubchevsky Area / incl. Trubchevsk','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-35','Unechsky Area / incl. Unecha','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-36','Starodub','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'BR-37','Fokino','BR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-01','Zavodskoy district of Grozny','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-02','Leninsky district of Grozny','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-03','Oktyabrsky district of Grozny','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-04','Staropromyslovsky Area of Grozny','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-06','Argun','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-07','Gudermes','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-10','Sunzhensky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-11','Achhoy-Martanovskiy Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-12','Vedensky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-13','Groznensky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-14','Gudermessky Area / incl. Gudermes','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-15','Itum-Kalinskiy Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-16','Kurchaloyevsky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-17','Nadterechny Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-18','Naursky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-19','Nozhay-Yurtovskiy Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-20','Urus-Martanovskiy Area / incl. Urus-Martan','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-21','Shatoysky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-22','Shalinsky Area / incl. Shawls','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-23','Sharoysky Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CN-24','Shchelkovskoj Area','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-01','Kalininsky district Cheboksary','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-02','Leninsky district Cheboksary','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-03','Moskovsky district Cheboksary','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-04','Alatyr','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-05','Kanash','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-06','Novocheboksarsk','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-07','Shumerlya','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-08','Alatyrsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-09','Alikovsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-10','Batyrevsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-11','Vurnarsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-12','Ibresinsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-13','Kanashsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-14','Kozlowski Area / incl. Kozlovka','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-15','Komsomolsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-16','Krasnoarmeisky district','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-17','Krasnochetaysky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-18','Mariinsko-Posadsky Area / incl. Mariinsky Posad','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-19','Morgaushsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-20','Poretsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-21','Urmarsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-22','Tsivilsky Area / incl. Tsivilsk','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-23','Cheboksary Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-24','Shemurshinsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-25','Shumerlinsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-26','Yadrinsky Area / incl. Yadrin','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-27','Yalchiksky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'CU-28','Yantikovsky Area','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-01','Kirovsky district of Makhachkala','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-02','Leninsky district of Makhachkala','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-03','Sovetsky district of Makhachkala','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-04','Buinaksk','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-05','Dagestanskie Ogni','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-06','Derbent','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-07','Izberbash','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-08','Kaspiysk','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-09','Kizilyurt','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-10','Kizlyar','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-11','Khasavyurt','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-12','Juzhno-Suhokumsk','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-13','Agulsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-14','Akushinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-15','Akhvakhsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-16','Akhtynsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-17','Babayurtovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-18','Botlikhsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-19','Buinaksky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-20','Gergebilsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-21','Gumbetovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-22','Gunibsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-23','Dakhadayevsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-24','Derbentsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-25','Dokuzparinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-26','Kazbekovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-27','Kaitagsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-28','Kayakentsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-29','Kizilyurtovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-30','Kizlyarsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-31','Kulinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-32','Kurakhsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-33','Laksky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-34','Levashinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-35','Karabudahkentsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-36','Kumtorkalinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-37','Magaramkentsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-38','Novolaksky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-39','Nogaisky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-40','Rutulsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-41','Sergokalinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-42','Soulieyman-Stalsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-43','Tabasaransky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-44','Tarumovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-45','Tlyaratinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-46','Untsukulsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-47','Khasavyurtovsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-48','Hivsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-49','Hunzahsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-50','Tsumadinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-51','Tsuntinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-52','Charodinsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'DA-53','Shamilsky Area','DA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-01','Magas','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-02','Karabulak','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-03','Nazran','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-04','Malgobek','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-05','Dzhayrakhsky Area','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-06','Malgobeksky Area','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-07','Nazransky Area ','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-08','Sunzhensky Area','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-09','Sunzha','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-10','Altievsky District of the City of Nazran','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-11','Gamurzievsky District of the City of Nazran','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-12','Nasyr-Kortsky District of the City of Nazran','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IN-13','Central District of the City of Nazran','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-01','Leninsky District of Ivanovo','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-02','Oktyabrsky District of Ivanovo','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-03','Sovetsky District of Ivanovo','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-04','Frunzensky District of Ivanovo','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-05','Vichuga','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-06','Kineshma','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-07','Teykovo','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-10','Verhnelandehovsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-11','Vichugsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-12','Gavrilovo-Posadskiy Area / incl. Gavrilov Posad','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-13','Zavolzhye Area / incl. Zavolzhsk','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-14','Ivanovsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-15','Ilyinsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-16','Kineshma Area / incl. Navoloki','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-17','Komsomolsky / incl. Komsomolsk','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-18','Lezhnevsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-19','Lukhsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-20','Palehsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-21','Pestyakovsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-22','Privolzhsky Area / incl. Ples, Privolzhsk','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-23','Puchezhsky Area / incl. Puchezh','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-24','Rodnikovsky Area / incl. Rodniki','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-25','Savinsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-26','Teykovsky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-27','Furmanovsky Area / incl. Furmanov ','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-28','Shuysky Area','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-29','Yuzhskiy Area / incl. Yuzha','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-30','Yuryevetsky Area / incl. Yuryevets','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'IV-31','Kohma','IV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-01','Nalchik','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-02','Baksansky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-03','Zolsky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-04','Majsky Area / incl. Majsky','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-05','Prohladnensky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-06','Tersky Area / incl. Terek','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-07','Urvansky Area / incl. Nartkala','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-08','Chegemsky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-09','Chereksky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-10','Elbrussky Area / incl. Tyrnyauz','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-11','Leskemsky Area','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-12','Baksan','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KB-13','Prokhladny','KB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-01','Cherkessk','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-02','Karachaevsk / incl. Teberda','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-03','Adyge-Hablskiy Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-04','Zelenchuksky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-05','Karachaevsky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-06','Malokarachaevsky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-07','Prikubansky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-08','Urupsky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-09','Ust-Dzhegutinskiy Area / incl. Ust-Dzheguta','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-10','Habezsky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-11','Abazinsky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KC-12','Nogaisky Area','KC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-01','Leninsky District of Kaluga','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-02','Moskovsky District of Kaluga','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-03','Oktyabrsky District of Kaluga','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-05','Lyudinovo','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-06','Obninsk','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-07','Babyninsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-08','Barjatinsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-09','Borovsky Area / incl. Borovsk','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-10','Dzerzhinsky District / incl. Kondrovo','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-11','Duminichsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-12','Zhizdrinsky Area / incl. Zhizdra','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-13','Zhukovsky Area / incl. Bugs','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-14','Iznoskovsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-15','City of Kirov and Kirovsky District','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-16','Kozelsky Area / incl. Kozelsk, Sosenskiy','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-17','Kuibyshevsky District','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-18','Lyudinovsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-19','Maloyaroslavetsky Area / incl. Maloyaroslavets','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-20','Medynsky Area / incl. Medyn','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-21','Meshchovsky Area / incl. Meshchovsk','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-22','Mosalsky Area / incl. Mosalsk','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-23','Peremyshlsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-24','Spas-Demenskiy Area / incl. Spas-Demensk','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-25','Sukhinichsky Area / incl. Suhinichi','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-26','Tarussky Area / incl. Tarusa','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-27','Ulyanovsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-28','Ferzikovsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-29','Hvastovichsky Area','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-30','Yukhnovsky Area / incl. Yuhnov','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KG-31','Balabanovo','KG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-01','Leninsky District of Kirov','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-02','Novovjatsky District of Kirov','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-03','Oktyabrsky District of Kirov','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-04','Pervomajsky District of Kirov','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-05','Vjatskie Polyany','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-06','Kirovo-Chepetsk','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-07','Kotelnich','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-08','Slobodskoj','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-09','Arbazhsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-10','Afanasyevsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-11','Belokholunitsky Area / incl. Belaja Kholunitsa','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-12','Bogorodsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-13','Verkhnekamsky Area / incl. Kirs','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-14','Verhoshizhemsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-15','Vyatskopolyansky Area / incl. Sosnovka','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-16','Darovsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-17','Zuyevsky Area / incl. Zuevka','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-18','Kiknursky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-19','Kilmezsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-20','Kirovo-Chepetsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-21','Kotelnichsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-22','Kumensky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-23','Lebjazhsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-24','Luzsky Area / incl. Luza','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-25','Malmyzhsky Area / incl. Malmyzh','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-26','Murashinsky Area / incl. Murashi','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-27','Nagorsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-28','Nemsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-29','Nolinsky Area / incl. Nolinsk','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-30','Omutninsky Area / incl. Omutninsk','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-31','Oparinsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-32','Orichevsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-33','Orlovsky Area / incl. Orlov','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-34','Pizhansky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-35','Podosinovsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-36','Sanchursky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-37','Svechinsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-38','Slobodskoj Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-39','Sovetsky Area  / incl. Sovetsk','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-40','Sunsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-41','Tuzhinsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-42','Uninsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-43','Urzhumsky Area / incl. Urzhum','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-44','Falensky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-45','Shabalinsky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-46','Yuryansky Area','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-47','Yaransky Area / incl. Yaransk','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KI-48','Zato Pervomajsky','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-01','Petrozavodsk','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-04','Kostomuksha','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-07','Sortavalsky Area / incl. Sortavala','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-08','Belomorsky Area / incl. Belomorsk','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-10','Kalevalsky National Area','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-11','Kemsky Area / incl. Kem','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-12','Kondopozhsky Area / incl. Kondopoga','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-13','Lakhdenpokhsky Area / incl. Lahdenpohya','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-14','Louhsky Area','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-15','Medvezhyegorsky Area / incl. Medvezhyegorsk','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-16','Muyezersky Area','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-17','Olonetsky Area / incl. Olonets','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-18','Pitkyarantsky Area / incl. Pitkyaranta','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-19','Prionezhsky Area','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-20','Pryazhinsky Area','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-21','Pudozhsky Area / incl. Pudozh','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-22','Segezhsky Area / incl. Segezha','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KL-23','Suoyarvsky Area / incl. Suoyarvi','KL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-01','Elista','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-02','Gorodovikovsky Area / incl. Gorodovikovsk','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-03','Iki-Burulskiy Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-04','Ketchenerovsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-05','Lagansky Area / incl. Lagan','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-06','Maloderbetovsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-07','Oktyabrsky District','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-08','Priyutnensky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-09','Sarpinsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-10','Tselinny Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-11','Chernozemelsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-12','Yustinsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-13','Yashaltinsky Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KM-14','YashkulskY Area','KM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-01','Syktyvkar','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-02','Vorkuta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-03','Vuktylsky Area / incl. Vuktyl','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-04','Inta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-05','Pechorsky Area / incl. Pechora','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-06','Sosnogorsky Area / incl. Sosnogorsk and suburbs','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-07','Usinsk / incl. suburb','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-08','Ukhta','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-09','Izhemsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-10','Knyazhpogostsky Area / incl. Emba','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-11','Koygorodsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-12','Kortkerossky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-13','Priluzsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-14','Syktyvdinsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-15','Sysolsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-16','Troitsko-Pechorsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-17','Udorsky Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-18','Ust-Vymskiy Area / incl. Mikun','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-19','Ust-Kulomskiy Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KO-20','Ust-Tsilemskiy Area','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-01','Zapadny District of Krasnodar','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-02','Karasunsky District of Krasnodar','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-03','Prikubansky District of Krasnodar','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-04','Centralny District of Krasnodar','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-05','Vostochny District of Novorossiysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-06','Primorsky District of Novorossiysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-07','Centralny District of Novorossiysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-08','Adlersky District OF Sochi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-09','Lazarevsky District of Sochi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-10','Khostinsky District of Sochi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-11','Centralny District of Sochi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-12','Anapa','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-13','Armavir','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-14','Belorechensk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-15','Gelendzhik','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-16','Goryachij Kljuch','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-17','Yeysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-18','Kropotkin','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-19','Krymsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-20','Labinsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-21','Slavyansk-On-Kuban','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-22','Tikhoretsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-23','Tuapse','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-24','Abinsky Area / incl. Abinsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-26','Apsheronsky Area / incl. Apsheronsk, Hadyzhensk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-27','Beloglinsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-28','Belorechensky Area / incl. Belorechensk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-29','Bryukhovetsky Area ','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-30','Vyselkovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-31','Gulkevichsky Area / incl. Gulkevichi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-32','Dinskoj Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-33','Yeysk Area / incl. Yeysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-34','Kavkazsky Area / incl. Kropotkin','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-35','Kalininsky District','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-36','Kanevsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-37','Korenovsky Area / incl. Kopehobck','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-38','Krasnoarmejsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-39','Krylovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-40','Krymsky Area / incl. Krymsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-41','Kurganinsky Area / incl. Kurganinsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-42','Kushchevsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-43','Labinsky Area / incl. Labinsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-44','Leningradsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-45','Mostovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-46','Novokubansky Area / incl. Novokubansk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-47','Novopokrovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-48','Otradnensky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-49','Pavlovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-50','Primorsko-Ahtarsky Area / incl. Primorsko-Ahtarsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-51','Seversky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-52','Slavyansky Area / incl. Slavyansk-na-Kubani','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-53','Starominsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-54','Tbilissky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-55','Temryuksky Area / incl. Temryuk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-56','Timashevsky Area / incl. Timashevsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-57','Tikhoretsky Area / incl. Tihoretsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-58','Tuapsinsky Area / incl. Tuapse','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-59','Uspensky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-60','Ust-Labinsky Area / incl. Ust-Labinsk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-61','Shcherbinovsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-65','Novorossijsky District of Novorossiysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-66','Yuzhny District of Novorossiysk','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-67','Sirius Regional Center','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KR-68','Anapsky Area','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-01','Kostroma','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-02','Buj','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-03','Volgorechensk','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-04','Galich','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-05','Manturovo','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-06','Nerekhta','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-07','Neya','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-08','Sharja','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-09','Antropovsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-10','Buysky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-11','Vohomsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-12','Galichsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-13','Kadyysky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-14','Kologrivsky Area / incl. Kologriv','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-15','Kostromskoj Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-16','Krasnoselsky District','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-17','Makaryevsky Area / incl. Makarev','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-18','Manturovsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-19','Mezhevsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-20','Neysky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-21','Nerehtsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-22','Oktyabrsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-23','Ostrovsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-24','Pavinsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-25','Parfenyevsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-26','Ponazyrevsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-27','Pyshchugsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-28','Soligalichsky Area / incl. Soligalich','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-29','Sudislavsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-30','Susaninsky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-31','Chukhlomsky Area / incl. Chuhloma','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KS-32','Shar''Insky Area','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-01','Zheleznodorozhny District of Kursk','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-02','Seymsky District of Kursk','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-03','Centralny District of Kursk','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-04','Zheleznogorsk','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-05','Kurchatov','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-06','Lgov','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-07','Shchigry','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-08','Belovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-09','Bolshesoldatsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-10','Glushkovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-11','Gorshechensky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-12','Dmitriyevsky Area / incl. Dmitriev-Lgovskiy','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-13','Zheleznogorsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-14','Zolotuhinsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-15','Kastorensky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-16','Konyshevsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-17','Korenevsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-18','Kursky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-19','Kurchatovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-20','Lgovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-21','Manturovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-22','Medvensky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-23','Oboyansky Area / incl. Oboyan','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-24','Oktyabrsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-25','Ponyrovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-26','Pristensky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-27','Rylsky Area / incl. Rylsk','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-28','Sovetsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-29','Solntsevsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-30','Sudzhansky Area / incl. Sudzha','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-31','Timsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-32','Fatezhsky Area / incl. Fatezh','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-33','Homutovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-34','Cheremisinovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'KU-35','Shchigrovsky Area','KU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-16','Sosnovy Bor','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-20','Boksitogorsky Area / incl. Boksitogorsk, Pikalyovo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-21','Volosovsky Area','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-22','Volkhovsky Area / incl. Volkhov, Novaja Ladoga','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-23','Vsevolozhsky Area / incl. Vsevolzhsk, Sertolovo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-24','Vyborgsky Area / incl. Vyborg, Vysotsk, Kamennogorsk','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-25','Gatchina Area / incl. Gatchina, Communar','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-26','Kingiseppsky Area / incl. Kingisepp, Ivangorod','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-27','Kirishinsky Area / incl. Kirishi','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-28','Kirovsky Area / incl. Kirovsk, Otradnoye','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-29','Lodeynopolsky Area / incl. Lodeynoye Pole, Svirstroy','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-30','Lomonosovsky Area','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-31','Luzhsky Area / incl. Luga','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-32','Podporozhsky Area / incl. Podporozhe','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-33','Priozersky Area / incl. Priozersk','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-34','Slantsevsky Area / incl. Slantsy','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-35','Tikhvinsky Area / incl. Tikhvin','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LO-36','Tosnensky Area / incl. Tosno, Lyuban, Nikolskoe','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-01','Levoberezhny District of Lipetsk','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-02','Oktiabrsky District of Lipetsk','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-03','Pravoberezhny District of Lipetsk','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-04','Sovetsky District of Lipetsk','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-05','Yelets','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-06','Volovsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-07','Gryazinsky Area / incl. Grjazi','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-08','Dankovsky Area / incl. Dankov','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-09','Dobrinsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-10','Dobrovsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-11','Dolgorukovsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-12','Yeletsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-13','Zadonsky Area / incl. Zadonsk','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-14','Izmalkovsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-15','Krasninsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-16','Lebedyansky Area / incl. Lebedyan','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-17','Lev - Tolstovsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-18','Lipetsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-19','Stanovlyansky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-20','Terbunsky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-21','Usmansky Area / incl. Usman','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-22','Hlevensky Area','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'LP-23','Chaplyginsky Area / incl. Chaplygin','LP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-01','Vostochny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-02','Zapadny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-03','City Of Zelenograd','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-04','Severny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-05','Severovostochny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-06','Severozapadny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-07','Centralny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-08','Jugovostochny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-09','Jugozapadny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-10','Juzhny District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-11','Novomoskovsky District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MA-12','Troitsky District of Moscow','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-01','Leninsky District of Saransk','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-02','Oktyabrsky District of Saransk','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-03','Proletarsky District of Saransk','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-04','Kovylkino','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-05','Ruzaevka','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-06','Ardatovsky Area / incl. Ardatov','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-07','Atyuryevsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-08','Atyashevsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-09','Bolshebereznikovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-10','Bolsheignatovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-11','Dubensky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-12','Elnikovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-13','Zubovo-Polyansky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-14','Insarsky Area / incl. Insar','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-15','Ichalkovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-16','Kadoshkinsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-17','Kovylkinsky Area / incl. Kovylkino','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-18','Kochkurovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-19','Krasnoslobodsky Area / incl. Krasnoslobodsk','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-20','Lyambirsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-21','Romodanovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-22','Ruzayevsky Area / incl. Ruzaevka ','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-23','Staroshajgovsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-24','Temnikovsky Area / incl. Temnikov','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-25','Tengushevsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-26','Torbeevsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MD-27','Chamzinsky Area','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-01','City District of Balashikha','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-02','Bronnitsy','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-03','Zato Vlasiha','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-04','Zato Voskhod','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-06','City District of Dzerzhinsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-08','Dolgoprudnyj','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-09','City District of Domodedovo','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-10','Dubna','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-13','Zhukovsky','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-14','Zato Zvezdny Gorodok','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-15','City District of Zvenigorod','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-16','City District of Ivanteevka','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-21','City District of Kolomna','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-22','City District of Korolev','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-23','City District of Kotelniki','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-24','City District of Lobnya','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-25','City District of Lytkarino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-26','City District Losino-Petrovsky','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-27','Krasnoarmejsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-28','Zato Molodezhny','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-34','Orekhovo-Zuyevo','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-36','City District of Podolsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-37','Protvino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-39','Pushchino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-41','City District of Reutov','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-42','Roshal','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-44','Serpukhov','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-48','City District of Fryazino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-49','City District of Khimki','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-50','City District of Chernogolovka','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-52','Elektrogorsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-54','City District of Electrostal','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-56','City District of Krasnoznamensk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-58','Volokolamsk Area / incl. Volokolamsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-59','Voskresensky Area / incl. Voskresensk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-60','Dmitrovsky Area / incl. Yakhroma, Dmitrov','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-62','Egoryevsky Area / incl. Egoryevsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-63','Zaraysky Area / incl. Zaraysk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-64','Istrinsky Area / incl. Dedovsk, Istra','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-65','City District of Kashira','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-66','Klinsky Area / incl. Vysokovsk, Klin','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-67','Kolomensky Area','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-68','Krasnogorsky Area / incl. Krasnogorsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-69','Leninsky Area / incl. Vidnoe','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-70','Lotoshinsky Area','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-71','Lukhovitsky Area / incl. Lukhovitsy','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-72','Lyubertsy Area / incl. Lyubertsy','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-73','Mozhaisky Area / incl. Mozhaisk ','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-74','Mytishchi Area / incl. Mytischi ','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-75','Naro-Fominskiy Area / incl. Aprelevka, Naro-Fominsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-76','Noginsky Area / incl. Elektrougli, Noginsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-77','Odintsovsky Area / incl. Odintsovo','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-78','Ozyorsky Area / incl. Ozery','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-79','Orekhovo-Zuyevsky Area / incl. Drezna, Likino-Dulevo','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-80','Pavlovo-Posadsky Area / incl. Pavlovsk Posad','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-82','Pushkinsky Area / incl. Pushkino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-83','Ramensky Area / incl. Ramenskoje','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-84','Ruzsky Area / incl. Ruza','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-85','Sergiyevo-Posadsky Area / incl. Krasnozavodsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-86','Serebrjano-Prudsky Area','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-87','Serpukhovsky Area','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-88','Solnechnogorsky Area / incl. Solnechnogorsk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-89','Stupinsky Area / incl. Stupino','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-90','Taldomsky Area / incl. Taldom','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-92','Shatursky Area / incl. Shatura','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-93','Shakhovskoy Area','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-94','Shchelkovo Area / incl. Shchelkovo','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MO-95','Chekhovskt Area /incl.Chekhov','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-01','Yoshkar-Ola','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-02','Volzhsk','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-03','Kozmodemyansk','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-04','Volzhsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-05','Gornomariysky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-06','Zvenigovsky Area / incl. Zvenigovo','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-07','Kilemarsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-08','Kuzhenersky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-09','Mari-Turekskiy Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-10','Medvedevsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-11','Morkinsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-12','Novotor''yalskiy Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-13','Orshansky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-14','Paranginsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-15','Sernursky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-16','Sovetsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MR-17','Yurinsky Area','MR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-01','Leninsky District of Murmansk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-02','Oktiabrsky District of Murmansk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-03','Pervomajsky District of Murmansk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-04','Apatity','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-05','Kandalaksha Area / incl. Kandalaksha','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-06','Kirovsk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-07','Monchegorsk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-08','Olenegorsk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-09','Polyarnye Zori','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-10','Zato Zaozersk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-11','Zato Ostrovnoj','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-13','Zato Severomorsk','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-16','Kovdorsky Area','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-17','Kolsky Area / incl. Kola','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-18','Lovozersky Area','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-19','Pechengsky Area / incl. Zapolyarny','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-20','Tersky Area','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-21','Zato Vidyayevo','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'MU-22','Zato Aleksandrovsk / incl. Gadzhievo','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-01','Avtozavodsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-02','Kanavinsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-03','Leninsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-04','Moskovsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-05','Nizhegorodsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-06','Prioksky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-07','Sovetsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-08','Sormovsky District of Nizhny Novgorod','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-09','City District Arzamas','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-15','City District Dzerzhinsk','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-19','City District Sarov','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-20','Ardatovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-21','Arzamas Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-22','Balakhna Area / incl. Balakhna','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-23','Bogorodsky Area / incl. Bogorodsk','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-24','Bolsheboldinsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-25','Bol''Shemurashkinsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-26','City District of Bor','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-27','Buturlinsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-28','Vadsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-29','Varnavinsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-30','Vachsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-31','Vetluzhsky Area / incl. Vetluga','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-32','Voznesensky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-33','Volodarsky Area / incl. Volodarsk','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-34','Vorotynsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-35','Voskresensky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-36','City District Vyksa','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-37','Gaginsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-38','Gorodetsky Area / incl. Gorodets, Zavolzhe','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-39','Dalnekonstantinovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-40','Diveevsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-41','Knyagininsky Area / incl. Knyaginino','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-42','Koverninsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-43','Krasnobakovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-44','Krasnooktyabrsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-45','Kstovsky Area / incl. Kstovo','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-46','City District of Kulebaki','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-47','Lukoyanovsky Area / incl. Lukoyanov','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-48','Lyskovsky Area / incl. Lyskovo','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-49','City District Navashinsky','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-50','Pavlovsk Area / incl. Pavlovo, Vorsma, Gorbatov','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-51','City District Pervomajsk','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-52','Perevozsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-53','Pilninsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-54','Pochinkovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-55','City District Semenovsky','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-56','Sergachsky Area / incl. Sergach','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-57','Sechenovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-58','City District Sokolsky','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-59','Sosnovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-60','Spassky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-61','Tonkinsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-62','Tonshaevsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-63','Urensky Area / incl. Uren','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-64','City District of Chkalovsk','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-65','Sharangsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-66','Shatkovsky Area','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NN-67','City District of Shakhunya','NN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NO-01','Naryan-Mar','NO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NO-02','Zapoljarny Area / incl. Iskatelej','NO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NO-03','Amderma','NO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-01','Novgorod','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-02','Borovichi','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-03','Staraja Russa','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-04','Batetsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-05','Borovichsky Area / incl. Borovichi','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-06','Valdaisky Area / incl. Valdai','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-07','Volotovsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-08','Demyansky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-09','Krestetsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-10','Lyubytinsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-11','Malovishersky Area / incl. Malaya Vishera','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-12','Marevsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-13','Moshenskoy Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-14','Novgorodsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-15','Okulovsky Area / incl. Okulovka','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-16','Parfinsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-17','Pestovsky Area / incl. Pestovo','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-18','Poddorsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-19','Soletsky Area / incl. Soltsy','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-20','Starorussky Area / incl. Staraja Russa','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-21','Hvoyninsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-22','Holmsky Area / incl. Holm','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-23','Chudovsky Area / incl. Chudovo','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'NV-24','Shimsky Area','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-01','Zheleznodorozhny District of Orel','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-02','Zavodskoj Area of Orel','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-03','Severny Area of Orel','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-04','Sovetsky District of Orel','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-05','Livny','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-06','Mtsensk','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-07','Bolkhovsky Area / incl. Bolhov','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-08','Verhovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-09','Glazunovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-10','Dmitrovsky District / incl. Dmitrovsk-Orlovskiy','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-11','Dolzhansky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-12','Zalegoshchensky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-13','Znamensky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-14','Kolpnjansky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-15','Korsakovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-16','Krasnozorensky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-17','Kromsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-18','Livensky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-19','Maloarkhangel''sky Area / incl. Maloarhangelsk','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-20','Mtsensky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-21','Novoderevenkovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-22','Novosilsky Area / incl. Novosil','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-23','Orlovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-24','Pokrovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-25','Sverdlovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-26','Soskovsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-27','Trosnyansky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-28','Uritsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-29','Hotynetsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'OR-30','Shablykinsky Area','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-01','Zheleznodorozhny District of Penza','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-02','Leninsky District of Penza','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-03','Oktyabrsky District of Penza','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-04','Pervomajsky District of Penza','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-06','Kuznetsk','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-08','Zato Zarechny','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-09','Bashmakovsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-10','Bednodemyanovsky Area / incl. Bednodemyanovsk','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-11','Bekovsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-12','Belinsky Area / incl. Belinsky','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-13','Bessonovsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-14','Vadinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-15','Gorodishchensky Area / incl. Gorodische, Sursk','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-16','Zemetchinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-17','Issinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-18','Kamensky Area / incl. Kamenka','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-19','Kameshkirsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-20','Kolyshleysky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-22','Kuznetsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-23','Lopatinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-24','Luninsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-25','Maloserdobinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-26','Mokshansky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-27','Narovchatsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-28','Neverkinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-29','Nizhnelomovsky Area / incl. Nizhny Lomov','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-30','Nikolsky Area / incl. Nikolsk','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-31','Pachelmsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-32','Penzensky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-33','Serdobsky Area / incl. Serdobsk','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-34','Sosnovoborsk Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-35','Tamalinsky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PE-36','Shemysheysky Area','PE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-01','Dzerzhinsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-02','Industrialny District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-03','Kirovsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-04','Leninsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-05','Motovilikhinsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-06','Ordzhonikidzevsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-07','Sverdlovsky District of Perm','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-08','Aleksandrovsky Area / incl. Aleksandrovsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-09','Berezniki','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-10','Gremyachinsky Area / incl. Gremyachinsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-11','Gubakhinsky Area / incl. Gubakha','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-13','Kizelovsky Area / incl. Kizel','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-14','Krasnokamsky Area / incl. Krasnokamsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-15','Kungur','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-17','Solikamsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-20','Bardymsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-21','Berezovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-22','Bolshesosnovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-23','Vereshchaginsky Area / incl. Vereshchagino','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-24','Gornozavodsky Area / incl. Gornozavodsk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-25','Elovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-26','Ilyinsky Area / incl. Chermoz','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-27','Karagaysky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-28','Kishertsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-29','Krasnovishersky District / incl. Krasnovishersk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-30','Kuyedinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-31','Kungursky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-32','Lysvensky Area / incl. Lysva','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-33','Nytvensky Area / incl. Nytva','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-34','Oktyabrsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-35','Ordinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-36','Osinsky Area / incl. Osa','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-37','Okhansky Area / incl. Okhansk','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-38','Ochersky Area / incl. Ocher','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-39','Permsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-40','Sivinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-41','Solikamsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-42','Suksunsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-43','Uinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-44','Usolsky Area / incl. Usolye','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-45','Chastinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-46','Cherdynsky Area / incl. Cherdyn','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-47','Chernushinsky Area / incl. Chernushka','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-48','Chusovskoy Area / incl. Chusovoy','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-49','Tchaikovsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-50','Dobryansky Area / incl. Dobryanka','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-51','Zato Zvezdny ','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-52','Kudymkar','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-53','Gaynsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-54','Kosinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-55','Kochevsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-56','Kudymkarsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-57','Yurlinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PM-58','Yusvinsky Area','PM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-01','Pskov','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-02','Velikiye Luki','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-03','Bezhanitsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-04','Velikiye Luki Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-05','Gdovsky Area / incl. Gdov','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-06','Dedovichsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-07','Dnovsky Area / incl. Dno','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-08','Krasnogorodsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-09','Kunyinsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-10','Loknjansky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-11','Nevelsky Area / incl. Nevel','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-12','Novorzhevsky Area / incl. Novorzhev','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-13','Novosokolnichesky Area / incl. Novosokolniki','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-14','Opochetsky Area / incl. Opochka','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-15','Ostrovsky Area / incl. Ostrov','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-16','Palkinsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-17','Pechorsky Area / incl. Pechora','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-18','Pljussky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-19','Porkhovsky Area / incl. Porhov','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-20','Pskovsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-21','Pustoshkinsky Area / incl. Pustoshka','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-22','Pushkinogorsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-23','Pytalovsky Area / incl. Pytalovo','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-24','Sebezhsky Area / incl. Sebezh','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-25','Strugo-Krasnenskiy Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'PS-26','Usvyatsky Area','PS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-01','Zheleznodorozhny District of Ryazan','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-02','Moskovsky District of Ryazan','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-03','Oktiabrsky District of Ryazan','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-04','Sovetsky District of Ryazan','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-05','Kasimov','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-06','Sasovo','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-07','Skopin','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-08','Ermishinsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-09','Zaharovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-10','Kadomsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-11','Kasimovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-12','Klepikovsky Area / incl. Spas-Klepiki','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-13','Korablinsky Area / incl. Korablino','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-14','Miloslavsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-15','Mikhaylovsky Area / incl. Mikhaylov','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-16','Aleksandro-Nevskiy Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-17','Pitelinsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-18','Pronsky Area / incl. Novomichurinsk','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-19','Putjatinsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-20','Rybnovsky Area / incl. Rybnoe','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-21','Ryazhsky Area / incl. Ryazhsk','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-22','Ryazansky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-23','Sapozhkovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-24','Saraevsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-25','Sasovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-26','Skopinsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-27','Spassky Area / incl. Spassk-Ryazanskiy','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-28','Starozhilovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-29','Uholovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-30','Chuchkovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-31','Shatsky Area / incl. Shatsk','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RA-32','Shilovsky Area','RA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-01','Voroshilovsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-02','Zheleznodorozhny District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-03','Kirovsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-04','Leninsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-05','Oktyabrsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-06','Pervomajsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-07','Proletarsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-08','Sovetsky District of Rostov-on-Don','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-09','Azov','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-10','Batajsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-12','Volgodonsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-13','Gukovo','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-14','Donetsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-15','Zverevo','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-16','Kamensk-Shahtinsky','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-19','Novocherkassk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-20','Novoshakhtinsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-22','Taganrog','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-23','Shahty','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-24','Azovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-25','Aksaysky Area / incl. Aksay','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-26','Bagaevsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-27','Belokalitvinsky Area / incl. Belaja Kalitva','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-28','Bokovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-29','Verhnedonskoj Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-30','Veselovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-31','Volgodonsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-32','Dubovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-33','Egorlyksky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-34','Zavetinsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-35','Zernogradsky Area / incl. Zernograd','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-36','Zimovnikovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-37','Kagalnitsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-38','Kamensky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-39','Kasharsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-40','Konstantinovsky Area / incl. Konstantinovsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-41','Krasnosulinsky Area / incl. Krasny Sulin','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-42','Kuibyshevsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-43','Martynovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-44','Matveevo-Kurganskiy Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-45','Millerovsky Area / incl. Millerovo','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-46','Milyutinsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-47','Morozovsky Area / incl. Morozovsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-48','Myasnikovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-49','Neklinovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-50','Oblivsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-51','Oktyabrsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-52','Orlovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-53','Peschanokopsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-54','Proletarsky Area / incl. Proletarsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-55','Remontnensky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-56','Rodionovo-Nesvetayskiy Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-57','Salsky Area / incl. Salsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-58','Semikarakorsky Area / incl. Semikarakorsk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-59','Sovetsky Area ','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-60','Tarasovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-61','Tatsinsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-62','Ust-Donetskiy Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-63','Tselinsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-64','Tsimlyansk Area / incl. Tsimlyansk','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-65','Chertkovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'RO-66','Sholohovsky Area','RO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-01','Volzhsky District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-02','Zavodskoj District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-03','Kirovsky District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-04','Leninsky District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-05','Oktyabrsky District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-06','Frunzensky District of Saratov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-17','Shikhany','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-19','Aleksandrovo-Gayskiy Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-20','Arkadaksky Area / incl. Arkadak','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-21','Atkarsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-22','Bazarno-Karabulaksky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-23','Balakovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-24','Balashovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-25','Baltaysky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-26','Volsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-27','Voskresensky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-28','Dergachevsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-29','Duhovnitsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-30','Ekaterinovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-31','Ershovsky Area / incl. Ershov','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-32','Ivanteevsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-33','Kalininsky Area / incl. Kalininsk','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-34','Krasnoarmejsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-35','Krasnokutsky Area / incl. Krasny Kut','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-36','Krasnopartizansky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-37','Lysogorsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-38','Markssky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-39','Novoburassky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-40','Novouzensky Area / incl. Novouzensk','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-41','Ozinsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-42','Perelyubsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-43','Petrovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-44','Pitersky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-45','Pugachevsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-46','Rovensky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-47','Romanovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-48','Rtishchevsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-49','Samoylovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-50','Saratovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-51','Sovetsky Area ','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-52','Tatishchevsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-53','Turkovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-54','Fedorovsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-55','Hvalynsky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-56','Engel''Ssky Area','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-57','Zato Mihaylovskiy','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SA-58','Zato Svetly','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-01','Zadneprovsky District of Smolensk','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-02','Leninsky District of Smolensk','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-03','Industrialny District of Smolensk','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-04','Desnogorsk','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-05','Velizhsky Area / incl. Velizh','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-06','Vyazemsky Area / incl. Vyazma','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-07','Gagarinsky Area / incl. Gagarin','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-08','Glinkovsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-09','Demidovsky Area / incl. Demidov','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-10','Dorogobuzhsky Area / incl. Dorogobuzh','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-11','Dukhovshchinsky Area / incl. Duhovshchina','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-12','Yelninsky Area / incl. Yelnya','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-13','Ershichsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-14','Kardymovsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-15','Krasninsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-16','Monastyrshchinsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-17','Novoduginsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-18','Pochinkovsky Area / incl. Pochinok','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-19','Roslavlsky Area / incl. Roslavl','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-20','Rudnyansky Area / incl. Rudnya','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-21','Safonovsky Area / incl. Safonovo','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-22','Smolensky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-23','Sychevsky Area / incl. Sychevka','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-24','Temkinsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-25','Ugransky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-26','Hislavichsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-27','Holm-Zhirkovskiy Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-28','Shumyachsky Area','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SM-29','Yartsevsky Area / incl. Yartsevo','SM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-01','Zaterechny District of Vladikavkaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-02','Iristonsky District of Vladikavkaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-03','Industrialny District of Vladikavkaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-04','Severozapadny District of Vladikavkaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-05','Alagirsky Area / incl. Alagir','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-06','Ardonsky Area / incl. Ardon','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-07','Digorsky Area / incl. Digora','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-08','Irafsky Area','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-09','Kirovsky Area','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-10','Mozdoksky Area / incl. Mozdok','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-11','Pravoberezhny Area / incl. Beslan','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SO-12','Prigorodny Area','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-01','Admiralteisky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-02','Vasileostrovsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-03','Vyborgsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-04','Kalininsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-05','Kirovsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-06','Kolpino District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-07','Krasnogvardeisky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-08','Krasnoselsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-09','Kronshtadt District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-10','Kurortny District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-12','Primorsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-13','Moskovsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-14','Nevsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-16','Petrogradsky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-17','Petrodvorets District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-18','Pushkin District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-19','Frunzensky District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SP-20','Centralny District St. Petersburg','SP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-01','Zheleznodorozhny District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-02','Kirovsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-03','Krasnoglinsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-04','Kuibyshevsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-05','Leninsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-06','Oktyabrsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-07','Industrialny District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-08','Samarsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-09','Sovetsky District of Samara','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-10','Avtozavodsky District of Tolyatti','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-11','Komsomolsky District of Tolyatti','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-12','Centralny District of Tolyatti','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-13','Zhigulyovsk','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-14','Kinel','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-15','Novokujbyshevsk','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-16','Oktyabrsk','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-17','Otradny','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-18','Pokhvistnevo','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-19','Syzran','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-20','Chapaevsk','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-21','Alexeyevsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-22','Bezenchuksky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-23','Bogatovsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-24','Bolsheglushitsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-25','Bolshechernigovsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-26','Borsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-27','Volzhsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-28','Elhovsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-29','Isaklinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-30','Kamyshlinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-31','Kinelsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-32','Kinel-Cherkasskiy Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-33','Klyavlinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-34','Koshkinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-35','Krasnoarmeisky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-36','Krasnoyarsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-37','Neftegorsky Area / incl. Neftegorsk','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-38','Pestravsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-39','Pohvistnevsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-40','Privolzhsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-41','Sergiyevsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-42','Stavropolsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-43','Syzransky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-44','Hvorostyansky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-45','Chelno-Vershinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-46','Shentalinsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'SR-47','Shigonsky Area','SR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-01','Leninsky District of Stavropol','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-02','Oktyabrsky District of Stavropol','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-03','Industrialny Region of Stavropol','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-04','Budyonovsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-05','Georgievsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-06','Essentuki','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-07','Zheleznovodsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-08','Kislovodsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-09','Lermontov','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-10','Mineralnye Vody','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-11','Nevinnomyssk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-12','Pyatigorsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-13','Aleksandrovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-14','Andropovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-15','Apanasenkovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-16','Arzgirsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-17','Blagodarnensky Area / incl. Blagodarny','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-18','Budennovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-19','Georgievsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-20','Grachevsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-21','Izobilnensky Area / incl. Izobilny','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-22','Ipatovsky Area / incl. Ipatovo','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-23','Kirovsky Area / incl. Novopavlovsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-24','Kochubeevsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-25','Krasnogvardejsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-26','Kursky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-27','Levokumsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-28','Mineralnye Vody City District','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-29','Neftekumsky Area / incl. Neftekumsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-30','Novoaleksandrovsky Area / incl. Novoaleksandrovsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-31','Novoselitsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-32','Petrovsky Area / incl. Svetlograd','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-33','Predgorny Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-34','Sovetsky Area  / incl. Zelenokumsk','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-35','Stepnovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-36','Trunovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-37','Turkmensky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'ST-38','Shpakovsky Area','ST','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-01','Aviastroitelny District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-02','Vakhitovsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-03','Kirovsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-04','Moskovsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-05','Novo-Savinovsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-06','Privolzhsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-07','Sovetsky District of Kazan','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-08','Aznakaevo','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-09','Almet`evsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-10','Bavly','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-11','Bugult`ma','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-12','Elabuga','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-13','Zainsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-14','Zelenodolsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-15','Leninogorsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-16','Naberezhny Chelny','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-17','Nizhnekamsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-18','Nurlat','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-19','Chistopol','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-20','Agryzsky Area / incl. Agryz','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-21','Aznakayevsky Area / incl. Aznakaevo','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-22','Aksubayevsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-23','Aktanyshsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-24','Alexeyevsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-25','Alkeevsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-26','Almetyevsk Area / incl. Almetyevsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-27','Apastovsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-28','Arsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-29','Atninsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-30','Bavlinsky Area / incl. Bavly','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-31','Baltasinsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-32','Bugul`minsky Area / incl. Bugulma','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-33','Buinsky Area / incl. Buinsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-34','Verhneuslonsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-35','Vysokogorsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-36','Drozhzhanovsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-37','Elabuzhsky Area / incl. Elabuga','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-38','Zainsky Area / incl. Zainsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-39','Zelenodolsky Area / incl. Zelenodolsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-40','Kaybitsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-41','Kamsko-Ustinskiy Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-42','Kukmorsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-43','Laishevsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-44','Leninogorsky Area / incl. Leninogorsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-45','Mamadyshsky Area / incl. Mamadysh','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-46','Mendeleevsky Area / incl. Mendeleevsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-47','Menzelinsky Area / incl. Menzelinsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-48','Musljumovsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-49','Nizhnekamsky Area / incl. Nizhnekamsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-50','Novosheshminsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-51','Nurlatsky Area / incl. Nurlat','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-52','Pestrechinsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-53','Rybno-Slobodsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-54','Sabinsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-55','Sarmanovsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-56','Spassky Area / incl. Bolgar','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-57','Tetyushsky Area / incl. Tetyushi','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-58','Tukayevsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-59','Tyulyachinsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-60','Cheremshansky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-61','Chistopolsky Area / incl. Chistopol','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-62','Yutazinsky Area','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-63','Buinsk','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-64','Avtozavodskoj District of Naberezhnye Chelny','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-65','Komsomolsky District of Naberezhnye Chelny','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TA-66','Centralny District of Naberezhnye Chelny','TA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-01','Leninsky District of Tambov','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-02','Oktyabrsky District of Tambov','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-03','Sovetsky District of Tambov','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-04','Kirsanov','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-05','Kotovsk','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-06','Michurinsk','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-07','Morshansk','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-08','Rasskazovo','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-09','Uvarovo','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-10','Bondarsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-11','Gavrilovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-12','Zherdevsky Area / incl. Zherdevka','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-13','Znamensky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-14','Inzhavinsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-15','Kirsanovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-16','Michurinsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-17','Mordovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-18','Morshansky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-19','Muchkapsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-20','Nikiforovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-21','Pervomajsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-22','Petrovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-23','Pichayevsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-24','Rasskazovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-25','Rzhaksinsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-26','Sampursky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-27','Sosnovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-28','Staroyuryevsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-29','Tambovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-30','Tokarevsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-31','Uvarovsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TB-32','Umetsky Area','TB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-01','Zarechensky District of Tula','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-02','Privokzal''ny District of Tula','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-03','Proletarsky District of Tula','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-04','Sovietsky District of Tula','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-05','Centralny District of Tula','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-08','Donskoy / incl. Severo-Zadonsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-11','City District Novomoskovsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-14','City Aleksin','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-15','Arsenyevsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-16','Belevsky Area / incl. Belev','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-17','Bogoroditsky Area / incl. Bogoroditsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-18','Venevsky Area / incl. Beheb','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-19','Volovsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-20','Dubenskii Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-21','City Efremov','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-22','Zaoksky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-23','Kamensky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-24','Kimovsky Area / incl. Kimovsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-25','Kireevsky Area / incl. Kireevsk, Bolohovo, Lipki','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-26','Kurkinsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-27','Leninsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-29','Odoevsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-30','Plavsky Area / incl. Plavsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-31','Suvorovsky Area / incl. Suvorov, Chekalin','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-32','Teplo - Ogarevsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-33','Uzlovsky Area / incl. Uzlovaya','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-34','Chernsky Area','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-35','Shchekinsky Area / incl. Shchekino, Sovetsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-36','Yasnogorsky Area / incl. Yasnogorsk','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-37','Novogurovsky','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TL-38','Slavny','TL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-01','Zavolzhsky District of Tver','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-02','Moscowsky District of Tver','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-03','Proletarsky District of Tver','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-04','Centralny District of Tver','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-07','Vyshny Volochek','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-09','Kimry','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-13','Rzhev','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-14','Torzhok','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-16','Andreapolsky Area / incl. Andreapol','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-17','Bezhetsky Area / incl. Bezhetsk','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-18','Belsky Area / incl. White','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-19','Bologovsky Area / incl. Bologoye','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-20','Vesyegonsky Area / incl. Vesegonsk','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-21','Vyshnevolotsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-22','Zharkovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-23','Zapadnodvinsky Area / incl. Zapadnaja Dvina','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-24','Zubtsovsky Area / incl. Zubtsov','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-25','Kalininsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-26','Kalyazinsky Area / incl. Kalyazin ','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-27','Kashinsky Area / incl. Kashin','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-28','Kesovogorsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-29','Kimrsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-30','Konakovsky Area / incl. Konakovo','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-31','Krasnokholmsky Area / incl. Krasnyj Holm','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-32','Kuvshinovsky Area / incl. Kuvshinovo','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-33','Lesnoj Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-34','Likhoslavlsky Area / incl. Lihoslavl','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-35','Maksatihinsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-36','Molokovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-37','Nelidovsky Area / incl. Nelidovo','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-38','Oleninsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-39','Ostashkovsky Area / incl. Ostashkov','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-40','Penovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-41','Rameshkovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-42','Rzhevsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-43','Sandovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-44','Selizharovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-45','Sonkovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-46','Spirovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-47','Staritsky Area / incl. Staritsa','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-48','Torzhoksky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-49','Toropetsky Area / incl. Toropets','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-50','Udomlya Area / incl. Udomlya','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-51','Firovsky Area','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-52','Zato Solnechny','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'TV-53','Zato Ozerny','TV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-01','Industrialny District of Izhevsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-02','Leninsky District of Izhevsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-03','Oktyabrsky District of Izhevsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-04','Pervomajsky District of Izhevsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-05','Ustinovsky District of Izhevsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-06','Votkinsk','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-07','Glazov','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-08','Mozhga','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-09','Sarapul','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-10','Alnashsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-11','Balezinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-12','Vavozhsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-13','Votkinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-14','Glazovsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-15','Grakhovsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-16','Debessky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-17','Zavyalovsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-18','Igrinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-19','Kambarsky Area / incl. Kambarka','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-20','Kezsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-21','Kiznersky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-22','Kiyasovsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-23','Krasnogorsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-24','Malopurginsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-25','Mozhginsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-26','Sarapulsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-27','Seltinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-28','Syumsinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-29','Uvinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-30','Sharkansky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-31','Yukamensky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-32','Yakshur-Bodinskiy Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-33','Yarsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UD-34','Karakulinsky Area','UD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-01','Zheleznodorozhny District of Ulyanovsk','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-02','Zavolzhsky District of Ulyanovsk','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-03','Zasviyazhsky District of Ulyanovsk','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-04','Leninsky District of Ulyanovsk','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-06','Dimitrovgrad','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-07','Bazarnosyzgansky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-08','Baryshsky Area / incl. Barysh','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-09','Veshkaymsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-10','Inzensky Area / incl. Inza','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-11','Karsunsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-12','Kuzovatovsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-13','Majnsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-14','Melekessky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-15','Nikolaevsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-16','Novomalyklinsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-17','Novospassky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-18','Pavlovsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-19','Radishchevsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-20','Sengileevsky Area / incl. Sengiley','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-21','Starokulatkinsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-22','Staromajnsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-23','Sursky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-24','Terengulsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-25','Ulyanovsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-26','Tsilninsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-27','Cherdaklinsky Area','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'UL-28','Novoulyanovsk','UL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-01','Voroshilovsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-02','Dzerzhinsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-03','Kirovsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-04','Krasnoarmeisky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-05','Krasnooktyabrsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-06','Sovetsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-07','Traktorozavodsky District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-08','Centralny District of Volgograd','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-09','Volzhsky','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-10','Kamyshin','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-11','City District City OF Mikhailovka','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-12','Uryupinsk','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-13','Frolovo','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-14','Alexeyevsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-15','Bykovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-16','Gorodishchensky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-17','Danilovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-18','Dubovsky Area / incl. Dubovka','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-19','Elansky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-20','Zhirnovsky Area / incl. Zhirnovsk','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-21','Ilovlinsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-22','Kalachevsky Area / incl. Kalach-na-Donu','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-23','Kamyshinsky Area / incl. Petrov Val','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-24','Kikvidzensky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-25','Kletsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-26','Kotelnikovsky Area / incl. Kotelnikovo','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-27','Kotovsky Area / incl. Kotovo','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-28','Kumylzhensky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-29','Leninsky Area / incl. Leninsk','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-30','Mikhailovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-31','Nekhayevsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-32','Nikolaevsky Area / incl. Nikolaevsk','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-33','Novoanninsky Area / incl. Novoanninskiy','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-34','Novonikolaevsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-35','Oktyabrsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-36','Olkhovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-37','Pallasovsky Area / incl. Pallasovka','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-38','Rudnyansky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-39','Svetlojarsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-40','Serafimovichsky Area / incl. Serafimovich','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-41','Sredneakhtubinsky Area / incl. Krasnoslobodsk','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-42','Staropoltavsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-43','Surovikinsky Area / incl. Surovikino','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-44','Uryupinsk Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-45','Frolovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VG-46','Chernyshkovsky Area','VG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-01','Leninsky District of Vladimir ','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-02','Oktyabrsky District of Vladimir','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-03','Frunzensky District of Vladimir','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-06','Gus-Khrustalny','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-07','Kovrov','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-09','Murom','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-12','Raduzhny','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-13','Aleksandrovsky Area / incl. Alexandrov, Karabanovo, Strunino','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-14','Vyaznikovsky Area /incl. of Vyazniki','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-15','Gorokhovetsky Area / incl. Gorohovets','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-16','Gus-Khrustalny Area','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-17','Kameshkovsky Area / incl. Kameshkovo','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-18','Kirzhachsky Area / incl. Kirzhach','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-19','Kovrovsky Area','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-20','Kolchuginsky Area / incl. Kolchugino','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-21','Melenkovsky Area / incl. Melenki','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-22','Muromsky Area','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-23','Petushinsky Area / incl. Petushki, Kosterevo, Pokrov','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-24','Selivanovsky Area','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-25','Sobinsky Area / incl. Sobinka, Lakinsk','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-26','Sudogodsky Area / incl. Sudogda','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-27','Suzdalsky Area / incl. Suzdal','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VL-28','Yurev-Polskiy Area / incl. Yurev-Polskiy','VL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-01','Vologda','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-02','Velikiy Ustyug','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-03','Sokol','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-04','Cherepovets','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-05','Babayevsky Area / incl. Babayevo','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-06','Babushkinsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-07','Belozersky Area / incl. Belozersk','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-08','Vashkinsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-09','Velikoustyzhsky Area / incl. Veliky Ustyug, Krasavino','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-10','Verhovazhsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-11','Vozhegodsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-12','Vologodsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-13','Vytegorsky Area / incl. Vytegra','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-14','Gryazovetsky Area / incl. Gryazovets','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-15','Kadujsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-16','Kirillovsky Area / incl. Kirillov','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-17','Kichmengsko-Gorodetsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-18','Mezhdurechensky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-19','Nikolsky Area / incl. Nikolsk','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-20','Njuksensky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-21','Sokolsky Area / incl. Kadnikov','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-22','Syamzhensky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-23','Tarnogsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-24','Totemsky Area / incl. Tot`Ma','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-25','Ust-Kubinskiy Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-26','Ustyuzhensky Area / incl. Ustyuzhna','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-27','Harovsky Area / incl. Harovsk','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-28','Chagodoshchensky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-29','Cherepovetsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VO-30','Sheksinsky Area','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-01','Zheleznodorozhny District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-02','Kominternovsky District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-03','Levoberezhny District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-04','Leninsky District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-05','Sovetsky District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-06','Centralny District of Voronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-07','Borisoglebsk City District','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-09','Novovoronezh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-13','Anninsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-14','Bobrovsky Area / incl. Bobrov','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-15','Bogucharsky Area / incl. Boguchar','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-17','Buturlinovsky Area / incl. Buturlinovka','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-18','Verhnemamonsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-19','Verhnehavsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-20','Vorobyevsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-21','Gribanovsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-22','Kalacheevsky Area / incl. Kalach','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-23','Kamensky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-24','Kantemirovsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-25','Kashirsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-26','Liskinsky Area / incl. Liski','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-27','Nizhnedevitsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-28','Novousmansky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-29','Novokhopersky Area / incl. Novohopersk','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-30','Olkhovatsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-31','Ostrogozhsky Area / incl. Ostrogozhsk','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-32','Pavlovsky Area / incl. Pavlovsk','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-33','Paninsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-34','Petropavlovsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-35','Povorinsky Area / incl. Povorino','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-36','Podgorensky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-37','Ramonsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-38','Repyevsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-39','Rossoshansky Area / incl. Rossosh','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-40','Semiluksky Area / incl. Semiluki','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-41','Talovsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-42','Ternovsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-43','Hokholsky Area','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'VR-44','Ertilsky Area / incl. Ertil','VR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-01','Dzerzhinsky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-02','Zavolzhsky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-03','Kirovsky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-04','Krasnoperekopsky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-05','Leninsky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-06','Frunzensky District of Yaroslavl','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-07','Pereslavl-Zalessky','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-08','Rostov','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-09','Rybinsk','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-10','Tutaev','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-11','Uglich','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-12','Bolsheselsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-13','Borisoglebsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-14','Breytovsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-15','Gavrilov-Yamsky Area / incl. Gavrilov-Yam','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-16','Danilovsky Area / incl. Danilov','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-17','Lyubimsky Area / incl. Lyubim ','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-18','Myshkinsky Area / incl. Myshkin','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-19','Nekouzsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-20','Nekrasovsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-21','Pervomajsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-22','Pereslavsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-23','Poshekhonsky Area / incl. Poshekhon`e','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-24','Rostovsky Area / incl. Rostov ','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-25','Rybinsk Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-26','Tutayevsky Area / incl. Tutaev','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-27','Uglichsky Area / incl. Uglich ','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (54,'YR-28','Yaroslavsky Area','YR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (61,'AR-32','Franz-Josef Land','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (110,'HI,Hawaii','Hawaii','HI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (110,'HI,Honolulu','Honolulu','HI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (110,'HI,Kalawao','Kalawao','HI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (110,'HI,Kauai','Kauai','HI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (110,'HI,Maui','Maui','HI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-01','Baltijsky                                                  (Deleted)','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-02','Leningradsky District of Kaliningrad','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-03','Moskovsky District of Kaliningrad','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-04','Oktjabr`Sky                                              (Deleted)','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-05','Centralny District of Kaliningrad','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-06','Baltiysky Area / incl. Baltiysk, Primorsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-07','Pionersky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-08','Svetlogorsk Area / incl. Svetlogorsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-09','Svetlovsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-10','Sovietsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-11','Bagrationovsky Area / incl. Bagrationovsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-12','Gvardeisky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-13','Guryevsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-14','Gusevsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-15','Zelenogradsky Area / incl. Zelenogradsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-16','Krasnoznamensky Area / incl. Krasnoznamensk ','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-17','Nemansky Area / incl. Neman','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-18','Nesterovsky Area / incl. Nesterov','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-19','Ozyorsk City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-20','Polesye Area / incl. Polessk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-21','Pravdinsky Area / incl. Pravdinsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-22','Slavsky Area / incl. Slavsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-24','Ladushkinsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-23','Chernyakhovsky Area / incl. Chernyakhovsk','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-25','Mamonovsky City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (126,'KA-26','Yantarny City District','KA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (151,'LO-24','Vyborgsky Area Including Vysotsk','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'090','Chatham Islands','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'001','Mongonui','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'002','Whangaroa ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'003','Hokianga ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'004','Bay of Islands ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'005','Whangarei ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'006','Hobson ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'007','Otamatea ','NTL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'008','Rodney ','AUK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'009','Great Barrier Island ','AUK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'010','Waitemata ','AUK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'011','Franklin','AUK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'012','Raglan ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'013','Waikato ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'014','Waipa ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'015','Otorohanga','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'016','Waitomo ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'017','Taumaranui','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'018','Coromandel ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'019','Thames ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'020','Hauraki Plains ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'021','Ohinemuri','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'022','Piako ','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'023','Matamata','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'024','Tauranga ','BOP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'025','Rotorua ','BOP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'026','Taupo','WKO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'027','Whakatane ','BOP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'028','Opotiki ','BOP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'029','Waiapu ','GIS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'030','Waikohu','GIS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'031','Cook ','GIS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'032','Wairoa ','HKB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'033','Hawke''s Bay ','HKB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'034','Waipawa ','HKB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'035','Patangata','HKB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'036','Waipukurau ','HKB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'037','Dannevirke ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'038','Woodville ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'039','Clifton ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'040','Taranaki ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'041','Inglewood','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'042','Stratford ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'043','Egmont ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'044','Eltham ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'045','Waimate  West','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'046','Hawera ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'047','Patea ','TKI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'048','Waimarino ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'049','Waitotara ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'050','Wanganui ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'051','Rangitikei ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'052','Kiwitea ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'053','Pohangina ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'054','Oroua ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'055','Manawatu','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'056','Kairanga ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'057','Horowhenua ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'058','Hutt ','WGN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'059','Pahiatua','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'060','Akitio ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'061','Eketahura ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'062','Masterton ','MWT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'063','Waiarapa South','WGN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'064','Featherston','WGN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'065','Marlborough ','MBH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'066','Awatere','MBH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'067','Kaikoura ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'068','Golden Bay','TAS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'069','Waimea ','TAS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'070','Buller ','WTC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'071','Inangahua ','WTC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'072','Grey ','WTC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'073','Westland ','WTC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'074','Amuri ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'075','Cheviot ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'076','Waipara','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'077','Kowai ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'078','Ashley ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'079','Rangiora ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'080','Eyre ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'081','Oxford ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'082','Tawera ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'083','Malvern ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'084','Paparua ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'085','Waimari ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'086','Heathcote ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'087','Halswell ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'088','Mount Herbert ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'089','Akaroa ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'091','Wairewa ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'092','Ellesmere ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'093','Ashburton ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'094','Geraldine ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'095','Levels ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'096','Mackenzie ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'097','Waimate','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'098','Waitaki ','CAN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'099','Waihemo ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'100','Waikouaiti ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'101','Peninsula ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'102','Tareri ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'103','Bruce ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'104','Clutha ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'105','Tuapeka ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'106','Maniototo ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'107','Vincent ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'108','Lake ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'109','Southland ','OTA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'110','Wallace ','STL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'111','Fiord ','STL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (170,'112','Stewart Island ','STL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01001','Alegría-Dulantzi','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01002','Amurrio','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01003','Aramaio','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01004','Artziniega','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01006','Armiñón','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01008','Arratzua-Ubarrundia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01009','Asparrena','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01010','Ayala/Aiara','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01011','Baños de Ebro/Mañueta','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01013','Barrundia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01014','Berantevilla','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01016','Bernedo','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01017','Campezo/Kanpezu','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01018','Zigoitia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01019','Kripan','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01020','Kuartango','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01021','Elburgo/Burgelu','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01022','Elciego','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01023','Elvillar/Bilar','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01027','Iruraiz-Gauna','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01028','Labastida/Bastida','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01030','Lagrán','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01031','Laguardia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01032','Lanciego/Lantziego','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01033','Lapuebla de Labarca','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01034','Leza','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01036','Laudio/Llodio','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01037','Arraia-Maeztu','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01039','Moreda de Álava/Moreda Araba','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01041','Navaridas','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01042','Okondo','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01043','Oyón-Oion','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01044','Peñacerrada-Urizaharra','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01046','Ribera Alta','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01047','Erriberabeitia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01049','Añana','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01051','Agurain/Salvatierra','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01052','Samaniego','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01053','San Millán/Donemiliaga','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01054','Urkabustaiz','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01055','Valdegovía/Gaubea','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01056','Harana/Valle de Arana','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01057','Villabuena de Álava/Eskuernaga','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01058','Legutio','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01059','Vitoria-Gasteiz','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01060','Yécora/Iekora','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01061','Zalduondo','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01062','Zambrana','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01063','Zuia','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01901','Iruña Oka/Iruña de Oca','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'01902','Lantarón','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02001','Abengibre','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02002','Alatoz','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02003','Albacete','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02004','Albatana','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02005','Alborea','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02006','Alcadozo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02007','Alcalá del Júcar','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02008','Alcaraz','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02009','Almansa','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02010','Alpera','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02011','Ayna','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02012','Balazote','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02013','Balsa de Ves','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02014','Ballestero (El)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02015','Barrax','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02016','Bienservida','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02017','Bogarra','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02018','Bonete','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02019','Bonillo (El)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02020','Carcelén','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02021','Casas de Juan Núñez','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02022','Casas de Lázaro','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02023','Casas de Ves','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02024','Casas-Ibáñez','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02025','Caudete','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02026','Cenizate','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02027','Corral-Rubio','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02028','Cotillas','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02029','Chinchilla de Monte-Aragón','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02030','Elche de la Sierra','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02031','Férez','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02032','Fuensanta','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02033','Fuente-Álamo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02034','Fuentealbilla','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02035','Gineta (La)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02036','Golosalvo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02037','Hellín','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02038','Herrera (La)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02039','Higueruela','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02040','Hoya-Gonzalo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02041','Jorquera','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02042','Letur','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02043','Lezuza','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02044','Liétor','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02045','Madrigueras','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02046','Mahora','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02047','Masegoso','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02048','Minaya','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02049','Molinicos','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02050','Montalvos','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02051','Montealegre del Castillo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02052','Motilleja','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02053','Munera','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02054','Navas de Jorquera','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02055','Nerpio','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02056','Ontur','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02057','Ossa de Montiel','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02058','Paterna del Madera','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02059','Peñascosa','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02060','Peñas de San Pedro','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02061','Pétrola','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02062','Povedilla','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02063','Pozohondo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02064','Pozo-Lorente','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02065','Pozuelo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02066','Recueja (La)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02067','Riópar','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02068','Robledo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02069','Roda (La)','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02070','Salobre','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02071','San Pedro','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02072','Socovos','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02073','Tarazona de la Mancha','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02074','Tobarra','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02075','Valdeganga','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02076','Vianos','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02077','Villa de Ves','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02078','Villalgordo del Júcar','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02079','Villamalea','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02080','Villapalacios','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02081','Villarrobledo','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02082','Villatoya','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02083','Villavaliente','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02084','Villaverde de Guadalimar','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02085','Viveros','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02086','Yeste','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'02901','Pozo Cañada','AB','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03001','Atzúbia, l''','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03002','Agost','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03003','Agres','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03004','Aigües','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03005','Albatera','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03006','Alcalalí','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03007','Alcocer de Planes','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03008','Alcoleja','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03009','Alcoy/Alcoi','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03010','Alfafara','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03011','Alfàs del Pi (l'')','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03012','Algorfa','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03013','Algueña','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03014','Alicante/Alacant','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03015','Almoradí','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03016','Almudaina','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03017','Alqueria d''Asnar (l'')','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03018','Altea','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03019','Aspe','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03020','Balones','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03021','Banyeres de Mariola','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03022','Benasau','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03023','Beneixama','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03024','Benejúzar','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03025','Benferri','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03026','Beniarbeig','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03027','Beniardá','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03028','Beniarrés','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03029','Benigembla','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03030','Benidoleig','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03031','Benidorm','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03032','Benifallim','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03033','Benifato','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03034','Benijófar','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03035','Benilloba','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03036','Benillup','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03037','Benimantell','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03038','Benimarfull','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03039','Benimassot','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03040','Benimeli','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03041','Benissa','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03042','Benitachell/Poble Nou de Benitatxell (el)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03043','Biar','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03044','Bigastro','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03045','Bolulla','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03046','Busot','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03047','Calp','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03048','Callosa d''en Sarrià','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03049','Callosa de Segura','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03050','Campello (el)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03051','Campo de Mirra/Camp de Mirra (el)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03052','Cañada','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03053','Castalla','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03054','Castell de Castells','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03055','Catral','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03056','Cocentaina','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03057','Confrides','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03058','Cox','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03059','Crevillent','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03060','Quatretondeta','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03061','Daya Nueva','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03062','Daya Vieja','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03063','Dénia','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03064','Dolores','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03065','Elche/Elx','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03066','Elda','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03067','Facheca','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03068','Famorca','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03069','Finestrat','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03070','Formentera del Segura','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03071','Gata de Gorgos','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03072','Gaianes','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03073','Gorga','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03074','Granja de Rocamora','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03075','Castell de Guadalest (el)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03076','Guardamar del Segura','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03077','Fondó de les Neus (el)/Hondón de las Nieves','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03078','Hondón de los Frailes','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03079','Ibi','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03080','Jacarilla','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03081','Xaló','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03082','Jávea/Xàbia','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03083','Jijona/Xixona','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03084','Lorcha/Orxa (l'')','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03085','Llíber','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03086','Millena','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03088','Monforte del Cid','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03089','Monóvar/Monòver','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03090','Mutxamel','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03091','Murla','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03092','Muro de Alcoy','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03093','Novelda','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03094','Nucia (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03095','Ondara','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03096','Onil','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03097','Orba','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03098','Orxeta','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03099','Orihuela','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03100','Parcent','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03101','Pedreguer','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03102','Pego','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03103','Penàguila','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03104','Petrer','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03105','Pinós (el)/Pinoso','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03106','Planes','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03107','Polop','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03109','Rafal','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03110','Ràfol d''Almúnia (El)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03111','Redován','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03112','Relleu','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03113','Rojales','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03114','Romana (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03115','Sagra','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03116','Salinas','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03117','Sanet y Negrals','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03118','San Fulgencio','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03119','Sant Joan d''Alacant','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03120','San Miguel de Salinas','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03121','Santa Pola','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03122','San Vicente del Raspeig/Sant Vicent del Raspeig','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03123','Sax','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03124','Sella','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03125','Senija','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03127','Tàrbena','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03128','Teulada','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03129','Tibi','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03130','Tollos','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03131','Tormos','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03132','Torremanzanas/Torre de les Maçanes (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03133','Torrevieja','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03134','Vall d''Alcalà (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03135','Vall d''Ebo (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03136','Vall de Gallinera','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03137','Vall de Laguar (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03138','Verger (el)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03139','Villajoyosa/Vila Joiosa (la)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03140','Villena','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03901','Poblets (els)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03902','Pilar de la Horadada','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03903','Montesinos (Los)','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'03904','San Isidro','A','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04001','Abla','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04002','Abrucena','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04003','Adra','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04004','Albanchez','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04005','Alboloduy','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04006','Albox','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04007','Alcolea','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04008','Alcóntar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04009','Alcudia de Monteagud','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04010','Alhabia','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04011','Alhama de Almería','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04012','Alicún','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04013','Almería','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04014','Almócita','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04015','Alsodux','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04016','Antas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04017','Arboleas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04018','Armuña de Almanzora','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04019','Bacares','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04020','Bayárcal','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04021','Bayarque','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04022','Bédar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04023','Beires','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04024','Benahadux','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04026','Benitagla','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04027','Benizalón','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04028','Bentarique','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04029','Berja','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04030','Canjáyar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04031','Cantoria','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04032','Carboneras','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04033','Castro de Filabres','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04034','Cóbdar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04035','Cuevas del Almanzora','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04036','Chercos','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04037','Chirivel','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04038','Dalías','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04041','Enix','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04043','Felix','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04044','Fines','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04045','Fiñana','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04046','Fondón','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04047','Gádor','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04048','Gallardos (Los)','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04049','Garrucha','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04050','Gérgal','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04051','Huécija','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04052','Huércal de Almería','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04053','Huércal-Overa','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04054','Íllar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04055','Instinción','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04056','Laroya','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04057','Láujar de Andarax','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04058','Líjar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04059','Lubrín','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04060','Lucainena de las Torres','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04061','Lúcar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04062','Macael','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04063','María','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04064','Mojácar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04065','Nacimiento','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04066','Níjar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04067','Ohanes','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04068','Olula de Castro','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04069','Olula del Río','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04070','Oria','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04071','Padules','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04072','Partaloa','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04073','Paterna del Río','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04074','Pechina','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04075','Pulpí','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04076','Purchena','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04077','Rágol','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04078','Rioja','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04079','Roquetas de Mar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04080','Santa Cruz de Marchena','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04081','Santa Fe de Mondújar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04082','Senés','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04083','Serón','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04084','Sierro','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04085','Somontín','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04086','Sorbas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04087','Suflí','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04088','Tabernas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04089','Taberno','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04090','Tahal','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04091','Terque','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04092','Tíjola','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04093','Turre','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04094','Turrillas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04095','Uleila del Campo','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04096','Urrácal','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04097','Velefique','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04098','Vélez-Blanco','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04099','Vélez-Rubio','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04100','Vera','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04101','Viator','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04102','Vícar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04103','Zurgena','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04901','Tres Villas (Las)','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04902','Ejido (El)','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04903','Mojonera (La)','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'04904','Balanegra','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05001','Adanero','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05002','Adrada (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05005','Albornos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05007','Aldeanueva de Santa Cruz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05008','Aldeaseca','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05010','Aldehuela (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05012','Amavida','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05013','Arenal (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05014','Arenas de San Pedro','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05015','Arevalillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05016','Arévalo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05017','Aveinte','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05018','Avellaneda','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05019','Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05021','Barco de Ávila (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05022','Barraco (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05023','Barromán','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05024','Becedas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05025','Becedillas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05026','Bercial de Zapardiel','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05027','Berlanas (Las)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05029','Bernuy-Zapardiel','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05030','Berrocalejo de Aragona','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05033','Blascomillán','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05034','Blasconuño de Matacabras','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05035','Blascosancho','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05036','Bohodón (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05037','Bohoyo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05038','Bonilla de la Sierra','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05039','Brabos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05040','Bularros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05041','Burgohondo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05042','Cabezas de Alambre','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05043','Cabezas del Pozo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05044','Cabezas del Villar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05045','Cabizuela','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05046','Canales','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05047','Candeleda','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05048','Cantiveros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05049','Cardeñosa','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05051','Carrera (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05052','Casas del Puerto','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05053','Casasola','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05054','Casavieja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05055','Casillas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05056','Castellanos de Zapardiel','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05057','Cebreros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05058','Cepeda la Mora','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05059','Cillán','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05060','Cisla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05061','Colilla (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05062','Collado de Contreras','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05063','Collado del Mirón','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05064','Constanzana','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05065','Crespos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05066','Cuevas del Valle','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05067','Chamartín','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05069','Donjimeno','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05070','Donvidas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05072','Espinosa de los Caballeros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05073','Flores de Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05074','Fontiveros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05075','Fresnedilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05076','Fresno (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05077','Fuente el Saúz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05078','Fuentes de Año','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05079','Gallegos de Altamiros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05080','Gallegos de Sobrinos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05081','Garganta del Villar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05082','Gavilanes','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05083','Gemuño','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05084','Gilbuena','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05085','Gil García','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05086','Gimialcón','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05087','Gotarrendura','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05088','Grandes y San Martín','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05089','Guisando','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05090','Gutierre-Muñoz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05092','Hernansancho','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05093','Herradón de Pinares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05094','Herreros de Suso','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05095','Higuera de las Dueñas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05096','Hija de Dios (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05097','Horcajada (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05099','Horcajo de las Torres','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05100','Hornillo (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05101','Hoyocasero','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05102','Hoyo de Pinares (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05103','Hoyorredondo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05104','Hoyos del Collado','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05105','Hoyos del Espino','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05106','Hoyos de Miguel Muñoz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05107','Hurtumpascual','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05108','Junciana','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05109','Langa','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05110','Lanzahíta','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05112','Losar del Barco (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05113','Llanos de Tormes (Los)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05114','Madrigal de las Altas Torres','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05115','Maello','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05116','Malpartida de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05117','Mamblas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05118','Mancera de Arriba','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05119','Manjabálago y Ortigosa de Rioalmar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05120','Marlín','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05121','Martiherrero','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05122','Martínez','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05123','Mediana de Voltoya','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05124','Medinilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05125','Mengamuñoz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05126','Mesegar de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05127','Mijares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05128','Mingorría','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05129','Mirón (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05130','Mironcillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05131','Mirueña de los Infanzones','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05132','Mombeltrán','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05133','Monsalupe','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05134','Moraleja de Matacabras','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05135','Muñana','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05136','Muñico','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05138','Muñogalindo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05139','Muñogrande','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05140','Muñomer del Peco','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05141','Muñopepe','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05142','Muñosancho','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05143','Muñotello','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05144','Narrillos del Álamo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05145','Narrillos del Rebollar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05147','Narros del Castillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05148','Narros del Puerto','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05149','Narros de Saldueña','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05151','Navacepedilla de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05152','Nava de Arévalo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05153','Nava del Barco','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05154','Navadijos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05155','Navaescurial','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05156','Navahondilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05157','Navalacruz','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05158','Navalmoral','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05159','Navalonguilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05160','Navalosa','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05161','Navalperal de Pinares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05162','Navalperal de Tormes','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05163','Navaluenga','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05164','Navaquesera','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05165','Navarredonda de Gredos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05166','Navarredondilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05167','Navarrevisca','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05168','Navas del Marqués (Las)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05169','Navatalgordo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05170','Navatejares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05171','Neila de San Miguel','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05172','Niharra','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05173','Ojos-Albos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05174','Orbita','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05175','Oso (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05176','Padiernos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05177','Pajares de Adaja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05178','Palacios de Goda','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05179','Papatrigo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05180','Parral (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05181','Pascualcobo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05182','Pedro Bernardo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05183','Pedro-Rodríguez','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05184','Peguerinos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05185','Peñalba de Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05186','Piedrahíta','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05187','Piedralaves','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05188','Poveda','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05189','Poyales del Hoyo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05190','Pozanco','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05191','Pradosegar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05192','Puerto Castilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05193','Rasueros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05194','Riocabado','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05195','Riofrío','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05196','Rivilla de Barajas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05197','Salobral','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05198','Salvadiós','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05199','San Bartolomé de Béjar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05200','San Bartolomé de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05201','San Bartolomé de Pinares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05204','Sanchidrián','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05205','Sanchorreja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05206','San Esteban de los Patos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05207','San Esteban del Valle','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05208','San Esteban de Zapardiel','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05209','San García de Ingelmos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05210','San Juan de la Encinilla','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05211','San Juan de la Nava','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05212','San Juan del Molinillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05213','San Juan del Olmo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05214','San Lorenzo de Tormes','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05215','San Martín de la Vega del Alberche','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05216','San Martín del Pimpollar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05217','San Miguel de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05218','San Miguel de Serrezuela','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05219','San Pascual','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05220','San Pedro del Arroyo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05221','Santa Cruz del Valle','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05222','Santa Cruz de Pinares','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05224','Santa María del Arroyo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05225','Santa María del Berrocal','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05226','Santa María de los Caballeros','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05227','Santa María del Tiétar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05228','Santiago del Collado','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05229','Santo Domingo de las Posadas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05230','Santo Tomé de Zabarcos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05231','San Vicente de Arévalo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05232','Serrada (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05233','Serranillos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05234','Sigeres','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05235','Sinlabajos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05236','Solana de Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05237','Solana de Rioalmar','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05238','Solosancho','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05239','Sotalbo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05240','Sotillo de la Adrada','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05241','Tiemblo (El)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05242','Tiñosillos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05243','Tolbaños','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05244','Tormellas','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05245','Tornadizos de Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05246','Tórtoles','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05247','Torre (La)','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05249','Umbrías','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05251','Vadillo de la Sierra','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05252','Valdecasa','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05253','Vega de Santa María','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05254','Velayos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05256','Villaflor','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05257','Villafranca de la Sierra','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05258','Villanueva de Gómez','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05259','Villanueva del Aceral','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05260','Villanueva del Campillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05261','Villar de Corneja','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05262','Villarejo del Valle','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05263','Villatoro','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05264','Viñegra de Moraña','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05265','Vita','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05266','Zapardiel de la Cañada','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05267','Zapardiel de la Ribera','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05901','San Juan de Gredos','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05902','Santa María del Cubillo','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05903','Diego del Carpio','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05904','Santiago del Tormes','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'05905','Villanueva de Ávila','AV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06001','Acedera','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06002','Aceuchal','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06003','Ahillones','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06004','Alange','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06005','Albuera (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06006','Alburquerque','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06007','Alconchel','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06008','Alconera','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06009','Aljucén','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06010','Almendral','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06011','Almendralejo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06012','Arroyo de San Serván','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06013','Atalaya','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06014','Azuaga','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06015','Badajoz','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06016','Barcarrota','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06017','Baterno','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06018','Benquerencia de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06019','Berlanga','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06020','Bienvenida','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06021','Bodonal de la Sierra','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06022','Burguillos del Cerro','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06023','Cabeza del Buey','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06024','Cabeza la Vaca','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06025','Calamonte','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06026','Calera de León','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06027','Calzadilla de los Barros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06028','Campanario','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06029','Campillo de Llerena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06030','Capilla','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06031','Carmonita','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06032','Carrascalejo (El)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06033','Casas de Don Pedro','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06034','Casas de Reina','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06035','Castilblanco','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06036','Castuera','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06037','Codosera (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06038','Cordobilla de Lácara','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06039','Coronada (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06040','Corte de Peleas','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06041','Cristina','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06042','Cheles','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06043','Don Álvaro','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06044','Don Benito','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06045','Entrín Bajo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06046','Esparragalejo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06047','Esparragosa de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06048','Esparragosa de Lares','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06049','Feria','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06050','Fregenal de la Sierra','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06051','Fuenlabrada de los Montes','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06052','Fuente de Cantos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06053','Fuente del Arco','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06054','Fuente del Maestre','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06055','Fuentes de León','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06056','Garbayuela','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06057','Garlitos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06058','Garrovilla (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06059','Granja de Torrehermosa','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06060','Guareña','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06061','Haba (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06062','Helechosa de los Montes','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06063','Herrera del Duque','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06064','Higuera de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06065','Higuera de Llerena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06066','Higuera de Vargas','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06067','Higuera la Real','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06068','Hinojosa del Valle','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06069','Hornachos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06070','Jerez de los Caballeros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06071','Lapa (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06072','Lobón','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06073','Llera','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06074','Llerena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06075','Magacela','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06076','Maguilla','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06077','Malcocinado','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06078','Malpartida de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06079','Manchita','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06080','Medellín','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06081','Medina de las Torres','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06082','Mengabril','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06083','Mérida','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06084','Mirandilla','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06085','Monesterio','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06086','Montemolín','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06087','Monterrubio de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06088','Montijo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06089','Morera (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06090','Nava de Santiago (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06091','Navalvillar de Pela','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06092','Nogales','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06093','Oliva de la Frontera','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06094','Oliva de Mérida','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06095','Olivenza','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06096','Orellana de la Sierra','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06097','Orellana la Vieja','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06098','Palomas','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06099','Parra (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06100','Peñalsordo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06101','Peraleda del Zaucejo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06102','Puebla de Alcocer','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06103','Puebla de la Calzada','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06104','Puebla de la Reina','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06105','Puebla del Maestre','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06106','Puebla del Prior','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06107','Puebla de Obando','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06108','Puebla de Sancho Pérez','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06109','Quintana de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06110','Reina','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06111','Rena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06112','Retamal de Llerena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06113','Ribera del Fresno','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06114','Risco','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06115','Roca de la Sierra (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06116','Salvaleón','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06117','Salvatierra de los Barros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06118','Sancti-Spíritus','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06119','San Pedro de Mérida','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06120','Santa Amalia','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06121','Santa Marta','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06122','Santos de Maimona (Los)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06123','San Vicente de Alcántara','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06124','Segura de León','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06125','Siruela','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06126','Solana de los Barros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06127','Talarrubias','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06128','Talavera la Real','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06129','Táliga','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06130','Tamurejo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06131','Torre de Miguel Sesmero','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06132','Torremayor','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06133','Torremejía','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06134','Trasierra','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06135','Trujillanos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06136','Usagre','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06137','Valdecaballeros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06138','Valdetorres','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06139','Valencia de las Torres','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06140','Valencia del Mombuey','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06141','Valencia del Ventoso','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06142','Valverde de Burguillos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06143','Valverde de Leganés','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06144','Valverde de Llerena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06145','Valverde de Mérida','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06146','Valle de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06147','Valle de Matamoros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06148','Valle de Santa Ana','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06149','Villafranca de los Barros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06150','Villagarcía de la Torre','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06151','Villagonzalo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06152','Villalba de los Barros','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06153','Villanueva de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06154','Villanueva del Fresno','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06155','Villar del Rey','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06156','Villar de Rena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06157','Villarta de los Montes','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06158','Zafra','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06159','Zahínos','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06160','Zalamea de la Serena','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06161','Zarza-Capilla','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06162','Zarza (La)','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06901','Valdelacalzada','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06902','Pueblonuevo del Guadiana','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'06903','Guadiana del Caudillo','BA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08001','Abrera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08002','Aguilar de Segarra','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08003','Alella','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08004','Alpens','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08005','Ametlla del Vallès (L'')','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08006','Arenys de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08007','Arenys de Munt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08008','Argençola','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08009','Argentona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08010','Artés','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08011','Avià','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08012','Avinyó','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08013','Avinyonet del Penedès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08014','Aiguafreda','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08015','Badalona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08016','Bagà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08017','Balenyà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08018','Balsareny','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08019','Barcelona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08020','Begues','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08021','Bellprat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08022','Berga','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08023','Bigues i Riells','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08024','Borredà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08025','Bruc (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08026','Brull (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08027','Cabanyes (Les)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08028','Cabrera d''Anoia','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08029','Cabrera de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08030','Cabrils','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08031','Calaf','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08032','Caldes d''Estrac','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08033','Caldes de Montbui','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08034','Calders','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08035','Calella','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08036','Calonge de Segarra','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08037','Calldetenes','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08038','Callús','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08039','Campins','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08040','Canet de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08041','Canovelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08042','Cànoves i Samalús','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08043','Canyelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08044','Capellades','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08045','Capolat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08046','Cardedeu','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08047','Cardona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08048','Carme','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08049','Casserres','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08050','Castellar del Riu','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08051','Castellar del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08052','Castellar de n''Hug','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08053','Castellbell i el Vilar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08054','Castellbisbal','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08055','Castellcir','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08056','Castelldefels','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08057','Castell de l''Areny','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08058','Castellet i la Gornal','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08059','Castellfollit del Boix','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08060','Castellfollit de Riubregós','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08061','Castellgalí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08062','Castellnou de Bages','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08063','Castellolí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08064','Castellterçol','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08065','Castellví de la Marca','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08066','Castellví de Rosanes','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08067','Centelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08068','Cervelló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08069','Collbató','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08070','Collsuspina','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08071','Copons','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08072','Corbera de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08073','Cornellà de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08074','Cubelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08075','Dosrius','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08076','Esparreguera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08077','Esplugues de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08078','Espunyola (L'')','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08079','Estany (L'')','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08080','Fígols','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08081','Fogars de Montclús','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08082','Fogars de la Selva','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08083','Folgueroles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08084','Fonollosa','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08085','Font-rubí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08086','Franqueses del Vallès (Les)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08087','Gallifa','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08088','Garriga (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08089','Gavà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08090','Gaià','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08091','Gelida','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08092','Gironella','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08093','Gisclareny','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08094','Granada (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08095','Granera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08096','Granollers','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08097','Gualba','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08098','Sant Salvador de Guardiola','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08099','Guardiola de Berguedà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08100','Gurb','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08101','Hospitalet de Llobregat (L'')','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08102','Igualada','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08103','Jorba','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08104','Llacuna (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08105','Llagosta (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08106','Llinars del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08107','Lliçà d''Amunt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08108','Lliçà de Vall','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08109','Lluçà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08110','Malgrat de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08111','Malla','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08112','Manlleu','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08113','Manresa','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08114','Martorell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08115','Martorelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08116','Masies de Roda (Les)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08117','Masies de Voltregà (Les)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08118','Masnou (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08119','Masquefa','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08120','Matadepera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08121','Mataró','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08122','Mediona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08123','Molins de Rei','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08124','Mollet del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08125','Montcada i Reixac','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08126','Montgat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08127','Monistrol de Montserrat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08128','Monistrol de Calders','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08129','Muntanyola','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08130','Montclar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08131','Montesquiu','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08132','Montmajor','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08133','Montmaneu','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08134','Figaró-Montmany','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08135','Montmeló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08136','Montornès del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08137','Montseny','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08138','Moià','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08139','Mura','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08140','Navarcles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08141','Navàs','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08142','Nou de Berguedà (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08143','Òdena','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08144','Olvan','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08145','Olèrdola','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08146','Olesa de Bonesvalls','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08147','Olesa de Montserrat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08148','Olivella','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08149','Olost','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08150','Orís','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08151','Oristà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08152','Orpí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08153','Òrrius','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08154','Pacs del Penedès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08155','Palafolls','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08156','Palau-solità i Plegamans','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08157','Pallejà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08158','Papiol (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08159','Parets del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08160','Perafita','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08161','Piera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08162','Hostalets de Pierola (Els)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08163','Pineda de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08164','Pla del Penedès (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08165','Pobla de Claramunt (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08166','Pobla de Lillet (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08167','Polinyà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08168','Pontons','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08169','Prat de Llobregat (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08170','Prats de Rei (Els)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08171','Prats de Lluçanès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08172','Premià de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08174','Puigdàlber','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08175','Puig-reig','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08176','Pujalt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08177','Quar (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08178','Rajadell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08179','Rellinars','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08180','Ripollet','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08181','Roca del Vallès (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08182','Pont de Vilomara i Rocafort (El)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08183','Roda de Ter','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08184','Rubí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08185','Rubió','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08187','Sabadell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08188','Sagàs','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08189','Sant Pere Sallavinera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08190','Saldes','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08191','Sallent','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08192','Santpedor','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08193','Sant Iscle de Vallalta','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08194','Sant Adrià de Besòs','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08195','Sant Agustí de Lluçanès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08196','Sant Andreu de la Barca','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08197','Sant Andreu de Llavaneres','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08198','Sant Antoni de Vilamajor','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08199','Sant Bartomeu del Grau','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08200','Sant Boi de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08201','Sant Boi de Lluçanès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08202','Sant Celoni','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08203','Sant Cebrià de Vallalta','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08204','Sant Climent de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08205','Sant Cugat del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08206','Sant Cugat Sesgarrigues','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08207','Sant Esteve de Palautordera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08208','Sant Esteve Sesrovires','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08209','Sant Fost de Campsentelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08210','Sant Feliu de Codines','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08211','Sant Feliu de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08212','Sant Feliu Sasserra','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08213','Sant Fruitós de Bages','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08214','Vilassar de Dalt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08215','Sant Hipòlit de Voltregà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08216','Sant Jaume de Frontanyà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08217','Sant Joan Despí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08218','Sant Joan de Vilatorrada','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08219','Vilassar de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08220','Sant Julià de Vilatorta','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08221','Sant Just Desvern','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08222','Sant Llorenç d''Hortons','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08223','Sant Llorenç Savall','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08224','Sant Martí de Centelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08225','Sant Martí d''Albars','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08226','Sant Martí de Tous','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08227','Sant Martí Sarroca','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08228','Sant Martí Sesgueioles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08229','Sant Mateu de Bages','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08230','Premià de Dalt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08231','Sant Pere de Ribes','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08232','Sant Pere de Riudebitlles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08233','Sant Pere de Torelló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08234','Sant Pere de Vilamajor','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08235','Sant Pol de Mar','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08236','Sant Quintí de Mediona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08237','Sant Quirze de Besora','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08238','Sant Quirze del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08239','Sant Quirze Safaja','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08240','Sant Sadurní d''Anoia','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08241','Sant Sadurní d''Osormort','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08242','Marganell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08243','Santa Cecília de Voltregà','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08244','Santa Coloma de Cervelló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08245','Santa Coloma de Gramenet','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08246','Santa Eugènia de Berga','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08247','Santa Eulàlia de Riuprimer','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08248','Santa Eulàlia de Ronçana','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08249','Santa Fe del Penedès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08250','Santa Margarida de Montbui','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08251','Santa Margarida i els Monjos','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08252','Barberà del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08253','Santa Maria de Besora','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08254','Esquirol, L''','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08255','Santa Maria de Merlès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08256','Santa Maria de Martorelles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08257','Santa Maria de Miralles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08258','Santa Maria d''Oló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08259','Santa Maria de Palautordera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08260','Santa Perpètua de Mogoda','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08261','Santa Susanna','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08262','Sant Vicenç de Castellet','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08263','Sant Vicenç dels Horts','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08264','Sant Vicenç de Montalt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08265','Sant Vicenç de Torelló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08266','Cerdanyola del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08267','Sentmenat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08268','Cercs','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08269','Seva','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08270','Sitges','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08271','Sobremunt','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08272','Sora','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08273','Subirats','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08274','Súria','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08275','Tavèrnoles','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08276','Tagamanent','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08277','Talamanca','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08278','Taradell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08279','Terrassa','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08280','Tavertet','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08281','Teià','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08282','Tiana','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08283','Tona','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08284','Tordera','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08285','Torelló','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08286','Torre de Claramunt (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08287','Torrelavit','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08288','Torrelles de Foix','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08289','Torrelles de Llobregat','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08290','Ullastrell','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08291','Vacarisses','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08292','Vallbona d''Anoia','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08293','Vallcebre','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08294','Vallgorguina','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08295','Vallirana','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08296','Vallromanes','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08297','Veciana','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08298','Vic','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08299','Vilada','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08300','Viladecavalls','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08301','Viladecans','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08302','Vilanova del Camí','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08303','Vilanova de Sau','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08304','Vilobí del Penedès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08305','Vilafranca del Penedès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08306','Vilalba Sasserra','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08307','Vilanova i la Geltrú','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08308','Viver i Serrateix','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08901','Rupit i Pruit','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08902','Vilanova del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08903','Sant Julià de Cerdanyola','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08904','Badia del Vallès','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'08905','Palma de Cervelló (La)','B','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09001','Abajas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09003','Adrada de Haza','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09006','Aguas Cándidas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09007','Aguilar de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09009','Albillos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09010','Alcocero de Mola','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09011','Alfoz de Bricia','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09012','Alfoz de Santa Gadea','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09013','Altable','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09014','Altos (Los)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09016','Ameyugo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09017','Anguix','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09018','Aranda de Duero','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09019','Arandilla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09020','Arauzo de Miel','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09021','Arauzo de Salce','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09022','Arauzo de Torre','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09023','Arcos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09024','Arenillas de Riopisuerga','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09025','Arija','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09026','Arlanzón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09027','Arraya de Oca','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09029','Atapuerca','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09030','Ausines (Los)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09032','Avellanosa de Muñó','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09033','Bahabón de Esgueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09034','Balbases (Los)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09035','Baños de Valdearados','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09036','Bañuelos de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09037','Barbadillo de Herreros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09038','Barbadillo del Mercado','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09039','Barbadillo del Pez','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09041','Barrio de Muñó','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09043','Barrios de Bureba (Los)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09044','Barrios de Colina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09045','Basconcillos del Tozo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09046','Bascuñana','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09047','Belbimbre','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09048','Belorado','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09050','Berberana','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09051','Berlangas de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09052','Berzosa de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09054','Bozoó','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09055','Brazacorta','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09056','Briviesca','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09057','Bugedo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09058','Buniel','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09059','Burgos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09060','Busto de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09061','Cabañes de Esgueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09062','Cabezón de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09063','Cavia','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09064','Caleruega','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09065','Campillo de Aranda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09066','Campolara','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09067','Canicosa de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09068','Cantabrana','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09070','Carazo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09071','Carcedo de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09072','Carcedo de Burgos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09073','Cardeñadijo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09074','Cardeñajimeno','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09075','Cardeñuela Riopico','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09076','Carrias','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09077','Cascajares de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09078','Cascajares de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09079','Castellanos de Castro','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09082','Castildelgado','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09083','Castil de Peones','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09084','Castrillo de la Reina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09085','Castrillo de la Vega','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09086','Castrillo del Val','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09088','Castrillo de Riopisuerga','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09090','Castrillo Mota de Judíos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09091','Castrojeriz','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09093','Cayuela','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09094','Cebrecos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09095','Celada del Camino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09098','Cerezo de Río Tirón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09100','Cerratón de Juarros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09101','Ciadoncha','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09102','Cillaperlata','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09103','Cilleruelo de Abajo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09104','Cilleruelo de Arriba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09105','Ciruelos de Cervera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09108','Cogollos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09109','Condado de Treviño','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09110','Contreras','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09112','Coruña del Conde','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09113','Covarrubias','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09114','Cubillo del Campo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09115','Cubo de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09117','Cueva de Roa (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09119','Cuevas de San Clemente','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09120','Encío','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09122','Espinosa de Cervera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09123','Espinosa del Camino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09124','Espinosa de los Monteros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09125','Estépar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09127','Fontioso','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09128','Frandovínez','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09129','Fresneda de la Sierra Tirón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09130','Fresneña','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09131','Fresnillo de las Dueñas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09132','Fresno de Río Tirón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09133','Fresno de Rodilla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09134','Frías','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09135','Fuentebureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09136','Fuentecén','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09137','Fuentelcésped','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09138','Fuentelisendo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09139','Fuentemolinos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09140','Fuentenebro','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09141','Fuentespina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09143','Galbarros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09144','Gallega (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09148','Grijalba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09149','Grisaleña','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09151','Gumiel de Izán','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09152','Gumiel de Mercado','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09154','Hacinas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09155','Haza','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09159','Hontanas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09160','Hontangas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09162','Hontoria de la Cantera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09163','Hontoria del Pinar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09164','Hontoria de Valdearados','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09166','Hormazas (Las)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09167','Hornillos del Camino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09168','Horra (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09169','Hortigüela','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09170','Hoyales de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09172','Huérmeces','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09173','Huerta de Arriba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09174','Huerta de Rey','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09175','Humada','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09176','Hurones','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09177','Ibeas de Juarros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09178','Ibrillos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09179','Iglesiarrubia','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09180','Iglesias','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09181','Isar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09182','Itero del Castillo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09183','Jaramillo de la Fuente','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09184','Jaramillo Quemado','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09189','Junta de Traslaloma','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09190','Junta de Villalba de Losa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09191','Jurisdicción de Lara','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09192','Jurisdicción de San Zadornil','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09194','Lerma','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09195','Llano de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09196','Madrigal del Monte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09197','Madrigalejo del Monte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09198','Mahamud','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09199','Mambrilla de Castrejón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09200','Mambrillas de Lara','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09201','Mamolar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09202','Manciles','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09206','Mazuela','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09208','Mecerreyes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09209','Medina de Pomar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09211','Melgar de Fernamental','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09213','Merindad de Cuesta-Urria','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09214','Merindad de Montija','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09215','Merindad de Sotoscueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09216','Merindad de Valdeporres','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09217','Merindad de Valdivielso','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09218','Milagros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09219','Miranda de Ebro','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09220','Miraveche','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09221','Modúbar de la Emparedada','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09223','Monasterio de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09224','Monasterio de Rodilla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09225','Moncalvillo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09226','Monterrubio de la Demanda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09227','Montorio','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09228','Moradillo de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09229','Nava de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09230','Navas de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09231','Nebreda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09232','Neila','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09235','Olmedillo de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09236','Olmillos de Muñó','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09238','Oña','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09239','Oquillas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09241','Orbaneja Riopico','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09242','Padilla de Abajo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09243','Padilla de Arriba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09244','Padrones de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09246','Palacios de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09247','Palacios de Riopisuerga','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09248','Palazuelos de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09249','Palazuelos de Muñó','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09250','Pampliega','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09251','Pancorbo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09253','Pardilla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09255','Partido de la Sierra en Tobalina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09256','Pedrosa de Duero','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09257','Pedrosa del Páramo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09258','Pedrosa del Príncipe','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09259','Pedrosa de Río Úrbel','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09261','Peñaranda de Duero','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09262','Peral de Arlanza','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09265','Piérnigas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09266','Pineda de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09267','Pineda Trasmonte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09268','Pinilla de los Barruecos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09269','Pinilla de los Moros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09270','Pinilla Trasmonte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09272','Poza de la Sal','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09273','Prádanos de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09274','Pradoluengo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09275','Presencio','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09276','Puebla de Arganzón (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09277','Puentedura','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09279','Quemada','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09280','Quintanabureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09281','Quintana del Pidio','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09283','Quintanaélez','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09287','Quintanaortuño','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09288','Quintanapalla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09289','Quintanar de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09292','Quintanavides','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09294','Quintanilla de la Mata','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09295','Quintanilla del Coco','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09297','Quintanillas (Las)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09298','Quintanilla San García','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09301','Quintanilla Vivar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09302','Rabanera del Pinar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09303','Rábanos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09304','Rabé de las Calzadas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09306','Rebolledo de la Torre','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09307','Redecilla del Camino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09308','Redecilla del Campo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09309','Regumiel de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09310','Reinoso','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09311','Retuerta','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09312','Revilla y Ahedo (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09314','Revilla del Campo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09315','Revillarruz','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09316','Revilla Vallejera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09317','Rezmondo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09318','Riocavado de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09321','Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09323','Rojas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09325','Royuela de Río Franco','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09326','Rubena','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09327','Rublacedo de Abajo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09328','Rucandio','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09329','Salas de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09330','Salas de los Infantes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09332','Saldaña de Burgos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09334','Salinillas de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09335','San Adrián de Juarros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09337','San Juan del Monte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09338','San Mamés de Burgos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09339','San Martín de Rubiales','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09340','San Millán de Lara','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09343','Santa Cecilia','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09345','Santa Cruz de la Salceda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09346','Santa Cruz del Valle Urbión','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09347','Santa Gadea del Cid','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09348','Santa Inés','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09350','Santa María del Campo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09351','Santa María del Invierno','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09352','Santa María del Mercadillo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09353','Santa María Rivarredonda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09354','Santa Olalla de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09355','Santibáñez de Esgueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09356','Santibáñez del Val','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09358','Santo Domingo de Silos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09360','San Vicente del Valle','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09361','Sargentes de la Lora','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09362','Sarracín','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09363','Sasamón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09365','Sequera de Haza (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09366','Solarana','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09368','Sordillos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09369','Sotillo de la Ribera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09372','Sotragero','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09373','Sotresgudo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09374','Susinos del Páramo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09375','Tamarón','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09377','Tardajos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09378','Tejada','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09380','Terradillos de Esgueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09381','Tinieblas de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09382','Tobar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09384','Tordómar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09386','Torrecilla del Monte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09387','Torregalindo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09388','Torrelara','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09389','Torrepadre','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09390','Torresandino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09391','Tórtoles de Esgueva','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09392','Tosantos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09394','Trespaderne','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09395','Tubilla del Agua','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09396','Tubilla del Lago','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09398','Úrbel del Castillo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09400','Vadocondes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09403','Valdeande','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09405','Valdezate','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09406','Valdorros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09407','Valmala','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09408','Vallarta de Bureba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09409','Valle de Manzanedo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09410','Valle de Mena','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09411','Valle de Oca','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09412','Valle de Tobalina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09413','Valle de Valdebezana','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09414','Valle de Valdelaguna','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09415','Valle de Valdelucio','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09416','Valle de Zamanzas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09417','Vallejera','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09418','Valles de Palenzuela','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09419','Valluércanes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09421','Vid y Barrios (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09422','Vid de Bureba (La)','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09423','Vileña','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09424','Viloria de Rioja','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09425','Vilviestre del Pinar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09427','Villadiego','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09428','Villaescusa de Roa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09429','Villaescusa la Sombría','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09430','Villaespasa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09431','Villafranca Montes de Oca','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09432','Villafruela','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09433','Villagalijo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09434','Villagonzalo Pedernales','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09437','Villahoz','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09438','Villalba de Duero','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09439','Villalbilla de Burgos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09440','Villalbilla de Gumiel','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09441','Villaldemiro','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09442','Villalmanzo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09443','Villamayor de los Montes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09444','Villamayor de Treviño','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09445','Villambistia','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09446','Villamedianilla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09447','Villamiel de la Sierra','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09448','Villangómez','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09449','Villanueva de Argaño','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09450','Villanueva de Carazo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09451','Villanueva de Gumiel','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09454','Villanueva de Teba','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09455','Villaquirán de la Puebla','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09456','Villaquirán de los Infantes','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09458','Villariezo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09460','Villasandino','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09463','Villasur de Herreros','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09464','Villatuelda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09466','Villaverde del Monte','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09467','Villaverde-Mogina','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09471','Villayerno Morquillas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09472','Villazopeque','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09473','Villegas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09476','Villoruebo','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09478','Vizcaínos','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09480','Zael','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09482','Zarzosa de Río Pisuerga','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09483','Zazuar','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09485','Zuñeda','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09901','Quintanilla del Agua y Tordueles','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09902','Valle de Santibáñez','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09903','Villarcayo de Merindad de Castilla la Vieja','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09904','Valle de las Navas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09905','Valle de Sedano','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09906','Merindad de Río Ubierna','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09907','Alfoz de Quintanadueñas','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'09908','Valle de Losa','BU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10001','Abadía','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10002','Abertura','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10003','Acebo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10004','Acehúche','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10005','Aceituna','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10006','Ahigal','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10007','Albalá','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10008','Alcántara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10009','Alcollarín','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10010','Alcuéscar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10011','Aldeacentenera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10012','Aldea del Cano','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10013','Aldea del Obispo (La)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10014','Aldeanueva de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10015','Aldeanueva del Camino','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10016','Aldehuela de Jerte','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10017','Alía','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10018','Aliseda','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10019','Almaraz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10020','Almoharín','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10021','Arroyo de la Luz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10022','Arroyomolinos de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10023','Arroyomolinos','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10024','Baños de Montemayor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10025','Barrado','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10026','Belvís de Monroy','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10027','Benquerencia','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10028','Berrocalejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10029','Berzocana','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10030','Bohonal de Ibor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10031','Botija','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10032','Brozas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10033','Cabañas del Castillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10034','Cabezabellosa','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10035','Cabezuela del Valle','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10036','Cabrero','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10037','Cáceres','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10038','Cachorrilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10039','Cadalso','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10040','Calzadilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10041','Caminomorisco','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10042','Campillo de Deleitosa','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10043','Campo Lugar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10044','Cañamero','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10045','Cañaveral','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10046','Carbajo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10047','Carcaboso','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10048','Carrascalejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10049','Casar de Cáceres','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10050','Casar de Palomero','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10051','Casares de las Hurdes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10052','Casas de Don Antonio','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10053','Casas de Don Gómez','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10054','Casas del Castañar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10055','Casas del Monte','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10056','Casas de Millán','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10057','Casas de Miravete','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10058','Casatejada','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10059','Casillas de Coria','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10060','Castañar de Ibor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10061','Ceclavín','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10062','Cedillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10063','Cerezo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10064','Cilleros','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10065','Collado de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10066','Conquista de la Sierra','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10067','Coria','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10068','Cuacos de Yuste','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10069','Cumbre (La)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10070','Deleitosa','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10071','Descargamaría','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10072','Eljas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10073','Escurial','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10075','Fresnedoso de Ibor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10076','Galisteo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10077','Garciaz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10078','Garganta (La)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10079','Garganta la Olla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10080','Gargantilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10081','Gargüera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10082','Garrovillas de Alconétar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10083','Garvín','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10084','Gata','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10085','Gordo (El)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10086','Granja (La)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10087','Guadalupe','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10088','Guijo de Coria','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10089','Guijo de Galisteo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10090','Guijo de Granadilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10091','Guijo de Santa Bárbara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10092','Herguijuela','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10093','Hernán-Pérez','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10094','Herrera de Alcántara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10095','Herreruela','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10096','Hervás','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10097','Higuera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10098','Hinojal','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10099','Holguera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10100','Hoyos','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10101','Huélaga','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10102','Ibahernando','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10103','Jaraicejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10104','Jaraíz de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10105','Jarandilla de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10106','Jarilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10107','Jerte','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10108','Ladrillar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10109','Logrosán','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10110','Losar de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10111','Madrigal de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10112','Madrigalejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10113','Madroñera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10114','Majadas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10115','Malpartida de Cáceres','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10116','Malpartida de Plasencia','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10117','Marchagaz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10118','Mata de Alcántara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10119','Membrío','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10120','Mesas de Ibor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10121','Miajadas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10122','Millanes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10123','Mirabel','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10124','Mohedas de Granadilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10125','Monroy','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10126','Montánchez','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10127','Montehermoso','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10128','Moraleja','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10129','Morcillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10130','Navaconcejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10131','Navalmoral de la Mata','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10132','Navalvillar de Ibor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10133','Navas del Madroño','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10134','Navezuelas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10135','Nuñomoral','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10136','Oliva de Plasencia','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10137','Palomero','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10138','Pasarón de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10139','Pedroso de Acim','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10140','Peraleda de la Mata','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10141','Peraleda de San Román','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10142','Perales del Puerto','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10143','Pescueza','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10144','Pesga (La)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10145','Piedras Albas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10146','Pinofranqueado','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10147','Piornal','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10148','Plasencia','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10149','Plasenzuela','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10150','Portaje','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10151','Portezuelo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10152','Pozuelo de Zarzón','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10153','Puerto de Santa Cruz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10154','Rebollar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10155','Riolobos','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10156','Robledillo de Gata','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10157','Robledillo de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10158','Robledillo de Trujillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10159','Robledollano','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10160','Romangordo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10161','Ruanes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10162','Salorino','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10163','Salvatierra de Santiago','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10164','San Martín de Trevejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10165','Santa Ana','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10166','Santa Cruz de la Sierra','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10167','Santa Cruz de Paniagua','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10168','Santa Marta de Magasca','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10169','Santiago de Alcántara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10170','Santiago del Campo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10171','Santibáñez el Alto','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10172','Santibáñez el Bajo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10173','Saucedilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10174','Segura de Toro','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10175','Serradilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10176','Serrejón','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10177','Sierra de Fuentes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10178','Talaván','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10179','Talaveruela de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10180','Talayuela','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10181','Tejeda de Tiétar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10182','Toril','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10183','Tornavacas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10184','Torno (El)','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10185','Torrecilla de los Ángeles','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10186','Torrecillas de la Tiesa','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10187','Torre de Don Miguel','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10188','Torre de Santa María','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10189','Torrejoncillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10190','Torrejón el Rubio','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10191','Torremenga','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10192','Torremocha','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10193','Torreorgaz','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10194','Torrequemada','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10195','Trujillo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10196','Valdastillas','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10197','Valdecañas de Tajo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10198','Valdefuentes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10199','Valdehúncar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10200','Valdelacasa de Tajo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10201','Valdemorales','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10202','Valdeobispo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10203','Valencia de Alcántara','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10204','Valverde de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10205','Valverde del Fresno','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10206','Viandar de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10207','Villa del Campo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10208','Villa del Rey','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10209','Villamesías','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10210','Villamiel','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10211','Villanueva de la Sierra','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10212','Villanueva de la Vera','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10213','Villar del Pedroso','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10214','Villar de Plasencia','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10215','Villasbuenas de Gata','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10216','Zarza de Granadilla','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10217','Zarza de Montánchez','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10218','Zarza la Mayor','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10219','Zorita','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10901','Rosalejo','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10902','Vegaviana','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10903','Alagón del Río','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10904','Tiétar','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'10905','Pueblonuevo de Miramontes','CC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11001','Alcalá de los Gazules','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11002','Alcalá del Valle','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11003','Algar','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11004','Algeciras','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11005','Algodonales','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11006','Arcos de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11007','Barbate','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11008','Barrios (Los)','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11009','Benaocaz','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11010','Bornos','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11011','Bosque (El)','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11012','Cádiz','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11013','Castellar de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11014','Conil de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11015','Chiclana de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11016','Chipiona','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11017','Espera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11018','Gastor (El)','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11019','Grazalema','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11020','Jerez de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11021','Jimena de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11022','Línea de la Concepción (La)','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11023','Medina Sidonia','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11024','Olvera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11025','Paterna de Rivera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11026','Prado del Rey','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11027','Puerto de Santa María (El)','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11028','Puerto Real','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11029','Puerto Serrano','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11030','Rota','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11031','San Fernando','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11032','Sanlúcar de Barrameda','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11033','San Roque','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11034','Setenil de las Bodegas','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11035','Tarifa','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11036','Torre Alháquime','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11037','Trebujena','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11038','Ubrique','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11039','Vejer de la Frontera','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11040','Villaluenga del Rosario','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11041','Villamartín','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11042','Zahara','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11901','Benalup-Casas Viejas','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11902','San José del Valle','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'11903','San Martín del Tesorillo','CA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12001','Atzeneta del Maestrat','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12002','Aín','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12003','Albocàsser','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12004','Alcalà de Xivert','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12005','Alcora (l'')','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12006','Alcudia de Veo','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12007','Alfondeguilla','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12008','Algimia de Almonacid','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12009','Almassora','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12010','Almedíjar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12011','Almenara','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12012','Altura','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12013','Arañuel','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12014','Ares del Maestrat','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12015','Argelita','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12016','Artana','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12017','Ayódar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12018','Azuébar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12020','Barracas','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12021','Betxí','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12022','Bejís','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12024','Benafer','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12025','Benafigos','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12026','Benassal','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12027','Benicarló','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12028','Benicasim/Benicàssim','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12029','Benlloc','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12031','Borriol','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12032','Burriana','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12033','Cabanes','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12034','Càlig','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12036','Canet lo Roig','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12037','Castell de Cabres','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12038','Castellfort','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12039','Castellnovo','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12040','Castellón de la Plana/Castelló de la Plana','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12041','Castillo de Villamalefa','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12042','Catí','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12043','Caudiel','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12044','Cervera del Maestre','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12045','Cinctorres','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12046','Cirat','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12048','Cortes de Arenoso','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12049','Costur','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12050','Coves de Vinromà (les)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12051','Culla','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12052','Xert','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12053','Chilches/Xilxes','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12055','Chodos/Xodos','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12056','Chóvar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12057','Eslida','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12058','Espadilla','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12059','Fanzara','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12060','Figueroles','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12061','Forcall','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12063','Fuente la Reina','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12064','Fuentes de Ayódar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12065','Gaibiel','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12067','Geldo','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12068','Herbés','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12069','Higueras','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12070','Jana (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12071','Jérica','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12072','Llucena/Lucena del Cid','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12073','Ludiente','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12074','Llosa (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12075','Mata de Morella (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12076','Matet','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12077','Moncofa','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12078','Montán','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12079','Montanejos','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12080','Morella','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12081','Navajas','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12082','Nules','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12083','Olocau del Rey','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12084','Onda','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12085','Oropesa del Mar/Orpesa','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12087','Palanques','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12088','Pavías','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12089','Peñíscola','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12090','Pina de Montalgrao','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12091','Portell de Morella','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12092','Puebla de Arenoso','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12093','Pobla de Benifassà (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12094','Pobla Tornesa (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12095','Ribesalbes','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12096','Rossell','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12097','Sacañet','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12098','Salzadella (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12099','Sant Jordi/San Jorge','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12100','Sant Mateu','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12101','San Rafael del Río','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12102','Santa Magdalena de Pulpis','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12103','Sarratella, la','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12104','Segorbe','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12105','Sierra Engarcerán','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12106','Soneja','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12107','Sot de Ferrer','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12108','Sueras/Suera','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12109','Tales','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12110','Teresa','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12111','Tírig','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12112','Todolella','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12113','Toga','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12114','Torás','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12115','Toro (El)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12116','Torralba del Pinar','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12117','Torreblanca','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12118','Torrechiva','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12119','Torre d''En Besora (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12120','Torre Endoménech','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12121','Traiguera','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12122','Useras/Useres (les)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12123','Vallat','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12124','Vall d''Alba','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12125','Vall de Almonacid','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12126','Vall d''Uixó (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12127','Vallibona','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12128','Vilafamés','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12129','Vilafranca/Villafranca del Cid','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12130','Villahermosa del Río','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12131','Villamalur','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12132','Vilanova d''Alcolea','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12133','Villanueva de Viver','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12134','Vilar de Canes','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12135','Vila-real','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12136','Vilavella (la)','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12137','Villores','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12138','Vinaròs','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12139','Vistabella del Maestrat','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12140','Viver','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12141','Zorita del Maestrazgo','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12142','Zucaina','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12901','Alqueries, les/Alquerías del Niño Perdido','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'12902','Sant Joan de Moró','CS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13001','Abenójar','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13002','Agudo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13003','Alamillo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13004','Albaladejo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13005','Alcázar de San Juan','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13006','Alcoba','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13007','Alcolea de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13008','Alcubillas','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13009','Aldea del Rey','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13010','Alhambra','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13011','Almadén','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13012','Almadenejos','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13013','Almagro','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13014','Almedina','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13015','Almodóvar del Campo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13016','Almuradiel','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13017','Anchuras','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13018','Arenas de San Juan','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13019','Argamasilla de Alba','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13020','Argamasilla de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13021','Arroba de los Montes','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13022','Ballesteros de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13023','Bolaños de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13024','Brazatortas','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13025','Cabezarados','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13026','Cabezarrubias del Puerto','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13027','Calzada de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13028','Campo de Criptana','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13029','Cañada de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13030','Caracuel de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13031','Carrión de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13032','Carrizosa','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13033','Castellar de Santiago','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13034','Ciudad Real','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13035','Corral de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13036','Cortijos (Los)','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13037','Cózar','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13038','Chillón','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13039','Daimiel','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13040','Fernán Caballero','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13041','Fontanarejo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13042','Fuencaliente','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13043','Fuenllana','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13044','Fuente el Fresno','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13045','Granátula de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13046','Guadalmez','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13047','Herencia','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13048','Hinojosas de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13049','Horcajo de los Montes','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13050','Labores (Las)','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13051','Luciana','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13052','Malagón','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13053','Manzanares','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13054','Membrilla','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13055','Mestanza','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13056','Miguelturra','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13057','Montiel','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13058','Moral de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13059','Navalpino','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13060','Navas de Estena','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13061','Pedro Muñoz','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13062','Picón','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13063','Piedrabuena','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13064','Poblete','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13065','Porzuna','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13066','Pozuelo de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13067','Pozuelos de Calatrava (Los)','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13068','Puebla de Don Rodrigo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13069','Puebla del Príncipe','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13070','Puerto Lápice','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13071','Puertollano','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13072','Retuerta del Bullaque','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13073','Saceruela','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13074','San Carlos del Valle','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13075','San Lorenzo de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13076','Santa Cruz de los Cáñamos','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13077','Santa Cruz de Mudela','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13078','Socuéllamos','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13079','Solana (La)','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13080','Solana del Pino','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13081','Terrinches','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13082','Tomelloso','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13083','Torralba de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13084','Torre de Juan Abad','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13085','Torrenueva','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13086','Valdemanco del Esteras','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13087','Valdepeñas','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13088','Valenzuela de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13089','Villahermosa','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13090','Villamanrique','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13091','Villamayor de Calatrava','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13092','Villanueva de la Fuente','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13093','Villanueva de los Infantes','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13094','Villanueva de San Carlos','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13095','Villar del Pozo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13096','Villarrubia de los Ojos','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13097','Villarta de San Juan','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13098','Viso del Marqués','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13901','Robledo (El)','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13902','Ruidera','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13903','Arenales de San Gregorio','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'13904','Llanos del Caudillo','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14001','Adamuz','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14002','Aguilar de la Frontera','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14003','Alcaracejos','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14004','Almedinilla','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14005','Almodóvar del Río','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14006','Añora','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14007','Baena','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14008','Belalcázar','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14009','Belmez','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14010','Benamejí','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14011','Blázquez (Los)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14012','Bujalance','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14013','Cabra','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14014','Cañete de las Torres','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14015','Carcabuey','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14016','Cardeña','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14017','Carlota (La)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14018','Carpio (El)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14019','Castro del Río','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14020','Conquista','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14021','Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14022','Doña Mencía','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14023','Dos Torres','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14024','Encinas Reales','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14025','Espejo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14026','Espiel','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14027','Fernán-Núñez','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14028','Fuente la Lancha','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14029','Fuente Obejuna','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14030','Fuente Palmera','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14031','Fuente-Tójar','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14032','Granjuela (La)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14033','Guadalcázar','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14034','Guijo (El)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14035','Hinojosa del Duque','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14036','Hornachuelos','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14037','Iznájar','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14038','Lucena','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14039','Luque','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14040','Montalbán de Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14041','Montemayor','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14042','Montilla','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14043','Montoro','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14044','Monturque','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14045','Moriles','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14046','Nueva Carteya','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14047','Obejo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14048','Palenciana','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14049','Palma del Río','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14050','Pedro Abad','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14051','Pedroche','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14052','Peñarroya-Pueblonuevo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14053','Posadas','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14054','Pozoblanco','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14055','Priego de Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14056','Puente Genil','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14057','Rambla (La)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14058','Rute','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14059','San Sebastián de los Ballesteros','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14060','Santaella','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14061','Santa Eufemia','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14062','Torrecampo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14063','Valenzuela','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14064','Valsequillo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14065','Victoria (La)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14066','Villa del Río','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14067','Villafranca de Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14068','Villaharta','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14069','Villanueva de Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14070','Villanueva del Duque','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14071','Villanueva del Rey','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14072','Villaralto','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14073','Villaviciosa de Córdoba','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14074','Viso (El)','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14075','Zuheros','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14901','Fuente Carreteros','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'14902','Guijarrosa, La','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15001','Abegondo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15002','Ames','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15003','Aranga','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15004','Ares','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15005','Arteixo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15006','Arzúa','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15007','Baña (A)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15008','Bergondo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15009','Betanzos','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15010','Boimorto','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15011','Boiro','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15012','Boqueixón','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15013','Brión','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15014','Cabana de Bergantiños','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15015','Cabanas','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15016','Camariñas','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15017','Cambre','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15018','Capela (A)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15019','Carballo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15020','Carnota','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15021','Carral','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15022','Cedeira','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15023','Cee','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15024','Cerceda','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15025','Cerdido','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15027','Coirós','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15028','Corcubión','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15029','Coristanco','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15030','Coruña (A)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15031','Culleredo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15032','Curtis','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15033','Dodro','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15034','Dumbría','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15035','Fene','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15036','Ferrol','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15037','Fisterra','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15038','Frades','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15039','Irixoa','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15040','Laxe','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15041','Laracha (A)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15042','Lousame','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15043','Malpica de Bergantiños','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15044','Mañón','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15045','Mazaricos','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15046','Melide','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15047','Mesía','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15048','Miño','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15049','Moeche','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15050','Monfero','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15051','Mugardos','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15052','Muxía','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15053','Muros','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15054','Narón','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15055','Neda','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15056','Negreira','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15057','Noia','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15058','Oleiros','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15059','Ordes','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15060','Oroso','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15061','Ortigueira','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15062','Outes','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15064','Paderne','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15065','Padrón','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15066','Pino (O)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15067','Pobra do Caramiñal (A)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15068','Ponteceso','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15069','Pontedeume','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15070','Pontes de García Rodríguez (As)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15071','Porto do Son','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15072','Rianxo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15073','Ribeira','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15074','Rois','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15075','Sada','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15076','San Sadurniño','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15077','Santa Comba','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15078','Santiago de Compostela','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15079','Santiso','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15080','Sobrado','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15081','Somozas (As)','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15082','Teo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15083','Toques','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15084','Tordoia','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15085','Touro','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15086','Trazo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15087','Valdoviño','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15088','Val do Dubra','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15089','Vedra','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15090','Vilasantar','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15091','Vilarmaior','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15092','Vimianzo','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15093','Zas','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15901','Cariño','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'15902','Oza-Cesuras','C','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16001','Abia de la Obispalía','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16002','Acebrón (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16003','Alarcón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16004','Albaladejo del Cuende','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16005','Albalate de las Nogueras','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16006','Albendea','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16007','Alberca de Záncara (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16008','Alcalá de la Vega','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16009','Alcantud','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16010','Alcázar del Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16011','Alcohujate','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16012','Alconchel de la Estrella','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16013','Algarra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16014','Aliaguilla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16015','Almarcha (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16016','Almendros','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16017','Almodóvar del Pinar','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16018','Almonacid del Marquesado','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16019','Altarejos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16020','Arandilla del Arroyo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16022','Arcos de la Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16023','Chillarón de Cuenca','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16024','Arguisuelas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16025','Arrancacepas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16026','Atalaya del Cañavate','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16027','Barajas de Melo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16029','Barchín del Hoyo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16030','Bascuñana de San Pedro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16031','Beamud','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16032','Belinchón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16033','Belmonte','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16034','Belmontejo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16035','Beteta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16036','Boniches','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16038','Buciegas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16039','Buenache de Alarcón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16040','Buenache de la Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16041','Buendía','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16042','Campillo de Altobuey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16043','Campillos-Paravientos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16044','Campillos-Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16045','Canalejas del Arroyo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16046','Cañada del Hoyo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16047','Cañada Juncosa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16048','Cañamares','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16049','Cañavate (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16050','Cañaveras','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16051','Cañaveruelas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16052','Cañete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16053','Cañizares','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16055','Carboneras de Guadazaón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16056','Cardenete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16057','Carrascosa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16058','Carrascosa de Haro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16060','Casas de Benítez','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16061','Casas de Fernando Alonso','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16062','Casas de Garcimolina','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16063','Casas de Guijarro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16064','Casas de Haro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16065','Casas de los Pinos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16066','Casasimarro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16067','Castejón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16068','Castillejo de Iniesta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16070','Castillejo-Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16071','Castillo-Albaráñez','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16072','Castillo de Garcimuñoz','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16073','Cervera del Llano','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16074','Cierva (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16078','Cuenca','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16079','Cueva del Hierro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16081','Chumillas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16082','Enguídanos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16083','Fresneda de Altarejos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16084','Fresneda de la Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16085','Frontera (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16086','Fuente de Pedro Naharro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16087','Fuentelespino de Haro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16088','Fuentelespino de Moya','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16089','Fuentes','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16091','Fuertescusa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16092','Gabaldón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16093','Garaballa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16094','Gascueña','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16095','Graja de Campalbo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16096','Graja de Iniesta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16097','Henarejos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16098','Herrumblar (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16099','Hinojosa (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16100','Hinojosos (Los)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16101','Hito (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16102','Honrubia','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16103','Hontanaya','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16104','Hontecillas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16106','Horcajo de Santiago','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16107','Huélamo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16108','Huelves','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16109','Huérguina','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16110','Huerta de la Obispalía','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16111','Huerta del Marquesado','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16112','Huete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16113','Iniesta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16115','Laguna del Marquesado','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16116','Lagunaseca','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16117','Landete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16118','Ledaña','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16119','Leganiel','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16121','Majadas (Las)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16122','Mariana','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16123','Masegosa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16124','Mesas (Las)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16125','Minglanilla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16126','Mira','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16128','Monreal del Llano','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16129','Montalbanejo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16130','Montalbo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16131','Monteagudo de las Salinas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16132','Mota de Altarejos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16133','Mota del Cuervo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16134','Motilla del Palancar','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16135','Moya','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16137','Narboneta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16139','Olivares de Júcar','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16140','Olmeda de la Cuesta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16141','Olmeda del Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16142','Olmedilla de Alarcón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16143','Olmedilla de Eliz','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16145','Osa de la Vega','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16146','Pajarón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16147','Pajaroncillo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16148','Palomares del Campo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16149','Palomera','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16150','Paracuellos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16151','Paredes','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16152','Parra de las Vegas (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16153','Pedernoso (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16154','Pedroñeras (Las)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16155','Peral (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16156','Peraleja (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16157','Pesquera (La)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16158','Picazo (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16159','Pinarejo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16160','Pineda de Gigüela','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16161','Piqueras del Castillo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16162','Portalrubio de Guadamejud','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16163','Portilla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16165','Poyatos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16166','Pozoamargo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16167','Pozorrubio de Santiago','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16169','Pozuelo (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16170','Priego','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16171','Provencio (El)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16172','Puebla de Almenara','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16173','Valle de Altomira, El','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16174','Puebla del Salvador','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16175','Quintanar del Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16176','Rada de Haro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16177','Reíllo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16181','Rozalén del Monte','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16185','Saceda-Trasierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16186','Saelices','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16187','Salinas del Manzano','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16188','Salmeroncillos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16189','Salvacañete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16190','San Clemente','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16191','San Lorenzo de la Parrilla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16192','San Martín de Boniches','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16193','San Pedro Palmiches','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16194','Santa Cruz de Moya','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16195','Santa María del Campo Rus','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16196','Santa María de los Llanos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16197','Santa María del Val','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16198','Sisante','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16199','Solera de Gabaldón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16202','Talayuelas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16203','Tarancón','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16204','Tébar','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16205','Tejadillos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16206','Tinajas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16209','Torralba','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16211','Torrejoncillo del Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16212','Torrubia del Campo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16213','Torrubia del Castillo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16215','Tragacete','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16216','Tresjuncos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16217','Tribaldos','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16218','Uclés','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16219','Uña','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16224','Valdemeca','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16225','Valdemorillo de la Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16227','Valdemoro-Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16228','Valdeolivas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16231','Valhermoso de la Fuente','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16234','Valsalobre','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16236','Valverde de Júcar','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16237','Valverdejo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16238','Vara de Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16239','Vega del Codorno','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16240','Vellisca','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16242','Villaconejos de Trabaque','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16243','Villaescusa de Haro','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16244','Villagarcía del Llano','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16245','Villalba de la Sierra','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16246','Villalba del Rey','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16247','Villalgordo del Marquesado','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16248','Villalpardo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16249','Villamayor de Santiago','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16250','Villanueva de Guadamejud','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16251','Villanueva de la Jara','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16253','Villar de Cañas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16254','Villar de Domingo García','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16255','Villar de la Encina','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16258','Villar del Humo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16259','Villar del Infantado','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16263','Villar de Olalla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16264','Villarejo de Fuentes','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16265','Villarejo de la Peñuela','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16266','Villarejo-Periesteban','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16269','Villares del Saz','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16270','Villarrubio','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16271','Villarta','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16272','Villas de la Ventosa','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16273','Villaverde y Pasaconsol','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16274','Víllora','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16275','Vindel','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16276','Yémeda','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16277','Zafra de Záncara','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16278','Zafrilla','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16279','Zarza de Tajo','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16280','Zarzuela','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16901','Campos del Paraíso','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16902','Valdetórtola','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16903','Valeras (Las)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16904','Fuentenava de Jábaga','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16905','Arcas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16906','Valdecolmenas (Los)','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16908','Pozorrubielos de la Mancha','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16909','Sotorribas','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'16910','Villar y Velasco','CU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17001','Agullana','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17002','Aiguaviva','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17003','Albanyà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17004','Albons','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17005','Far d''Empordà (El)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17006','Alp','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17007','Amer','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17008','Anglès','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17009','Arbúcies','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17010','Argelaguer','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17011','Armentera (L'')','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17012','Avinyonet de Puigventós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17013','Begur','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17014','Vajol (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17015','Banyoles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17016','Bàscara','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17018','Bellcaire d''Empordà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17019','Besalú','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17020','Bescanó','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17021','Beuda','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17022','Bisbal d''Empordà (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17023','Blanes','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17024','Bolvir','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17025','Bordils','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17026','Borrassà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17027','Breda','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17028','Brunyola i Sant Martí Sapresa','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17029','Boadella i les Escaules','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17030','Cabanes','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17031','Cabanelles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17032','Cadaqués','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17033','Caldes de Malavella','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17034','Calonge i Sant Antoni','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17035','Camós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17036','Campdevànol','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17037','Campelles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17038','Campllong','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17039','Camprodon','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17040','Canet d''Adri','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17041','Cantallops','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17042','Capmany','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17043','Queralbs','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17044','Cassà de la Selva','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17046','Castellfollit de la Roca','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17047','Castelló d''Empúries','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17048','Castell-Platja d''Aro','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17049','Celrà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17050','Cervià de Ter','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17051','Cistella','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17052','Siurana','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17054','Colera','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17055','Colomers','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17056','Cornellà del Terri','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17057','Corçà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17058','Crespià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17060','Darnius','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17061','Das','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17062','Escala (L'')','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17063','Espinelves','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17064','Espolla','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17065','Esponellà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17066','Figueres','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17067','Flaçà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17068','Foixà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17069','Fontanals de Cerdanya','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17070','Fontanilles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17071','Fontcoberta','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17073','Fornells de la Selva','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17074','Fortià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17075','Garrigàs','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17076','Garrigoles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17077','Garriguella','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17078','Ger','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17079','Girona','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17080','Gombrèn','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17081','Gualta','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17082','Guils de Cerdanya','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17083','Hostalric','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17084','Isòvol','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17085','Jafre','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17086','Jonquera (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17087','Juià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17088','Lladó','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17089','Llagostera','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17090','Llambilles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17091','Llanars','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17092','Llançà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17093','Llers','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17094','Llívia','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17095','Lloret de Mar','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17096','Llosses (Les)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17097','Madremanya','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17098','Maià de Montcal','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17099','Meranges','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17100','Masarac','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17101','Massanes','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17102','Maçanet de Cabrenys','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17103','Maçanet de la Selva','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17105','Mieres','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17106','Mollet de Peralada','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17107','Molló','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17109','Montagut i Oix','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17110','Mont-ras','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17111','Navata','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17112','Ogassa','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17114','Olot','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17115','Ordis','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17116','Osor','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17117','Palafrugell','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17118','Palamós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17119','Palau de Santa Eulàlia','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17120','Palau-saverdera','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17121','Palau-sator','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17123','Palol de Revardit','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17124','Pals','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17125','Pardines','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17126','Parlavà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17128','Pau','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17129','Pedret i Marzà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17130','Pera (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17132','Peralada','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17133','Planes d''Hostoles (Les)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17134','Planoles','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17135','Pont de Molins','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17136','Pontós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17137','Porqueres','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17138','Portbou','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17139','Preses (Les)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17140','Port de la Selva (El)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17141','Puigcerdà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17142','Quart','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17143','Rabós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17144','Regencós','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17145','Ribes de Freser','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17146','Riells i Viabrea','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17147','Ripoll','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17148','Riudarenes','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17149','Riudaura','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17150','Riudellots de la Selva','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17151','Riumors','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17152','Roses','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17153','Rupià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17154','Sales de Llierca','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17155','Salt','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17157','Sant Andreu Salou','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17158','Sant Climent Sescebes','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17159','Sant Feliu de Buixalleu','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17160','Sant Feliu de Guíxols','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17161','Sant Feliu de Pallerols','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17162','Sant Ferriol','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17163','Sant Gregori','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17164','Sant Hilari Sacalm','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17165','Sant Jaume de Llierca','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17166','Sant Jordi Desvalls','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17167','Sant Joan de les Abadesses','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17168','Sant Joan de Mollet','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17169','Sant Julià de Ramis','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17170','Vallfogona de Ripollès','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17171','Sant Llorenç de la Muga','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17172','Sant Martí de Llémena','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17173','Sant Martí Vell','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17174','Sant Miquel de Campmajor','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17175','Sant Miquel de Fluvià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17176','Sant Mori','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17177','Sant Pau de Segúries','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17178','Sant Pere Pescador','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17180','Santa Coloma de Farners','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17181','Santa Cristina d''Aro','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17182','Santa Llogaia d''Àlguema','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17183','Sant Aniol de Finestres','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17184','Santa Pau','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17185','Sant Joan les Fonts','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17186','Sarrià de Ter','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17187','Saus, Camallera i Llampaies','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17188','Selva de Mar (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17189','Cellera de Ter (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17190','Serinyà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17191','Serra de Daró','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17192','Setcases','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17193','Sils','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17194','Susqueda','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17195','Tallada d''Empordà (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17196','Terrades','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17197','Torrent','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17198','Torroella de Fluvià','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17199','Torroella de Montgrí','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17200','Tortellà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17201','Toses','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17202','Tossa de Mar','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17203','Ultramort','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17204','Ullà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17205','Ullastret','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17206','Urús','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17207','Vall d''en Bas (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17208','Vall de Bianya (La)','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17209','Vall-llobrega','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17210','Ventalló','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17211','Verges','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17212','Vidrà','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17213','Vidreres','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17214','Vilabertran','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17215','Vilablareix','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17216','Viladasens','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17217','Viladamat','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17218','Vilademuls','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17220','Viladrau','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17221','Vilafant','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17222','Vilaür','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17223','Vilajuïga','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17224','Vilallonga de Ter','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17225','Vilamacolum','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17226','Vilamalla','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17227','Vilamaniscle','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17228','Vilanant','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17230','Vila-sacra','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17232','Vilopriu','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17233','Vilobí d''Onyar','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17234','Biure','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17901','Cruïlles, Monells i Sant Sadurní de l''Heura','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17902','Forallac','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'17903','Sant Julià del Llor i Bonmatí','GI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18001','Agrón','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18002','Alamedilla','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18003','Albolote','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18004','Albondón','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18005','Albuñán','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18006','Albuñol','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18007','Albuñuelas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18010','Aldeire','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18011','Alfacar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18012','Algarinejo','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18013','Alhama de Granada','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18014','Alhendín','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18015','Alicún de Ortega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18016','Almegíjar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18017','Almuñécar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18018','Alquife','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18020','Arenas del Rey','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18021','Armilla','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18022','Atarfe','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18023','Baza','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18024','Beas de Granada','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18025','Beas de Guadix','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18027','Benalúa','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18028','Benalúa de las Villas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18029','Benamaurel','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18030','Bérchules','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18032','Bubión','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18033','Busquístar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18034','Cacín','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18035','Cádiar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18036','Cájar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18037','Calicasas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18038','Campotéjar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18039','Caniles','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18040','Cáñar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18042','Capileira','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18043','Carataunas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18044','Cástaras','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18045','Castilléjar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18046','Castril','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18047','Cenes de la Vega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18048','Cijuela','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18049','Cogollos de Guadix','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18050','Cogollos de la Vega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18051','Colomera','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18053','Cortes de Baza','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18054','Cortes y Graena','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18056','Cúllar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18057','Cúllar Vega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18059','Chauchina','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18061','Chimeneas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18062','Churriana de la Vega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18063','Darro','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18064','Dehesas de Guadix','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18065','Dehesas Viejas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18066','Deifontes','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18067','Diezma','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18068','Dílar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18069','Dólar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18070','Dúdar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18071','Dúrcal','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18072','Escúzar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18074','Ferreira','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18076','Fonelas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18077','Fornes','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18078','Freila','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18079','Fuente Vaqueros','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18082','Galera','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18083','Gobernador','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18084','Gójar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18085','Gor','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18086','Gorafe','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18087','Granada','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18088','Guadahortuna','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18089','Guadix','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18093','Gualchos','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18094','Güéjar Sierra','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18095','Güevéjar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18096','Huélago','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18097','Huéneja','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18098','Huéscar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18099','Huétor de Santillán','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18100','Huétor Tájar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18101','Huétor Vega','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18102','Íllora','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18103','Ítrabo','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18105','Iznalloz','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18106','Játar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18107','Jayena','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18108','Jérez del Marquesado','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18109','Jete','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18111','Jun','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18112','Juviles','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18114','Calahorra (La)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18115','Láchar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18116','Lanjarón','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18117','Lanteira','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18119','Lecrín','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18120','Lentegí','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18121','Lobras','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18122','Loja','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18123','Lugros','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18124','Lújar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18126','Malahá (La)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18127','Maracena','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18128','Marchal','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18132','Moclín','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18133','Molvízar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18134','Monachil','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18135','Montefrío','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18136','Montejícar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18137','Montillana','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18138','Moraleda de Zafayona','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18140','Motril','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18141','Murtas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18143','Nigüelas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18144','Nívar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18145','Ogíjares','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18146','Orce','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18147','Órgiva','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18148','Otívar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18149','Villa de Otura','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18150','Padul','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18151','Pampaneira','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18152','Pedro Martínez','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18153','Peligros','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18154','Peza (La)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18157','Pinos Genil','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18158','Pinos Puente','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18159','Píñar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18161','Polícar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18162','Polopos','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18163','Pórtugos','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18164','Puebla de Don Fadrique','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18165','Pulianas','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18167','Purullena','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18168','Quéntar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18170','Rubite','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18171','Salar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18173','Salobreña','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18174','Santa Cruz del Comercio','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18175','Santa Fe','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18176','Soportújar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18177','Sorvilán','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18178','Torre-Cardela','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18179','Torvizcón','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18180','Trevélez','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18181','Turón','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18182','Ugíjar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18183','Válor','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18184','Vélez de Benaudalla','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18185','Ventas de Huelma','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18187','Villanueva de las Torres','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18188','Villanueva Mesía','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18189','Víznar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18192','Zafarraya','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18193','Zubia (La)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18194','Zújar','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18901','Taha (La)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18902','Valle (El)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18903','Nevada','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18904','Alpujarra de la Sierra','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18905','Gabias (Las)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18906','Guájares, Los','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18907','Valle del Zalabí','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18908','Villamena','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18909','Morelábor','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18910','Pinar (El)','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18911','Vegas del Genil','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18912','Cuevas del Campo','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18913','Zagra','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18914','Valderrubio','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18915','Domingo Pérez de Granada','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'18916','Torrenueva Costa','GR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19001','Abánades','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19002','Ablanque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19003','Adobes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19004','Alaminos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19005','Alarilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19006','Albalate de Zorita','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19007','Albares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19008','Albendiego','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19009','Alcocer','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19010','Alcolea de las Peñas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19011','Alcolea del Pinar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19013','Alcoroches','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19015','Aldeanueva de Guadalajara','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19016','Algar de Mesa','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19017','Algora','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19018','Alhóndiga','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19019','Alique','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19020','Almadrones','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19021','Almoguera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19022','Almonacid de Zorita','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19023','Alocén','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19024','Alovera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19027','Alustante','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19031','Angón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19032','Anguita','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19033','Anquela del Ducado','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19034','Anquela del Pedregal','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19036','Aranzueque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19037','Arbancón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19038','Arbeteta','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19039','Argecilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19040','Armallones','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19041','Armuña de Tajuña','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19042','Arroyo de las Fraguas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19043','Atanzón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19044','Atienza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19045','Auñón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19046','Azuqueca de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19047','Baides','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19048','Baños de Tajo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19049','Bañuelos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19050','Barriopedro','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19051','Berninches','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19052','Bodera (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19053','Brihuega','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19054','Budia','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19055','Bujalaro','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19057','Bustares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19058','Cabanillas del Campo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19059','Campillo de Dueñas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19060','Campillo de Ranas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19061','Campisábalos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19064','Canredondo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19065','Cantalojas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19066','Cañizar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19067','Cardoso de la Sierra (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19070','Casa de Uceda','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19071','Casar (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19073','Casas de San Galindo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19074','Caspueñas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19075','Castejón de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19076','Castellar de la Muela','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19078','Castilforte','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19079','Castilnuevo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19080','Cendejas de Enmedio','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19081','Cendejas de la Torre','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19082','Centenera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19086','Cifuentes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19087','Cincovillas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19088','Ciruelas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19089','Ciruelos del Pinar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19090','Cobeta','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19091','Cogollor','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19092','Cogolludo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19095','Condemios de Abajo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19096','Condemios de Arriba','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19097','Congostrina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19098','Copernal','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19099','Corduente','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19102','Cubillo de Uceda (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19103','Checa','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19104','Chequilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19105','Chiloeches','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19106','Chillarón del Rey','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19107','Driebes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19108','Durón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19109','Embid','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19110','Escamilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19111','Escariche','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19112','Escopete','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19113','Espinosa de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19114','Esplegares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19115','Establés','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19116','Estriégana','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19117','Fontanar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19118','Fuembellida','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19119','Fuencemillán','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19120','Fuentelahiguera de Albatages','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19121','Fuentelencina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19122','Fuentelsaz','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19123','Fuentelviejo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19124','Fuentenovilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19125','Gajanejos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19126','Galápagos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19127','Galve de Sorbe','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19129','Gascueña de Bornova','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19130','Guadalajara','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19132','Henche','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19133','Heras de Ayuso','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19134','Herrería','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19135','Hiendelaencina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19136','Hijes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19138','Hita','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19139','Hombrados','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19142','Hontoba','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19143','Horche','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19145','Hortezuela de Océn','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19146','Huerce (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19147','Huérmeces del Cerro','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19148','Huertahernando','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19150','Hueva','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19151','Humanes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19152','Illana','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19153','Iniéstola','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19154','Inviernas (Las)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19155','Irueste','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19156','Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19157','Jirueque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19159','Ledanca','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19160','Loranca de Tajuña','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19161','Lupiana','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19162','Luzaga','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19163','Luzón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19165','Majaelrayo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19166','Málaga del Fresno','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19167','Malaguilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19168','Mandayona','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19169','Mantiel','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19170','Maranchón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19171','Marchamalo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19172','Masegoso de Tajuña','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19173','Matarrubia','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19174','Matillas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19175','Mazarete','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19176','Mazuecos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19177','Medranda','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19178','Megina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19179','Membrillera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19181','Miedes de Atienza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19182','Mierla (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19183','Milmarcos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19184','Millana','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19185','Miñosa (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19186','Mirabueno','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19187','Miralrío','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19188','Mochales','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19189','Mohernando','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19190','Molina de Aragón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19191','Monasterio','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19192','Mondéjar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19193','Montarrón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19194','Moratilla de los Meleros','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19195','Morenilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19196','Muduex','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19197','Navas de Jadraque (Las)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19198','Negredo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19199','Ocentejo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19200','Olivar (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19201','Olmeda de Cobeta','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19202','Olmeda de Jadraque (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19203','Ordial (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19204','Orea','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19208','Pálmaces de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19209','Pardos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19210','Paredes de Sigüenza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19211','Pareja','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19212','Pastrana','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19213','Pedregal (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19214','Peñalén','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19215','Peñalver','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19216','Peralejos de las Truchas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19217','Peralveche','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19218','Pinilla de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19219','Pinilla de Molina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19220','Pioz','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19221','Piqueras','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19222','Pobo de Dueñas (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19223','Poveda de la Sierra','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19224','Pozo de Almoguera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19225','Pozo de Guadalajara','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19226','Prádena de Atienza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19227','Prados Redondos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19228','Puebla de Beleña','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19229','Puebla de Valles','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19230','Quer','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19231','Rebollosa de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19232','Recuenco (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19233','Renera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19234','Retiendas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19235','Riba de Saelices','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19237','Rillo de Gallo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19238','Riofrío del Llano','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19239','Robledillo de Mohernando','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19240','Robledo de Corpes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19241','Romanillos de Atienza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19242','Romanones','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19243','Rueda de la Sierra','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19244','Sacecorbo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19245','Sacedón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19246','Saelices de la Sal','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19247','Salmerón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19248','San Andrés del Congosto','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19249','San Andrés del Rey','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19250','Santiuste','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19251','Saúca','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19252','Sayatón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19254','Selas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19255','Setiles','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19256','Sienes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19257','Sigüenza','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19258','Solanillos del Extremo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19259','Somolinos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19260','Sotillo (El)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19261','Sotodosos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19262','Tamajón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19263','Taragudo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19264','Taravilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19265','Tartanedo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19266','Tendilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19267','Terzaga','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19268','Tierzo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19269','Toba (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19270','Tordelrábano','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19271','Tordellego','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19272','Tordesilos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19274','Torija','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19277','Torrecuadrada de Molina','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19278','Torrecuadradilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19279','Torre del Burgo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19280','Torrejón del Rey','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19281','Torremocha de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19282','Torremocha del Campo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19283','Torremocha del Pinar','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19284','Torremochuela','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19285','Torrubia','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19286','Tórtola de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19287','Tortuera','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19288','Tortuero','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19289','Traíd','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19290','Trijueque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19291','Trillo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19293','Uceda','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19294','Ujados','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19296','Utande','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19297','Valdarachas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19298','Valdearenas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19299','Valdeavellano','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19300','Valdeaveruelo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19301','Valdeconcha','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19302','Valdegrudas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19303','Valdelcubo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19304','Valdenuño Fernández','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19305','Valdepeñas de la Sierra','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19306','Valderrebollo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19307','Valdesotos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19308','Valfermoso de Tajuña','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19309','Valhermoso','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19310','Valtablado del Río','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19311','Valverde de los Arroyos','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19314','Viana de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19317','Villanueva de Alcorón','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19318','Villanueva de Argecilla','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19319','Villanueva de la Torre','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19321','Villares de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19322','Villaseca de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19323','Villaseca de Uceda','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19324','Villel de Mesa','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19325','Viñuelas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19326','Yebes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19327','Yebra','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19329','Yélamos de Abajo','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19330','Yélamos de Arriba','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19331','Yunquera de Henares','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19332','Yunta (La)','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19333','Zaorejas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19334','Zarzuela de Jadraque','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19335','Zorita de los Canes','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'19901','Semillas','GU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20001','Abaltzisketa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20002','Aduna','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20003','Aizarnazabal','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20004','Albiztur','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20005','Alegia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20006','Alkiza','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20007','Altzo','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20008','Amezketa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20009','Andoain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20010','Anoeta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20011','Antzuola','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20012','Arama','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20013','Aretxabaleta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20014','Asteasu','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20015','Ataun','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20016','Aia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20017','Azkoitia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20018','Azpeitia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20019','Beasain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20020','Beizama','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20021','Belauntza','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20022','Berastegi','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20023','Berrobi','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20024','Bidania-Goiatz','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20025','Zegama','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20026','Zerain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20027','Zestoa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20028','Zizurkil','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20029','Deba','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20030','Eibar','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20031','Elduain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20032','Elgoibar','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20033','Elgeta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20034','Eskoriatza','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20035','Ezkio-Itsaso','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20036','Hondarribia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20037','Gaintza','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20038','Gabiria','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20039','Getaria','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20040','Hernani','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20041','Hernialde','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20042','Ibarra','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20043','Idiazabal','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20044','Ikaztegieta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20045','Irun','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20046','Irura','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20047','Itsasondo','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20048','Larraul','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20049','Lazkao','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20050','Leaburu','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20051','Legazpi','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20052','Legorreta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20053','Lezo','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20054','Lizartza','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20055','Arrasate/Mondragón','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20056','Mutriku','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20057','Mutiloa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20058','Olaberria','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20059','Oñati','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20060','Orexa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20061','Orio','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20062','Ormaiztegi','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20063','Oiartzun','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20064','Pasaia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20065','Soraluze-Placencia de las Armas','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20066','Errezil','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20067','Errenteria','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20068','Leintz-Gatzaga','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20069','Donostia-San Sebastián','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20070','Segura','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20071','Tolosa','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20072','Urnieta','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20073','Usurbil','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20074','Bergara','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20075','Villabona','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20076','Ordizia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20077','Urretxu','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20078','Zaldibia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20079','Zarautz','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20080','Zumarraga','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20081','Zumaia','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20901','Mendaro','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20902','Lasarte-Oria','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20903','Astigarraga','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20904','Baliarrain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20905','Orendain','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20906','Altzaga','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'20907','Gaztelu','SS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21001','Alájar','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21002','Aljaraque','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21003','Almendro (El)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21004','Almonaster la Real','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21005','Almonte','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21006','Alosno','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21007','Aracena','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21008','Aroche','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21009','Arroyomolinos de León','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21010','Ayamonte','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21011','Beas','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21012','Berrocal','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21013','Bollullos Par del Condado','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21014','Bonares','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21015','Cabezas Rubias','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21016','Cala','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21017','Calañas','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21018','Campillo (El)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21019','Campofrío','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21020','Cañaveral de León','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21021','Cartaya','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21022','Castaño del Robledo','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21023','Cerro de Andévalo (El)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21024','Corteconcepción','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21025','Cortegana','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21026','Cortelazor','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21027','Cumbres de Enmedio','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21028','Cumbres de San Bartolomé','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21029','Cumbres Mayores','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21030','Chucena','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21031','Encinasola','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21032','Escacena del Campo','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21033','Fuenteheridos','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21034','Galaroza','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21035','Gibraleón','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21036','Granada de Río-Tinto (La)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21037','Granado (El)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21038','Higuera de la Sierra','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21039','Hinojales','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21040','Hinojos','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21041','Huelva','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21042','Isla Cristina','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21043','Jabugo','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21044','Lepe','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21045','Linares de la Sierra','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21046','Lucena del Puerto','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21047','Manzanilla','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21048','Marines (Los)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21049','Minas de Riotinto','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21050','Moguer','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21051','Nava (La)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21052','Nerva','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21053','Niebla','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21054','Palma del Condado (La)','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21055','Palos de la Frontera','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21056','Paterna del Campo','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21057','Paymogo','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21058','Puebla de Guzmán','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21059','Puerto Moral','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21060','Punta Umbría','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21061','Rociana del Condado','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21062','Rosal de la Frontera','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21063','San Bartolomé de la Torre','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21064','San Juan del Puerto','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21065','Sanlúcar de Guadiana','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21066','San Silvestre de Guzmán','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21067','Santa Ana la Real','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21068','Santa Bárbara de Casa','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21069','Santa Olalla del Cala','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21070','Trigueros','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21071','Valdelarco','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21072','Valverde del Camino','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21073','Villablanca','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21074','Villalba del Alcor','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21075','Villanueva de las Cruces','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21076','Villanueva de los Castillejos','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21077','Villarrasa','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21078','Zalamea la Real','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21079','Zufre','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'21902','Zarza-Perrunal, La','H','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22001','Abiego','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22002','Abizanda','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22003','Adahuesca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22004','Agüero','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22006','Aisa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22007','Albalate de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22008','Albalatillo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22009','Albelda','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22011','Albero Alto','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22012','Albero Bajo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22013','Alberuela de Tubo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22014','Alcalá de Gurrea','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22015','Alcalá del Obispo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22016','Alcampell','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22017','Alcolea de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22018','Alcubierre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22019','Alerre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22020','Alfántega','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22021','Almudévar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22022','Almunia de San Juan','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22023','Almuniente','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22024','Alquézar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22025','Altorricón','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22027','Angüés','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22028','Ansó','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22029','Antillón','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22032','Aragüés del Puerto','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22035','Arén','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22036','Argavieso','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22037','Arguis','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22039','Ayerbe','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22040','Azanuy-Alins','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22041','Azara','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22042','Azlor','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22043','Baélls','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22044','Bailo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22045','Baldellou','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22046','Ballobar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22047','Banastás','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22048','Barbastro','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22049','Barbués','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22050','Barbuñales','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22051','Bárcabo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22052','Belver de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22053','Benabarre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22054','Benasque','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22055','Berbegal','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22057','Bielsa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22058','Bierge','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22059','Biescas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22060','Binaced','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22061','Binéfar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22062','Bisaurri','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22063','Biscarrués','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22064','Blecua y Torres','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22066','Boltaña','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22067','Bonansa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22068','Borau','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22069','Broto','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22072','Caldearenas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22074','Campo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22075','Camporrélls','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22076','Canal de Berdún','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22077','Candasnos','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22078','Canfranc','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22079','Capdesaso','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22080','Capella','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22081','Casbas de Huesca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22082','Castejón del Puente','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22083','Castejón de Monegros','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22084','Castejón de Sos','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22085','Castelflorite','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22086','Castiello de Jaca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22087','Castigaleu','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22088','Castillazuelo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22089','Castillonroy','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22090','Colungo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22094','Chalamera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22095','Chía','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22096','Chimillas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22099','Esplús','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22102','Estada','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22103','Estadilla','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22105','Estopiñán del Castillo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22106','Fago','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22107','Fanlo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22109','Fiscal','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22110','Fonz','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22111','Foradada del Toscar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22112','Fraga','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22113','Fueva (La)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22114','Gistaín','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22115','Grado (El)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22116','Grañén','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22117','Graus','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22119','Gurrea de Gállego','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22122','Hoz de Jaca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22124','Huerto','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22125','Huesca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22126','Ibieca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22127','Igriés','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22128','Ilche','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22129','Isábena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22130','Jaca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22131','Jasa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22133','Labuerda','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22135','Laluenga','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22136','Lalueza','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22137','Lanaja','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22139','Laperdiguera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22141','Lascellas-Ponzano','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22142','Lascuarre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22143','Laspaúles','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22144','Laspuña','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22149','Loarre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22150','Loporzano','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22151','Loscorrales','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22155','Monesma y Cajigar','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22156','Monflorite-Lascasas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22157','Montanuy','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22158','Monzón','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22160','Naval','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22162','Novales','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22163','Nueno','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22164','Olvena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22165','Ontiñena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22167','Osso de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22168','Palo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22170','Panticosa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22172','Peñalba','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22173','Peñas de Riglos (Las)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22174','Peralta de Alcofea','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22175','Peralta de Calasanz','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22176','Peraltilla','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22177','Perarrúa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22178','Pertusa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22181','Piracés','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22182','Plan','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22184','Poleñino','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22186','Pozán de Vero','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22187','Puebla de Castro (La)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22188','Puente de Montañana','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22189','Puértolas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22190','Pueyo de Araguás (El)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22193','Pueyo de Santa Cruz','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22195','Quicena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22197','Robres','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22199','Sabiñánigo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22200','Sahún','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22201','Salas Altas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22202','Salas Bajas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22203','Salillas','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22204','Sallent de Gállego','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22205','San Esteban de Litera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22206','Sangarrén','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22207','San Juan de Plan','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22208','Santa Cilia','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22209','Santa Cruz de la Serós','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22212','Santaliestra y San Quílez','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22213','Sariñena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22214','Secastilla','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22215','Seira','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22217','Sena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22218','Senés de Alcubierre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22220','Sesa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22221','Sesué','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22222','Siétamo','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22223','Sopeira','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22225','Tamarite de Litera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22226','Tardienta','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22227','Tella-Sin','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22228','Tierz','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22229','Tolva','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22230','Torla-Ordesa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22232','Torralba de Aragón','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22233','Torre la Ribera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22234','Torrente de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22235','Torres de Alcanadre','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22236','Torres de Barbués','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22239','Tramaced','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22242','Valfarta','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22243','Valle de Bardají','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22244','Valle de Lierp','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22245','Velilla de Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22246','Beranuy','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22247','Viacamp y Litera','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22248','Vicién','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22249','Villanova','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22250','Villanúa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22251','Villanueva de Sigena','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22252','Yebra de Basa','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22253','Yésero','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22254','Zaidín','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22901','Valle de Hecho','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22902','Puente la Reina de Jaca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22903','San Miguel del Cinca','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22904','Sotonera (La)','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22905','Lupiñén-Ortilla','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22906','Santa María de Dulcis','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22907','Aínsa-Sobrarbe','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22908','Hoz y Costean','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'22909','Vencillón','HU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23001','Albanchez de Mágina','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23002','Alcalá la Real','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23003','Alcaudete','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23004','Aldeaquemada','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23005','Andújar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23006','Arjona','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23007','Arjonilla','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23008','Arquillos','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23009','Baeza','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23010','Bailén','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23011','Baños de la Encina','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23012','Beas de Segura','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23014','Begíjar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23015','Bélmez de la Moraleda','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23016','Benatae','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23017','Cabra del Santo Cristo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23018','Cambil','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23019','Campillo de Arenas','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23020','Canena','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23021','Carboneros','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23024','Carolina (La)','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23025','Castellar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23026','Castillo de Locubín','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23027','Cazalilla','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23028','Cazorla','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23029','Chiclana de Segura','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23030','Chilluévar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23031','Escañuela','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23032','Espeluy','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23033','Frailes','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23034','Fuensanta de Martos','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23035','Fuerte del Rey','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23037','Génave','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23038','Guardia de Jaén (La)','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23039','Guarromán','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23040','Lahiguera','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23041','Higuera de Calatrava','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23042','Hinojares','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23043','Hornos','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23044','Huelma','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23045','Huesa','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23046','Ibros','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23047','Iruela (La)','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23048','Iznatoraf','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23049','Jabalquinto','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23050','Jaén','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23051','Jamilena','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23052','Jimena','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23053','Jódar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23054','Larva','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23055','Linares','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23056','Lopera','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23057','Lupión','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23058','Mancha Real','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23059','Marmolejo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23060','Martos','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23061','Mengíbar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23062','Montizón','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23063','Navas de San Juan','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23064','Noalejo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23065','Orcera','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23066','Peal de Becerro','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23067','Pegalajar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23069','Porcuna','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23070','Pozo Alcón','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23071','Puente de Génave','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23072','Puerta de Segura (La)','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23073','Quesada','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23074','Rus','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23075','Sabiote','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23076','Santa Elena','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23077','Santiago de Calatrava','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23079','Santisteban del Puerto','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23080','Santo Tomé','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23081','Segura de la Sierra','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23082','Siles','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23084','Sorihuela del Guadalimar','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23085','Torreblascopedro','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23086','Torredelcampo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23087','Torredonjimeno','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23088','Torreperogil','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23090','Torres','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23091','Torres de Albánchez','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23092','Úbeda','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23093','Valdepeñas de Jaén','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23094','Vilches','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23095','Villacarrillo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23096','Villanueva de la Reina','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23097','Villanueva del Arzobispo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23098','Villardompardo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23099','Villares (Los)','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23101','Villarrodrigo','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23901','Cárcheles','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23902','Bedmar y Garcíez','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23903','Villatorres','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23904','Santiago-Pontones','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'23905','Arroyo del Ojanco','J','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24001','Acebedo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24002','Algadefe','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24003','Alija del Infantado','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24004','Almanza','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24005','Antigua (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24006','Ardón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24007','Arganza','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24008','Astorga','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24009','Balboa','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24010','Bañeza (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24011','Barjas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24012','Barrios de Luna (Los)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24014','Bembibre','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24015','Benavides','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24016','Benuza','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24017','Bercianos del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24018','Bercianos del Real Camino','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24019','Berlanga del Bierzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24020','Boca de Huérgano','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24021','Boñar','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24022','Borrenes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24023','Brazuelo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24024','Burgo Ranero (El)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24025','Burón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24026','Bustillo del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24027','Cabañas Raras','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24028','Cabreros del Río','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24029','Cabrillanes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24030','Cacabelos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24031','Calzada del Coto','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24032','Campazas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24033','Campo de Villavidel','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24034','Camponaraya','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24036','Candín','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24037','Cármenes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24038','Carracedelo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24039','Carrizo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24040','Carrocera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24041','Carucedo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24042','Castilfalé','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24043','Castrillo de Cabrera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24044','Castrillo de la Valduerna','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24046','Castrocalbón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24047','Castrocontrigo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24049','Castropodame','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24050','Castrotierra de Valmadrigal','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24051','Cea','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24052','Cebanico','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24053','Cebrones del Río','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24054','Cimanes de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24055','Cimanes del Tejar','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24056','Cistierna','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24057','Congosto','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24058','Corbillos de los Oteros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24059','Corullón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24060','Crémenes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24061','Cuadros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24062','Cubillas de los Oteros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24063','Cubillas de Rueda','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24064','Cubillos del Sil','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24065','Chozas de Abajo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24066','Destriana','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24067','Encinedo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24068','Ercina (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24069','Escobar de Campos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24070','Fabero','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24071','Folgoso de la Ribera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24073','Fresno de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24074','Fuentes de Carbajal','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24076','Garrafe de Torío','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24077','Gordaliza del Pino','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24078','Gordoncillo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24079','Gradefes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24080','Grajal de Campos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24081','Gusendos de los Oteros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24082','Hospital de Órbigo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24083','Igüeña','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24084','Izagre','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24086','Joarilla de las Matas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24087','Laguna Dalga','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24088','Laguna de Negrillos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24089','León','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24090','Lucillo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24091','Luyego','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24092','Llamas de la Ribera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24093','Magaz de Cepeda','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24094','Mansilla de las Mulas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24095','Mansilla Mayor','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24096','Maraña','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24097','Matadeón de los Oteros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24098','Matallana de Torío','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24099','Matanza','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24100','Molinaseca','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24101','Murias de Paredes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24102','Noceda del Bierzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24103','Oencia','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24104','Omañas (Las)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24105','Onzonilla','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24106','Oseja de Sajambre','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24107','Pajares de los Oteros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24108','Palacios de la Valduerna','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24109','Palacios del Sil','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24110','Páramo del Sil','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24112','Peranzanes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24113','Pobladura de Pelayo García','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24114','Pola de Gordón (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24115','Ponferrada','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24116','Posada de Valdeón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24117','Pozuelo del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24118','Prado de la Guzpeña','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24119','Priaranza del Bierzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24120','Prioro','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24121','Puebla de Lillo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24122','Puente de Domingo Flórez','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24123','Quintana del Castillo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24124','Quintana del Marco','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24125','Quintana y Congosto','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24127','Regueras de Arriba','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24129','Reyero','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24130','Riaño','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24131','Riego de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24132','Riello','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24133','Rioseco de Tapia','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24134','Robla (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24136','Roperuelos del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24137','Sabero','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24139','Sahagún','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24141','San Adrián del Valle','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24142','San Andrés del Rabanedo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24143','Sancedo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24144','San Cristóbal de la Polantera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24145','San Emiliano','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24146','San Esteban de Nogales','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24148','San Justo de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24149','San Millán de los Caballeros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24150','San Pedro Bercianos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24151','Santa Colomba de Curueño','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24152','Santa Colomba de Somoza','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24153','Santa Cristina de Valmadrigal','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24154','Santa Elena de Jamuz','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24155','Santa María de la Isla','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24156','Santa María del Monte de Cea','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24157','Santa María del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24158','Santa María de Ordás','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24159','Santa Marina del Rey','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24160','Santas Martas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24161','Santiago Millas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24162','Santovenia de la Valdoncina','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24163','Sariegos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24164','Sena de Luna','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24165','Sobrado','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24166','Soto de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24167','Soto y Amío','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24168','Toral de los Guzmanes','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24169','Toreno','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24170','Torre del Bierzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24171','Trabadelo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24172','Truchas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24173','Turcia','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24174','Urdiales del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24175','Valdefresno','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24176','Valdefuentes del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24177','Valdelugueros','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24178','Valdemora','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24179','Valdepiélago','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24180','Valdepolo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24181','Valderas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24182','Valderrey','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24183','Valderrueda','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24184','Valdesamario','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24185','Val de San Lorenzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24187','Valdevimbre','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24188','Valencia de Don Juan','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24189','Valverde de la Virgen','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24190','Valverde-Enrique','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24191','Vallecillo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24193','Vecilla (La)','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24194','Vegacervera','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24196','Vega de Espinareda','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24197','Vega de Infanzones','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24198','Vega de Valcarce','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24199','Vegaquemada','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24201','Vegas del Condado','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24202','Villablino','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24203','Villabraz','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24205','Villadangos del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24206','Toral de los Vados','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24207','Villademor de la Vega','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24209','Villafranca del Bierzo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24210','Villagatón','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24211','Villamandos','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24212','Villamañán','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24213','Villamartín de Don Sancho','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24214','Villamejil','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24215','Villamol','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24216','Villamontán de la Valduerna','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24217','Villamoratiel de las Matas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24218','Villanueva de las Manzanas','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24219','Villaobispo de Otero','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24221','Villaquejida','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24222','Villaquilambre','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24223','Villarejo de Órbigo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24224','Villares de Órbigo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24225','Villasabariego','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24226','Villaselán','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24227','Villaturiel','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24228','Villazala','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24229','Villazanzo de Valderaduey','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24230','Zotes del Páramo','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24901','Villamanín','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'24902','Villaornate y Castro','LE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25001','Abella de la Conca','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25002','Àger','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25003','Agramunt','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25004','Alamús (Els)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25005','Alàs i Cerc','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25006','Albagés (L'')','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25007','Albatàrrec','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25008','Albesa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25009','Albi (L'')','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25010','Alcanó','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25011','Alcarràs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25012','Alcoletge','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25013','Alfarràs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25014','Alfés','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25015','Algerri','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25016','Alguaire','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25017','Alins','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25019','Almacelles','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25020','Almatret','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25021','Almenar','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25022','Alòs de Balaguer','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25023','Alpicat','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25024','Alt Àneu','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25025','Naut Aran','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25027','Anglesola','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25029','Arbeca','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25030','Pont de Bar (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25031','Arres','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25032','Arsèguel','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25033','Artesa de Lleida','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25034','Artesa de Segre','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25035','Sentiu de Sió (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25036','Aspa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25037','Avellanes i Santa Linya (Les)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25038','Aitona','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25039','Baix Pallars','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25040','Balaguer','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25041','Barbens','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25042','Baronia de Rialb (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25043','Vall de Boí (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25044','Bassella','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25045','Bausen','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25046','Belianes','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25047','Bellcaire d''Urgell','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25048','Bell-lloc d''Urgell','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25049','Bellmunt d''Urgell','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25050','Bellpuig','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25051','Bellver de Cerdanya','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25052','Bellvís','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25053','Benavent de Segrià','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25055','Biosca','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25056','Bovera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25057','Bòrdes (Es)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25058','Borges Blanques (Les)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25059','Bossòst','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25060','Cabanabona','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25061','Cabó','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25062','Camarasa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25063','Canejan','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25064','Castellar de la Ribera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25067','Castelldans','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25068','Castellnou de Seana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25069','Castelló de Farfanya','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25070','Castellserà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25071','Cava','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25072','Cervera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25073','Cervià de les Garrigues','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25074','Ciutadilla','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25075','Clariana de Cardener','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25076','Cogul (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25077','Coll de Nargó','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25078','Corbins','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25079','Cubells','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25081','Espluga Calba (L'')','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25082','Espot','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25085','Estaràs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25086','Esterri d''Àneu','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25087','Esterri de Cardós','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25088','Estamariu','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25089','Farrera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25092','Floresta (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25093','Fondarella','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25094','Foradada','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25096','Fuliola (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25097','Fulleda','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25098','Gavet de la Conca','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25099','Golmés','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25100','Gósol','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25101','Granadella (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25102','Granja d''Escarp (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25103','Granyanella','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25104','Granyena de Segarra','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25105','Granyena de les Garrigues','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25109','Guimerà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25110','Guissona','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25111','Guixers','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25112','Ivars de Noguera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25113','Ivars d''Urgell','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25114','Ivorra','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25115','Isona i Conca Dellà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25118','Juncosa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25119','Juneda','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25120','Lleida','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25121','Les','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25122','Linyola','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25123','Lladorre','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25124','Lladurs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25125','Llardecans','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25126','Llavorsí','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25127','Lles de Cerdanya','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25128','Llimiana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25129','Llobera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25130','Maldà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25131','Massalcoreig','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25132','Massoteres','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25133','Maials','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25134','Menàrguens','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25135','Miralcamp','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25136','Molsosa (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25137','Mollerussa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25138','Montgai','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25139','Montellà i Martinet','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25140','Montferrer i Castellbò','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25141','Montoliu de Segarra','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25142','Montoliu de Lleida','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25143','Montornès de Segarra','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25145','Nalec','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25146','Navès','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25148','Odèn','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25149','Oliana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25150','Oliola','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25151','Olius','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25152','Oluges (Les)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25153','Omellons (Els)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25154','Omells de na Gaia (Els)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25155','Organyà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25156','Os de Balaguer','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25157','Ossó de Sió','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25158','Palau d''Anglesola (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25161','Conca de Dalt','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25163','Coma i la Pedra (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25164','Penelles','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25165','Peramola','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25166','Pinell de Solsonès','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25167','Pinós','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25168','Poal (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25169','Pobla de Cérvoles (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25170','Bellaguarda','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25171','Pobla de Segur (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25172','Ponts','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25173','Pont de Suert (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25174','Portella (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25175','Prats i Sansor','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25176','Preixana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25177','Preixens','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25179','Prullans','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25180','Puiggròs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25181','Puigverd d''Agramunt','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25182','Puigverd de Lleida','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25183','Rialp','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25185','Ribera d''Urgellet','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25186','Riner','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25189','Rosselló','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25190','Salàs de Pallars','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25191','Sanaüja','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25192','Sant Guim de Freixenet','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25193','Sant Llorenç de Morunys','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25194','Sant Ramon','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25196','Sant Esteve de la Sarga','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25197','Sant Guim de la Plana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25200','Sarroca de Lleida','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25201','Sarroca de Bellera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25202','Senterada','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25203','Seu d''Urgell (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25204','Seròs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25205','Sidamon','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25206','Soleràs (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25207','Solsona','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25208','Soriguera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25209','Sort','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25210','Soses','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25211','Sudanell','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25212','Sunyer','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25215','Talarn','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25216','Talavera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25217','Tàrrega','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25218','Tarrés','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25219','Tarroja de Segarra','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25220','Térmens','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25221','Tírvia','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25222','Tiurana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25223','Torà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25224','Torms (Els)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25225','Tornabous','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25226','Torrebesses','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25227','Torre de Cabdella (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25228','Torrefarrera','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25230','Torregrossa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25231','Torrelameu','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25232','Torres de Segre','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25233','Torre-serona','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25234','Tremp','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25238','Vallbona de les Monges','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25239','Valls de Valira (Les)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25240','Vallfogona de Balaguer','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25242','Verdú','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25243','Vielha e Mijaran','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25244','Vilagrassa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25245','Vilaller','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25247','Vilamòs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25248','Vilanova de Bellpuig','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25249','Vilanova de l''Aguda','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25250','Vilanova de Meià','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25251','Vilanova de Segrià','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25252','Vila-sana','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25253','Vilosell (El)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25254','Vilanova de la Barca','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25255','Vinaixa','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25901','Vall de Cardós','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25902','Sant Martí de Riucorb','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25903','Guingueta d''Àneu (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25904','Castell de Mur','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25905','Ribera d''Ondara','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25906','Valls d''Aguilar (Les)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25907','Torrefeta i Florejacs','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25908','Fígols i Alinyà','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25909','Vansa i Fórnols (La)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25910','Josa i Tuixén','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25911','Plans de Sió (Els)','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25912','Gimenells i el Pla de la Font','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'25913','Riu de Cerdanya','L','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26001','Ábalos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26002','Agoncillo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26003','Aguilar del Río Alhama','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26004','Ajamil','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26005','Albelda de Iregua','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26006','Alberite','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26007','Alcanadre','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26008','Aldeanueva de Ebro','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26009','Alesanco','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26010','Alesón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26011','Alfaro','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26012','Almarza de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26013','Anguciana','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26014','Anguiano','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26015','Arenzana de Abajo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26016','Arenzana de Arriba','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26017','Arnedillo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26018','Arnedo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26019','Arrúbal','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26020','Ausejo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26021','Autol','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26022','Azofra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26023','Badarán','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26024','Bañares','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26025','Baños de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26026','Baños de Río Tobía','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26027','Berceo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26028','Bergasa','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26029','Bergasillas Bajera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26030','Bezares','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26031','Bobadilla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26032','Brieva de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26033','Briñas','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26034','Briones','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26035','Cabezón de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26036','Calahorra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26037','Camprovín','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26038','Canales de la Sierra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26039','Canillas de Río Tuerto','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26040','Cañas','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26041','Cárdenas','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26042','Casalarreina','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26043','Castañares de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26044','Castroviejo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26045','Cellorigo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26046','Cenicero','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26047','Cervera del Río Alhama','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26048','Cidamón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26049','Cihuri','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26050','Cirueña','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26051','Clavijo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26052','Cordovín','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26053','Corera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26054','Cornago','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26055','Corporales','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26056','Cuzcurrita de Río Tirón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26057','Daroca de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26058','Enciso','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26059','Entrena','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26060','Estollo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26061','Ezcaray','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26062','Foncea','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26063','Fonzaleche','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26064','Fuenmayor','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26065','Galbárruli','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26066','Galilea','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26067','Gallinero de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26068','Gimileo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26069','Grañón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26070','Grávalos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26071','Haro','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26072','Herce','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26073','Herramélluri','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26074','Hervías','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26075','Hormilla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26076','Hormilleja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26077','Hornillos de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26078','Hornos de Moncalvillo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26079','Huércanos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26080','Igea','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26081','Jalón de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26082','Laguna de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26083','Lagunilla del Jubera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26084','Lardero','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26086','Ledesma de la Cogolla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26087','Leiva','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26088','Leza de Río Leza','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26089','Logroño','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26091','Lumbreras','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26092','Manjarrés','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26093','Mansilla de la Sierra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26094','Manzanares de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26095','Matute','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26096','Medrano','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26098','Munilla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26099','Murillo de Río Leza','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26100','Muro de Aguas','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26101','Muro en Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26102','Nájera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26103','Nalda','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26104','Navajún','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26105','Navarrete','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26106','Nestares','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26107','Nieva de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26108','Ocón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26109','Ochánduri','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26110','Ojacastro','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26111','Ollauri','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26112','Ortigosa de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26113','Pazuengos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26114','Pedroso','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26115','Pinillos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26117','Pradejón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26118','Pradillo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26119','Préjano','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26120','Quel','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26121','Rabanera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26122','Rasillo de Cameros (El)','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26123','Redal (El)','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26124','Ribafrecha','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26125','Rincón de Soto','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26126','Robres del Castillo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26127','Rodezno','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26128','Sajazarra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26129','San Asensio','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26130','San Millán de la Cogolla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26131','San Millán de Yécora','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26132','San Román de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26134','Santa Coloma','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26135','Santa Engracia del Jubera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26136','Santa Eulalia Bajera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26138','Santo Domingo de la Calzada','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26139','San Torcuato','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26140','Santurde de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26141','Santurdejo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26142','San Vicente de la Sonsierra','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26143','Sojuela','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26144','Sorzano','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26145','Sotés','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26146','Soto en Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26147','Terroba','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26148','Tirgo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26149','Tobía','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26150','Tormantos','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26151','Torrecilla en Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26152','Torrecilla sobre Alesanco','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26153','Torre en Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26154','Torremontalbo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26155','Treviana','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26157','Tricio','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26158','Tudelilla','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26160','Uruñuela','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26161','Valdemadera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26162','Valgañón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26163','Ventosa','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26164','Ventrosa','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26165','Viguera','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26166','Villalba de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26167','Villalobar de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26168','Villamediana de Iregua','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26169','Villanueva de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26170','Villar de Arnedo (El)','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26171','Villar de Torre','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26172','Villarejo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26173','Villarroya','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26174','Villarta-Quintana','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26175','Villavelayo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26176','Villaverde de Rioja','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26177','Villoslada de Cameros','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26178','Viniegra de Abajo','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26179','Viniegra de Arriba','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26180','Zarratón','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26181','Zarzosa','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'26183','Zorraquín','LO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27001','Abadín','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27002','Alfoz','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27003','Antas de Ulla','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27004','Baleira','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27005','Barreiros','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27006','Becerreá','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27007','Begonte','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27008','Bóveda','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27009','Carballedo','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27010','Castro de Rei','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27011','Castroverde','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27012','Cervantes','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27013','Cervo','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27014','Corgo (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27015','Cospeito','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27016','Chantada','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27017','Folgoso do Courel','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27018','Fonsagrada (A)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27019','Foz','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27020','Friol','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27021','Xermade','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27022','Guitiriz','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27023','Guntín','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27024','Incio (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27025','Xove','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27026','Láncara','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27027','Lourenzá','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27028','Lugo','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27029','Meira','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27030','Mondoñedo','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27031','Monforte de Lemos','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27032','Monterroso','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27033','Muras','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27034','Navia de Suarna','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27035','Negueira de Muñiz','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27037','Nogais (As)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27038','Ourol','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27039','Outeiro de Rei','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27040','Palas de Rei','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27041','Pantón','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27042','Paradela','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27043','Páramo (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27044','Pastoriza (A)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27045','Pedrafita do Cebreiro','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27046','Pol','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27047','Pobra do Brollón (A)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27048','Pontenova (A)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27049','Portomarín','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27050','Quiroga','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27051','Ribadeo','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27052','Ribas de Sil','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27053','Ribeira de Piquín','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27054','Riotorto','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27055','Samos','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27056','Rábade','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27057','Sarria','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27058','Saviñao (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27059','Sober','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27060','Taboada','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27061','Trabada','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27062','Triacastela','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27063','Valadouro (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27064','Vicedo (O)','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27065','Vilalba','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27066','Viveiro','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27901','Baralla','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'27902','Burela','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28001','Acebeda (La)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28002','Ajalvir','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28003','Alameda del Valle','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28004','Álamo (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28005','Alcalá de Henares','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28006','Alcobendas','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28007','Alcorcón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28008','Aldea del Fresno','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28009','Algete','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28010','Alpedrete','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28011','Ambite','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28012','Anchuelo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28013','Aranjuez','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28014','Arganda del Rey','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28015','Arroyomolinos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28016','Atazar (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28017','Batres','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28018','Becerril de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28019','Belmonte de Tajo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28020','Berzosa del Lozoya','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28021','Berrueco (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28022','Boadilla del Monte','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28023','Boalo (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28024','Braojos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28025','Brea de Tajo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28026','Brunete','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28027','Buitrago del Lozoya','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28028','Bustarviejo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28029','Cabanillas de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28030','Cabrera (La)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28031','Cadalso de los Vidrios','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28032','Camarma de Esteruelas','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28033','Campo Real','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28034','Canencia','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28035','Carabaña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28036','Casarrubuelos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28037','Cenicientos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28038','Cercedilla','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28039','Cervera de Buitrago','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28040','Ciempozuelos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28041','Cobeña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28042','Colmenar del Arroyo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28043','Colmenar de Oreja','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28044','Colmenarejo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28045','Colmenar Viejo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28046','Collado Mediano','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28047','Collado Villalba','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28048','Corpa','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28049','Coslada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28050','Cubas de la Sagra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28051','Chapinería','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28052','Chinchón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28053','Daganzo de Arriba','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28054','Escorial (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28055','Estremera','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28056','Fresnedillas de la Oliva','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28057','Fresno de Torote','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28058','Fuenlabrada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28059','Fuente el Saz de Jarama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28060','Fuentidueña de Tajo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28061','Galapagar','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28062','Garganta de los Montes','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28063','Gargantilla del Lozoya y Pinilla de Buitrago','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28064','Gascones','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28065','Getafe','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28066','Griñón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28067','Guadalix de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28068','Guadarrama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28069','Hiruela (La)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28070','Horcajo de la Sierra-Aoslos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28071','Horcajuelo de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28072','Hoyo de Manzanares','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28073','Humanes de Madrid','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28074','Leganés','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28075','Loeches','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28076','Lozoya','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28078','Madarcos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28079','Madrid','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28080','Majadahonda','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28082','Manzanares el Real','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28083','Meco','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28084','Mejorada del Campo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28085','Miraflores de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28086','Molar (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28087','Molinos (Los)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28088','Montejo de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28089','Moraleja de Enmedio','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28090','Moralzarzal','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28091','Morata de Tajuña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28092','Móstoles','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28093','Navacerrada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28094','Navalafuente','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28095','Navalagamella','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28096','Navalcarnero','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28097','Navarredonda y San Mamés','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28099','Navas del Rey','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28100','Nuevo Baztán','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28101','Olmeda de las Fuentes','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28102','Orusco de Tajuña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28104','Paracuellos de Jarama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28106','Parla','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28107','Patones','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28108','Pedrezuela','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28109','Pelayos de la Presa','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28110','Perales de Tajuña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28111','Pezuela de las Torres','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28112','Pinilla del Valle','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28113','Pinto','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28114','Piñuécar-Gandullas','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28115','Pozuelo de Alarcón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28116','Pozuelo del Rey','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28117','Prádena del Rincón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28118','Puebla de la Sierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28119','Quijorna','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28120','Rascafría','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28121','Redueña','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28122','Ribatejada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28123','Rivas-Vaciamadrid','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28124','Robledillo de la Jara','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28125','Robledo de Chavela','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28126','Robregordo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28127','Rozas de Madrid (Las)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28128','Rozas de Puerto Real','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28129','San Agustín del Guadalix','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28130','San Fernando de Henares','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28131','San Lorenzo de El Escorial','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28132','San Martín de la Vega','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28133','San Martín de Valdeiglesias','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28134','San Sebastián de los Reyes','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28135','Santa María de la Alameda','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28136','Santorcaz','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28137','Santos de la Humosa (Los)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28138','Serna del Monte (La)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28140','Serranillos del Valle','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28141','Sevilla la Nueva','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28143','Somosierra','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28144','Soto del Real','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28145','Talamanca de Jarama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28146','Tielmes','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28147','Titulcia','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28148','Torrejón de Ardoz','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28149','Torrejón de la Calzada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28150','Torrejón de Velasco','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28151','Torrelaguna','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28152','Torrelodones','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28153','Torremocha de Jarama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28154','Torres de la Alameda','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28155','Valdaracete','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28156','Valdeavero','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28157','Valdelaguna','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28158','Valdemanco','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28159','Valdemaqueda','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28160','Valdemorillo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28161','Valdemoro','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28162','Valdeolmos-Alalpardo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28163','Valdepiélagos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28164','Valdetorres de Jarama','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28165','Valdilecha','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28166','Valverde de Alcalá','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28167','Velilla de San Antonio','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28168','Vellón (El)','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28169','Venturada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28170','Villaconejos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28171','Villa del Prado','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28172','Villalbilla','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28173','Villamanrique de Tajo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28174','Villamanta','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28175','Villamantilla','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28176','Villanueva de la Cañada','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28177','Villanueva del Pardillo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28178','Villanueva de Perales','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28179','Villar del Olmo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28180','Villarejo de Salvanés','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28181','Villaviciosa de Odón','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28182','Villavieja del Lozoya','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28183','Zarzalejo','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28901','Lozoyuela-Navas-Sieteiglesias','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28902','Puentes Viejas','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'28903','Tres Cantos','M','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29001','Alameda','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29002','Alcaucín','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29003','Alfarnate','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29004','Alfarnatejo','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29005','Algarrobo','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29006','Algatocín','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29007','Alhaurín de la Torre','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29008','Alhaurín el Grande','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29009','Almáchar','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29010','Almargen','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29011','Almogía','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29012','Álora','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29013','Alozaina','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29014','Alpandeire','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29015','Antequera','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29016','Árchez','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29017','Archidona','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29018','Ardales','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29019','Arenas','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29020','Arriate','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29021','Atajate','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29022','Benadalid','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29023','Benahavís','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29024','Benalauría','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29025','Benalmádena','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29026','Benamargosa','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29027','Benamocarra','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29028','Benaoján','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29029','Benarrabá','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29030','Borge (El)','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29031','Burgo (El)','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29032','Campillos','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29033','Canillas de Aceituno','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29034','Canillas de Albaida','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29035','Cañete la Real','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29036','Carratraca','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29037','Cartajima','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29038','Cártama','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29039','Casabermeja','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29040','Casarabonela','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29041','Casares','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29042','Coín','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29043','Colmenar','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29044','Comares','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29045','Cómpeta','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29046','Cortes de la Frontera','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29047','Cuevas Bajas','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29048','Cuevas del Becerro','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29049','Cuevas de San Marcos','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29050','Cútar','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29051','Estepona','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29052','Faraján','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29053','Frigiliana','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29054','Fuengirola','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29055','Fuente de Piedra','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29056','Gaucín','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29057','Genalguacil','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29058','Guaro','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29059','Humilladero','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29060','Igualeja','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29061','Istán','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29062','Iznate','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29063','Jimera de Líbar','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29064','Jubrique','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29065','Júzcar','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29066','Macharaviaya','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29067','Málaga','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29068','Manilva','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29069','Marbella','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29070','Mijas','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29071','Moclinejo','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29072','Mollina','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29073','Monda','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29074','Montejaque','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29075','Nerja','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29076','Ojén','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29077','Parauta','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29079','Periana','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29080','Pizarra','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29081','Pujerra','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29082','Rincón de la Victoria','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29083','Riogordo','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29084','Ronda','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29085','Salares','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29086','Sayalonga','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29087','Sedella','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29088','Sierra de Yeguas','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29089','Teba','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29090','Tolox','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29091','Torrox','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29092','Totalán','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29093','Valle de Abdalajís','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29094','Vélez-Málaga','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29095','Villanueva de Algaidas','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29096','Villanueva del Rosario','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29097','Villanueva del Trabuco','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29098','Villanueva de Tapia','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29099','Viñuela','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29100','Yunquera','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29901','Torremolinos','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29902','Villanueva de la Concepción','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29903','Montecorto','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'29904','Serrato','MA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30001','Abanilla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30002','Abarán','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30003','Águilas','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30004','Albudeite','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30005','Alcantarilla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30006','Aledo','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30007','Alguazas','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30008','Alhama de Murcia','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30009','Archena','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30010','Beniel','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30011','Blanca','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30012','Bullas','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30013','Calasparra','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30014','Campos del Río','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30015','Caravaca de la Cruz','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30016','Cartagena','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30017','Cehegín','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30018','Ceutí','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30019','Cieza','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30020','Fortuna','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30021','Fuente Álamo de Murcia','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30022','Jumilla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30023','Librilla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30024','Lorca','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30025','Lorquí','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30026','Mazarrón','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30027','Molina de Segura','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30028','Moratalla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30029','Mula','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30030','Murcia','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30031','Ojós','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30032','Pliego','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30033','Puerto Lumbreras','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30034','Ricote','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30035','San Javier','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30036','San Pedro del Pinatar','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30037','Torre-Pacheco','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30038','Torres de Cotillas (Las)','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30039','Totana','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30040','Ulea','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30041','Unión (La)','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30042','Villanueva del Río Segura','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30043','Yecla','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30901','Santomera','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'30902','Alcázares (Los)','MU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31001','Abáigar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31002','Abárzuza/Abartzuza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31003','Abaurregaina/Abaurrea Alta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31004','Abaurrepea/Abaurrea Baja','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31005','Aberin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31006','Ablitas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31007','Adiós','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31008','Aguilar de Codés','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31009','Aibar/Oibar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31010','Altsasu/Alsasua','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31011','Allín/Allin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31012','Allo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31013','Améscoa Baja','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31014','Ancín','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31015','Andosilla','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31016','Ansoáin/Antsoain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31017','Anue','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31018','Añorbe','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31019','Aoiz/Agoitz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31020','Araitz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31021','Aranarache/Aranaratxe','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31022','Arantza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31023','Aranguren','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31024','Arano','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31025','Arakil','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31026','Aras','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31027','Arbizu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31028','Arce/Artzi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31029','Arcos (Los)','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31030','Arellano','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31031','Areso','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31032','Arguedas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31033','Aria','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31034','Aribe','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31035','Armañanzas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31036','Arróniz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31037','Arruazu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31038','Artajona','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31039','Artazu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31040','Atez/Atetz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31041','Ayegui/Aiegi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31042','Azagra','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31043','Azuelo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31044','Bakaiku','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31045','Barásoain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31046','Barbarin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31047','Bargota','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31048','Barillas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31049','Basaburua','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31050','Baztan','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31051','Beire','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31052','Belascoáin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31053','Berbinzana','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31054','Bertizarana','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31055','Betelu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31056','Biurrun-Olcoz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31057','Buñuel','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31058','Auritz/Burguete','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31059','Burgui/Burgi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31060','Burlada/Burlata','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31061','Busto (El)','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31062','Cabanillas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31063','Cabredo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31064','Cadreita','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31065','Caparroso','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31066','Cárcar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31067','Carcastillo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31068','Cascante','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31069','Cáseda','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31070','Castejón','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31071','Castillonuevo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31072','Cintruénigo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31073','Ziordia','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31074','Cirauqui/Zirauki','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31075','Ciriza/Ziritza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31076','Cizur','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31077','Corella','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31078','Cortes','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31079','Desojo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31080','Dicastillo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31081','Donamaria','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31082','Etxalar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31083','Echarri/Etxarri','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31084','Etxarri Aranatz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31085','Etxauri','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31086','Valle de Egüés/Eguesibar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31087','Elgorriaga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31088','Noáin (Valle de Elorz)/Noain (Elortzibar)','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31089','Enériz/Eneritz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31090','Eratsun','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31091','Ergoiena','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31092','Erro','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31093','Ezcároz/Ezkaroze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31094','Eslava','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31095','Esparza de Salazar/Espartza Zaraitzu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31096','Espronceda','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31097','Estella-Lizarra','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31098','Esteribar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31099','Etayo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31100','Eulate','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31101','Ezcabarte','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31102','Ezkurra','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31103','Ezprogui','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31104','Falces','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31105','Fitero','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31106','Fontellas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31107','Funes','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31108','Fustiñana','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31109','Galar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31110','Gallipienzo/Galipentzu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31111','Gallués/Galoze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31112','Garaioa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31113','Garde','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31114','Garínoain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31115','Garralda','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31116','Genevilla','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31117','Goizueta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31118','Goñi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31119','Güesa/Gorza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31120','Guesálaz/Gesalatz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31121','Guirguillano','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31122','Huarte/Uharte','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31123','Uharte Arakil','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31124','Ibargoiti','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31125','Igúzquiza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31126','Imotz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31127','Irañeta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31128','Isaba/Izaba','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31129','Ituren','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31130','Iturmendi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31131','Iza/Itza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31132','Izagaondoa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31133','Izalzu/Itzaltzu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31134','Jaurrieta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31135','Javier','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31136','Juslapeña','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31137','Beintza-Labaien','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31138','Lakuntza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31139','Lana','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31140','Lantz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31141','Lapoblación','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31142','Larraga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31143','Larraona','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31144','Larraun','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31145','Lazagurría','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31146','Leache/Leatxe','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31147','Legarda','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31148','Legaria','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31149','Leitza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31150','Leoz/Leotz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31151','Lerga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31152','Lerín','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31153','Lesaka','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31154','Lezaun','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31155','Liédena','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31156','Lizoáin-Arriasgoiti','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31157','Lodosa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31158','Lónguida/Longida','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31159','Lumbier','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31160','Luquin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31161','Mañeru','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31162','Marañón','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31163','Marcilla','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31164','Mélida','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31165','Mendavia','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31166','Mendaza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31167','Mendigorría','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31168','Metauten','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31169','Milagro','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31170','Mirafuentes','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31171','Miranda de Arga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31172','Monreal/Elo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31173','Monteagudo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31174','Morentin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31175','Mues','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31176','Murchante','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31177','Murieta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31178','Murillo el Cuende','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31179','Murillo el Fruto','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31180','Muruzábal','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31181','Navascués/Nabaskoze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31182','Nazar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31183','Obanos','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31184','Oco','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31185','Ochagavía/Otsagabia','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31186','Odieta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31187','Oiz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31188','Olaibar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31189','Olazti/Olazagutía','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31190','Olejua','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31191','Olite/Erriberri','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31192','Olóriz/Oloritz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31193','Cendea de Olza/Oltza Zendea','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31194','Valle de Ollo/Ollaran','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31195','Orbaizeta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31196','Orbara','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31197','Orísoain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31198','Oronz/Orontze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31199','Oroz-Betelu/Orotz-Betelu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31200','Oteiza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31201','Pamplona/Iruña','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31202','Peralta/Azkoien','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31203','Petilla de Aragón','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31204','Piedramillera','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31205','Pitillas','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31206','Puente la Reina/Gares','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31207','Pueyo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31208','Ribaforada','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31209','Romanzado','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31210','Roncal/Erronkari','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31211','Orreaga/Roncesvalles','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31212','Sada','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31213','Saldías','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31214','Salinas de Oro/Jaitz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31215','San Adrián','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31216','Sangüesa/Zangoza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31217','San Martín de Unx','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31219','Sansol','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31220','Santacara','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31221','Doneztebe/Santesteban','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31222','Sarriés/Sartze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31223','Sartaguda','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31224','Sesma','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31225','Sorlada','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31226','Sunbilla','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31227','Tafalla','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31228','Tiebas-Muruarte de Reta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31229','Tirapu','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31230','Torralba del Río','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31231','Torres del Río','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31232','Tudela','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31233','Tulebras','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31234','Ucar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31235','Ujué/Uxue','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31236','Ultzama','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31237','Unciti','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31238','Unzué/Untzue','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31239','Urdazubi/Urdax','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31240','Urdiain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31241','Urraul Alto','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31242','Urraul Bajo','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31243','Urroz-Villa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31244','Urroz','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31245','Urzainqui/Urzainki','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31246','Uterga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31247','Uztárroz/Uztarroze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31248','Luzaide/Valcarlos','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31249','Valtierra','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31250','Bera','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31251','Viana','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31252','Vidángoz/Bidankoze','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31253','Bidaurreta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31254','Villafranca','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31255','Villamayor de Monjardín','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31256','Hiriberri/Villanueva de Aezkoa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31257','Villatuerta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31258','Villava/Atarrabia','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31259','Igantzi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31260','Valle de Yerri/Deierri','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31261','Yesa','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31262','Zabalza/Zabaltza','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31263','Zubieta','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31264','Zugarramurdi','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31265','Zúñiga','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31901','Barañáin/Barañain','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31902','Berrioplano/Berriobeiti','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31903','Berriozar','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31904','Irurtzun','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31905','Beriáin','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31906','Orkoien','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31907','Zizur Mayor/Zizur Nagusia','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'31908','Lekunberri','','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32001','Allariz','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32002','Amoeiro','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32003','Arnoia (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32004','Avión','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32005','Baltar','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32006','Bande','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32007','Baños de Molgas','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32008','Barbadás','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32009','Barco de Valdeorras (O)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32010','Beade','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32011','Beariz','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32012','Blancos (Os)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32013','Boborás','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32014','Bola (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32015','Bolo (O)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32016','Calvos de Randín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32017','Carballeda de Valdeorras','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32018','Carballeda de Avia','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32019','Carballiño (O)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32020','Cartelle','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32021','Castrelo do Val','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32022','Castrelo de Miño','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32023','Castro Caldelas','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32024','Celanova','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32025','Cenlle','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32026','Coles','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32027','Cortegada','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32028','Cualedro','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32029','Chandrexa de Queixa','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32030','Entrimo','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32031','Esgos','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32032','Xinzo de Limia','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32033','Gomesende','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32034','Gudiña (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32035','Irixo (O)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32036','Xunqueira de Ambía','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32037','Xunqueira de Espadanedo','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32038','Larouco','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32039','Laza','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32040','Leiro','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32041','Lobeira','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32042','Lobios','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32043','Maceda','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32044','Manzaneda','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32045','Maside','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32046','Melón','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32047','Merca (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32048','Mezquita (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32049','Montederramo','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32050','Monterrei','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32051','Muíños','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32052','Nogueira de Ramuín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32053','Oímbra','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32054','Ourense','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32055','Paderne de Allariz','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32056','Padrenda','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32057','Parada de Sil','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32058','Pereiro de Aguiar (O)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32059','Peroxa (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32060','Petín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32061','Piñor','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32062','Porqueira','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32063','Pobra de Trives (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32064','Pontedeva','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32065','Punxín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32066','Quintela de Leirado','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32067','Rairiz de Veiga','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32068','Ramirás','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32069','Ribadavia','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32070','San Xoán de Río','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32071','Riós','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32072','Rúa (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32073','Rubiá','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32074','San Amaro','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32075','San Cibrao das Viñas','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32076','San Cristovo de Cea','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32077','Sandiás','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32078','Sarreaus','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32079','Taboadela','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32080','Teixeira (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32081','Toén','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32082','Trasmiras','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32083','Veiga (A)','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32084','Verea','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32085','Verín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32086','Viana do Bolo','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32087','Vilamarín','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32088','Vilamartín de Valdeorras','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32089','Vilar de Barrio','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32090','Vilar de Santos','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32091','Vilardevós','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'32092','Vilariño de Conso','OU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33001','Allande','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33002','Aller','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33003','Amieva','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33004','Avilés','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33005','Belmonte de Miranda','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33006','Bimenes','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33007','Boal','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33008','Cabrales','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33009','Cabranes','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33010','Candamo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33011','Cangas del Narcea','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33012','Cangas de Onís','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33013','Caravia','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33014','Carreño','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33015','Caso','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33016','Castrillón','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33017','Castropol','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33018','Coaña','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33019','Colunga','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33020','Corvera de Asturias','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33021','Cudillero','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33022','Degaña','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33023','Franco (El)','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33024','Gijón','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33025','Gozón','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33026','Grado','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33027','Grandas de Salime','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33028','Ibias','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33029','Illano','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33030','Illas','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33031','Langreo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33032','Laviana','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33033','Lena','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33034','Valdés','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33035','Llanera','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33036','Llanes','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33037','Mieres','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33038','Morcín','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33039','Muros de Nalón','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33040','Nava','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33041','Navia','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33042','Noreña','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33043','Onís','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33044','Oviedo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33045','Parres','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33046','Peñamellera Alta','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33047','Peñamellera Baja','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33048','Pesoz','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33049','Piloña','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33050','Ponga','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33051','Pravia','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33052','Proaza','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33053','Quirós','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33054','Regueras (Las)','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33055','Ribadedeva','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33056','Ribadesella','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33057','Ribera de Arriba','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33058','Riosa','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33059','Salas','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33060','San Martín del Rey Aurelio','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33061','San Martín de Oscos','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33062','Santa Eulalia de Oscos','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33063','San Tirso de Abres','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33064','Santo Adriano','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33065','Sariego','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33066','Siero','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33067','Sobrescobio','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33068','Somiedo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33069','Soto del Barco','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33070','Tapia de Casariego','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33071','Taramundi','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33072','Teverga','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33073','Tineo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33074','Vegadeo','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33075','Villanueva de Oscos','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33076','Villaviciosa','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33077','Villayón','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'33078','Yernes y Tameza','O','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34001','Abarca de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34003','Abia de las Torres','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34004','Aguilar de Campoo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34005','Alar del Rey','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34006','Alba de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34009','Amayuelas de Arriba','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34010','Ampudia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34011','Amusco','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34012','Antigüedad','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34015','Arconada','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34017','Astudillo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34018','Autilla del Pino','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34019','Autillo de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34020','Ayuela','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34022','Baltanás','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34023','Venta de Baños','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34024','Baquerín de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34025','Bárcena de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34027','Barruelo de Santullán','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34028','Báscones de Ojeda','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34029','Becerril de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34031','Belmonte de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34032','Berzosilla','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34033','Boada de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34034','Boadilla del Camino','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34035','Boadilla de Rioseco','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34036','Brañosera','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34037','Buenavista de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34038','Bustillo de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34039','Bustillo del Páramo de Carrión','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34041','Calahorra de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34042','Calzada de los Molinos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34045','Capillas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34046','Cardeñosa de Volpejera','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34047','Carrión de los Condes','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34048','Castil de Vela','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34049','Castrejón de la Peña','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34050','Castrillo de Don Juan','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34051','Castrillo de Onielo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34052','Castrillo de Villavega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34053','Castromocho','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34055','Cervatos de la Cueza','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34056','Cervera de Pisuerga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34057','Cevico de la Torre','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34058','Cevico Navero','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34059','Cisneros','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34060','Cobos de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34061','Collazos de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34062','Congosto de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34063','Cordovilla la Real','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34066','Cubillas de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34067','Dehesa de Montejo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34068','Dehesa de Romanos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34069','Dueñas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34070','Espinosa de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34071','Espinosa de Villagonzalo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34072','Frechilla','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34073','Fresno del Río','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34074','Frómista','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34076','Fuentes de Nava','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34077','Fuentes de Valdepero','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34079','Grijota','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34080','Guardo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34081','Guaza de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34082','Hérmedes de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34083','Herrera de Pisuerga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34084','Herrera de Valdecañas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34086','Hontoria de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34087','Hornillos de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34088','Husillos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34089','Itero de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34091','Lagartos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34092','Lantadilla','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34093','Vid de Ojeda (La)','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34094','Ledigos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34096','Lomas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34098','Magaz de Pisuerga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34099','Manquillos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34100','Mantinos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34101','Marcilla de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34102','Mazariegos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34103','Mazuecos de Valdeginate','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34104','Melgar de Yuso','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34106','Meneses de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34107','Micieces de Ojeda','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34108','Monzón de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34109','Moratinos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34110','Mudá','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34112','Nogal de las Huertas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34113','Olea de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34114','Olmos de Ojeda','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34116','Osornillo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34120','Palencia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34121','Palenzuela','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34122','Páramo de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34123','Paredes de Nava','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34124','Payo de Ojeda','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34125','Pedraza de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34126','Pedrosa de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34127','Perales','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34129','Pino del Río','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34130','Piña de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34131','Población de Arroyo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34132','Población de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34133','Población de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34134','Polentinos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34135','Pomar de Valdivia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34136','Poza de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34137','Pozo de Urama','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34139','Prádanos de Ojeda','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34140','Puebla de Valdavia (La)','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34141','Quintana del Puente','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34143','Quintanilla de Onsoña','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34146','Reinoso de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34147','Renedo de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34149','Requena de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34151','Respenda de la Peña','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34152','Revenga de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34154','Revilla de Collazos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34155','Ribas de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34156','Riberos de la Cueza','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34157','Saldaña','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34158','Salinas de Pisuerga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34159','San Cebrián de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34160','San Cebrián de Mudá','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34161','San Cristóbal de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34163','San Mamés de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34165','San Román de la Cuba','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34167','Santa Cecilia del Alcor','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34168','Santa Cruz de Boedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34169','Santervás de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34170','Santibáñez de Ecla','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34171','Santibáñez de la Peña','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34174','Santoyo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34175','Serna (La)','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34176','Sotobañado y Priorato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34177','Soto de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34178','Tabanera de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34179','Tabanera de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34180','Támara de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34181','Tariego de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34182','Torquemada','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34184','Torremormojón','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34185','Triollo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34186','Valbuena de Pisuerga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34189','Valdeolmillos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34190','Valderrábano','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34192','Valde-Ucieza','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34196','Valle de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34199','Velilla del Río Carrión','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34201','Vertavillo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34202','Villabasta de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34204','Villacidaler','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34205','Villaconancio','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34206','Villada','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34208','Villaeles de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34210','Villahán','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34211','Villaherreros','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34213','Villalaco','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34214','Villalba de Guardo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34215','Villalcázar de Sirga','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34216','Villalcón','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34217','Villalobón','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34218','Villaluenga de la Vega','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34220','Villamartín de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34221','Villamediana','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34222','Villameriel','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34223','Villamoronta','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34224','Villamuera de la Cueza','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34225','Villamuriel de Cerrato','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34227','Villanueva del Rebollar','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34228','Villanuño de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34229','Villaprovedo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34230','Villarmentero de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34231','Villarrabé','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34232','Villarramiel','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34233','Villasarracino','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34234','Villasila de Valdavia','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34236','Villaturde','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34237','Villaumbrales','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34238','Villaviudas','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34240','Villerías de Campos','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34241','Villodre','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34242','Villodrigo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34243','Villoldo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34245','Villota del Páramo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34246','Villovieco','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34901','Osorno la Mayor','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34902','Valle del Retortillo','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34903','Loma de Ucieza','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'34904','Pernía (La)','P','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36001','Arbo','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36002','Barro','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36003','Baiona','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36004','Bueu','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36005','Caldas de Reis','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36006','Cambados','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36007','Campo Lameiro','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36008','Cangas','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36009','Cañiza (A)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36010','Catoira','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36013','Covelo','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36014','Crecente','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36015','Cuntis','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36016','Dozón','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36017','Estrada (A)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36018','Forcarei','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36019','Fornelos de Montes','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36020','Agolada','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36021','Gondomar','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36022','Grove (O)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36023','Guarda (A)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36024','Lalín','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36025','Lama (A)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36026','Marín','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36027','Meaño','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36028','Meis','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36029','Moaña','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36030','Mondariz','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36031','Mondariz-Balneario','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36032','Moraña','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36033','Mos','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36034','Neves (As)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36035','Nigrán','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36036','Oia','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36037','Pazos de Borbén','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36038','Pontevedra','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36039','Porriño (O)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36040','Portas','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36041','Poio','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36042','Ponteareas','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36043','Ponte Caldelas','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36044','Pontecesures','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36045','Redondela','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36046','Ribadumia','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36047','Rodeiro','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36048','Rosal (O)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36049','Salceda de Caselas','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36050','Salvaterra de Miño','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36051','Sanxenxo','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36052','Silleda','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36053','Soutomaior','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36054','Tomiño','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36055','Tui','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36056','Valga','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36057','Vigo','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36058','Vilaboa','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36059','Vila de Cruces','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36060','Vilagarcía de Arousa','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36061','Vilanova de Arousa','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36901','Illa de Arousa (A)','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'36902','Cerdedo-Cotobade','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37001','Abusejo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37002','Agallas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37003','Ahigal de los Aceiteros','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37004','Ahigal de Villarino','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37005','Alameda de Gardón (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37006','Alamedilla (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37007','Alaraz','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37008','Alba de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37009','Alba de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37010','Alberca (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37011','Alberguería de Argañán (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37012','Alconada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37013','Aldeacipreste','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37014','Aldeadávila de la Ribera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37015','Aldea del Obispo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37016','Aldealengua','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37017','Aldeanueva de Figueroa','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37018','Aldeanueva de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37019','Aldearrodrigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37020','Aldearrubia','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37021','Aldeaseca de Alba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37022','Aldeaseca de la Frontera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37023','Aldeatejada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37024','Aldeavieja de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37025','Aldehuela de la Bóveda','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37026','Aldehuela de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37027','Almenara de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37028','Almendra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37029','Anaya de Alba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37030','Añover de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37031','Arabayona de Mógica','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37032','Arapiles','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37033','Arcediano','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37034','Arco (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37035','Armenteros','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37036','San Miguel del Robledo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37037','Atalaya (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37038','Babilafuente','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37039','Bañobárez','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37040','Barbadillo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37041','Barbalos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37042','Barceo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37044','Barruecopardo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37045','Bastida (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37046','Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37047','Beleña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37049','Bermellar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37050','Berrocal de Huebra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37051','Berrocal de Salvatierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37052','Boada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37054','Bodón (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37055','Bogajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37056','Bouza (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37057','Bóveda del Río Almar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37058','Brincones','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37059','Buenamadre','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37060','Buenavista','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37061','Cabaco (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37062','Cabezabellosa de la Calzada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37063','Cabeza de Béjar (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37065','Cabeza del Caballo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37067','Cabrerizos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37068','Cabrillas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37069','Calvarrasa de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37070','Calvarrasa de Arriba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37071','Calzada de Béjar (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37072','Calzada de Don Diego','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37073','Calzada de Valdunciel','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37074','Campillo de Azaba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37077','Campo de Peñaranda (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37078','Candelario','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37079','Canillas de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37080','Cantagallo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37081','Cantalapiedra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37082','Cantalpino','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37083','Cantaracillo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37085','Carbajosa de la Sagrada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37086','Carpio de Azaba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37087','Carrascal de Barregas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37088','Carrascal del Obispo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37089','Casafranca','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37090','Casas del Conde (Las)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37091','Casillas de Flores','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37092','Castellanos de Moriscos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37096','Castillejo de Martín Viejo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37097','Castraz','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37098','Cepeda','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37099','Cereceda de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37100','Cerezal de Peñahorcada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37101','Cerralbo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37102','Cerro (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37103','Cespedosa de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37104','Cilleros de la Bastida','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37106','Cipérez','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37107','Ciudad Rodrigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37108','Coca de Alba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37109','Colmenar de Montemayor','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37110','Cordovilla','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37112','Cristóbal','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37113','Cubo de Don Sancho (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37114','Chagarcía Medianero','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37115','Dios le Guarde','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37116','Doñinos de Ledesma','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37117','Doñinos de Salamanca','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37118','Éjeme','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37119','Encina (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37120','Encina de San Silvestre','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37121','Encinas de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37122','Encinas de Arriba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37123','Encinasola de los Comendadores','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37124','Endrinal','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37125','Escurial de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37126','Espadaña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37127','Espeja','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37128','Espino de la Orbada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37129','Florida de Liébana','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37130','Forfoleda','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37131','Frades de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37132','Fregeneda (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37133','Fresnedoso','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37134','Fresno Alhándiga','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37135','Fuente de San Esteban (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37136','Fuenteguinaldo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37137','Fuenteliante','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37138','Fuenterroble de Salvatierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37139','Fuentes de Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37140','Fuentes de Oñoro','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37141','Gajates','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37142','Galindo y Perahuy','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37143','Galinduste','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37144','Galisancho','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37145','Gallegos de Argañán','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37146','Gallegos de Solmirón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37147','Garcibuey','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37148','Garcihernández','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37149','Garcirrey','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37150','Gejuelo del Barro','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37151','Golpejas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37152','Gomecello','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37154','Guadramiro','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37155','Guijo de Ávila','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37156','Guijuelo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37157','Herguijuela de Ciudad Rodrigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37158','Herguijuela de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37159','Herguijuela del Campo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37160','Hinojosa de Duero','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37161','Horcajo de Montemayor','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37162','Horcajo Medianero','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37163','Hoya (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37164','Huerta','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37165','Iruelos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37166','Ituero de Azaba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37167','Juzbado','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37168','Lagunilla','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37169','Larrodrigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37170','Ledesma','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37171','Ledrada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37172','Linares de Riofrío','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37173','Lumbrales','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37174','Macotera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37175','Machacón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37176','Madroñal','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37177','Maíllo (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37178','Malpartida','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37179','Mancera de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37180','Manzano (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37181','Martiago','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37182','Martinamor','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37183','Martín de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37184','Masueco','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37185','Castellanos de Villiquera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37186','Mata de Ledesma (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37187','Matilla de los Caños del Río','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37188','Maya (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37189','Membribe de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37190','Mieza','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37191','Milano (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37192','Miranda de Azán','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37193','Miranda del Castañar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37194','Mogarraz','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37195','Molinillo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37196','Monforte de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37197','Monleón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37198','Monleras','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37199','Monsagro','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37200','Montejo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37201','Montemayor del Río','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37202','Monterrubio de Armuña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37203','Monterrubio de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37204','Morasverdes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37205','Morille','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37206','Moríñigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37207','Moriscos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37208','Moronta','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37209','Mozárbez','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37211','Narros de Matalayegua','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37212','Navacarros','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37213','Nava de Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37214','Nava de Francia','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37215','Nava de Sotrobal','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37216','Navales','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37217','Navalmoral de Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37218','Navamorales','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37219','Navarredonda de la Rinconada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37221','Navasfrías','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37222','Negrilla de Palencia','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37223','Olmedo de Camaces','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37224','Orbada (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37225','Pajares de la Laguna','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37226','Palacios del Arzobispo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37228','Palaciosrubios','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37229','Palencia de Negrilla','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37230','Parada de Arriba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37231','Parada de Rubiales','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37232','Paradinas de San Juan','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37233','Pastores','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37234','Payo (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37235','Pedraza de Alba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37236','Pedrosillo de Alba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37237','Pedrosillo de los Aires','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37238','Pedrosillo el Ralo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37239','Pedroso de la Armuña (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37240','Pelabravo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37241','Pelarrodríguez','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37242','Pelayos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37243','Peña (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37244','Peñacaballera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37245','Peñaparda','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37246','Peñaranda de Bracamonte','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37247','Peñarandilla','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37248','Peralejos de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37249','Peralejos de Arriba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37250','Pereña de la Ribera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37251','Peromingo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37252','Pinedas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37253','Pino de Tormes (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37254','Pitiegua','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37255','Pizarral','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37256','Poveda de las Cintas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37257','Pozos de Hinojo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37258','Puebla de Azaba','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37259','Puebla de San Medel','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37260','Puebla de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37261','Puente del Congosto','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37262','Puertas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37263','Puerto de Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37264','Puerto Seguro','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37265','Rágama','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37266','Redonda (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37267','Retortillo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37268','Rinconada de la Sierra (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37269','Robleda','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37270','Robliza de Cojos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37271','Rollán','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37272','Saelices el Chico','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37273','Sagrada (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37274','Salamanca','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37275','Saldeana','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37276','Salmoral','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37277','Salvatierra de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37278','San Cristóbal de la Cuesta','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37279','Sancti-Spíritus','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37280','Sanchón de la Ribera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37281','Sanchón de la Sagrada','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37282','Sanchotello','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37283','Sando','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37284','San Esteban de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37285','San Felices de los Gallegos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37286','San Martín del Castañar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37287','San Miguel de Valero','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37288','San Morales','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37289','San Muñoz','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37290','San Pedro del Valle','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37291','San Pedro de Rozados','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37292','San Pelayo de Guareña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37293','Santa María de Sando','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37294','Santa Marta de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37296','Santiago de la Puebla','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37297','Santibáñez de Béjar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37298','Santibáñez de la Sierra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37299','Santiz','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37300','Santos (Los)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37301','Sardón de los Frailes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37302','Saucelle','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37303','Sahugo (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37304','Sepulcro-Hilario','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37305','Sequeros','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37306','Serradilla del Arroyo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37307','Serradilla del Llano','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37309','Sierpe (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37310','Sieteiglesias de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37311','Sobradillo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37312','Sorihuela','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37313','Sotoserrano','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37314','Tabera de Abajo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37315','Tala (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37316','Tamames','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37317','Tarazona de Guareña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37318','Tardáguila','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37319','Tejado (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37320','Tejeda y Segoyuela','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37321','Tenebrón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37322','Terradillos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37323','Topas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37324','Tordillos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37325','Tornadizo (El)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37327','Torresmenudas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37328','Trabanca','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37329','Tremedal de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37330','Valdecarros','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37331','Valdefuentes de Sangusín','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37332','Valdehijaderos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37333','Valdelacasa','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37334','Valdelageve','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37335','Valdelosa','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37336','Valdemierque','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37337','Valderrodrigo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37338','Valdunciel','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37339','Valero','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37340','Valsalabroso','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37341','Valverde de Valdelacasa','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37342','Valverdón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37343','Vallejera de Riofrío','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37344','Vecinos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37345','Vega de Tirados','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37346','Veguillas (Las)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37347','Vellés (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37348','Ventosa del Río Almar','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37349','Vídola (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37350','Vilvestre','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37351','Villaflores','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37352','Villagonzalo de Tormes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37353','Villalba de los Llanos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37354','Villamayor','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37355','Villanueva del Conde','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37356','Villar de Argañán','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37357','Villar de Ciervo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37358','Villar de Gallimazo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37359','Villar de la Yegua','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37360','Villar de Peralonso','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37361','Villar de Samaniego','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37362','Villares de la Reina','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37363','Villares de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37364','Villarino de los Aires','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37365','Villarmayor','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37366','Villarmuerto','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37367','Villasbuenas','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37368','Villasdardo','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37369','Villaseco de los Gamitos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37370','Villaseco de los Reyes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37371','Villasrubias','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37372','Villaverde de Guareña','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37373','Villavieja de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37374','Villoria','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37375','Villoruela','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37376','Vitigudino','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37377','Yecla de Yeltes','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37378','Zamarra','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37379','Zamayón','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37380','Zarapicos','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37381','Zarza de Pumareda (La)','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'37382','Zorita de la Frontera','SA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39001','Alfoz de Lloredo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39002','Ampuero','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39003','Anievas','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39004','Arenas de Iguña','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39005','Argoños','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39006','Arnuero','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39007','Arredondo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39008','Astillero (El)','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39009','Bárcena de Cicero','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39010','Bárcena de Pie de Concha','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39011','Bareyo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39012','Cabezón de la Sal','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39013','Cabezón de Liébana','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39014','Cabuérniga','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39015','Camaleño','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39016','Camargo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39017','Campoo de Yuso','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39018','Cartes','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39019','Castañeda','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39020','Castro-Urdiales','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39021','Cieza','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39022','Cillorigo de Liébana','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39023','Colindres','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39024','Comillas','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39025','Corrales de Buelna (Los)','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39026','Corvera de Toranzo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39027','Campoo de Enmedio','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39028','Entrambasaguas','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39029','Escalante','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39030','Guriezo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39031','Hazas de Cesto','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39032','Hermandad de Campoo de Suso','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39033','Herrerías','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39034','Lamasón','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39035','Laredo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39036','Liendo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39037','Liérganes','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39038','Limpias','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39039','Luena','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39040','Marina de Cudeyo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39041','Mazcuerras','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39042','Medio Cudeyo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39043','Meruelo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39044','Miengo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39045','Miera','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39046','Molledo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39047','Noja','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39048','Penagos','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39049','Peñarrubia','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39050','Pesaguero','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39051','Pesquera','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39052','Piélagos','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39053','Polaciones','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39054','Polanco','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39055','Potes','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39056','Puente Viesgo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39057','Ramales de la Victoria','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39058','Rasines','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39059','Reinosa','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39060','Reocín','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39061','Ribamontán al Mar','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39062','Ribamontán al Monte','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39063','Rionansa','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39064','Riotuerto','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39065','Rozas de Valdearroyo (Las)','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39066','Ruente','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39067','Ruesga','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39068','Ruiloba','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39069','San Felices de Buelna','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39070','San Miguel de Aguayo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39071','San Pedro del Romeral','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39072','San Roque de Riomiera','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39073','Santa Cruz de Bezana','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39074','Santa María de Cayón','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39075','Santander','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39076','Santillana del Mar','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39077','Santiurde de Reinosa','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39078','Santiurde de Toranzo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39079','Santoña','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39080','San Vicente de la Barquera','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39081','Saro','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39082','Selaya','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39083','Soba','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39084','Solórzano','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39085','Suances','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39086','Tojos (Los)','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39087','Torrelavega','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39088','Tresviso','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39089','Tudanca','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39090','Udías','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39091','Valdáliga','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39092','Valdeolea','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39093','Valdeprado del Río','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39094','Valderredible','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39095','Val de San Vicente','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39096','Vega de Liébana','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39097','Vega de Pas','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39098','Villacarriedo','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39099','Villaescusa','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39100','Villafufre','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39101','Valle de Villaverde','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'39102','Voto','S','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40001','Abades','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40002','Adrada de Pirón','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40003','Adrados','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40004','Aguilafuente','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40005','Alconada de Maderuelo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40006','Aldealcorvo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40007','Aldealengua de Pedraza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40008','Aldealengua de Santa María','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40009','Aldeanueva de la Serrezuela','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40010','Aldeanueva del Codonal','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40012','Aldea Real','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40013','Aldeasoña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40014','Aldehorno','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40015','Aldehuela del Codonal','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40016','Aldeonte','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40017','Anaya','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40018','Añe','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40019','Arahuetes','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40020','Arcones','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40021','Arevalillo de Cega','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40022','Armuña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40024','Ayllón','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40025','Barbolla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40026','Basardilla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40028','Bercial','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40029','Bercimuel','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40030','Bernardos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40031','Bernuy de Porreros','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40032','Boceguillas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40033','Brieva','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40034','Caballar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40035','Cabañas de Polendos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40036','Cabezuela','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40037','Calabazas de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40039','Campo de San Pedro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40040','Cantalejo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40041','Cantimpalos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40043','Carbonero el Mayor','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40044','Carrascal del Río','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40045','Casla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40046','Castillejo de Mesleón','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40047','Castro de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40048','Castrojimeno','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40049','Castroserna de Abajo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40051','Castroserracín','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40052','Cedillo de la Torre','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40053','Cerezo de Abajo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40054','Cerezo de Arriba','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40055','Cilleruelo de San Mamés','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40056','Cobos de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40057','Coca','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40058','Codorniz','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40059','Collado Hermoso','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40060','Condado de Castilnovo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40061','Corral de Ayllón','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40062','Cubillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40063','Cuéllar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40065','Chañe','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40068','Domingo García','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40069','Donhierro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40070','Duruelo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40071','Encinas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40072','Encinillas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40073','Escalona del Prado','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40074','Escarabajosa de Cabezas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40075','Escobar de Polendos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40076','Espinar (El)','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40077','Espirdo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40078','Fresneda de Cuéllar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40079','Fresno de Cantespino','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40080','Fresno de la Fuente','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40081','Frumales','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40082','Fuente de Santa Cruz','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40083','Fuente el Olmo de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40084','Fuente el Olmo de Íscar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40086','Fuentepelayo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40087','Fuentepiñel','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40088','Fuenterrebollo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40089','Fuentesaúco de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40091','Fuentesoto','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40092','Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40093','Gallegos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40094','Garcillán','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40095','Gomezserracín','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40097','Grajera','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40099','Honrubia de la Cuesta','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40100','Hontalbilla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40101','Hontanares de Eresma','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40103','Huertos (Los)','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40104','Ituero y Lama','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40105','Juarros de Riomoros','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40106','Juarros de Voltoya','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40107','Labajos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40108','Laguna de Contreras','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40109','Languilla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40110','Lastras de Cuéllar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40111','Lastras del Pozo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40112','Lastrilla (La)','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40113','Losa (La)','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40115','Maderuelo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40118','Marazuela','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40119','Martín Miguel','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40120','Martín Muñoz de la Dehesa','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40121','Martín Muñoz de las Posadas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40122','Marugán','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40123','Matabuena','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40124','Mata de Cuéllar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40125','Matilla (La)','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40126','Melque de Cercos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40127','Membibre de la Hoz','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40128','Migueláñez','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40129','Montejo de Arévalo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40130','Montejo de la Vega de la Serrezuela','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40131','Monterrubio','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40132','Moral de Hornuez','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40134','Mozoncillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40135','Muñopedro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40136','Muñoveros','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40138','Nava de la Asunción','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40139','Navafría','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40140','Navalilla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40141','Navalmanzano','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40142','Navares de Ayuso','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40143','Navares de Enmedio','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40144','Navares de las Cuevas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40145','Navas de Oro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40146','Navas de San Antonio','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40148','Nieva','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40149','Olombrada','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40150','Orejana','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40151','Ortigosa de Pestaño','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40152','Otero de Herreros','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40154','Pajarejos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40155','Palazuelos de Eresma','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40156','Pedraza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40157','Pelayos del Arroyo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40158','Perosillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40159','Pinarejos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40160','Pinarnegrillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40161','Carabias','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40162','Prádena','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40163','Puebla de Pedraza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40164','Rapariegos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40165','Rebollo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40166','Remondo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40168','Riaguas de San Bartolomé','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40170','Riaza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40171','Ribota','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40172','Riofrío de Riaza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40173','Roda de Eresma','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40174','Sacramenia','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40176','Samboal','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40177','San Cristóbal de Cuéllar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40178','San Cristóbal de la Vega','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40179','Sanchonuño','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40180','Sangarcía','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40181','Real Sitio de San Ildefonso','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40182','San Martín y Mudrián','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40183','San Miguel de Bernuy','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40184','San Pedro de Gaíllos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40185','Santa María la Real de Nieva','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40186','Santa Marta del Cerro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40188','Santiuste de Pedraza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40189','Santiuste de San Juan Bautista','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40190','Santo Domingo de Pirón','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40191','Santo Tomé del Puerto','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40192','Sauquillo de Cabezas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40193','Sebúlcor','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40194','Segovia','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40195','Sepúlveda','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40196','Sequera de Fresno','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40198','Sotillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40199','Sotosalbos','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40200','Tabanera la Luenga','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40201','Tolocirio','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40202','Torreadrada','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40203','Torrecaballeros','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40204','Torrecilla del Pinar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40205','Torreiglesias','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40206','Torre Val de San Pedro','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40207','Trescasas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40208','Turégano','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40210','Urueñas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40211','Valdeprados','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40212','Valdevacas de Montejo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40213','Valdevacas y Guijar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40214','Valseca','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40215','Valtiendas','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40216','Valverde del Majano','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40218','Valle de Tabladillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40219','Vallelado','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40220','Valleruela de Pedraza','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40221','Valleruela de Sepúlveda','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40222','Veganzones','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40223','Vegas de Matute','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40224','Ventosilla y Tejadilla','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40225','Villacastín','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40228','Villaverde de Íscar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40229','Villaverde de Montejo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40230','Villeguillo','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40231','Yanguas de Eresma','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40233','Zarzuela del Monte','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40234','Zarzuela del Pinar','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40901','Ortigosa del Monte','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40902','Cozuelos de Fuentidueña','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40903','Marazoleja','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40904','Navas de Riofrío','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40905','Cuevas de Provanco','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'40906','San Cristóbal de Segovia','SG','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41001','Aguadulce','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41002','Alanís','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41003','Albaida del Aljarafe','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41004','Alcalá de Guadaíra','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41005','Alcalá del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41006','Alcolea del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41007','Algaba (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41008','Algámitas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41009','Almadén de la Plata','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41010','Almensilla','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41011','Arahal','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41012','Aznalcázar','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41013','Aznalcóllar','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41014','Badolatosa','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41015','Benacazón','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41016','Bollullos de la Mitación','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41017','Bormujos','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41018','Brenes','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41019','Burguillos','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41020','Cabezas de San Juan (Las)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41021','Camas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41022','Campana (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41023','Cantillana','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41024','Carmona','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41025','Carrión de los Céspedes','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41026','Casariche','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41027','Castilblanco de los Arroyos','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41028','Castilleja de Guzmán','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41029','Castilleja de la Cuesta','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41030','Castilleja del Campo','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41031','Castillo de las Guardas (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41032','Cazalla de la Sierra','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41033','Constantina','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41034','Coria del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41035','Coripe','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41036','Coronil (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41037','Corrales (Los)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41038','Dos Hermanas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41039','Écija','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41040','Espartinas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41041','Estepa','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41042','Fuentes de Andalucía','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41043','Garrobo (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41044','Gelves','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41045','Gerena','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41046','Gilena','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41047','Gines','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41048','Guadalcanal','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41049','Guillena','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41050','Herrera','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41051','Huévar del Aljarafe','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41052','Lantejuela','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41053','Lebrija','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41054','Lora de Estepa','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41055','Lora del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41056','Luisiana (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41057','Madroño (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41058','Mairena del Alcor','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41059','Mairena del Aljarafe','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41060','Marchena','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41061','Marinaleda','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41062','Martín de la Jara','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41063','Molares (Los)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41064','Montellano','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41065','Morón de la Frontera','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41066','Navas de la Concepción (Las)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41067','Olivares','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41068','Osuna','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41069','Palacios y Villafranca (Los)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41070','Palomares del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41071','Paradas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41072','Pedrera','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41073','Pedroso (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41074','Peñaflor','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41075','Pilas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41076','Pruna','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41077','Puebla de Cazalla (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41078','Puebla de los Infantes (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41079','Puebla del Río (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41080','Real de la Jara (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41081','Rinconada (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41082','Roda de Andalucía (La)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41083','Ronquillo (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41084','Rubio (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41085','Salteras','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41086','San Juan de Aznalfarache','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41087','Sanlúcar la Mayor','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41088','San Nicolás del Puerto','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41089','Santiponce','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41090','Saucejo (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41091','Sevilla','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41092','Tocina','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41093','Tomares','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41094','Umbrete','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41095','Utrera','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41096','Valencina de la Concepción','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41097','Villamanrique de la Condesa','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41098','Villanueva del Ariscal','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41099','Villanueva del Río y Minas','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41100','Villanueva de San Juan','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41101','Villaverde del Río','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41102','Viso del Alcor (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41901','Cañada Rosal','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41902','Isla Mayor','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41903','Cuervo de Sevilla (El)','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'41904','Palmar de Troya, El','SE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42001','Abejar','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42003','Adradas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42004','Ágreda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42006','Alconaba','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42007','Alcubilla de Avellaneda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42008','Alcubilla de las Peñas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42009','Aldealafuente','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42010','Aldealices','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42011','Aldealpozo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42012','Aldealseñor','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42013','Aldehuela de Periáñez','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42014','Aldehuelas (Las)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42015','Alentisque','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42016','Aliud','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42017','Almajano','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42018','Almaluez','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42019','Almarza','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42020','Almazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42021','Almazul','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42022','Almenar de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42023','Alpanseque','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42024','Arancón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42025','Arcos de Jalón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42026','Arenillas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42027','Arévalo de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42028','Ausejo de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42029','Baraona','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42030','Barca','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42031','Barcones','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42032','Bayubas de Abajo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42033','Bayubas de Arriba','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42034','Beratón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42035','Berlanga de Duero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42036','Blacos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42037','Bliecos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42038','Borjabad','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42039','Borobia','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42041','Buberos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42042','Buitrago','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42043','Burgo de Osma-Ciudad de Osma','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42044','Cabrejas del Campo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42045','Cabrejas del Pinar','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42046','Calatañazor','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42048','Caltojar','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42049','Candilichera','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42050','Cañamaque','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42051','Carabantes','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42052','Caracena','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42053','Carrascosa de Abajo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42054','Carrascosa de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42055','Casarejos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42056','Castilfrío de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42057','Castilruiz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42058','Castillejo de Robledo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42059','Centenera de Andaluz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42060','Cerbón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42061','Cidones','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42062','Cigudosa','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42063','Cihuela','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42064','Ciria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42065','Cirujales del Río','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42068','Coscurita','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42069','Covaleda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42070','Cubilla','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42071','Cubo de la Solana','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42073','Cueva de Ágreda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42075','Dévanos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42076','Deza','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42078','Duruelo de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42079','Escobosa de Almazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42080','Espeja de San Marcelino','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42081','Espejón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42082','Estepa de San Juan','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42083','Frechilla de Almazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42084','Fresno de Caracena','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42085','Fuentearmegil','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42086','Fuentecambrón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42087','Fuentecantos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42088','Fuentelmonge','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42089','Fuentelsaz de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42090','Fuentepinilla','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42092','Fuentes de Magaña','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42093','Fuentestrún','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42094','Garray','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42095','Golmayo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42096','Gómara','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42097','Gormaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42098','Herrera de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42100','Hinojosa del Campo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42103','Langa de Duero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42105','Liceras','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42106','Losilla (La)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42107','Magaña','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42108','Maján','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42110','Matalebreras','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42111','Matamala de Almazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42113','Medinaceli','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42115','Miño de Medinaceli','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42116','Miño de San Esteban','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42117','Molinos de Duero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42118','Momblona','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42119','Monteagudo de las Vicarías','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42120','Montejo de Tiermes','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42121','Montenegro de Cameros','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42123','Morón de Almazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42124','Muriel de la Fuente','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42125','Muriel Viejo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42127','Nafría de Ucero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42128','Narros','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42129','Navaleno','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42130','Nepas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42131','Nolay','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42132','Noviercas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42134','Ólvega','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42135','Oncala','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42139','Pinilla del Campo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42140','Portillo de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42141','Póveda de Soria (La)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42142','Pozalmuro','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42144','Quintana Redonda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42145','Quintanas de Gormaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42148','Quiñonería','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42149','Rábanos (Los)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42151','Rebollar','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42152','Recuerda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42153','Rello','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42154','Renieblas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42155','Retortillo de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42156','Reznos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42157','Riba de Escalote (La)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42158','Rioseco de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42159','Rollamienta','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42160','Royo (El)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42161','Salduero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42162','San Esteban de Gormaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42163','San Felices','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42164','San Leonardo de Yagüe','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42165','San Pedro Manrique','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42166','Santa Cruz de Yanguas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42167','Santa María de Huerta','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42168','Santa María de las Hoyas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42171','Serón de Nágima','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42172','Soliedra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42173','Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42174','Sotillo del Rincón','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42175','Suellacabras','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42176','Tajahuerce','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42177','Tajueco','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42178','Talveila','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42181','Tardelcuende','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42182','Taroda','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42183','Tejado','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42184','Torlengua','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42185','Torreblacos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42187','Torrubia de Soria','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42188','Trévago','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42189','Ucero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42190','Vadillo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42191','Valdeavellano de Tera','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42192','Valdegeña','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42193','Valdelagua del Cerro','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42194','Valdemaluque','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42195','Valdenebro','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42196','Valdeprado','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42197','Valderrodilla','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42198','Valtajeros','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42200','Velamazán','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42201','Velilla de la Sierra','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42202','Velilla de los Ajos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42204','Viana de Duero','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42205','Villaciervos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42206','Villanueva de Gormaz','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42207','Villar del Ala','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42208','Villar del Campo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42209','Villar del Río','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42211','Villares de Soria (Los)','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42212','Villasayas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42213','Villaseca de Arciel','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42215','Vinuesa','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42216','Vizmanos','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42217','Vozmediano','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42218','Yanguas','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'42219','Yelo','SO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43001','Aiguamúrcia','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43002','Albinyana','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43003','Albiol (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43004','Alcanar','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43005','Alcover','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43006','Aldover','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43007','Aleixar (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43008','Alfara de Carles','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43009','Alforja','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43010','Alió','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43011','Almoster','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43012','Altafulla','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43013','Ametlla de Mar (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43014','Amposta','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43015','Arbolí','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43016','Arboç (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43017','Argentera (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43018','Arnes','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43019','Ascó','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43020','Banyeres del Penedès','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43021','Barberà de la Conca','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43022','Batea','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43023','Bellmunt del Priorat','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43024','Bellvei','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43025','Benifallet','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43026','Benissanet','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43027','Bisbal de Falset (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43028','Bisbal del Penedès (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43029','Blancafort','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43030','Bonastre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43031','Borges del Camp (Les)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43032','Bot','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43033','Botarell','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43034','Bràfim','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43035','Cabacés','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43036','Cabra del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43037','Calafell','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43038','Cambrils','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43039','Capafonts','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43040','Capçanes','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43041','Caseres','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43042','Castellvell del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43043','Catllar (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43044','Sénia (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43045','Colldejou','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43046','Conesa','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43047','Constantí','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43048','Corbera d''Ebre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43049','Cornudella de Montsant','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43050','Creixell','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43051','Cunit','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43052','Xerta','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43053','Duesaigües','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43054','Espluga de Francolí (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43055','Falset','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43056','Fatarella (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43057','Febró (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43058','Figuera (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43059','Figuerola del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43060','Flix','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43061','Forès','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43062','Freginals','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43063','Galera (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43064','Gandesa','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43065','Garcia','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43066','Garidells (Els)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43067','Ginestar','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43068','Godall','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43069','Gratallops','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43070','Guiamets (Els)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43071','Horta de Sant Joan','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43072','Lloar (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43073','Llorac','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43074','Llorenç del Penedès','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43075','Margalef','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43076','Marçà','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43077','Mas de Barberans','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43078','Masdenverge','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43079','Masllorenç','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43080','Masó (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43081','Maspujols','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43082','Masroig (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43083','Milà (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43084','Miravet','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43085','Molar (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43086','Montblanc','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43088','Montbrió del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43089','Montferri','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43090','Montmell (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43091','Mont-ral','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43092','Mont-roig del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43093','Móra d''Ebre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43094','Móra la Nova','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43095','Morell (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43096','Morera de Montsant (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43097','Nou de Gaià (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43098','Nulles','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43099','Palma d''Ebre (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43100','Pallaresos (Els)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43101','Passanant i Belltall','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43102','Paüls','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43103','Perafort','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43104','Perelló (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43105','Piles (Les)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43106','Pinell de Brai (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43107','Pira','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43108','Pla de Santa Maria (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43109','Pobla de Mafumet (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43110','Pobla de Massaluca (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43111','Pobla de Montornès (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43112','Poboleda','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43113','Pont d''Armentera (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43114','Porrera','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43115','Pradell de la Teixeta','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43116','Prades','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43117','Prat de Comte','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43118','Pratdip','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43119','Puigpelat','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43120','Querol','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43121','Rasquera','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43122','Renau','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43123','Reus','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43124','Riba (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43125','Riba-roja d''Ebre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43126','Riera de Gaià (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43127','Riudecanyes','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43128','Riudecols','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43129','Riudoms','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43130','Rocafort de Queralt','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43131','Roda de Berà','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43132','Rodonyà','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43133','Roquetes','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43134','Rourell (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43135','Salomó','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43136','Sant Carles de la Ràpita','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43137','Sant Jaume dels Domenys','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43138','Santa Bàrbara','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43139','Santa Coloma de Queralt','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43140','Santa Oliva','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43141','Pontils','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43142','Sarral','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43143','Savallà del Comtat','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43144','Secuita (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43145','Selva del Camp (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43146','Senan','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43147','Solivella','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43148','Tarragona','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43149','Tivenys','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43150','Tivissa','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43151','Torre de Fontaubella (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43152','Torre de l''Espanyol (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43153','Torredembarra','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43154','Torroja del Priorat','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43155','Tortosa','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43156','Ulldecona','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43157','Ulldemolins','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43158','Vallclara','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43159','Vallfogona de Riucorb','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43160','Vallmoll','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43161','Valls','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43162','Vandellòs i l''Hospitalet de l''Infant','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43163','Vendrell (El)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43164','Vespella de Gaià','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43165','Vilabella','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43166','Vilallonga del Camp','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43167','Vilanova d''Escornalbou','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43168','Vilanova de Prades','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43169','Vilaplana','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43170','Vila-rodona','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43171','Vila-seca','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43172','Vilaverd','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43173','Vilella Alta (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43174','Vilella Baixa (La)','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43175','Vilalba dels Arcs','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43176','Vimbodí i Poblet','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43177','Vinebre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43178','Vinyols i els Arcs','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43901','Deltebre','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43902','Sant Jaume d''Enveja','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43903','Camarles','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43904','Aldea (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43905','Salou','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43906','Ampolla (L'')','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'43907','Canonja, La','T','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44001','Ababuj','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44002','Abejuela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44003','Aguatón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44004','Aguaviva','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44005','Aguilar del Alfambra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44006','Alacón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44007','Alba','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44008','Albalate del Arzobispo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44009','Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44010','Albentosa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44011','Alcaine','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44012','Alcalá de la Selva','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44013','Alcañiz','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44014','Alcorisa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44016','Alfambra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44017','Aliaga','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44018','Almohaja','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44019','Alobras','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44020','Alpeñés','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44021','Allepuz','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44022','Alloza','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44023','Allueva','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44024','Anadón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44025','Andorra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44026','Arcos de las Salinas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44027','Arens de Lledó','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44028','Argente','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44029','Ariño','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44031','Azaila','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44032','Bádenas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44033','Báguena','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44034','Bañón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44035','Barrachina','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44036','Bea','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44037','Beceite','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44038','Belmonte de San José','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44039','Bello','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44040','Berge','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44041','Bezas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44042','Blancas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44043','Blesa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44044','Bordón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44045','Bronchales','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44046','Bueña','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44047','Burbáguena','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44048','Cabra de Mora','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44049','Calaceite','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44050','Calamocha','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44051','Calanda','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44052','Calomarde','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44053','Camañas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44054','Camarena de la Sierra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44055','Camarillas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44056','Caminreal','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44059','Cantavieja','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44060','Cañada de Benatanduz','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44061','Cañada de Verich (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44062','Cañada Vellida','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44063','Cañizar del Olivar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44064','Cascante del Río','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44065','Castejón de Tornos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44066','Castel de Cabra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44067','Castelnou','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44068','Castelserás','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44070','Castellar (El)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44071','Castellote','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44074','Cedrillas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44075','Celadas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44076','Cella','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44077','Cerollera (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44080','Codoñera (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44082','Corbalán','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44084','Cortes de Aragón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44085','Cosa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44086','Cretas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44087','Crivillén','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44088','Cuba (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44089','Cubla','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44090','Cucalón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44092','Cuervo (El)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44093','Cuevas de Almudén','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44094','Cuevas Labradas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44096','Ejulve','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44097','Escorihuela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44099','Escucha','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44100','Estercuel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44101','Ferreruela de Huerva','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44102','Fonfría','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44103','Formiche Alto','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44105','Fórnoles','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44106','Fortanete','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44107','Foz-Calanda','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44108','Fresneda (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44109','Frías de Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44110','Fuenferrada','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44111','Fuentes Calientes','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44112','Fuentes Claras','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44113','Fuentes de Rubielos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44114','Fuentespalda','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44115','Galve','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44116','Gargallo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44117','Gea de Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44118','Ginebrosa (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44119','Griegos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44120','Guadalaviar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44121','Gúdar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44122','Híjar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44123','Hinojosa de Jarque','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44124','Hoz de la Vieja (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44125','Huesa del Común','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44126','Iglesuela del Cid (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44127','Jabaloyas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44128','Jarque de la Val','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44129','Jatiel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44130','Jorcas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44131','Josa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44132','Lagueruela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44133','Lanzuela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44135','Libros','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44136','Lidón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44137','Linares de Mora','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44138','Loscos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44141','Lledó','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44142','Maicas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44143','Manzanera','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44144','Martín del Río','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44145','Mas de las Matas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44146','Mata de los Olmos (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44147','Mazaleón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44148','Mezquita de Jarque','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44149','Mirambel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44150','Miravete de la Sierra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44151','Molinos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44152','Monforte de Moyuela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44153','Monreal del Campo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44154','Monroyo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44155','Montalbán','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44156','Monteagudo del Castillo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44157','Monterde de Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44158','Mora de Rubielos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44159','Moscardón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44160','Mosqueruela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44161','Muniesa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44163','Noguera de Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44164','Nogueras','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44165','Nogueruelas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44167','Obón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44168','Odón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44169','Ojos Negros','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44171','Olba','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44172','Oliete','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44173','Olmos (Los)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44174','Orihuela del Tremedal','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44175','Orrios','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44176','Palomar de Arroyos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44177','Pancrudo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44178','Parras de Castellote (Las)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44179','Peñarroya de Tastavins','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44180','Peracense','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44181','Peralejos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44182','Perales del Alfambra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44183','Pitarque','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44184','Plou','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44185','Pobo (El)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44187','Portellada (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44189','Pozondón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44190','Pozuel del Campo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44191','Puebla de Híjar (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44192','Puebla de Valverde (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44193','Puertomingalvo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44194','Ráfales','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44195','Rillo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44196','Riodeva','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44197','Ródenas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44198','Royuela','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44199','Rubiales','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44200','Rubielos de la Cérida','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44201','Rubielos de Mora','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44203','Salcedillo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44204','Saldón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44205','Samper de Calanda','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44206','San Agustín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44207','San Martín del Río','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44208','Santa Cruz de Nogueras','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44209','Santa Eulalia','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44210','Sarrión','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44211','Segura de los Baños','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44212','Seno','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44213','Singra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44215','Terriente','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44216','Teruel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44217','Toril y Masegoso','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44218','Tormón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44219','Tornos','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44220','Torralba de los Sisones','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44221','Torrecilla de Alcañiz','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44222','Torrecilla del Rebollar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44223','Torre de Arcas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44224','Torre de las Arcas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44225','Torre del Compte','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44226','Torrelacárcel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44227','Torre los Negros','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44228','Torremocha de Jiloca','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44229','Torres de Albarracín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44230','Torrevelilla','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44231','Torrijas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44232','Torrijo del Campo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44234','Tramacastiel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44235','Tramacastilla','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44236','Tronchón','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44237','Urrea de Gaén','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44238','Utrillas','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44239','Valacloche','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44240','Valbona','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44241','Valdealgorfa','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44243','Valdecuenca','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44244','Valdelinares','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44245','Valdeltormo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44246','Valderrobres','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44247','Valjunquera','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44249','Vallecillo (El)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44250','Veguillas de la Sierra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44251','Villafranca del Campo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44252','Villahermosa del Campo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44256','Villanueva del Rebollar de la Sierra','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44257','Villar del Cobo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44258','Villar del Salz','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44260','Villarluengo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44261','Villarquemado','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44262','Villarroya de los Pinares','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44263','Villastar','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44264','Villel','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44265','Vinaceite','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44266','Visiedo','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44267','Vivel del Río Martín','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'44268','Zoma (La)','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45001','Ajofrín','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45002','Alameda de la Sagra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45003','Albarreal de Tajo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45004','Alcabón','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45005','Alcañizo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45006','Alcaudete de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45007','Alcolea de Tajo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45008','Aldea en Cabo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45009','Aldeanueva de Barbarroya','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45010','Aldeanueva de San Bartolomé','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45011','Almendral de la Cañada','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45012','Almonacid de Toledo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45013','Almorox','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45014','Añover de Tajo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45015','Arcicóllar','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45016','Argés','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45017','Azután','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45018','Barcience','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45019','Bargas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45020','Belvís de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45021','Borox','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45022','Buenaventura','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45023','Burguillos de Toledo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45024','Burujón','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45025','Cabañas de la Sagra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45026','Cabañas de Yepes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45027','Cabezamesada','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45028','Calera y Chozas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45029','Caleruela','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45030','Calzada de Oropesa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45031','Camarena','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45032','Camarenilla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45033','Campillo de la Jara (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45034','Camuñas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45035','Cardiel de los Montes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45036','Carmena','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45037','Carpio de Tajo (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45038','Carranque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45039','Carriches','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45040','Casar de Escalona (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45041','Casarrubios del Monte','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45042','Casasbuenas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45043','Castillo de Bayuela','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45045','Cazalegas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45046','Cebolla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45047','Cedillo del Condado','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45048','Cerralbos (Los)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45049','Cervera de los Montes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45050','Ciruelos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45051','Cobeja','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45052','Cobisa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45053','Consuegra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45054','Corral de Almaguer','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45055','Cuerva','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45056','Chozas de Canales','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45057','Chueca','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45058','Domingo Pérez','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45059','Dosbarrios','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45060','Erustes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45061','Escalona','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45062','Escalonilla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45063','Espinoso del Rey','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45064','Esquivias','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45065','Estrella (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45066','Fuensalida','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45067','Gálvez','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45068','Garciotum','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45069','Gerindote','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45070','Guadamur','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45071','Guardia (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45072','Herencias (Las)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45073','Herreruela de Oropesa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45074','Hinojosa de San Vicente','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45075','Hontanar','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45076','Hormigos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45077','Huecas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45078','Huerta de Valdecarábanos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45079','Iglesuela del Tiétar, La','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45080','Illán de Vacas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45081','Illescas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45082','Lagartera','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45083','Layos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45084','Lillo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45085','Lominchar','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45086','Lucillos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45087','Madridejos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45088','Magán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45089','Malpica de Tajo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45090','Manzaneque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45091','Maqueda','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45092','Marjaliza','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45093','Marrupe','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45094','Mascaraque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45095','Mata (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45096','Mazarambroz','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45097','Mejorada','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45098','Menasalbas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45099','Méntrida','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45100','Mesegar de Tajo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45101','Miguel Esteban','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45102','Mocejón','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45103','Mohedas de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45104','Montearagón','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45105','Montesclaros','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45106','Mora','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45107','Nambroca','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45108','Nava de Ricomalillo (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45109','Navahermosa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45110','Navalcán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45111','Navalmoralejo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45112','Navalmorales (Los)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45113','Navalucillos (Los)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45114','Navamorcuende','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45115','Noblejas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45116','Noez','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45117','Nombela','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45118','Novés','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45119','Numancia de la Sagra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45120','Nuño Gómez','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45121','Ocaña','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45122','Olías del Rey','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45123','Ontígola','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45124','Orgaz','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45125','Oropesa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45126','Otero','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45127','Palomeque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45128','Pantoja','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45129','Paredes de Escalona','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45130','Parrillas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45131','Pelahustán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45132','Pepino','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45133','Polán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45134','Portillo de Toledo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45135','Puebla de Almoradiel (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45136','Puebla de Montalbán (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45137','Pueblanueva (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45138','Puente del Arzobispo (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45139','Puerto de San Vicente','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45140','Pulgar','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45141','Quero','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45142','Quintanar de la Orden','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45143','Quismondo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45144','Real de San Vicente (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45145','Recas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45146','Retamoso de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45147','Rielves','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45148','Robledo del Mazo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45149','Romeral (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45150','San Bartolomé de las Abiertas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45151','San Martín de Montalbán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45152','San Martín de Pusa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45153','San Pablo de los Montes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45154','San Román de los Montes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45155','Santa Ana de Pusa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45156','Santa Cruz de la Zarza','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45157','Santa Cruz del Retamar','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45158','Santa Olalla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45159','Sartajada','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45160','Segurilla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45161','Seseña','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45162','Sevilleja de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45163','Sonseca','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45164','Sotillo de las Palomas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45165','Talavera de la Reina','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45166','Tembleque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45167','Toboso (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45168','Toledo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45169','Torralba de Oropesa','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45170','Torrecilla de la Jara','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45171','Torre de Esteban Hambrán (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45172','Torrico','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45173','Torrijos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45174','Totanés','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45175','Turleque','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45176','Ugena','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45177','Urda','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45179','Valdeverdeja','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45180','Valmojado','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45181','Velada','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45182','Ventas con Peña Aguilera (Las)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45183','Ventas de Retamosa (Las)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45184','Ventas de San Julián (Las)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45185','Villacañas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45186','Villa de Don Fadrique (La)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45187','Villafranca de los Caballeros','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45188','Villaluenga de la Sagra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45189','Villamiel de Toledo','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45190','Villaminaya','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45191','Villamuelas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45192','Villanueva de Alcardete','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45193','Villanueva de Bogas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45194','Villarejo de Montalbán','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45195','Villarrubia de Santiago','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45196','Villaseca de la Sagra','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45197','Villasequilla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45198','Villatobas','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45199','Viso de San Juan (El)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45200','Yébenes (Los)','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45201','Yeles','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45202','Yepes','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45203','Yuncler','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45204','Yunclillos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45205','Yuncos','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'45901','Santo Domingo-Caudilla','TO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46001','Ademuz','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46002','Ador','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46003','Atzeneta d''Albaida','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46004','Agullent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46005','Alaquàs','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46006','Albaida','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46007','Albal','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46008','Albalat de la Ribera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46009','Albalat dels Sorells','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46010','Albalat dels Tarongers','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46011','Alberic','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46012','Alborache','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46013','Alboraia/Alboraya','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46014','Albuixech','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46015','Alcàsser','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46016','Alcàntera de Xúquer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46017','Alzira','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46018','Alcublas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46019','Alcúdia (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46020','Alcúdia de Crespins (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46021','Aldaia','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46022','Alfafar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46023','Alfauir','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46024','Alfara de la Baronia','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46025','Alfara del Patriarca','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46026','Alfarp','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46027','Alfarrasí','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46028','Algar de Palancia','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46029','Algemesí','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46030','Algímia d’Alfara','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46031','Alginet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46032','Almàssera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46033','Almiserà','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46034','Almoines','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46035','Almussafes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46036','Alpuente','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46037','Alqueria de la Comtessa (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46038','Andilla','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46039','Anna','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46040','Antella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46041','Aras de los Olmos','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46042','Aielo de Malferit','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46043','Aielo de Rugat','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46044','Ayora','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46045','Barxeta','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46046','Barx','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46047','Bèlgida','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46048','Bellreguard','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46049','Bellús','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46050','Benagéber','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46051','Benaguasil','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46052','Benavites','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46053','Beneixida','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46054','Benetússer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46055','Beniarjó','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46056','Beniatjar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46057','Benicolet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46058','Benifairó de les Valls','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46059','Benifairó de la Valldigna','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46060','Benifaió','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46061','Beniflá','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46062','Benigànim','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46063','Benimodo','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46064','Benimuslem','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46065','Beniparrell','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46066','Benirredrà','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46067','Benissanó','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46068','Benissoda','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46069','Benissuera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46070','Bétera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46071','Bicorp','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46072','Bocairent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46073','Bolbaite','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46074','Bonrepòs i Mirambell','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46075','Bufali','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46076','Bugarra','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46077','Buñol','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46078','Burjassot','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46079','Calles','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46080','Camporrobles','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46081','Canals','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46082','Canet d''En Berenguer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46083','Carcaixent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46084','Càrcer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46085','Carlet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46086','Carrícola','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46087','Casas Altas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46088','Casas Bajas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46089','Casinos','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46090','Castelló de Rugat','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46091','Castellonet de la Conquesta','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46092','Castielfabib','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46093','Catadau','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46094','Catarroja','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46095','Caudete de las Fuentes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46096','Cerdà','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46097','Cofrentes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46098','Corbera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46099','Cortes de Pallás','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46100','Cotes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46101','Quart de les Valls','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46102','Quart de Poblet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46103','Quartell','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46104','Quatretonda','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46105','Cullera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46106','Chelva','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46107','Chella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46108','Chera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46109','Cheste','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46110','Xirivella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46111','Chiva','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46112','Chulilla','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46113','Daimús','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46114','Domeño','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46115','Dos Aguas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46116','Eliana (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46117','Emperador','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46118','Enguera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46119','Ènova (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46120','Estivella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46121','Estubeny','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46122','Faura','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46123','Favara','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46124','Fontanars dels Alforins','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46125','Fortaleny','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46126','Foios','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46127','Font d''En Carròs (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46128','Font de la Figuera (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46129','Fuenterrobles','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46130','Gavarda','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46131','Gandia','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46132','Genovés, el','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46133','Gestalgar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46134','Gilet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46135','Godella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46136','Godelleta','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46137','Granja de la Costera (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46138','Guadasequies/Guadasséquies','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46139','Guadassuar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46140','Guardamar de la Safor','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46141','Higueruelas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46142','Jalance','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46143','Xeraco','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46144','Jarafuel','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46145','Xàtiva','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46146','Xeresa','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46147','Llíria','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46148','Loriguilla','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46149','Losa del Obispo','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46150','Llutxent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46151','Llocnou d''En Fenollet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46152','Llocnou de la Corona','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46153','Llocnou de Sant Jeroni','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46154','Llanera de Ranes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46155','Llaurí','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46156','Llombai','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46157','Llosa de Ranes (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46158','Macastre','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46159','Manises','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46160','Manuel','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46161','Marines','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46162','Massalavés','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46163','Massalfassar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46164','Massamagrell','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46165','Massanassa','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46166','Meliana','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46167','Millares','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46168','Miramar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46169','Mislata','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46170','Mogente/Moixent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46171','Moncada','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46172','Montserrat','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46173','Montaverner','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46174','Montesa','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46175','Montitxelvo/Montichelvo','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46176','Montroi/Montroy','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46177','Museros','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46178','Nàquera/Náquera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46179','Navarrés','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46180','Novelé/Novetlè','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46181','Oliva','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46182','Olocau','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46183','Olleria (l'')','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46184','Ontinyent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46185','Otos','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46186','Paiporta','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46187','Palma de Gandía','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46188','Palmera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46189','Palomar (el)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46190','Paterna','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46191','Pedralba','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46192','Petrés','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46193','Picanya','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46194','Picassent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46195','Piles','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46196','Pinet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46197','Polinyà de Xúquer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46198','Potries','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46199','Pobla de Farnals (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46200','Pobla del Duc (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46201','Puebla de San Miguel','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46202','Pobla de Vallbona (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46203','Pobla Llarga (la)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46204','Puig de Santa María, El','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46205','Puçol','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46206','Quesa','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46207','Rafelbunyol','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46208','Rafelcofer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46209','Rafelguaraf','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46210','Ráfol de Salem','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46211','Real de Gandia, el','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46212','Real','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46213','Requena','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46214','Riba-roja de Túria','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46215','Riola','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46216','Rocafort','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46217','Rotglà i Corberà','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46218','Rótova','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46219','Rugat','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46220','Sagunto/Sagunt','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46221','Salem','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46222','Sant Joanet','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46223','Sedaví','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46224','Segart','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46225','Sellent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46226','Sempere','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46227','Senyera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46228','Serra','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46229','Siete Aguas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46230','Silla','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46231','Simat de la Valldigna','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46232','Sinarcas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46233','Sollana','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46234','Sot de Chera','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46235','Sueca','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46236','Sumacàrcer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46237','Tavernes Blanques','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46238','Tavernes de la Valldigna','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46239','Teresa de Cofrentes','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46240','Terrateig','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46241','Titaguas','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46242','Torrebaja','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46243','Torrella','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46244','Torrent','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46245','Torres Torres','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46246','Tous','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46247','Tuéjar','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46248','Turís','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46249','Utiel','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46250','València','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46251','Vallada','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46252','Vallanca','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46253','Vallés','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46254','Venta del Moro','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46255','Vilallonga/Villalonga','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46256','Vilamarxant','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46257','Villanueva de Castellón','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46258','Villar del Arzobispo','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46259','Villargordo del Cabriel','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46260','Vinalesa','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46261','Yátova','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46262','Yesa (La)','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46263','Zarra','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46902','Gátova','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46903','San Antonio de Benagéber','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'46904','Benicull de Xúquer','V','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47001','Adalia','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47002','Aguasal','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47003','Aguilar de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47004','Alaejos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47005','Alcazarén','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47006','Aldea de San Miguel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47007','Aldeamayor de San Martín','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47008','Almenara de Adaja','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47009','Amusquillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47010','Arroyo de la Encomienda','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47011','Ataquines','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47012','Bahabón','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47013','Barcial de la Loma','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47014','Barruelo del Valle','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47015','Becilla de Valderaduey','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47016','Benafarces','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47017','Bercero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47018','Berceruelo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47019','Berrueces','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47020','Bobadilla del Campo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47021','Bocigas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47022','Bocos de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47023','Boecillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47024','Bolaños de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47025','Brahojos de Medina','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47026','Bustillo de Chaves','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47027','Cabezón de Pisuerga','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47028','Cabezón de Valderaduey','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47029','Cabreros del Monte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47030','Campaspero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47031','Campillo (El)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47032','Camporredondo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47033','Canalejas de Peñafiel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47034','Canillas de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47035','Carpio','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47036','Casasola de Arión','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47037','Castrejón de Trabancos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47038','Castrillo de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47039','Castrillo-Tejeriego','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47040','Castrobol','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47041','Castrodeza','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47042','Castromembibre','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47043','Castromonte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47044','Castronuevo de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47045','Castronuño','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47046','Castroponce','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47047','Castroverde de Cerrato','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47048','Ceinos de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47049','Cervillego de la Cruz','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47050','Cigales','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47051','Ciguñuela','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47052','Cistérniga','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47053','Cogeces de Íscar','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47054','Cogeces del Monte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47055','Corcos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47056','Corrales de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47057','Cubillas de Santa Marta','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47058','Cuenca de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47059','Curiel de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47060','Encinas de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47061','Esguevillas de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47062','Fombellida','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47063','Fompedraza','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47064','Fontihoyuelo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47065','Fresno el Viejo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47066','Fuensaldaña','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47067','Fuente el Sol','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47068','Fuente-Olmedo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47069','Gallegos de Hornija','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47070','Gatón de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47071','Geria','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47073','Herrín de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47074','Hornillos de Eresma','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47075','Íscar','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47076','Laguna de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47077','Langayo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47078','Lomoviejo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47079','Llano de Olmedo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47080','Manzanillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47081','Marzales','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47082','Matapozuelos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47083','Matilla de los Caños','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47084','Mayorga','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47085','Medina del Campo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47086','Medina de Rioseco','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47087','Megeces','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47088','Melgar de Abajo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47089','Melgar de Arriba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47090','Mojados','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47091','Monasterio de Vega','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47092','Montealegre de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47093','Montemayor de Pililla','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47094','Moral de la Reina','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47095','Moraleja de las Panaderas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47096','Morales de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47097','Mota del Marqués','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47098','Mucientes','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47099','Mudarra (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47100','Muriel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47101','Nava del Rey','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47102','Nueva Villa de las Torres','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47103','Olivares de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47104','Olmedo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47105','Olmos de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47106','Olmos de Peñafiel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47109','Palazuelo de Vedija','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47110','Parrilla (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47111','Pedraja de Portillo (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47112','Pedrajas de San Esteban','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47113','Pedrosa del Rey','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47114','Peñafiel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47115','Peñaflor de Hornija','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47116','Pesquera de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47117','Piña de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47118','Piñel de Abajo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47119','Piñel de Arriba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47121','Pollos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47122','Portillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47123','Pozal de Gallinas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47124','Pozaldez','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47125','Pozuelo de la Orden','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47126','Puras','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47127','Quintanilla de Arriba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47128','Quintanilla del Molar','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47129','Quintanilla de Onésimo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47130','Quintanilla de Trigueros','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47131','Rábano','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47132','Ramiro','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47133','Renedo de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47134','Roales de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47135','Robladillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47137','Roturas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47138','Rubí de Bracamonte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47139','Rueda','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47140','Saelices de Mayorga','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47141','Salvador de Zapardiel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47142','San Cebrián de Mazote','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47143','San Llorente','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47144','San Martín de Valvení','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47145','San Miguel del Arroyo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47146','San Miguel del Pino','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47147','San Pablo de la Moraleja','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47148','San Pedro de Latarce','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47149','San Pelayo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47150','San Román de Hornija','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47151','San Salvador','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47152','Santa Eufemia del Arroyo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47153','Santervás de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47154','Santibáñez de Valcorba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47155','Santovenia de Pisuerga','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47156','San Vicente del Palacio','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47157','Sardón de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47158','Seca (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47159','Serrada','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47160','Siete Iglesias de Trabancos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47161','Simancas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47162','Tamariz de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47163','Tiedra','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47164','Tordehumos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47165','Tordesillas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47166','Torrecilla de la Abadesa','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47167','Torrecilla de la Orden','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47168','Torrecilla de la Torre','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47169','Torre de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47170','Torre de Peñafiel','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47171','Torrelobatón','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47172','Torrescárcela','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47173','Traspinedo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47174','Trigueros del Valle','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47175','Tudela de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47176','Unión de Campos (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47177','Urones de Castroponce','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47178','Urueña','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47179','Valbuena de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47180','Valdearcos de la Vega','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47181','Valdenebro de los Valles','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47182','Valdestillas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47183','Valdunquillo','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47184','Valoria la Buena','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47185','Valverde de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47186','Valladolid','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47187','Vega de Ruiponce','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47188','Vega de Valdetronco','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47189','Velascálvaro','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47190','Velilla','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47191','Velliza','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47192','Ventosa de la Cuesta','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47193','Viana de Cega','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47194','Viloria','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47195','Villabáñez','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47196','Villabaruz de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47197','Villabrágima','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47198','Villacarralón','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47199','Villacid de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47200','Villaco','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47203','Villafrades de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47204','Villafranca de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47205','Villafrechós','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47206','Villafuerte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47207','Villagarcía de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47208','Villagómez la Nueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47209','Villalán de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47210','Villalar de los Comuneros','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47211','Villalba de la Loma','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47212','Villalba de los Alcores','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47213','Villalbarba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47214','Villalón de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47215','Villamuriel de Campos','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47216','Villán de Tordesillas','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47217','Villanubla','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47218','Villanueva de Duero','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47219','Villanueva de la Condesa','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47220','Villanueva de los Caballeros','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47221','Villanueva de los Infantes','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47222','Villanueva de San Mancio','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47223','Villardefrades','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47224','Villarmentero de Esgueva','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47225','Villasexmir','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47226','Villavaquerín','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47227','Villavellid','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47228','Villaverde de Medina','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47229','Villavicencio de los Caballeros','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47230','Wamba','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47231','Zaratán','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'47232','Zarza (La)','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48001','Abadiño','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48002','Abanto y Ciérvana-Abanto Zierbena','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48003','Amorebieta-Etxano','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48004','Amoroto','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48005','Arakaldo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48006','Arantzazu','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48007','Munitibar-Arbatzegi Gerrikaitz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48008','Artzentales','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48009','Arrankudiaga','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48010','Arrieta','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48011','Arrigorriaga','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48012','Bakio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48013','Barakaldo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48014','Barrika','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48015','Basauri','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48016','Berango','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48017','Bermeo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48018','Berriatua','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48019','Berriz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48020','Bilbao','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48021','Busturia','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48022','Karrantza Harana/Valle de Carranza','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48023','Artea','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48024','Zeanuri','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48025','Zeberio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48026','Dima','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48027','Durango','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48028','Ea','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48029','Etxebarri','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48030','Etxebarria','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48031','Elantxobe','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48032','Elorrio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48033','Ereño','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48034','Ermua','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48035','Fruiz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48036','Galdakao','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48037','Galdames','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48038','Gamiz-Fika','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48039','Garai','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48040','Gatika','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48041','Gautegiz Arteaga','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48042','Gordexola','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48043','Gorliz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48044','Getxo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48045','Güeñes','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48046','Gernika-Lumo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48047','Gizaburuaga','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48048','Ibarrangelu','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48049','Ispaster','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48050','Izurtza','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48051','Lanestosa','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48052','Larrabetzu','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48053','Laukiz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48054','Leioa','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48055','Lemoa','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48056','Lemoiz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48057','Lekeitio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48058','Mallabia','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48059','Mañaria','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48060','Markina-Xemein','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48061','Maruri-Jatabe','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48062','Mendata','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48063','Mendexa','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48064','Meñaka','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48065','Ugao-Miraballes','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48066','Morga','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48067','Muxika','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48068','Mundaka','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48069','Mungia','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48070','Aulesti','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48071','Muskiz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48072','Otxandio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48073','Ondarroa','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48074','Urduña-Orduña','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48075','Orozko','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48076','Sukarrieta','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48077','Plentzia','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48078','Portugalete','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48079','Errigoiti','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48080','Valle de Trápaga-Trapagaran','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48081','Lezama','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48082','Santurtzi','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48083','Ortuella','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48084','Sestao','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48085','Sopela','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48086','Sopuerta','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48087','Trucios-Turtzioz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48088','Ubide','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48089','Urduliz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48090','Balmaseda','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48091','Atxondo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48092','Bedia','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48093','Areatza','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48094','Igorre','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48095','Zaldibar','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48096','Zalla','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48097','Zaratamo','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48901','Derio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48902','Erandio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48903','Loiu','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48904','Sondika','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48905','Zamudio','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48906','Forua','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48907','Kortezubi','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48908','Murueta','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48909','Nabarniz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48910','Iurreta','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48911','Ajangiz','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48912','Alonsotegi','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48913','Zierbena','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48914','Arratzu','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'48915','Ziortza-Bolibar','BI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49002','Abezames','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49003','Alcañices','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49004','Alcubilla de Nogales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49005','Alfaraz de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49006','Algodre','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49007','Almaraz de Duero','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49008','Almeida de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49009','Andavías','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49010','Arcenillas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49011','Arcos de la Polvorosa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49012','Argañín','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49013','Argujillo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49014','Arquillinos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49015','Arrabalde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49016','Aspariegos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49017','Asturianos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49018','Ayoó de Vidriales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49019','Barcial del Barco','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49020','Belver de los Montes','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49021','Benavente','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49022','Benegiles','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49023','Bermillo de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49024','Bóveda de Toro (La)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49025','Bretó','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49026','Bretocino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49027','Brime de Sog','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49028','Brime de Urz','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49029','Burganes de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49030','Bustillo del Oro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49031','Cabañas de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49032','Calzadilla de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49033','Camarzana de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49034','Cañizal','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49035','Cañizo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49036','Carbajales de Alba','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49037','Carbellino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49038','Casaseca de Campeán','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49039','Casaseca de las Chanas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49040','Castrillo de la Guareña','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49041','Castrogonzalo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49042','Castronuevo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49043','Castroverde de Campos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49044','Cazurra','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49046','Cerecinos de Campos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49047','Cerecinos del Carrizal','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49048','Cernadilla','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49050','Cobreros','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49052','Coomonte','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49053','Coreses','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49054','Corrales del Vino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49055','Cotanes del Monte','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49056','Cubillos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49057','Cubo de Benavente','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49058','Cubo de Tierra del Vino (El)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49059','Cuelgamures','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49061','Entrala','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49062','Espadañedo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49063','Faramontanos de Tábara','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49064','Fariza','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49065','Fermoselle','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49066','Ferreras de Abajo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49067','Ferreras de Arriba','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49068','Ferreruela','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49069','Figueruela de Arriba','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49071','Fonfría','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49075','Fresno de la Polvorosa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49076','Fresno de la Ribera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49077','Fresno de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49078','Friera de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49079','Fuente Encalada','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49080','Fuentelapeña','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49081','Fuentesaúco','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49082','Fuentes de Ropel','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49083','Fuentesecas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49084','Fuentespreadas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49085','Galende','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49086','Gallegos del Pan','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49087','Gallegos del Río','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49088','Gamones','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49090','Gema','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49091','Granja de Moreruela','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49092','Granucillo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49093','Guarrate','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49094','Hermisende','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49095','Hiniesta (La)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49096','Jambrina','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49097','Justel','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49098','Losacino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49099','Losacio','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49100','Lubián','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49101','Luelmo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49102','Maderal (El)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49103','Madridanos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49104','Mahide','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49105','Maire de Castroponce','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49107','Malva','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49108','Manganeses de la Lampreana','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49109','Manganeses de la Polvorosa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49110','Manzanal de Arriba','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49111','Manzanal del Barco','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49112','Manzanal de los Infantes','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49113','Matilla de Arzón','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49114','Matilla la Seca','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49115','Mayalde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49116','Melgar de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49117','Micereces de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49118','Milles de la Polvorosa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49119','Molacillos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49120','Molezuelas de la Carballeda','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49121','Mombuey','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49122','Monfarracinos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49123','Montamarta','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49124','Moral de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49125','Moraleja del Vino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49126','Moraleja de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49127','Morales del Vino','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49128','Morales de Rey','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49129','Morales de Toro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49130','Morales de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49131','Moralina','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49132','Moreruela de los Infanzones','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49133','Moreruela de Tábara','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49134','Muelas de los Caballeros','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49135','Muelas del Pan','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49136','Muga de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49137','Navianos de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49138','Olmillos de Castro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49139','Otero de Bodas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49141','Pajares de la Lampreana','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49142','Palacios del Pan','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49143','Palacios de Sanabria','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49145','Pedralba de la Pradería','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49146','Pego (El)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49147','Peleagonzalo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49148','Peleas de Abajo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49149','Peñausende','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49150','Peque','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49151','Perdigón (El)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49152','Pereruela','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49153','Perilla de Castro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49154','Pías','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49155','Piedrahita de Castro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49156','Pinilla de Toro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49157','Pino del Oro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49158','Piñero (El)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49159','Pobladura del Valle','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49160','Pobladura de Valderaduey','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49162','Porto','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49163','Pozoantiguo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49164','Pozuelo de Tábara','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49165','Prado','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49166','Puebla de Sanabria','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49167','Pueblica de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49168','Quintanilla del Monte','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49169','Quintanilla del Olmo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49170','Quintanilla de Urz','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49171','Quiruelas de Vidriales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49172','Rabanales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49173','Rábano de Aliste','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49174','Requejo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49175','Revellinos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49176','Riofrío de Aliste','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49177','Rionegro del Puente','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49178','Roales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49179','Robleda-Cervantes','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49180','Roelos de Sayago','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49181','Rosinos de la Requejada','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49183','Salce','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49184','Samir de los Caños','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49185','San Agustín del Pozo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49186','San Cebrián de Castro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49187','San Cristóbal de Entreviñas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49188','San Esteban del Molar','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49189','San Justo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49190','San Martín de Valderaduey','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49191','San Miguel de la Ribera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49192','San Miguel del Valle','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49193','San Pedro de Ceque','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49194','San Pedro de la Nave-Almendra','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49197','Santa Clara de Avedillo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49199','Santa Colomba de las Monjas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49200','Santa Cristina de la Polvorosa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49201','Santa Croya de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49202','Santa Eufemia del Barco','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49203','Santa María de la Vega','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49204','Santa María de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49205','Santibáñez de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49206','Santibáñez de Vidriales','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49207','Santovenia','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49208','San Vicente de la Cabeza','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49209','San Vitero','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49210','Sanzoles','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49214','Tábara','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49216','Tapioles','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49219','Toro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49220','Torre del Valle (La)','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49221','Torregamones','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49222','Torres del Carrizal','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49223','Trabazos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49224','Trefacio','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49225','Uña de Quintana','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49226','Vadillo de la Guareña','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49227','Valcabado','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49228','Valdefinjas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49229','Valdescorriel','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49230','Vallesa de la Guareña','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49231','Vega de Tera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49232','Vega de Villalobos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49233','Vegalatrave','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49234','Venialbo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49235','Vezdemarbán','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49236','Vidayanes','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49237','Videmala','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49238','Villabrázaro','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49239','Villabuena del Puente','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49240','Villadepera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49241','Villaescusa','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49242','Villafáfila','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49243','Villaferrueña','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49244','Villageriz','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49245','Villalazán','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49246','Villalba de la Lampreana','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49247','Villalcampo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49248','Villalobos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49249','Villalonso','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49250','Villalpando','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49251','Villalube','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49252','Villamayor de Campos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49255','Villamor de los Escuderos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49256','Villanázar','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49257','Villanueva de Azoague','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49258','Villanueva de Campeán','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49259','Villanueva de las Peras','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49260','Villanueva del Campo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49261','Villaralbo','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49262','Villardeciervos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49263','Villar de Fallaves','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49264','Villar del Buey','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49265','Villardiegua de la Ribera','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49266','Villárdiga','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49267','Villardondiego','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49268','Villarrín de Campos','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49269','Villaseco del Pan','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49270','Villavendimio','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49271','Villaveza del Agua','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49272','Villaveza de Valverde','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49273','Viñas','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'49275','Zamora','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50001','Abanto','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50002','Acered','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50003','Agón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50004','Aguarón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50005','Aguilón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50006','Ainzón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50007','Aladrén','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50008','Alagón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50009','Alarba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50010','Alberite de San Juan','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50011','Albeta','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50012','Alborge','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50013','Alcalá de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50014','Alcalá de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50015','Alconchel de Ariza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50016','Aldehuela de Liestos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50017','Alfajarín','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50018','Alfamén','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50019','Alforque','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50020','Alhama de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50021','Almochuel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50022','Almolda (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50023','Almonacid de la Cuba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50024','Almonacid de la Sierra','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50025','Almunia de Doña Godina (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50026','Alpartir','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50027','Ambel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50028','Anento','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50029','Aniñón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50030','Añón de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50031','Aranda de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50032','Arándiga','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50033','Ardisa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50034','Ariza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50035','Artieda','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50036','Asín','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50037','Atea','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50038','Ateca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50039','Azuara','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50040','Badules','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50041','Bagüés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50042','Balconchán','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50043','Bárboles','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50044','Bardallur','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50045','Belchite','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50046','Belmonte de Gracián','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50047','Berdejo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50048','Berrueco','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50050','Bijuesca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50051','Biota','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50052','Bisimbre','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50053','Boquiñeni','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50054','Bordalba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50055','Borja','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50056','Botorrita','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50057','Brea de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50058','Bubierca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50059','Bujaraloz','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50060','Bulbuente','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50061','Bureta','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50062','Burgo de Ebro (El)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50063','Buste (El)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50064','Cabañas de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50065','Cabolafuente','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50066','Cadrete','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50067','Calatayud','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50068','Calatorao','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50069','Calcena','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50070','Calmarza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50071','Campillo de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50072','Carenas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50073','Cariñena','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50074','Caspe','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50075','Castejón de Alarba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50076','Castejón de las Armas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50077','Castejón de Valdejasa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50078','Castiliscar','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50079','Cervera de la Cañada','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50080','Cerveruela','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50081','Cetina','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50082','Cimballa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50083','Cinco Olivas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50084','Clarés de Ribota','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50085','Codo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50086','Codos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50087','Contamina','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50088','Cosuenda','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50089','Cuarte de Huerva','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50090','Cubel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50091','Cuerlas (Las)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50092','Chiprana','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50093','Chodes','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50094','Daroca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50095','Ejea de los Caballeros','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50096','Embid de Ariza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50098','Encinacorba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50099','Épila','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50100','Erla','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50101','Escatrón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50102','Fabara','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50104','Farlete','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50105','Fayón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50106','Fayos (Los)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50107','Figueruelas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50108','Fombuena','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50109','Frago (El)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50110','Frasno (El)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50111','Fréscano','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50113','Fuendejalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50114','Fuendetodos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50115','Fuentes de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50116','Fuentes de Jiloca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50117','Gallocanta','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50118','Gallur','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50119','Gelsa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50120','Godojos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50121','Gotor','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50122','Grisel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50123','Grisén','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50124','Herrera de los Navarros','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50125','Ibdes','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50126','Illueca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50128','Isuerre','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50129','Jaraba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50130','Jarque de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50131','Jaulín','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50132','Joyosa (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50133','Lagata','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50134','Langa del Castillo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50135','Layana','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50136','Lécera','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50137','Leciñena','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50138','Lechón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50139','Letux','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50140','Litago','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50141','Lituénigo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50142','Lobera de Onsella','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50143','Longares','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50144','Longás','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50146','Lucena de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50147','Luceni','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50148','Luesia','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50149','Luesma','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50150','Lumpiaque','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50151','Luna','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50152','Maella','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50153','Magallón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50154','Mainar','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50155','Malanquilla','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50156','Maleján','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50157','Malón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50159','Maluenda','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50160','Mallén','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50161','Manchones','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50162','Mara','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50163','María de Huerva','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50164','Mediana de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50165','Mequinenza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50166','Mesones de Isuela','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50167','Mezalocha','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50168','Mianos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50169','Miedes de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50170','Monegrillo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50171','Moneva','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50172','Monreal de Ariza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50173','Monterde','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50174','Montón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50175','Morata de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50176','Morata de Jiloca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50177','Morés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50178','Moros','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50179','Moyuela','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50180','Mozota','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50181','Muel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50182','Muela (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50183','Munébrega','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50184','Murero','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50185','Murillo de Gállego','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50186','Navardún','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50187','Nigüella','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50188','Nombrevilla','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50189','Nonaspe','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50190','Novallas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50191','Novillas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50192','Nuévalos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50193','Nuez de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50194','Olvés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50195','Orcajo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50196','Orera','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50197','Orés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50198','Oseja','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50199','Osera de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50200','Paniza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50201','Paracuellos de Jiloca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50202','Paracuellos de la Ribera','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50203','Pastriz','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50204','Pedrola','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50205','Pedrosas (Las)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50206','Perdiguera','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50207','Piedratajada','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50208','Pina de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50209','Pinseque','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50210','Pintanos (Los)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50211','Plasencia de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50212','Pleitas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50213','Plenas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50214','Pomer','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50215','Pozuel de Ariza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50216','Pozuelo de Aragón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50217','Pradilla de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50218','Puebla de Albortón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50219','Puebla de Alfindén (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50220','Puendeluna','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50221','Purujosa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50222','Quinto','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50223','Remolinos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50224','Retascón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50225','Ricla','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50227','Romanos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50228','Rueda de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50229','Ruesca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50230','Sádaba','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50231','Salillas de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50232','Salvatierra de Esca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50233','Samper del Salz','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50234','San Martín de la Virgen de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50235','San Mateo de Gállego','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50236','Santa Cruz de Grío','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50237','Santa Cruz de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50238','Santa Eulalia de Gállego','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50239','Santed','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50240','Sástago','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50241','Sabiñán','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50242','Sediles','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50243','Sestrica','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50244','Sierra de Luna','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50245','Sigüés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50246','Sisamón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50247','Sobradiel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50248','Sos del Rey Católico','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50249','Tabuenca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50250','Talamantes','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50251','Tarazona','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50252','Tauste','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50253','Terrer','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50254','Tierga','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50255','Tobed','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50256','Torralba de los Frailes','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50257','Torralba de Ribota','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50258','Torralbilla','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50259','Torrehermosa','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50260','Torrelapaja','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50261','Torrellas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50262','Torres de Berrellén','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50263','Torrijo de la Cañada','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50264','Tosos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50265','Trasmoz','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50266','Trasobares','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50267','Uncastillo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50268','Undués de Lerda','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50269','Urrea de Jalón','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50270','Urriés','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50271','Used','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50272','Utebo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50273','Valdehorna','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50274','Val de San Martín','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50275','Valmadrid','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50276','Valpalmas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50277','Valtorres','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50278','Velilla de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50279','Velilla de Jiloca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50280','Vera de Moncayo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50281','Vierlas','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50282','Vilueña (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50283','Villadoz','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50284','Villafeliche','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50285','Villafranca de Ebro','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50286','Villalba de Perejil','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50287','Villalengua','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50288','Villanueva de Gállego','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50289','Villanueva de Jiloca','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50290','Villanueva de Huerva','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50291','Villar de los Navarros','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50292','Villarreal de Huerva','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50293','Villarroya de la Sierra','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50294','Villarroya del Campo','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50295','Vistabella','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50296','Zaida (La)','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50297','Zaragoza','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50298','Zuera','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50901','Biel','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50902','Marracos','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (281,'50903','Villamayor de Gállego','Z','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-01','Cherkasy, Prydniprovs''kyi district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-02','Cherkasy, Sosnivs''kyi distric','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-03','Vatutine','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-04','Horodyshche district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-05','Drabiv district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-06','Zhashkiv district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-07','Zvenyhorodka district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-08','Zolotonosha','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-09','Zolotonosha district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-10','Kamianka district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-11','Kaniv','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-12','Kaniv district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-13','Katerynopil'' district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-14','Korsun''-Shevchenkivs''kyi district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-15','Lysianka district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-16','Man''kivka district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-17','Monastyryshche district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-18','Smila','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-19','Smila district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-20','Tal''ne district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-21','Uman''','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-22','Uman'' district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-23','Khrystynivka district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-24','Cherkasy district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-25','Chyhyryn district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-26','Chornobai district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CH-27','Shpola district','CH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-01','Chernivtsi, Shevchenkovs''kiy district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-02','Chernivtsi, Pershotravnevyi distric','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-03','Chernivtsi, Sadhors''kyi distric','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-04','Vyzhnytsia district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-05','Hertsa district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-06','Hlyboka district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-07','Zastavna district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-08','Kel''mentsi district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-09','Kitsman'' district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-10','istrovs''k','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-11','Novoselytsia district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-12','Pytyla district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-13','Sokyriany district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-14','Storozhynets'' district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CN-15','Hotyn district','CN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-01','Chernihiv, Desnians''kyi district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-02','Chernihiv, Novozavods''kyi distric','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-03','Bakhmach district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-04','Bobrovyts''a district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-05','Borzna district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-06','Varva district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-07','Horodnia district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-08','Ichnia district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-09','Kozelets'' district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-10','Korop district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-11','Koriukivka district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-12','Kulykivka district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-13','Mena district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-14','Nizhyn','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-15','Nizhyn district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-16','NovhorOD-Sivers''ky district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-17','Nosivka district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-18','Pryluky','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-19','Pryluky districkt','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-20','Ripky district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-21','Semenivka district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-22','Sosnytsia district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-23','Sribne district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-24','Talalaivka district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-25','Chernihiv district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-26','Shchors district','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'CR-27','Slavutych city','CR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-01','Dnipropetrovs''k, Amur-Nyzhn''odniprovs''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-02','Dnipropetrovs''k, Babushkins''kyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-03','Dnipropetrovs''k, Zhovtnevyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-04','Dnipropetrovs''k, Idustrial''nyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-05','Dnipropetrovs''k, Kirovs''kyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-06','Dnipropetrovs''k, Chervonohvardijs''kyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-07','Dnipropetrovs''k, Lenins''kyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-08','Dnipropetrovs''k, Samars''kyi distric','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-09','Apostolove district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-10','Vasyl''kivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-11','Verkhn''odniprovs''k district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-12','Vil''nohirs''k district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-13','Dnipridzerzhyns''k , Bahlejs''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-14','Dnipropetrovs''k, district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-15','Zhovti Vody district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-16','Kryvyi Rih, Dzerzhyns''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-17','Kryvyi Rih district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-18','Krynychky district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-19','Mahdalynivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-20','Marhanets''','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-21','Mezhova district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-22','Nikopol''','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-23','Nikopol'' district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-24','Novomoskovs''k','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-25','Novomoskovs''k district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-26','Ordzhonikidze','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-27','Pavlohrad','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-28','Pavlohrad district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-29','Pershotravens''k','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-30','Petrykivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-31','Petropavlivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-32','Pokrovs''ke district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-33','Piatykhatky district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-34','Synel''nykove','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-35','Synel''nykove district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-36','Solone district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-37','Sofiivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-38','Ternivka','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-39','Ternivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-40','Tomakivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-41','Tsarychanka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-42','Shyroke district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-43','Iurivka district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-44','Dnipridzerzhyns''k, Zavodskyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-45','Dnipridzerzhyns''k, Dniprovs''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-46','Kryvyi Rih, Dolhintsevs''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-47','Kryvyi Rih, Zhovtnevyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-48','Kryvyi Rih, Inhulets''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-49','Kryvyi Rih, Saksahans''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-50','Kryvyi Rih, Ternivs''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DN-51','Kryvyi Rih, Tsentral''no-mis''kyi district','DN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-01','Donets''k, Budjonivs''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-02','Donets''k, Voroshylovs''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-03','Donets''k, Kalinins''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-04','Donets''k, Kyivs''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-05','Donets''k, Kirovs''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-06','Donets''k, Kuybyshevs''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-07','Donets''k, Lenins''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-08','Donets''k, Petrovs''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-09','Donets''k, Proletars''kyi distric','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-10','Avdiivka','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-11','Oleksandrivka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-12','Amvrosiivka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-13','Artemove','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-14','Artemivs''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-15','Velyka Novosilka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-16','Volnovakha district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-17','Volodars''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-18','Horlivka, Tsentral''no-mis''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-19','Debal''tseve','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-20','Dzerzhyns''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-21','Dymytrov','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-22','Dobropillia','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-23','Dobropillia district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-24','Dokuchaievs''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-25','Druzhkivka','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-26','Ienakieve','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-27','Zhdanivk','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-28','Kirovs''ke','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-29','Kostiantynivka','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-30','Kostiantynivka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-31','Kramators''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-32','Krasny Lyman','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-33','Krasny Lyman district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-34','Krasnoarmiis''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-35','Krasoarmiis''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-36','Makiyivka, Tsentral''no-mis''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-37','Manhush district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-38','Maryinka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-39','Mariupol'', Zhovtnevyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-40','Novoazovs''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-41','Novohrodivka','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-42','Selydove','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-43','Slovians''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-44','Slovians''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-45','Snizhne','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-46','Starobesheve district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-47','Tel''manove district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-48','Torez','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-49','Vuhledar district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-50','Khartsyz''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-51','Shakhtars''k','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-52','Shakhtars''k district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-53','Iasynuvata','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-54','Iasynuvata district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-55','Horlivka , Kalinins''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-56','Horlivka, Nikitovs''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-57','Makiivka','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-58','Makiivka district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-59','Mariupol'', Il''ichovskyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-60','Mariupol'', Ordzhonikidzevs''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-61','Mariupol'', Prymors''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-62','Makiivka, Chervonogvardiis''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'DO-63','akiivka, Kirovs''kyi district','DO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-01','Kharkiv, Dzerzhyns''kyi district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-02','Kharkiv, Kyivs''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-03','Kharkiv, Kominternivs''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-04','Kharkiv, Lenins''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-05','Kharkiv, Moscows''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-06','Kharkiv, Zhovtnevyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-07','Kharkiv, Ordzhonikidzevs''kyi district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-08','Kharkiv, Phrunzens''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-09','Kharkiv, Chervonozavods''kyi distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-10','Balakliia distric','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-11','Barvinkove district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-12','Blyzniuky district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-13','Bohodukhiv district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-14','Borova district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-15','Valky district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-16','Velyky Burluk district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-17','Vovchans''k district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-18','Dvorichna district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-19','Derhachi district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-20','Zachepylivka district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-21','Zmiyiv district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-22','Zolochiv district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-23','Izium','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-24','Izium district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-25','Kehychivka district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-26','Kolomak district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-27','Krasnohrad district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-28','Krasnokuts''k district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-29','Kupians''k','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-30','Kupians''k district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-31','Lozova','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-32','Lozova district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-33','Liubotyn','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-34','Nova Vodolaha district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-35','Pervomais''kyi','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-36','Pervomais''kyi district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-37','Pechenihy district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-38','Sakhnovshchyna district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-39','Kharkiv district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-40','Chuhuyiv','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-41','Chuhuyiv district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HA-42','Shevchenkove district','HA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-01','Kherson, Dniprovs''kyi district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-02','Kherson, Komsomol''s''kyi distric','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-03','Kherson, Suvorovs''kyi district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-04','Beryslav district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-05','Bilozerka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-06','Velyka Lepetykha district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-07','Velyka Oleksandrivka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-08','Verkhniy Rohachyk district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-09','Vysokopillia district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-10','Heniches''k district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-11','Hola Prystan'' district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-12','Hornostayivka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-13','Ivanivka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-14','Kalanchak district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-15','Kakhovka','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-16','Kakhovka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-17','Nyzhni Sirohozy district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-18','Nova Kakhovka','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-19','Novovorontsovka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-20','Novotroyits''ke district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-21','Skadovs''k district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-22','Tsiurupyns''k district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HE-23','Chaplynka district','HE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-01','Khmel''nyts''kyi','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-02','Bilohiria district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-03','Vin''kivtsi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-04','Volochys''k district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-05','Horodok district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-06','Derazhnia district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-07','Dunayivtsi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-08','Iziaslav district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-09','Kamianets''-Podil''s''kyi','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-10','Kamianets''-Podil''s''kyi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-11','Krasyliv district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-12','Letychiv district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-13','Netishyn','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-14','Nova Ushytsia district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-15','Polonne district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-16','Slavuta','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-17','Slavuta district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-18','Starokostiantyniv','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-19','Starokostiantyniv district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-20','Stara Syniava district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-21','Teofipol'' district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-22','Khmel''nyts''kyi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-23','Chemerivtsi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-24','Shepetivka','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-25','Shepetivka district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'HM-26','Iarmolyntsi district','HM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-01','Ivano-Frankivs''k','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-02','Bohorodchany district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-03','Bolekhi','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-05','Verkhovyna district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-06','Halych district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-07','Horodenka district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-08','Dolyna district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-09','Kalush','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-10','Lalysh district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-11','Kolomyia','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-12','Kolomyia district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-13','Kosiv district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-14','Nadvirna district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-15','Rohatyn district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-16','Rozhniativ district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-17','Sniatyn district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-18','Tysmenytsia district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-19','Tlumach district','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'IF-20','Iaremcha','IF','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-01','Kirovohrad, Kirovs''kyi district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-02','Kirovohrad, Lenins''kyi distric','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-03','Oleksandriia','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-04','Oleksandriia district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-05','Oleksandrivka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-06','Bobrynets'' district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-07','Haivoron district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-08','Holovanivs''k district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-09','Dobrovelychkivka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-10','Dolyns''ka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-11','Znamianka','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-12','Znamianka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-13','Kirovohrad district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-14','Kompaniyivka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-15','Mala Vyska district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-16','Novhorodka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-17','Novoarkhanhel''s''k district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-18','Novomyrhorod district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-19','Novoukrayinka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-20','Vil''shanka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-21','Onufriyivka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-22','Petrove district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-23','Svitlovods''k','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-24','Svitlovods''k district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-25','Ul''ianovka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KI-26','Ustyninka district','KI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-01','Bila Tserkva','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-02','Baryshivka district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-03','Bila Tserkva district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-04','Berzan'' district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-05','Bohuslav district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-06','Boryspil''','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-07','Boryspil'' district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-08','Borodianka district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-09','Brovary','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-10','Brovary district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-11','Vasyl''kiv','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-12','Vasyl''kiv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-13','Vyshhorod district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-14','Volodarka district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-15','Zhurivka district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-16','Ivankiv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-17','Irpin''','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-18','Kaharlyk district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-19','KyiVO-Sviatoshyns''ky district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-20','Makariv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-21','Myronivka district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-22','Obukhiv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-23','Pereiaslav-Khmel''nyts''kyi','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-24','Pereiaslav-Khmel''nyts''kyi district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-25','Polis''ke district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-26','Chernobyls''kyi district (city Pripyiat'')','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-27','Rokytne district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-28','Rzhyshchiv','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-29','Skvyra district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-30','Stavyshche district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-31','Tarashcha district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-32','Tetiyiv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-33','Fastiv','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-34','Fastiv district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KO-35','Iahotyn district','KO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-01','Simferopol'', Zaliznychnyi district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-02','Simferopol'', Kyivs''kyi distric','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-03','Simferopol'', Tsentral''nyi distric','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-04','Alushta','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-05','Armians''k','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-06','Bakhchysarai district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-07','Bilohirs''k district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-08','Dzhankoi','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-09','Dzhankoi district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-10','Ievpatoriia','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-11','Kerch','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-12','Kirovs''ke district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-13','Krasnohvardiis''ke district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-14','Krasnoperekops''k','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-15','Krasnoperekops''k district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-16','Lenine district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-17','Nyzhniohirs''kyi district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-18','Pervomais''ke district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-19','Rozdol''ne district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-20','Saky','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-21','Saky district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-22','Simferopol'' district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-23','Soviets''kyi district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-24','Sudak','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-25','Feodosiia','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-26','Chornomors''ke district','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KR-27','Yalta','KR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-01','Kyiv, Holosiivs''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-02','Kyiv, Darnyts''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-03','Kyiv. Desnians''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-04','Kyiv, Dniprovs''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-05','Kyiv, Obolons''kyi district','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-06','Kyiv, Pechers''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-07','Kyiv, Podols''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-08','Kyiv, Sviatoshyns''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-09','Kyiv, Solomens''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'KV-10','Kyiv, Shevchenkivs''kyi distric','KV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-01','Luhans''k, Artemivs''kyi district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-02','Luhans''k, Zhovtnevyi distric','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-03','Luhans''k, Kamenobrods''kyi distric','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-04','Luhans''k, Lenins''kyi distric','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-05','Alchevs''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-06','Antratsyt','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-07','Antratsyt district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-08','Bilovods''k district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-09','Brianka','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-10','Bilikurakyne district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-11','Kirovs''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-12','Krasnodon','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-13','Krasnodon district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-14','Krasny Luch','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-15','Kreminna district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-16','Lysychans''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-17','Lutuhyne district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-18','Markivka district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-19','Milove district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-20','Novoajdar district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-21','Novopskov district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-22','Pervomais''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-23','Pereval''s''k district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-24','Popasna district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-25','Roven''ky','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-26','Rubizhne','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-27','Svatove district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-28','Sverdlovs''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-29','Sverdlovs''k district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-30','Sieverodonets''k','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-31','Slovianoserbs''k district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-32','Stanychno-Luhans''ke district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-33','Starobil''s''k district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-34','Stakhanov','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LU-35','Troyits''ke district','LU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-01','L''viv, Halyts''kyi district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-02','L''viv, Zaliznychnyi distric','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-03','L''viv, Lychakivs''kyi distric','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-04','L''viv, Sykhivs''kyi distric','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-05','L''viv, Frankivs''kyi distric','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-06','L''viv, Shevchenkivs''kyi distric','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-07','Boryslav','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-08','Brody district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-09','Bus''k district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-10','Horodok dostrict','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-11','Drohobych','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-12','Drohobych district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-13','Zhydachiv district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-14','Zhovkva district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-15','Zolochiv district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-16','Kamianka-Buz''ka district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-17','Mykolayiv district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-18','Mostys''ka district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-19','Peremyshliany district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-20','Pustomyty district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-21','Radekhiv district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-22','Sambir','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-23','Sambir district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-24','Skole district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-25','Sokal'' district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-26','Staryi Sambir district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-27','Stryi','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-28','Stryi district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-29','Truskavets''','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-30','Turka district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-31','Chervonohrad','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-32','Iavoriv district','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'LV-33','Morshyn','LV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-01','Mykolayiv, Zavods''kyi district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-02','v, Korabel''nyi district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-03','v, Lenins''kyi district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-04','Mykolayiv, Tsentral''nyi distric','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-05','Arbuzynka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-06','Bashtanka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-07','Berezanka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-08','Bereznehuvate district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-09','Brats''ke district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-10','Veselynove district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-11','Voznesens''k','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-12','Voznesens''k district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-13','Vradiyivka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-14','Domanivka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-15','Ielanets'' district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-16','Zhovtnevy district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-17','Kazanka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-18','Kryve Ozero district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-19','Mykolayiv district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-20','Novyi Buh district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-21','Nova Odesa district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-22','Ochakiv','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-23','Ochakiv district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-24','Pervomais''k','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-25','Pervomais''k district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-26','Snihurivka district','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'NI-27','Iuzhnoukrayins''k','NI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-01','Odesa','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-02','Odesa, Illichivs''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-03','Odesa, Kyivs''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-04','Odesa, Lenins''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-05','Odesa, Malinovs''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-06','Odesa, Prymors''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-07','Odesa, Suvorovs''kyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-08','Odesa, Tsentral''nyi distric','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-09','Anan''yiv district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-10','Artsyz district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-11','Balta district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-12','Berezivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-13','BilhorOD-Dnistrovs''kyi','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-14','BilhorOD-Dnistrovs''kyi district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-15','Biliayivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-16','Bolhrad district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-17','Velyka Mykhailivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-18','Ivanivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-19','Izmayil','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-20','Izmayil district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-21','Illichivs''k','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-22','Kiliia district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-23','Kodyma district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-24','Kominternivs''ke district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-25','Kotovs''k','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-26','Kotovs''k district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-27','Krasni Okny district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-28','Liubashivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-29','Mykolayivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-30','Ovidiopol'' district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-31','Reni district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-32','Rozdil''na district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-33','Savran'' district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-34','Sarata district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-35','Tarutyne district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-36','Tatarbunary district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-37','Teplodar','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-38','Frunzivka district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-39','Shyriaieve district','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'OD-40','Iuzhne','OD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-01','Poltava, Kyivs''kyi district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-02','Poltava, Lenins''kyi distric','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-03','Poltava, Zhovtnevyi distric','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-04','Velyka Bahachka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-05','Hadiach district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-06','Hlobyne district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-07','Hrebinka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-08','Dykan''ka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-09','Zin''kiv district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-10','Karlivka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-11','Kobeliaky district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-12','Kozel''shchyna district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-13','Komsomol''s''k','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-14','Kotel''va district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-15','Kremenchuk, Avtozavods''ky distric','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-16','Kremenchuk, Kryukovs''ky distric','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-17','Kremenchuk district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-18','Lokhvytsia district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-19','Lubny','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-20','Lubny district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-21','Mashivka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-22','Myrhorod','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-23','Myrhorod district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-24','Novi Sanzhary district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-25','Orzhytsia district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-26','Pyriatyn district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-27','Poltava district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-28','Reshetylivka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-29','Semenivka district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-30','Khorol district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-31','Chornukhy district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-32','Chutove district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'PO-33','Shyshaky district','PO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-01','Rivne','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-02','Berezne district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-03','Volodymyrets'' district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-04','Hoshcha district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-05','Demydivka district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-06','Dubno','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-07','Dubno district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-08','Dubrovytsia district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-09','Zarichne district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-10','Zdolbuniv district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-11','Korets'' district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-12','Kostopil'' district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-13','Kuznetsovs''k','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-14','Mlyniv district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-15','Ostroh','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-16','Ostroh district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-17','Radyvyliv district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-18','Rivne district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-19','Rokytne district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'RI-20','Sarny district','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SL-01','Sevastopol'', Gagarins''kyi district','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SL-02','Sevastopol'', Lenins''kyi distric','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SL-03','Sevastopol'', Nakhimovs''kyi distric','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SL-04','Sevastopol''','SL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-01','Sumy, Zarichnyi district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-02','Sumy, Kovpakivs''kyi distric','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-03','Okhtyrka','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-04','Okhtyrka district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-05','Bilopillia district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-06','Buryn'' district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-07','Velyka Pysarivka district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-08','Hlukhiv','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-09','Hlukhiv district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-10','Konotop','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-11','Konotop district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-12','Krasnopillia district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-13','Krolevets'' district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-14','Lebedyn','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-15','Lebedyn district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-16','Lypova Dolyna district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-17','Nedryhailiv district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-18','Putyvl'' district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-19','Romny','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-20','Romny district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-21','Seredyna-Buda district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-22','Sumy district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-23','Trostianets'' district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-24','Shostka','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-25','Shostka district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'SU-26','Iampil'' district','SU','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-01','Ternopil''','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-02','Berezany district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-03','Borshchiv district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-04','Buchach district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-05','Husiatyn district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-06','Zalishchyky district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-07','Zbarazh district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-08','Zboriv district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-09','Kozova district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-10','Kremenets'' district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-11','Lanivtsi district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-12','Monastyrys''k district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-13','Pidvolochys''k district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-14','Pidhajtsi district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-15','Terebovlia district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-16','Ternopil'' district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-17','Chortkiv district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'TE-18','Shums''k district','TE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-01','Vinnytsia, Zamostians''kyi district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-02','Vinnytsia, Lenins''kyi distric','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-03','Vinnytsia, Starohorods''kyi distric','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-04','Bar district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-05','Bershad'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-06','Vinnytsia district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-07','Haisyn district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-08','Zhmerynka','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-09','Zhmerynka district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-10','Illintsi district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-11','Kalynivka district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-12','Koziatyn','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-13','Koziatyn district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-14','Kryzhopil'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-15','Ladyzhyn district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-16','Lypovets'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-17','Lityn district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-18','Mohyliv-Podil''s''kyi','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-19','Mohyliv-Podil''s''kyi district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-20','Murovani Kurylivtsi district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-21','Nemyriv district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-22','Orativ district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-23','Pishchanka district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-24','Pohrebyshche district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-25','Teplyk district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-26','Tyvriv district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-27','Tomashpil'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-28','Trostianets'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-29','Tul''chyn district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-30','Khmil''nyk','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-31','Khmil''nyk district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-32','Chernivtsi district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-33','Chechel''nyk district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-34','Sharhorod district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VI-35','Iampil'' district','VI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-01','Luts''k','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-02','Volodymyr-Volyns''kyi','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-03','Volodymyr-Volyns''kyi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-04','Horokhiv district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-05','Ivanychi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-06','Kamin''-Kashyrs''kyi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-07','Kivertsi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-08','Kovel''','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-09','Kovel'' district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-10','Lokachi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-11','Luts''k district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-12','Liubeshiv district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-13','Liuboml'' district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-14','Manevychi district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-15','Novovolyns''k','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-16','Ratne district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-17','Rozhyshche district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-18','Stara Vyzhivka district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-19','Turiis''k district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'VO-20','Shats''k district','VO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-01','Uzhhorod','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-02','Berehove','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-03','Berehove district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-04','Velykyi-Bereznyi district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-05','Vynohradiv district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-06','Volovets'' district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-07','Irshava district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-08','Mizhhiria district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-09','Mukacheve','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-10','Mukacheve district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-11','Perechyn district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-12','Rakhiv district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-13','Svaliava district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-14','Tiachiv district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-15','Uzhhorod','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-16','hust','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-17','Khust district','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZA-18','Chop','ZA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-01','Zhytomyr, Bohuns''kyi district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-02','Zhytomyr, Korolevs''kyi district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-03','Andrushivka district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-04','Baranivka district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-05','Berdychiv','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-06','Berdychiv distict','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-07','Brusyliv district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-08','Volodars''k-Volyns''kyi district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-09','Romanovs''ky district (Up 09.07.2003)','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-10','Iemil''chyne district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-11','Zhytomyr district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-12','Korosten''','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-13','Korosten'' district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-14','Korostyshiv district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-15','Luhyny district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-16','Liubar district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-17','Malyn district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-18','Narodychi district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-19','Novohrad-Volyns''kyi','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-20','Novohrad-Volyns''kyi district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-21','Ovruch district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-22','Olevs''k district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-23','Popil''nia district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-24','Radomyshl'' district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-25','Ruzhyn district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-26','Chervonoarmiis''k district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-27','Cherniakhiv district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZH-28','Chudniv district','ZH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-01','Zaporizhzhia, Zhovtnevyi district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-02','Zaporizhzhia, Zavods''kyi distic','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-03','Zaporizhzhia, Komunars''kyi distric','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-04','Zaporizhzhia, Lenins''kyi distric','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-05','Zaporizhzhia, Ordzhonikidzevs''kyi distric','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-06','Zaporizhzhia, Khortyts''kyi distric','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-07','Zaporizhzhia, Shevchenkivs''kyi distric','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-08','Iakymivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-09','Berdians''k','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-10','Berdians''k district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-11','Vasylivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-12','Velyka Bilozerka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-13','Vesele district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-14','Vil''nians''k district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-15','Huliaipole district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-16','Zaporizhzhia district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-17','Kamianka-Dniprovs''ka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-18','Kuibysheve district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-19','Melitopol''','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-20','Melitopol'' district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-21','Mykhailivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-22','Novomykolayivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-23','Orikhiv district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-24','Polohy district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-25','Pryazovs''ke district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-26','Prymors''k district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-27','Rozivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-28','Tokmak','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-29','Tokmak district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-30','Chernihivka district','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (288,'ZP-31','Enerhodar','ZP','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Alameda','Alameda','CA','EB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Contra Costa','Contra Costa','CA','EB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Napa','Napa','CA','EB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Solano','Solano','CA','EB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Barnstable','Barnstable','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Bristol','Bristol','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Dukes','Dukes','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Essex','Essex','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Middlesex','Middlesex','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Nantucket','Nantucket','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Norfolk','Norfolk','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Plymouth','Plymouth','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Suffolk','Suffolk','MA','EMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Albany','Albany','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Columbia','Columbia','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Dutchess','Dutchess','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Greene','Greene','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Orange','Orange','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Putnam','Putnam','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Rensselaer','Rensselaer','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Rockland','Rockland','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Saratoga','Saratoga','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Schenectady','Schenectady','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Sullivan','Sullivan','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Ulster','Ulster','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Warren','Warren','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Washington','Washington','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Westchester','Westchester','NY','ENY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Adams','Adams','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Berks','Berks','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Bradford','Bradford','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Bucks','Bucks','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Carbon','Carbon','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Chester','Chester','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Columbia','Columbia','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Cumberland','Cumberland','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Dauphin','Dauphin','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Delaware','Delaware','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Juniata','Juniata','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lackawanna','Lackawanna','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lancaster','Lancaster','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lebanon','Lebanon','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lehigh','Lehigh','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Luzerne','Luzerne','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lycoming','Lycoming','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Monroe','Monroe','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Montgomery','Montgomery','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Montour','Montour','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Northampton','Northampton','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Northumberland','Northumberland','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Perry','Perry','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Philadelphia','Philadelphia','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Pike','Pike','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Schuylkill','Schuylkill','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Snyder','Snyder','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Sullivan','Sullivan','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Susquehanna','Susquehanna','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Tioga','Tioga','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Union','Union','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Wayne','Wayne','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Wyoming','Wyoming','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,York','York','PA','EPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Adams','Adams','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Asotin','Asotin','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Benton','Benton','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Chelan','Chelan','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Columbia','Columbia','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Douglas','Douglas','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Ferry','Ferry','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Franklin','Franklin','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Garfield','Garfield','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Grant','Grant','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Kittitas','Kittitas','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Klickitat','Klickitat','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Lincoln','Lincoln','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Okanogan','Okanogan','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Pend Oreille','Pend Oreille','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Spokane','Spokane','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Stevens','Stevens','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Walla Walla','Walla Walla','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Whitman','Whitman','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Yakima','Yakima','WA','EWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Los Angeles','Los Angeles','CA','LAX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Alachua','Alachua','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Baker','Baker','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Bay','Bay','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Bradford','Bradford','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Calhoun','Calhoun','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Citrus','Citrus','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Clay','Clay','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Columbia','Columbia','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Dixie','Dixie','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Duval','Duval','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Escambia','Escambia','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Flagler','Flagler','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Franklin','Franklin','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Gadsden','Gadsden','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Gilchrist','Gilchrist','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Gulf','Gulf','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Hamilton','Hamilton','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Hernando','Hernando','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Holmes','Holmes','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Jackson','Jackson','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Jefferson','Jefferson','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Lafayette','Lafayette','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Lake','Lake','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Leon','Leon','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Levy','Levy','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Liberty','Liberty','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Madison','Madison','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Marion','Marion','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Nassau','Nassau','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Okaloosa','Okaloosa','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Orange','Orange','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Putnam','Putnam','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Santa Rosa','Santa Rosa','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Seminole','Seminole','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,St. Johns','St. Johns','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Sumter','Sumter','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Suwannee','Suwannee','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Taylor','Taylor','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Union','Union','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Volusia','Volusia','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Wakulla','Wakulla','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Walton','Walton','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Washington','Washington','FL','NFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Bronx','Bronx','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Kings','Kings','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Nassau','Nassau','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,New York','New York','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Queens','Queens','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Richmond','Richmond','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Suffolk','Suffolk','NY','NLI');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Bergen','Bergen','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Essex','Essex','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Hudson','Hudson','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Hunterdon','Hunterdon','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Middlesex','Middlesex','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Monmouth','Monmouth','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Morris','Morris','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Passaic','Passaic','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Somerset','Somerset','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Sussex','Sussex','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Union','Union','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Warren','Warren','NJ','NNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Clinton','Clinton','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Essex','Essex','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Franklin','Franklin','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Fulton','Fulton','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Hamilton','Hamilton','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Jefferson','Jefferson','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Lewis','Lewis','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Montgomery','Montgomery','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Schoharie','Schoharie','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,St. Lawrence','St. Lawrence','NY','NNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Anderson','Anderson','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Archer','Archer','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Baylor','Baylor','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bell','Bell','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bosque','Bosque','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bowie','Bowie','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Brown','Brown','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Camp','Camp','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cass','Cass','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cherokee','Cherokee','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Clay','Clay','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Collin','Collin','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Comanche','Comanche','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cooke','Cooke','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Coryell','Coryell','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Dallas','Dallas','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Delta','Delta','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Denton','Denton','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Eastland','Eastland','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Ellis','Ellis','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Erath','Erath','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Falls','Falls','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Fannin','Fannin','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Franklin','Franklin','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Freestone','Freestone','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Grayson','Grayson','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Gregg','Gregg','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hamilton','Hamilton','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Harrison','Harrison','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Henderson','Henderson','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hill','Hill','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hood','Hood','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hopkins','Hopkins','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hunt','Hunt','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jack','Jack','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Johnson','Johnson','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kaufman','Kaufman','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lamar','Lamar','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lampasas','Lampasas','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Limestone','Limestone','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Marion','Marion','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,McLennan','McLennan','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Mills','Mills','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Montague','Montague','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Morris','Morris','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Nacogdoches','Nacogdoches','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Navarro','Navarro','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Palo Pinto','Palo Pinto','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Panola','Panola','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Parker','Parker','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Rains','Rains','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Red River','Red River','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Rockwall','Rockwall','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Rusk','Rusk','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Shelby','Shelby','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Smith','Smith','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Somervell','Somervell','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Stephens','Stephens','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Tarrant','Tarrant','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Throckmorton','Throckmorton','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Titus','Titus','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Upshur','Upshur','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Van Zandt','Van Zandt','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wichita','Wichita','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wilbarger','Wilbarger','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wise','Wise','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wood','Wood','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Young','Young','TX','NTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Inyo','Inyo','CA','ORG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Orange','Orange','CA','ORG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Riverside','Riverside','CA','ORG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Bernardino','San Bernardino','CA','ORG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Luis Obispo','San Luis Obispo','CA','SB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Santa Barbara','Santa Barbara','CA','SB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Ventura','Ventura','CA','SB');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Monterey','Monterey','CA','SCV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Benito','San Benito','CA','SCV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Mateo','San Mateo','CA','SCV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Santa Clara','Santa Clara','CA','SCV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Santa Cruz','Santa Cruz','CA','SCV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Imperial','Imperial','CA','SDG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Diego','San Diego','CA','SDG');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Del Norte','Del Norte','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Humboldt','Humboldt','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Lake','Lake','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Marin','Marin','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Mendocino','Mendocino','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Francisco','San Francisco','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Sonoma','Sonoma','CA','SF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Brevard','Brevard','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Broward','Broward','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Collier','Collier','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Miami-Dade','Miami-Dade','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Glades','Glades','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Hendry','Hendry','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Indian River','Indian River','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Lee','Lee','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Martin','Martin','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Monroe','Monroe','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Okeechobee','Okeechobee','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Osceola','Osceola','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Palm Beach','Palm Beach','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,St. Lucie','St. Lucie','FL','SFL');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Calaveras','Calaveras','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Fresno','Fresno','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Kern','Kern','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Kings','Kings','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Madera','Madera','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Mariposa','Mariposa','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Merced','Merced','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Mono','Mono','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,San Joaquin','San Joaquin','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Stanislaus','Stanislaus','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Tulare','Tulare','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Tuolumne','Tuolumne','CA','SJV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Atlantic','Atlantic','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Burlington','Burlington','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Camden','Camden','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Cape May','Cape May','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Cumberland','Cumberland','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Gloucester','Gloucester','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Mercer','Mercer','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Ocean','Ocean','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NJ,Salem','Salem','NJ','SNJ');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Angelina','Angelina','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Aransas','Aransas','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Atascosa','Atascosa','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Austin','Austin','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bandera','Bandera','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bastrop','Bastrop','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bee','Bee','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bexar','Bexar','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Blanco','Blanco','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Brazoria','Brazoria','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Brazos','Brazos','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Brooks','Brooks','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Burleson','Burleson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Burnet','Burnet','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Caldwell','Caldwell','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Calhoun','Calhoun','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cameron','Cameron','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Chambers','Chambers','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Colorado','Colorado','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Comal','Comal','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Concho','Concho','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,DeWitt','DeWitt','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Dimmit','Dimmit','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Duval','Duval','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Edwards','Edwards','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Fayette','Fayette','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Fort Bend','Fort Bend','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Frio','Frio','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Galveston','Galveston','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Gillespie','Gillespie','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Goliad','Goliad','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Gonzales','Gonzales','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Grimes','Grimes','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Guadalupe','Guadalupe','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hardin','Hardin','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Harris','Harris','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hays','Hays','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hidalgo','Hidalgo','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Houston','Houston','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jackson','Jackson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jasper','Jasper','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jefferson','Jefferson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jim Hogg','Jim Hogg','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jim Wells','Jim Wells','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Karnes','Karnes','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kendall','Kendall','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kenedy','Kenedy','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kerr','Kerr','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kimble','Kimble','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kinney','Kinney','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kleberg','Kleberg','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,La Salle','La Salle','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lavaca','Lavaca','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lee','Lee','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Leon','Leon','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Liberty','Liberty','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Live Oak','Live Oak','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Llano','Llano','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Madison','Madison','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Mason','Mason','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Matagorda','Matagorda','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Maverick','Maverick','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,McCulloch','McCulloch','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,McMullen','McMullen','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Medina','Medina','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Menard','Menard','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Milam','Milam','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Montgomery','Montgomery','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Newton','Newton','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Nueces','Nueces','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Orange','Orange','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Polk','Polk','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Real','Real','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Refugio','Refugio','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Robertson','Robertson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Sabine','Sabine','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,San Augustine','San Augustine','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,San Jacinto','San Jacinto','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,San Patricio','San Patricio','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,San Saba','San Saba','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Starr','Starr','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Travis','Travis','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Trinity','Trinity','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Tyler','Tyler','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Uvalde','Uvalde','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Val Verde','Val Verde','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Victoria','Victoria','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Walker','Walker','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Waller','Waller','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Washington','Washington','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Webb','Webb','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wharton','Wharton','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Willacy','Willacy','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Williamson','Williamson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wilson','Wilson','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Zapata','Zapata','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Zavala','Zavala','TX','STX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Alpine','Alpine','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Amador','Amador','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Butte','Butte','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Colusa','Colusa','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,El Dorado','El Dorado','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Glenn','Glenn','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Lassen','Lassen','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Modoc','Modoc','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Nevada','Nevada','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Placer','Placer','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Plumas','Plumas','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Sacramento','Sacramento','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Shasta','Shasta','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Sierra','Sierra','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Siskiyou','Siskiyou','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Sutter','Sutter','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Tehama','Tehama','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Trinity','Trinity','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Yolo','Yolo','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CA,Yuba','Yuba','CA','SV');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Charlotte','Charlotte','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,DeSoto','DeSoto','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Hardee','Hardee','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Highlands','Highlands','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Hillsborough','Hillsborough','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Manatee','Manatee','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Pasco','Pasco','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Pinellas','Pinellas','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Polk','Polk','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'FL,Sarasota','Sarasota','FL','WCF');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Berkshire','Berkshire','MA','WMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Franklin','Franklin','MA','WMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Hampden','Hampden','MA','WMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Hampshire','Hampshire','MA','WMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MA,Worcester','Worcester','MA','WMA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Allegany','Allegany','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Broome','Broome','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Cattaraugus','Cattaraugus','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Cayuga','Cayuga','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Chautauqua','Chautauqua','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Chemung','Chemung','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Chenango','Chenango','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Cortland','Cortland','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Delaware','Delaware','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Erie','Erie','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Genesee','Genesee','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Herkimer','Herkimer','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Livingston','Livingston','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Madison','Madison','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Monroe','Monroe','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Niagara','Niagara','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Oneida','Oneida','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Onondaga','Onondaga','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Ontario','Ontario','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Orleans','Orleans','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Oswego','Oswego','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Otsego','Otsego','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Schuyler','Schuyler','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Seneca','Seneca','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Steuben','Steuben','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Tioga','Tioga','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Tompkins','Tompkins','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Wayne','Wayne','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Wyoming','Wyoming','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NY,Yates','Yates','NY','WNY');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Allegheny','Allegheny','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Armstrong','Armstrong','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Beaver','Beaver','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Bedford','Bedford','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Blair','Blair','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Butler','Butler','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Cambria','Cambria','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Cameron','Cameron','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Centre','Centre','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Clarion','Clarion','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Clearfield','Clearfield','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Clinton','Clinton','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Crawford','Crawford','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Elk','Elk','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Erie','Erie','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Fayette','Fayette','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Forest','Forest','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Franklin','Franklin','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Fulton','Fulton','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Greene','Greene','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Huntingdon','Huntingdon','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Indiana','Indiana','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Jefferson','Jefferson','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Lawrence','Lawrence','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,McKean','McKean','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Mercer','Mercer','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Mifflin','Mifflin','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Potter','Potter','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Somerset','Somerset','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Venango','Venango','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Warren','Warren','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Washington','Washington','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'PA,Westmoreland','Westmoreland','PA','WPA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Andrews','Andrews','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Armstrong','Armstrong','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Bailey','Bailey','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Borden','Borden','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Brewster','Brewster','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Briscoe','Briscoe','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Callahan','Callahan','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Carson','Carson','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Castro','Castro','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Childress','Childress','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cochran','Cochran','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Coke','Coke','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Coleman','Coleman','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Collingsworth','Collingsworth','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Cottle','Cottle','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Crane','Crane','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Crockett','Crockett','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Crosby','Crosby','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Culberson','Culberson','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Dallam','Dallam','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Dawson','Dawson','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Deaf Smith','Deaf Smith','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Dickens','Dickens','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Donley','Donley','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Ector','Ector','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,El Paso','El Paso','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Fisher','Fisher','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Floyd','Floyd','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Foard','Foard','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Gaines','Gaines','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Garza','Garza','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Glasscock','Glasscock','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Gray','Gray','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hale','Hale','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hall','Hall','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hansford','Hansford','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hardeman','Hardeman','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hartley','Hartley','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Haskell','Haskell','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hemphill','Hemphill','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hockley','Hockley','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Howard','Howard','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hudspeth','Hudspeth','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Hutchinson','Hutchinson','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Irion','Irion','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jeff Davis','Jeff Davis','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Jones','Jones','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Kent','Kent','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,King','King','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Knox','Knox','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lamb','Lamb','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lipscomb','Lipscomb','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Loving','Loving','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lubbock','Lubbock','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Lynn','Lynn','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Martin','Martin','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Midland','Midland','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Mitchell','Mitchell','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Moore','Moore','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Motley','Motley','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Nolan','Nolan','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Ochiltree','Ochiltree','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Oldham','Oldham','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Parmer','Parmer','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Pecos','Pecos','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Potter','Potter','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Presidio','Presidio','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Randall','Randall','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Reagan','Reagan','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Reeves','Reeves','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Roberts','Roberts','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Runnels','Runnels','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Schleicher','Schleicher','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Scurry','Scurry','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Shackelford','Shackelford','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Sherman','Sherman','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Sterling','Sterling','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Stonewall','Stonewall','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Sutton','Sutton','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Swisher','Swisher','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Taylor','Taylor','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Terrell','Terrell','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Terry','Terry','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Tom Green','Tom Green','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Upton','Upton','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Ward','Ward','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Wheeler','Wheeler','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Winkler','Winkler','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TX,Yoakum','Yoakum','TX','WTX');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Clallam','Clallam','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Clark','Clark','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Cowlitz','Cowlitz','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Grays Harbor','Grays Harbor','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Island','Island','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Jefferson','Jefferson','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,King','King','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Kitsap','Kitsap','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Lewis','Lewis','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Mason','Mason','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Pacific','Pacific','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Pierce','Pierce','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,San Juan','San Juan','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Skagit','Skagit','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Skamania','Skamania','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Snohomish','Snohomish','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Thurston','Thurston','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Wahkiakum','Wahkiakum','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WA,Whatcom','Whatcom','WA','WWA');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Autauga','Autauga','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Baldwin','Baldwin','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Barbour','Barbour','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Bibb','Bibb','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Blount','Blount','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Bullock','Bullock','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Butler','Butler','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Calhoun','Calhoun','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Chambers','Chambers','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Cherokee','Cherokee','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Chilton','Chilton','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Choctaw','Choctaw','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Clarke','Clarke','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Clay','Clay','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Cleburne','Cleburne','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Coffee','Coffee','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Colbert','Colbert','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Conecuh','Conecuh','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Coosa','Coosa','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Covington','Covington','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Crenshaw','Crenshaw','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Cullman','Cullman','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Dale','Dale','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Dallas','Dallas','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,DeKalb','DeKalb','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Elmore','Elmore','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Escambia','Escambia','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Etowah','Etowah','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Fayette','Fayette','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Franklin','Franklin','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Geneva','Geneva','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Greene','Greene','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Hale','Hale','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Henry','Henry','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Houston','Houston','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Jackson','Jackson','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Jefferson','Jefferson','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Lamar','Lamar','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Lauderdale','Lauderdale','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Lawrence','Lawrence','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Lee','Lee','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Limestone','Limestone','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Lowndes','Lowndes','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Macon','Macon','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Madison','Madison','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Marengo','Marengo','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Marion','Marion','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Marshall','Marshall','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Mobile','Mobile','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Monroe','Monroe','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Montgomery','Montgomery','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Morgan','Morgan','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Perry','Perry','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Pickens','Pickens','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Pike','Pike','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Randolph','Randolph','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Russell','Russell','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Shelby','Shelby','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,St. Clair','St. Clair','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Sumter','Sumter','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Talladega','Talladega','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Tallapoosa','Tallapoosa','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Tuscaloosa','Tuscaloosa','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Walker','Walker','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Washington','Washington','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Wilcox','Wilcox','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AL,Winston','Winston','AL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Arkansas','Arkansas','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Ashley','Ashley','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Baxter','Baxter','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Benton','Benton','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Boone','Boone','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Bradley','Bradley','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Calhoun','Calhoun','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Carroll','Carroll','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Chicot','Chicot','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Clark','Clark','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Clay','Clay','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Cleburne','Cleburne','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Cleveland','Cleveland','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Columbia','Columbia','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Conway','Conway','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Craighead','Craighead','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Crawford','Crawford','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Crittenden','Crittenden','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Cross','Cross','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Dallas','Dallas','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Desha','Desha','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Drew','Drew','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Faulkner','Faulkner','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Franklin','Franklin','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Fulton','Fulton','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Garland','Garland','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Grant','Grant','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Greene','Greene','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Hempstead','Hempstead','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Hot Spring','Hot Spring','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Howard','Howard','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Independence','Independence','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Izard','Izard','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Jackson','Jackson','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Jefferson','Jefferson','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Johnson','Johnson','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Lafayette','Lafayette','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Lawrence','Lawrence','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Lee','Lee','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Lincoln','Lincoln','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Little River','Little River','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Logan','Logan','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Lonoke','Lonoke','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Madison','Madison','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Marion','Marion','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Miller','Miller','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Mississippi','Mississippi','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Monroe','Monroe','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Montgomery','Montgomery','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Nevada','Nevada','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Newton','Newton','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Ouachita','Ouachita','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Perry','Perry','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Phillips','Phillips','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Pike','Pike','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Poinsett','Poinsett','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Polk','Polk','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Pope','Pope','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Prairie','Prairie','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Pulaski','Pulaski','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Randolph','Randolph','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Saline','Saline','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Scott','Scott','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Searcy','Searcy','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Sebastian','Sebastian','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Sevier','Sevier','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Sharp','Sharp','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,St. Francis','St. Francis','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Stone','Stone','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Union','Union','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Van Buren','Van Buren','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Washington','Washington','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,White','White','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Woodruff','Woodruff','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AR,Yell','Yell','AR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,La Paz','La Paz','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Apache','Apache','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Cochise','Cochise','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Coconino','Coconino','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Gila','Gila','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Graham','Graham','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Greenlee','Greenlee','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Maricopa','Maricopa','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Mohave','Mohave','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Navajo','Navajo','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Pima','Pima','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Pinal','Pinal','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Santa Cruz','Santa Cruz','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Yavapai','Yavapai','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'AZ,Yuma','Yuma','AZ','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Adams','Adams','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Alamosa','Alamosa','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Arapahoe','Arapahoe','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Archuleta','Archuleta','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Baca','Baca','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Bent','Bent','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Boulder','Boulder','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Broomfield','Broomfield','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Chaffee','Chaffee','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Cheyenne','Cheyenne','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Clear Creek','Clear Creek','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Conejos','Conejos','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Costilla','Costilla','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Crowley','Crowley','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Custer','Custer','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Delta','Delta','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Denver','Denver','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Dolores','Dolores','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Douglas','Douglas','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Eagle','Eagle','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,El Paso','El Paso','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Elbert','Elbert','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Fremont','Fremont','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Garfield','Garfield','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Gilpin','Gilpin','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Grand','Grand','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Gunnison','Gunnison','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Hinsdale','Hinsdale','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Huerfano','Huerfano','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Jackson','Jackson','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Jefferson','Jefferson','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Kiowa','Kiowa','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Kit Carson','Kit Carson','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,La Plata','La Plata','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Lake','Lake','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Larimer','Larimer','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Las Animas','Las Animas','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Lincoln','Lincoln','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Logan','Logan','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Mesa','Mesa','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Mineral','Mineral','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Moffat','Moffat','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Montezuma','Montezuma','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Montrose','Montrose','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Morgan','Morgan','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Otero','Otero','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Ouray','Ouray','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Park','Park','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Phillips','Phillips','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Pitkin','Pitkin','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Prowers','Prowers','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Pueblo','Pueblo','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Rio Blanco','Rio Blanco','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Rio Grande','Rio Grande','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Routt','Routt','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Saguache','Saguache','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,San Juan','San Juan','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,San Miguel','San Miguel','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Sedgwick','Sedgwick','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Summit','Summit','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Teller','Teller','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Washington','Washington','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Weld','Weld','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CO,Yuma','Yuma','CO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Fairfield','Fairfield','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Hartford','Hartford','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Litchfield','Litchfield','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Middlesex','Middlesex','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,New Haven','New Haven','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,New London','New London','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Tolland','Tolland','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'CT,Windham','Windham','CT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'DC,Montgomery','Montgomery','DC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'DC,Prince George''s','Prince George''s','DC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'DE,Kent','Kent','DE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'DE,New Castle','New Castle','DE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'DE,Sussex','Sussex','DE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Appling','Appling','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Atkinson','Atkinson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bacon','Bacon','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Baker','Baker','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Baldwin','Baldwin','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Banks','Banks','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Barrow','Barrow','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bartow','Bartow','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Ben Hill','Ben Hill','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Berrien','Berrien','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bibb','Bibb','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bleckley','Bleckley','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Brantley','Brantley','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Brooks','Brooks','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bryan','Bryan','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Bulloch','Bulloch','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Burke','Burke','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Butts','Butts','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Calhoun','Calhoun','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Camden','Camden','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Candler','Candler','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Carroll','Carroll','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Catoosa','Catoosa','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Charlton','Charlton','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Chatham','Chatham','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Chattahoochee','Chattahoochee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Chattooga','Chattooga','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Cherokee','Cherokee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Clarke','Clarke','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Clay','Clay','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Clayton','Clayton','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Clinch','Clinch','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Cobb','Cobb','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Coffee','Coffee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Colquitt','Colquitt','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Columbia','Columbia','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Cook','Cook','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Coweta','Coweta','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Crawford','Crawford','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Crisp','Crisp','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Dade','Dade','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Dawson','Dawson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Decatur','Decatur','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,DeKalb','DeKalb','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Dodge','Dodge','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Dooly','Dooly','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Dougherty','Dougherty','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Douglas','Douglas','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Early','Early','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Echols','Echols','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Effingham','Effingham','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Elbert','Elbert','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Emanuel','Emanuel','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Evans','Evans','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Fannin','Fannin','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Fayette','Fayette','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Floyd','Floyd','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Forsyth','Forsyth','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Franklin','Franklin','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Fulton','Fulton','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Gilmer','Gilmer','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Glascock','Glascock','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Glynn','Glynn','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Gordon','Gordon','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Grady','Grady','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Greene','Greene','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Gwinnett','Gwinnett','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Habersham','Habersham','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Hall','Hall','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Hancock','Hancock','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Haralson','Haralson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Harris','Harris','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Hart','Hart','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Heard','Heard','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Henry','Henry','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Houston','Houston','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Irwin','Irwin','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jackson','Jackson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jasper','Jasper','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jeff Davis','Jeff Davis','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jefferson','Jefferson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jenkins','Jenkins','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Johnson','Johnson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Jones','Jones','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lamar','Lamar','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lanier','Lanier','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Laurens','Laurens','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lee','Lee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Liberty','Liberty','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lincoln','Lincoln','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Long','Long','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lowndes','Lowndes','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Lumpkin','Lumpkin','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Macon','Macon','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Madison','Madison','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Marion','Marion','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,McDuffie','McDuffie','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,McIntosh','McIntosh','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Meriwether','Meriwether','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Miller','Miller','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Mitchell','Mitchell','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Monroe','Monroe','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Montgomery','Montgomery','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Morgan','Morgan','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Murray','Murray','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Muscogee','Muscogee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Newton','Newton','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Oconee','Oconee','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Oglethorpe','Oglethorpe','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Paulding','Paulding','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Peach','Peach','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Pickens','Pickens','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Pierce','Pierce','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Pike','Pike','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Polk','Polk','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Pulaski','Pulaski','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Putnam','Putnam','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Quitman','Quitman','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Rabun','Rabun','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Randolph','Randolph','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Richmond','Richmond','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Rockdale','Rockdale','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Schley','Schley','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Screven','Screven','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Seminole','Seminole','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Spalding','Spalding','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Stephens','Stephens','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Stewart','Stewart','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Sumter','Sumter','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Talbot','Talbot','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Taliaferro','Taliaferro','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Tattnall','Tattnall','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Taylor','Taylor','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Telfair','Telfair','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Terrell','Terrell','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Thomas','Thomas','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Tift','Tift','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Toombs','Toombs','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Towns','Towns','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Treutlen','Treutlen','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Troup','Troup','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Turner','Turner','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Twiggs','Twiggs','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Union','Union','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Upson','Upson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Walker','Walker','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Walton','Walton','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Ware','Ware','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Warren','Warren','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Washington','Washington','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Wayne','Wayne','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Webster','Webster','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Wheeler','Wheeler','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,White','White','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Whitfield','Whitfield','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Wilcox','Wilcox','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Wilkes','Wilkes','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Wilkinson','Wilkinson','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'GA,Worth','Worth','GA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Adair','Adair','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Adams','Adams','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Allamakee','Allamakee','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Appanoose','Appanoose','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Audubon','Audubon','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Benton','Benton','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Black Hawk','Black Hawk','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Boone','Boone','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Bremer','Bremer','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Buchanan','Buchanan','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Buena Vista','Buena Vista','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Butler','Butler','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Calhoun','Calhoun','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Carroll','Carroll','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Cass','Cass','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Cedar','Cedar','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Cerro Gordo','Cerro Gordo','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Cherokee','Cherokee','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Chickasaw','Chickasaw','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Clarke','Clarke','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Clay','Clay','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Clayton','Clayton','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Clinton','Clinton','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Crawford','Crawford','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Dallas','Dallas','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Davis','Davis','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Decatur','Decatur','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Delaware','Delaware','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Des Moines','Des Moines','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Dickinson','Dickinson','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Dubuque','Dubuque','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Emmet','Emmet','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Fayette','Fayette','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Floyd','Floyd','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Franklin','Franklin','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Fremont','Fremont','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Greene','Greene','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Grundy','Grundy','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Guthrie','Guthrie','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Hamilton','Hamilton','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Hancock','Hancock','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Hardin','Hardin','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Harrison','Harrison','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Henry','Henry','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Howard','Howard','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Humboldt','Humboldt','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Ida','Ida','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Iowa','Iowa','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Jackson','Jackson','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Jasper','Jasper','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Jefferson','Jefferson','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Johnson','Johnson','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Jones','Jones','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Keokuk','Keokuk','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Kossuth','Kossuth','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Lee','Lee','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Linn','Linn','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Louisa','Louisa','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Lucas','Lucas','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Lyon','Lyon','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Madison','Madison','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Mahaska','Mahaska','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Marion','Marion','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Marshall','Marshall','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Mills','Mills','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Mitchell','Mitchell','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Monona','Monona','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Monroe','Monroe','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Montgomery','Montgomery','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Muscatine','Muscatine','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,O''Brien','O''Brien','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Osceola','Osceola','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Page','Page','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Palo Alto','Palo Alto','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Plymouth','Plymouth','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Pocahontas','Pocahontas','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Polk','Polk','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Pottawattamie','Pottawattamie','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Poweshiek','Poweshiek','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Ringgold','Ringgold','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Sac','Sac','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Scott','Scott','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Shelby','Shelby','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Sioux','Sioux','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Story','Story','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Tama','Tama','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Taylor','Taylor','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Union','Union','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Van Buren','Van Buren','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Wapello','Wapello','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Warren','Warren','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Washington','Washington','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Wayne','Wayne','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Webster','Webster','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Winnebago','Winnebago','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Winneshiek','Winneshiek','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Woodbury','Woodbury','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Worth','Worth','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IA,Wright','Wright','IA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Ada','Ada','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Adams','Adams','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Bannock','Bannock','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Bear Lake','Bear Lake','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Benewah','Benewah','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Bingham','Bingham','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Blaine','Blaine','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Boise','Boise','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Bonner','Bonner','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Bonneville','Bonneville','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Boundary','Boundary','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Butte','Butte','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Camas','Camas','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Canyon','Canyon','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Caribou','Caribou','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Cassia','Cassia','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Clark','Clark','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Clearwater','Clearwater','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Custer','Custer','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Elmore','Elmore','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Franklin','Franklin','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Fremont','Fremont','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Gem','Gem','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Gooding','Gooding','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Idaho','Idaho','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Jefferson','Jefferson','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Jerome','Jerome','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Kootenai','Kootenai','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Latah','Latah','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Lemhi','Lemhi','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Lewis','Lewis','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Lincoln','Lincoln','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Madison','Madison','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Minidoka','Minidoka','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Nez Perce','Nez Perce','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Oneida','Oneida','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Owyhee','Owyhee','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Payette','Payette','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Power','Power','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Shoshone','Shoshone','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Teton','Teton','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Twin Falls','Twin Falls','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Valley','Valley','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ID,Washington','Washington','ID','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Adams','Adams','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Alexander','Alexander','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Bond','Bond','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Boone','Boone','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Brown','Brown','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Bureau','Bureau','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Calhoun','Calhoun','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Carroll','Carroll','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Cass','Cass','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Champaign','Champaign','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Christian','Christian','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Clark','Clark','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Clay','Clay','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Clinton','Clinton','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Coles','Coles','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Cook','Cook','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Crawford','Crawford','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Cumberland','Cumberland','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,DeWitt','DeWitt','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,DeKalb','DeKalb','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Douglas','Douglas','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,DuPage','DuPage','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Edgar','Edgar','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Edwards','Edwards','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Effingham','Effingham','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Fayette','Fayette','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Ford','Ford','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Franklin','Franklin','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Fulton','Fulton','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Gallatin','Gallatin','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Greene','Greene','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Grundy','Grundy','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Hamilton','Hamilton','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Hancock','Hancock','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Hardin','Hardin','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Henderson','Henderson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Henry','Henry','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Iroquois','Iroquois','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Jackson','Jackson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Jasper','Jasper','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Jefferson','Jefferson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Jersey','Jersey','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Jo Daviess','Jo Daviess','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Johnson','Johnson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Kane','Kane','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Kankakee','Kankakee','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Kendall','Kendall','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Knox','Knox','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,La Salle','La Salle','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Lake','Lake','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Lawrence','Lawrence','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Lee','Lee','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Livingston','Livingston','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Logan','Logan','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Macon','Macon','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Macoupin','Macoupin','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Madison','Madison','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Marion','Marion','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Marshall','Marshall','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Mason','Mason','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Massac','Massac','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,McDonough','McDonough','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,McHenry','McHenry','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,McLean','McLean','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Menard','Menard','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Mercer','Mercer','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Monroe','Monroe','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Montgomery','Montgomery','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Morgan','Morgan','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Moultrie','Moultrie','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Ogle','Ogle','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Peoria','Peoria','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Perry','Perry','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Piatt','Piatt','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Pike','Pike','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Pope','Pope','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Pulaski','Pulaski','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Putnam','Putnam','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Randolph','Randolph','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Richland','Richland','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Rock Island','Rock Island','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Saline','Saline','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Sangamon','Sangamon','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Schuyler','Schuyler','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Scott','Scott','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Shelby','Shelby','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,St. Clair','St. Clair','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Stark','Stark','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Stephenson','Stephenson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Tazewell','Tazewell','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Union','Union','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Vermilion','Vermilion','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Wabash','Wabash','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Warren','Warren','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Washington','Washington','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Wayne','Wayne','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,White','White','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Whiteside','Whiteside','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Will','Will','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Williamson','Williamson','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Winnebago','Winnebago','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IL,Woodford','Woodford','IL','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Adams','Adams','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Allen','Allen','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Bartholomew','Bartholomew','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Benton','Benton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Blackford','Blackford','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Boone','Boone','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Brown','Brown','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Carroll','Carroll','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Cass','Cass','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Clark','Clark','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Clay','Clay','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Clinton','Clinton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Crawford','Crawford','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Daviess','Daviess','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,DeKalb','DeKalb','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Dearborn','Dearborn','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Decatur','Decatur','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Delaware','Delaware','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Dubois','Dubois','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Elkhart','Elkhart','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Fayette','Fayette','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Floyd','Floyd','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Fountain','Fountain','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Franklin','Franklin','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Fulton','Fulton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Gibson','Gibson','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Grant','Grant','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Greene','Greene','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Hamilton','Hamilton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Hancock','Hancock','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Harrison','Harrison','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Hendricks','Hendricks','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Henry','Henry','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Howard','Howard','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Huntington','Huntington','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Jackson','Jackson','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Jasper','Jasper','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Jay','Jay','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Jefferson','Jefferson','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Jennings','Jennings','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Johnson','Johnson','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Knox','Knox','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Kosciusko','Kosciusko','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,La Porte','La Porte','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Lagrange','Lagrange','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Lake','Lake','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Lawrence','Lawrence','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Madison','Madison','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Marion','Marion','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Marshall','Marshall','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Martin','Martin','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Miami','Miami','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Monroe','Monroe','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Montgomery','Montgomery','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Morgan','Morgan','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Newton','Newton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Noble','Noble','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Ohio','Ohio','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Orange','Orange','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Owen','Owen','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Parke','Parke','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Perry','Perry','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Pike','Pike','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Porter','Porter','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Posey','Posey','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Pulaski','Pulaski','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Putnam','Putnam','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Randolph','Randolph','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Ripley','Ripley','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Rush','Rush','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Scott','Scott','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Shelby','Shelby','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Spencer','Spencer','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,St. Joseph','St. Joseph','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Starke','Starke','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Steuben','Steuben','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Sullivan','Sullivan','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Switzerland','Switzerland','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Tippecanoe','Tippecanoe','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Tipton','Tipton','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Union','Union','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Vanderburgh','Vanderburgh','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Vermillion','Vermillion','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Vigo','Vigo','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Wabash','Wabash','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Warren','Warren','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Warrick','Warrick','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Washington','Washington','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Wayne','Wayne','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Wells','Wells','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,White','White','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'IN,Whitley','Whitley','IN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Allen','Allen','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Anderson','Anderson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Atchison','Atchison','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Barber','Barber','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Barton','Barton','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Bourbon','Bourbon','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Brown','Brown','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Butler','Butler','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Chase','Chase','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Chautauqua','Chautauqua','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Cherokee','Cherokee','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Cheyenne','Cheyenne','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Clark','Clark','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Clay','Clay','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Cloud','Cloud','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Coffey','Coffey','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Comanche','Comanche','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Cowley','Cowley','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Crawford','Crawford','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Decatur','Decatur','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Dickinson','Dickinson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Doniphan','Doniphan','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Douglas','Douglas','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Edwards','Edwards','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Elk','Elk','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Ellis','Ellis','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Ellsworth','Ellsworth','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Finney','Finney','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Ford','Ford','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Franklin','Franklin','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Geary','Geary','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Gove','Gove','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Graham','Graham','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Grant','Grant','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Gray','Gray','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Greeley','Greeley','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Greenwood','Greenwood','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Hamilton','Hamilton','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Harper','Harper','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Harvey','Harvey','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Haskell','Haskell','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Hodgeman','Hodgeman','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Jackson','Jackson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Jefferson','Jefferson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Jewell','Jewell','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Johnson','Johnson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Kearny','Kearny','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Kingman','Kingman','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Kiowa','Kiowa','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Labette','Labette','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Lane','Lane','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Leavenworth','Leavenworth','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Lincoln','Lincoln','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Linn','Linn','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Logan','Logan','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Lyon','Lyon','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Marion','Marion','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Marshall','Marshall','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,McPherson','McPherson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Meade','Meade','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Miami','Miami','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Mitchell','Mitchell','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Montgomery','Montgomery','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Morris','Morris','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Morton','Morton','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Nemaha','Nemaha','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Neosho','Neosho','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Ness','Ness','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Norton','Norton','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Osage','Osage','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Osborne','Osborne','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Ottawa','Ottawa','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Pawnee','Pawnee','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Phillips','Phillips','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Pottawatomie','Pottawatomie','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Pratt','Pratt','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Rawlins','Rawlins','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Reno','Reno','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Republic','Republic','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Rice','Rice','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Riley','Riley','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Rooks','Rooks','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Rush','Rush','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Russell','Russell','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Saline','Saline','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Scott','Scott','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Sedgwick','Sedgwick','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Seward','Seward','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Shawnee','Shawnee','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Sheridan','Sheridan','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Sherman','Sherman','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Smith','Smith','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Stafford','Stafford','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Stanton','Stanton','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Stevens','Stevens','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Sumner','Sumner','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Thomas','Thomas','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Trego','Trego','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Wabaunsee','Wabaunsee','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Wallace','Wallace','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Washington','Washington','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Wichita','Wichita','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Wilson','Wilson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Woodson','Woodson','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KS,Wyandotte','Wyandotte','KS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Adair','Adair','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Allen','Allen','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Anderson','Anderson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Ballard','Ballard','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Barren','Barren','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Bath','Bath','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Bell','Bell','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Boone','Boone','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Bourbon','Bourbon','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Boyd','Boyd','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Boyle','Boyle','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Bracken','Bracken','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Breathitt','Breathitt','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Breckinridge','Breckinridge','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Bullitt','Bullitt','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Butler','Butler','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Caldwell','Caldwell','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Calloway','Calloway','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Campbell','Campbell','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Carlisle','Carlisle','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Carroll','Carroll','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Carter','Carter','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Casey','Casey','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Christian','Christian','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Clark','Clark','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Clay','Clay','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Clinton','Clinton','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Crittenden','Crittenden','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Cumberland','Cumberland','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Daviess','Daviess','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Edmonson','Edmonson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Elliott','Elliott','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Estill','Estill','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Fayette','Fayette','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Fleming','Fleming','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Floyd','Floyd','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Franklin','Franklin','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Fulton','Fulton','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Gallatin','Gallatin','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Garrard','Garrard','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Grant','Grant','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Graves','Graves','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Grayson','Grayson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Green','Green','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Greenup','Greenup','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Hancock','Hancock','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Hardin','Hardin','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Harlan','Harlan','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Harrison','Harrison','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Hart','Hart','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Henderson','Henderson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Henry','Henry','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Hickman','Hickman','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Hopkins','Hopkins','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Jackson','Jackson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Jefferson','Jefferson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Jessamine','Jessamine','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Johnson','Johnson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Kenton','Kenton','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Knott','Knott','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Knox','Knox','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Larue','Larue','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Laurel','Laurel','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Lawrence','Lawrence','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Lee','Lee','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Leslie','Leslie','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Letcher','Letcher','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Lewis','Lewis','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Lincoln','Lincoln','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Livingston','Livingston','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Logan','Logan','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Lyon','Lyon','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Madison','Madison','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Magoffin','Magoffin','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Marion','Marion','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Marshall','Marshall','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Martin','Martin','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Mason','Mason','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,McCracken','McCracken','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,McCreary','McCreary','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,McLean','McLean','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Meade','Meade','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Menifee','Menifee','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Mercer','Mercer','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Metcalfe','Metcalfe','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Monroe','Monroe','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Montgomery','Montgomery','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Morgan','Morgan','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Muhlenberg','Muhlenberg','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Nelson','Nelson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Nicholas','Nicholas','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Ohio','Ohio','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Oldham','Oldham','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Owen','Owen','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Owsley','Owsley','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Pendleton','Pendleton','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Perry','Perry','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Pike','Pike','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Powell','Powell','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Pulaski','Pulaski','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Robertson','Robertson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Rockcastle','Rockcastle','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Rowan','Rowan','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Russell','Russell','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Scott','Scott','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Shelby','Shelby','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Simpson','Simpson','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Spencer','Spencer','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Taylor','Taylor','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Todd','Todd','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Trigg','Trigg','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Trimble','Trimble','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Union','Union','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Warren','Warren','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Washington','Washington','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Wayne','Wayne','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Webster','Webster','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Whitley','Whitley','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Wolfe','Wolfe','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'KY,Woodford','Woodford','KY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Acadia','Acadia Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Allen','Allen Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Ascension','Ascension Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Assumption','Assumption Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Avoyelles','Avoyelles Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Beauregard','Beauregard Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Bienville','Bienville Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Bossier','Bossier Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Caddo','Caddo Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Calcasieu','Calcasieu Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Caldwell','Caldwell Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Cameron','Cameron Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Catahoula','Catahoula Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Claiborne','Claiborne Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Concordia','Concordia Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,DeSoto','DeSoto Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,E. Baton Rouge','East Baton Rouge Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,E. Carroll','East Carroll Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,E. Feliciana','East Feliciana Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Evangeline','Evangeline Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Franklin','Franklin Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Grant','Grant Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Iberia','Iberia Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Iberville','Iberville Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Jackson','Jackson Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Jefferson Davis','Jefferson Davis Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Jefferson','Jefferson Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,La Salle','La Salle Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Lafayette','Lafayette Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Lafourche','Lafourche Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Lincoln','Lincoln Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Livingston','Livingston Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Madison','Madison Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Morehouse','Morehouse Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Natchitoches','Natchitoches Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Orleans','Orleans Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Ouachita','Ouachita Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Plaquemines','Plaquemines Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Pointe Coupee','Pointe Coupee Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Rapides','Rapides Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Red River','Red River Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Richland','Richland Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Sabine','Sabine Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Bernard','St. Bernard Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Charles','St. Charles Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Helena','St. Helena Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. James','St. James Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. John the Baptist','St. John the Baptist Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Landry','St. Landry Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Martin','St. Martin Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Mary','St. Mary Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,St. Tammany','St. Tammany Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Tangipahoa','Tangipahoa Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Tensas','Tensas Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Terrebonne','Terrebonne Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Union','Union Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Vermilion','Vermilion Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Vernon','Vernon Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Washington','Washington Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Webster','Webster Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,W. Baton Rouge','West Baton Rouge Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,W. Carroll','West Carroll Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,W. Feliciana','West Feliciana Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'LA,Winn','Winn Parish','LA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Allegany','Allegany','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Anne Arundel','Anne Arundel','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Baltimore City','Baltimore City','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Baltimore','Baltimore','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Calvert','Calvert','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Caroline','Caroline','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Carroll','Carroll','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Cecil','Cecil','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Charles','Charles','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Dorchester','Dorchester','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Frederick','Frederick','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Garrett','Garrett','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Harford','Harford','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Howard','Howard','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Kent','Kent','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Montgomery','Montgomery','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Prince George''s','Prince George''s','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Queen Anne''s','Queen Anne''s','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Somerset','Somerset','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,St. Mary''s','St. Mary''s','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Talbot','Talbot','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Washington','Washington','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Wicomico','Wicomico','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MD,Worcester','Worcester','MD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Androscoggin','Androscoggin','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Aroostook','Aroostook','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Cumberland','Cumberland','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Franklin','Franklin','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Hancock','Hancock','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Kennebec','Kennebec','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Knox','Knox','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Lincoln','Lincoln','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Oxford','Oxford','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Penobscot','Penobscot','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Piscataquis','Piscataquis','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Sagadahoc','Sagadahoc','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Somerset','Somerset','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Waldo','Waldo','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,Washington','Washington','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ME,York','York','ME','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Alcona','Alcona','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Alger','Alger','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Allegan','Allegan','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Alpena','Alpena','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Antrim','Antrim','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Arenac','Arenac','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Baraga','Baraga','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Barry','Barry','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Bay','Bay','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Benzie','Benzie','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Berrien','Berrien','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Branch','Branch','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Calhoun','Calhoun','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Cass','Cass','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Charlevoix','Charlevoix','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Cheboygan','Cheboygan','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Chippewa','Chippewa','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Clare','Clare','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Clinton','Clinton','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Crawford','Crawford','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Delta','Delta','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Dickinson','Dickinson','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Eaton','Eaton','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Emmet','Emmet','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Genesee','Genesee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Gladwin','Gladwin','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Gogebic','Gogebic','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Grand Traverse','Grand Traverse','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Gratiot','Gratiot','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Hillsdale','Hillsdale','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Houghton','Houghton','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Huron','Huron','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Ingham','Ingham','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Ionia','Ionia','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Iosco','Iosco','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Iron','Iron','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Isabella','Isabella','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Jackson','Jackson','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Kalamazoo','Kalamazoo','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Kalkaska','Kalkaska','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Kent','Kent','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Keweenaw','Keweenaw','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Lake','Lake','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Lapeer','Lapeer','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Leelanau','Leelanau','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Lenawee','Lenawee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Livingston','Livingston','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Luce','Luce','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Mackinac','Mackinac','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Macomb','Macomb','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Manistee','Manistee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Marquette','Marquette','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Mason','Mason','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Mecosta','Mecosta','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Menominee','Menominee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Midland','Midland','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Missaukee','Missaukee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Monroe','Monroe','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Montcalm','Montcalm','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Montmorency','Montmorency','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Muskegon','Muskegon','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Newaygo','Newaygo','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Oakland','Oakland','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Oceana','Oceana','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Ogemaw','Ogemaw','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Ontonagon','Ontonagon','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Osceola','Osceola','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Oscoda','Oscoda','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Otsego','Otsego','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Ottawa','Ottawa','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Presque Isle','Presque Isle','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Roscommon','Roscommon','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Saginaw','Saginaw','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Sanilac','Sanilac','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Schoolcraft','Schoolcraft','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Shiawassee','Shiawassee','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,St. Clair','St. Clair','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,St. Joseph','St. Joseph','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Tuscola','Tuscola','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Van Buren','Van Buren','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Washtenaw','Washtenaw','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Wayne','Wayne','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MI,Wexford','Wexford','MI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Aitkin','Aitkin','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Anoka','Anoka','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Becker','Becker','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Beltrami','Beltrami','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Benton','Benton','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Big Stone','Big Stone','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Blue Earth','Blue Earth','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Brown','Brown','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Carlton','Carlton','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Carver','Carver','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Cass','Cass','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Chippewa','Chippewa','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Chisago','Chisago','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Clay','Clay','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Clearwater','Clearwater','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Cook','Cook','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Cottonwood','Cottonwood','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Crow Wing','Crow Wing','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Dakota','Dakota','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Dodge','Dodge','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Douglas','Douglas','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Faribault','Faribault','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Fillmore','Fillmore','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Freeborn','Freeborn','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Goodhue','Goodhue','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Grant','Grant','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Hennepin','Hennepin','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Houston','Houston','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Hubbard','Hubbard','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Isanti','Isanti','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Itasca','Itasca','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Jackson','Jackson','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Kanabec','Kanabec','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Kandiyohi','Kandiyohi','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Kittson','Kittson','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Koochiching','Koochiching','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Lac qui Parle','Lac qui Parle','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Lake of the Woods','Lake of the Woods','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Lake','Lake','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Le Sueur','Le Sueur','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Lincoln','Lincoln','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Lyon','Lyon','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Mahnomen','Mahnomen','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Marshall','Marshall','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Martin','Martin','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,McLeod','McLeod','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Meeker','Meeker','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Mille Lacs','Mille Lacs','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Morrison','Morrison','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Mower','Mower','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Murray','Murray','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Nicollet','Nicollet','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Nobles','Nobles','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Norman','Norman','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Olmsted','Olmsted','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Otter Tail','Otter Tail','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Pennington','Pennington','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Pine','Pine','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Pipestone','Pipestone','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Polk','Polk','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Pope','Pope','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Ramsey','Ramsey','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Red Lake','Red Lake','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Redwood','Redwood','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Renville','Renville','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Rice','Rice','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Rock','Rock','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Roseau','Roseau','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Scott','Scott','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Sherburne','Sherburne','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Sibley','Sibley','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,St. Louis','St. Louis','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Stearns','Stearns','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Steele','Steele','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Stevens','Stevens','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Swift','Swift','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Todd','Todd','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Traverse','Traverse','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Wabasha','Wabasha','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Wadena','Wadena','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Waseca','Waseca','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Washington','Washington','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Watonwan','Watonwan','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Wilkin','Wilkin','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Winona','Winona','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Wright','Wright','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MN,Yellow Medicine','Yellow Medicine','MN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Adair','Adair','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Andrew','Andrew','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Atchison','Atchison','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Audrain','Audrain','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Barry','Barry','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Barton','Barton','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Bates','Bates','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Benton','Benton','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Bollinger','Bollinger','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Boone','Boone','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Buchanan','Buchanan','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Butler','Butler','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Caldwell','Caldwell','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Callaway','Callaway','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Camden','Camden','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Cape Girardeau','Cape Girardeau','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Carroll','Carroll','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Carter','Carter','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Cass','Cass','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Cedar','Cedar','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Chariton','Chariton','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Christian','Christian','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Clark','Clark','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Clay','Clay','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Clinton','Clinton','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Cole','Cole','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Cooper','Cooper','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Crawford','Crawford','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Dade','Dade','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Dallas','Dallas','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Daviess','Daviess','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Dent','Dent','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,DeKalb','DeKalb','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Douglas','Douglas','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Dunklin','Dunklin','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Franklin','Franklin','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Gasconade','Gasconade','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Gentry','Gentry','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Greene','Greene','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Grundy','Grundy','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Harrison','Harrison','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Henry','Henry','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Hickory','Hickory','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Holt','Holt','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Howard','Howard','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Howell','Howell','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Iron','Iron','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Jackson','Jackson','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Jasper','Jasper','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Jefferson','Jefferson','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Johnson','Johnson','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Knox','Knox','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Laclede','Laclede','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Lafayette','Lafayette','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Lawrence','Lawrence','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Lewis','Lewis','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Lincoln','Lincoln','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Linn','Linn','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Livingston','Livingston','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Macon','Macon','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Madison','Madison','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Maries','Maries','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Marion','Marion','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,McDonald','McDonald','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Mercer','Mercer','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Miller','Miller','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Mississippi','Mississippi','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Moniteau','Moniteau','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Monroe','Monroe','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Montgomery','Montgomery','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Morgan','Morgan','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,New Madrid','New Madrid','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Newton','Newton','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Nodaway','Nodaway','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Oregon','Oregon','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Osage','Osage','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Ozark','Ozark','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Pemiscot','Pemiscot','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Perry','Perry','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Pettis','Pettis','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Phelps','Phelps','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Pike','Pike','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Platte','Platte','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Polk','Polk','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Pulaski','Pulaski','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Putnam','Putnam','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Ralls','Ralls','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Randolph','Randolph','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Ray','Ray','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Reynolds','Reynolds','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Ripley','Ripley','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Saline','Saline','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Schuyler','Schuyler','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Scotland','Scotland','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Scott','Scott','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Shannon','Shannon','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Shelby','Shelby','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,St. Charles','St. Charles','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,St. Clair','St. Clair','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,St. Francois','St. Francois','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,St. Louis City','St. Louis City','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,St. Louis','St. Louis','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Ste. Genevieve','Ste. Genevieve','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Stoddard','Stoddard','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Stone','Stone','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Sullivan','Sullivan','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Taney','Taney','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Texas','Texas','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Vernon','Vernon','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Warren','Warren','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Washington','Washington','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Wayne','Wayne','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Webster','Webster','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Worth','Worth','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MO,Wright','Wright','MO','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Adams','Adams','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Alcorn','Alcorn','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Amite','Amite','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Attala','Attala','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Benton','Benton','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Bolivar','Bolivar','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Calhoun','Calhoun','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Carroll','Carroll','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Chickasaw','Chickasaw','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Choctaw','Choctaw','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Claiborne','Claiborne','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Clarke','Clarke','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Clay','Clay','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Coahoma','Coahoma','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Copiah','Copiah','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Covington','Covington','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,DeSoto','DeSoto','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Forrest','Forrest','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Franklin','Franklin','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,George','George','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Greene','Greene','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Grenada','Grenada','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Hancock','Hancock','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Harrison','Harrison','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Hinds','Hinds','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Holmes','Holmes','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Humphreys','Humphreys','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Issaquena','Issaquena','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Itawamba','Itawamba','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Jackson','Jackson','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Jasper','Jasper','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Jefferson','Jefferson','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Jefferson Davis','Jefferson Davis','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Jones','Jones','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Kemper','Kemper','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lafayette','Lafayette','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lamar','Lamar','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lauderdale','Lauderdale','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lawrence','Lawrence','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Leake','Leake','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lee','Lee','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Leflore','Leflore','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lincoln','Lincoln','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Lowndes','Lowndes','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Madison','Madison','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Marion','Marion','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Marshall','Marshall','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Monroe','Monroe','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Montgomery','Montgomery','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Neshoba','Neshoba','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Newton','Newton','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Noxubee','Noxubee','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Oktibbeha','Oktibbeha','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Panola','Panola','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Pearl River','Pearl River','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Perry','Perry','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Pike','Pike','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Pontotoc','Pontotoc','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Prentiss','Prentiss','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Quitman','Quitman','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Rankin','Rankin','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Scott','Scott','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Sharkey','Sharkey','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Simpson','Simpson','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Smith','Smith','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Stone','Stone','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Sunflower','Sunflower','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Tallahatchie','Tallahatchie','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Tate','Tate','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Tippah','Tippah','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Tishomingo','Tishomingo','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Tunica','Tunica','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Union','Union','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Walthall','Walthall','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Warren','Warren','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Washington','Washington','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Wayne','Wayne','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Webster','Webster','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Wilkinson','Wilkinson','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Winston','Winston','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Yalobusha','Yalobusha','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MS,Yazoo','Yazoo','MS','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Beaverhead','Beaverhead','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Big Horn','Big Horn','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Blaine','Blaine','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Broadwater','Broadwater','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Carbon','Carbon','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Carter','Carter','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Cascade','Cascade','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Chouteau','Chouteau','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Custer','Custer','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Daniels','Daniels','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Dawson','Dawson','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Deer Lodge','Deer Lodge','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Fallon','Fallon','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Fergus','Fergus','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Flathead','Flathead','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Gallatin','Gallatin','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Garfield','Garfield','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Glacier','Glacier','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Golden Valley','Golden Valley','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Granite','Granite','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Hill','Hill','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Jefferson','Jefferson','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Judith Basin','Judith Basin','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Lake','Lake','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Lewis & Clark','Lewis & Clark','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Liberty','Liberty','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Lincoln','Lincoln','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Madison','Madison','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,McCone','McCone','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Meagher','Meagher','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Mineral','Mineral','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Missoula','Missoula','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Musselshell','Musselshell','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Park','Park','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Petroleum','Petroleum','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Phillips','Phillips','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Pondera','Pondera','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Powder River','Powder River','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Powell','Powell','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Prairie','Prairie','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Ravalli','Ravalli','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Richland','Richland','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Roosevelt','Roosevelt','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Rosebud','Rosebud','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Sanders','Sanders','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Sheridan','Sheridan','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Silver Bow','Silver Bow','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Stillwater','Stillwater','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Sweet Grass','Sweet Grass','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Teton','Teton','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Toole','Toole','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Treasure','Treasure','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Valley','Valley','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Wheatland','Wheatland','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Wibaux','Wibaux','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'MT,Yellowstone','Yellowstone','MT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Alamance','Alamance','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Alexander','Alexander','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Alleghany','Alleghany','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Anson','Anson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Ashe','Ashe','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Avery','Avery','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Beaufort','Beaufort','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Bertie','Bertie','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Bladen','Bladen','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Brunswick','Brunswick','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Buncombe','Buncombe','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Burke','Burke','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Cabarrus','Cabarrus','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Caldwell','Caldwell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Camden','Camden','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Carteret','Carteret','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Caswell','Caswell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Catawba','Catawba','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Chatham','Chatham','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Cherokee','Cherokee','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Chowan','Chowan','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Clay','Clay','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Cleveland','Cleveland','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Columbus','Columbus','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Craven','Craven','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Cumberland','Cumberland','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Currituck','Currituck','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Dare','Dare','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Davidson','Davidson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Davie','Davie','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Duplin','Duplin','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Durham','Durham','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Edgecombe','Edgecombe','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Forsyth','Forsyth','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Franklin','Franklin','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Gaston','Gaston','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Gates','Gates','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Graham','Graham','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Granville','Granville','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Greene','Greene','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Guilford','Guilford','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Halifax','Halifax','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Harnett','Harnett','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Haywood','Haywood','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Henderson','Henderson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Hertford','Hertford','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Hoke','Hoke','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Hyde','Hyde','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Iredell','Iredell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Jackson','Jackson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Johnston','Johnston','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Jones','Jones','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Lee','Lee','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Lenoir','Lenoir','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Lincoln','Lincoln','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Macon','Macon','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Madison','Madison','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Martin','Martin','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,McDowell','McDowell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Mecklenburg','Mecklenburg','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Mitchell','Mitchell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Montgomery','Montgomery','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Moore','Moore','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Nash','Nash','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,New Hanover','New Hanover','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Northampton','Northampton','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Onslow','Onslow','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Orange','Orange','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Pamlico','Pamlico','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Pasquotank','Pasquotank','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Pender','Pender','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Perquimans','Perquimans','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Person','Person','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Pitt','Pitt','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Polk','Polk','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Randolph','Randolph','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Richmond','Richmond','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Robeson','Robeson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Rockingham','Rockingham','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Rowan','Rowan','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Rutherford','Rutherford','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Sampson','Sampson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Scotland','Scotland','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Stanly','Stanly','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Stokes','Stokes','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Surry','Surry','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Swain','Swain','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Transylvania','Transylvania','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Tyrrell','Tyrrell','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Union','Union','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Vance','Vance','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Wake','Wake','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Warren','Warren','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Washington','Washington','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Watauga','Watauga','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Wayne','Wayne','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Wilkes','Wilkes','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Wilson','Wilson','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Yadkin','Yadkin','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NC,Yancey','Yancey','NC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Adams','Adams','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Barnes','Barnes','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Benson','Benson','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Billings','Billings','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Bottineau','Bottineau','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Bowman','Bowman','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Burke','Burke','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Burleigh','Burleigh','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Cass','Cass','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Cavalier','Cavalier','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Dickey','Dickey','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Divide','Divide','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Dunn','Dunn','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Eddy','Eddy','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Emmons','Emmons','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Foster','Foster','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Golden Valley','Golden Valley','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Grand Forks','Grand Forks','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Grant','Grant','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Griggs','Griggs','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Hettinger','Hettinger','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Kidder','Kidder','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,LaMoure','LaMoure','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Logan','Logan','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,McHenry','McHenry','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,McIntosh','McIntosh','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,McKenzie','McKenzie','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,McLean','McLean','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Mercer','Mercer','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Morton','Morton','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Mountrail','Mountrail','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Nelson','Nelson','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Oliver','Oliver','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Pembina','Pembina','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Pierce','Pierce','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Ramsey','Ramsey','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Ransom','Ransom','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Renville','Renville','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Richland','Richland','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Rolette','Rolette','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Sargent','Sargent','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Sheridan','Sheridan','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Sioux','Sioux','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Slope','Slope','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Stark','Stark','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Steele','Steele','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Stutsman','Stutsman','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Towner','Towner','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Traill','Traill','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Walsh','Walsh','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Ward','Ward','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Wells','Wells','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'ND,Williams','Williams','ND','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Adams','Adams','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Antelope','Antelope','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Arthur','Arthur','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Banner','Banner','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Blaine','Blaine','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Boone','Boone','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Box Butte','Box Butte','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Boyd','Boyd','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Brown','Brown','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Buffalo','Buffalo','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Burt','Burt','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Butler','Butler','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Cass','Cass','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Cedar','Cedar','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Chase','Chase','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Cherry','Cherry','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Cheyenne','Cheyenne','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Clay','Clay','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Colfax','Colfax','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Cuming','Cuming','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Custer','Custer','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dakota','Dakota','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dawes','Dawes','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dawson','Dawson','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Deuel','Deuel','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dixon','Dixon','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dodge','Dodge','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Douglas','Douglas','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Dundy','Dundy','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Fillmore','Fillmore','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Franklin','Franklin','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Frontier','Frontier','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Furnas','Furnas','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Gage','Gage','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Garden','Garden','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Garfield','Garfield','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Gosper','Gosper','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Grant','Grant','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Greeley','Greeley','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Hall','Hall','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Hamilton','Hamilton','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Harlan','Harlan','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Hayes','Hayes','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Hitchcock','Hitchcock','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Holt','Holt','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Hooker','Hooker','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Howard','Howard','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Jefferson','Jefferson','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Johnson','Johnson','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Kearney','Kearney','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Keith','Keith','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Keya Paha','Keya Paha','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Kimball','Kimball','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Knox','Knox','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Lancaster','Lancaster','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Lincoln','Lincoln','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Logan','Logan','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Loup','Loup','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Madison','Madison','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,McPherson','McPherson','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Merrick','Merrick','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Morrill','Morrill','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Nance','Nance','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Nemaha','Nemaha','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Nuckolls','Nuckolls','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Otoe','Otoe','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Pawnee','Pawnee','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Perkins','Perkins','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Phelps','Phelps','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Pierce','Pierce','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Platte','Platte','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Polk','Polk','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Red Willow','Red Willow','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Richardson','Richardson','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Rock','Rock','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Saline','Saline','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Sarpy','Sarpy','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Saunders','Saunders','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Scotts Bluff','Scotts Bluff','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Seward','Seward','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Sheridan','Sheridan','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Sherman','Sherman','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Sioux','Sioux','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Stanton','Stanton','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Thayer','Thayer','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Thomas','Thomas','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Thurston','Thurston','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Valley','Valley','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Washington','Washington','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Wayne','Wayne','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Webster','Webster','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,Wheeler','Wheeler','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NE,York','York','NE','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Belknap','Belknap','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Carroll','Carroll','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Cheshire','Cheshire','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Coos','Coos','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Grafton','Grafton','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Hillsborough','Hillsborough','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Merrimack','Merrimack','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Rockingham','Rockingham','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Strafford','Strafford','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NH,Sullivan','Sullivan','NH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Cibola','Cibola','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Bernalillo','Bernalillo','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Catron','Catron','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Chaves','Chaves','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Colfax','Colfax','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Curry','Curry','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,De Baca','De Baca','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Dona Ana','Dona Ana','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Eddy','Eddy','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Grant','Grant','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Guadalupe','Guadalupe','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Harding','Harding','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Hidalgo','Hidalgo','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Lea','Lea','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Lincoln','Lincoln','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Los Alamos','Los Alamos','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Luna','Luna','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,McKinley','McKinley','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Mora','Mora','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Otero','Otero','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Quay','Quay','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Rio Arriba','Rio Arriba','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Roosevelt','Roosevelt','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,San Juan','San Juan','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,San Miguel','San Miguel','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Sandoval','Sandoval','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Santa Fe','Santa Fe','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Sierra','Sierra','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Socorro','Socorro','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Taos','Taos','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Torrance','Torrance','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Union','Union','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NM,Valencia','Valencia','NM','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Churchill','Churchill','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Clark','Clark','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Douglas','Douglas','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Elko','Elko','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Esmeralda','Esmeralda','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Eureka','Eureka','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Humboldt','Humboldt','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Lander','Lander','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Lincoln','Lincoln','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Lyon','Lyon','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Mineral','Mineral','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Nye','Nye','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Pershing','Pershing','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Storey','Storey','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,Washoe','Washoe','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'NV,White Pine','White Pine','NV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Adams','Adams','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Allen','Allen','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Ashland','Ashland','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Ashtabula','Ashtabula','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Athens','Athens','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Auglaize','Auglaize','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Belmont','Belmont','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Brown','Brown','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Butler','Butler','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Carroll','Carroll','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Champaign','Champaign','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Clark','Clark','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Clermont','Clermont','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Clinton','Clinton','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Columbiana','Columbiana','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Coshocton','Coshocton','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Crawford','Crawford','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Cuyahoga','Cuyahoga','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Darke','Darke','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Defiance','Defiance','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Delaware','Delaware','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Erie','Erie','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Fairfield','Fairfield','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Fayette','Fayette','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Franklin','Franklin','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Fulton','Fulton','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Gallia','Gallia','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Geauga','Geauga','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Greene','Greene','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Guernsey','Guernsey','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Hamilton','Hamilton','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Hancock','Hancock','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Hardin','Hardin','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Harrison','Harrison','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Henry','Henry','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Highland','Highland','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Hocking','Hocking','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Holmes','Holmes','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Huron','Huron','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Jackson','Jackson','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Jefferson','Jefferson','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Knox','Knox','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Lake','Lake','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Lawrence','Lawrence','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Licking','Licking','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Logan','Logan','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Lorain','Lorain','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Lucas','Lucas','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Madison','Madison','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Mahoning','Mahoning','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Marion','Marion','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Medina','Medina','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Meigs','Meigs','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Mercer','Mercer','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Miami','Miami','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Monroe','Monroe','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Montgomery','Montgomery','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Morgan','Morgan','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Morrow','Morrow','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Muskingum','Muskingum','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Noble','Noble','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Ottawa','Ottawa','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Paulding','Paulding','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Perry','Perry','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Pickaway','Pickaway','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Pike','Pike','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Portage','Portage','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Preble','Preble','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Putnam','Putnam','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Richland','Richland','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Ross','Ross','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Sandusky','Sandusky','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Scioto','Scioto','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Seneca','Seneca','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Shelby','Shelby','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Stark','Stark','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Summit','Summit','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Trumbull','Trumbull','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Tuscarawas','Tuscarawas','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Union','Union','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Van Wert','Van Wert','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Vinton','Vinton','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Warren','Warren','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Washington','Washington','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Wayne','Wayne','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Williams','Williams','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Wood','Wood','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OH,Wyandot','Wyandot','OH','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Adair','Adair','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Alfalfa','Alfalfa','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Atoka','Atoka','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Beaver','Beaver','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Beckham','Beckham','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Blaine','Blaine','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Bryan','Bryan','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Caddo','Caddo','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Canadian','Canadian','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Carter','Carter','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Cherokee','Cherokee','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Choctaw','Choctaw','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Cimarron','Cimarron','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Cleveland','Cleveland','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Coal','Coal','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Comanche','Comanche','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Cotton','Cotton','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Craig','Craig','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Creek','Creek','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Custer','Custer','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Delaware','Delaware','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Dewey','Dewey','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Ellis','Ellis','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Garfield','Garfield','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Garvin','Garvin','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Grady','Grady','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Grant','Grant','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Greer','Greer','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Harmon','Harmon','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Harper','Harper','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Haskell','Haskell','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Hughes','Hughes','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Jackson','Jackson','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Jefferson','Jefferson','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Johnston','Johnston','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Kay','Kay','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Kingfisher','Kingfisher','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Kiowa','Kiowa','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Latimer','Latimer','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Le Flore','Le Flore','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Lincoln','Lincoln','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Logan','Logan','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Love','Love','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Major','Major','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Marshall','Marshall','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Mayes','Mayes','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,McClain','McClain','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,McCurtain','McCurtain','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,McIntosh','McIntosh','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Murray','Murray','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Muskogee','Muskogee','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Noble','Noble','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Nowata','Nowata','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Okfuskee','Okfuskee','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Oklahoma','Oklahoma','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Okmulgee','Okmulgee','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Osage','Osage','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Ottawa','Ottawa','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Pawnee','Pawnee','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Payne','Payne','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Pittsburg','Pittsburg','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Pontotoc','Pontotoc','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Pottawatomie','Pottawatomie','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Pushmataha','Pushmataha','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Roger Mills','Roger Mills','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Rogers','Rogers','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Seminole','Seminole','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Sequoyah','Sequoyah','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Stephens','Stephens','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Texas','Texas','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Tillman','Tillman','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Tulsa','Tulsa','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Wagoner','Wagoner','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Washington','Washington','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Washita','Washita','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Woods','Woods','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OK,Woodward','Woodward','OK','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Baker','Baker','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Benton','Benton','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Clackamas','Clackamas','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Clatsop','Clatsop','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Columbia','Columbia','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Coos','Coos','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Crook','Crook','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Curry','Curry','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Deschutes','Deschutes','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Douglas','Douglas','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Gilliam','Gilliam','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Grant','Grant','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Harney','Harney','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Hood River','Hood River','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Jackson','Jackson','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Jefferson','Jefferson','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Josephine','Josephine','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Klamath','Klamath','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Lake','Lake','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Lane','Lane','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Lincoln','Lincoln','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Linn','Linn','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Malheur','Malheur','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Marion','Marion','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Morrow','Morrow','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Multnomah','Multnomah','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Polk','Polk','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Sherman','Sherman','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Tillamook','Tillamook','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Umatilla','Umatilla','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Union','Union','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Wallowa','Wallowa','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Wasco','Wasco','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Washington','Washington','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Wheeler','Wheeler','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'OR,Yamhill','Yamhill','OR','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'RI,Bristol','Bristol','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'RI,Kent','Kent','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'RI,Newport','Newport','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'RI,Providence','Providence','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'RI,Washington','Washington','RI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Abbeville','Abbeville','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Aiken','Aiken','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Allendale','Allendale','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Anderson','Anderson','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Bamberg','Bamberg','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Barnwell','Barnwell','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Beaufort','Beaufort','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Berkeley','Berkeley','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Calhoun','Calhoun','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Charleston','Charleston','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Cherokee','Cherokee','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Chester','Chester','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Chesterfield','Chesterfield','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Clarendon','Clarendon','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Colleton','Colleton','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Darlington','Darlington','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Dillon','Dillon','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Dorchester','Dorchester','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Edgefield','Edgefield','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Fairfield','Fairfield','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Florence','Florence','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Georgetown','Georgetown','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Greenville','Greenville','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Greenwood','Greenwood','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Hampton','Hampton','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Horry','Horry','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Jasper','Jasper','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Kershaw','Kershaw','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Lancaster','Lancaster','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Laurens','Laurens','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Lee','Lee','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Lexington','Lexington','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Marion','Marion','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Marlboro','Marlboro','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,McCormick','McCormick','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Newberry','Newberry','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Oconee','Oconee','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Orangeburg','Orangeburg','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Pickens','Pickens','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Richland','Richland','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Saluda','Saluda','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Spartanburg','Spartanburg','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Sumter','Sumter','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Union','Union','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,Williamsburg','Williamsburg','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SC,York','York','SC','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Aurora','Aurora','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Beadle','Beadle','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Bennett','Bennett','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Bon Homme','Bon Homme','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Brookings','Brookings','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Brown','Brown','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Brule','Brule','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Buffalo','Buffalo','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Butte','Butte','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Campbell','Campbell','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Charles Mix','Charles Mix','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Clark','Clark','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Clay','Clay','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Codington','Codington','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Corson','Corson','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Custer','Custer','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Davison','Davison','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Day','Day','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Deuel','Deuel','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Dewey','Dewey','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Douglas','Douglas','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Edmunds','Edmunds','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Fall River','Fall River','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Faulk','Faulk','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Grant','Grant','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Gregory','Gregory','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Haakon','Haakon','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hamlin','Hamlin','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hand','Hand','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hanson','Hanson','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Harding','Harding','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hughes','Hughes','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hutchinson','Hutchinson','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Hyde','Hyde','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Jackson','Jackson','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Jerauld','Jerauld','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Jones','Jones','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Kingsbury','Kingsbury','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Lake','Lake','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Lawrence','Lawrence','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Lincoln','Lincoln','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Lyman','Lyman','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Marshall','Marshall','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,McCook','McCook','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,McPherson','McPherson','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Meade','Meade','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Mellette','Mellette','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Miner','Miner','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Minnehaha','Minnehaha','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Moody','Moody','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Pennington','Pennington','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Perkins','Perkins','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Potter','Potter','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Roberts','Roberts','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Sanborn','Sanborn','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Spink','Spink','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Stanley','Stanley','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Sully','Sully','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Todd','Todd','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Tripp','Tripp','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Turner','Turner','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Union','Union','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Walworth','Walworth','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Yankton','Yankton','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Ziebach','Ziebach','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'SD,Oglala Lakota','Oglala Lakota','SD','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Anderson','Anderson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Bedford','Bedford','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Benton','Benton','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Bledsoe','Bledsoe','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Blount','Blount','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Bradley','Bradley','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Campbell','Campbell','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Cannon','Cannon','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Carroll','Carroll','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Carter','Carter','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Cheatham','Cheatham','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Chester','Chester','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Claiborne','Claiborne','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Clay','Clay','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Cocke','Cocke','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Coffee','Coffee','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Crockett','Crockett','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Cumberland','Cumberland','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Davidson','Davidson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Decatur','Decatur','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,DeKalb','DeKalb','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Dickson','Dickson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Dyer','Dyer','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Fayette','Fayette','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Fentress','Fentress','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Franklin','Franklin','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Gibson','Gibson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Giles','Giles','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Grainger','Grainger','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Greene','Greene','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Grundy','Grundy','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hamblen','Hamblen','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hamilton','Hamilton','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hancock','Hancock','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hardeman','Hardeman','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hardin','Hardin','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hawkins','Hawkins','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Haywood','Haywood','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Henderson','Henderson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Henry','Henry','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Hickman','Hickman','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Houston','Houston','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Humphreys','Humphreys','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Jackson','Jackson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Jefferson','Jefferson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Johnson','Johnson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Knox','Knox','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Lake','Lake','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Lauderdale','Lauderdale','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Lawrence','Lawrence','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Lewis','Lewis','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Lincoln','Lincoln','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Loudon','Loudon','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Macon','Macon','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Madison','Madison','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Marion','Marion','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Marshall','Marshall','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Maury','Maury','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,McMinn','McMinn','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,McNairy','McNairy','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Meigs','Meigs','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Monroe','Monroe','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Montgomery','Montgomery','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Moore','Moore','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Morgan','Morgan','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Obion','Obion','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Overton','Overton','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Perry','Perry','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Pickett','Pickett','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Polk','Polk','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Putnam','Putnam','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Rhea','Rhea','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Roane','Roane','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Robertson','Robertson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Rutherford','Rutherford','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Scott','Scott','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Sequatchie','Sequatchie','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Sevier','Sevier','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Shelby','Shelby','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Smith','Smith','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Stewart','Stewart','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Sullivan','Sullivan','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Sumner','Sumner','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Tipton','Tipton','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Trousdale','Trousdale','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Unicoi','Unicoi','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Union','Union','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Van Buren','Van Buren','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Warren','Warren','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Washington','Washington','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Wayne','Wayne','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Weakley','Weakley','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,White','White','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Williamson','Williamson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'TN,Wilson','Wilson','TN','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Beaver','Beaver','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Box Elder','Box Elder','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Cache','Cache','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Carbon','Carbon','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Daggett','Daggett','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Davis','Davis','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Duchesne','Duchesne','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Emery','Emery','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Garfield','Garfield','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Grand','Grand','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Iron','Iron','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Juab','Juab','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Kane','Kane','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Millard','Millard','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Morgan','Morgan','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Piute','Piute','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Rich','Rich','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Salt Lake','Salt Lake','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,San Juan','San Juan','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Sanpete','Sanpete','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Sevier','Sevier','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Summit','Summit','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Tooele','Tooele','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Uintah','Uintah','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Utah','Utah','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Wasatch','Wasatch','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Washington','Washington','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Wayne','Wayne','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'UT,Weber','Weber','UT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Accomack','Accomack','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Albemarle','Albemarle','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Alleghany','Alleghany','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Amelia','Amelia','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Amherst','Amherst','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Appomattox','Appomattox','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Arlington','Arlington','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Augusta','Augusta','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Bath','Bath','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Bedford','Bedford','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Bland','Bland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Botetourt','Botetourt','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Brunswick','Brunswick','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Buchanan','Buchanan','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Buckingham','Buckingham','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Campbell','Campbell','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Caroline','Caroline','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Carroll','Carroll','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Charles City','Charles City','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Charlotte','Charlotte','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Chesterfield','Chesterfield','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Clarke','Clarke','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Craig','Craig','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Culpeper','Culpeper','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Cumberland','Cumberland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Dickenson','Dickenson','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Dinwiddie','Dinwiddie','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Essex','Essex','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Fairfax','Fairfax','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Fauquier','Fauquier','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Floyd','Floyd','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Fluvanna','Fluvanna','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Franklin','Franklin','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Frederick','Frederick','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Giles','Giles','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Gloucester','Gloucester','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Goochland','Goochland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Grayson','Grayson','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Greene','Greene','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Greensville','Greensville','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Halifax','Halifax','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Hanover','Hanover','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Henrico','Henrico','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Henry','Henry','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Highland','Highland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Isle of Wight','Isle of Wight','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,James City','James City','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,King and Queen','King and Queen','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,King George','King George','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,King William','King William','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Lancaster','Lancaster','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Lee','Lee','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Loudoun','Loudoun','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Louisa','Louisa','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Lunenburg','Lunenburg','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Madison','Madison','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Mathews','Mathews','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Mecklenburg','Mecklenburg','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Middlesex','Middlesex','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Montgomery','Montgomery','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Nelson','Nelson','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,New Kent','New Kent','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Northampton','Northampton','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Northumberland','Northumberland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Nottoway','Nottoway','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Orange','Orange','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Page','Page','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Patrick','Patrick','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Pittsylvania','Pittsylvania','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Powhatan','Powhatan','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Prince Edward','Prince Edward','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Prince George','Prince George','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Prince William','Prince William','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Pulaski','Pulaski','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Rappahannock','Rappahannock','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Richmond','Richmond','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Roanoke','Roanoke','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Rockbridge','Rockbridge','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Rockingham','Rockingham','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Russell','Russell','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Scott','Scott','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Shenandoah','Shenandoah','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Smyth','Smyth','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Southampton','Southampton','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Spotsylvania','Spotsylvania','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Stafford','Stafford','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Surry','Surry','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Sussex','Sussex','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Tazewell','Tazewell','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Warren','Warren','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Washington','Washington','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Westmoreland','Westmoreland','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Wise','Wise','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,Wythe','Wythe','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VA,York','York','VA','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Addison','Addison','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Bennington','Bennington','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Caledonia','Caledonia','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Chittenden','Chittenden','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Essex','Essex','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Franklin','Franklin','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Grand Isle','Grand Isle','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Lamoille','Lamoille','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Orange','Orange','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Orleans','Orleans','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Rutland','Rutland','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Washington','Washington','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Windham','Windham','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'VT,Windsor','Windsor','VT','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Adams','Adams','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Ashland','Ashland','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Barron','Barron','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Bayfield','Bayfield','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Brown','Brown','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Buffalo','Buffalo','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Burnett','Burnett','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Calumet','Calumet','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Chippewa','Chippewa','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Clark','Clark','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Columbia','Columbia','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Crawford','Crawford','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Dane','Dane','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Dodge','Dodge','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Door','Door','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Douglas','Douglas','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Dunn','Dunn','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Eau Claire','Eau Claire','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Florence','Florence','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Fond du Lac','Fond du Lac','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Forest','Forest','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Grant','Grant','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Green','Green','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Green Lake','Green Lake','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Iowa','Iowa','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Iron','Iron','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Jackson','Jackson','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Jefferson','Jefferson','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Juneau','Juneau','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Kenosha','Kenosha','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Kewaunee','Kewaunee','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,La Crosse','La Crosse','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Lafayette','Lafayette','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Langlade','Langlade','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Lincoln','Lincoln','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Manitowoc','Manitowoc','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Marathon','Marathon','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Marinette','Marinette','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Marquette','Marquette','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Menominee','Menominee','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Milwaukee','Milwaukee','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Monroe','Monroe','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Oconto','Oconto','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Oneida','Oneida','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Outagamie','Outagamie','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Ozaukee','Ozaukee','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Pepin','Pepin','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Pierce','Pierce','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Polk','Polk','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Portage','Portage','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Price','Price','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Racine','Racine','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Richland','Richland','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Rock','Rock','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Rusk','Rusk','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Sauk','Sauk','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Sawyer','Sawyer','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Shawano','Shawano','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Sheboygan','Sheboygan','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,St. Croix','St. Croix','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Taylor','Taylor','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Trempealeau','Trempealeau','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Vernon','Vernon','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Vilas','Vilas','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Walworth','Walworth','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Washburn','Washburn','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Washington','Washington','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Waukesha','Waukesha','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Waupaca','Waupaca','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Waushara','Waushara','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Winnebago','Winnebago','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WI,Wood','Wood','WI','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Barbour','Barbour','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Berkeley','Berkeley','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Boone','Boone','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Braxton','Braxton','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Brooke','Brooke','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Cabell','Cabell','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Calhoun','Calhoun','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Clay','Clay','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Doddridge','Doddridge','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Fayette','Fayette','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Gilmer','Gilmer','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Grant','Grant','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Greenbrier','Greenbrier','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Hampshire','Hampshire','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Hancock','Hancock','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Hardy','Hardy','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Harrison','Harrison','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Jackson','Jackson','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Jefferson','Jefferson','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Kanawha','Kanawha','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Lewis','Lewis','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Lincoln','Lincoln','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Logan','Logan','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Marion','Marion','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Marshall','Marshall','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Mason','Mason','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,McDowell','McDowell','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Mercer','Mercer','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Mineral','Mineral','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Mingo','Mingo','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Monongalia','Monongalia','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Monroe','Monroe','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Morgan','Morgan','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Nicholas','Nicholas','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Ohio','Ohio','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Pendleton','Pendleton','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Pleasants','Pleasants','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Pocahontas','Pocahontas','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Preston','Preston','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Putnam','Putnam','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Raleigh','Raleigh','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Randolph','Randolph','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Ritchie','Ritchie','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Roane','Roane','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Summers','Summers','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Taylor','Taylor','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Tucker','Tucker','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Tyler','Tyler','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Upshur','Upshur','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Wayne','Wayne','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Webster','Webster','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Wetzel','Wetzel','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Wirt','Wirt','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Wood','Wood','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WV,Wyoming','Wyoming','WV','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Albany','Albany','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Big Horn','Big Horn','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Campbell','Campbell','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Carbon','Carbon','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Converse','Converse','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Crook','Crook','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Fremont','Fremont','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Goshen','Goshen','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Hot Springs','Hot Springs','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Johnson','Johnson','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Laramie','Laramie','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Lincoln','Lincoln','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Natrona','Natrona','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Niobrara','Niobrara','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Park','Park','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Platte','Platte','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Sheridan','Sheridan','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Sublette','Sublette','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Sweetwater','Sweetwater','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Teton','Teton','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Uinta','Uinta','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Washakie','Washakie','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (291,'WY,Weston','Weston','WY','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01079','Futami','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0104','Hakodate (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0103','Otaru (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0102','Asahikawa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0101','Sapporo (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010106','Sapporo, Minami Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01001','Akan','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01002','Ashoro','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01003','Atsukeshi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01004','Atsuta (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01005','Abashiri','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01006','Abuta(Shiribeshi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01007','Abuta(Iburi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01008','Ishikari','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01064','Horoizumi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01072','Yubari','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01065','Horobetsu (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01066','Mashike','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01067','Matsumae','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01068','Mitsuishi (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01069','Menashi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010103','Sapporo, Higashi Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01071','Yamakoshi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010104','Sapporo, Shiroishi Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01073','Yufutsu(Iburi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01074','Yufutsu(Kamikawa)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01075','Yoichi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01076','Rishiri','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01077','Rumoi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0107','Obihiro (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01070','Mombetsu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0130','Noboribetsu (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0105','Muroran (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0124','Chitose (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0125','Takikawa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0126','Sunagawa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0127','Utashinai (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0122','Mikasa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0129','Furano (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0121','Nayoro (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0131','Eniwa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0132','Kameda (city, deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0133','Date (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0134','Kitahiroshima (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0135','Ishikari (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0136','Hokuto (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0128','Fukagawa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0114','Wakkanai (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01078','Rebun','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0108','Kitami (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0109','Yubari (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0110','Iwamizawa (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0111','Abashiri (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0123','Nemuro (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0113','Tomakomai (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0106','Kushiro (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0115','Bibai (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0116','Ashibetsu (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0117','Ebetsu (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0118','Akabira (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0119','Mombetsu (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0120','Shibetsu (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0112','Rumoi (city)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01029','Sapporo (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01063','Furubira','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01021','Kamiiso','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01022','Kamikawa(Tokachi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01023','Kamikawa(Kamikawa)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01024','Kameda','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01025','Kayabe','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01026','Kawakami','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01019','Kato','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01028','Kudo','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01018','Kasai','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01030','Samani','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01031','Saru','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01032','Shizunai (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01033','Shibetsu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01034','Shimamaki','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01080','Hidaka','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01035','Shakotan','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01027','Kushiro','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010101','Sapporo, Chuo Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010107','Sapporo, Nishi Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010108','Sapporo, Atsubetsu Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010109','Sapporo, Teine Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010105','Sapporo, Toyohira Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010110','Sapporo, Kiyota Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01081','Uryu(Kamikawa)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01009','Isoya','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01020','Kabato','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'010102','Sapporo, Kita Ku','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01036','Shari','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01011','Usu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01012','Utasutsu (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01013','Urakawa','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01014','Uryu(Sorachi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01015','Esashi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01016','Okushiri','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01017','Oshoro (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01010','Iwanai','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01056','Hanasaki (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01052','Niikappu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01047','Tokachi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01062','Furuu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01061','Futoro (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01060','Hiroo','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01059','Hiyama','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01045','Teshio(Rumoi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01057','Hamamasu (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01044','Chitose (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01055','Notsuke','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01054','Nemuro (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01053','Nishi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01049','Tomamae','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01050','Nakagawa(Kamikawa)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01051','Nakagawa(Tokachi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01058','Bikuni (deleted)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01037','Shiraoi','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01043','Sorachi(Kamikawa)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01042','Sorachi(Sorachi)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01041','Soya','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01040','Setana','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01039','Suttsu','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01038','Shiranuka','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01048','Tokoro','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'01046','Teshio(Soya)','#01','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0210','Hirakawa (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0209','Tsugaru (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0208','Mutsu (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0207','Misawa (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0206','Towada (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0205','Goshogawara (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0204','Kuroishi (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0202','Hirosaki (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0201','Aomori (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0203','Hachinohe (city)','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02008','Minamitsugaru','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02001','Kamikita','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02002','Kitatsugaru','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02003','Sannohe','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02004','Shimokita','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02005','Nakatsugaru','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02006','Nishitsugaru','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'02007','Higashitsugaru','#02','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0304','Ichinoseki (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0313','Ninohe (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0312','Esashi (city, deleted)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0311','Rikuzentakata (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0310','Tono (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0309','Kuji (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0308','Kitakami (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0307','Hanamaki (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0303','Miyako (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0315','Oshu (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03009','Nishiiwai','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0314','Hachimantai (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0305','Ofunato (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0306','Mizusawa (city, deleted)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03007','Shimohei','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0302','Kamaishi (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03010','Ninohe','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03012','Higashiiwai (deleted)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03011','Hienuki (deleted)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03008','Shiwa','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03006','Kesen','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03005','Kunohe','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03004','Kamihei','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03003','Esashi (deleted)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03002','Iwate','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03001','Isawa','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0301','Morioka (city)','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'03013','Waga','#03','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0406','Oga (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0414','Nikaho (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0415','Senboku (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0413','Kitaakita (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0411','Katagami (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0410','Yurihonjo (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04001','Ogachi','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04009','Yuri (deleted)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04008','Yamamoto','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04007','Minamiakita','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04006','Hiraka (deleted)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04005','Semboku','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04004','Kitaakita','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0408','Omagari (city, deleted)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04002','Kaduno','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0409','Kazuno (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0401','Akita (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0402','Noshiro (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0403','Odate (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0404','Yokote (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0405','Honjo (city, deleted)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0407','Yuzawa (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'04003','Kawabe (deleted)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0412','Daisen (city)','#04','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0506','Sagae (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0501','Yamagata (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0513','Nan''yo (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0502','Yonezawa (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0503','Tsuruoka (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0505','Shinjo (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05011','Mogami','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05010','Minamimurayama (deleted)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05009','Minamiokitama (deleted)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05008','Higashimurayama','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05007','Higashitagawa','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0508','Murayama (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0511','Higashine (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0504','Sakata (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05006','Higashiokitama','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0509','Nagai (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0507','Kaminoyama (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0512','Obanazawa (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05001','Akumi','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05002','Kitamurayama','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05003','Nishiokitama','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05004','Nishitagawa (deleted)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'05005','Nishimurayama','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0510','Tendo (city)','#05','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0602','Ishinomaki (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0609','Tagajo (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0612','Tome (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0611','Iwanuma (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0610','Izumi (city, deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0608','Kakuda (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0607','Natori (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0606','Shiroishi (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0605','Kesennuma (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0603','Shiogama (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0601','Sendai (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06013','Miyagi','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0604','Furukawa (city, deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06007','Shida (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0616','Tomiya (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'060101','Sendai, Aoba Ku','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'060102','Sendai, Miyagino Ku','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'060103','Sendai, Wakabayashi Ku','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'060104','Sendai, Taihaku Ku','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'060105','Sendai, Izumi Ku','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06001','Igu','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06002','Oshika','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06003','Katta','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06004','Kami','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06015','Monou (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06006','Kurokawa','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0613','Kuruhara (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06008','Shibata','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06009','Tamadukuri (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06010','Toda','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06011','Tome (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06012','Natori (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06014','Motoyoshi','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06016','Watari','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0615','Osaki (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0614','Higashimatsushima (city)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'06005','Kurihara (deleted)','#06','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0716','Wakamatsu (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0711','Soma (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0719','Date (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0718','Minamisoma (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0717','Tamura (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0715','Iwaki (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0703','Koriyama (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0714','Nihonmatsu (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0712','Uchigo (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0704','Taira (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0710','Iwaki (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0709','Joban (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0708','Kitakata (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0707','Sukagawa (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0706','Haramachi (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0705','Shirakawa (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0713','Nakoso (city, deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07012','Tamura','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07001','Asaka (deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07002','Adachi','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07003','Ishikawa','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07005','Iwase','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07007','Kawanuma','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07008','Kitaaidu (deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07009','Shinobu (deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07017','Yama','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07011','Date','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0702','Aizuwakamatsu (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07013','Nishishirakawa','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07014','Higashishirakawa','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07015','Futaba','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07006','Onuma','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07016','Minamiaidu','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0720','Motomiya (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0701','Fukushima (city)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07010','Soma','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'07004','Ishiki (deleted)','#07','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0802','Nagaoka (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0810','Tokamachi (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0809','Kamo (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0808','Ojiya (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0807','Niitsu (city), deleted','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0806','Shibata (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0805','Kashiwazaki (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080108','Niigata, Nishikan Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0803','Takada (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0813','Tsubame (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0801','Niigata (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080102','Niigata, Higashi Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080104','Niigata, Konan Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080105','Niigata, Akiha Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080106','Niigata, Minami Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080107','Niigata, Nishi Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0804','Sanjo (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0820','Shirone (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0828','Tainai (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0827','Myoko (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0826','Minamiuonuma (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0825','Uonuma (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0824','Sado (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0823','Agano (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0811','Mitsuke (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0821','Toyosaka (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0812','Murakami (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0819','Ryotsu (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0818','Gosen (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0817','Arai (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0816','Itoigawa (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0815','Tochio (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0814','Naoetsu (city, deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080103','Niigata, Chuo Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0822','Joetsu (city)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08007','Santo','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08015','Minamiuonuma','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08014','Higashikubiki (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08012','Nishikubiki (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'080101','Niigata, Kita Ku','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08011','Nishikambara','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08010','Nakakubiki (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08016','Minamikambara','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08008','Nakauonuma','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08013','Higashikambara','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08006','Sado (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08005','Koshi (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08004','Kitakambara','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08003','Kitauonuma (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08002','Kariwa','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08001','Iwafune','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'08009','Nakakambara (deleted)','#08','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0909','Ina (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09014','Hanishina','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09013','(Reserved)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09006','Kitasaku','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09011','Suwa','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09009','Shimotakai','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09008','Shimoina','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0901','Nagano (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0902','Matsumoto (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0903','Ueda (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0904','Okaya (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0905','Iida (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0906','Suwa (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09015','Higashichikuma','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0908','Komoro (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09012','Chiisagata','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0910','Komagane (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0911','Nakano (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0912','Omachi (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0913','Iiyama (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0914','Chino (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0915','Shiojiri (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0916','Shinonoi (city, deleted)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0917','Koshoku (city, deleted)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0918','Saku (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0919','Chikuma (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0920','Tomi (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0921','Azumino (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'0907','Suzaka (city)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09005','Kitaazumi','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09016','Minamiazumi (deleted)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09001','Kamiina','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09002','Kamitakai','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09003','Kamiminochi','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09010','Shimominochi','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09004','Kiso','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09007','Sarashina (deleted)','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'09017','Minamisaku','#09','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1014','Higashimurayama (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1015','Kokubunji (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1019','Fussa (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1013','Hino (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1012','Kodaira (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1011','Koganei (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10003','Minamitama (deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1010','Machida (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1009','Chofu (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1017','Hoya (city, deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1016','Kunitachi (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1025','Tama (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10002','Nishitama','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10004','Oshima','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10005','Miyake','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1030','Nishitokyo (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1029','Akiruno (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1028','Hamura (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10007','Ogawasara','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1026','Inagi (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1018','Tanashi (city, deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1024','Musashimurayama (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1023','Higashikurume (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1022','Kiyose (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1021','Higashiyamato (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1020','Komae (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10006','Hachijo','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1027','Akigawa (city, deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100114','Tokyo, Nakano','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100103','Tokyo, Minato','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100104','Tokyo, Shinjuku','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100106','Tokyo, Taito','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100107','Tokyo, Sumida','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100108','Tokyo, Koto','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100109','Tokyo, Shinagawa','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100110','Tokyo, Meguro','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100111','Tokyo, Ota','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100102','Tokyo, Chuo','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100113','Tokyo, Shibuya','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100105','Tokyo, Bunkyo','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100115','Tokyo, Suginami','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100116','Tokyo, Toshima','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100117','Tokyo, Kita','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100118','Tokyo, Arakawa','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100119','Tokyo, Itabashi','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100120','Tokyo, Nerima','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100121','Tokyo, Adachi','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100122','Tokyo, Katsushika','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100123','Tokyo, Edogawa','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100112','Tokyo, Setagaya','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1008','Akishima (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1001','Tokyo 23-wards (city, deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1002','Hachioji (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1003','Tachikawa (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1004','Musashino (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1005','Mitaka (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1006','Ome (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'10001','Kitatama (deleted)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1007','Fuchu (city)','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'100101','Tokyo, Chiyoda','#10','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110301','Kawasaki, Kawasaki Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110304','Kawasaki, Takatsu Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110306','Kawasaki, Miyamae Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110302','Kawasaki, Saiwai Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110118','Yokohama, Tsuzuki Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110117','Yokohama, Aoba Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110116','Yokohama, Izumi Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110115','Yokohama, Sakae Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110114','Yokohama, Seya Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110113','Yokohama, Midori Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110112','Yokohama, Asahi Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'111001','Sagamihara, Midori Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110303','Kawasaki, Nakahara Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'111002','Sagamihara, Chuou Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1105','Kamakura (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1104','Hiratsuka (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1103','Kawasaki (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1102','Yokosuka (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1101','Yokohama (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110307','Kawasaki, Asao Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1107','Odawara (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1109','Zushi (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1119','Ayase (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1110','Sagamihara (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1118','Minamiashigara (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110305','Kawasaki, Tama Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1111','Miura (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1112','Hadano (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1113','Atsugi (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1114','Yamato (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1115','Isehara (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1116','Ebina (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1117','Zama (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1106','Fujisawa (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11003','Ashigarashimo','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110111','Yokohama, Konan Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1108','Chigasaki (city)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11007','Miura','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11006','Naka','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11004','Koza','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11002','Ahigarakami','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11001','Aiko','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110101','Yokohama, Tsurumi Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110102','Yokohama, Kanagawa Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110107','Yokohama, Isogo Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110104','Yokohama, Naka Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110105','Yokohama, Minami Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110109','Yokohama, Kohoku Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'11005','Tsukui (deleted)','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110106','Yokohama, Hodogaya Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110103','Yokohama, Nishi Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110110','Yokohama, Totsuka Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'111003','Sagamihara, Minami Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'110108','Yokohama, Kanazawa Ku','#11','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1221','Yachiyo (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1219','Ichihara (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1218','Katsuura (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1223','Kamogawa (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1216','Narashino (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1229','Sodegaura (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1215','Asahi (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1214','Yokaichiba (city, deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1213','Togane (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1212','Sakura (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1211','Narita (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1210','Mobara (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1217','Kashiwa (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1230','Yachimata (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1237','Sanmu (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1236','Katori (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1235','Sosa (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1234','Minamiboso (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1233','Tomisato (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1227','Urayasu (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1231','Inzai (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1224','Kimitsu (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1220','Nagareyama (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1209','Sawara (city, deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1238','Isumi (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1228','Yotsukaido (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1226','Futtu (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1225','Kamagaya (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1232','Shiroi (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120103','Chiba, Inage Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1222','Abiko (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1208','Noda (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120102','Chiba, Hanamigawa Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120104','Chiba, Wakaba Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120105','Chiba, Midori Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120106','Chiba, Mihama Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12001','Awa','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12002','Isumi','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12003','Ichihara (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12004','Inba','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12005','Kaijo (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12006','Katori','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12007','Kimitsu (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1202','Choshi (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'120101','Chiba, Chuo Ku','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1206','Kisarazu (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1207','Matsudo (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12008','Sambu','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1203','Ichikawa (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1205','Tateyama (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1201','Chiba (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1239','Oamishirasato (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12012','Higashikatsushika (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12011','Chosei','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12010','Chiba (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'12009','Sosa (deleted)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1204','Funabashi (city)','#12','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1333','Kitamoto (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1332','Kuki (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1331','Okegawa (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1330','Niiza (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1329','Wako (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1328','Shiki (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1334','Yashio (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1326','Hatogaya (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1340','Satte (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1325','Iruma (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1327','Asaka (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1335','Kamifukuoka (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1336','Fujimi (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1337','Misato (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1339','Sakado (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1341','Tsurugashima (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1342','Hidaka (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1343','Yoshikawa (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1344','Saitama (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1324','Toda (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1306','Gyoda (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1338','Hasuda (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1311','Honjo (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1318','Fukaya (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1345','Fujimino (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1346','Shiraoka (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1301','Urawa (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1302','Kawagoe (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1303','Kumagaya (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1304','Kawaguchi (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1305','Omiya (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1307','Chichibu (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1308','Tokorozawa (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1310','Kazo (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1323','Warabi (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1312','Higashimatsuyama (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1313','Iwatsuki (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1314','Kasukabe (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1315','Sayama (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1317','Konosu (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1319','Ageo (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1320','Yono (city, deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1321','Soka (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1322','Koshigaya (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1309','Hanno (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13009','Minamisaitama','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134403','Saitama, Omiya Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134404','Saitama, Minuma Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134402','Saitama, Kita Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134405','Saitama, Chuo Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134406','Saitama, Sakura Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134407','Saitama, Urawa Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134410','Saitama, Iwatsuki Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134408','Saitama, Minami Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1316','Hanyu (city)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13008','Hiki','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13007','Chichibu','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13006','Kodama','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13005','Kitasaitama (deleted)','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13004','Kitakatsushika','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13003','Kitaadachi','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13002','Osato','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'13001','Iruma','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134401','Saitama, Nishi Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'134409','Saitama, Midori Ku','#13','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14006','Taga (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14013','Makabe (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14014','Yuki','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14012','Higashiibaraki','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14011','Nishiibaraki (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14010','Niihari (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14009','Namegata (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14007','Tsukuba (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1435','Joso (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14005','Sashima','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14004','Kuji','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14003','Kitasoma','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14002','Kashima (deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14001','Inashiki','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'14008','Naka','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1419','Ushiku (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1437','Omitama (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1412','Hitachiota (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1413','Katsuta (city, deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1414','Takahagi (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1415','Kitaibaraki (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1416','Kasama (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1410','Shimotsuma (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1418','Iwai (city, deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1409','Nakaminato (city, deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1420','Tsukuba (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1421','Hitachinaka (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1422','Kashima (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1423','Itako (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1424','Moriya (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1425','Hitachiomiya (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1426','Naka (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1417','Toride (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1401','Mito (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1427','Chikusei (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1434','Hokota (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1433','Namegata (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1432','Kamisu (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1431','Sakuragawa (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1430','Kasumigaura (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1411','Mitsukaido (city, deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1428','Bandou (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1436','Tsukubamirai (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1402','Hitachi (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1403','Tsuchiura (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1404','Koga (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1405','Ishioka (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1406','Shimodate (city, deleted)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1407','Yuki (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1408','Ryugasaki (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1429','Inashiki (city)','#14','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15001','Ashikaga (deleted)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15002','Aso (deleted)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15003','Kamitsuga (deleted)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15004','Kawachi','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15005','Shioya','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15008','Haga','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15007','Nasu','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'15006','Shimotsuga','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1516','Shimotsuke (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1503','Tochigi (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1504','Sano (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1505','Kanuma (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1506','Nikko (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1507','Imaichi (city, deleted)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1508','Oyama (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1509','Mooka (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1510','Otawara (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1511','Yaita (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1512','Kuroiso (city, deleted)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1513','Nasushiobara (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1514','Sakura (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1501','Utsunomiya (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1515','Nasukarasuyama (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1502','Ashikaga (city)','#15','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16003','Ora','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1602','Takasaki (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1603','Kiryu (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1604','Isesaki (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1605','Ota (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1606','Numata (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1607','Tatebayashi (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1608','Shibukawa (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1609','Fujioka (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1610','Tomioka (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1611','Annaka (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1612','Midori (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1601','Maebashi (city)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16010','Tone','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16001','Agatsuma (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16011','Nitta (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16009','Tano','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16008','Seta (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16007','Sawa','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16006','Gumma (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16005','Kitagumma','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16004','Kanra','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16002','Usui (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'16012','Yamada (deleted)','#16','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17003','Nakakoma','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1707','Nirasaki (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1701','Kofu (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1702','Fujiyoshida (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1703','Enzan (city, deleted)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1704','Tsuru (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1705','Yamanashi (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1706','Otsuki (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17008','Minamitsuru','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17007','Minamikoma','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17006','Higashiyamanashi (deleted)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1709','Hokuto (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17004','Nishiyatsushiro','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1710','Kai (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17002','Kitatsuru','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17001','Kitakoma (deleted)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'17005','Higashiyatsushiro (deleted)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1711','Fuehuki (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1713','Koshu (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1708','Minami-Alps (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1712','Uenohara (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1714','Chuo (city)','#17','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1808','Ito (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18004','Iwata (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18003','Ihara (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18002','Inasa (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18001','Abe (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1809','Shimada (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18007','Shida (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1807','Fujinomiya (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1806','Mishima (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1805','Atami (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1804','Shimizu (city, deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1803','Numadu (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1802','Hamamatsu (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1810','Yoshiwara (city, deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18012','Hamana (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180209','Hamamatsu, Hamana Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18013','Fuji (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180208','Hamamatsu, Chuo Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1819','Hamakita (city, deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1818','Tenryu (city, deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1817','Fukuroi (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1816','Gotemba (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18005','Ogasa (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1815','Fujieda (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18006','Kamo','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18011','Haibara','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18010','Tagata','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1814','Kakegawa (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1813','Fuji (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1812','Yaidu (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18009','Sunto','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'18008','Shuchi','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1820','Shimoda (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180201','Hamamatsu, Naka Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1801','Shizuoka (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1811','Iwata (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1827','Makinohara (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1826','Izunokuni (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1825','Kikugawa (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1824','Omaezaki (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1823','Izu (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1821','Susono (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180202','Hamamatsu, Higashi Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180203','Hamamatsu, Nishi Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180204','Hamamatsu, Minami Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180205','Hamamatsu, Kita Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180206','Hamamatsu, Hamakita Ku (deleted)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180101','Shizuoka, Aoi Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180103','Shizuoka, Shimizu Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180102','Shizuoka, Suruga Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1822','Kosai (city)','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'180207','Hamamatsu, Tenryu Ku','#18','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19014','Mugi (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19018','Yoshiki (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1920','Gero (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19017','Yoro','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19016','Yamagata (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1919','Gujo (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19001','Ampachi','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19002','Inaba (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19003','Ibi','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19004','Ena (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19012','Fuwa','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19005','Ono','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19011','Hashima','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1918','Motosu (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19010','Toki (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1921','Kaizu (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19009','Gujo (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19008','Kamo','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19007','Kani','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19006','Kaizu (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19013','Mashita (deleted)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1912','Toki (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1909','Hashima (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1908','Mizunami (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1907','Mino (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1906','Nakatsugawa (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1904','Tajimi (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1917','Hida (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1905','Seki (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1901','Gifu (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1915','Yamagata (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1911','Minokamo (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1916','Mizuho (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1913','Kakamigahara (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1903','Takayama (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1914','Kani (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'19015','Motosu','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1902','Ogaki (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'1910','Ena (city)','#19','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20016','Hoi (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20017','Minamishitara (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20018','Yana (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2038','Miyoshi (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2039','Ama (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2017','Tokoname (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2019','Konan (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2029','Owariasahi (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2020','Bisai (city, deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2021','Komaki (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200116','Nagoya, Tenpaku Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200115','Nagoya, Meito Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200114','Nagoya, Midori Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2018','Moriyama (city, deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2030','Iwakura (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20015','Hekikai (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2025','Obu (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2026','Chita (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2027','Takahama (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2028','Chiryu (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2024','Tokai (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2031','Toyoake (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2022','Inazawa (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200113','Nagoya, Moriyama Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2032','Nissin (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2033','Tahara (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2034','Aisai (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2035','Kiyosu (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2036','Kitanagoya (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2037','Yatomi (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200112','Nagoya, Minami Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2023','Shinshiro (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2001','Nagoya (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20014','Higashikamo (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2014','Nishio (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2002','Toyohashi (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2012','Toyota (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2011','Kariya (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2010','Hekinan (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2009','Tsushima (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2008','Toyokawa (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2007','Kasugai (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2006','Handa (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2005','Seto (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2016','Inuyama (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2003','Okazaki (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2015','Gamagori (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200101','Nagoya, Chikusa Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200102','Nagoya, Higashi Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200103','Nagoya, Kita Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200104','Nagoya, Nishi Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200105','Nagoya, Nakamura Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200106','Nagoya, Naka Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200107','Nagoya, Showa Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200108','Nagoya, Mizuho Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200109','Nagoya, Atsuta Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200110','Nagoya, Nakagawa Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'200111','Nagoya, Minato Ku','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2004','Ichinomiya (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20001','Aichi','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20006','Nakashima (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20005','Chita','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20007','Nishikasugai','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20004','Kitashitara','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20008','Nishikamo (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20009','Niwa','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20010','Nukata','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2013','Anjo (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20002','Atsumi (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2040','Nagakute (city)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20013','Higashikasugai (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20012','Hazu (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20011','Haguri (deleted)','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'20003','Ama','#20','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21014','Mie','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2116','Shima (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2117','Iga (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21001','Age (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21015','Minamimuro','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21002','Ano (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21004','Iinan (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21003','Ayama (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21013','Naga (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21012','Taki','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2113','Hisai (city, deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21011','Suzuka (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21016','Watarai','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21010','Shima (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2109','Owase (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2108','Nabari (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2107','Suzuka (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2106','Ueno (city, deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2105','Kuwana (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2104','Matsusaka (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2103','Ise (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2102','Yokkaichi (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2101','Tsu (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2115','Inabe (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2112','Kumano (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2114','Ujiyamada (city, deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21009','Kuwana','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21008','Kitamuro','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21007','Kawage (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21006','Inabe','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'21005','Ichishi (deleted)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2110','Kameyama (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2111','Toba (city)','#21','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22009','Takeno (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22008','Soraku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22010','Tsuduki','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22007','Kumano (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22012','Funai','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22013','Minamikuwada (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22011','Naka (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2201','Kyoto (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2202','Fukuchiyama (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2203','Maiduru (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2204','Ayabe (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2205','Uji (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22014','Yoza','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2207','Kameoka (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2206','Miyazu (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2209','Nagaokakyo (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2210','Muko (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2211','Yawata (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2212','Kyotanabe (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2213','Kyotango (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2214','Nantan (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2215','Kizugawa (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220108','Kyoto, Ukyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22006','Kuze','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220106','Kyoto, Shimogyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22004','Kasa (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22003','Otokuni','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22002','Ikaruga (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22001','Amada (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220109','Kyoto, Fushimi Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220110','Kyoto, Yamashina Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220111','Kyoto, Nishikyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220101','Kyoto, Kita Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220102','Kyoto, Kamigyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220103','Kyoto, Sakyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2208','Joyo (city)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220105','Kyoto, Higashiyama Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220107','Kyoto, Minami Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'22005','Kitakuwada (deleted)','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'220104','Kyoto, Nakagyo Ku','#22','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2301','Otsu (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2305','Yokaichi (city, deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2306','Kusatsu (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2307','Moriyama (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2308','Ritto (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2309','Koka (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2310','Yasu (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2311','Konan (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2312','Takashima (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2313','Higashioumi (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2314','Maibara (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2304','Omihachiman (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23004','Gamou','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23007','Koka (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2303','Nagahama (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2302','Hikone (city)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23005','Kanzaki (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23003','Echi','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23002','Inukamo','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23001','Ika (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23009','Shiga (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23010','Takashima (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23011','Higashiazai (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23012','Yasu (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23008','Sakata (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'23006','Kurita (deleted)','#23','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2401','Nara (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2409','Ikoma (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24002','Uda','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2412','Uda (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2411','Katsuragi (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2410','Kashiba (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2408','Gose (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2407','Gojo (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2406','Sakurai (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2405','Kashihara (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2404','Tenri (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2402','Yamatotakada (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2403','Yamatokoriyama (city)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24004','Kitakatsuragi','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24001','Ikoma','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24010','Yoshino','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24009','Yamabe','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24008','Minamikatsuragi (deleted)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24003','Uchi (deleted)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24005','Shiki','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24007','Takaichi','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'24006','Soekami (deleted)','#24','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250122','Osaka, Nishinari Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25007','Minamikawachi','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250117','Osaka, Asahi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250118','Osaka, Joto Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250119','Osaka, Abeno Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25006','Mishima','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250121','Osaka, Higashisumiyoshi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25001','Kitakawachi (deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250101','Osaka, Kita Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250207','Sakai, Mihara Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250206','Sakai, Kita Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250205','Sakai, Minami Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250204','Sakai, Nishi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250203','Sakai, Higashi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250202','Sakai, Naka Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250120','Osaka, Sumiyoshi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250106','Osaka, Nishi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250115','Osaka, Higashinari Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250114','Osaka, Higashiyodogawa Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250113','Osaka, Nishiyodogawa Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250112','Osaka, Oyodo (deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250111','Osaka, Naniwa Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250110','Osaka, Minami Ku (deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250109','Osaka, Tennoji Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25003','Senboku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250107','Osaka, Minato Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25005','Nakakawachi (deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250105','Osaka, Higashi Ku (deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250104','Osaka, Konohana Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250103','Osaka, Fukushima Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250102','Osaka, Miyakojima Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25002','Sennan','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250116','Osaka, Ikuno Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'25004','Toyono','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250108','Osaka, Taisho Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2506','Ikeda (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2516','Tondabayashi (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2515','Izumisano (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2514','Yao (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2513','Ibaraki (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2512','Hirakata (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2511','Moriguchi (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2510','Kaiduka (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2509','Takatsuki (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250201','Sakai, Sakai Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2507','Suita (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2519','Hiraoka (city, deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2505','Fuse (city, deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2504','Toyonaka (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2503','Kishiwada (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2502','Sakai (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2501','Osaka (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250125','Osaka, Suminoe Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250126','Osaka, Hirano Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250127','Osaka, Chuo Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2508','Izumiotsu (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2528','Settsu (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250124','Osaka, Tsurumi Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2536','Hannan (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2535','Osakasayama (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2534','Katano (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2533','Shijonawate (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2532','Sennan (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2531','Higashiosaka (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2517','Neyagawa (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2529','Fujiidera (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2518','Kawachinagano (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2527','Kadoma (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2526','Habikino (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2525','Kashiwara (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2524','Mino (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2523','Izumi (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2522','Daito (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2521','Matsubara (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2520','Kawachi (city, deleted)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'250123','Osaka, Yodogawa Ku','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2530','Takaishi (city)','#25','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2605','Gobo (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2602','Shingu (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26007','Hidaka','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26006','Higashimuro','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26005','Nishimuro','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2607','Arida (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2601','Wakayama (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26001','Arida','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2603','Kainan (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2604','Tanabe (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2606','Hashimoto (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2608','Kinokawa (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2609','Iwade (city)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26003','Kaiso','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26002','Ito','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'26004','Naga (deleted)','#26','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2724','Tanba (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2729','Kato (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2727','Awaji (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2726','Asago (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2725','Minamiawaji (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2730','Tatsuno (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270108','Kobe, Chuo Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270109','Kobe, Nishi Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270110','Kobe, Fukiai Ku (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270111','Kobe, Ikuta Ku (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2701','Kobe (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2702','Himeji (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2703','Amagasaki (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2704','Akashi (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2705','Nishinomiya (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2706','Sumoto (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2707','Ashiya (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2708','Itami (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2712','Tatsuno (city, deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2710','Toyooka (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2723','Yabu (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2711','Kakogawa (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27001','Akou','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2713','Ako (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2714','Nishiwaki (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2715','Takaraduka (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2716','Miki (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2717','Takasago (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2718','Kawanishi (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2719','Ono (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2720','Sanda (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2721','Kasai (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2722','Sasayama (city, deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2709','Aioi (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27018','Tsuna (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27010','Kawabe','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27011','Kanzaki','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27012','Kinosaki (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27013','Sayo','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2728','Shiso (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27021','Mino (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27002','Asago (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27009','Kato (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27017','Taki (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27014','Shikama (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27019','Hikami (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27008','Kasai (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2731','Tanbasasayama (city)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27020','Mikata','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27024','Yabu (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27023','Muko (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27022','Mihara (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27016','Taka','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27005','Ibo','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270105','Kobe, Suma Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270107','Kobe, Kita Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270104','Kobe, Nagata Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270103','Kobe, Hyogo Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270102','Kobe, Nada Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27003','Arima (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270101','Kobe, Higashinada Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27004','Izushi (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27007','Kako','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27006','Innami (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'27015','Shiso (deleted)','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'270106','Kobe, Tarumi Ku','#27','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28007','Himi (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28006','Nei (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28005','Nishitonami (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28004','Nakaniikawa','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28003','Shimoniikawa','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28001','Imizu (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2801','Toyama (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28002','Kaminiikawa (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'28008','Higashitonami (deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2806','Namerikawa (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2805','Himi (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2802','Takaoka (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2803','Shinminato (city, deleted)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2804','Uodu (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2808','Tonami (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2809','Oyabe (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2810','Nanto (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2811','Imizu (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2807','Kurobe (city)','#28','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29004','Ono (deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2910','Sakai (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2901','Fukui (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2902','Tsuruga (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2903','Takefu (city, deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2904','Obama (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2905','Ono (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2906','Katsuyama (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2907','Sabae (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29002','Imadate','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2909','Echizen (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29001','Asuwa (deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29012','Mikatakaminaka','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29011','Yoshida','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29010','Mikata','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29008','Nanjo','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29006','Sakai (deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29005','Onyu (deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29007','Tsuruga (deleted)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29003','Oi','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'2908','Awara (city)','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'29009','Nyuu','#29','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3004','Wajima (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30001','Ishikawa (deleted)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30002','Enuma (deleted)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30004','Kahoku','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30005','Suzu (deleted)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30008','Fugeshi (deleted)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30009','Housu','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3001','Kanazawa (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30006','Nomi','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3003','Komatsu (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30007','Hakui','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3005','Suzu (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3006','Kaga (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3007','Hakui (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3008','Matsuto (city, deleted)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3009','Kahoku (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3010','Hakusan (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3011','Nomi (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3002','Nanao (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3012','Nonoichi (city)','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'30003','Kashima','#30','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3103','Tsuyama (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3102','Kurashiki (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3101','Okayama (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31006','Oda','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31007','Katsuta','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31001','Aida','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31009','Kibi (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3106','Tamashima (city, deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31010','Kume','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31011','Kojima (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31013','Jodo (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31014','Jobo (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31015','Tsukubo','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31008','Kawakami (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3105','Kojima (city, deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31004','Atetsu (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31005','Oku (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3118','Asakuchi (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3117','Mimasaka (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3116','Maniwa (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3115','Akaiwa (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3114','Setouchi (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3113','Bizen (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3112','Niimi (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3111','Takahashi (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3110','Soja (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3109','Ibara (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3108','saidaiji (city, deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3104','Tamano (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'310104','Okayama, Minami Ku','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31012','Shitsuki (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'310101','Okayama, Kita Ku','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31016','Tomada','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31003','Asakuchi','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31002','Akaiwa (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'310102','Okayama, Naka Ku','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'310103','Okayama, Higashi Ku','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3107','Kasaoka (city)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31017','Maniwa','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31018','Mitsu (deleted)','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31019','Wake','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'31020','Kaga','#31','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3203','Izumo (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32014','Nogi (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32013','Nima','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32010','Chibu (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32001','Ano (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32015','Hikawa (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32011','Naka (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32012','Nita','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3201','Matsue (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3202','Hamada (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32002','Ama (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3204','Masuda (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3205','Oda (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3206','Yasugi (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3208','Hirata (city, deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32009','Suki (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32017','Yatsuka (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32003','Iishi','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32004','Ochi','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32005','Ohara (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32006','Oki','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32007','Ochi (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32008','Kanoashi','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3209','Unnan (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'32016','Mino (deleted)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3207','Gotsu (city)','#32','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3314','Shinnan''yo (city, deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33010','Mine (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33001','Asa (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3301','Yamaguchi (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33002','Abu','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3302','Shimonoseki (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33003','Oshima','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33009','Toyoura (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33004','Otsu (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33005','Kuga','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33006','Kumage','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33007','Saba (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33011','Yoshiki (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3315','Shunan (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3313','Mine (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3312','Yanai (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3311','Nagato (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3310','Hikari (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3309','Onoda (city, deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3308','Iwakuni (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3307','Kudamatsu (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3306','Hofu (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3305','Tokuyama (city, deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3304','Hagi (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3303','Ube (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'33008','Tsuno (deleted)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3316','San''yoonoda (city)','#33','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3403','Yonago (city)','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34001','Iwami','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34002','Ketaka (deleted)','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34003','Saihaku','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34004','Tohaku','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3404','Sakaiminato (city)','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3402','Kurayoshi (city)','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3401','Tottori (city)','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34006','Yazu','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'34005','Hino','#34','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350103','Hiroshima, Minami Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350108','Hiroshima, Saeki Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35001','Aki (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350107','Hiroshima, Aki Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350106','Hiroshima, Asakita Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350104','Hiroshima, Nishi Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350102','Hiroshima, Higashi Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350101','Hiroshima, Naka Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'350105','Hiroshima, Asaminami Ku','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35011','Numakuma (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35003','Ashina (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3516','Etajima (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3515','Akitakata (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3514','Hatsukaichi (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3513','Higashihiroshima (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35016','Yamagata (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35015','Mitsugi (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35014','Futami (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35012','Hiba (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35010','Toyota','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35009','Takata (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35008','Sera','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35007','Jinseki','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35006','Saeki (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3507','Matsunaga (city, deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3504','Mihara (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3505','Onomichi (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3502','Kure (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3501','Hiroshima (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35013','Fukayasu (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35005','Konu (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3503','Takehara (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3506','Innoshima (city, deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3508','Fukuyama (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3509','Fuchu (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3510','Miyoshi (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3511','Syoubara (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3512','Otake (city)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35002','Asa (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'35004','Kamo (deleted)','#35','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36003','Kagawa','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3606','Sanuki (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3604','Zentsuji (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3607','Higashikagawa (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3602','Marugame (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3605','Kan''onji (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36007','Mitoyo (deleted)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36006','Nakatado','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36004','Kita','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36002','Okawa (deleted)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36001','Ayauta','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3608','Mitoyo (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3603','Sakaide (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'36005','Syozu','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3601','Takamatsu (city)','#36','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3704','Anan (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37010','Miyoshi','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3701','Tokushima (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3703','Komatsushima (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3705','Yoshinogawa (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3706','Awa (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3707','Mima (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3708','Miyoshi (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37001','Awa (deleted)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37008','Myodo','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37007','Myozai','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37006','Naka','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37005','Katsuura','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37004','Kaifu','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37003','Oe (deleted)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37002','Itano','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'37009','Mima','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3702','Naruto (city)','#37','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38011','Higashiuwa (deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38010','Nishiuwa','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38009','Nii','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38008','Shuso (deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38007','Kitauwa','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38006','Kita','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38005','Kamiukena','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38004','Onsen (deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38002','Uma (deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38012','Minamiuwa','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38003','Ochi','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3810','Iyo (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3807','Ozu (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3801','Matsuyama (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3811','Hojo (city, deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3812','Toyo (city, deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3813','Shikokuchuo (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3814','Seiyo (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3815','Toon (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3803','Uwajima (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3804','Yawatahama (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3802','Imabari (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3806','Saijo (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3808','Iyomishima (city, deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3809','Kawanoe (city, deleted)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'38001','Iyo','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3805','Niihama (city)','#38','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3909','Nankoku (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3907','Sukumo (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3908','Tosashimizu (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39006','Nagaoka','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3910','Shimanto (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3912','Kami (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39001','Agawa','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3911','Konan (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39004','Takaoka','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39002','Aki','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39005','Tosa','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39007','Hata','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3906','Nakamura (city, deleted)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3905','Susaki (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3904','Tosa (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3903','Aki (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3902','Muroto (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'3901','Kochi (city)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'39003','Kami (deleted)','#39','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4021','Kitakyushu (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4016','Chikugo (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4017','Okawa (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4018','Yukuhashi (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4019','Buzen (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4020','Nakama (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4022','Ogoori (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4023','Kasuga (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4024','Chikushino (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4025','Onojo (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40001','Asakura','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4027','Dazaifu (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4008','Omuta (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4026','Munakata (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4015','Yame (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4014','Yamada (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4013','Amagi (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4012','Yanagawa (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4011','Tagawa (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4009','Noogata (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4028','Maebaru (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4007','Kurume (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4006','Wakamatsu (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4005','Tobata (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4004','Yahata (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4003','Moji (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4002','Kokura (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4001','Fukuoka (city, deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4010','Iizuka (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40012','Mii','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40005','Kasuya','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40007','Kurate','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40009','Tagawa','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40010','Chikushi (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4037','Nakagawa (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4032','Miyawaka (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4033','Kama (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4034','Asakura (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40004','Onga','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40011','Chikujo','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40006','Kaho','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40013','Miike (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40014','Mizuma','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40015','Miyako','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40016','Munakata (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40017','Yamato (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40018','Yame','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40003','Ukiha (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400101','Fukuoka, Higashi Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4035','Miyama (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402103','Kitakyushu, Tobata Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400102','Fukuoka, Hakata Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400103','Fukuoka, Chuo Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400104','Fukuoka, Minami Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400105','Fukuoka, Nishi Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400106','Fukuoka, Jonan Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'400107','Fukuoka, Sawara Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40008','Sawara (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402102','Kitakyushu, Wakamatsui Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'40002','Itoshima (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402104','Kitakyushu, Kokurakitai Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4031','Ukiha (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402106','Kitakyushu, Yahatahigashii Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402107','Kitakyushu, Yahatanishii Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402108','Kitakyushu, Yahata Ku (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402109','Kitakyushu, Kokura Ku (deleted)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4029','Koga (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4030','Fukutsu (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402105','Kitakyushu, Kokuraminamii Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4036','Itoshima (city)','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'402101','Kitakyushu, Mojii Ku','#40','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41006','Higashimatsuura','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41007','Fujitsu','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41004','Saga (deleted)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41003','Kishima','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41002','Kanzaki','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41008','Miyaki','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41001','Ogi (deleted)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4108','Ogi (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4109','Ureshino (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4107','Kashima (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4106','Takeo (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4105','Imari (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4104','Taku (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4103','Tosu (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4102','Karatsu (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'41005','Nishimatsuura','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4101','Saga (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4110','Kanzaki (city)','#41','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4202','Sasebo (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42008','Minamitakaki (deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42007','Higashisonogi','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42006','Nishisonogi','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42005','Shimoagata (deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42004','Kitamatsuura','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42003','Kitatakaki (deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42002','Kamiagata (deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42001','Iki (deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4206','Fukue (city, deleted)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4205','Omura (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4203','Shimabara (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4201','Nagasaki (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'42009','Minamimatsuura','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4214','Minamishimabara (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4208','Matsuura (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4213','Unzen (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4212','Saikai (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4211','Goto (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4209','Tsushima (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4207','Hirado (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4204','Isahaya (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4210','Iki (city)','#42','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4307','Hondo (city, deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'430104','Minami','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'430103','Nishi','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'430102','Higashi','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'430101','Chuo','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4301','Kumamoto (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4302','Yatsushiro (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4303','Hitoyoshi (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4304','Arao (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'430105','Kita','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4306','Tamana (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4311','Uto (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4308','Yamaga (city, deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4309','Ushibuka (city, deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4310','Kikuchi (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4312','Kamiamakusa (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4314','Aso (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4315','Amakusa (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4316','Koshi (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4305','Minamata (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43008','Kuma','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43012','Yatsushiro','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43011','Hotaku (deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43010','Tamana','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43001','Ashikita','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43009','Shimomashiki','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43007','Kikuchi','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43006','Kamoto (deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43005','Kamimashiki','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43004','Uto (deleted)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43003','Amakusa','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'43002','Aso','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4313','Uki (city)','#43','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4401','Oita (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44004','Kitaamabe (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44001','Usa (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4408','Taketa (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4415','Kunisaki (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4414','Yufu (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4413','Bungoono (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4412','Usa (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4411','Kitsuki (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44002','Oita (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4409','Tsurusaki (city, deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44003','Ono (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4406','Usuki (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44010','Higashikunisaki','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4404','Hita (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4403','Nakatsu (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4402','Beppu (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4405','Saiki (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4410','Bungotakada (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44005','kusu','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44009','Hayami','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44008','Nishikunisaki (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44006','Shimoge (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44012','Minamiamabe (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44011','Hita (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4407','Tsukumi (city)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'44007','Naoiri (deleted)','#44','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45007','Minaminaka (deleted)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45006','Higashimorokata','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45005','Higashiusuki','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45004','Nishimorokata','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45003','Nishiusuki','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45002','Koyu','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4509','Ebino (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4503','Nobeoka (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45008','Miyazaki (deleted)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4507','Kushima (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4506','Hyuga (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4505','Kobayashi (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4504','Nichinan (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4501','Miyazaki (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4502','Miyakonojo (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'45001','Kitamorokata','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4508','Saito (city)','#45','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4614','Nishinoomote (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4604','Makurazaki (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4605','Kushikino (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4606','Akune (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4607','Izumi (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4608','Naze (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46001','Aira (deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4610','Ibusuki (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4603','Kanoya (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4613','Taniyama (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4609','Oguchi (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4615','Tarumizu (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4616','Satsumasendai (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4617','Hioki (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4618','Soo (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4619','Kirishima (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4620','Ichikikushikino (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4621','Minamisatsuma (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4622','Shibushi (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4623','Amami (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4612','Kokubu (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46005','Oshima','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46002','Isa (deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4611','Kaseda (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46004','Ibusuki (deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4602','Sendai (city, deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46006','Kagoshima','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46007','Kawanabe (deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46008','Kimotsuki','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46009','Kumage','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4626','Aira (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4625','Isa (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4601','Kagoshima (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46010','Satsuma','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46003','Izumi','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46011','Soo','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'46012','Hioki (deleted)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4624','Minamikyushu (city)','#46','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4708','Nago (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4709','Urasoe (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4710','Itoman (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4707','Gushikawa (city, deleted)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4712','Tomigusuku (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4703','Hirara (city, deleted)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4713','Uruma (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4714','Miyakojima (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4715','Nanjo (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4711','Okinawa (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4706','Ginowan (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4704','Ishigaki (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4702','Ishikawa (city, deleted)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4701','Naha (city)','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'47002','Shimajiri','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'47003','Nakagami','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'47004','Miyako','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'47001','Kunigami','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'47005','Yaeyama','#47','');\nINSERT INTO adif_enum_secondary_subdivision VALUES (339,'4705','Koza (city, deleted)','#47','');\n"
  },
  {
    "path": "res/sql/migration_037.sql",
    "content": "UPDATE modes SET submodes = '[\"FSQCALL\", \"FST4\", \"FST4W\", \"FT2\", \"FT4\", \"JS8\", \"JTMS\", \"MFSK4\", \"MFSK8\", \"MFSK11\", \"MFSK16\", \"MFSK22\", \"MFSK31\", \"MFSK32\", \"MFSK64\", \"MFSK64L\", \"MFSK128\", \"MFSK128L\", \"Q65\"]' WHERE name = 'MFSK';\nUPDATE modes SET submodes = '[\"VARA HF\", \"VARA SATELLITE\", \"VARA FM 1200\", \"VARA FM 9600\", \"FREEDATA\"]' WHERE name = 'DYNAMIC';\n\nINSERT INTO modes (name, submodes, rprt, dxcc, enabled) VALUES ('OFDM', '[\"RIBBIT_PIX\", \"RIBBIT_SMS\"]', NULL, 'DIGITAL', 0);\n"
  },
  {
    "path": "res/sql/migration_038.sql",
    "content": "ALTER TABLE rig_profiles ADD get_split INTEGER DEFAULT 0;\n\nCREATE TABLE IF NOT EXISTS cabrillo_templates (\n    id              INTEGER PRIMARY KEY AUTOINCREMENT,\n    name            TEXT    NOT NULL UNIQUE,\n    contest_name_for_header TEXT,\n    default_category_mode   TEXT\n);\n\nCREATE TABLE IF NOT EXISTS cabrillo_template_columns (\n    id          INTEGER PRIMARY KEY AUTOINCREMENT,\n    template_id INTEGER NOT NULL REFERENCES cabrillo_templates(id) ON DELETE CASCADE,\n    position    INTEGER NOT NULL,\n    db_field    TEXT    NOT NULL,\n    width       INTEGER NOT NULL,\n    formatter   TEXT,\n    label       TEXT\n);\n\nDELETE FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('ARRL DX CW', 'ARRL-DX-CW', 'CW');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'stx_string', 6, '', 'Exch Sent' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'srx_string', 6, '', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'ARRL DX CW';\n\nDELETE FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('ARRL DX SSB', 'ARRL-DX-SSB', 'SSB');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'stx_string', 6, '', 'Exch Sent' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'srx_string', 6, '', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'ARRL DX SSB';\n\nDELETE FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('ARRL VHF JAN', 'ARRL-VHF-JAN', 'MIXED');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 17, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'my_gridsquare', 6, 'upper', 'Grid Sent' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'callsign', 17, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'gridsquare', 6, 'upper', 'Grid Rcvd' FROM cabrillo_templates WHERE name = 'ARRL VHF JAN';\n\nDELETE FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('CQ VHF', 'CQ-VHF', 'MIXED');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 17, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'my_gridsquare', 6, 'upper', 'Grid Sent' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'callsign', 17, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'CQ VHF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'gridsquare', 6, 'upper', 'Grid Rcvd' FROM cabrillo_templates WHERE name = 'CQ VHF';\n\nDELETE FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('CQ WPX CW', 'CQ-WPX-CW', 'CW');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'stx', 6, 'padded_nr', 'Exch Sent' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'srx', 6, 'padded_nr', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'CQ WPX CW';\n\nDELETE FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('CQ WPX SSB', 'CQ-WPX-SSB', 'SSB');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'stx', 6, 'padded_nr', 'Exch Sent' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'srx', 6, 'padded_nr', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'CQ WPX SSB';\n\nDELETE FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('CQ WW CW', 'CQ-WW-CW', 'CW');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'my_cq_zone', 6, '', 'Exch Sent' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'cqz', 6, '', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW CW';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'CQ WW CW';\n\nDELETE FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('CQ WW SSB', 'CQ-WW-SSB', 'SSB');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'my_cq_zone', 6, '', 'Exch Sent' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'cqz', 6, '', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 11, '', 1, 'transmitter_id', 't' FROM cabrillo_templates WHERE name = 'CQ WW SSB';\n\nDELETE FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_templates (name, contest_name_for_header, default_category_mode) VALUES ('IARU HF', 'IARU-HF', 'MIXED');\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 1, 'freq', 5, 'freq_khz', 'Freq' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 2, 'mode', 2, 'mode_cabrillo', 'Mo' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 3, 'start_time', 10, 'date_yyyy_mm_dd', 'Date' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 4, 'start_time', 4, 'time_hhmm', 'Time' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 5, 'station_callsign', 13, 'upper', 'My Call' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 6, 'rst_sent', 3, '', 'Rst Sent' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 7, 'stx_string', 6, '', 'Exch Sent' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 8, 'callsign', 13, 'upper', 'Call Rcvd' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 9, 'rst_rcvd', 3, '', 'Rst Rcvd' FROM cabrillo_templates WHERE name = 'IARU HF';\nINSERT INTO cabrillo_template_columns (template_id, position, db_field, width, formatter, label) SELECT id, 10, 'srx_string', 6, '', 'Exch Rcvd' FROM cabrillo_templates WHERE name = 'IARU HF';\n"
  },
  {
    "path": "res/stylesheet.css",
    "content": "QLineEdit#callsignEdit {\n        text-transform: uppercase;\n}\n\nQLineEdit#stationCallsignEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#stationOperatorCallsignEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#stationDarcDokEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#stationDarcDokEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#myDOKEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#dokEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#myCallsignEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#myOperatorCallsignEdit{\n        text-transform: uppercase;\n}\n\nQLineEdit#gridEdit {\n        text-transform: uppercase;\n}\n\nQLabel#chatUnread {\n         padding: 2px;\n         min-height: 10px;\n         border-radius: 10px;\n         background: orange;\n}\n\nQLabel#chatValuableMsg {\n         padding: 2px;\n         min-height: 10px;\n         border-radius: 10px;\n         background: red;\n}\n\nQLabel.kindex-0, QLabel.kindex-1, QLabel.kindex-2, QLabel.kindex-3 {\n        color: #0000ff;\n}\n\nQMenu::item:disabled{background-color:transparent; color:palette(disabled);}\n"
  },
  {
    "path": "rig/Rig.cpp",
    "content": "#include \"Rig.h\"\n#include \"RigctldManager.h\"\n#include \"core/debug.h\"\n#include \"rig/drivers/HamlibRigDrv.h\"\n#ifdef Q_OS_WIN\n#include \"rig/drivers/OmnirigRigDrv.h\"\n#include \"rig/drivers/Omnirigv2RigDrv.h\"\n#endif\n#include \"rig/drivers/TCIRigDrv.h\"\n#include \"rig/drivers/FlrigRigDrv.h\"\n\nMODULE_IDENTIFICATION(\"qlog.rig.rig\");\n\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Rig mutex\"; \\\n                        QMutexLocker locker(&rigLock); \\\n                        qCDebug(runtime) << \"Using Rig\"\n\nint Rig::DEFAULT_MODEL = HamlibRigDrv::DUMMY_MODEL;\n\nRig::Rig(QObject *parent)\n    : QObject{parent},\n    rigDriver(nullptr),\n    connected(false),\n    heartBeatTimer(new QTimer(this))\n{\n    FCT_IDENTIFICATION;\n\n    drvMapping[HAMLIB_DRIVER] = DrvParams(HAMLIB_DRIVER,\n                                          \"Hamlib\",\n                                          &HamlibRigDrv::getModelList,\n                                          &HamlibRigDrv::getCaps,\n                                          &HamlibRigDrv::getPTTTypeList);\n#ifdef Q_OS_WIN\n    drvMapping[OMNIRIG_DRIVER] = DrvParams(OMNIRIG_DRIVER,\n                                           \"Omnirig v1\",\n                                           &OmnirigRigDrv::getModelList,\n                                           &OmnirigRigDrv::getCaps,\n                                           nullptr);\n\n    drvMapping[OMNIRIGV2_DRIVER] = DrvParams(OMNIRIGV2_DRIVER,\n                                             \"Omnirig v2\",\n                                             &OmnirigV2RigDrv::getModelList,\n                                             &OmnirigV2RigDrv::getCaps,\n                                             nullptr);\n#endif\n    drvMapping[TCI_DRIVER] = DrvParams(TCI_DRIVER,\n                                       \"TCI\",\n                                       &TCIRigDrv::getModelList,\n                                       &TCIRigDrv::getCaps,\n                                       nullptr);\n\n    drvMapping[FLRIG_DRIVER] = DrvParams(FLRIG_DRIVER,\n                                         \"FLRig\",\n                                         &FlrigRigDrv::getModelList,\n                                         &FlrigRigDrv::getCaps,\n                                         nullptr);\n\n    connect(heartBeatTimer, &QTimer::timeout, this, &Rig::sendHeartBeat);\n}\n\nqint32 Rig::getNormalBandwidth(const QString &mode, const QString &)\n{\n    FCT_IDENTIFICATION;\n\n    if ( mode == \"CW\" )\n        return 1000;\n\n    if ( mode == \"SSB\"\n         || mode == \"PSK\"\n         || mode == \"MFSK\"\n         || mode == \"FT8\"\n         || mode == \"SSTV\" )\n        return 2500;\n\n    if ( mode == \"AM\" )\n        return 6000;\n\n    if ( mode == \"RTTY\" )\n        return 2400;\n\n    if ( mode == \"FM\" )\n        return 12500;\n\n    return 6000;\n}\n\nconst QList<QPair<int, QString>> Rig::getModelList(const DriverID &id) const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    if ( drvMapping.contains(id)\n         && drvMapping.value(id).getModeslListFunction != nullptr )\n    {\n        ret = (drvMapping.value(id).getModeslListFunction)();\n    }\n    return ret;\n}\n\nconst QList<QPair<QString, QString> > Rig::getPTTTypeList(const DriverID &id) const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<QString, QString>> ret;\n\n    if ( drvMapping.contains(id)\n         && drvMapping.value(id).getPTTTypeListFunction != nullptr )\n    {\n        ret = (drvMapping.value(id).getPTTTypeListFunction)();\n    }\n    return ret;\n}\n\nconst QList<QPair<int, QString>> Rig::getDriverList() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    const QList<int> &keys = drvMapping.keys();\n\n    for ( const int &key : keys )\n    {\n        ret << QPair<int, QString>(key, drvMapping[key].driverName);\n    }\n\n    return ret;\n}\n\nconst RigCaps Rig::getRigCaps(const DriverID &id, int model) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( drvMapping.contains(id)\n         && drvMapping.value(id).getCapsFunction != nullptr)\n    {\n        return (drvMapping.value(id).getCapsFunction)(model);\n    }\n    return RigCaps();\n\n}\n\nvoid Rig::stopTimer()\n{\n    FCT_IDENTIFICATION;\n    bool check = QMetaObject::invokeMethod(Rig::instance(), &Rig::stopTimerImplt,\n                                           Qt::QueuedConnection);\n    Q_ASSERT( check );\n}\n\nvoid Rig::stopTimerImplt()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    heartBeatTimer->stop();\n\n    if ( rigDriver )\n        rigDriver->stopTimers();\n}\n\nvoid Rig::start()\n{\n    FCT_IDENTIFICATION;\n}\n\n\nvoid Rig::open()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &Rig::openImpl, Qt::QueuedConnection);\n}\n\nvoid Rig::openImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    __openRig();\n}\n\nvoid Rig::__openRig()\n{\n    FCT_IDENTIFICATION;\n\n    // if rig is active then close it\n    __closeRig();\n\n    RigProfile newRigProfile = RigProfilesManager::instance()->getCurProfile1();\n\n    if ( newRigProfile == RigProfile() )\n    {\n        emit rigErrorPresent(tr(\"No Rig Profile selected\"),\n                             QString());\n        return;\n    }\n\n    qCDebug(runtime) << \"Opening profile name: \" << newRigProfile.profileName;\n\n    // If rig sharing is enabled, start rigctld and modify profile to connect via network\n    if ( newRigProfile.shareRigctld\n         && newRigProfile.driver == HAMLIB_DRIVER\n         && newRigProfile.getPortType() == RigProfile::SERIAL_ATTACHED)\n    {\n        qCDebug(runtime) << \"Starting rigctld for rig sharing\";\n\n        if ( !rigctldManager )\n        {\n            rigctldManager = new RigctldManager(this);\n            connect(rigctldManager, &RigctldManager::errorOccurred, this, [this](const QString &error)\n            {\n                emit rigErrorPresent(tr(\"Rigctld Error\"), error);\n            });\n        }\n\n        if ( !rigctldManager->start(newRigProfile) )\n            return;\n\n        // Modify profile to connect via network to rigctld\n        newRigProfile.hostname = rigctldManager->getConnectHost();\n        newRigProfile.netport = rigctldManager->getConnectPort();\n        newRigProfile.portPath.clear();  // Clear serial port to force network connection\n        newRigProfile.model = HamlibRigDrv::RIGCTLD_MODEL;\n\n        qCDebug(runtime) << \"Connecting to rigctld at\" << newRigProfile.hostname << \":\" << newRigProfile.netport;\n    }\n\n    rigDriver = getDriver(newRigProfile);\n\n    if ( !rigDriver )\n    {\n        // initialization failed\n        emit rigErrorPresent(tr(\"Initialization Error\"),\n                             tr(\"Internal Error\"));\n        return;\n    }\n\n    connect( rigDriver, &GenericRigDrv::frequencyChanged, this, [this](double a, double b, double c)\n    {\n        rigStatus.freq = a;\n        emit frequencyChanged(VFO1, a, b, c);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::txFrequencyChanged, this, [this](double txFreq)\n    {\n        rigStatus.txFreq = txFreq;\n        emit frequencyChanged(VFO2, txFreq, txFreq, txFreq);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::splitChanged, this, [this](bool enabled)\n    {\n        rigStatus.splitEnabled = enabled;\n        emit splitChanged(VFO1, enabled);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::pttChanged, this, [this](bool a)\n    {\n        rigStatus.ptt = (a) ? 1 : 0;\n        emit pttChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::modeChanged, this, [this](const QString &a,\n                                                                  const QString &b,\n                                                                  const QString &c,\n                                                                  qint32 d)\n    {\n        rigStatus.rawmode = a;\n        rigStatus.mode = b;\n        rigStatus.submode = c;\n        rigStatus.bandwidth = d;\n        emit modeChanged(VFO1, a, b, c, d);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::vfoChanged, this, [this](const QString &a)\n    {\n        rigStatus.vfo = a;\n        emit vfoChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::powerChanged, this, [this](double a)\n    {\n        rigStatus.power = a;\n        emit powerChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::ritChanged, this, [this](double a)\n    {\n        rigStatus.rit = a;\n        emit ritChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::xitChanged, this, [this](double a)\n    {\n        rigStatus.xit = a;\n        emit xitChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::keySpeedChanged, this, [this](unsigned int a)\n    {\n        rigStatus.keySpeed = a;\n        emit keySpeedChanged(VFO1, a);\n        emitRigStatusChanged();\n    });\n\n    connect( rigDriver, &GenericRigDrv::errorOccurred, this, [this](const QString &a,\n                                                                const QString &b)\n    {\n        close();\n        emit rigErrorPresent(a, b);\n    });\n\n    connect( rigDriver, &GenericRigDrv::rigIsReady, this, [this, newRigProfile]()\n    {\n        connected = true;\n\n        // Change Assigned CW Key\n        if ( !newRigProfile.assignedCWKey.isEmpty()\n             || newRigProfile.assignedCWKey != \" \")\n        {\n            emit rigCWKeyOpenRequest(newRigProfile.assignedCWKey);\n        }\n\n        rigStatus.profile = newRigProfile.profileName;\n        rigStatus.isConnected = true;\n        heartBeatTimer->start(HEARTBEATPERIOD);\n        emit rigConnected();\n\n        sendState();\n    });\n\n    if ( !rigDriver->open() )\n    {\n        emit rigErrorPresent(tr(\"Cannot open Rig\"),\n                             rigDriver->lastError());\n        qWarning() << rigDriver->lastError();\n        __closeRig();\n        return;\n    }\n}\n\nvoid Rig::close()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &Rig::closeImpl, Qt::QueuedConnection);\n}\n\nvoid Rig::closeImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    __closeRig();\n}\n\nvoid Rig::__closeRig()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigDriver )\n    {\n        qCDebug(runtime) << \"Driver is not active\";\n        return;\n    }\n\n    const RigProfile &connectedRigProfile = rigDriver->getCurrRigProfile();\n\n    // Change Assigned CW Key\n    if ( !connectedRigProfile.assignedCWKey.isEmpty()\n         || connectedRigProfile.assignedCWKey != \" \")\n    {\n        emit rigCWKeyCloseRequest(connectedRigProfile.assignedCWKey);\n    }\n\n    rigStatus.isConnected = false;\n    heartBeatTimer->stop();\n    emitRigStatusChanged();\n    rigStatus.clear();\n\n    delete rigDriver;\n    rigDriver = nullptr;\n    connected = false;\n\n    // Stop and cleanup rigctld if it was running\n    if ( rigctldManager )\n    {\n        qCDebug(runtime) << \"Stopping rigctld\";\n        rigctldManager->stop();\n        delete rigctldManager;\n        rigctldManager = nullptr;\n    }\n\n    emit rigDisconnected();\n}\n\nbool Rig::isRigConnected()\n{\n    FCT_IDENTIFICATION;\n\n    return connected;\n}\n\nbool Rig::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return false;\n\n    return rigDriver->isMorseOverCatSupported();\n}\n\nvoid Rig::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newFreq;\n\n    setFrequency(VFO1, newFreq);\n}\n\nvoid Rig::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << newFreq;\n\n    if ( newFreq > 0.0 )\n    {\n        QMetaObject::invokeMethod(this, \"setVFOFrequencyImpl\",\n                                  Qt::QueuedConnection,\n                                  Q_ARG(VFOID, vfoid),\n                                  Q_ARG(double, newFreq));\n    }\n}\n\nvoid Rig::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    QMetaObject::invokeMethod(this, \"setSplitImpl\",\n                              Qt::QueuedConnection,\n                              Q_ARG(bool, enabled));\n}\n\nvoid Rig::setVFOFrequencyImpl(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << newFreq;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setFrequency(vfoid, newFreq);\n}\n\nvoid Rig::setSplitImpl(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setSplit(enabled);\n}\n\nvoid Rig::setRawMode(const QString& rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( rawMode.isEmpty() )\n        return;\n\n    QMetaObject::invokeMethod(this, \"setRawModeImpl\",\n                              Qt::QueuedConnection, Q_ARG(QString, rawMode));\n}\n\nvoid Rig::setRawModeImpl(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setRawMode(rawMode);\n}\n\nvoid Rig::setMode(const QString &newMode, const QString &newSubMode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newMode << newSubMode << digiVariant;\n\n    if ( newMode.isEmpty()\n         && newSubMode.isEmpty() )\n        return;\n\n    QMetaObject::invokeMethod(this, \"setModeImpl\",\n                              Qt::QueuedConnection, Q_ARG(QString, newMode), Q_ARG(QString, newSubMode), Q_ARG(bool, digiVariant));\n}\n\nvoid Rig::setModeImpl(const QString &newMode, const QString &newSubMode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newMode << newSubMode << digiVariant;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setMode(newMode, newSubMode, digiVariant);\n}\n\nvoid Rig::setPTT(bool active)\n{\n    FCT_IDENTIFICATION;\n    QMetaObject::invokeMethod(this, \"setPTTImpl\", Qt::QueuedConnection,\n                              Q_ARG(bool, active));\n\n}\n\nvoid Rig::setPTTImpl(bool active)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << active;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setPTT(active);\n}\n\nvoid Rig::setKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"setKeySpeedImpl\", Qt::QueuedConnection,\n                              Q_ARG(qint16, wpm));\n}\n\nvoid Rig::setKeySpeedImpl(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << wpm;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->setKeySpeed(wpm);\n}\n\nvoid Rig::syncKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"syncKeySpeedImpl\", Qt::QueuedConnection,\n                              Q_ARG(qint16, wpm));\n}\n\nvoid Rig::syncKeySpeedImpl(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->syncKeySpeed(wpm);\n}\n\nvoid Rig::sendMorse(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    if ( text.isEmpty() )\n        return;\n\n    QMetaObject::invokeMethod(this, \"sendMorseImpl\", Qt::QueuedConnection,\n                              Q_ARG(QString, text));\n}\n\nvoid Rig::sendMorseImpl(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->sendMorse(text);\n}\n\nvoid Rig::stopMorse()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"stopMorseImpl\", Qt::QueuedConnection);\n}\n\nvoid Rig::stopMorseImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->stopMorse();\n}\n\nvoid Rig::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"sendStateImpl\", Qt::QueuedConnection);\n}\n\nvoid Rig::sendStateImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->sendState();\n}\n\nvoid Rig::sendDXSpot(DxSpot spot)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"sendDXSpotImpl\", Qt::QueuedConnection,\n                              Q_ARG(DxSpot, spot));\n}\n\nvoid Rig::sendDXSpotImpl(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return;\n\n    rigDriver->sendDXSpot(spot);\n}\n\nGenericRigDrv *Rig::getDriver( const RigProfile &profile )\n{\n    FCT_IDENTIFICATION;\n\n    //(if) for testing purpose\n#if 1\n    qCDebug(runtime) << profile.driver;\n\n    switch ( profile.driver )\n    {\n    case Rig::HAMLIB_DRIVER:\n        return new HamlibRigDrv(profile, this);\n        break;\n#ifdef Q_OS_WIN\n    case Rig::OMNIRIG_DRIVER:\n        return new OmnirigRigDrv(profile, this);\n        break;\n    case Rig::OMNIRIGV2_DRIVER:\n        return new OmnirigV2RigDrv(profile, this);\n        break;\n#endif\n    case Rig::TCI_DRIVER:\n        return new TCIRigDrv(profile, this);\n        break;\n\n    case Rig::FLRIG_DRIVER:\n        return new FlrigRigDrv(profile, this);\n        break;\n\n    default:\n        qWarning() << \"Unsupported Rig Driver \" << profile.driver;\n        return nullptr;\n    }\n#else\n#ifdef Q_OS_WIN\n    return new OmnirigV2Drv(profile, this);\n#endif\n    return new HamlibDrv(profile, this);\n#endif\n}\n\nvoid Rig::emitRigStatusChanged()\n{\n    FCT_IDENTIFICATION;\n\n    // it can happen especially with TCI that Rig received information,\n    // emit signals but rig is not connected.\n    if ( rigStatus.profile.isEmpty() )\n        return;\n\n    emit rigStatusChanged(rigStatus);\n}\n\nconst QStringList Rig::getAvailableRawModes()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rigDriver )\n        return QStringList();\n\n    return rigDriver->getAvailableModes();;\n}\n\nRig::~Rig()\n{\n    FCT_IDENTIFICATION;\n\n    __closeRig();\n}\n\nvoid Rig::sendHeartBeat()\n{\n    FCT_IDENTIFICATION;\n\n    // The functionality is similar to emitRigStatusChanged, but emits\n    // a different signal to distinguish these two cases for future use.\n\n    if ( !rigStatus.isConnected || rigStatus.profile.isEmpty() )\n        return;\n\n    emit rigStatusHeartBeat(rigStatus);\n}\n#undef MUTEXLOCKER\n"
  },
  {
    "path": "rig/Rig.h",
    "content": "#ifndef RIG_RIG_H\n#define RIG_RIG_H\n\n#include <QObject>\n#include <QTimer>\n#include <QMutex>\n#include <QHash>\n#include \"rig/drivers/GenericRigDrv.h\"\n#include \"RigCaps.h\"\n#include \"data/DxSpot.h\"\n\nclass RigctldManager;\n\nclass Rig : public QObject\n{\n    Q_OBJECT\npublic:\n\n    static int DEFAULT_MODEL;\n\n    enum DriverID\n    {\n        UNDEF_DRIVER = 0,\n        HAMLIB_DRIVER = 1,\n        OMNIRIG_DRIVER = 2,\n        OMNIRIGV2_DRIVER = 3,\n        TCI_DRIVER = 4,\n        FLRIG_DRIVER = 5,\n    };\n\n    struct Status\n    {\n        QString profile;\n        double freq = 0.0;\n        QString mode;\n        QString submode;\n        QString rawmode;\n        qint8 ptt = -1;\n        double power = 0.0;\n        quint16 keySpeed = 0;\n        QString vfo = \"Curr\";\n        double rit = 0.0;\n        double xit = 0.0;\n        qint32 bandwidth = 0;\n        bool isConnected = false;\n        bool splitEnabled = false;\n        double txFreq = 0.0;\n\n        void clear()\n        {\n            profile.clear();\n            freq = 0.0;\n            mode.clear();\n            submode.clear();\n            rawmode.clear();\n            ptt = -1;\n            power = 0.0;\n            keySpeed = 0;\n            vfo=\"Curr\";\n            rit = 0.0;\n            xit = 0.0;\n            bandwidth = 0;\n            isConnected = false;\n            splitEnabled = false;\n            txFreq = 0.0;\n        };\n    };\n\n    static Rig* instance()\n    {\n        static Rig instance;\n        return &instance;\n    };\n\n    static qint32 getNormalBandwidth(const QString &mode,\n                                     const QString &subMode);\n\n    explicit Rig(QObject *parent = nullptr);\n    ~Rig();\n\n    bool isRigConnected();\n    bool isMorseOverCatSupported();\n    const QStringList getAvailableRawModes();\n    const QList<QPair<int, QString>> getModelList(const DriverID &id) const;\n    const QList<QPair<QString, QString>> getPTTTypeList(const DriverID &id) const;\n    const QList<QPair<int, QString>> getDriverList() const;\n    const RigCaps getRigCaps(const DriverID &, int) const;\n\n\npublic slots:\n    void start();\n    void open();\n    void close();\n    void stopTimer();\n\n    void setFrequency(double);\n    void setFrequency(VFOID, double);\n    void setSplit(bool);\n    void setRawMode(const QString &rawMode);\n    void setMode(const QString &, const QString &, bool = false);\n    void setPTT(bool);\n    void setKeySpeed(qint16 wpm);\n    void syncKeySpeed(qint16 wpm);\n    void sendMorse(const QString &text);\n    void stopMorse();\n    void sendState();\n    void sendDXSpot(DxSpot spot);\n\nsignals:\n    void frequencyChanged(VFOID, double, double, double);\n    void splitChanged(VFOID, bool);\n    void modeChanged(VFOID, QString, QString, QString, qint32);\n    void powerChanged(VFOID, double);\n    void keySpeedChanged(VFOID, unsigned int);\n    void vfoChanged(VFOID, QString);\n    void ritChanged(VFOID, double);\n    void xitChanged(VFOID, double);\n    void pttChanged(VFOID, bool);\n    void rigCWKeyOpenRequest(QString);\n    void rigCWKeyCloseRequest(QString);\n    void rigDisconnected();\n    void rigConnected();\n    void rigErrorPresent(QString, QString);\n    void rigStatusChanged(Rig::Status);\n    void rigStatusHeartBeat(Rig::Status);\n\nprivate slots:\n    void stopTimerImplt();\n    void openImpl();\n    void closeImpl();\n\n    void setVFOFrequencyImpl(VFOID, double);\n    void setSplitImpl(bool);\n    void setRawModeImpl(const QString&);\n    void setModeImpl(const QString &, const QString &, bool);\n    void setPTTImpl(bool);\n    void setKeySpeedImpl(qint16 wpm);\n    void syncKeySpeedImpl(qint16 wpm);\n    void sendMorseImpl(const QString &text);\n    void stopMorseImpl();\n    void sendStateImpl();\n    void sendDXSpotImpl(const DxSpot &spot);\n    void sendHeartBeat();\n\nprivate:\n    class DrvParams\n    {\n    public:\n        DrvParams(const DriverID id,\n                  const QString &driverName,\n                  QList<QPair<int, QString>> (*getModelfct)(),\n                  RigCaps (*getCapsfct)(int),\n                  QList<QPair<QString, QString>> (*getPTTTypefct)()) :\n            driverID(id),\n            driverName(driverName),\n            getModeslListFunction(getModelfct),\n            getCapsFunction(getCapsfct),\n            getPTTTypeListFunction(getPTTTypefct){};\n\n        DrvParams() :\n            driverID(UNDEF_DRIVER),\n            getModeslListFunction(nullptr),\n            getCapsFunction(nullptr),\n            getPTTTypeListFunction(nullptr){};\n\n        DriverID driverID;\n        QString driverName;\n        QList<QPair<int, QString>> (*getModeslListFunction)();\n        RigCaps (*getCapsFunction)(int);\n        QList<QPair<QString, QString>> (*getPTTTypeListFunction)();\n    };\n\n    QMap<int, DrvParams> drvMapping;\n\n    void __closeRig();\n    void __openRig();\n    GenericRigDrv *getDriver(const RigProfile &profile);\n    void emitRigStatusChanged();\n\nprivate:\n    GenericRigDrv *rigDriver;\n    QMutex rigLock;\n    Rig::Status rigStatus;\n    bool connected;\n    QTimer *heartBeatTimer;\n    const quint16 HEARTBEATPERIOD = 1000; // in ms\n    RigctldManager *rigctldManager = nullptr;\n};\n\nQ_DECLARE_METATYPE(Rig::Status);\n\n#endif // RIG_RIG_H\n"
  },
  {
    "path": "rig/RigCaps.cpp",
    "content": "#include \"RigCaps.h\"\n\nRigCaps::RigCaps(bool canGetFreq,\n                 bool canGetMode,\n                 bool canGetVFO,\n                 bool canGetPWR,\n                 bool canGetRIT,\n                 bool canGetXIT,\n                 bool canGetPTT,\n                 bool canGetKeySpeed,\n                 bool canSendMorse,\n                 bool isNetworkOnly,\n                 bool needPolling,\n                 bool canProcessDXSpot,\n                 int serial_data_bits,\n                 int serial_stop_bits,\n                 bool isCIVAddrSupported,\n                 bool canGetSplit\n                 ) :\n    canGetFreq(canGetFreq),\n    canGetMode(canGetMode),\n    canGetVFO(canGetVFO),\n    canGetPWR(canGetPWR),\n    canGetRIT(canGetRIT),\n    canGetXIT(canGetXIT),\n    canGetPTT(canGetPTT),\n    canGetKeySpeed(canGetKeySpeed),\n    canSendMorse(canSendMorse),\n    serialDataBits(serial_data_bits),\n    serialStopBits(serial_stop_bits),\n    isNetworkOnly(isNetworkOnly),\n    needPolling(needPolling),\n    canProcessDXSpot(canProcessDXSpot),\n    isCIVAddrSupported(isCIVAddrSupported),\n    canGetSplit(canGetSplit)\n{\n\n}\n"
  },
  {
    "path": "rig/RigCaps.h",
    "content": "#ifndef RIG_RIGCAPS_H\n#define RIG_RIGCAPS_H\n\n\nclass RigCaps\n{\npublic:\n    RigCaps(bool canGetFreq = false,\n            bool canGetMode = false,\n            bool canGetVFO = false,\n            bool canGetPWR = false,\n            bool canGetRIT = false,\n            bool canGetXIT = false,\n            bool canGetPTT = false,\n            bool canGetKeySpeed = false,\n            bool canSendMorse = false,\n            bool isNetworkOnly = false,\n            bool needPolling = false,\n            bool canProcessDXSpot = false,\n            int serial_data_bits = 8,\n            int serial_stop_bits = 1,\n            bool isCIVAddrSupported = false,\n            bool canGetSplit = false\n            );\n\n    bool canGetFreq;\n    bool canGetMode;\n    bool canGetVFO;\n    bool canGetPWR;\n    bool canGetRIT;\n    bool canGetXIT;\n    bool canGetPTT;\n    bool canGetKeySpeed;\n    bool canSendMorse;\n    int serialDataBits;\n    int serialStopBits;\n    bool isNetworkOnly;\n    bool needPolling;\n    bool canProcessDXSpot;\n    bool isCIVAddrSupported;\n    bool canGetSplit;\n};\n\n#endif // RIG_RIGCAPS_H\n"
  },
  {
    "path": "rig/RigctldManager.cpp",
    "content": "#include <QStandardPaths>\n#include <QThread>\n#include <QTcpSocket>\n#include <QDir>\n#include <QCoreApplication>\n#include <QRegularExpression>\n\n#include \"RigctldManager.h\"\n#include \"core/debug.h\"\n#include \"data/SerialPort.h\"\n\nMODULE_IDENTIFICATION(\"qlog.rig.rigctldmanager\");\n\nRigctldManager::RigctldManager(QObject *parent)\n    : QObject(parent)\n{\n    FCT_IDENTIFICATION;\n}\n\nRigctldManager::~RigctldManager()\n{\n    FCT_IDENTIFICATION;\n    stop();\n}\n\nbool RigctldManager::start(const RigProfile &profile)\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigctldProcess && rigctldProcess->state() != QProcess::NotRunning)\n    {\n        qCWarning(runtime) << \"rigctld is already running\";\n        return false;\n    }\n\n    // Find rigctld executable\n    QString rigctldPath = profile.rigctldPath;\n    if ( rigctldPath.isEmpty() )\n    {\n        rigctldPath = findRigctldPath();\n\n        if ( rigctldPath.isEmpty() )\n        {\n            qCWarning(runtime) << \"rigctld executable not found\";\n#ifdef QLOG_FLATPAK\n            emit errorOccurred(tr(\"rigctld executable not found in /app/bin/. This should not happen in Flatpak build.\"));\n#else\n            emit errorOccurred(tr(\"rigctld executable not found. Please install Hamlib or specify the path in Advanced settings.\"));\n#endif\n            return false;\n        }\n    }\n\n    qCDebug(runtime) << \"Using rigctld at:\" << rigctldPath;\n\n    // Check major version compatibility\n    // Hamlib 3 vs 4 changed RIG model IDs and they are not compatible\n    const RigctldVersion rigctldVersion = getVersion(rigctldPath);\n\n    if ( rigctldVersion.isValid()\n          && ((rigctldVersion.major >= 4 && HAMLIBVERSION_MAJOR <= 3)\n               || (rigctldVersion.major <= 3 && HAMLIBVERSION_MAJOR >= 4)))\n    {\n        qCDebug(runtime) << \"Hamlib major version mismatch: QLog compiled with\"\n                           << HAMLIBVERSION_MAJOR << \"but rigctld is\" << rigctldVersion.major;\n        emit errorOccurred(tr(\"Hamlib major version mismatch: QLog was compiled with Hamlib %1 \"\n                              \"but rigctld reports version %2.%3.%4. \"\n                              \"Rig model IDs are incompatible between major versions.\")\n                           .arg(HAMLIBVERSION_MAJOR)\n                           .arg(rigctldVersion.major)\n                           .arg(rigctldVersion.minor)\n                           .arg(rigctldVersion.patch));\n        return false;\n    }\n\n    currentPort = profile.rigctldPort;\n\n    // Check if port is already in use\n    {\n        QTcpSocket testSocket;\n        testSocket.connectToHost(\"127.0.0.1\", currentPort);\n        if ( testSocket.waitForConnected(500) )\n        {\n            testSocket.disconnectFromHost();\n            qCWarning(runtime) << \"Port\" << currentPort << \"is already in use\";\n            emit errorOccurred(tr(\"Port %1 is already in use. \"\n                                  \"Another rigctld or application may be running on this port.\")\n                               .arg(currentPort));\n            return false;\n        }\n        testSocket.abort();\n    }\n\n    // Create process\n    rigctldProcess = new QProcess(this);\n    rigctldProcess->setProcessChannelMode(QProcess::SeparateChannels);\n\n    connect(rigctldProcess, &QProcess::started, this, &RigctldManager::onProcessStarted);\n    connect(rigctldProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &RigctldManager::onProcessFinished);\n    connect(rigctldProcess, &QProcess::errorOccurred, this, &RigctldManager::onProcessError);\n    connect(rigctldProcess, &QProcess::readyReadStandardOutput, this, &RigctldManager::onReadyReadStdout);\n    connect(rigctldProcess, &QProcess::readyReadStandardError, this, &RigctldManager::onReadyReadStderr);\n\n    // exec arguments\n    const QStringList args = buildArguments(profile);\n    qCDebug(runtime) << \"Starting rigctld with args:\" << args;\n\n    rigctldProcess->start(rigctldPath, args);\n\n    if ( !rigctldProcess->waitForStarted(5000) )\n    {\n        qCDebug(runtime) << \"Failed to start rigctld\";\n        // onProcessError already emits errorOccurred via QProcess::errorOccurred signal\n        delete rigctldProcess;\n        rigctldProcess = nullptr;\n        return false;\n    }\n\n    // Wait for rigctld to be ready (accepting connections)\n    if ( !waitForRigctldReady() )\n    {\n        qCDebug(runtime) << \"rigctld not responding on port\" << currentPort;\n        stop();\n        emit errorOccurred(tr(\"rigctld started but not responding on port %1.\").arg(currentPort));\n        return false;\n    }\n\n    qCDebug(runtime) << \"rigctld started successfully on port\" << currentPort;\n    emit started();\n    return true;\n}\n\nvoid RigctldManager::stop()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigctldProcess ) return;\n\n    stoppingInProgress = true;\n\n    if ( rigctldProcess->state() != QProcess::NotRunning )\n    {\n        qCDebug(runtime) << \"Stopping rigctld\";\n\n        // Disconnect signals to prevent error notifications during controlled shutdown\n        rigctldProcess->disconnect();\n\n        rigctldProcess->terminate();\n        if ( !rigctldProcess->waitForFinished(3000) )\n        {\n            qCWarning(runtime) << \"rigctld did not terminate gracefully, killing\";\n            rigctldProcess->kill();\n            rigctldProcess->waitForFinished(1000);\n        }\n    }\n\n    delete rigctldProcess;\n    rigctldProcess = nullptr;\n    stoppingInProgress = false;\n\n    emit stopped();\n}\n\nbool RigctldManager::isRunning() const\n{\n    return rigctldProcess && rigctldProcess->state() == QProcess::Running;\n}\n\nQString RigctldManager::findRigctldPath()\n{\n    FCT_IDENTIFICATION;\n\n    // First priority: Check application directory (bundled rigctld)\n#ifdef Q_OS_WIN\n    const QString appDirPath = QCoreApplication::applicationDirPath() + \"/rigctld.exe\";\n#else\n    const QString appDirPath = QCoreApplication::applicationDirPath() + \"/rigctld\";\n#endif\n    if ( QFile::exists(appDirPath) )\n    {\n        qCDebug(runtime) << \"Found bundled rigctld at:\" << appDirPath;\n        return appDirPath;\n    }\n\n    // Second priority: Platform-specific paths\n    const QStringList platformPaths =\n    {\n#ifdef Q_OS_WIN\n        \"C:/Program Files/Hamlib/bin/rigctld.exe\",\n        \"C:/Program Files (x86)/Hamlib/bin/rigctld.exe\",\n        QDir::homePath() + \"/AppData/Local/Hamlib/bin/rigctld.exe\"\n#endif\n#ifdef Q_OS_MACOS\n        \"/opt/homebrew/bin/rigctld\",\n        \"/usr/local/bin/rigctld\",\n        \"/opt/local/bin/rigctld\"\n#endif\n#ifdef QLOG_FLATPAK\n        \"/app/bin/rigctld\",  // Flatpak path\n#else\n        \"/usr/bin/rigctld\",\n        \"/usr/local/bin/rigctld\",\n        \"/opt/hamlib/bin/rigctld\"\n#endif\n    };\n\n    for ( const QString &p : platformPaths )\n    {\n        if ( QFile::exists(p) )\n        {\n            qCDebug(runtime) << \"Found rigctld at:\" << p;\n            return p;\n        }\n    }\n\n    // Last resort: Try $PATH\n    const QString path = QStandardPaths::findExecutable(\"rigctld\");\n    if ( !path.isEmpty() )\n    {\n        qCDebug(runtime) << \"Found rigctld in PATH:\" << path;\n        return path;\n    }\n\n    qCWarning(runtime) << \"rigctld not found\";\n    return QString();\n}\n\nRigctldVersion RigctldManager::getVersion(const QString &rigctldPath)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rigctldPath;\n\n    RigctldVersion version;\n\n    QString path = rigctldPath;\n    if ( path.isEmpty() )\n        path = findRigctldPath();\n\n    if ( path.isEmpty() )\n    {\n        qCDebug(runtime) << \"rigctld not found\";\n        return version;\n    }\n\n    QProcess process;\n    process.start(path, QStringList(\"--version\"));\n\n    if ( !process.waitForFinished(2000) )\n    {\n        qCDebug(runtime) << \"rigctld --version timed out\";\n        return version;\n    }\n\n    const QString output = QString::fromLocal8Bit(process.readAllStandardOutput()).trimmed();\n    qCDebug(runtime) << \"rigctld version output:\" << output;\n\n    // \"rigctld Hamlib 4.5.5\"\n    QRegularExpression re(\"rigct\\\\S*\\\\s+\\\\S+\\\\s+(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\");\n    QRegularExpressionMatch match = re.match(output); // clazy:exclude=use-static-qregularexpression\n\n    if ( match.hasMatch() )\n    {\n        version.major = match.captured(1).toInt();\n        version.minor = match.captured(2).toInt();\n        version.patch = match.captured(3).toInt();\n        qCDebug(runtime) << \"Parsed version:\" << version.major << version.minor << version.patch;\n    }\n    else\n    {\n        qCDebug(runtime) << \"Failed to parse version from output:\" << output;\n    }\n\n    return version;\n}\n\nbool RigctldManager::waitForRigctldReady(int timeoutMs)\n{\n    FCT_IDENTIFICATION;\n\n    QTcpSocket testSocket;\n    int elapsed = 0;\n    const int checkInterval = 100;\n\n    // test connection\n    while ( elapsed < timeoutMs )\n    {\n        testSocket.connectToHost(\"127.0.0.1\", currentPort);\n        if ( testSocket.waitForConnected(500) )\n        {\n            testSocket.disconnectFromHost();\n            qCDebug(runtime) << \"rigctld is ready after\" << elapsed << \"ms\";\n            return true;\n        }\n        testSocket.abort();\n\n        // Check if process is still running\n        if ( rigctldProcess && rigctldProcess->state() != QProcess::Running )\n        {\n            qCWarning(runtime) << \"rigctld process terminated unexpectedly\";\n            return false;\n        }\n\n        QThread::msleep(checkInterval);\n        elapsed += checkInterval;\n    }\n\n    return false;\n}\n\nQStringList RigctldManager::buildArguments(const RigProfile &profile) const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList args;\n\n    // Model\n    args << \"-m\" << QString::number(profile.model);\n\n    // Listen Port\n    args << \"-t\" << QString::number(profile.rigctldPort);\n\n    // Serial port settings\n    if ( profile.getPortType() == RigProfile::SERIAL_ATTACHED )\n    {\n        args << \"-r\" << profile.portPath;\n\n        // BandRate\n        if ( profile.baudrate > 0 ) args << \"-s\" << QString::number(profile.baudrate);\n\n        // Data bits\n        if ( profile.databits > 0 ) args << \"-C\" << QString(\"data_bits=%1\").arg(profile.databits);\n\n        // Stop bits\n        if ( profile.stopbits > 0 ) args << \"-C\" << QString(\"stop_bits=%1\").arg(static_cast<int>(profile.stopbits));\n\n        // Parity\n        if ( !profile.parity.isEmpty() && profile.parity.compare(SerialPort::SERIAL_PARITY_NO, Qt::CaseInsensitive) )\n        {\n            QString parity = profile.parity.toLower();\n            if      ( parity == SerialPort::SERIAL_PARITY_EVEN ) parity = \"E\";\n            else if ( parity == SerialPort::SERIAL_PARITY_ODD )  parity = \"O\";\n            else parity = \"N\";\n            args << \"-C\" << QString(\"serial_parity=%1\").arg(parity);\n        }\n\n        // Flow control\n        if ( !profile.flowcontrol.isEmpty() && profile.flowcontrol.compare(SerialPort::SERIAL_FLOWCONTROL_NONE, Qt::CaseInsensitive) )\n        {\n            QString flow = profile.flowcontrol.toLower();\n            if ( flow == SerialPort::SERIAL_FLOWCONTROL_HARDWARE )      flow = \"Hardware\";\n            else if ( flow == SerialPort::SERIAL_FLOWCONTROL_SOFTWARE ) flow = \"XONXOFF\";\n            args << \"-C\" << QString(\"serial_handshake=%1\").arg(flow);\n        }\n\n        // CIV address for Icom\n        if (profile.civAddr >= 0) args << \"-C\" << QString(\"civaddr=%1\").arg(profile.civAddr, 2, 16, QChar('0'));\n\n        // DTR signal\n        if ( !profile.dtr.isEmpty() && profile.dtr.compare(SerialPort::SERIAL_SIGNAL_NONE, Qt::CaseInsensitive) )\n        {\n            QString dtr = profile.dtr.toLower();\n            if ( dtr == SerialPort::SERIAL_SIGNAL_HIGH )     dtr = \"ON\";\n            else if ( dtr == SerialPort::SERIAL_SIGNAL_LOW ) dtr = \"OFF\";\n            args << \"-C\" << QString(\"dtr_state=%1\").arg(dtr);\n        }\n\n        // RTS signal\n        if ( !profile.rts.isEmpty() && profile.rts.compare(SerialPort::SERIAL_SIGNAL_NONE, Qt::CaseInsensitive) )\n        {\n            QString rts = profile.rts.toLower();\n            if ( rts == SerialPort::SERIAL_SIGNAL_HIGH )     rts = \"ON\";\n            else if ( rts == SerialPort::SERIAL_SIGNAL_LOW ) rts = \"OFF\";\n            args << \"-C\" << QString(\"rts_state=%1\").arg(rts);\n        }\n    }\n\n    // Additional user-specified arguments\n    if ( !profile.rigctldArgs.isEmpty() )\n    {\n        // Split by whitespace, respecting quotes\n        QStringList extraArgs = profile.rigctldArgs.split(QRegularExpression(\"\\\\s+\"), // clazy:exclude=use-static-qregularexpression\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n                                                          Qt::SkipEmptyParts);\n#else\n                                                          QString::SkipEmptyParts);\n#endif\n\n        args << extraArgs;\n    }\n\n    qCDebug(runtime) << args;\n\n    return args;\n}\n\nvoid RigctldManager::onProcessStarted()\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime) << \"rigctld process started\";\n}\n\nvoid RigctldManager::onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(runtime) << \"rigctld process finished with exit code\" << exitCode\n                     << \"status\" << exitStatus;\n\n    if ( stoppingInProgress )\n        return;\n\n    emit stopped();\n}\n\nvoid RigctldManager::onProcessError(QProcess::ProcessError error)\n{\n    FCT_IDENTIFICATION;\n\n    QString errorStr;\n    switch ( error )\n    {\n    case QProcess::FailedToStart:\n    {\n        const QString program = rigctldProcess ? rigctldProcess->program() : QString();\n        const QStringList args = rigctldProcess ? rigctldProcess->arguments() : QStringList();\n        errorStr = tr(\"Failed to start rigctld: %1 %2\").arg(program, args.join(\" \"));\n        break;\n    }\n    case QProcess::Crashed:\n        errorStr = tr(\"rigctld crashed.\");\n        break;\n    case QProcess::Timedout:\n        errorStr = tr(\"rigctld timed out.\");\n        break;\n    case QProcess::WriteError:\n        errorStr = tr(\"Write error with rigctld.\");\n        break;\n    case QProcess::ReadError:\n        errorStr = tr(\"Read error with rigctld.\");\n        break;\n    default:\n        errorStr = tr(\"Unknown rigctld error.\");\n        break;\n    }\n\n    qCDebug(runtime) << \"rigctld process error:\" << errorStr;\n\n    if ( !stoppingInProgress )\n        emit errorOccurred(errorStr);\n}\n\nvoid RigctldManager::onReadyReadStdout()\n{\n    if (!rigctldProcess)\n        return;\n\n    const QByteArray data = rigctldProcess->readAllStandardOutput();\n    if ( !data.isEmpty() )\n    {\n        // Split by lines and log each\n        const QList<QByteArray> lines = data.split('\\n');\n        for ( const QByteArray &line : lines )\n        {\n            if ( !line.trimmed().isEmpty() )\n                qCDebug(runtime) << \"rigctld:\" << line.trimmed();\n        }\n    }\n}\n\nvoid RigctldManager::onReadyReadStderr()\n{\n    if (!rigctldProcess)\n        return;\n\n    const QByteArray data = rigctldProcess->readAllStandardError();\n    if ( !data.isEmpty() )\n    {\n        const QList<QByteArray> lines = data.split('\\n');\n        for ( const QByteArray &line : lines )\n        {\n            if ( !line.trimmed().isEmpty() )\n                qCDebug(runtime) << \"rigctld stderr:\" << line.trimmed();\n        }\n    }\n}\n"
  },
  {
    "path": "rig/RigctldManager.h",
    "content": "#ifndef RIG_RIGCTLDMANAGER_H\n#define RIG_RIGCTLDMANAGER_H\n\n#include <QObject>\n#include <QProcess>\n#include \"data/RigProfile.h\"\n\nstruct RigctldVersion\n{\n    int major = -1;\n    int minor = -1;\n    int patch = -1;\n    bool isValid() const { return major >= 0; }\n};\n\nclass RigctldManager : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit RigctldManager(QObject *parent = nullptr);\n    ~RigctldManager();\n\n    bool start(const RigProfile &profile);\n    void stop();\n    bool isRunning() const;\n\n    QString getConnectHost() const { return \"127.0.0.1\"; }\n    quint16 getConnectPort() const { return currentPort; }\n\n    static QString findRigctldPath();\n    static RigctldVersion getVersion(const QString &rigctldPath = QString());\n\nsignals:\n    void started();\n    void stopped();\n    void errorOccurred(const QString &error);\n\nprivate slots:\n    void onProcessStarted();\n    void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus);\n    void onProcessError(QProcess::ProcessError error);\n    void onReadyReadStdout();\n    void onReadyReadStderr();\n\nprivate:\n    bool waitForRigctldReady(int timeoutMs = 5000);\n    QStringList buildArguments(const RigProfile &profile) const;\n\n    QProcess *rigctldProcess = nullptr;\n    quint16 currentPort = 4532;\n    bool stoppingInProgress = false;\n};\n\n#endif // RIG_RIGCTLDMANAGER_H\n"
  },
  {
    "path": "rig/drivers/FlrigRigDrv.cpp",
    "content": "#include \"FlrigRigDrv.h\"\n#include \"core/debug.h\"\n#include \"rig/macros.h\"\n\nMODULE_IDENTIFICATION(\"qlog.rig.driver.flrigrigdrv\");\n\nRigCaps FlrigRigDrv::getCaps(int)\n{\n    FCT_IDENTIFICATION;\n\n    RigCaps ret;\n\n    ret.isNetworkOnly = true;\n\n    ret.canGetFreq = true;\n    ret.canGetMode = true;\n    ret.canGetVFO = true;\n    ret.canGetPTT = true;\n    ret.canGetPWR = true;\n    ret.canGetKeySpeed = true;\n    ret.canSendMorse = true;\n    ret.needPolling = true;\n    ret.canGetSplit = true;\n\n    return ret;\n}\n\nQList<QPair<int, QString> > FlrigRigDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    return {{1, \"FLRig\"}};\n}\n\nFlrigRigDrv::FlrigRigDrv(const RigProfile &profile,\n                         QObject *parent)\n    : GenericRigDrv(profile, parent),\n      networkManager(new QNetworkAccessManager(this)),\n      rigReady(false),\n      hostUrl(QString(\"http://%1:%2/\").arg(profile.hostname).arg(profile.netport))\n{\n    FCT_IDENTIFICATION;\n\n    buildModeMappingHash();\n    resetCurrStates();\n}\n\nFlrigRigDrv::~FlrigRigDrv()\n{\n    FCT_IDENTIFICATION;\n    networkManager->deleteLater();\n}\n\nbool FlrigRigDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    reqGET_MODES();\n\n    // Cannot retrieve mode from rig while Send/Pause is active. turn it off.\n    reqCWIO_SEND(false);\n    return true;\n}\n\nbool FlrigRigDrv::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n\n    return true;\n}\n\nQStringList FlrigRigDrv::getAvailableModes()\n{\n    FCT_IDENTIFICATION;\n\n    return rigAvailableModes.keys();\n}\n\nvoid FlrigRigDrv::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rigReady ) return;\n\n    if ( newFreq == currFreq )\n    {\n        qCDebug(runtime) << \"The same Freq - skip change\" << currFreq << currFreq;\n        return;\n    }\n\n    sendXmlRpcCommand(\"rig.set_vfo\", { newFreq });\n}\n\nvoid FlrigRigDrv::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rigReady ) return;\n\n    if ( vfoid == VFO1 )\n    {\n        setFrequency(newFreq);\n        return;\n    }\n\n    // VFO2 — TX frequency\n    sendXmlRpcCommand(\"rig.set_vfoB\", { newFreq });\n}\n\nvoid FlrigRigDrv::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    if ( !rigProfile.getSplitInfo || !rigReady  ) return;\n\n    sendXmlRpcCommand(\"rig.set_split\", { enabled ? 1 : 0 });\n}\n\nvoid FlrigRigDrv::setRawMode(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( !rigProfile.getModeInfo || rawMode.isEmpty() || !rigReady ) return;\n\n    if ( rawMode == currRawMode )\n    {\n        qCDebug(runtime) << \"The same Mode - skip change\" << rawMode << currRawMode;\n        return;\n    }\n\n    sendXmlRpcCommand(\"rig.set_mode\", { rawMode });\n}\n\nvoid FlrigRigDrv::setMode(const QString &mode, const QString &subMode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode << digiVariant;\n\n    setRawMode(mode2RawMode(mode, subMode, digiVariant));\n}\n\nvoid FlrigRigDrv::setPTT(bool ptt)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << ptt;\n\n    if ( !rigProfile.getPTTInfo || !rigReady ) return;\n\n    sendXmlRpcCommand(\"rig.set_ptt\", { ptt });\n}\n\nvoid FlrigRigDrv::setKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( wpm <= 0 || !rigReady ) return;\n\n    if ( !rigProfile.getKeySpeed ) return;\n\n    sendXmlRpcCommand(\"rig.cwio_set_wpm\", { wpm });\n}\n\nvoid FlrigRigDrv::syncKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !rigProfile.keySpeedSync || !rigReady ) return;\n\n    setKeySpeed(wpm);\n}\n\nvoid FlrigRigDrv::sendMorse(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    if ( text.isEmpty() || !rigReady ) return;\n\n    QString innerText = text;\n\n    if ( !sendTextFlag && !text.contains('['))\n        innerText.prepend(\"[\");\n\n    innerText.replace(\"\\n\", \"]\");\n\n    sendTextFlag = !innerText.contains(\"]\");\n\n    sendXmlRpcCommand(\"rig.cwio_text\", {innerText});\n}\n\nvoid FlrigRigDrv::stopMorse()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigReady ) return;\n\n    reqCWIO_SEND(false);\n}\n\nvoid FlrigRigDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    resetCurrStates();\n}\n\nvoid FlrigRigDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    for ( QTimer* timer : static_cast<const QList<QTimer*>>(runningTimers) )\n        timer->stop();\n\n    runningTimers.clear();\n    // deallocation is performed during the class destruction - QTimer is a child\n}\n\nvoid FlrigRigDrv::sendDXSpot(const DxSpot &)\n{\n    FCT_IDENTIFICATION;\n    // not implemented\n}\n\nvoid FlrigRigDrv::startRigStatePoll()\n{\n    FCT_IDENTIFICATION;\n\n    reqGET_VFO();\n    reqGET_MODE();\n    reqGET_BW();\n    reqGET_POWER();\n    reqGET_AB();\n    reqGET_PTT();\n    reqGET_SPLIT();\n    reqCWIO_GET_WPM();\n}\n\nvoid FlrigRigDrv::reqGET_MODES()\n{\n    FCT_IDENTIFICATION;\n\n    sendXmlRpcCommand(\"rig.get_modes\");\n}\n\nvoid FlrigRigDrv::reqCWIO_SEND(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << state;\n\n    sendTextFlag = state;\n    sendXmlRpcCommand(\"rig.cwio_send\", {(state) ? 1 : 0});\n}\n\nvoid FlrigRigDrv::rspGET_MODES(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value><array><data><value>LSB</value><value>USB</value></data></array></value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    const QStringList &receivedModes = value.toStringList();\n\n    rigAvailableModes.clear();\n\n    for ( const QString &mode : receivedModes)\n        if ( raw2ADIFModeMapping.contains(mode) )\n            rigAvailableModes[mode] = raw2ADIFModeMapping.value(mode);\n\n    qCDebug(runtime) << \"Rig Modes\" << rigAvailableModes.keys();\n\n    rigReady = true;\n    emit rigIsReady();\n    startRigStatePoll();\n}\n\nvoid FlrigRigDrv::reqGET_VFO()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getFreqInfo ) sendXmlRpcCommand(\"rig.get_vfo\");\n}\n\nvoid FlrigRigDrv::rspGET_VFO(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value>14070000</value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    double vfoFreq = Hz2MHz(value.toLongLong());\n    qCDebug(runtime) << \"Rig Freq: \"<< QSTRING_FREQ(vfoFreq);\n    qCDebug(runtime) << \"Object Freq: \"<< QSTRING_FREQ(currFreq);\n\n    if ( vfoFreq != currFreq )\n    {\n        currFreq = vfoFreq;\n        qCDebug(runtime) << \"emitting FREQ changed\";\n        emit frequencyChanged(currFreq,\n                              currFreq,\n                              currFreq);\n    }\n\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_VFO);\n}\n\nvoid FlrigRigDrv::reqGET_MODE()\n{\n    FCT_IDENTIFICATION;\n\n     if ( rigProfile.getModeInfo ) sendXmlRpcCommand(\"rig.get_mode\");\n}\n\nvoid FlrigRigDrv::rspGET_MODE(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value>USB</value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    const QString &rawMode = value.toString();\n\n    qCDebug(runtime) << \"Rig Mode: \" << rawMode;\n    qCDebug(runtime) << \"Object Mode: \"<< currRawMode;\n\n    if ( rawMode != currRawMode )\n    {\n        // mode change\n        currRawMode = rawMode;\n\n        QString submode;\n        const QString &mode = getModeNormalizedText(rawMode, submode);\n\n        qCDebug(runtime) << \"emitting MODE changed\" << rawMode << mode << submode;\n        emit modeChanged(rawMode, mode, submode, 0);\n    }\n\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_MODE);\n}\n\nvoid FlrigRigDrv::reqGET_BW()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getModeInfo ) sendXmlRpcCommand(\"rig.get_bw\");\n}\n\nvoid FlrigRigDrv::rspGET_BW(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value><array><data><value>NONE</value><value></value></data></array></value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    const QVariantList &values = value.toList();\n\n    if ( values.isEmpty() )\n        qCDebug(runtime) << \"BW List is empty\";\n    else\n    {\n        bool ok = false;\n        int rigBW = values.at(0).toInt(&ok);\n        if ( !ok ) qCDebug(runtime) << \"Received BW is not a number\";\n\n        qCDebug(runtime) << \"Rig BW: \"<< rigBW;\n        qCDebug(runtime) << \"Object BW: \"<< currBW;\n\n        if ( rigBW != currBW )\n        {\n            currBW = rigBW;\n\n            qCDebug(runtime) << \"emitting BW changed\" << currBW;\n            QString submode;\n            const QString &mode = getModeNormalizedText(currRawMode, submode);\n            emit modeChanged(currRawMode, mode, submode, currBW);\n        }\n    }\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_BW);\n}\n\nvoid FlrigRigDrv::reqGET_POWER()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getPWRInfo )  sendXmlRpcCommand(\"rig.get_power\");\n}\n\nvoid FlrigRigDrv::rspGET_POWER(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value>0</value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    qlonglong pwr = value.toLongLong();\n\n    qCDebug(runtime) << \"Rig PWR: \"<< pwr;\n    qCDebug(runtime) << \"Object PWR: \"<< currPWR;\n\n    if ( pwr != currPWR )\n    {\n        currPWR = pwr;\n\n        qCDebug(runtime) << \"emitting PWR changed \" << pwr;\n        emit powerChanged(pwr);\n    }\n\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_POWER);\n}\n\nvoid FlrigRigDrv::reqGET_AB()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getVFOInfo )  sendXmlRpcCommand(\"rig.get_AB\");\n}\n\nvoid FlrigRigDrv::rspGET_AB(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    /* <?xml version=\\\"1.0\\\"?>\n     * <methodResponse><params><param>\n     * <value>A</value>\n     * </param></params></methodResponse>\n     */\n\n    qCDebug(function_parameters) << value;\n\n    const QString &vfo = \"VFO \" + value.toString();\n\n    qCDebug(runtime) << \"Rig AB: \"<< vfo;\n    qCDebug(runtime) << \"Object AB: \"<< currVFO;\n\n    if ( vfo != currVFO )\n    {\n        currVFO = vfo;\n\n        qCDebug(runtime) << \"emitting VFO changed\" << currVFO;\n        emit vfoChanged(currVFO);\n    }\n\n   QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_AB);\n}\n\nvoid FlrigRigDrv::reqGET_PTT()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getPTTInfo )  sendXmlRpcCommand(\"rig.get_ptt\");\n}\n\nvoid FlrigRigDrv::rspGET_PTT(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << value;\n\n    bool ptt = value.toBool();\n\n    qCDebug(runtime) << \"Rig PTT: \"<< ptt;\n    qCDebug(runtime) << \"Object PTT: \"<< QString::number(currPTT);\n\n    if ( ptt != currPTT )\n    {\n        currPTT = (ptt) ? 1 : 0;\n\n        qCDebug(runtime) << \"emitting PTT changed\" << QString::number(currPTT);\n        emit pttChanged(currPTT);\n    }\n\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_PTT);\n}\n\nvoid FlrigRigDrv::reqCWIO_GET_WPM()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getKeySpeed )  sendXmlRpcCommand(\"rig.cwio_get_wpm\");\n}\n\nvoid FlrigRigDrv::rspCWIO_GET_WPM(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    int keySpeed = value.toInt();\n\n    qCDebug(runtime) << \"Rig Key Speed: \"<< keySpeed;\n    qCDebug(runtime) << \"Object Key Speed: \"<< QString::number(currKeySpeed);\n\n\n    if ( keySpeed != currKeySpeed )\n    {\n        currKeySpeed = keySpeed;\n        qCDebug(runtime) << \"emitting Key Speed changed\" << QString::number(currKeySpeed);\n        emit keySpeedChanged(currKeySpeed);\n    }\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqCWIO_GET_WPM);\n}\n\nvoid FlrigRigDrv::reqGET_SPLIT()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigProfile.getSplitInfo ) sendXmlRpcCommand(\"rig.get_split\", {}, false);\n}\n\nvoid FlrigRigDrv::rspGET_SPLIT(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << value;\n\n    bool newSplitEnabled = value.toBool();\n\n    qCDebug(runtime) << \"Rig Split:\" << newSplitEnabled;\n    qCDebug(runtime) << \"Object Split:\" << currSplitEnabled;\n\n    if ( newSplitEnabled != currSplitEnabled )\n    {\n        currSplitEnabled = newSplitEnabled;\n        qCDebug(runtime) << \"emitting SPLIT changed\" << currSplitEnabled;\n        emit splitChanged(currSplitEnabled);\n    }\n\n    if ( currSplitEnabled )\n    {\n        // When split is on, also poll TX frequency\n        reqGET_TX_FREQ();\n    }\n    else if ( currTxFreq != 0.0 )\n    {\n        currTxFreq = 0.0;\n    }\n\n    QTimer::singleShot(rigProfile.pollInterval, this, &FlrigRigDrv::reqGET_SPLIT);\n}\n\nvoid FlrigRigDrv::reqGET_TX_FREQ()\n{\n    FCT_IDENTIFICATION;\n\n    sendXmlRpcCommand(\"rig.get_vfoB\", {}, false);\n}\n\nvoid FlrigRigDrv::rspGET_TX_FREQ(const QVariant &value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << value;\n\n    double txFreq = Hz2MHz(value.toLongLong());\n\n    qCDebug(runtime) << \"Rig TX Freq:\" << QSTRING_FREQ(txFreq);\n    qCDebug(runtime) << \"Object TX Freq:\" << QSTRING_FREQ(currTxFreq);\n\n    if ( txFreq != currTxFreq )\n    {\n        currTxFreq = txFreq;\n        qCDebug(runtime) << \"emitting TX FREQ changed\";\n        emit txFrequencyChanged(currTxFreq);\n    }\n}\n\nvoid FlrigRigDrv::resetCurrStates()\n{\n    // clear current values means emiting all params\n    currFreq = 0.0;\n    currTxFreq = 0.0;\n    currSplitEnabled = false;\n    currVFO.clear();\n    currRawMode.clear();\n    currPWR = -1;\n    currBW = -1;\n    currPTT = -1;\n    currKeySpeed = -1;\n}\n\nvoid FlrigRigDrv::handleError(const QString &category, const QString &errorMsg)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << errorMsg;\n\n    if ( !lastErrorText.isEmpty() )\n        return; // only one error message will be reported\n\n    lastErrorText = errorMsg;\n    emit errorOccurred(category, lastErrorText);\n}\n\nvoid FlrigRigDrv::sendXmlRpcCommand(const QString &method, const QList<QVariant> &params, bool emitError)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << method << params << emitError;\n\n    QByteArray data;\n    QXmlStreamWriter writer(&data);\n    writer.writeStartDocument();\n\n    // custom clientid header\n    writer.writeDTD(\"<?clientid=\\\"qlog-client\\\"?>\");\n\n    writer.writeStartElement(\"methodCall\");\n    writer.writeTextElement(\"methodName\", method);\n\n    if (!params.isEmpty())\n    {\n        writer.writeStartElement(\"params\");\n        for (const QVariant &param : params)\n        {\n            writer.writeStartElement(\"param\");\n            writer.writeStartElement(\"value\");\n            switch ( param.type() )\n            {\n                case QVariant::Double:\n                  writer.writeTextElement(\"double\", QString::number(param.toDouble())); break;\n                case QVariant::Int:\n                  writer.writeTextElement(\"i4\", QString::number(param.toInt())); break;\n                default:\n                  writer.writeTextElement(\"string\", param.toString());\n            }\n            writer.writeEndElement(); // value\n            writer.writeEndElement(); // param\n        }\n        writer.writeEndElement(); // params\n    }\n\n    writer.writeEndElement(); // methodCall\n    writer.writeEndDocument();\n\n    QNetworkRequest request(hostUrl);\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"text/xml\");\n    qCDebug(runtime) << data;\n    QNetworkReply *reply = networkManager->post(request, data);\n\n    QTimer *timeoutTimer = new QTimer(this);\n    timeoutTimer->setSingleShot(true);\n    timeoutTimer->start(RESPONSE_TIMEOUT);\n    runningTimers << timeoutTimer;\n\n    connect(timeoutTimer, &QTimer::timeout, this, [this, reply, timeoutTimer, emitError, method]()\n    {\n        qCDebug(runtime) << \"Response timeout detected for\" << method;\n        if ( reply->isRunning() )\n        {\n            reply->abort();\n            reply->deleteLater();\n            if (emitError)\n                handleError(tr(\"Timeout\"), tr(\"FLRig response timeout\"));\n        }\n        timeoutTimer->deleteLater();\n    });\n\n    connect(reply, &QNetworkReply::finished, this, [this, reply, method, timeoutTimer]()\n    {\n        timeoutTimer->stop();\n        timeoutTimer->deleteLater();\n        handleXmlRpcResponse(reply, method);\n        reply->deleteLater();\n    });\n}\n\nQVariantList FlrigRigDrv::parseArray(QXmlStreamReader &reader)\n{\n    FCT_IDENTIFICATION;\n\n    QVariantList list;\n\n    while (!reader.atEnd())\n    {\n        reader.readNext();\n\n        if (reader.isStartElement() && reader.name().toString() == \"value\")\n        {\n            const QVariant &val = parseSingleValue(reader);\n            list << val;\n        }\n\n        if (reader.isEndElement() && reader.name().toString() == \"array\") break;\n    }\n\n    return list;\n}\n\nQVariant FlrigRigDrv::parseSingleValue(QXmlStreamReader &reader)\n{\n    FCT_IDENTIFICATION;\n\n    while (!reader.atEnd())\n    {\n        reader.readNext();\n\n        if ( reader.isStartElement())\n        {\n            const QString &type = reader.name().toString();\n\n            if (type == \"int\" || type == \"i4\")\n                return reader.readElementText().toInt();\n            else if (type == \"double\")\n                return reader.readElementText().toDouble();\n            else if (type == \"string\")\n                return reader.readElementText();\n            else if (type == \"array\")\n                return parseArray(reader);\n            else\n                return reader.readElementText();\n        }\n\n        if (reader.isCharacters())  return reader.text().toString(); // untyped\n\n        if (reader.isEndElement() && reader.name().toString() == \"value\") break;\n    }\n\n    return {};\n}\n\nQVariantMap FlrigRigDrv::parseStruct(QXmlStreamReader &reader)\n{\n    FCT_IDENTIFICATION;\n\n    QVariantMap map;\n    QString currentName;\n\n    while (!reader.atEnd())\n    {\n        reader.readNext();\n\n        if (reader.isStartElement())\n        {\n            if (reader.name().toString() == \"name\")\n                currentName = reader.readElementText();\n            else if (reader.name().toString() == \"value\" && !currentName.isEmpty())\n            {\n                map[currentName] = parseSingleValue(reader);\n                currentName.clear();\n            }\n        }\n\n        if ( reader.isEndElement() && reader.name().toString() == \"struct\") break;\n    }\n    return map;\n}\n\nQVariant FlrigRigDrv::parseValueFromResponse(const QByteArray &xml, bool *ok, QString &errorMessage)\n{\n    FCT_IDENTIFICATION;\n\n    if (ok) *ok = false;\n    errorMessage.clear();\n\n    QXmlStreamReader reader(xml);\n\n    while (!reader.atEnd())\n    {\n        reader.readNext();\n\n        if (reader.isStartElement() && reader.name().toString() == \"value\")\n        {\n            if (ok) *ok = true;\n            return parseSingleValue(reader);\n        }\n\n        if (reader.isStartElement() && reader.name().toString() == \"fault\")\n        {\n            while (!reader.atEnd())\n            {\n                reader.readNext();\n\n                if (reader.isStartElement() && reader.name().toString() == \"value\")\n                {\n                    QVariantMap faultStruct = parseStruct(reader);\n                    if ( faultStruct.contains(\"faultString\"))\n                        errorMessage = faultStruct.value(\"faultString\").toString();\n                    return faultStruct;\n                }\n            }\n        }\n    }\n\n    if (reader.hasError()) errorMessage = reader.errorString();\n\n    return {};\n}\n\nvoid FlrigRigDrv::buildModeMappingHash()\n{\n    FCT_IDENTIFICATION;\n\n    /* Following Modes are used in Flrig source code\n     * git grep \"modes_ =\" | awk '{print $1\" \"$4 }' | while read file var; do  fixed_var=\"v${var::-1}\"; sed -n \"/static const char \\*${fixed_var}/,/};/p\" \"${file::-1}\"; done | grep -oE '\"[^\"]+\"' | tr -d '\"' | sort  -u | paste -sd, -\n     *\n     * A1A,AM,AM-2,AM2.4,AM6.0,AM-D,AM-D1,AM-D2,AM-D3,AM-N,AMN,AM-syn,AM(Sync),AMW,C4FM,CW,CW2.4,CW500,CW-L,CWL,\n     * CW-LSB,CW-N,CWN,CW-NR,CW-R,CW-U,CWU,CW-USB,DATA,DATA2-LSB,DATA-FM,DATA-FMN,DATA-L,DATA-LSB,DATA-R,DATA-U,\n     * DATA-USB,D-FM,DFM,DIG,DIGI,DIGL,DIGU,D-LSB,DRM,DSB,D-USB,DV,DV-R,F1B,FM,FM(1),FM1,FM(2),FM2,FM-D,FM-D1,\n     * FM-D2,FM-D3,FM-M,FM-N,FMN,FM-W,FMW,FSK,FSK-R,H3E,LCW,LSB,LSB-D,LSB-D1,LSB-D2,LSB-D3,NFM,PKT,PKT(FM),\n     * PKT-FM,PKT(L),PKT-L,PKT-U,PSK,PSK-R,RTTY,RTTY(L),RTTY-L,RTTY-R,RTTY(U),RTTY-U,SAH,SAL,SAM,SPEC,UCW,USB,\n     * USB-D,USB-D1,USB-D2,USB-D3,USER-L,USER-U,W-FM,WFM\n     */\n\n    // * Mapping from FLrig Mode to ADIF modes\n    raw2ADIFModeMapping = {\n        { \"A1A\",       { \"CW\",      \"\",     false } },\n        { \"AM\",        { \"AM\",      \"\",     false } },\n        { \"AM-2\",      { \"AM\",      \"\",     false } },\n        { \"AM2.4\",     { \"AM\",      \"\",     false } },\n        { \"AM6.0\",     { \"AM\",      \"\",     false } },\n        { \"AM-D\",      { \"AM\",      \"\",     true  } },\n        { \"AM-D1\",     { \"AM\",      \"\",     true  } },\n        { \"AM-D2\",     { \"AM\",      \"\",     true  } },\n        { \"AM-D3\",     { \"AM\",      \"\",     true  } },\n        { \"AM-N\",      { \"AM\",      \"\",     false } },\n        { \"AMN\",       { \"AM\",      \"\",     false } },\n        { \"AM-syn\",    { \"AM\",      \"\",     false } },\n        { \"AM(Sync)\",  { \"AM\",      \"\",     false } },\n        { \"AMW\",       { \"AM\",      \"\",     false } },\n        { \"C4FM\",      { \"DIGITALVOICE\",    \"C4FM\", true  } },\n        { \"CW\",        { \"CW\",      \"\",     false } },\n        { \"CW2.4\",     { \"CW\",      \"\",     false } },\n        { \"CW500\",     { \"CW\",      \"\",     false } },\n        { \"CW-L\",      { \"CW\",      \"\",     false } },\n        { \"CWL\",       { \"CW\",      \"\",     false } },\n        { \"CW-LSB\",    { \"CW\",      \"\",     false } },\n        { \"CW-N\",      { \"CW\",      \"\",     false } },\n        { \"CWN\",       { \"CW\",      \"\",     false } },\n        { \"CW-NR\",     { \"CW\",      \"\",     false } },\n        { \"CW-R\",      { \"CW\",      \"\",     false } },\n        { \"CW-U\",      { \"CW\",      \"\",     false } },\n        { \"CWU\",       { \"CW\",      \"\",     false } },\n        { \"CW-USB\",    { \"CW\",      \"\",     false } },\n        { \"DATA\",      { \"SSB\",     \"USB\",  true  } },\n        { \"DATA2-LSB\", { \"SSB\",     \"LSB\",  true  } },\n        { \"DATA-FM\",   { \"FM\",      \"\",     true  } },\n        { \"DATA-FMN\",  { \"FM\",      \"\",     true  } },\n        { \"DATA-L\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"DATA-LSB\",  { \"SSB\",     \"LSB\",  true  } },\n        { \"DATA-R\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"DATA-U\",    { \"SSB\",     \"USB\",  true  } },\n        { \"DATA-USB\",  { \"SSB\",     \"USB\",  true  } },\n        { \"D-FM\",      { \"FM\",      \"\",     true  } },\n        { \"DFM\",       { \"FM\",      \"\",     true  } },\n        { \"DIG\",       { \"SSB\",     \"USB\",  true  } },\n        { \"DIGI\",      { \"SSB\",     \"USB\",  true  } },\n        { \"DIGL\",      { \"SSB\",     \"LSB\",  true  } },\n        { \"DIGU\",      { \"SSB\",     \"USB\",  true  } },\n        { \"D-LSB\",     { \"SSB\",     \"LSB\",  true  } },\n      //{ \"DRM\",       { \"DATA\",    \"DRM\",  true  } },\n        { \"DSB\",       { \"SSB\",   \"\",       false } },\n        { \"D-USB\",     { \"SSB\",    \"USB\",   true } },\n        { \"DV\",        { \"DIGITALVOICE\",    \"DSTAR\", true } },\n        { \"DV-R\",      { \"DIGITALVOICE\",    \"DSTAR\", true } },\n        { \"F1B\",       { \"RTTY\",    \"\",     true  } },\n        { \"FM\",        { \"FM\",      \"\",     false } },\n        { \"FM(1)\",     { \"FM\",      \"\",     false } },\n        { \"FM1\",       { \"FM\",      \"\",     false } },\n        { \"FM(2)\",     { \"FM\",      \"\",     false } },\n        { \"FM2\",       { \"FM\",      \"\",     false } },\n        { \"FM-D\",      { \"FM\",      \"\",     true  } },\n        { \"FM-D1\",     { \"FM\",      \"\",     true  } },\n        { \"FM-D2\",     { \"FM\",      \"\",     true  } },\n        { \"FM-D3\",     { \"FM\",      \"\",     true  } },\n        { \"FM-M\",      { \"FM\",      \"\",     false } },\n        { \"FM-N\",      { \"FM\",      \"\",     false } },\n        { \"FMN\",       { \"FM\",      \"\",     false } },\n        { \"FM-W\",      { \"FM\",      \"\",     false } },\n        { \"FMW\",       { \"FM\",      \"\",     false } },\n        { \"FSK\",       { \"RTTY\",    \"\",     true  } },\n        { \"FSK-R\",     { \"RTTY\",    \"\",     true  } },\n        { \"H3E\",       { \"AM\",      \"\",     false } },\n        { \"LCW\",       { \"CW\",      \"\",     false } },\n        { \"LSB\",       { \"SSB\",     \"LSB\",  false } },\n        { \"LSB-D\",     { \"SSB\",     \"LSB\",  true  } },\n        { \"LSB-D1\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"LSB-D2\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"LSB-D3\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"NFM\",       { \"FM\",      \"\",     false } },\n        { \"PKT\",       { \"SSB\",     \"USB\",  true  } },\n        { \"PKT(FM)\",   { \"FM\",      \"\",     true  } },\n        { \"PKT-FM\",    { \"FM\",      \"\",     true  } },\n        { \"PKT(L)\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"PKT-L\",     { \"SSB\",     \"LSB\",  true  } },\n        { \"PKT-U\",     { \"SSB\",     \"USB\",  true  } },\n        { \"PSK\",       { \"RTTY\",    \"\",     true  } },\n        { \"PSK-R\",     { \"RTTY\",    \"\",     true  } },\n        { \"RTTY\",      { \"RTTY\",    \"\",     true  } },\n        { \"RTTY(L)\",   { \"RTTY\",    \"\",     true  } },\n        { \"RTTY-L\",    { \"RTTY\",    \"\",     true  } },\n        { \"RTTY-R\",    { \"RTTY\",    \"\",     true  } },\n        { \"RTTY(U)\",   { \"RTTY\",    \"\",     true  } },\n        { \"RTTY-U\",    { \"RTTY\",    \"\",     true  } },\n     // { \"SAH\",       { \"DATA\",    \"SAH\",  true  } },\n     // { \"SAL\",       { \"DATA\",    \"SAL\",  true  } },\n     // { \"SAM\",       { \"DATA\",    \"SAM\",  true  } },\n     // { \"SPEC\",      { \"DATA\",    \"SPEC\", true  } },\n        { \"UCW\",       { \"CW\",      \"\",     false } },\n        { \"USB\",       { \"SSB\",     \"USB\",  false } },\n        { \"USB-D\",     { \"SSB\",     \"USB\",  true  } },\n        { \"USB-D1\",    { \"SSB\",     \"USB\",  true  } },\n        { \"USB-D2\",    { \"SSB\",     \"USB\",  true  } },\n        { \"USB-D3\",    { \"SSB\",     \"USB\",  true  } },\n        { \"USER-L\",    { \"SSB\",     \"LSB\",  true  } },\n        { \"USER-U\",    { \"SSB\",     \"USB\",  true  } },\n        { \"W-FM\",      { \"FM\",      \"\",     false } },\n        { \"WFM\",       { \"FM\",      \"\",     false } }\n    };\n\n}\n\nvoid FlrigRigDrv::handleXmlRpcResponse(QNetworkReply *reply, const QString &method)\n{\n    FCT_IDENTIFICATION;\n\n    if (reply->error() != QNetworkReply::NoError)\n    {\n        handleError(tr(\"Network Error\"), reply->errorString());\n        return;\n    }\n\n    bool ok = false;\n    QString errorMessage;\n    const QByteArray &rawResp = reply->readAll();\n    QVariant respValue = parseValueFromResponse(rawResp, &ok, errorMessage);\n    qCDebug(runtime) << \"Method:\" << method\n                     << \"Response:\" << respValue\n                     << \"Raw:\" << rawResp;\n    if ( !ok )\n    {\n        handleError(tr(\"Network Error\"), errorMessage);\n        return;\n    }\n\n    FlrigRigDrv::responseHandler handler = responseHandlers.value(method);\n\n    if ( !handler )\n    {\n        qCDebug(runtime) << \"Handler not defined for\" << method;\n        return;\n    }\n\n    (this->*(handler))(respValue);\n}\n\nconst QString FlrigRigDrv::getModeNormalizedText(const QString &rawMode, QString &submode) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    const RigMode &modeInfo = raw2ADIFModeMapping.value(rawMode);\n    qCDebug(runtime) << \"Result\" << modeInfo.mode << modeInfo.submode << modeInfo.digiMode;\n    submode = modeInfo.submode;\n    return modeInfo.mode;\n}\n\nconst QString FlrigRigDrv::mode2RawMode(const QString &mode, const QString &submode, bool digiVariant) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << submode << digiVariant;\n\n    // find a suitable mode from the connected Rig modes\n    for ( auto it = rigAvailableModes.cbegin(); it != rigAvailableModes.cend(); it++ )\n    {\n        qCDebug(runtime) << \"Key:\" << it.key()\n                         << \"Values:\" << it->mode << it->submode << it->digiMode;\n        if ( it->mode == mode && it->submode == submode && it->digiMode == digiVariant )\n            return it.key();\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "rig/drivers/FlrigRigDrv.h",
    "content": "#ifndef RIG_DRIVERS_FLRIGRIGDRV_H\n#define RIG_DRIVERS_FLRIGRIGDRV_H\n\n#include \"GenericRigDrv.h\"\n#include \"rig/RigCaps.h\"\n\nclass FlrigRigDrv : public GenericRigDrv\n{\n    Q_OBJECT\n\npublic:\n    static RigCaps getCaps(int);\n    static QList<QPair<int, QString>> getModelList();\n\n    explicit FlrigRigDrv(const RigProfile &profile,\n                         QObject *parent = nullptr);\n    virtual ~FlrigRigDrv();\n\n    virtual bool open() override;\n    virtual bool isMorseOverCatSupported() override;\n    virtual QStringList getAvailableModes() override;\n\n    virtual void setFrequency(double) override;\n    virtual void setFrequency(VFOID, double) override;\n    virtual void setSplit(bool) override;\n    virtual void setRawMode(const QString &) override;\n    virtual void setMode(const QString &, const QString &, bool) override;\n    virtual void setPTT(bool) override;\n    virtual void setKeySpeed(qint16 wpm) override;\n    virtual void syncKeySpeed(qint16 wpm) override;\n    virtual void sendMorse(const QString &) override;\n    virtual void stopMorse() override;\n    virtual void sendState() override;\n    virtual void stopTimers() override;\n    virtual void sendDXSpot(const DxSpot &spot) override;\n\nprivate slots:\n    void startRigStatePoll();\n    void reqGET_MODES();\n    void reqCWIO_SEND(bool);\n    void reqGET_VFO();\n    void reqGET_MODE();\n    void reqGET_BW();\n    void reqGET_POWER();\n    void reqGET_AB();\n    void reqGET_PTT();\n    void reqCWIO_GET_WPM();\n    void reqGET_SPLIT();\n    void reqGET_TX_FREQ();\n\nprivate:\n    struct RigMode\n    {\n        QString mode;\n        QString submode;\n        bool digiMode;\n    };\n\n    QHash<QString, RigMode> raw2ADIFModeMapping;\n    QHash<QString, RigMode> rigAvailableModes;\n    typedef void (FlrigRigDrv::*responseHandler)(const QVariant&);\n\n    void resetCurrStates();\n    void handleError(const QString &category, const QString &errorMsg);\n    void sendXmlRpcCommand(const QString &method, const QList<QVariant> &params = {},\n                           bool emitError = true);\n    QVariantList parseArray(QXmlStreamReader &reader);\n    QVariant parseSingleValue(QXmlStreamReader &reader);\n    QVariantMap parseStruct(QXmlStreamReader &reader);\n    QVariant parseValueFromResponse(const QByteArray &xml, bool *ok, QString &errorMessage);\n    void buildModeMappingHash();\n    void handleXmlRpcResponse(QNetworkReply *reply, const QString &method);\n    const QString getModeNormalizedText(const QString& rawMode, QString &submode) const;\n    const QString mode2RawMode(const QString &mode, const QString &submode, bool digiVariant) const;\n\n    void rspGET_MODES(const QVariant &value);\n    void rspGET_VFO(const QVariant &value);\n    void rspGET_MODE(const QVariant &value);\n    void rspGET_BW(const QVariant &value);\n    void rspGET_POWER(const QVariant &value);\n    void rspGET_AB(const QVariant &value);\n    void rspGET_PTT(const QVariant &value);\n    void rspCWIO_GET_WPM(const QVariant &value);\n    void rspGET_SPLIT(const QVariant &value);\n    void rspGET_TX_FREQ(const QVariant &value);\n\n    QNetworkAccessManager *networkManager;\n    double currFreq;\n    double currTxFreq;\n    bool currSplitEnabled;\n    QString currVFO;\n    QString currRawMode;\n    qint32 currBW;\n    qint32 currKeySpeed;\n    qlonglong currPWR;\n    char currPTT;\n    bool rigReady;\n    QUrl hostUrl;\n    QList<QTimer*> runningTimers;\n    bool sendTextFlag;\n\n    const QHash<QString, FlrigRigDrv::responseHandler> responseHandlers =\n    {\n        {\"rig.get_modes\", &FlrigRigDrv::rspGET_MODES},\n        {\"rig.get_vfo\", &FlrigRigDrv::rspGET_VFO},\n        {\"rig.get_mode\", &FlrigRigDrv::rspGET_MODE},\n        {\"rig.get_bw\", &FlrigRigDrv::rspGET_BW},\n        {\"rig.get_power\", &FlrigRigDrv::rspGET_POWER},\n        {\"rig.get_AB\", &FlrigRigDrv::rspGET_AB},\n        {\"rig.get_ptt\", &FlrigRigDrv::rspGET_PTT},\n        {\"rig.cwio_get_wpm\", &FlrigRigDrv::rspCWIO_GET_WPM},\n        {\"rig.get_split\", &FlrigRigDrv::rspGET_SPLIT},\n        {\"rig.get_vfoB\", &FlrigRigDrv::rspGET_TX_FREQ}\n    };\n\n    const uint RESPONSE_TIMEOUT = 5000; // in secs\n};\n\n#endif // RIG_DRIVERS_FLRIGRIGDRV_H\n"
  },
  {
    "path": "rig/drivers/GenericRigDrv.cpp",
    "content": "#include \"GenericRigDrv.h\"\n#include \"core/debug.h\"\n\n\nMODULE_IDENTIFICATION(\"qlog.core.rig.driver.genericrigdrv\");\n\nGenericRigDrv::GenericRigDrv(const RigProfile &profile, QObject *parent)\n    : QObject{parent},\n      rigProfile(profile),\n      opened(false)\n{\n    FCT_IDENTIFICATION;\n\n}\n\nconst RigProfile GenericRigDrv::getCurrRigProfile() const\n{\n    FCT_IDENTIFICATION;\n\n    return rigProfile;\n}\n\nconst QString GenericRigDrv::lastError() const\n{\n    FCT_IDENTIFICATION;\n\n    return lastErrorText;\n}\n\nvoid GenericRigDrv::setFrequency(VFOID vfoid, double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << freq;\n\n    // Default: VFO1 delegates to the single-frequency setter, VFO2 is ignored\n    if ( vfoid == VFO1 )\n        setFrequency(freq);\n}\n\nvoid GenericRigDrv::setSplit(bool)\n{\n    FCT_IDENTIFICATION;\n\n    // Default: do nothing — driver does not support split\n}\n"
  },
  {
    "path": "rig/drivers/GenericRigDrv.h",
    "content": "#ifndef RIG_DRIVERS_GENERICRIGDRV_H\n#define RIG_DRIVERS_GENERICRIGDRV_H\n\n#include <QObject>\n#include \"data/RigProfile.h\"\n#include \"data/DxSpot.h\"\n\nenum VFOID\n{\n    VFO1 = 0,\n    VFO2 = 1\n};\n\nQ_DECLARE_METATYPE(VFOID)\n\nclass GenericRigDrv : public QObject\n{\n    Q_OBJECT\npublic:\n\n    explicit GenericRigDrv(const RigProfile &profile,\n                        QObject *parent = nullptr);\n    virtual ~GenericRigDrv() {};\n    const RigProfile getCurrRigProfile() const;\n    const QString lastError() const;\n\n    virtual bool open() = 0;\n    virtual bool isMorseOverCatSupported() = 0;\n    virtual QStringList getAvailableModes() = 0;\n\n    virtual void setFrequency(double) = 0;\n    virtual void setFrequency(VFOID, double);\n    virtual void setSplit(bool);\n    virtual void setRawMode(const QString &) = 0;\n    virtual void setMode(const QString &, const QString &, bool) = 0;\n    virtual void setPTT(bool) = 0;\n    virtual void setKeySpeed(qint16 wpm) = 0;\n    virtual void syncKeySpeed(qint16 wpm) = 0;\n    virtual void sendMorse(const QString &) = 0;\n    virtual void stopMorse() = 0;\n    virtual void sendState() = 0;\n    virtual void stopTimers() = 0;\n    virtual void sendDXSpot(const DxSpot &spot) = 0;\n\nsignals:\n    // STATE Signals\n    void rigIsReady();\n    void frequencyChanged(double, double, double);\n    void txFrequencyChanged(double);\n    void splitChanged(bool);\n    void pttChanged(bool);\n    void modeChanged(QString, QString, QString, qint32);\n    void vfoChanged(QString);\n    void powerChanged(double);\n    void ritChanged(double);\n    void xitChanged(double);\n    void keySpeedChanged(unsigned int);\n\n    // Error Signal\n    void errorOccurred(QString, QString);\n\nprotected:\n    RigProfile rigProfile;\n    QString lastErrorText;\n    bool opened;\n};\n\n#endif // RIG_DRIVERS_GENERICRIGDRV_H\n"
  },
  {
    "path": "rig/drivers/HamlibRigDrv.cpp",
    "content": "#include <QtGlobal>\n\n#include <QRegularExpression>\n#include \"HamlibRigDrv.h\"\n#include \"core/debug.h\"\n#include \"rig/macros.h\"\n#include \"data/SerialPort.h\"\n#include \"data/Data.h\"\n\n#ifndef HAMLIB_FILPATHLEN\n#define HAMLIB_FILPATHLEN FILPATHLEN\n#endif\n\n#ifndef RIG_IS_SOFT_ERRCODE\n#define RIG_IS_SOFT_ERRCODE(errcode) (errcode == RIG_EINVAL || errcode == RIG_ENIMPL || errcode == RIG_ERJCTED \\\n    || errcode == RIG_ETRUNC || errcode == RIG_ENAVAIL || errcode == RIG_ENTARGET \\\n    || errcode == RIG_EVFO || errcode == RIG_EDOM)\n\n#endif\n\n// macro introduced hamlib 4.6\n#ifndef PTTPORT\n#define PTTPORT(r) (&r->state.pttport)\n#endif\n\nint HamlibRigDrv::RIGCTLD_MODEL = RIG_MODEL_NETRIGCTL;\nint HamlibRigDrv::DUMMY_MODEL = RIG_MODEL_DUMMY;\n\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Drv mutex\"; \\\n                        QMutexLocker locker(&drvLock); \\\n                        qCDebug(runtime) << \"Using Drv\"\n\nMODULE_IDENTIFICATION(\"qlog.rig.driver.hamlibdrv\");\nQList<QPair<int, QString>> HamlibRigDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    rig_load_all_backends();\n\n#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 2  )\n    rig_list_foreach_model(addRig, &ret);\n#else\n    rig_list_foreach(addRig, &ret);\n#endif\n\n    return ret;\n}\n\nQList<QPair<QString, QString> > HamlibRigDrv::getPTTTypeList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<QString, QString>> ret;\n\n    ret << QPair<QString, QString>(\"None\", tr(\"None\"))\n        << QPair<QString, QString>(\"RIG\", tr(\"CAT\"))\n        << QPair<QString, QString>(\"DTR\", tr(\"DTR\"))\n        << QPair<QString, QString>(\"RTS\", tr(\"RTS\"));\n\n    return ret;\n}\n\n#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 2  )\nint HamlibRigDrv::addRig (const rig_model_t rigModel, void *data)\n{\n    QList<QPair<int, QString>> *list = static_cast<QList<QPair<int, QString>>*>(data);\n\n    QString name = QString(\"%1 %2 (%3)\").arg(QString::fromLatin1(rig_get_caps_cptr(rigModel, RIG_CAPS_MFG_NAME_CPTR)).trimmed(),\n                                             QString::fromLatin1(rig_get_caps_cptr(rigModel, RIG_CAPS_MODEL_NAME_CPTR)).trimmed(),\n                                             QString::fromLatin1(rig_get_caps_cptr(rigModel, RIG_CAPS_VERSION_CPTR)).trimmed());\n\n    list->append(QPair<int, QString>(rigModel, name));\n    return -1;\n}\n#else\nint HamlibRigDrv::addRig(const rig_caps *caps, void* data)\n{\n    QList<QPair<int, QString>> *list = static_cast<QList<QPair<int, QString>>*>(data);\n\n    QString name = QString(\"%1 %2 (%3)\").arg(caps->mfg_name,\n                                             caps->model_name,\n                                             caps->version);\n\n    list->append(QPair<int, QString>(caps->rig_model, name));\n    return -1;\n}\n#endif\n\nRigCaps HamlibRigDrv::getCaps(int model)\n{\n    FCT_IDENTIFICATION;\n\n    const struct rig_caps *caps = rig_get_caps(model);\n    RigCaps ret;\n\n    ret.isNetworkOnly = (model == RIG_MODEL_NETRIGCTL);\n    ret.needPolling = true;\n\n    if ( caps )\n    {\n        ret.canGetFreq = ( caps->get_freq );\n        ret.canGetMode = ( caps->get_mode );\n        ret.canGetVFO =  ( caps->get_vfo );\n        ret.canGetPWR = (((caps->has_get_level) & (RIG_LEVEL_RFPOWER)) && caps->power2mW );\n        ret.canGetRIT = ( caps->get_rit && ((caps->has_get_func) & (RIG_FUNC_RIT)) );\n        ret.canGetXIT = ( caps->get_xit && ((caps->has_get_func) & (RIG_FUNC_XIT)) );\n        ret.canGetKeySpeed = ( ((caps->has_get_level) & (RIG_LEVEL_KEYSPD)) );\n\n        ret.canGetPTT = ( caps->get_ptt );\n        ret.canSendMorse = ( caps->send_morse != nullptr );\n        ret.canProcessDXSpot = isSmartSDRSlice(caps);\n        ret.isCIVAddrSupported = isCIVAddrRig(caps);\n        ret.canGetSplit = ( caps->get_split_vfo && caps->get_split_freq );\n\n        if ( ret.isNetworkOnly )\n        {\n#if ( HAMLIBVERSION_MAJOR == 4 && ( HAMLIBVERSION_MINOR == 2 || HAMLIBVERSION_MINOR == 3 ) )\n         /* due to a hamlib issue #855 (https://github.com/Hamlib/Hamlib/issues/855)\n         * the PWR will be disabled for 4.2.x and 4.3.x for NETRIG\n         */\n            ret.canGetPWR = false;\n#else\n            // this feature is known after connection to RIG what is too late for QLog, Let's try to enable it.\n            ret.canGetPWR = true;\n            ret.canGetRIT = true;\n            ret.canGetXIT = true;\n            ret.canGetKeySpeed = true;\n#endif\n        }\n\n        ret.serialDataBits = caps->serial_data_bits;\n        ret.serialStopBits = caps->serial_stop_bits;\n    }\n    return ret;\n}\n\nHamlibRigDrv::HamlibRigDrv(const RigProfile &profile,\n                           QObject *parent)\n    : GenericRigDrv(profile, parent),\n      rig(nullptr),\n      SmartSDRSpotCounter(0),\n      forceSendState(false),\n      currPTT(false),\n      currFreq(Hz(0)),\n      currPBWidth(Hz(0)),\n      currModeId(RIG_MODE_NONE),\n      currVFO(RIG_VFO_NONE),\n      currPWR(0),\n      currRIT(0.0),\n      currXIT(0.0),\n      keySpeed(0),\n      morseOverCatSupported(false),\n      currSplitEnabled(false),\n      futureSplit(false),\n      currTxFreq(Hz(0))\n{\n    FCT_IDENTIFICATION;\n\n    rig_load_all_backends();\n    rig = rig_init(rigProfile.model);\n\n    if ( !rig )\n    {\n        // initialization failed\n        qCDebug(runtime) << \"Cannot allocate Rig structure\";\n        lastErrorText = tr(\"Initialization Error\");\n    }\n\n    rig_set_debug(RIG_DEBUG_BUG);\n\n    connect(&errorTimer, &QTimer::timeout,\n            this, &HamlibRigDrv::checkErrorCounter);    \n}\n\nHamlibRigDrv::~HamlibRigDrv()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        // better to make a memory leak\n        return;\n    }\n\n    if ( rig )\n    {\n        rig_close(rig);\n        rig_cleanup(rig);\n        rig = nullptr;\n    }\n    drvLock.unlock();\n}\n\nbool HamlibRigDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        // initialization failed\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Rig is not initialized\";\n        return false;\n    }\n\n    RigProfile::rigPortType portType = rigProfile.getPortType();\n\n    if ( portType == RigProfile::NETWORK_ATTACHED )\n    {\n        //handling Network Radio\n        const QString portString = rigProfile.hostname + \":\" + QString::number(rigProfile.netport);\n        strncpy(rig->state.rigport.pathname, portString.toLocal8Bit().constData(), HAMLIB_FILPATHLEN - 1);\n    }\n    else if ( portType == RigProfile::SERIAL_ATTACHED )\n    {\n        //handling Serial Port Radio\n        strncpy(rig->state.rigport.pathname, rigProfile.portPath.toLocal8Bit().constData(), HAMLIB_FILPATHLEN - 1);\n        rig->state.rigport.parm.serial.rate = rigProfile.baudrate;\n        rig->state.rigport.parm.serial.data_bits = rigProfile.databits;\n        rig->state.rigport.parm.serial.stop_bits = rigProfile.stopbits;\n        rig->state.rigport.parm.serial.handshake = stringToHamlibFlowControl(rigProfile.flowcontrol);\n        rig->state.rigport.parm.serial.parity = stringToHamlibParity(rigProfile.parity);\n        rig->state.rigport.parm.serial.dtr_state = stringToHamlibSerialSignal(rigProfile.dtr);\n        rig->state.rigport.parm.serial.rts_state = stringToHamlibSerialSignal(rigProfile.rts);\n\n        qCDebug(runtime) << \"Using PTT Type\" << rigProfile.pttType.toLocal8Bit().constData()\n                         << \"PTT Path\" << rigProfile.pttPortPath;\n\n        if ( !rigProfile.pttPortPath.isEmpty() )\n        {\n            strncpy(PTTPORT(rig)->pathname, rigProfile.pttPortPath.toLocal8Bit().constData(), HAMLIB_FILPATHLEN - 1);\n        }\n\n        if ( rig_set_conf(rig, rig_token_lookup(rig, \"ptt_type\"), rigProfile.pttType.toLocal8Bit().constData()) != RIG_OK )\n        {\n            lastErrorText = tr(\"Cannot set PTT Type\");\n            qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n            return false;\n        }\n\n        if ( rig_set_conf(rig, rig_token_lookup(rig, \"ptt_share\"), \"1\") != RIG_OK )\n        {\n            lastErrorText = tr(\"Cannot set PTT Share\");\n            qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n            return false;\n        }\n\n        if ( rigProfile.civAddr >= 0 )\n        {\n            const QString civAddrString = QString::number(rigProfile.civAddr);\n            const QString civAddrHexString = QString::number(rigProfile.civAddr, 16);\n\n            qCDebug(runtime) << \"Setting CIV Addr to\" << civAddrString << \"0x\" + civAddrHexString;\n            if ( rig_set_conf(rig, rig_token_lookup(rig, \"civaddr\"), civAddrString.toUtf8().constData()) != RIG_OK )\n            {\n                lastErrorText = tr(\"Cannot set CIV Addr\") + \" 0x\" + civAddrHexString;\n                qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n                return false;\n            }\n        }\n    }\n    else\n    {\n        lastErrorText = tr(\"Unsupported Rig Driver\");\n        qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n        return false;\n    }\n\n    if ( rig_set_conf(rig, rig_token_lookup(rig, \"auto_power_on\"), \"1\") != RIG_OK )\n    {\n        lastErrorText = tr(\"Cannot set auto_power_on\");\n        qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n        // return false; ignore the error - no critical\n    }\n#if 0\n    if ( rig_set_conf(rig, rig_token_lookup(rig, \"no_xchg\"), \"1\") != RIG_OK )\n    {\n        lastErrorText = tr(\"Cannot set no_xchg to 1\");\n        qCDebug(runtime) << \"Rig Open Error\" << lastErrorText;\n        // return false; ignore the error - no critical\n    }\n#endif\n    int status = rig_open(rig);\n\n    if ( !isRigRespOK(status, tr(\"Rig Open Error\"), false) )\n        return false;\n\n    qCDebug(runtime) << \"Rig Open - OK\";\n\n    opened = true;\n    currRIT = MHz(rigProfile.ritOffset);\n    currXIT = MHz(rigProfile.xitOffset);\n    morseOverCatSupported = ( rig->caps->send_morse != nullptr );\n\n    rmode_t localRigModes = RIG_MODE_NONE;\n    localRigModes = static_cast<rmode_t>(rig->state.mode_list); // static_cast is due to the old Hamlib versions\n                                                                // where mode_list is defined as INT\n    /* hamlib 3.x and 4.x are very different - workaround */\n    for ( unsigned char i = 0; i < (sizeof(rmode_t)*8)-1; i++ )\n    {\n        /* hamlib 3.x and 4.x are very different - workaround */\n        const char *ms = rig_strrmode(static_cast<rmode_t>(localRigModes & rig_idx2setting(i)));\n\n        if (!ms || !ms[0]) continue;\n\n        qCDebug(runtime) << \"Supported Mode :\" << ms;\n        modeList.append(QString(ms));\n    }\n\n    connect(&timer, &QTimer::timeout, this, &HamlibRigDrv::checkRigStateChange);\n    timer.start(rigProfile.pollInterval);\n    emit rigIsReady();\n    return true;\n}\n\nbool HamlibRigDrv::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    return morseOverCatSupported;\n}\n\nQStringList HamlibRigDrv::getAvailableModes()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    return modeList;\n}\n\nvfo_t HamlibRigDrv::getTxVfo() const\n{\n    FCT_IDENTIFICATION;\n\n    // TX VFO is always B/SUB — setSplit() forces RX to A/MAIN before\n    // enabling split, so we always know where TX lives.\n    vfo_t txVfo = (rig->state.vfo_list & RIG_VFO_B) ? RIG_VFO_B : RIG_VFO_SUB;\n\n    qCDebug(runtime) << \"txVfo:\" << hamlibVFO2String(txVfo);\n\n    return txVfo;\n}\n\nvoid HamlibRigDrv::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    setFrequency(VFO1, newFreq);\n}\n\nvoid HamlibRigDrv::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << newFreq;\n\n    if ( !rigProfile.getFreqInfo )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( vfoid == VFO1 && newFreq == currFreq )\n        return;\n\n    if ( vfoid == VFO2 && newFreq == currTxFreq )\n        return;\n\n    if ( vfoid == VFO2 )\n    {\n        int status = rig_set_freq(rig, RIG_VFO_TX, newFreq);\n        isRigRespOK(status, tr(\"Set TX Frequency Error\"), false);\n    }\n    else\n    {\n        int status = rig_set_freq(rig, RIG_VFO_CURR, newFreq);\n        isRigRespOK(status, tr(\"Set Frequency Error\"), false);\n    }\n\n    commandSleep();\n}\n\nvoid HamlibRigDrv::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    if ( !rigProfile.getSplitInfo )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    // Force RX to A/MAIN before enabling split — this guarantees\n    // a known VFO state regardless of rig's get_vfo support.\n    // Same strategy as WSJT-X (HamlibTransceiver::do_start).\n    if ( enabled )\n    {\n        vfo_t rxVfo = (rig->state.vfo_list & RIG_VFO_A) ? RIG_VFO_A : RIG_VFO_MAIN;\n        int rcVfo = rig_set_vfo(rig, rxVfo);\n        qCDebug(runtime) << \"Forced RX VFO to\" << hamlibVFO2String(rxVfo)\n                         << \"result:\" << rcVfo;\n        commandSleep();\n    }\n\n    vfo_t txVfo = getTxVfo();\n    split_t splitVal = enabled ? RIG_SPLIT_ON : RIG_SPLIT_OFF;\n    int status = rig_set_split_vfo(rig, RIG_VFO_TX, splitVal, txVfo);\n    isRigRespOK(status, tr(\"Set Split Error\"), false);\n    futureSplit = (status == RIG_OK && enabled);\n\n    commandSleep();\n}\n\nvoid HamlibRigDrv::setRawMode(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( !rigProfile.getModeInfo )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    __setMode(rig_parse_mode(rawMode.toLatin1()));\n}\n\nvoid HamlibRigDrv::setMode(const QString &mode, const QString &subMode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode << digiVariant;\n    QString innerSubmode(subMode);\n\n    if ( digiVariant\n        && (innerSubmode == \"USB\" || innerSubmode == \"LSB\")\n        && modeList.contains(\"PKT\" + subMode) )\n        innerSubmode.prepend(\"PKT\");\n\n    setRawMode((innerSubmode.isEmpty()) ? mode : innerSubmode);\n}\n\nvoid HamlibRigDrv::__setMode(rmode_t newModeID)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newModeID != RIG_MODE_NONE\n         && newModeID != currModeId )\n    {\n        int status = rig_set_mode(rig, RIG_VFO_CURR, newModeID, RIG_PASSBAND_NOCHANGE);\n        isRigRespOK(status, tr(\"Set Mode Error\"), false);\n        commandSleep();\n    }\n\n#if 0 // SPLIT MODE\n    // sync Split VFO mode\n\n    // The information about the split change may not\n    // have arrived yet, but the VFO can now be set.\n    // That's why futureSplit was used\n    if ( futureSplit )\n    {\n        // There muse be VFO_B otherwise it does not work on 4.5.x. RIG_VFO_TX does not work too.\n        // But no problem because primary is switched to VFOA\n        int status = rig_set_split_mode(rig, RIG_VFO_B, newModeID, RIG_PASSBAND_NOCHANGE);\n        isRigRespOK(status, tr(\"Set Split Mode Error\"), false);\n        commandSleep();\n    }\n#endif\n}\n\nvoid HamlibRigDrv::setPTT(bool newPTTState)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newPTTState;\n\n    if ( !rigProfile.getPTTInfo || PTTPORT(rig)->type.ptt == RIG_PTT_NONE )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    int status = rig_set_ptt(rig, RIG_VFO_CURR, (newPTTState ? RIG_PTT_ON : RIG_PTT_OFF));\n    isRigRespOK(status, tr(\"Set PTT Error\"), false);\n\n    // wait a moment because Rigs are slow and they are not possible to set and get\n    // mode so quickly\n    commandSleep();\n}\n\nvoid HamlibRigDrv::setKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !rigProfile.getKeySpeed )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    __setKeySpeed(wpm);\n}\n\nvoid HamlibRigDrv::syncKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !rigProfile.keySpeedSync )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    __setKeySpeed(wpm);\n}\n\nvoid HamlibRigDrv::sendMorse(const QString &text)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << text;\n\n    QString chpString(text);\n    chpString.remove(\"\\n\");\n\n    if ( chpString.isEmpty() )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    int status = rig_send_morse(rig, RIG_VFO_CURR, chpString.toLocal8Bit().constData());\n    isRigRespOK(status, tr(\"Cannot sent Morse\"), false);\n\n    commandSleep();\n}\n\nvoid HamlibRigDrv::stopMorse()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n#if (HAMLIBVERSION_MAJOR >= 4)\n    int status = rig_stop_morse(rig, RIG_VFO_CURR);\n    isRigRespOK(status, tr(\"Cannot stop Morse\"), false);\n#endif\n    commandSleep();\n}\n\nvoid HamlibRigDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    forceSendState = true;\n}\n\nvoid HamlibRigDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    timer.stop();\n    errorTimer.stop();\n}\n\nvoid HamlibRigDrv::sendDXSpot(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    if ( currFreq == 0 ) return; // empty DXSpot;\n\n    if ( !rig || !opened )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( isSmartSDRSlice(rig->caps) )\n    {\n#if (HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 5 )\n        const QString freqStr = QString::number(spot.freq, 'f', 3);\n        const QString call = spot.callsign.trimmed().toUpper();\n        const QColor spotColor = Data::statusToColor(spot.status, spot.dupeCount, QColor(187,194,195));\n\n        const QString command = QString(\"C%1|spot add rx_freq=%2 callsign=%3 color=%4 source=QLog timestamp=%5 lifetime_seconds=300 priority=4\\n\")\n                              .arg(++SmartSDRSpotCounter)\n                              .arg(freqStr)\n                              .arg(call)\n                              .arg(spotColor.name(QColor::HexArgb).toUpper())\n                              .arg(spot.dateTime.toSecsSinceEpoch());\n\n\n        qCDebug(runtime) << \"Sending DX Spot command:\" << command;\n\n        QByteArray cmdBytes = command.toUtf8();\n        unsigned char terminator = '\\n';\n        const unsigned char* dataPtr = reinterpret_cast<const unsigned char*>(cmdBytes.constData());\n\n        int status = rig_send_raw(\n            rig,\n            dataPtr,\n            cmdBytes.length(),\n            nullptr,\n            0,\n            &terminator\n            );\n\n        if (status != RIG_OK)\n        {\n            qCDebug(runtime) << \"rig_send_raw failed:\" << status;\n            qCDebug(runtime) << hamlibErrorString(status);\n        }\n#else\n        qCWarning(runtime) << \"Hamlib version does not support rig_send_raw. DX Spot not sent.\";\n#endif\n    }\n}\n\n\nvoid HamlibRigDrv::checkChanges()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !checkFreqChange() )\n        return;\n\n    checkPTTChange();\n\n    if ( !checkModeChange() )\n        return;\n\n    checkVFOChange();\n    checkSplitChange();\n    checkPWRChange();\n    checkRITChange();\n    checkXITChange();\n    checkKeySpeedChange();\n}\n\nvoid HamlibRigDrv::checkRigStateChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        return;\n    }\n\n    qCDebug(runtime) << \"Getting Rig state\";\n\n    checkChanges();\n\n    forceSendState = false;\n\n    // restart timer\n    timer.start(rigProfile.pollInterval);\n    drvLock.unlock();\n}\n\nvoid HamlibRigDrv::checkErrorCounter()\n{\n    FCT_IDENTIFICATION;\n\n    if ( postponedErrors.isEmpty() )\n        return;\n\n    qCDebug(runtime) << postponedErrors;\n\n    // emit only one error\n    auto it = postponedErrors.constBegin();\n    emit errorOccurred(it.key(), it.value());\n    postponedErrors.clear();\n}\n\nvoid HamlibRigDrv::checkPTTChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getPTTInfo\n         && rig->caps->get_ptt\n         && ( rig->caps->ptt_type == RIG_PTT_RIG\n              || rig->caps->ptt_type == RIG_PTT_RIG_MICDATA)\n       )\n    {\n        ptt_t pttHamlib;\n        int status = rig_get_ptt(rig, RIG_VFO_CURR, &pttHamlib);\n\n        if ( isRigRespOK(status, tr(\"Get PTT Error\"), false) )\n        {\n            bool ptt = ( pttHamlib == RIG_PTT_OFF ) ? false : true;\n\n            qCDebug(runtime) << \"Rig PTT:\"<< ptt;\n            qCDebug(runtime) << \"Object PTT:\"<< currPTT;\n\n            if ( ptt != currPTT || forceSendState )\n            {\n                currPTT = ptt;\n                qCDebug(runtime) << \"emitting PTT changed\" << currPTT;\n                emit pttChanged(currPTT);\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get PTT is disabled\";\n}\n\nbool HamlibRigDrv::checkFreqChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( rigProfile.getFreqInfo\n         && rig->caps->get_freq )\n    {\n        freq_t vfo_freq;\n        int status = rig_get_freq(rig, RIG_VFO_CURR, &vfo_freq);\n\n        if ( isRigRespOK(status, tr(\"Get Frequency Error\")) )\n        {\n            qCDebug(runtime) << \"Rig Freq: \"<< QSTRING_FREQ(Hz2MHz(vfo_freq));\n            qCDebug(runtime) << \"Object Freq: \"<< QSTRING_FREQ(Hz2MHz(currFreq));\n\n            if ( vfo_freq != currFreq || forceSendState )\n            {\n                currFreq = vfo_freq;\n                qCDebug(runtime) << \"emitting FREQ changed\";\n                emit frequencyChanged(Hz2MHz(currFreq),\n                                      Hz2MHz(getRITFreq()),\n                                      Hz2MHz(getXITFreq()));\n            }\n        }\n        else\n            return false;\n    }\n    else\n        qCDebug(runtime) << \"Get Freq is disabled\";\n\n    return true;\n}\n\nbool HamlibRigDrv::checkModeChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( rigProfile.getModeInfo\n         && rig->caps->get_mode )\n    {\n        pbwidth_t pbwidth;\n        rmode_t curr_modeId;\n        /*\n         * #999\n         * This is a workaround for Yaesu FTDx10 to work properly.\n         */\n        vfo_t modeVFO = ( rigProfile.model == RIG_MODEL_FTDX10 ) ? RIG_VFO_NONE : RIG_VFO_CURR;\n\n        int status = rig_get_mode(rig, modeVFO, &curr_modeId, &pbwidth);\n\n        if ( isRigRespOK(status, tr(\"Get Mode Error\")) )\n        {\n            qCDebug(runtime) << \"Rig Mode: \"<< curr_modeId << \"Rig Filter: \"<< pbwidth;\n            qCDebug(runtime) << \"Object Mode: \"<< currModeId << \"Object Filter:\" << currPBWidth;\n\n            if ( curr_modeId != currModeId\n                 || ( pbwidth != RIG_PASSBAND_NOCHANGE && pbwidth != currPBWidth )\n                 || forceSendState )\n            {\n                // mode change\n                currModeId = curr_modeId;\n                currPBWidth = pbwidth;\n\n                QString submode;\n                const QString mode = getModeNormalizedText(currModeId, submode);\n                const QString &rawModeText = hamlibMode2String(currModeId);\n\n                qCDebug(runtime) << \"emitting MODE changed\" << rawModeText << mode << submode << currPBWidth;\n                emit modeChanged(rawModeText,\n                                 mode, submode,\n                                 currPBWidth);\n            }\n        }\n        else\n            return false;\n    }\n    else\n        qCDebug(runtime) << \"Get Mode is disabled\";\n\n    return true;\n}\n\nvoid HamlibRigDrv::checkVFOChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getVFOInfo\n         && rig->caps->get_vfo )\n    {\n        vfo_t curr_vfo;\n\n        int status = rig_get_vfo(rig, &curr_vfo);\n\n        if ( isRigRespOK(status, tr(\"Get VFO Error\"), false) )\n        {\n            qCDebug(runtime) << \"Rig VFO: \"<< curr_vfo;\n            qCDebug(runtime) << \"Object VFO: \"<< currVFO;\n\n            if ( curr_vfo != currVFO || forceSendState )\n            {\n                currVFO = curr_vfo;\n                const QString rawVFOText = hamlibVFO2String(currVFO);\n\n                qCDebug(runtime) << \"emitting VFO changed\" << rawVFOText;\n                emit vfoChanged(rawVFOText);\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get VFO is disabled\";\n}\n\nvoid HamlibRigDrv::checkPWRChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getPWRInfo\n         && rig_has_get_level(rig, RIG_LEVEL_RFPOWER)\n         && rig->caps->power2mW )\n    {\n        value_t rigPowerLevel;\n        unsigned int rigPower;\n\n        int status = rig_get_level(rig, RIG_VFO_CURR, RIG_LEVEL_RFPOWER, &rigPowerLevel);\n\n        if ( isRigRespOK(status, tr(\"Get PWR Error\"), false) )\n        {\n            status = rig_power2mW(rig, &rigPower, rigPowerLevel.f, currFreq, currModeId);\n\n            if (  isRigRespOK(status, tr(\"Get PWR (power2mw) Error\"), false) )\n            {\n                qCDebug(runtime) << \"Rig PWR: \"<< rigPower;\n                qCDebug(runtime) << \"Object PWR: \"<< currPWR;\n\n                if ( rigPower != currPWR || forceSendState )\n                {\n                    currPWR = rigPower;\n\n                    qCDebug(runtime) << \"emitting PWR changed \" << mW2W(currPWR);\n                    emit powerChanged(mW2W(currPWR));\n                }\n            }\n        }   \n    }\n    else\n        qCDebug(runtime) << \"Get PWR is disabled\";\n}\n\nvoid HamlibRigDrv::checkRITChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getRITInfo\n         && rig->caps->get_rit\n         && rig_has_get_func(rig, RIG_FUNC_RIT) )\n    {\n        int ritStatus;\n        shortfreq_t rit = s_Hz(0);\n\n        int status = rig_get_func(rig, RIG_VFO_CURR, RIG_FUNC_RIT, &ritStatus);\n\n        if (  isRigRespOK(status, tr(\"Get RIT Function Error\"), false) )\n        {\n            if ( ritStatus )\n            {\n                /* RIT is on */\n                status = rig_get_rit(rig, RIG_VFO_CURR, &rit);\n                if ( !isRigRespOK(status, tr(\"Get RIT Error\"), false) )\n                    rit = s_Hz(0);\n            }\n            else\n            {\n                /* RIT is off */\n                rit = s_Hz(0);\n            }\n\n            qCDebug(runtime) << \"Rig RIT:\"<< rit << \"Rig RIT Status:\" << ritStatus;\n            qCDebug(runtime) << \"Object RIT: \"<< currRIT;\n\n            if ( static_cast<double>(rit) != currRIT || forceSendState )\n            {\n                currRIT = static_cast<double>(rit);\n\n                qCDebug(runtime) << \"emitting RIT changed\" << QSTRING_FREQ(Hz2MHz(currRIT));\n                qCDebug(runtime) << \"emitting FREQ changed \" << QSTRING_FREQ(Hz2MHz(currFreq))\n                                                             << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                                                             << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n\n                emit ritChanged(Hz2MHz(currRIT));\n                emit frequencyChanged(Hz2MHz(currFreq),\n                                      Hz2MHz(getRITFreq()),\n                                      Hz2MHz(getXITFreq()));\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get RIT is disabled\";\n}\n\nvoid HamlibRigDrv::checkXITChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getXITInfo\n         && rig->caps->get_xit\n         && rig_has_get_func(rig, RIG_FUNC_XIT) )\n    {\n        int xitStatus;\n        shortfreq_t xit = s_Hz(0);\n\n        int status = rig_get_func(rig, RIG_VFO_CURR, RIG_FUNC_XIT, &xitStatus);\n\n        if ( isRigRespOK(status, tr(\"Get XIT Function Error\"), false) )\n        {\n            if ( xitStatus )\n            {\n                /* XIT is on */\n                status = rig_get_xit(rig, RIG_VFO_CURR, &xit);\n                if ( !isRigRespOK(status, tr(\"Get XIT Error\"), false) )\n                    xit = s_Hz(0);\n            }\n            else\n            {\n                /* XIT is off */\n                xit = s_Hz(0);\n            }\n\n            qCDebug(runtime) << \"RIG XIT: \"<< xit << \"Rig XIT Status:\" << xitStatus;;\n            qCDebug(runtime) << \"Object XIT: \"<< currXIT;\n\n            if ( static_cast<double>(xit) != currXIT || forceSendState )\n            {\n                currXIT = static_cast<double>(xit);\n\n                qCDebug(runtime) << \"emitting XIT changed\" << QSTRING_FREQ(Hz2MHz(currXIT));\n                qCDebug(runtime) << \"emitting FREQ changed \" << QSTRING_FREQ(Hz2MHz(currFreq))\n                                                             << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                                                             << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n\n                emit xitChanged(Hz2MHz(currXIT));\n                emit frequencyChanged(Hz2MHz(currFreq),\n                                      Hz2MHz(getRITFreq()),\n                                      Hz2MHz(getXITFreq()));\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get XIT is disabled\";\n}\n\nvoid HamlibRigDrv::checkSplitChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( !rigProfile.getSplitInfo )\n    {\n        qCDebug(runtime) << \"Get SPLIT is disabled\";\n        return;\n    }\n\n    split_t splitStatus = RIG_SPLIT_OFF;\n    vfo_t splitVfo = RIG_VFO_NONE;\n\n    int status = rig_get_split_vfo(rig, RIG_VFO_CURR, &splitStatus, &splitVfo);\n\n    if ( !isRigRespOK(status, tr(\"Get Split Error\"), false) )\n    {\n        qCDebug(runtime) << \"Get Split is not supported or failed\";\n        return;\n    }\n\n    bool newSplitEnabled = (splitStatus == RIG_SPLIT_ON);\n\n    qCDebug(runtime) << \"Rig Split:\" << newSplitEnabled << \"Split VFO:\" << splitVfo;\n    qCDebug(runtime) << \"Object Split:\" << currSplitEnabled;\n\n    if ( newSplitEnabled != currSplitEnabled || forceSendState )\n    {\n        currSplitEnabled = newSplitEnabled;\n        futureSplit = newSplitEnabled;\n\n        qCDebug(runtime) << \"emitting SPLIT changed\" << currSplitEnabled;\n        emit splitChanged(currSplitEnabled);\n    }\n\n    if ( currSplitEnabled )\n    {\n        // Use rig_get_split_freq instead of rig_get_freq(RIG_VFO_TX).\n        // On rigs without get_vfo (e.g. Icom), rig_get_split_vfo returns\n        // a hardcoded splitVfo, so rig_get_freq(RIG_VFO_TX)\n        // reads the wrong VFO\n        // rig_get_split_freq uses the backend's CI-V \"unselected VFO\" read,\n        // which correctly returns the other VFO's frequency.\n        freq_t txFreq;\n        status = rig_get_split_freq(rig, RIG_VFO_CURR, &txFreq);\n\n        if ( isRigRespOK(status, tr(\"Get TX Frequency Error\"), false) )\n        {\n            qCDebug(runtime) << \"Rig TX Freq:\" << QSTRING_FREQ(Hz2MHz(txFreq));\n            qCDebug(runtime) << \"Object TX Freq:\" << QSTRING_FREQ(Hz2MHz(currTxFreq));\n\n            if ( txFreq != currTxFreq || forceSendState )\n            {\n                currTxFreq = txFreq;\n                qCDebug(runtime) << \"emitting TX FREQ changed\";\n                emit txFrequencyChanged(Hz2MHz(currTxFreq));\n            }\n        }\n    }\n    else if ( currTxFreq != Hz(0) )\n    {\n        // Split was turned off - reset TX freq\n        currTxFreq = Hz(0);\n    }\n}\n\nvoid HamlibRigDrv::checkKeySpeedChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getKeySpeed\n         && rig_has_get_level(rig, RIG_LEVEL_KEYSPD) )\n    {\n        value_t rigKeySpeed;\n\n        int status = rig_get_level(rig, RIG_VFO_CURR, RIG_LEVEL_KEYSPD, &rigKeySpeed);\n\n        if ( isRigRespOK(status, tr(\"Get KeySpeed Error\"), false) )\n        {\n            qCDebug(runtime) << \"RIG Key Speed: \"<< rigKeySpeed.i;\n            qCDebug(runtime) << \"Object Key Speed: \"<< keySpeed;\n\n            if ( static_cast<unsigned int>(rigKeySpeed.i) != keySpeed || forceSendState )\n            {\n                keySpeed = static_cast<unsigned int>(rigKeySpeed.i);\n                emit keySpeedChanged(keySpeed);\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get KeySpeed is disabled\";\n}\n\ndouble HamlibRigDrv::getRITFreq()\n{\n    FCT_IDENTIFICATION;\n\n    return currFreq + currRIT;\n}\n\nvoid HamlibRigDrv::setRITFreq(double rit)\n{\n    currRIT = rit;\n}\n\ndouble HamlibRigDrv::getXITFreq()\n{\n    return currFreq + currXIT;\n}\n\nvoid HamlibRigDrv::setXITFreq(double xit)\n{\n    currXIT = xit;\n}\n\nvoid HamlibRigDrv::__setKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( wpm < 0 )\n    {\n        return;\n    }\n\n    value_t hamlibWPM;\n    hamlibWPM.i = wpm;\n    int status = rig_set_level(rig, RIG_VFO_CURR, RIG_LEVEL_KEYSPD, hamlibWPM);\n    isRigRespOK(status, tr(\"Set KeySpeed Error\"), false);\n\n    commandSleep();\n}\n\nvoid HamlibRigDrv::commandSleep()\n{\n    FCT_IDENTIFICATION;\n\n    QThread::msleep(200);\n}\n\nbool HamlibRigDrv::isRigRespOK(int errorStatus,\n                               const QString &errorName,\n                               bool emitError)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << errorStatus << errorName << emitError;\n\n    if ( errorStatus == RIG_OK )\n    {\n        if ( emitError )\n            postponedErrors.remove(errorName);\n        return true;\n    }\n\n    lastErrorText = hamlibErrorString(errorStatus);\n\n    if ( emitError )\n    {\n        qCDebug(runtime) << \"Emit Error detected\";\n\n        if ( !RIG_IS_SOFT_ERRCODE(-errorStatus) )\n        {\n            // hard error, emit error now\n            qCDebug(runtime) << \"Hard Error\";\n            emit errorOccurred(errorName, lastErrorText);\n        }\n        else\n        {\n            // soft error\n            postponedErrors[errorName] = lastErrorText;\n\n            if ( !errorTimer.isActive() )\n            {\n                qCDebug(runtime) << \"Starting Error Timer\";\n                errorTimer.start(15 * 1000); //15s\n            }\n        }\n    }\n    return false;\n}\n\nbool HamlibRigDrv::isSmartSDRSlice(const rig_caps *caps)\n{\n#if (HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 6 ) // Hamlib 4.6 implements SmartSDR Slices.\n    return QString::fromLatin1(caps->model_name).contains(\"SmartSDR Slice\", Qt::CaseInsensitive);\n#else\n    Q_UNUSED(caps)\n    return false;\n#endif\n}\n\nbool HamlibRigDrv::isCIVAddrRig(const rig_caps *caps)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &modelName = QString::fromLatin1(caps->mfg_name);\n    return modelName.contains(\"Icom\", Qt::CaseInsensitive)\n            || modelName.contains(\"Ten-Tec\", Qt::CaseInsensitive); /* rigctl: some Ten-Tec rigs\n                                                                       so QLog will enable it for all Ten-Tec */\n}\n\nconst QString HamlibRigDrv::getModeNormalizedText(const rmode_t mode,\n                                                  QString &submode) const\n{\n    submode = QString();\n\n    switch ( mode )\n    {\n    case RIG_MODE_AM: return \"AM\";\n    case RIG_MODE_CW: return \"CW\";\n    case RIG_MODE_USB: {submode = \"USB\"; return \"SSB\";}\n    case RIG_MODE_LSB: {submode = \"LSB\"; return \"SSB\";}\n    case RIG_MODE_RTTY: return \"RTTY\";\n    case RIG_MODE_FM: return \"FM\";\n    case RIG_MODE_WFM: return \"FM\";\n    case RIG_MODE_CWR: return \"CW\";\n    case RIG_MODE_RTTYR: return \"RTTY\";\n    case RIG_MODE_AMS: return \"AM\";\n    case RIG_MODE_PKTLSB: {submode = \"LSB\"; return \"SSB\";}\n    case RIG_MODE_PKTUSB: {submode = \"USB\"; return \"SSB\";}\n    case RIG_MODE_PKTFM: return \"FM\";\n    case RIG_MODE_ECSSUSB: {submode = \"USB\"; return \"SSB\";}\n    case RIG_MODE_ECSSLSB: {submode = \"LSB\"; return \"SSB\";}\n    case RIG_MODE_FAX: return \"\";\n    case RIG_MODE_SAM: return \"\";\n    case RIG_MODE_SAL: return \"AM\";\n    case RIG_MODE_SAH: return \"AM\";\n    case RIG_MODE_DSB: return \"\";\n    case RIG_MODE_FMN: return \"FM\";\n    case RIG_MODE_PKTAM: return \"AM\";\n    default :\n        return QString();\n    }\n}\n\nconst QString HamlibRigDrv::hamlibMode2String(const rmode_t mode) const\n{\n    const char *rawMode = rig_strrmode(mode);\n\n    return QString(rawMode);\n}\n\nconst QString HamlibRigDrv::hamlibVFO2String(const vfo_t vfo) const\n{\n    const char *rawVFO = rig_strvfo(vfo);\n    return QString(rawVFO);\n}\n\nserial_handshake_e HamlibRigDrv::stringToHamlibFlowControl(const QString &in_flowcontrol)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_flowcontrol;\n\n    const QString &flowcontrol = in_flowcontrol.toLower();\n\n    if ( flowcontrol == SerialPort::SERIAL_FLOWCONTROL_SOFTWARE )\n        return RIG_HANDSHAKE_XONXOFF;\n    if ( flowcontrol == SerialPort::SERIAL_FLOWCONTROL_HARDWARE )\n        return RIG_HANDSHAKE_HARDWARE;\n\n    return RIG_HANDSHAKE_NONE;\n}\n\nserial_parity_e HamlibRigDrv::stringToHamlibParity(const QString &in_parity)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_parity;\n\n    const QString &parity = in_parity.toLower();\n\n    if ( parity == SerialPort::SERIAL_PARITY_EVEN )\n        return RIG_PARITY_EVEN;\n    if ( parity == SerialPort::SERIAL_PARITY_ODD )\n        return RIG_PARITY_ODD;\n    if ( parity == SerialPort::SERIAL_PARITY_MARK )\n        return RIG_PARITY_MARK;\n    if ( parity == SerialPort::SERIAL_PARITY_SPACE )\n        return RIG_PARITY_SPACE;\n\n    return RIG_PARITY_NONE;\n}\n\nserial_control_state_e HamlibRigDrv::stringToHamlibSerialSignal(const QString &signalString)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << signalString;\n\n    if ( signalString == SerialPort::SERIAL_SIGNAL_HIGH )\n        return RIG_SIGNAL_ON;\n    if ( signalString == SerialPort::SERIAL_SIGNAL_LOW )\n        return RIG_SIGNAL_OFF;\n\n    return RIG_SIGNAL_UNSET;\n}\n\n\nQString HamlibRigDrv::hamlibErrorString(int errorCode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << errorCode;\n\n    QString ret;\n    QString detail(rigerror(errorCode));\n\n#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 5 )\n    // The rigerror has different behavior since 4.5. It contains the stack trace in the first part\n    // Need to use rigerror2\n    ret = QString(rigerror2(errorCode));\n#else\n    static QRegularExpression re(\"[\\r\\n]\");\n    QStringList errorList = detail.split(re);\n\n    if ( errorList.size() >= 1 )\n        ret = errorList.at(0);\n#endif\n    qWarning() << \"Detail\" << detail;\n    qCWarning(runtime) << ret;\n\n    return ret;\n}\n\n#undef HAMLIB_FILPATHLEN\n#undef RIG_IS_SOFT_ERRCODE\n#undef PTTPORT\n#undef MUTEXLOCKER\n"
  },
  {
    "path": "rig/drivers/HamlibRigDrv.h",
    "content": "﻿#ifndef RIG_DRIVERS_HAMLIBRIGDRV_H\n#define RIG_DRIVERS_HAMLIBRIGDRV_H\n\n#include <QObject>\n#include <QTimer>\n#include <hamlib/rig.h>\n\n#include \"GenericRigDrv.h\"\n#include \"rig/RigCaps.h\"\n\nclass HamlibRigDrv : public GenericRigDrv\n{\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static QList<QPair<QString, QString> > getPTTTypeList();\n    static RigCaps getCaps(int model);\n    static int RIGCTLD_MODEL;\n    static int DUMMY_MODEL;\n    static bool isSmartSDRSlice(const struct rig_caps *caps);\n    static bool isCIVAddrRig(const struct rig_caps *caps);\n    explicit HamlibRigDrv(const RigProfile &profile,\n                          QObject *parent = nullptr);\n    virtual ~HamlibRigDrv();\n\n    virtual bool open() override;\n    virtual bool isMorseOverCatSupported() override;\n    virtual QStringList getAvailableModes() override;\n\n    virtual void setFrequency(double) override;\n    virtual void setFrequency(VFOID, double) override;\n    virtual void setSplit(bool) override;\n    virtual void setRawMode(const QString &) override;\n    virtual void setMode(const QString &, const QString &, bool) override;\n    virtual void setPTT(bool) override;\n    virtual void setKeySpeed(qint16 wpm) override;\n    virtual void syncKeySpeed(qint16 wpm) override;\n    virtual void sendMorse(const QString &) override;\n    virtual void stopMorse() override;\n    virtual void sendState() override;\n    virtual void stopTimers() override;\n    virtual void sendDXSpot(const DxSpot &spot) override;\n\nprivate slots:\n    void checkRigStateChange();\n    void checkErrorCounter();\n\nprivate:\n\n// https://github.com/Hamlib/Hamlib/issues/1647\n// use a newer HAMLIB API rig_list_foreach_model from 4.2\n#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 2  )\n    static int addRig (const rig_model_t rigModel, void *data);\n#else\n    static int addRig(const rig_caps *caps, void* data);\n#endif\n    void checkPTTChange();\n    bool checkFreqChange();\n    bool checkModeChange();\n    void checkVFOChange();\n    void checkSplitChange();\n    void checkPWRChange();\n    void checkRITChange();\n    void checkXITChange();\n    void checkKeySpeedChange();\n    void checkChanges();\n\n    double getRITFreq();\n    void setRITFreq(double);\n    double getXITFreq();\n    void setXITFreq(double);\n\n    void __setKeySpeed(qint16 wpm);\n    void __setMode(rmode_t newModeID);\n    void commandSleep();\n    bool isRigRespOK(int errorStatus,\n                     const QString &errorName,\n                     bool emitError = true);\n\n    const QString getModeNormalizedText(const rmode_t mode,\n                                        QString &submode) const;\n    const QString hamlibMode2String(const rmode_t mode) const;\n    const QString hamlibVFO2String(const vfo_t vfo) const;\n    vfo_t getTxVfo() const;\n    serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol);\n    serial_parity_e stringToHamlibParity(const QString &in_parity);\n    serial_control_state_e stringToHamlibSerialSignal(const QString &signalString);\n    QString hamlibErrorString(int);\n    RIG* rig;\n    QTimer timer;\n    QTimer errorTimer;\n    quint32 SmartSDRSpotCounter;\n    bool forceSendState;\n    bool currPTT;\n    double currFreq;\n    pbwidth_t currPBWidth;\n    rmode_t currModeId;\n    vfo_t currVFO;\n    unsigned int currPWR;\n    double currRIT;\n    double currXIT;\n    unsigned int keySpeed;\n    bool morseOverCatSupported;\n    bool currSplitEnabled;\n    bool futureSplit;\n    double currTxFreq;\n    QMutex drvLock;\n    QHash<QString, QString>postponedErrors;\n    QStringList modeList;\n};\n\n#endif // RIG_DRIVERS_HAMLIBRIGDRV_H\n"
  },
  {
    "path": "rig/drivers/OmniRigEventSink.h",
    "content": "#ifndef OMNIRIGEVENTSINK_H\n#define OMNIRIGEVENTSINK_H\n\n#include <windows.h>\n#include <ocidl.h>\n\n// Generic IDispatch sink for OmniRig event interfaces.\n// Owner class must implement rigTypeChange(int), rigStatusChange(int) and rigParamsChange(int, int).\ntemplate <typename Owner, typename EventInterface>\nclass OmniRigEventSink : public IDispatch\n{\npublic:\n    explicit OmniRigEventSink(Owner *owner) :\n        refCount(1), owner(owner) {}\n\n    HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) override\n    {\n        if ( !ppvObject ) return E_POINTER;\n\n        if ( riid == IID_IUnknown\n            || riid == IID_IDispatch\n            || riid == __uuidof(EventInterface) )\n        {\n            *ppvObject = static_cast<IDispatch *>(this);\n            AddRef();\n            return S_OK;\n        }\n\n        *ppvObject = nullptr;\n        return E_NOINTERFACE;\n    }\n\n    ULONG STDMETHODCALLTYPE AddRef() override\n    {\n        return InterlockedIncrement(&refCount);\n    }\n\n    ULONG STDMETHODCALLTYPE Release() override\n    {\n        ULONG r = InterlockedDecrement(&refCount);\n        if ( r == 0 ) delete this;\n        return r;\n    }\n\n    // IDispatch\n    HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo) override\n    {\n        if ( pctinfo ) *pctinfo = 0;\n        return S_OK;\n    }\n\n    HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT, LCID, ITypeInfo **) override\n    {\n        return E_NOTIMPL;\n    }\n\n    HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID, LPOLESTR *, UINT, LCID, DISPID *) override\n    {\n        return E_NOTIMPL;\n    }\n\n    HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,\n                                     REFIID,\n                                     LCID,\n                                     WORD,\n                                     DISPPARAMS *pDispParams,\n                                     VARIANT *,\n                                     EXCEPINFO *,\n                                     UINT *) override\n    {\n        qCDebug(runtime) << \"OmniRig event: dispId =\" << dispIdMember\n                         << \"argc =\" << (pDispParams ? (int)pDispParams->cArgs : -1);\n\n        if ( !owner ) return S_OK;\n\n        // DispIDs from IDL:\n        // 1 VisibleChange()\n        // 2 RigTypeChange(long RigNumber)\n        // 3 StatusChange(long RigNumber)\n        // 4 ParamsChange(long RigNumber, long Params)\n        // 5 CustomReply(long RigNumber, VARIANT Command, VARIANT Reply)\n        switch (dispIdMember)\n        {\n        case 1: // VisibleChange\n            // not-used\n            break;\n\n        case 2: // RigTypeChange\n            if ( pDispParams && pDispParams->cArgs == 1 )\n                owner->rigTypeChange((int)pDispParams->rgvarg[0].lVal);\n            break;\n\n        case 3: // StatusChange\n            if ( pDispParams && pDispParams->cArgs == 1 )\n                owner->rigStatusChange((int)pDispParams->rgvarg[0].lVal);\n            break;\n\n        case 4: // ParamsChange(RigNumber, Params)\n            if ( pDispParams && pDispParams->cArgs == 2 )\n            {\n                long params = pDispParams->rgvarg[0].lVal;\n                long rig    = pDispParams->rgvarg[1].lVal;\n                owner->rigParamsChange((int)rig, (int)params);\n            }\n            break;\n\n        case 5: // CustomReply\n            // not-used\n            break;\n\n        default:\n            break;\n        }\n\n        return S_OK;\n    }\n\nprivate:\n    LONG   refCount;\n    Owner *owner;\n};\n\n#endif // OMNIRIGEVENTSINK_H\n"
  },
  {
    "path": "rig/drivers/OmnirigRigDrv.cpp",
    "content": "\n// This module is compiled only under Windows - therefore no ifdef related to Windows is needed\n\n#define NOMINMAX\n#include <windows.h>\n#include <ocidl.h>\n#include <oleauto.h>\n#include <comdef.h>\n\n#include <QTimer>\n#include <QThread>\n#include <QMutexLocker>\n\n#include \"OmnirigRigDrv.h\"\n#include \"core/debug.h\"\n#include \"rig/macros.h\"\n\n#if 0\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Drv mutex\"; \\\n                        QMutexLocker locker(&drvLock); \\\n                        qCDebug(runtime) << \"Using Drv\"\n#else\n#define MUTEXLOCKER     qCDebug(runtime) << \"Mutex-free\";\n#endif\n\nMODULE_IDENTIFICATION(\"qlog.rig.driver.omnirigdrv\");\n\n// import omnirigv1\n#import \"C:\\\\Program Files (x86)\\\\Afreet\\\\OmniRig\\\\OmniRig.exe\" raw_interfaces_only named_guids rename_namespace(\"OmnirigV1\")\n#include \"OmniRigEventSink.h\"\n\nstatic QString bstrToQString(BSTR b)\n{\n    if ( !b ) return QString();\n    QString s = QString::fromWCharArray(b, SysStringLen(b));\n    SysFreeString(b);\n    return s;\n}\n\nusing OmniRigEventSinkV1 = OmniRigEventSink<OmnirigRigDrv, OmnirigV1::IOmniRigXEvents>;\n\nQList<QPair<int, QString> > OmnirigRigDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    ret << QPair<int, QString>(1, tr(\"Rig 1\"))\n        << QPair<int, QString>(2, tr(\"Rig 2\"));\n\n    return ret;\n}\n\nRigCaps OmnirigRigDrv::getCaps(int)\n{\n    FCT_IDENTIFICATION;\n\n    RigCaps ret;\n\n    ret.isNetworkOnly = true;\n\n    ret.canGetFreq = true;\n    ret.canGetMode = true;\n    ret.canGetVFO = true;\n    //ret.canGetRIT = true; // temporary disabled because there is not rig with the implemented RitOffset\n    //XIT is not supported by Omnirig lib now\n    ret.canGetPTT = true;\n    ret.canGetSplit = true;\n\n    return ret;\n}\n\nOmnirigRigDrv::OmnirigRigDrv(const RigProfile &profile,\n                       QObject *parent)\n    : GenericRigDrv(profile, parent),\n      currFreq(0),\n      currTxFreq(0),\n      currRIT(0),\n      currXIT(0),\n      currPTT(false),\n      currSplitEnabled(false),\n      futureSplit(false),\n      omniInterface(nullptr),\n      rig(nullptr),\n      eventSink(nullptr),\n      connPoint(nullptr),\n      readableParams(0),\n      writableParams(0),\n      FREQMASK(OmnirigV1::PM_FREQA | OmnirigV1::PM_FREQB | OmnirigV1::PM_FREQ),\n      VFO_A_MASK(OmnirigV1::PM_VFOA | OmnirigV1::PM_VFOAA | OmnirigV1::PM_VFOAB),\n      VFO_B_MASK(OmnirigV1::PM_VFOB | OmnirigV1::PM_VFOBA | OmnirigV1::PM_VFOBB),\n      VFO_SPEC_MASK(OmnirigV1::PM_VFOEQUAL | OmnirigV1::PM_VFOSWAP),\n      ALLVFOsMASK(VFO_A_MASK | VFO_B_MASK | VFO_SPEC_MASK),\n      SPLIT_MASK(OmnirigV1::PM_SPLITON | OmnirigV1::PM_SPLITOFF)\n{\n    FCT_IDENTIFICATION;\n\n    HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n    if ( FAILED(hr) )\n        qCWarning(runtime) << \"CoInitializeEx failed, hr =\" << QString::number(hr, 16);\n\n    modeMap.insert(OmnirigV1::PM_CW_U,  \"CWR\");\n    modeMap.insert(OmnirigV1::PM_CW_L,  \"CW\");\n    modeMap.insert(OmnirigV1::PM_SSB_U, \"USB\");\n    modeMap.insert(OmnirigV1::PM_SSB_L, \"LSB\");\n    modeMap.insert(OmnirigV1::PM_DIG_U, \"DIG_U\");\n    modeMap.insert(OmnirigV1::PM_DIG_L, \"DIG_L\");\n    modeMap.insert(OmnirigV1::PM_AM,    \"AM\");\n    modeMap.insert(OmnirigV1::PM_FM,    \"FM\");\n\n    // Timer\n    offlineTimer.setSingleShot(true);\n    QObject::connect(&offlineTimer, &QTimer::timeout, this, [this]()\n    {\n        qCDebug(runtime) << \"Offline timer exceeded\";\n        emitDisconnect();\n    });\n\n    hr = CoCreateInstance(__uuidof(OmnirigV1::OmniRigX),\n                          nullptr,\n                          CLSCTX_LOCAL_SERVER,\n                          __uuidof(OmnirigV1::IOmniRigX),\n                          reinterpret_cast<void **>(&omniInterface));\n\n    if ( FAILED(hr) || !omniInterface )\n    {\n        qCWarning(runtime) << \"CoCreateInstance(OmniRig.OmniRigX) failed, hr =\" << QString::number(hr, 16);\n        lastErrorText = tr(\"Initialization Error\");\n        omniInterface = nullptr;\n        return;\n    }\n\n    // Event sink\n    eventSink = new OmniRigEventSinkV1(this);\n\n    IConnectionPointContainer *cpc = nullptr;\n    hr = omniInterface->QueryInterface(IID_IConnectionPointContainer, reinterpret_cast<void **>(&cpc));\n\n    qCDebug(runtime) << \"QI(IConnectionPointContainer) hr =\" << QString::number(hr, 16);\n\n    if ( SUCCEEDED(hr) && cpc )\n    {\n        hr = cpc->FindConnectionPoint(__uuidof(OmnirigV1::IOmniRigXEvents), &connPoint);\n        qCDebug(runtime) << \"FindConnectionPoint(IOmniRigXEvents) hr =\" << QString::number(hr, 16);\n\n        if (SUCCEEDED(hr) && connPoint)\n        {\n            hr = connPoint->Advise(eventSink, &connCookie);\n\n            qCDebug(runtime) << \"Advise(IOmniRigXEvents) hr =\" << QString::number(hr, 16)\n                             << \"cookie =\" << connCookie;\n\n            if ( FAILED(hr) )\n            {\n                qCWarning(runtime) << \"IConnectionPoint::Advise failed\";\n                connPoint->Release();\n                connPoint = nullptr;\n                connCookie = 0;\n            }\n        }\n        cpc->Release();\n    }\n}\n\nOmnirigRigDrv::~OmnirigRigDrv()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        // better to make a memory leak\n        CoUninitialize();\n        return;\n    }\n\n    if ( connPoint && connCookie )\n    {\n        connPoint->Unadvise(connCookie);\n        connCookie = 0;\n    }\n\n    if ( connPoint )\n    {\n        connPoint->Release();\n        connPoint = nullptr;\n    }\n\n    if ( eventSink )\n    {\n        eventSink->Release();\n        eventSink = nullptr;\n    }\n\n    if ( rig )\n    {\n        rig->Release();\n        rig = nullptr;\n    }\n\n    if ( omniInterface )\n    {\n        omniInterface->Release();\n        omniInterface = nullptr;\n    }\n\n    CoUninitialize();\n\n    drvLock.unlock();\n}\n\nbool OmnirigRigDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( !omniInterface )\n    {\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Rig is not initialized\";\n        return false;\n    }\n\n    long ifaceVer = 0;\n    long swVer    = 0;\n\n    omniInterface->get_InterfaceVersion(&ifaceVer);\n    omniInterface->get_SoftwareVersion(&swVer);\n\n    quint16 swMajor = static_cast<quint16>(swVer >> 16);\n    quint16 swMinor = static_cast<quint16>(swVer & 0xFFFF);\n    quint16 ifMajor = static_cast<quint16>(ifaceVer >> 8);\n    quint16 ifMinor = static_cast<quint16>(ifaceVer & 0xFF);\n\n    qCDebug(runtime) << \"Omnirig Version\"\n                     << swMajor << \".\" << swMinor\n                     << \"Interface Version\"\n                     << ifMajor << \".\" << ifMinor;\n\n    if ( rig )\n    {\n        rig->Release();\n        rig = nullptr;\n    }\n\n    HRESULT hr = E_FAIL;\n\n    switch (rigProfile.model)\n    {\n    case 1: hr = omniInterface->get_Rig1(&rig); break;\n    case 2: hr = omniInterface->get_Rig2(&rig); break;\n    default:\n        hr = E_INVALIDARG;\n        break;\n    }\n\n    if ( FAILED(hr) || !rig )\n    {\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Cannot get Rig Instance, hr =\" << QString::number(hr, 16);\n        return false;\n    }\n\n    __rigTypeChange(rigProfile.model);\n\n    QTimer::singleShot(500, this, [this]()\n                       {\n                           this->rigStatusChange(rigProfile.model);\n                       });\n\n    return true;\n}\n\nbool OmnirigRigDrv::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n\n    return false;\n}\n\nQStringList OmnirigRigDrv::getAvailableModes()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    for ( auto it = modeMap.constBegin(); it != modeMap.constEnd(); ++it )\n        if ( it.key() & writableParams )\n            ret.append(it.value());\n\n    return ret;\n}\n\nvoid OmnirigRigDrv::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rig ) return;\n\n    long internalFreq = static_cast<long>(newFreq);\n\n    qCDebug(runtime) << \"Received freq\" << internalFreq << \"current\" << currFreq;\n\n    if ( internalFreq == currFreq ) return;\n\n    MUTEXLOCKER;\n\n    OmnirigV1::RigParamX vfo = OmnirigV1::PM_UNKNOWN;\n\n    rig->get_Vfo(&vfo);\n\n    if ( vfo & VFO_B_MASK )\n    {\n        qCDebug(runtime) << \"Setting VFO B Freq\";\n        rig->put_FreqB(internalFreq);\n    }\n    else if ( writableParams & OmnirigV1::PM_FREQA )\n    {\n        qCDebug(runtime) << \"Setting VFO A Freq\";\n        rig->put_FreqA(internalFreq);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Setting Generic VFO Freq\";\n        rig->put_Freq(internalFreq);\n    }\n\n    commandSleep();\n}\n\nvoid OmnirigRigDrv::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rig ) return;\n\n    if ( vfoid == VFO1 )\n    {\n        setFrequency(newFreq);\n        return;\n    }\n\n    // VFO2 — TX frequency (set the non-active VFO)\n    long internalFreq = static_cast<long>(newFreq);\n\n    MUTEXLOCKER;\n\n    OmnirigV1::RigParamX currentVfo = OmnirigV1::PM_UNKNOWN;\n    rig->get_Vfo(&currentVfo);\n\n    const bool isBActive = (currentVfo & VFO_B_MASK);\n    const bool targetIsA = isBActive;\n\n    qCDebug(runtime) << \"Active VFO is\" << (isBActive ? \"B\" : \"A\")\n                     << \", setting TX freq to VFO\" << (targetIsA ? \"A\" : \"B\");\n\n    const bool canDirect =targetIsA ? (writableParams & OmnirigV1::PM_FREQA)\n                                    : (writableParams & OmnirigV1::PM_FREQB);\n\n    if ( canDirect )\n    {\n        if ( targetIsA )\n        {\n            qCDebug(runtime) << \"Direct FreqA\";\n            rig->put_FreqA(internalFreq);\n        }\n        else\n        {\n            qCDebug(runtime) << \"Direct FreqB\";\n            rig->put_FreqB(internalFreq);\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Swap VFOs\";\n        rig->put_Vfo(OmnirigV1::PM_VFOSWAP);\n        rig->put_Freq(internalFreq);\n        rig->put_Vfo(OmnirigV1::PM_VFOSWAP);\n    }\n\n    commandSleep();\n}\n\nvoid OmnirigRigDrv::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    if ( !rigProfile.getSplitInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    rig->put_Split(enabled ? OmnirigV1::PM_SPLITON : OmnirigV1::PM_SPLITOFF);\n    futureSplit = enabled;\n\n    commandSleep();\n}\n\nvoid OmnirigRigDrv::setRawMode(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( !rigProfile.getModeInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    const QList<int> mappedMode = modeMap.keys(rawMode);\n\n    if (!mappedMode.isEmpty())\n    {\n        OmnirigV1::RigParamX m = static_cast<OmnirigV1::RigParamX>(mappedMode.at(0));\n        qCDebug(runtime) << \"Mode Found\" << m;\n        if ( !(m & writableParams) ) return;\n\n        qCDebug(runtime) << \"Setting Mode\";\n        rig->put_Mode(m);\n\n#if 0 // SPLIT MODE\n        // sync Split VFO mode\n\n        // The information about the split change may not\n        // have arrived yet, but the VFO can now be set.\n        // That's why futureSplit was used\n\n        if ( futureSplit )\n        {\n            if (writableParams & (OmnirigV1::PM_VFOA | OmnirigV1::PM_VFOB))\n            {\n                OmnirigV1::RigParamX currentVfo = OmnirigV1::PM_UNKNOWN;\n                rig->get_Vfo(&currentVfo);\n                const bool isA = (currentVfo & VFO_A_MASK);\n                const auto targetVfo = isA ? OmnirigV1::PM_VFOB : OmnirigV1::PM_VFOA;\n                const auto returnVfo = isA ? OmnirigV1::PM_VFOA : OmnirigV1::PM_VFOB;\n\n                rig->put_Vfo(targetVfo);\n                rig->put_Mode(m);\n                rig->put_Vfo(returnVfo);\n            }\n        }\n#endif\n        commandSleep();\n    }\n}\n\nvoid OmnirigRigDrv::setMode(const QString &mode, const QString &submode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << submode << digiVariant;\n\n    QString innerSubmode(submode);\n\n    if ( digiVariant )\n    {\n        const QString digMode = QLatin1String(\"DIG_\") + innerSubmode.at(0);\n        if ( modeMap.key(digMode) & writableParams )\n            innerSubmode = digMode;\n    }\n\n    setRawMode((submode.isEmpty()) ? mode.toUpper() : innerSubmode.toUpper());\n}\n\nvoid OmnirigRigDrv::setPTT(bool newPTTState)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newPTTState;\n\n    if ( !rigProfile.getPTTInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    rig->put_Tx(newPTTState ? OmnirigV1::PM_TX : OmnirigV1::PM_RX);\n\n    commandSleep();\n}\n\nvoid OmnirigRigDrv::setKeySpeed(qint16)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n    return;\n}\n\nvoid OmnirigRigDrv::syncKeySpeed(qint16)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n    return;\n}\n\nvoid OmnirigRigDrv::sendMorse(const QString &)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n    return;\n}\n\nvoid OmnirigRigDrv::stopMorse()\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n    return;\n}\n\nvoid OmnirigRigDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    checkChanges(0, true);\n}\n\nvoid OmnirigRigDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    offlineTimer.stop();\n}\n\nvoid OmnirigRigDrv::sendDXSpot(const DxSpot &)\n{\n    FCT_IDENTIFICATION;\n\n    //no action\n}\n\nvoid OmnirigRigDrv::__rigTypeChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigID != rigProfile.model ) return;\n\n    long r = 0;\n    long w = 0;\n    rig->get_ReadableParams(&r);\n    rig->get_WriteableParams(&w);\n\n    readableParams = static_cast<int>(r);\n    writableParams = static_cast<int>(w);\n\n    qCDebug(runtime) << \"R-params\" << QString::number(readableParams, 16)\n                     << \"W-params\" << QString::number(writableParams, 16);\n}\n\nvoid OmnirigRigDrv::commandSleep()\n{\n    QThread::msleep(200);\n}\n\nconst QString OmnirigRigDrv::getModeNormalizedText(const QString &rawMode, QString &submode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    submode = QString();\n\n    if ( rawMode.contains(\"CW\") )\n        return \"CW\";\n\n    if ( rawMode == \"USB\" )\n    {\n        submode = \"USB\";\n        return \"SSB\";\n    }\n\n    if ( rawMode == \"LSB\" )\n    {\n        submode = \"LSB\";\n        return \"SSB\";\n    }\n\n    if ( rawMode == \"AM\" )\n        return \"AM\";\n\n    if ( rawMode == \"FM\" )\n        return \"FM\";\n\n    // maybe bad maybe good\n    if ( rawMode == \"DIG_U\" )\n    {\n        submode = \"USB\";\n        return \"SSB\";\n    }\n\n    // maybe bad maybe good\n    if ( rawMode == \"DIG_L\" )\n    {\n        submode = \"LSB\";\n        return \"SSB\";\n    }\n\n    return QString();\n}\n\nvoid OmnirigRigDrv::rigTypeChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( rigID != rigProfile.model )\n        return;\n\n    MUTEXLOCKER;\n\n    __rigTypeChange(rigID);\n}\n\nvoid OmnirigRigDrv::rigStatusChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( rigID != rigProfile.model ) return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    OmnirigV1::RigStatusX st = OmnirigV1::ST_NOTCONFIGURED;\n    rig->get_Status(&st);\n\n    BSTR statusStr = nullptr;\n    rig->get_StatusStr(&statusStr);\n    QString qStatusStr = bstrToQString(statusStr);\n\n    qCDebug(runtime) << \"Rig ID \" << rigID;\n    qCDebug(runtime) << \"New Status\" << st << qStatusStr;\n\n    if ( OmnirigV1::ST_ONLINE != st )\n    {\n        qCDebug(runtime) << \"New status\" << qStatusStr;\n        if (!offlineTimer.isActive())\n            offlineTimer.start(OFFLINETIMER_TIME_MS);\n    }\n    else\n    {\n        offlineTimer.stop();\n        emit rigIsReady();\n    }\n}\n\nvoid OmnirigRigDrv::checkChanges(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    checkSplitChange(params, force);\n    checkFreqChange(params, force);\n    checkModeChange(params, force);\n    checkPTTChange(params, force);\n    checkVFOChange(params, force);\n    checkRITChange(params, force);\n}\n\n\nvoid OmnirigRigDrv::rigParamsChange(int rigID, int params)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rigID << params;\n\n    if ( rigID != rigProfile.model )\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    checkChanges(params);\n}\n\nbool OmnirigRigDrv::checkFreqChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( !rigProfile.getFreqInfo ) return true;\n    if ( !force && !(params & (FREQMASK | ALLVFOsMASK) ) ) return true;\n\n    unsigned int vfo_freq = 0;\n    OmnirigV1::RigParamX vfo = OmnirigV1::PM_UNKNOWN;\n    rig->get_Vfo(&vfo);\n    const bool vfoIsB = (vfo & VFO_B_MASK);\n\n    long tmp = 0L;\n    if ( vfoIsB )\n    {\n        qCDebug(runtime) << \"Getting VFO B Freq\";\n        rig->get_FreqB(&tmp);\n        if ( !tmp )\n        {\n            qCDebug(runtime) << \"FreqB returned 0, falling back to Freq()\";\n            rig->get_Freq(&tmp);\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Getting VFO A Freq\";\n        rig->get_FreqA(&tmp);\n        if ( !tmp )\n        {\n            qCDebug(runtime) << \"FreqA returned 0, falling back to Freq()\";\n            rig->get_Freq(&tmp);\n        }\n    }\n\n    vfo_freq = static_cast<unsigned int>(tmp);\n\n    qCDebug(runtime) << \"Rig Freq: \"<< vfo_freq;\n    qCDebug(runtime) << \"Object Freq: \"<< currFreq;\n\n    if ( vfo_freq != currFreq || force )\n    {\n        currFreq = vfo_freq;\n        qCDebug(runtime) << \"emitting FREQ changed\" << currFreq << Hz2MHz(currFreq);\n        emit frequencyChanged(Hz2MHz(currFreq),\n                              Hz2MHz(getRITFreq()),\n                              Hz2MHz(getXITFreq()));\n    }\n\n    // TX frequency (the non-active VFO) when split is active\n    if ( rigProfile.getSplitInfo && currSplitEnabled )\n    {\n        long txTmp = 0L;\n        if ( vfoIsB )\n            rig->get_FreqA(&txTmp);\n        else\n            rig->get_FreqB(&txTmp);\n\n        unsigned int txFreq = static_cast<unsigned int>(txTmp);\n\n        if ( txFreq != currTxFreq || force )\n        {\n            currTxFreq = txFreq;\n            qCDebug(runtime) << \"emitting TX FREQ changed\" << currTxFreq << Hz2MHz(currTxFreq);\n            emit txFrequencyChanged(Hz2MHz(currTxFreq));\n        }\n    }\n\n    return true;\n}\n\nbool OmnirigRigDrv::checkModeChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( rigProfile.getModeInfo )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV1::RigParamX m = OmnirigV1::PM_UNKNOWN;\n            rig->get_Mode(&m);\n            inParams = m;\n        }\n\n        QMap<int, QString>::const_iterator it;\n        for ( it = modeMap.begin(); it != modeMap.end(); ++it )\n        {\n            if ( inParams & it.key() )\n            {\n                qCDebug(runtime) << \"Rig Mode: \"<< it.value();\n                qCDebug(runtime) << \"Object Mode: \"<< currModeID;\n\n                if ( currModeID != it.value() || force)\n                {\n                    currModeID = it.value();\n\n                    QString submode;\n                    const QString mode = getModeNormalizedText(currModeID, submode);\n                    qCDebug(runtime) << \"emitting MODE changed\"\n                                     << currModeID << mode << submode << 0;\n                    emit modeChanged(currModeID,\n                                     mode, submode,\n                                     0);\n                }\n                break;\n            }\n        }\n    }\n\n    return true;\n}\n\nvoid OmnirigRigDrv::checkPTTChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getPTTInfo\n        && (params & OmnirigV1::PM_RX\n            || params & OmnirigV1::PM_TX\n            || force) )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV1::RigParamX tx = OmnirigV1::PM_RX;\n            rig->get_Tx(&tx);\n            inParams = tx;\n        }\n\n        bool ptt = false;\n\n        if ( inParams & OmnirigV1::PM_RX )\n            ptt = false;\n\n        if ( inParams & OmnirigV1::PM_TX )\n            ptt = true;\n\n        qCDebug(runtime) << \"Rig PTT: \"<< ptt;\n        qCDebug(runtime) << \"Object Mode: \"<< currPTT;\n\n        if ( ptt != currPTT || force )\n        {\n            currPTT = ptt;\n            qCDebug(runtime) << \"emitting PTT changed\" << currPTT;\n            emit pttChanged(currPTT);\n        }\n    }\n}\n\nvoid OmnirigRigDrv::checkVFOChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( !rigProfile.getVFOInfo ) return;\n\n    if ( (params & ALLVFOsMASK) || force )\n    {\n        int inParams;\n        if (force || (params & VFO_SPEC_MASK))\n        {\n            OmnirigV1::RigParamX v;\n            rig->get_Vfo(&v);\n            inParams = v;\n        }\n        else\n        {\n            inParams = params;\n        }\n\n        QString vfo;\n\n        if ( inParams & VFO_A_MASK ) vfo = \"VFOA\";\n        if ( inParams & VFO_B_MASK ) vfo = \"VFOB\";\n\n        qCDebug(runtime) << \"Rig VFO: \"<< vfo;\n        qCDebug(runtime) << \"Object VFO: \"<< currVFO;\n\n        if ( vfo != currVFO || force )\n        {\n            currVFO = vfo;\n            qCDebug(runtime) << \"emitting VFO changed\" << currVFO;\n            emit vfoChanged(currVFO);\n        }\n    }\n}\n\nvoid OmnirigRigDrv::checkRITChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if (rigProfile.getRITInfo\n        && (params & OmnirigV1::PM_RITON\n            || params & OmnirigV1::PM_RITOFF\n            || force))\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV1::RigParamX r;\n            rig->get_Rit(&r);\n            inParams = r;\n        }\n\n        long off = 0;\n        rig->get_RitOffset(&off);\n        unsigned int rit = (inParams & OmnirigV1::PM_RITON)\n                               ? static_cast<unsigned int>(off)\n                               : 0;\n\n        qCDebug(runtime) << \"Rig RIT: \"<< rit;\n        qCDebug(runtime) << \"Object RIT: \"<< currRIT;\n\n        if ( rit != currRIT || force )\n        {\n            currRIT = rit;\n            qCDebug(runtime) << \"emitting RIT changed\" << QSTRING_FREQ(Hz2MHz(currRIT));\n            qCDebug(runtime) << \"emitting FREQ changed \"\n                             << QSTRING_FREQ(Hz2MHz(currFreq))\n                             << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                             << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n            emit ritChanged(Hz2MHz(currRIT));\n            emit frequencyChanged(Hz2MHz(currFreq),\n                                  Hz2MHz(getRITFreq()),\n                                  Hz2MHz(getXITFreq()));\n        }\n    }\n}\n\nvoid OmnirigRigDrv::checkSplitChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( !rigProfile.getSplitInfo )\n    {\n        qCDebug(runtime) << \"Get SPLIT is disabled\";\n        return;\n    }\n\n    if ( (params & SPLIT_MASK) || force )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV1::RigParamX s;\n            rig->get_Split(&s);\n            inParams = s;\n        }\n\n        bool splitEnabled = ( inParams & OmnirigV1::PM_SPLITON ) != 0;\n\n        qCDebug(runtime) << \"Rig Split:\" << splitEnabled;\n        qCDebug(runtime) << \"Object Split:\" << currSplitEnabled;\n\n        if ( splitEnabled != currSplitEnabled || force )\n        {\n            currSplitEnabled = splitEnabled;\n            futureSplit = splitEnabled;\n\n            qCDebug(runtime) << \"emitting SPLIT changed\" << currSplitEnabled;\n            emit splitChanged(currSplitEnabled);\n\n            if ( !currSplitEnabled )\n                currTxFreq = 0;\n        }\n    }\n}\n\ndouble OmnirigRigDrv::getRITFreq()\n{\n    FCT_IDENTIFICATION;\n\n    return currFreq + currRIT;\n}\n\nvoid OmnirigRigDrv::setRITFreq(double rit)\n{\n    currRIT = rit;\n}\n\ndouble OmnirigRigDrv::getXITFreq()\n{\n    return currFreq + currXIT;\n}\n\nvoid OmnirigRigDrv::setXITFreq(double xit)\n{\n    currXIT = xit;\n}\n\nvoid OmnirigRigDrv::emitDisconnect()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    emit errorOccurred(tr(\"Rig status changed\"),\n                      tr(\"Rig is not connected\"));\n}\n\n#undef MUTEXLOCKER\n"
  },
  {
    "path": "rig/drivers/OmnirigRigDrv.h",
    "content": "#ifndef RIG_DRIVERS_OMNIRIGRIGDRV_H\n#define RIG_DRIVERS_OMNIRIGRIGDRV_H\n\n#include <QMutex>\n#include <QTimer>\n#include <QMap>\n\n#include \"GenericRigDrv.h\"\n#include \"rig/RigCaps.h\"\n\n// Forward declaration from OmnirigV1 library (getting via #import in .cpp)\nnamespace OmnirigV1\n{\n    struct IOmniRigX;\n    struct IRigX;\n    struct IOmniRigXEvents;\n    enum RigParamX;\n    enum RigStatusX;\n}\n\nstruct IConnectionPoint;\ntemplate <typename Owner, typename EventInterface> class OmniRigEventSink;\n\nclass OmnirigRigDrv : public GenericRigDrv\n{\n    Q_OBJECT\n    friend class OmniRigEventSink<OmnirigRigDrv, OmnirigV1::IOmniRigXEvents>;\n\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static RigCaps getCaps(int model);\n    explicit OmnirigRigDrv(const RigProfile &profile,\n                        QObject *parent = nullptr);\n    virtual ~OmnirigRigDrv();\n\n    virtual bool open() override;\n    virtual bool isMorseOverCatSupported() override;\n    virtual QStringList getAvailableModes() override;\n\n    virtual void setFrequency(double) override;\n    virtual void setFrequency(VFOID, double) override;\n    virtual void setSplit(bool) override;\n    virtual void setRawMode(const QString &) override;\n    virtual void setMode(const QString &, const QString &, bool) override;\n    virtual void setPTT(bool newPTTState) override;\n    virtual void setKeySpeed(qint16 wpm) override;\n    virtual void syncKeySpeed(qint16 wpm) override;\n    virtual void sendMorse(const QString &) override;\n    virtual void stopMorse() override;\n    virtual void sendState() override;\n    virtual void stopTimers() override;\n    virtual void sendDXSpot(const DxSpot &spot) override;\n\nprivate slots:\n    void rigTypeChange(int);\n    void rigStatusChange(int);\n    void rigParamsChange(int rigID, int params);\n\nprivate:\n    void __rigTypeChange(int);\n    void commandSleep();\n    const QString getModeNormalizedText(const QString& rawMode, QString &submode);\n\n    void checkChanges(int, bool force = false);\n    bool checkFreqChange(int, bool);\n    bool checkModeChange(int, bool);\n    void checkPTTChange(int, bool);\n    void checkVFOChange(int, bool);\n    void checkRITChange(int, bool);\n    void checkSplitChange(int, bool);\n\n    double getRITFreq();\n    void setRITFreq(double);\n    double getXITFreq();\n    void setXITFreq(double);\n\n    void emitDisconnect();\n\nprivate:\n\n    unsigned int currFreq;\n    unsigned int currTxFreq;\n    QString currModeID;\n    QString currVFO;\n    unsigned int currRIT;\n    unsigned int currXIT;\n    bool currPTT;\n    bool currSplitEnabled;\n    bool futureSplit;\n\n    // COM Objects\n    OmnirigV1::IOmniRigX *omniInterface;   // the main OmniRigX COM object\n    OmnirigV1::IRigX     *rig;\n\n    // Event sink (IDispatch) defined in OmniRigEventSink.h\n    OmniRigEventSink<OmnirigRigDrv, OmnirigV1::IOmniRigXEvents> *eventSink;\n    IConnectionPoint *connPoint;\n    unsigned long     connCookie;\n\n    int readableParams;\n    int writableParams;\n\n    QMutex drvLock;\n    QTimer offlineTimer;\n\n    const int FREQMASK;\n    const int VFO_A_MASK;\n    const int VFO_B_MASK;\n    const int VFO_SPEC_MASK;\n    const int ALLVFOsMASK;\n    const int SPLIT_MASK;\n\n    static const uint OFFLINETIMER_TIME_MS = 10000;\n\n    // Mode maps\n    QMap<int, QString> modeMap;\n};\n\n#endif // RIG_DRIVERS_OMNIRIGRIGDRV_H\n"
  },
  {
    "path": "rig/drivers/Omnirigv2RigDrv.cpp",
    "content": "// This module is compiled only under Windows - therefore no ifdef related to Windows is needed\n\n#define NOMINMAX\n#include <windows.h>\n#include <ocidl.h>\n#include <oleauto.h>\n#include <comdef.h>\n\n#include <QTimer>\n#include <QThread>\n#include <QMutexLocker>\n\n#include \"Omnirigv2RigDrv.h\"\n#include \"core/debug.h\"\n#include \"rig/macros.h\"\n\n#if 0\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Drv mutex\"; \\\n                        QMutexLocker locker(&drvLock); \\\n                        qCDebug(runtime) << \"Using Drv\"\n#else\n#define MUTEXLOCKER     qCDebug(runtime) << \"Mutex-free\";\n#endif\n\nMODULE_IDENTIFICATION(\"qlog.rig.driver.omnirigv2drv\");\n\n// import omnirigv2\n#import \"C:\\\\Program Files (x86)\\\\Omni-Rig V2\\\\omnirig2.exe\" raw_interfaces_only named_guids rename_namespace(\"OmnirigV2\")\n#include \"OmniRigEventSink.h\"\n\nstatic QString bstrToQString(BSTR b)\n{\n    if ( !b ) return QString();\n    QString s = QString::fromWCharArray(b, SysStringLen(b));\n    SysFreeString(b);\n    return s;\n}\n\nusing OmniRigEventSinkV2 = OmniRigEventSink<OmnirigV2RigDrv, OmnirigV2::IOmniRigXEvents>;\n\nQList<QPair<int, QString> > OmnirigV2RigDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    ret << QPair<int, QString>(1, tr(\"Rig 1\"))\n        << QPair<int, QString>(2, tr(\"Rig 2\"))\n        << QPair<int, QString>(3, tr(\"Rig 3\"))\n        << QPair<int, QString>(4, tr(\"Rig 4\"));\n\n    return ret;\n}\n\nRigCaps OmnirigV2RigDrv::getCaps(int)\n{\n    FCT_IDENTIFICATION;\n\n    RigCaps ret;\n\n    ret.isNetworkOnly = true;\n\n    ret.canGetFreq = true;\n    ret.canGetMode = true;\n    ret.canGetVFO = true;\n    //ret.canGetRIT = true; // temporary disabled because there is not rig with the implemented RitOffset\n    //XIT is not supported by Omnirig lib now\n    ret.canGetPTT = true;\n    ret.canGetSplit = true;\n\n    return ret;\n}\n\nOmnirigV2RigDrv::OmnirigV2RigDrv(const RigProfile &profile,\n                           QObject *parent)\n    : GenericRigDrv(profile, parent),\n      currFreq(0),\n      currTxFreq(0),\n      currRIT(0),\n      currXIT(0),\n      currPTT(false),\n      currSplitEnabled(false),\n      currModeID(),\n      currVFO(),\n      omniInterface(nullptr),\n      rig(nullptr),\n      eventSink(nullptr),\n      connPoint(nullptr),\n      connCookie(0),\n      readableParams(0),\n      writableParams(0),\n      FREQMASK(OmnirigV2::PM_FREQA | OmnirigV2::PM_FREQB | OmnirigV2::PM_FREQ),\n      VFO_A_MASK(OmnirigV2::PM_VFOA | OmnirigV2::PM_VFOAA | OmnirigV2::PM_VFOAB),\n      VFO_B_MASK(OmnirigV2::PM_VFOB | OmnirigV2::PM_VFOBA | OmnirigV2::PM_VFOBB),\n      VFO_SPEC_MASK(OmnirigV2::PM_VFOEQUAL | OmnirigV2::PM_VFOSWAP),\n      ALLVFOsMASK(VFO_A_MASK | VFO_B_MASK | VFO_SPEC_MASK),\n      SPLIT_MASK(OmnirigV2::PM_SPLITON | OmnirigV2::PM_SPLITOFF)\n{\n    FCT_IDENTIFICATION;\n\n    HRESULT hr = CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);\n\n    if ( FAILED(hr) )\n        qCWarning(runtime) << \"CoInitializeEx failed, hr =\" << QString::number(hr, 16);\n\n    modeMap.insert(OmnirigV2::PM_CW_U,  \"CWR\");\n    modeMap.insert(OmnirigV2::PM_CW_L,  \"CW\");\n    modeMap.insert(OmnirigV2::PM_SSB_U, \"USB\");\n    modeMap.insert(OmnirigV2::PM_SSB_L, \"LSB\");\n    modeMap.insert(OmnirigV2::PM_DIG_U, \"DIG_U\");\n    modeMap.insert(OmnirigV2::PM_DIG_L, \"DIG_L\");\n    modeMap.insert(OmnirigV2::PM_AM,    \"AM\");\n    modeMap.insert(OmnirigV2::PM_FM,    \"FM\");\n\n    // Timer\n    offlineTimer.setSingleShot(true);\n    QObject::connect(&offlineTimer, &QTimer::timeout, this, [this]()\n    {\n        qCDebug(runtime) << \"Offline timer exceeded\";\n        emitDisconnect();\n    });\n\n    hr = CoCreateInstance(__uuidof(OmnirigV2::OmniRigX),\n                          nullptr,\n                          CLSCTX_LOCAL_SERVER,\n                          __uuidof(OmnirigV2::IOmniRigX),\n                          reinterpret_cast<void **>(&omniInterface));\n\n    if ( FAILED(hr) || !omniInterface )\n    {\n        qCWarning(runtime) << \"CoCreateInstance(OmniRig.OmniRigX) failed, hr =\" << QString::number(hr, 16);\n        lastErrorText = tr(\"Initialization Error\");\n        omniInterface = nullptr;\n        return;\n    }\n\n    // Event sink\n    eventSink = new OmniRigEventSinkV2(this);\n\n    IConnectionPointContainer *cpc = nullptr;\n    hr = omniInterface->QueryInterface(IID_IConnectionPointContainer, reinterpret_cast<void **>(&cpc));\n\n    qCDebug(runtime) << \"QI(IConnectionPointContainer) hr =\" << QString::number(hr, 16);\n\n    if ( SUCCEEDED(hr) && cpc )\n    {\n        hr = cpc->FindConnectionPoint(__uuidof(OmnirigV2::IOmniRigXEvents), &connPoint);\n        qCDebug(runtime) << \"FindConnectionPoint(IOmniRigXEvents) hr =\" << QString::number(hr, 16);\n\n        if (SUCCEEDED(hr) && connPoint)\n        {\n            hr = connPoint->Advise(eventSink, &connCookie);\n\n            qCDebug(runtime) << \"Advise(IOmniRigXEvents) hr =\" << QString::number(hr, 16)\n                             << \"cookie =\" << connCookie;\n\n            if ( FAILED(hr) )\n            {\n                qCWarning(runtime) << \"IConnectionPoint::Advise failed\";\n                connPoint->Release();\n                connPoint = nullptr;\n                connCookie = 0;\n            }\n        }\n        cpc->Release();\n    }\n}\n\nOmnirigV2RigDrv::~OmnirigV2RigDrv()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        // better to make a memory leak\n        CoUninitialize();\n        return;\n    }\n\n    if ( connPoint && connCookie )\n    {\n        connPoint->Unadvise(connCookie);\n        connCookie = 0;\n    }\n\n    if ( connPoint )\n    {\n        connPoint->Release();\n        connPoint = nullptr;\n    }\n\n    if ( eventSink )\n    {\n        eventSink->Release();\n        eventSink = nullptr;\n    }\n\n    if ( rig )\n    {\n        rig->Release();\n        rig = nullptr;\n    }\n\n    if ( omniInterface )\n    {\n        omniInterface->Release();\n        omniInterface = nullptr;\n    }\n\n    CoUninitialize();\n\n    drvLock.unlock();\n}\n\nbool OmnirigV2RigDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( !omniInterface )\n    {\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Rig is not initialized\";\n        return false;\n    }\n\n    long ifaceVer = 0;\n    long swVer    = 0;\n\n    omniInterface->get_InterfaceVersion(&ifaceVer);\n    omniInterface->get_SoftwareVersion(&swVer);\n\n    quint16 swMajor = static_cast<quint16>(swVer >> 16);\n    quint16 swMinor = static_cast<quint16>(swVer & 0xFFFF);\n    quint16 ifMajor = static_cast<quint16>(ifaceVer >> 8);\n    quint16 ifMinor = static_cast<quint16>(ifaceVer & 0xFF);\n\n    qCDebug(runtime) << \"Omnirig Version\"\n                     << swMajor << \".\" << swMinor\n                     << \"Interface Version\"\n                     << ifMajor << \".\" << ifMinor;\n\n    if ( rig )\n    {\n        rig->Release();\n        rig = nullptr;\n    }\n\n    HRESULT hr = E_FAIL;\n\n    switch (rigProfile.model)\n    {\n    case 1: hr = omniInterface->get_Rig1(&rig); break;\n    case 2: hr = omniInterface->get_Rig2(&rig); break;\n    case 3: hr = omniInterface->get_Rig3(&rig); break;\n    case 4: hr = omniInterface->get_Rig4(&rig); break;\n    default:\n        hr = E_INVALIDARG;\n        break;\n    }\n\n    if ( FAILED(hr) || !rig )\n    {\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Cannot get Rig Instance, hr =\" << QString::number(hr, 16);\n        return false;\n    }\n\n    __rigTypeChange(rigProfile.model);\n\n    QTimer::singleShot(500, this, [this]()\n    {\n        this->rigStatusChange(rigProfile.model);\n    });\n\n    return true;\n}\n\nbool OmnirigV2RigDrv::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n    return false;\n}\n\nQStringList OmnirigV2RigDrv::getAvailableModes()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    for ( auto it = modeMap.constBegin(); it != modeMap.constEnd(); ++it )\n        if ( it.key() & writableParams )\n            ret.append(it.value());\n\n    return ret;\n}\n\nvoid OmnirigV2RigDrv::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rig ) return;\n\n    long internalFreq = static_cast<long>(newFreq);\n\n    qCDebug(runtime) << \"Received freq\" << internalFreq << \"current\" << currFreq;\n\n    if ( internalFreq == currFreq ) return;\n\n    MUTEXLOCKER;\n\n    OmnirigV2::RigParamX vfo = OmnirigV2::PM_UNKNOWN;\n\n    rig->get_Vfo(&vfo);\n\n    if ( vfo & VFO_B_MASK )\n    {\n        qCDebug(runtime) << \"Setting VFO B Freq\";\n        rig->put_FreqB(internalFreq);\n    }\n    else if ( writableParams & OmnirigV2::PM_FREQA )\n    {\n        qCDebug(runtime) << \"Setting VFO A Freq\";\n        rig->put_FreqA(internalFreq);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Setting Generic VFO Freq\";\n        rig->put_Freq(internalFreq);\n    }\n\n    commandSleep();\n}\n\nvoid OmnirigV2RigDrv::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << QSTRING_FREQ(newFreq);\n\n    if ( !rigProfile.getFreqInfo || !rig ) return;\n\n    if ( vfoid == VFO1 )\n    {\n        setFrequency(newFreq);\n        return;\n    }\n\n    // VFO2 — TX frequency (set the non-active VFO)\n    long internalFreq = static_cast<long>(newFreq);\n\n    MUTEXLOCKER;\n\n    OmnirigV2::RigParamX vfo = OmnirigV2::PM_UNKNOWN;\n    rig->get_Vfo(&vfo);\n\n    if ( vfo & VFO_B_MASK )\n    {\n        qCDebug(runtime) << \"Active VFO is B, setting TX freq to VFO A\";\n        rig->put_FreqA(internalFreq);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Active VFO is A, setting TX freq to VFO B\";\n        rig->put_FreqB(internalFreq);\n    }\n\n    commandSleep();\n}\n\nvoid OmnirigV2RigDrv::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    if ( !rigProfile.getSplitInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    rig->put_Split(enabled ? OmnirigV2::PM_SPLITON : OmnirigV2::PM_SPLITOFF);\n\n    commandSleep();\n}\n\nvoid OmnirigV2RigDrv::setRawMode(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( !rigProfile.getModeInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    const QList<int> mappedMode = modeMap.keys(rawMode);\n\n    if (!mappedMode.isEmpty())\n    {\n        OmnirigV2::RigParamX m = static_cast<OmnirigV2::RigParamX>(mappedMode.at(0));\n        qCDebug(runtime) << \"Mode Found\" << m;\n        if ( m & writableParams )\n        {\n            qCDebug(runtime) << \"Setting Mode\";\n            rig->put_Mode(m);\n            commandSleep();\n        }\n    }\n}\n\nvoid OmnirigV2RigDrv::setMode(const QString &mode, const QString &submode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << submode << digiVariant;\n\n    QString innerSubmode(submode);\n\n    if ( digiVariant && !innerSubmode.isEmpty() )\n    {\n        const QString digMode = QLatin1String(\"DIG_\") + innerSubmode.at(0);\n        if (modeMap.key(digMode, 0) & writableParams)\n            innerSubmode = digMode;\n    }\n\n    setRawMode((submode.isEmpty()) ? mode.toUpper() : innerSubmode.toUpper());\n}\n\nvoid OmnirigV2RigDrv::setPTT(bool newPTTState)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newPTTState;\n\n    if ( !rigProfile.getPTTInfo || !rig ) return;\n\n    MUTEXLOCKER;\n\n    rig->put_Tx(newPTTState ? OmnirigV2::PM_TX : OmnirigV2::PM_RX);\n\n    commandSleep();\n}\n\nvoid OmnirigV2RigDrv::setKeySpeed(qint16)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n}\n\nvoid OmnirigV2RigDrv::syncKeySpeed(qint16)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n}\n\nvoid OmnirigV2RigDrv::sendMorse(const QString &)\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n}\n\nvoid OmnirigV2RigDrv::stopMorse()\n{\n    FCT_IDENTIFICATION;\n    //not implemented\n}\n\nvoid OmnirigV2RigDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n    MUTEXLOCKER;\n\n    checkChanges(0, true);\n}\n\nvoid OmnirigV2RigDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    offlineTimer.stop();\n}\n\nvoid OmnirigV2RigDrv::sendDXSpot(const DxSpot &)\n{\n    FCT_IDENTIFICATION;\n\n    // no action\n}\n\nvoid OmnirigV2RigDrv::rigTypeChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( rigID != rigProfile.model )\n        return;\n\n    MUTEXLOCKER;\n\n    __rigTypeChange(rigID);\n}\n\nvoid OmnirigV2RigDrv::__rigTypeChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigID != rigProfile.model ) return;\n\n    long r = 0;\n    long w = 0;\n    rig->get_ReadableParams(&r);\n    rig->get_WriteableParams(&w);\n\n    readableParams = static_cast<int>(r);\n    writableParams = static_cast<int>(w);\n\n    qCDebug(runtime) << \"R-params\" << QString::number(readableParams, 16)\n                     << \"W-params\" << QString::number(writableParams, 16);\n}\n\nvoid OmnirigV2RigDrv::rigStatusChange(int rigID)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"Rig ID\" << rigID;\n\n    if ( rigID != rigProfile.model ) return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    OmnirigV2::RigStatusX st = OmnirigV2::ST_NOTCONFIGURED;\n    rig->get_Status(&st);\n\n    BSTR statusStr = nullptr;\n    rig->get_StatusStr(&statusStr);\n    QString qStatusStr = bstrToQString(statusStr);\n\n    qCDebug(runtime) << \"Rig ID \" << rigID;\n    qCDebug(runtime) << \"New Status\" << st << qStatusStr;\n\n    if ( OmnirigV2::ST_ONLINE != st )\n    {\n        qCDebug(runtime) << \"New status\" << qStatusStr;\n        if (!offlineTimer.isActive())\n            offlineTimer.start(OFFLINETIMER_TIME_MS);\n    }\n    else\n    {\n        offlineTimer.stop();\n        emit rigIsReady();\n    }\n}\n\nvoid OmnirigV2RigDrv::rigParamsChange(int rigID, int params)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rigID << params;\n\n    if (rigID != rigProfile.model)\n        return;\n\n    MUTEXLOCKER;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    checkChanges(params);\n}\n\nvoid OmnirigV2RigDrv::checkChanges(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    checkSplitChange(params, force);\n    checkFreqChange(params, force);\n    checkModeChange(params, force);\n    checkPTTChange(params, force);\n    checkVFOChange(params, force);\n    checkRITChange(params, force);\n}\n\nbool OmnirigV2RigDrv::checkFreqChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( !rigProfile.getFreqInfo ) return true;\n    if ( !force && !( params & (FREQMASK | ALLVFOsMASK) ) ) return true;\n\n    unsigned int vfo_freq = 0;\n    OmnirigV2::RigParamX vfo = OmnirigV2::PM_UNKNOWN;\n    rig->get_Vfo(&vfo);\n    const bool vfoIsB = (vfo & VFO_B_MASK);\n\n    long tmp = 0L;\n    if ( vfoIsB )\n    {\n        qCDebug(runtime) << \"Getting VFO B Freq\";\n        rig->get_FreqB(&tmp);\n        if ( !tmp )\n        {\n            qCDebug(runtime) << \"FreqB returned 0, falling back to Freq()\";\n            rig->get_Freq(&tmp);\n        }\n    }\n    else\n    {\n        qCDebug(runtime) << \"Getting VFO A Freq\";\n        rig->get_FreqA(&tmp);\n        if ( !tmp )\n        {\n            qCDebug(runtime) << \"FreqA returned 0, falling back to Freq()\";\n            rig->get_Freq(&tmp);\n        }\n    }\n\n    vfo_freq = static_cast<unsigned int>(tmp);\n\n    qCDebug(runtime) << \"Rig Freq: \"<< vfo_freq;\n    qCDebug(runtime) << \"Object Freq: \"<< currFreq;\n\n    if ( vfo_freq != currFreq || force )\n    {\n        currFreq = vfo_freq;\n        qCDebug(runtime) << \"emitting FREQ changed\" << currFreq << Hz2MHz(currFreq);\n        emit frequencyChanged(Hz2MHz(currFreq),\n                              Hz2MHz(getRITFreq()),\n                              Hz2MHz(getXITFreq()));\n    }\n\n    // TX frequency (the non-active VFO) when split is active\n    if ( rigProfile.getSplitInfo && currSplitEnabled )\n    {\n        long txTmp = 0L;\n        if ( vfoIsB )\n            rig->get_FreqA(&txTmp);\n        else\n            rig->get_FreqB(&txTmp);\n\n        unsigned int txFreq = static_cast<unsigned int>(txTmp);\n\n        if ( txFreq != currTxFreq || force )\n        {\n            currTxFreq = txFreq;\n            qCDebug(runtime) << \"emitting TX FREQ changed\" << currTxFreq << Hz2MHz(currTxFreq);\n            emit txFrequencyChanged(Hz2MHz(currTxFreq));\n        }\n    }\n\n    return true;\n}\n\nbool OmnirigV2RigDrv::checkModeChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return false;\n    }\n\n    if ( rigProfile.getModeInfo )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV2::RigParamX m = OmnirigV2::PM_UNKNOWN;\n            rig->get_Mode(&m);\n            inParams = m;\n        }\n\n        QMap<int, QString>::const_iterator it;\n        for ( it = modeMap.begin(); it != modeMap.end(); ++it )\n        {\n            if ( inParams & it.key() )\n            {\n                qCDebug(runtime) << \"Rig Mode: \"<< it.value();\n                qCDebug(runtime) << \"Object Mode: \"<< currModeID;\n\n                if ( currModeID != it.value() || force)\n                {\n                    currModeID = it.value();\n\n                    QString submode;\n                    const QString mode = getModeNormalizedText(currModeID, submode);\n                    qCDebug(runtime) << \"emitting MODE changed\"\n                                     << currModeID << mode << submode << 0;\n                    emit modeChanged(currModeID,\n                                     mode, submode,\n                                     0);\n                }\n                break;\n            }\n        }\n    }\n    return true;\n}\n\nvoid OmnirigV2RigDrv::checkPTTChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( rigProfile.getPTTInfo\n         && (params & OmnirigV2::PM_RX\n            || params & OmnirigV2::PM_TX\n            || force) )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV2::RigParamX tx = OmnirigV2::PM_RX;\n            rig->get_Tx(&tx);\n            inParams = tx;\n        }\n\n        bool ptt = false;\n\n        if ( inParams & OmnirigV2::PM_RX )\n            ptt = false;\n\n        if ( inParams & OmnirigV2::PM_TX )\n            ptt = true;\n\n        qCDebug(runtime) << \"Rig PTT: \"<< ptt;\n        qCDebug(runtime) << \"Object Mode: \"<< currPTT;\n\n        if ( ptt != currPTT || force )\n        {\n            currPTT = ptt;\n            qCDebug(runtime) << \"emitting PTT changed\" << currPTT;\n            emit pttChanged(currPTT);\n        }\n    }\n}\n\nvoid OmnirigV2RigDrv::checkVFOChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( !rigProfile.getVFOInfo ) return;\n\n    if ( (params & ALLVFOsMASK) || force )\n    {\n        int inParams;\n        if (force || ( params & VFO_SPEC_MASK ) )\n        {\n            OmnirigV2::RigParamX v;\n            rig->get_Vfo(&v);\n            inParams = v;\n        }\n        else\n        {\n            inParams = params;\n        }\n\n        QString vfo;\n\n        if ( inParams & VFO_A_MASK ) vfo = \"VFOA\";\n        if ( inParams & VFO_B_MASK ) vfo = \"VFOB\";\n\n        qCDebug(runtime) << \"Rig VFO: \"<< vfo;\n        qCDebug(runtime) << \"Object VFO: \"<< currVFO;\n\n        if ( vfo != currVFO || force )\n        {\n            currVFO = vfo;\n            qCDebug(runtime) << \"emitting VFO changed\" << currVFO;\n            emit vfoChanged(currVFO);\n        }\n    }\n}\n\nvoid OmnirigV2RigDrv::checkRITChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if (rigProfile.getRITInfo\n        && (params & OmnirigV2::PM_RITON\n            || params & OmnirigV2::PM_RITOFF\n            || force))\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV2::RigParamX r;\n            rig->get_Rit(&r);\n            inParams = r;\n        }\n\n        long off = 0;\n        rig->get_RitOffset(&off);\n        unsigned int rit = (inParams & OmnirigV2::PM_RITON)\n                               ? static_cast<unsigned int>(off)\n                               : 0;\n\n        qCDebug(runtime) << \"Rig RIT: \"<< rit;\n        qCDebug(runtime) << \"Object RIT: \"<< currRIT;\n\n        if ( rit != currRIT || force )\n        {\n            currRIT = rit;\n            qCDebug(runtime) << \"emitting RIT changed\" << QSTRING_FREQ(Hz2MHz(currRIT));\n            qCDebug(runtime) << \"emitting FREQ changed \"\n                             << QSTRING_FREQ(Hz2MHz(currFreq))\n                             << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                             << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n            emit ritChanged(Hz2MHz(currRIT));\n            emit frequencyChanged(Hz2MHz(currFreq),\n                                  Hz2MHz(getRITFreq()),\n                                  Hz2MHz(getXITFreq()));\n        }\n    }\n}\n\nvoid OmnirigV2RigDrv::checkSplitChange(int params, bool force)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    if ( !rigProfile.getSplitInfo )\n    {\n        qCDebug(runtime) << \"Get SPLIT is disabled\";\n        return;\n    }\n\n    if ( (params & SPLIT_MASK) || force )\n    {\n        int inParams = params;\n        if ( force )\n        {\n            OmnirigV2::RigParamX s;\n            rig->get_Split(&s);\n            inParams = s;\n        }\n\n        bool splitEnabled = ( inParams & OmnirigV2::PM_SPLITON ) != 0;\n\n        qCDebug(runtime) << \"Rig Split:\" << splitEnabled;\n        qCDebug(runtime) << \"Object Split:\" << currSplitEnabled;\n\n        if ( splitEnabled != currSplitEnabled || force )\n        {\n            currSplitEnabled = splitEnabled;\n            qCDebug(runtime) << \"emitting SPLIT changed\" << currSplitEnabled;\n            emit splitChanged(currSplitEnabled);\n\n            if ( !currSplitEnabled )\n                currTxFreq = 0;\n        }\n    }\n}\n\ndouble OmnirigV2RigDrv::getRITFreq()\n{\n    FCT_IDENTIFICATION;\n    return currFreq + currRIT;\n}\n\nvoid OmnirigV2RigDrv::setRITFreq(double rit)\n{\n    currRIT = static_cast<unsigned int>(rit);\n}\n\ndouble OmnirigV2RigDrv::getXITFreq()\n{\n    return currFreq + currXIT;\n}\n\nvoid OmnirigV2RigDrv::setXITFreq(double xit)\n{\n    currXIT = static_cast<unsigned int>(xit);\n}\n\nvoid OmnirigV2RigDrv::emitDisconnect()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rig )\n    {\n        qCWarning(runtime) << \"Rig is not active\";\n        return;\n    }\n\n    emit errorOccurred(tr(\"Rig status changed\"),\n                       tr(\"Rig is not connected\"));\n}\n\nvoid OmnirigV2RigDrv::commandSleep()\n{\n    QThread::msleep(200);\n}\n\nconst QString OmnirigV2RigDrv::getModeNormalizedText(const QString &rawMode,\n                                                     QString &submode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    submode = QString();\n\n    if (rawMode.contains(QStringLiteral(\"CW\")))\n        return QStringLiteral(\"CW\");\n\n    if (rawMode == QStringLiteral(\"USB\")) {\n        submode = QStringLiteral(\"USB\");\n        return QStringLiteral(\"SSB\");\n    }\n\n    if (rawMode == QStringLiteral(\"LSB\")) {\n        submode = QStringLiteral(\"LSB\");\n        return QStringLiteral(\"SSB\");\n    }\n\n    if (rawMode == QStringLiteral(\"AM\"))\n        return QStringLiteral(\"AM\");\n\n    if (rawMode == QStringLiteral(\"FM\"))\n        return QStringLiteral(\"FM\");\n\n    // maybe bad maybe good\n    if (rawMode == QStringLiteral(\"DIG_U\")) {\n        submode = QStringLiteral(\"USB\");\n        return QStringLiteral(\"SSB\");\n    }\n\n    // maybe bad maybe good\n    if (rawMode == QStringLiteral(\"DIG_L\")) {\n        submode = QStringLiteral(\"LSB\");\n        return QStringLiteral(\"SSB\");\n    }\n\n    return QString();\n}\n"
  },
  {
    "path": "rig/drivers/Omnirigv2RigDrv.h",
    "content": "#ifndef OMNIRIGV2RIGRIGDRV_H\n#define OMNIRIGV2RIGRIGDRV_H\n\n#include <QMutex>\n#include <QTimer>\n#include <QMap>\n\n#include \"GenericRigDrv.h\"\n#include \"rig/RigCaps.h\"\n\n// Forward declaration from OmnirigV2 library (getting via #import in .cpp)\nnamespace OmnirigV2\n{\n    struct IOmniRigX;\n    struct IRigX;\n    struct IOmniRigXEvents;\n    enum RigParamX;\n    enum RigStatusX;\n}\n\nstruct IConnectionPoint;\ntemplate <typename Owner, typename EventInterface> class OmniRigEventSink;\n\nclass OmnirigV2RigDrv : public GenericRigDrv\n{\n    Q_OBJECT\n    friend class OmniRigEventSink<OmnirigV2RigDrv, OmnirigV2::IOmniRigXEvents>;\n\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static RigCaps getCaps(int);\n\n    explicit OmnirigV2RigDrv(const RigProfile &profile,\n                             QObject *parent = nullptr);\n\n    ~OmnirigV2RigDrv() override;\n\n    bool        open() override;\n    bool        isMorseOverCatSupported() override;\n    QStringList getAvailableModes() override;\n\n    void setFrequency(double) override;\n    void setFrequency(VFOID, double) override;\n    void setSplit(bool) override;\n    void setRawMode(const QString &) override;\n    void setMode(const QString &, const QString &, bool digiVariant) override;\n    void setPTT(bool) override;\n    void setKeySpeed(qint16 wpm) override;\n    void syncKeySpeed(qint16 wpm) override;\n    void sendMorse(const QString &) override;\n    void stopMorse() override;\n    void sendState() override;\n    void stopTimers() override;\n    void sendDXSpot(const DxSpot &spot) override;\n\npublic slots:\n    void rigTypeChange(int);\n    void rigStatusChange(int);\n    void rigParamsChange(int rigID, int params);\n\nprivate:\n    void __rigTypeChange(int);\n    void commandSleep();\n    const QString getModeNormalizedText(const QString &rawMode, QString &submode);\n\n    void checkChanges(int params, bool force = false);\n    bool checkFreqChange(int params, bool force);\n    bool checkModeChange(int params, bool force);\n    void checkPTTChange(int params, bool force);\n    void checkVFOChange(int params, bool force);\n    void checkRITChange(int params, bool force);\n    void checkSplitChange(int params, bool force);\n\n    double getRITFreq();\n    void   setRITFreq(double);\n    double getXITFreq();\n    void   setXITFreq(double);\n\n    void emitDisconnect();\n\nprivate:\n    unsigned int currFreq;\n    unsigned int currTxFreq;\n    unsigned int currRIT;\n    unsigned int currXIT;\n    bool         currPTT;\n    bool         currSplitEnabled;\n    QString      currModeID;\n    QString      currVFO;\n\n    // COM Objects\n    OmnirigV2::IOmniRigX *omniInterface;   // the main OmniRigX COM object\n    OmnirigV2::IRigX     *rig;\n\n    // Event sink (IDispatch) defined in OmniRigEventSink.h\n    OmniRigEventSink<OmnirigV2RigDrv, OmnirigV2::IOmniRigXEvents> *eventSink;\n    IConnectionPoint *connPoint;\n    unsigned long     connCookie;\n\n    // Parameters from OmniRig (bitmap)\n    int readableParams;\n    int writableParams;\n\n    QMutex drvLock;\n    QTimer offlineTimer;\n\n    const int FREQMASK;\n    const int VFO_A_MASK;\n    const int VFO_B_MASK;\n    const int VFO_SPEC_MASK;\n    const int ALLVFOsMASK;\n    const int SPLIT_MASK;\n\n    static const uint OFFLINETIMER_TIME_MS = 10000;\n\n    // Mode maps\n    QMap<int, QString> modeMap;\n};\n\n#endif // OMNIRIGV2RIGRIGDRV_H\n"
  },
  {
    "path": "rig/drivers/TCIRigDrv.cpp",
    "content": "#include <QColor>\n#include <QPalette>\n\n#include \"TCIRigDrv.h\"\n#include \"rig/macros.h\"\n#include \"data/Data.h\"\n#include \"data/BandPlan.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.rig.driver.tcidrv\");\n\n// https://github.com/ExpertSDR3/TCI/blob/main/TCI%20Protocol.pdf\n\nQList<QPair<int, QString> > TCIRigDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    ret << QPair<int, QString>(1, tr(\"Rig 0\")) // 0 cause a crash in setting dialog when RigModel combo is expacted, I don't know why\n        << QPair<int, QString>(2, tr(\"Rig 1\"))\n        << QPair<int, QString>(3, tr(\"Rig 2\"))\n        << QPair<int, QString>(4, tr(\"Rig 3\"));\n\n    return ret;\n}\n\nRigCaps TCIRigDrv::getCaps(int)\n{\n    FCT_IDENTIFICATION;\n\n    RigCaps ret;\n\n    ret.isNetworkOnly = true;\n\n    ret.canGetFreq = true;\n    ret.canGetMode = true;\n    ret.canGetVFO = true;\n    ret.canGetRIT = true;\n    ret.canGetXIT = true;\n    ret.canGetPTT = true;\n    ret.canSendMorse = true;\n    ret.canGetKeySpeed = true;\n    ret.canGetPWR = true;\n    ret.canProcessDXSpot = true;\n    ret.canGetSplit = true;\n\n    return ret;\n}\n\nTCIRigDrv::TCIRigDrv(const RigProfile &profile, QObject *parent)\n    : GenericRigDrv(profile, parent),\n      ready(false),\n      receivedOnly(false),\n      currFreq(0.0),\n      currTxFreq(0.0),\n      currRIT(0.0),\n      currXIT(0.0),\n      RITEnabled(false),\n      XITEnabled(false),\n      currSplitEnabled(false)\n{\n    FCT_IDENTIFICATION;\n\n    connect(&ws, &QWebSocket::connected, this, &TCIRigDrv::onConnected);\n#if (QT_VERSION < QT_VERSION_CHECK(6, 5, 0))\n    connect(&ws, QOverload<QAbstractSocket::SocketError>::of(&QWebSocket::error),\n            this, &TCIRigDrv::onSocketError);\n#else\n    connect(&ws, &QWebSocket::errorOccurred, this, &TCIRigDrv::onSocketError);\n#endif\n}\n\nTCIRigDrv::~TCIRigDrv()\n{\n    FCT_IDENTIFICATION;\n\n    TCIRigDrv::stopTimers();\n}\n\nbool TCIRigDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    QUrl url;\n    url.setScheme(\"ws\");\n    url.setHost(rigProfile.hostname);\n    url.setPort(rigProfile.netport);\n\n    ws.open(url);\n    return true;\n}\n\nbool TCIRigDrv::isMorseOverCatSupported()\n{\n    FCT_IDENTIFICATION;\n\n    return true;\n}\n\nQStringList TCIRigDrv::getAvailableModes()\n{\n    return modeList;\n}\n\nvoid TCIRigDrv::setFrequency(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newFreq;\n\n    if ( !rigProfile.getFreqInfo )\n        return;\n\n    unsigned long long internalFreq = static_cast<unsigned long long>(newFreq);\n\n    if ( internalFreq == currFreq )\n    {\n        qCDebug(runtime) << \"The same Freq - skip change\" << internalFreq << currFreq;\n        return;\n    }\n\n    QStringList args = {\"0\", //VFOID\n                        QString::number(internalFreq)\n                       };\n    sendCmd(\"vfo\", true, args);\n}\n\nvoid TCIRigDrv::setFrequency(VFOID vfoid, double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << newFreq;\n\n    if ( !rigProfile.getFreqInfo )\n        return;\n\n    if ( vfoid == VFO1 )\n    {\n        setFrequency(newFreq);\n        return;\n    }\n\n    // VFO2 — TX frequency\n    unsigned long long internalFreq = static_cast<unsigned long long>(newFreq);\n    QStringList args = {\"1\", //VFO2\n                        QString::number(internalFreq)\n                       };\n    sendCmd(\"vfo\", true, args);\n}\n\nvoid TCIRigDrv::setSplit(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    if ( !rigProfile.getSplitInfo ) return;\n\n    if ( receivedOnly )\n    {\n        qCDebug(runtime) << \"Only receiver - no action\";\n        return;\n    }\n\n    QStringList args = {enabled ? \"true\" : \"false\"};\n    sendCmd(\"split_enable\", true, args);\n}\n\nvoid TCIRigDrv::setRawMode(const QString &rawMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    if ( !rigProfile.getModeInfo || rawMode.isEmpty() )\n        return;\n\n    if ( rawMode == currMode )\n    {\n        qCDebug(runtime) << \"The same Mode - skip change\" << rawMode << currMode;\n        return;\n    }\n\n    QStringList args = {rawMode};\n    sendCmd(\"modulation\", true, args);\n}\n\nvoid TCIRigDrv::setMode(const QString &mode, const QString &subMode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode << digiVariant;\n\n    setRawMode(mode2RawMode(mode, subMode, digiVariant));\n}\n\nvoid TCIRigDrv::setPTT(bool newPTTState)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newPTTState;\n\n    if ( !rigProfile.getPTTInfo )\n        return;\n\n    if ( receivedOnly )\n    {\n        qCDebug(runtime) << \"Only receiver - no action\";\n        return;\n    }\n\n    QStringList args = {(newPTTState) ? \"true\" : \"false\"};\n    sendCmd(\"trx\", true, args);\n}\n\nvoid TCIRigDrv::setKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !rigProfile.getKeySpeed )\n        return;\n\n    if ( receivedOnly )\n    {\n        qCDebug(runtime) << \"Only receiver - no action\";\n        return;\n    }\n\n    QStringList args = {QString::number(wpm)};\n    sendCmd(\"cw_keyer_speed\", false, args);\n    sendCmd(\"cw_macros_speed\", false, args);\n}\n\nvoid TCIRigDrv::syncKeySpeed(qint16 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << wpm;\n\n    if ( !rigProfile.keySpeedSync )\n        return;\n\n    setKeySpeed(wpm);\n}\n\nvoid TCIRigDrv::sendMorse(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    if ( text.isEmpty() )\n        return;\n\n    if ( receivedOnly )\n    {\n        qCDebug(runtime) << \"Only receiver - no action\";\n        return;\n    }\n\n    QStringList args {text};\n    sendCmd(\"cw_macros\", true, args);\n}\n\nvoid TCIRigDrv::stopMorse()\n{\n    FCT_IDENTIFICATION;\n\n    if ( receivedOnly )\n    {\n        qCDebug(runtime) << \"Only receiver - no action\";\n        return;\n    }\n\n    sendCmd(\"cw_macros_stop\", false);\n}\n\nvoid TCIRigDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    // it seems that Rig sends its state at the begining of the session\n    // but it has to be implmented due to \"Exit From Manual Mode\"\n\n    sendCmd(\"vfo\", true, QStringList(\"0\")); //Freq\n    // sendCmd(\"trx\", true); // PTT\n                             // Disabled because if this command is received by Thetis\n                             // then Thetis unexpectedly closes the connection.\n                             // Expert SDR software does not do this.\n\n    sendCmd(\"modulation\", true); //Mode\n    //sendCmd(); // Current VFO ????\n    sendCmd(\"drive\", true); //PWR\n    sendCmd(\"rit_offset\", true);\n    sendCmd(\"rit_enable\", true);\n    sendCmd(\"xit_offset\", true);\n    sendCmd(\"xit_enable\", true);\n    sendCmd(\"split_enable\", true);\n    sendCmd(\"cw_macros_speed\", false);\n}\n\nvoid TCIRigDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    // no timer\n\n    // send STOP command????\n\n    // close the WebSocket here becuase this method is called\n    // via queue signals. What caused that there is not warning\n    // that Websocket is destroyed from another thread\n    ws.close();\n    return;\n}\n\nvoid TCIRigDrv::sendDXSpot(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigProfile.dxSpot2Rig )\n        return;\n\n    const QColor &spotColor = Data::statusToColor(spot.status, spot.dupeCount, QColor(187,194,195));\n\n    unsigned long long internalFreq = static_cast<unsigned long long>(MHz(spot.freq));\n\n    QString submode;\n    const QString &mode = BandPlan::bandPlanMode2ExpectedMode(spot.bandPlanMode, submode);\n\n    QStringList args = {\n        spot.callsign,\n        mode2RawMode(mode, submode, (BandPlan::isFTxBandMode(spot.bandPlanMode) || spot.bandPlanMode == BandPlan::BAND_MODE_DIGITAL)),\n        QString::number(internalFreq),\n        QString::number(spotColor.rgba()),\n        spot.callsign\n    };\n\n    sendCmd(\"spot\", 0, args);\n}\n\nvoid TCIRigDrv::onConnected()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Rig is connected\";\n\n    connect(&ws, &QWebSocket::textMessageReceived,\n            this, &TCIRigDrv::onTextMessageReceived);\n\n    // QLog has to wait for READY message to complete connection = to emit RigReady\n}\n\nvoid TCIRigDrv::onSocketError(QAbstractSocket::SocketError socker_error)\n{\n    FCT_IDENTIFICATION;\n\n    QString error_msg;\n\n    qCDebug(runtime) << socker_error;\n\n    switch (socker_error)\n    {\n    case QAbstractSocket::ConnectionRefusedError:\n        error_msg.append(QObject::tr(\"Connection Refused\"));\n        break;\n\n    case QAbstractSocket::RemoteHostClosedError:\n        error_msg.append(QObject::tr(\"Host closed the connection\"));\n        //reconectRequested = true;\n        break;\n\n    case QAbstractSocket::HostNotFoundError:\n        error_msg.append(QObject::tr(\"Host not found\"));\n        break;\n    case QAbstractSocket::SocketTimeoutError:\n        error_msg.append(QObject::tr(\"Timeout\"));\n        //reconectRequested = true;\n        break;\n    case QAbstractSocket::NetworkError:\n        error_msg.append(QObject::tr(\"Network Error\"));\n        break;\n    default:\n        error_msg.append(QObject::tr(\"Internal Error\"));\n    }\n\n   emit errorOccurred(tr(\"Error Occurred\"),\n                     error_msg);\n}\n\nvoid TCIRigDrv::onTextMessageReceived(const QString &message)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << message;\n\n    if ( message.isEmpty() )\n        return;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n    const QStringList &commands = message.split(\";\", Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n    const QStringList &commands = message.split(\";\", QString::SkipEmptyParts);\n#endif\n\n    for ( const QString &command : commands )\n    {\n        // message structure CMD1;CMD2;CMD3....\n        // CMD structure cmdName:arg0,arg1,arg2\n        qCDebug(runtime) << command;\n\n        const QString &trimmedCommand = command.trimmed();\n\n        if ( trimmedCommand.isEmpty() )\n            continue;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n        const QStringList &cmdElemets = trimmedCommand.split(\":\", Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n        const QStringList &cmdElemets = trimmedCommand.split(\":\", QString::SkipEmptyParts);\n#endif\n\n        const QString &cmdName = cmdElemets.at(0).toLower().trimmed();\n        QStringList cmdArgs;\n        TCIRigDrv::parseFce parser = responseParsers.value(cmdName);\n\n        if ( !parser )\n        {\n            qCDebug(runtime) << \"Parser function is not defined for\" << cmdName;\n            continue;\n        }\n\n        if ( cmdElemets.size() > 1 )\n        {\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n            cmdArgs = cmdElemets.at(1).split(\",\", Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n            cmdArgs = cmdElemets.at(1).split(\",\", QString::SkipEmptyParts);\n#endif\n        }\n\n        // Trim argument - is a space possible?\n        for( QString &arg : cmdArgs )\n            arg = arg.trimmed();\n\n        (this->*(parser))(cmdArgs);\n    }\n}\n\nvoid TCIRigDrv::sendCmd(const QString &cmd,\n                     bool addRigID,\n                     const QStringList& args)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !ready )\n    {\n        qCDebug(runtime) << \"Rig is not ready\";\n        return;\n    }\n\n    QStringList modifiedArgs(args);\n\n    if ( addRigID )\n        modifiedArgs.prepend(QString::number(rigProfile.model - 1));\n\n    //Mandatory part of the command\n    QString cmdText = cmd.toUpper();\n\n    if ( modifiedArgs.size() > 0 )\n        cmdText.append(\":\" + modifiedArgs.join(\",\"));\n\n    cmdText.append(\";\");\n\n    qCDebug(runtime) << \"Sending command:\" << cmdText;\n    ws.sendTextMessage(cmdText);\n}\n\nconst QString TCIRigDrv::getModeNormalizedText(const QString &rawMode, QString &submode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << rawMode;\n\n    submode = QString();\n\n    if ( rawMode.contains(\"CW\") )\n        return \"CW\";\n\n    if ( rawMode == \"USB\" )\n    {\n        submode = \"USB\";\n        return \"SSB\";\n    }\n\n    if ( rawMode == \"LSB\" )\n    {\n        submode = \"LSB\";\n        return \"SSB\";\n    }\n\n    if ( rawMode == \"AM\" )\n        return \"AM\";\n\n    if ( rawMode == \"NFM\" )\n        return \"FM\";\n\n    if ( rawMode == \"WFM\" )\n        return \"FM\";\n\n    if ( rawMode == \"DIGL\" )\n    {\n        submode = \"LSB\";\n        return \"SSB\";\n    }\n\n    if ( rawMode == \"DIGU\" )\n    {\n        submode = \"USB\";\n        return \"SSB\";\n    }\n\n    return QString();\n}\n\nconst QString TCIRigDrv::mode2RawMode(const QString &mode, const QString &submode, bool digiVariant)\n{\n    FCT_IDENTIFICATION;\n\n    if (mode == \"SSB\")\n    {\n        QString innerSubmode = submode;\n        if ( digiVariant )\n        {\n            const QString digMode = QLatin1String(\"DIG\") + submode.at(0);\n            if ( modeList.contains(digMode) )\n                innerSubmode = digMode;\n        }\n        return innerSubmode;\n    }\n\n    if ( mode == \"CW\" )\n        return mode;\n\n    if ( mode == \"FM\" )\n        return \"NFM\";\n\n    if ( mode == \"AM\" )\n        return mode;\n\n    if ( mode == \"FT8\" )\n    {\n        if ( modeList.contains(\"FT8\") )\n            return \"FT8\";\n\n        if ( modeList.contains(\"DIGU\") )\n            return \"DIGU\";\n\n        return \"USB\";\n    }\n\n    if ( mode == \"MFSK\" )\n    {\n        if ( submode == \"FT4\" && modeList.contains(\"FT4\"))\n            return \"FT4\";\n\n        if ( submode == \"FT2\" && modeList.contains(\"FT2\"))\n            return \"FT2\";\n\n        if ( modeList.contains(\"DIGU\") )\n            return \"DIGU\";\n\n        return \"USB\";\n    }\n\n    return QString();\n}\n\n#define CHECK_PARAMS_COUNT( size, min ) \\\n    if ( size < min ) \\\n    { qCWarning(runtime) << \"Incorrect number of arguments\" << size << min; \\\n      return; }\n\nvoid TCIRigDrv::rspPROTOCOL(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 — program name.\n    // аrg1 — version of the protocol.\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    qCDebug(runtime) << \"Program name:\" << cmdArgs.at(0)\n                     << \"Procotol version:\" << cmdArgs.at(1);\n}\n\nvoid TCIRigDrv::rspREADY(const QStringList &)\n{\n    FCT_IDENTIFICATION;\n\n    ready = true;\n    emit rigIsReady();\n}\n\nvoid TCIRigDrv::rspSTART(const QStringList &)\n{\n    FCT_IDENTIFICATION;\n\n    ready = true;\n}\n\nvoid TCIRigDrv::rspSTOP(const QStringList &)\n{\n    FCT_IDENTIFICATION;\n\n    ready = false;\n\n    emit errorOccurred(tr(\"Rig status changed\"),\n                      tr(\"Rig is not connected\"));\n}\n\nvoid TCIRigDrv::rspRECEIVE_ONLY(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - received only (true), transceiver (false)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 1);\n\n    receivedOnly = ( cmdArgs.at(0).toLower() == \"true\" );\n}\n\nvoid TCIRigDrv::rspMODULATIONS_LIST(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 ... N\n    for ( const QString &arg : cmdArgs )\n        modeList << arg.toUpper();\n\n    qCDebug(runtime) << modeList;\n}\n\nvoid TCIRigDrv::rspVFO(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - VFO\n    // arg2 - freq\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 3);\n\n    if ( !rigProfile.getFreqInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    if ( cmdArgs.at(1) == \"1\" )\n    {\n        // VFO 1 — TX frequency (relevant when split is active)\n        if ( !rigProfile.getSplitInfo )\n            return;\n\n        bool ok;\n        double txFreq = cmdArgs.at(2).toDouble(&ok);\n        if ( ok )\n        {\n            double txFreqMHz = Hz2MHz(txFreq);\n            qCDebug(runtime) << \"Rig TX Freq\" << QSTRING_FREQ(txFreqMHz);\n            if ( txFreqMHz != currTxFreq )\n            {\n                currTxFreq = txFreqMHz;\n                qCDebug(runtime) << \"emitting TX FREQ changed\";\n                emit txFrequencyChanged(currTxFreq);\n            }\n        }\n        else\n        {\n            qCDebug(runtime) << \"Received TX Freq is not double\" << cmdArgs.at(2);\n        }\n        return;\n    }\n\n    if ( cmdArgs.at(1) != \"0\" )\n    {\n        qCDebug(runtime) << \"Skipping info from VFO\" << cmdArgs.at(1);\n        return;\n    }\n\n    bool ok;\n    currFreq = cmdArgs.at(2).toDouble(&ok);\n    if ( ok )\n    {\n        qCDebug(runtime) << \"Rig Freq\" << QSTRING_FREQ(Hz2MHz(currFreq));\n        qCDebug(runtime) << \"emitting FREQ changed\";\n        emit frequencyChanged(Hz2MHz(currFreq),\n                              Hz2MHz(getRITFreq()),\n                              Hz2MHz(getXITFreq()));\n    }\n    else\n    {\n        qCDebug(runtime) << \"Received Freq is not double\" << cmdArgs.at(2);\n    }\n}\n\nvoid TCIRigDrv::rspTRX(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - status\n    // arg2 - signal source (optional)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getPTTInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    bool ptt = ( cmdArgs.at(1).compare(\"true\", Qt::CaseInsensitive) == 0 );\n\n    qCDebug(runtime) << \"Rig PTT:\"<< ptt;\n    qCDebug(runtime) << \"emitting PTT changed\" << ptt;\n    emit pttChanged(ptt);\n}\n\nvoid TCIRigDrv::rspMODULATION(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - mode\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getModeInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    currMode = cmdArgs.at(1);\n    QString submode;\n    const QString mode = getModeNormalizedText(currMode, submode);\n\n\n    qCDebug(runtime) << \"emitting MODE changed\" << currMode << mode << submode;\n    emit modeChanged(currMode,\n                     mode, submode,\n                     0);  // TODO: bandwidth should also be emited\n                          // when RX_FILTER_BAND is processed\n}\n\nvoid TCIRigDrv::rspTUNE_DRIVE(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - power output (in watts????)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n\n    // NO ACTION NOW\n}\n\nvoid TCIRigDrv::rspDRIVE(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - power output (in % of max - 0 - 100%)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getPWRInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    bool ok;\n    unsigned int powerLevel = cmdArgs.at(1).toUInt(&ok);\n\n    if ( ok )\n    {\n        // max power is set via Setting Rig Default PWR\n        double maxPower = (rigProfile.defaultPWR > 0.0) ? rigProfile.defaultPWR : 100.0;\n        const double rigPower = qRound(maxPower * powerLevel * 0.01 * 1000.0) / 1000.0;\n        qCDebug(runtime) << \"Rig PWR\" << rigPower;\n        qCDebug(runtime) << \"emitting PWR changed\";\n        emit powerChanged(rigPower);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Received PWR is not a number\" << cmdArgs.at(1);\n    }\n}\n\nvoid TCIRigDrv::rspRIT_OFFSET(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - rit (+- in HZ)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getRITInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    bool ok;\n    currRIT = cmdArgs.at(1).toDouble(&ok);\n\n    if ( ok )\n    {\n        qCDebug(runtime) << \"Rig RIT\" << RITEnabled << currRIT;\n        qCDebug(runtime) << \"emitting RIT changed\" << QSTRING_FREQ(Hz2MHz(getRawRIT()));\n        qCDebug(runtime) << \"emitting FREQ changed \" << QSTRING_FREQ(Hz2MHz(currFreq))\n                                                     << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                                                     << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n\n        emit ritChanged(Hz2MHz(getRawRIT()));\n        emit frequencyChanged(Hz2MHz(currFreq),\n                              Hz2MHz(getRITFreq()),\n                              Hz2MHz(getXITFreq()));\n    }\n    else\n    {\n        qCDebug(runtime) << \"Received RIT is not a double\" << cmdArgs.at(1);\n    }\n}\n\nvoid TCIRigDrv::rspXIT_OFFSET(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - rit (+- in HZ)\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getXITInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    bool ok;\n    currXIT = cmdArgs.at(1).toDouble(&ok);\n\n    if ( ok )\n    {\n        qCDebug(runtime) << \"Rig XIT\" << XITEnabled << currXIT;\n        qCDebug(runtime) << \"emitting XIT changed\" << QSTRING_FREQ(Hz2MHz(getRawXIT()));\n        qCDebug(runtime) << \"emitting FREQ changed \" << QSTRING_FREQ(Hz2MHz(currFreq))\n                                                     << QSTRING_FREQ(Hz2MHz(getRITFreq()))\n                                                     << QSTRING_FREQ(Hz2MHz(getXITFreq()));\n\n        emit xitChanged(Hz2MHz(getRawXIT()));\n        emit frequencyChanged(Hz2MHz(currFreq),\n                              Hz2MHz(getRITFreq()),\n                              Hz2MHz(getXITFreq()));\n    }\n    else\n    {\n        qCDebug(runtime) << \"Received XIT is not a double\" << cmdArgs.at(1);\n    }\n}\n\nvoid TCIRigDrv::rspCW_MACROS_SPEED(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - wpm\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 1);\n\n    bool ok;\n    unsigned int wpm = cmdArgs.at(0).toInt(&ok);\n\n    if ( ok )\n    {\n        qCDebug(runtime) << \"Rig Key Speed:\" << wpm;\n        emit keySpeedChanged(wpm);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Received RIT is not a double\" << cmdArgs.at(1);\n    }\n}\n\nvoid TCIRigDrv::rspRIT_ENABLE(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - status indicator.\n\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getRITInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    RITEnabled = ( cmdArgs.at(1).toLower() == \"true\" );\n\n    qCDebug(runtime) << \"Rig RIT status changed\" << RITEnabled << currRIT;\n    qCDebug(runtime) << \"emitting RIT changed\" << QSTRING_FREQ(Hz2MHz(getRawRIT()));\n    emit ritChanged(Hz2MHz(getRawRIT()));\n    emit frequencyChanged(Hz2MHz(currFreq),\n                          Hz2MHz(getRITFreq()),\n                          Hz2MHz(getXITFreq()));\n}\n\nvoid TCIRigDrv::rspXIT_ENABLE(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - status indicator.\n\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getXITInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1))\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    XITEnabled = ( cmdArgs.at(1).toLower() == \"true\" );\n\n    qCDebug(runtime) << \"Rig XIT status changed\" << XITEnabled << currXIT;\n    qCDebug(runtime) << \"emitting XIT changed\" << QSTRING_FREQ(Hz2MHz(getRawXIT()));\n    emit xitChanged(Hz2MHz(getRawXIT()));\n    emit frequencyChanged(Hz2MHz(currFreq),\n                          Hz2MHz(getRITFreq()),\n                          Hz2MHz(getXITFreq()));\n}\n\nvoid TCIRigDrv::rspSPLIT_ENABLE(const QStringList &cmdArgs)\n{\n    FCT_IDENTIFICATION;\n\n    // arg0 - rigid\n    // arg1 - status indicator.\n\n    CHECK_PARAMS_COUNT(cmdArgs.size(), 2);\n\n    if ( !rigProfile.getSplitInfo )\n        return;\n\n    if ( cmdArgs.at(0) != QString::number(rigProfile.model - 1) )\n    {\n        qCDebug(runtime) << \"Command is not for QLog\";\n        return;\n    }\n\n    bool newSplitEnabled = ( cmdArgs.at(1).toLower() == \"true\" );\n\n    qCDebug(runtime) << \"Rig Split status changed\" << newSplitEnabled;\n\n    if ( newSplitEnabled != currSplitEnabled )\n    {\n        currSplitEnabled = newSplitEnabled;\n        qCDebug(runtime) << \"emitting SPLIT changed\" << currSplitEnabled;\n        emit splitChanged(currSplitEnabled);\n    }\n\n    if ( currSplitEnabled )\n    {\n        // request TX VFO frequency when split is active\n        sendCmd(\"vfo\", true, QStringList(\"1\"));\n    }\n    else if ( currTxFreq != 0.0 )\n    {\n        currTxFreq = 0.0;\n    }\n}\n\n#undef CHECK_PARAMS_COUNT\n\ndouble TCIRigDrv::getRITFreq()\n{\n    FCT_IDENTIFICATION;\n\n    return currFreq + getRawRIT();\n}\n\nvoid TCIRigDrv::setRITFreq(double rit)\n{\n    currRIT = rit;\n}\n\ndouble TCIRigDrv::getXITFreq()\n{\n    return currFreq + currXIT;\n}\n\nvoid TCIRigDrv::setXITFreq(double xit)\n{\n    currXIT = xit;\n}\n\ndouble TCIRigDrv::getRawRIT()\n{\n    return ( ( RITEnabled ) ? currRIT : 0.0 );\n}\n\ndouble TCIRigDrv::getRawXIT()\n{\n    return ( ( XITEnabled ) ? currXIT : 0.0 );\n}\n\n"
  },
  {
    "path": "rig/drivers/TCIRigDrv.h",
    "content": "#ifndef RIG_DRIVERS_TCIRIGDRV_H\n#define RIG_DRIVERS_TCIRIGDRV_H\n\n#include <QtWebSockets>\n#include <QHash>\n#include \"GenericRigDrv.h\"\n#include \"rig/RigCaps.h\"\n\nclass TCIRigDrv : public GenericRigDrv\n{\n    Q_OBJECT\n\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static RigCaps getCaps(int);\n\n    explicit TCIRigDrv(const RigProfile &profile,\n                    QObject *parent = nullptr);\n    virtual ~TCIRigDrv();\n\n    virtual bool open() override;\n    virtual bool isMorseOverCatSupported() override;\n    virtual QStringList getAvailableModes() override;\n\n    virtual void setFrequency(double) override;\n    virtual void setFrequency(VFOID, double) override;\n    virtual void setSplit(bool) override;\n    virtual void setRawMode(const QString &) override;\n    virtual void setMode(const QString &, const QString &, bool) override;\n    virtual void setPTT(bool) override;\n    virtual void setKeySpeed(qint16 wpm) override;\n    virtual void syncKeySpeed(qint16 wpm) override;\n    virtual void sendMorse(const QString &) override;\n    virtual void stopMorse() override;\n    virtual void sendState() override;\n    virtual void stopTimers() override;\n    virtual void sendDXSpot(const DxSpot &spot) override;\n\nprivate slots:\n    void onConnected();\n    void onTextMessageReceived(const QString& message);\n    void onSocketError(QAbstractSocket::SocketError socker_error);\nprivate:\n\n    typedef void (TCIRigDrv::*parseFce)(const QStringList&);\n\n    void sendCmd(const QString &cmd,\n                 bool addRigID,\n                 const QStringList &args = QStringList());\n    const QString getModeNormalizedText(const QString& rawMode, QString &submode);\n    const QString mode2RawMode(const QString &mode, const QString &submode, bool digiVariant);\n\n    // commands functions\n    void rspPROTOCOL(const QStringList &);\n    void rspREADY(const QStringList &);\n    void rspSTART(const QStringList &);\n    void rspSTOP(const QStringList &);\n    void rspRECEIVE_ONLY(const QStringList &);\n    void rspMODULATIONS_LIST(const QStringList &);\n    void rspVFO(const QStringList &);\n    void rspTRX(const QStringList &);\n    void rspMODULATION(const QStringList &);\n    void rspTUNE_DRIVE(const QStringList &);\n    void rspDRIVE(const QStringList &);\n    void rspRIT_OFFSET(const QStringList &);\n    void rspXIT_OFFSET(const QStringList &);\n    void rspCW_MACROS_SPEED(const QStringList &);\n    void rspRIT_ENABLE(const QStringList &);\n    void rspXIT_ENABLE(const QStringList &);\n    void rspSPLIT_ENABLE(const QStringList &);\n\n    double getRITFreq();\n    void setRITFreq(double);\n    double getXITFreq();\n    void setXITFreq(double);\n    double getRawRIT();\n    double getRawXIT();\n\n    QWebSocket ws;\n    bool ready;\n    bool receivedOnly;\n    QStringList modeList;\n    double currFreq;\n    double currTxFreq;\n    QString currMode;\n    double currRIT;\n    double currXIT;\n    bool RITEnabled;\n    bool XITEnabled;\n    bool currSplitEnabled;\n\n    const QHash<QString, TCIRigDrv::parseFce> responseParsers =\n    {\n        {\"protocol\", &TCIRigDrv::rspPROTOCOL},\n        {\"ready\", &TCIRigDrv::rspREADY},\n        {\"start\", &TCIRigDrv::rspSTART},\n        {\"stop\", &TCIRigDrv::rspSTOP},\n        {\"receive_only\", &TCIRigDrv::rspRECEIVE_ONLY},\n        {\"modulations_list\", &TCIRigDrv::rspMODULATIONS_LIST},\n        {\"vfo\", &TCIRigDrv::rspVFO},\n        {\"trx\", &TCIRigDrv::rspTRX},\n        {\"modulation\", &TCIRigDrv::rspMODULATION},\n        {\"tune_drive\", &TCIRigDrv::rspTUNE_DRIVE},\n        {\"drive\", &TCIRigDrv::rspDRIVE},\n        {\"rit_offset\", &TCIRigDrv::rspRIT_OFFSET},\n        {\"xit_offset\", &TCIRigDrv::rspXIT_OFFSET},\n        {\"cw_macros_speed\", &TCIRigDrv::rspCW_MACROS_SPEED},\n        {\"rit_enable\", &TCIRigDrv::rspRIT_ENABLE},\n        {\"xit_enable\", &TCIRigDrv::rspXIT_ENABLE},\n        {\"split_enable\", &TCIRigDrv::rspSPLIT_ENABLE},\n    };\n};\n\n#endif // RIG_DRIVERS_TCIRIGDRV_H\n"
  },
  {
    "path": "rig/macros.h",
    "content": "#ifndef RIG_MACROS_H\n#define RIG_MACROS_H\n\n#define BANDWIDTH_UNKNOWN 0\n#define QSTRING_FREQ(f) (QString::number((f), 'f', 5))\n#define Hz2MHz(f) ((double)((f)/1e6))\n#define Hz2kHz(f) ((double)((f)/1e3))\n#define mW2W(f) ((double)((f)/1000.0))\n#ifndef MHz\n#define MHz(f)  ((double)((f)*(double)1000000))\n#endif\n#ifndef kHz\n#define kHz(f)  ((double)((f)*(double)1000))\n#endif\n\n#endif // RIG_MACROS_H\n"
  },
  {
    "path": "rotator/RotCaps.cpp",
    "content": "#include \"RotCaps.h\"\n\nRotCaps::RotCaps(bool isNetworkOnly,\n                 int serial_data_bits,\n                 int serial_stop_bits) :\n    isNetworkOnly(isNetworkOnly),\n    serialDataBits(serial_data_bits),\n    serialStopBits(serial_stop_bits)\n{\n\n}\n"
  },
  {
    "path": "rotator/RotCaps.h",
    "content": "#ifndef QLOG_ROTATOR_ROTCAPS_H\n#define QLOG_ROTATOR_ROTCAPS_H\n\n\nclass RotCaps\n{\npublic:\n    RotCaps(bool isNetworkOnly = false,\n            int serial_data_bits = 8,\n            int serial_stop_bits = 1);\n\n    bool isNetworkOnly;\n    int serialDataBits;\n    int serialStopBits;\n};\n\n#endif // QLOG_ROTATOR_ROTCAPS_H\n"
  },
  {
    "path": "rotator/Rotator.cpp",
    "content": "#include \"rotator/Rotator.h\"\n#include \"core/debug.h\"\n#include \"rotator/drivers/HamlibRotDrv.h\"\n#include \"rotator/drivers/PSTRotDrv.h\"\n\nMODULE_IDENTIFICATION(\"qlog.rotator.rotator\");\n\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Rot mutex\"; \\\n                        QMutexLocker locker(&rotLock); \\\n                        qCDebug(runtime) << \"Using Rot\"\n\n\n#define TIME_PERIOD 1000\n\nRotator::Rotator(QObject *parent) :\n    QObject{parent},\n    rotDriver(nullptr),\n    connected(false),\n    cacheAzimuth(0.0),\n    cacheElevation(0.0)\n{\n    FCT_IDENTIFICATION;\n\n    drvMapping[HAMLIB_DRIVER] = DrvParams(HAMLIB_DRIVER,\n                                          \"Hamlib\",\n                                          &HamlibRotDrv::getModelList,\n                                          &HamlibRotDrv::getCaps);\n    drvMapping[PSTROTATOR_DRIVER] = DrvParams(PSTROTATOR_DRIVER,\n                                          \"PSTRotator\",\n                                          &PSTRotDrv::getModelList,\n                                          &PSTRotDrv::getCaps);\n}\n\nRotator::~Rotator()\n{\n    FCT_IDENTIFICATION;\n\n    __closeRot();\n}\n\ndouble Rotator::getAzimuth()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    return cacheAzimuth;\n}\n\ndouble Rotator::getElevation()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    return cacheElevation;\n}\n\nbool Rotator::isRotConnected()\n{\n    FCT_IDENTIFICATION;\n\n    return connected;\n}\n\nconst QList<QPair<int, QString> > Rotator::getModelList(const DriverID &id) const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    if ( drvMapping.contains(id)\n         && drvMapping.value(id).getModeslListFunction != nullptr )\n    {\n        ret = (drvMapping.value(id).getModeslListFunction)();\n    }\n    return ret;\n}\n\nconst QList<QPair<int, QString> > Rotator::getDriverList() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    const QList<int> &keys = drvMapping.keys();\n\n    for ( const int &key : keys )\n    {\n        ret << QPair<int, QString>(key, drvMapping[key].driverName);\n    }\n\n    return ret;\n}\n\nconst RotCaps Rotator::getRotCaps(const DriverID &id, int model) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( drvMapping.contains(id)\n         && drvMapping.value(id).getCapsFunction != nullptr)\n    {\n        return (drvMapping.value(id).getCapsFunction)(model);\n    }\n    return RotCaps();\n}\n\nvoid Rotator::stopTimer()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    bool check = QMetaObject::invokeMethod(Rotator::instance(),\n                                           &Rotator::stopTimerImplt,\n                                           Qt::QueuedConnection);\n    Q_ASSERT( check );\n}\n\nvoid Rotator::stopTimerImplt()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rotDriver )\n        rotDriver->stopTimers();\n}\n\nvoid Rotator::start()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid Rotator::open()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &Rotator::openImpl, Qt::QueuedConnection);\n}\n\nvoid Rotator::openImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    __openRot();\n}\n\nvoid Rotator::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"sendStateImpl\", Qt::QueuedConnection);\n}\n\nvoid Rotator::sendStateImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( ! rotDriver )\n        return;\n\n    rotDriver->sendState();\n}\n\nvoid Rotator::__openRot()\n{\n    FCT_IDENTIFICATION;\n\n    // if rot is active then close it\n    __closeRot();\n\n    RotProfile newRotProfile = RotProfilesManager::instance()->getCurProfile1();\n\n    if ( newRotProfile == RotProfile() )\n    {\n        emit rotErrorPresent(tr(\"No Rotator Profile selected\"),\n                             QString());\n        return;\n    }\n\n    qCDebug(runtime) << \"Opening profile name: \" << newRotProfile.profileName;\n\n    rotDriver = getDriver(newRotProfile);\n\n    if ( !rotDriver )\n    {\n        // initialization failed\n        emit rotErrorPresent(tr(\"Initialization Error\"),\n                             tr(\"Internal Error\"));\n        return;\n    }\n\n    connect(rotDriver, &GenericRotDrv::positioningChanged, this, [this](double a, double b)\n    {\n        cacheAzimuth = a;\n        cacheElevation = b;\n        emit positionChanged(a, b);\n    });\n\n    connect(rotDriver, &GenericRotDrv::errorOccurred, this, [this](const QString &a,\n                                                                const QString &b)\n    {\n        close();\n        emit rotErrorPresent(a, b);\n    });\n\n    connect(rotDriver, &GenericRotDrv::rotIsReady, this, [this, newRotProfile]()\n    {\n        connected = true;\n\n        emit rotConnected();\n\n        sendState();\n    });\n\n    if ( !rotDriver->open() )\n    {\n        emit rotErrorPresent(tr(\"Cannot open Rotator\"),\n                             rotDriver->lastError());\n        qWarning() << rotDriver->lastError();\n        __closeRot();\n        return;\n    }\n}\n\nGenericRotDrv *Rotator::getDriver(const RotProfile &profile)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << profile.driver;\n\n    switch ( profile.driver )\n    {\n    case Rotator::HAMLIB_DRIVER:\n        return new HamlibRotDrv(profile, this);\n        break;\n    case Rotator::PSTROTATOR_DRIVER:\n        return new PSTRotDrv(profile, this);\n        break;\n    default:\n        qWarning() << \"Unsupported Rotator Driver \" << profile.driver;\n    }\n\n    return nullptr;\n}\n\nvoid Rotator::close()\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, &Rotator::closeImpl, Qt::QueuedConnection);\n}\n\n\nvoid Rotator::closeImpl()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n    __closeRot();\n}\n\nvoid Rotator::__closeRot()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rotDriver )\n    {\n        qCDebug(runtime) << \"Driver is not active\";\n        return;\n    }\n\n    delete rotDriver;\n    rotDriver = nullptr;\n    connected = false;\n    emit rotDisconnected();\n}\n\n\nvoid Rotator::setPosition(double azimuth, double elevation)\n{\n    FCT_IDENTIFICATION;\n\n    QMetaObject::invokeMethod(this, \"setPositionImpl\", Qt::QueuedConnection,\n                              Q_ARG(double,azimuth), Q_ARG(double,elevation));\n}\n\n\nvoid Rotator::setPositionImpl(double azimuth, double elevation)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<azimuth<< \" \" << elevation;\n\n    MUTEXLOCKER;\n\n    if ( ! rotDriver )\n        return;\n\n    rotDriver->setPosition(azimuth, elevation);\n}\n\n#undef MUTEXLOCKER\n"
  },
  {
    "path": "rotator/Rotator.h",
    "content": "#ifndef QLOG_ROTATOR_ROTATOR_H\n#define QLOG_ROTATOR_ROTATOR_H\n#include <QTimer>\n\n#include \"data/RotProfile.h\"\n#include \"rotator/drivers/GenericRotDrv.h\"\n#include \"RotCaps.h\"\n\nclass Rotator : public QObject\n{\n    Q_OBJECT\n\npublic:\n\n    enum DriverID\n    {\n        UNDEF_DRIVER = 0,\n        HAMLIB_DRIVER = 1,\n        PSTROTATOR_DRIVER = 2\n    };\n\n    static Rotator* instance()\n    {\n        static Rotator instance;\n        return &instance;\n    };\n    double getAzimuth();\n    double getElevation();\n    bool isRotConnected();\n\n    const QList<QPair<int, QString>> getModelList(const DriverID &id) const;\n    const QList<QPair<int, QString>> getDriverList() const;\n    const RotCaps getRotCaps(const DriverID &, int) const;\n\nsignals:\n    void positionChanged(double azimuth, double elevation);\n    void rotErrorPresent(QString, QString);\n    void rotDisconnected();\n    void rotConnected();\n\npublic slots:\n    void start();\n    void open();\n    void close();\n    void stopTimer();\n\n    void sendState();\n    void setPosition(double azimuth, double elevation);\n\nprivate slots:\n    void setPositionImpl(double azimuth, double elevation);\n    void stopTimerImplt();\n    void openImpl();\n    void closeImpl();\n    void sendStateImpl();\n\nprivate:\n    Rotator(QObject *parent = nullptr);\n    ~Rotator();\n\n    class DrvParams\n    {\n    public:\n        DrvParams(const DriverID id,\n                  const QString &driverName,\n                  QList<QPair<int, QString>> (*getModelfct)(),\n                  RotCaps (*getCapsfct)(int)) :\n            driverID(id),\n            driverName(driverName),\n            getModeslListFunction(getModelfct),\n            getCapsFunction(getCapsfct)\n            {};\n\n        DrvParams() :\n            driverID(UNDEF_DRIVER),\n            getModeslListFunction(nullptr),\n            getCapsFunction(nullptr)\n        {};\n\n        DriverID driverID;\n        QString driverName;\n        QList<QPair<int, QString>> (*getModeslListFunction)();\n        RotCaps (*getCapsFunction)(int);\n    };\n\n    QMap<int, DrvParams> drvMapping;\n\n    void __closeRot();\n    void __openRot();\n\n    GenericRotDrv *getDriver(const RotProfile &profile);\n\nprivate:\n    GenericRotDrv *rotDriver;\n    QMutex rotLock;\n    bool connected;\n    double cacheAzimuth;\n    double cacheElevation;\n};\n\n#endif // QLOG_ROTATOR_ROTATOR_H\n"
  },
  {
    "path": "rotator/drivers/GenericRotDrv.cpp",
    "content": "#include \"GenericRotDrv.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.rot.driver.genericrotdrv\");\n\nGenericRotDrv::GenericRotDrv(const RotProfile &profile,\n                             QObject *parent)\n    : QObject{parent},\n      rotProfile(profile),\n      opened(false),\n      azimuth(0.0),\n      elevation(0.0)\n{\n    FCT_IDENTIFICATION;\n}\n\nconst RotProfile GenericRotDrv::getCurrRotProfile() const\n{\n    FCT_IDENTIFICATION;\n\n    return rotProfile;\n}\n\nconst QString GenericRotDrv::lastError() const\n{\n    FCT_IDENTIFICATION;\n\n    return lastErrorText;\n}\n\ndouble GenericRotDrv::normalizeAzimuth(double azimuth) const\n{\n    FCT_IDENTIFICATION;\n\n    /* This function takes any azimuth value (in degrees), including\n     * negative values or values greater than 360, and returns an\n     * equivalent angle normalized to the range [0, 360).\n     */\n\n    double normalized = fmod(azimuth, 360.0);\n\n    if ( normalized < 0.0 ) normalized += 360.0;\n\n    qCDebug(runtime) << \"Input azimuth:\" << azimuth\n                     << \"Normalized azimuth:\" << normalized;\n\n    return normalized;\n}\n"
  },
  {
    "path": "rotator/drivers/GenericRotDrv.h",
    "content": "#ifndef QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H\n#define QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H\n\n#include <QObject>\n#include \"data/RotProfile.h\"\n\nclass GenericRotDrv : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit GenericRotDrv(const RotProfile &profile,\n                           QObject *parent = nullptr);\n\n    virtual ~GenericRotDrv() {};\n    const RotProfile getCurrRotProfile() const;\n    const QString lastError() const;\n\n    virtual bool open() = 0;\n    virtual void sendState() = 0;\n    virtual void setPosition(double azimuth, double elevation) = 0;\n    virtual void stopTimers() = 0;\n    double normalizeAzimuth(double azimuth) const;\n\nsignals:\n    void rotIsReady();\n    void positioningChanged(double azimuth, double elevation);\n\n    // Error Signal\n    void errorOccurred(QString, QString);\n\nprotected:\n    RotProfile rotProfile;\n    QString lastErrorText;\n    bool opened;\n    double azimuth;\n    double elevation;\n};\n\n#endif // QLOG_ROTATOR_DRIVERS_GENERICROTDRV_H\n"
  },
  {
    "path": "rotator/drivers/HamlibRotDrv.cpp",
    "content": "#include <QRegularExpression>\n#include <cmath>\n\n#include \"HamlibRotDrv.h\"\n#include \"core/debug.h\"\n#include \"data/SerialPort.h\"\n#include \"data/AntProfile.h\"\n\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Rot Drv mutex\"; \\\n                        QMutexLocker locker(&drvLock); \\\n                        qCDebug(runtime) << \"Using Rot Drv\"\n\n#ifndef HAMLIB_FILPATHLEN\n#define HAMLIB_FILPATHLEN FILPATHLEN\n#endif\n\n#ifndef RIG_IS_SOFT_ERRCODE\n#define RIG_IS_SOFT_ERRCODE(errcode) (errcode == RIG_EINVAL || errcode == RIG_ENIMPL || errcode == RIG_ERJCTED \\\n    || errcode == RIG_ETRUNC || errcode == RIG_ENAVAIL || errcode == RIG_ENTARGET \\\n    || errcode == RIG_EVFO || errcode == RIG_EDOM)\n\n#endif\n\nMODULE_IDENTIFICATION(\"qlog.rotator.driver.hamlibdrv\");\n\nQList<QPair<int, QString> > HamlibRotDrv::getModelList()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> ret;\n\n    rot_load_all_backends();\n    rot_list_foreach(addRig, &ret);\n\n    return ret;\n}\n\nRotCaps HamlibRotDrv::getCaps(int model)\n{\n    FCT_IDENTIFICATION;\n\n    const struct rot_caps *caps = rot_get_caps(model);\n    RotCaps ret;\n\n    ret.isNetworkOnly = (model == RIG_MODEL_NETRIGCTL);\n\n    ret.serialDataBits = caps->serial_data_bits;\n    ret.serialStopBits = caps->serial_stop_bits;\n\n    return ret;\n}\n\nint HamlibRotDrv::addRig(const rot_caps *caps, void *data)\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<int, QString>> *list = static_cast<QList<QPair<int, QString>>*>(data);\n\n    QString name = QString(\"%1 %2 (%3)\").arg(caps->mfg_name,\n                                             caps->model_name,\n                                             caps->version);\n\n    list->append(QPair<int, QString>(caps->rot_model, name));\n    return -1;\n}\n\nHamlibRotDrv::HamlibRotDrv(const RotProfile &profile,\n                     QObject *parent)\n    : GenericRotDrv{profile, parent},\n      rot(nullptr),\n      forceSendState(false)\n{\n    FCT_IDENTIFICATION;\n\n    rot_load_all_backends();\n\n    rot = rot_init(rotProfile.model);\n\n    if ( !rot )\n    {\n        // initialization failed\n        qCDebug(runtime) << \"Cannot allocate Rotator structure\";\n        lastErrorText = tr(\"Initialization Error\");\n    }\n\n    rig_set_debug(RIG_DEBUG_BUG);\n\n    connect(&errorTimer, &QTimer::timeout,\n            this, &HamlibRotDrv::checkErrorCounter);\n\n}\n\nHamlibRotDrv::~HamlibRotDrv()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        // better to make a memory leak\n        return;\n    }\n\n    if ( rot )\n    {\n        rot_close(rot);\n        rot_cleanup(rot);\n        rot = nullptr;\n    }\n    drvLock.unlock();\n}\n\nbool HamlibRotDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    if ( !rot )\n    {\n        // initialization failed\n        lastErrorText = tr(\"Initialization Error\");\n        qCDebug(runtime) << \"Rot is not initialized\";\n        return false;\n    }\n\n    RotProfile::rotPortType portType = rotProfile.getPortType();\n\n    if ( portType == RotProfile::NETWORK_ATTACHED )\n    {\n        //handling Network Radio\n        const QString portString = rotProfile.hostname + \":\" + QString::number(rotProfile.netport);\n        strncpy(rot->state.rotport.pathname, portString.toLocal8Bit().constData(), HAMLIB_FILPATHLEN - 1);\n    }\n    else if ( portType == RotProfile::SERIAL_ATTACHED )\n    {\n        //handling Serial Port Radio\n        strncpy(rot->state.rotport.pathname, rotProfile.portPath.toLocal8Bit().constData(), HAMLIB_FILPATHLEN - 1);\n        rot->state.rotport.parm.serial.rate = rotProfile.baudrate;\n        rot->state.rotport.parm.serial.data_bits = rotProfile.databits;\n        rot->state.rotport.parm.serial.stop_bits = rotProfile.stopbits;\n        rot->state.rotport.parm.serial.handshake = stringToHamlibFlowControl(rotProfile.flowcontrol);\n        rot->state.rotport.parm.serial.parity = stringToHamlibParity(rotProfile.parity);\n    }\n    else\n    {\n        lastErrorText = tr(\"Unsupported Rotator Driver\");\n        qCDebug(runtime) << \"Rot Open Error\" << lastErrorText;\n        return false;\n    }\n\n    token_t timeout_token = rot_token_lookup(rot, \"timeout\");\n    if (timeout_token != -RIG_EINVAL) {\n        int ret = rot_set_conf(rot, timeout_token, \"5000\");\n        if (ret == RIG_OK) {\n            qCDebug(runtime) << \"Rotator timeout set to 5000ms\";\n        } else {\n            qCDebug(runtime) << \"rot_set_conf(timeout) failed:\" << rigerror(ret);\n        }\n    } else {\n        qCDebug(runtime) << \"timeout token not found\";\n    }\n\n    int status = rot_open(rot);\n\n    if ( !isRotRespOK(status, tr(\"Rot Open Error\"), false) )\n        return false;\n\n    qCDebug(runtime) << \"Rot Open - OK\";\n\n    opened = true;\n\n    connect(&timer, &QTimer::timeout, this, &HamlibRotDrv::checkRotStateChange);\n    timer.start(POLL_INTERVAL);\n    emit rotIsReady();\n    return true;\n}\n\nvoid HamlibRotDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    forceSendState = true;\n}\n\n// in_azimuth range is 0 - 360\n// in_elevation, not used - always 0\nvoid HamlibRotDrv::setPosition(double in_azimuth, double in_elevation)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_azimuth << in_elevation;\n\n    MUTEXLOCKER;\n\n    if ( !rot || !rot->caps )\n    {\n        qCWarning(runtime) << \"Rot is not active\";\n        return;\n    }\n\n    if ( rot->caps->max_az == 0 )\n    {\n        qCWarning(runtime) << \"Rot does not support the Azimuth setting\";\n        return;\n    }\n\n    double newElevation = in_elevation;\n    double newAzimuth = in_azimuth - AntProfilesManager::instance()->getCurProfile1().azimuthOffset;\n    // offset interval is -180 to 180\n    // azimuth input interval is 0 to 360\n    // min value is -180\n    // max valus is 540\n    newAzimuth = fmod(newAzimuth + 360, 360);\n    qCDebug(runtime) << \"Azimuth (with offset)\" << newAzimuth;\n\n    /**********************************/\n    /* Rotator specific modifications */\n    /**********************************/\n\n    qCDebug(runtime) << \"Rotator limits: AZ\"\n                     << rot->caps->min_az << \"to\" << rot->caps->max_az\n                     << \"EL\"\n                     << rot->caps->min_el << \"to\" << rot->caps->max_el;\n\n    // recalculate azimuth to interval -180 to 180 for rotators that have this interval\n    if ( rot->caps->max_az == 180.0 && rot->caps->min_az == -180.0 )\n    {\n        if ( newAzimuth > 180.0 )\n        {\n            qCDebug(runtime) << \"Azimuth need to be recalculated to interval -180 to 180\";\n            newAzimuth -= 360.0;\n        }\n    }\n    else if ( rot->caps->max_az == 359.9f && newAzimuth > 359.9f )\n    {\n        // exception for Green Heron RT-21\n        newAzimuth = 0;\n    }\n\n    /************************/\n    /* END of modifications */\n    /************************/\n\n    // the final value of the azimuth and elevation is known\n    qCDebug(runtime) << \"Set Az/El position\"\n                     << static_cast<azimuth_t>(newAzimuth)\n                     << static_cast<elevation_t>(newElevation);\n\n    int status = rot_set_position(rot,\n                                  static_cast<azimuth_t>(newAzimuth),\n                                  static_cast<elevation_t>(newElevation));\n\n    isRotRespOK(status, tr(\"Set Possition Error\"), false);\n\n    // wait a moment because Rotators are slow and they are not possible to set and get\n    // mode so quickly (get mode is called in the main thread's update() function\n    commandSleep();\n}\n\nvoid HamlibRotDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    timer.stop();\n    errorTimer.stop();\n}\n\nvoid HamlibRotDrv::checkRotStateChange()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !drvLock.tryLock(200) )\n    {\n        qCDebug(runtime) << \"Waited too long\";\n        return;\n    }\n\n    qCDebug(runtime) << \"Getting Rot state\";\n\n    checkChanges();\n\n    forceSendState = false;\n\n    // restart timer\n    timer.start(POLL_INTERVAL);\n    drvLock.unlock();\n}\n\nvoid HamlibRotDrv::checkErrorCounter()\n{\n    FCT_IDENTIFICATION;\n\n    if ( postponedErrors.isEmpty() )\n       return;\n\n    qCDebug(runtime) << postponedErrors;\n\n     // emit only one error\n    auto it = postponedErrors.constBegin();\n    emit errorOccurred(it.key(), it.value());\n    postponedErrors.clear();\n}\n\nvoid HamlibRotDrv::checkChanges()\n{\n    FCT_IDENTIFICATION;\n\n    checkAzEl();\n}\n\nvoid HamlibRotDrv::checkAzEl()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rot )\n    {\n        qCWarning(runtime) << \"Rot is not active\";\n        return;\n    }\n\n    if ( rot->caps->get_position )\n    {\n        azimuth_t az;\n        elevation_t el;\n\n        int status = rot_get_position(rot, &az, &el);\n        if ( isRotRespOK(status, tr(\"Get Possition Error\")) )\n        {\n            double newAzimuth = az;\n            double newElevation = el;\n            // Azimuth Normalization (-180,180) -> (0,360) - ADIF defined interval is 0-360\n            newAzimuth += AntProfilesManager::instance()->getCurProfile1().azimuthOffset;\n            newAzimuth = normalizeAzimuth(newAzimuth);\n\n             qCDebug(runtime) << \"Rot Position: \" << newAzimuth << newElevation;\n             qCDebug(runtime) << \"Object Position: \"<< azimuth << elevation;\n\n            if ( newAzimuth != azimuth\n                 || newElevation != elevation\n                 || forceSendState)\n            {\n                azimuth = newAzimuth;\n                elevation = newElevation;\n                qCDebug(runtime) << \"emitting POSITIONING changed\";\n                emit positioningChanged(azimuth, elevation);\n            }\n        }\n    }\n    else\n        qCDebug(runtime) << \"Get POSITION is disabled\";\n}\n\nbool HamlibRotDrv::isRotRespOK(int errorStatus, const QString errorName, bool emitError)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << errorStatus << errorName << emitError;\n\n    if ( errorStatus == RIG_OK ) // there are no special codes for ROT, use RIG codes\n    {\n        if ( emitError )\n            postponedErrors.remove(errorName);\n        return true;\n    }\n\n    lastErrorText = hamlibErrorString(errorStatus);\n\n    if ( emitError )\n    {\n        qCDebug(runtime) << \"Emit Error detected\";\n\n        if ( !RIG_IS_SOFT_ERRCODE(-errorStatus) )\n        {\n            // hard error, emit error now\n            qCDebug(runtime) << \"Hard Error\";\n            emit errorOccurred(errorName, lastErrorText);\n        }\n        else\n        {\n            // soft error\n            postponedErrors[errorName] = lastErrorText;\n\n            if ( !errorTimer.isActive() )\n            {\n                qCDebug(runtime) << \"Starting Error Timer\";\n                errorTimer.start(15 * 1000); //15s\n            }\n        }\n    }\n    return false;\n}\n\nserial_handshake_e HamlibRotDrv::stringToHamlibFlowControl(const QString &in_flowcontrol)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_flowcontrol;\n\n    const QString &flowcontrol = in_flowcontrol.toLower();\n\n    if ( flowcontrol == SerialPort::SERIAL_FLOWCONTROL_SOFTWARE )\n        return RIG_HANDSHAKE_XONXOFF;\n    if ( flowcontrol == SerialPort::SERIAL_FLOWCONTROL_HARDWARE )\n        return RIG_HANDSHAKE_HARDWARE;\n\n    return RIG_HANDSHAKE_NONE;\n}\n\nserial_parity_e HamlibRotDrv::stringToHamlibParity(const QString &in_parity)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_parity;\n\n    const QString &parity = in_parity.toLower();\n\n    if ( parity == SerialPort::SERIAL_PARITY_EVEN )\n        return RIG_PARITY_EVEN;\n    if ( parity == SerialPort::SERIAL_PARITY_ODD )\n        return RIG_PARITY_ODD;\n    if ( parity == SerialPort::SERIAL_PARITY_MARK )\n        return RIG_PARITY_MARK;\n    if ( parity == SerialPort::SERIAL_PARITY_SPACE )\n        return RIG_PARITY_SPACE;\n\n    return RIG_PARITY_NONE;\n}\n\nQString HamlibRotDrv::hamlibErrorString(int errorCode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << errorCode;\n\n    QString ret;\n    QString detail(rigerror(errorCode));\n\n#if ( HAMLIBVERSION_MAJOR >= 4 && HAMLIBVERSION_MINOR >= 5 )\n    // The rigerror has different behavior since 4.5. It contains the stack trace in the first part\n    // Need to use rigerror2\n    ret = QString(rigerror2(errorCode));\n#else\n    static QRegularExpression re(\"[\\r\\n]\");\n    QStringList errorList = detail.split(re);\n\n    if ( errorList.size() >= 1 )\n        ret = errorList.at(0);\n#endif\n    qWarning() << \"Detail\" << detail;\n    qCWarning(runtime) << ret;\n\n    return ret;\n}\n\nvoid HamlibRotDrv::commandSleep()\n{\n    FCT_IDENTIFICATION;\n\n    QThread::msleep(100);\n}\n\n#undef MUTEXLOCKER\n"
  },
  {
    "path": "rotator/drivers/HamlibRotDrv.h",
    "content": "#ifndef QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H\n#define QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H\n\n#include <QTimer>\n#include <hamlib/rotator.h>\n#include \"GenericRotDrv.h\"\n#include \"rotator/RotCaps.h\"\n\nclass HamlibRotDrv : public GenericRotDrv\n{\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static RotCaps getCaps(int model);\n\n    explicit HamlibRotDrv(const RotProfile &profile,\n                       QObject *parent = nullptr);\n\n    virtual ~HamlibRotDrv();\n\n    virtual bool open() override;\n    virtual void sendState() override;\n    virtual void setPosition(double in_azimuth, double in_elevation) override;\n    virtual void stopTimers() override;\n\nprivate slots:\n    void checkRotStateChange();\n    void checkErrorCounter();\n\nprivate:\n    static int addRig(const struct rot_caps* caps, void* data);\n\n    void checkChanges();\n    void checkAzEl();\n    bool isRotRespOK(int errorStatus,\n                     const QString errorName,\n                     bool emitError = true);\n\n    serial_handshake_e stringToHamlibFlowControl(const QString &in_flowcontrol);\n    serial_parity_e stringToHamlibParity(const QString &in_parity);\n    QString hamlibErrorString(int);\n    void commandSleep();\n\n    ROT* rot;\n    QTimer timer;\n    QTimer errorTimer;\n    QMutex drvLock;\n\n    bool forceSendState;\n    QHash<QString, QString>postponedErrors;\n\n    const quint32 POLL_INTERVAL = 2000;\n};\n\n#endif // QLOG_ROTATOR_DRIVERS_HAMLIBROTDRV_H\n"
  },
  {
    "path": "rotator/drivers/PSTRotDrv.cpp",
    "content": "#include <QNetworkDatagram>\n#include <QHostInfo>\n#include \"core/debug.h\"\n#include \"PSTRotDrv.h\"\n\n#define MUTEXLOCKER     qCDebug(runtime) << \"Waiting for Rot Drv mutex\"; \\\n                        QMutexLocker locker(&drvLock); \\\n                        qCDebug(runtime) << \"Using Rot Drv\"\n\n#define POOL_INTERVAL 1000\n#define COMMAND_TIMEOUT POOL_INTERVAL * 0.7\n\nMODULE_IDENTIFICATION(\"qlog.rotator.driver.pstrotdrv\");\n\nQList<QPair<int, QString> > PSTRotDrv::getModelList()\n{\n     FCT_IDENTIFICATION;\n\n     QList<QPair<int, QString>> ret;\n\n     ret << QPair<int, QString>(1, tr(\"Rot 1\"));\n     return ret;\n}\n\nRotCaps PSTRotDrv::getCaps(int)\n{\n    FCT_IDENTIFICATION;\n\n    RotCaps ret;\n\n    ret.isNetworkOnly = true;\n\n    return ret;\n}\n\nPSTRotDrv::PSTRotDrv(const RotProfile &profile, QObject *parent)\n    : GenericRotDrv{profile, parent},\n      forceSendState(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nPSTRotDrv::~PSTRotDrv()\n{\n    FCT_IDENTIFICATION;\n\n    PSTRotDrv::stopTimers();\n}\n\nbool PSTRotDrv::open()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    bool rc = receiveSocket.bind(rotProfile.netport + 1);\n\n    if ( !rc )\n    {\n        lastErrorText = tr(\"Cannot bind a port\") + \" \" + rotProfile.netport;\n        qCDebug(runtime) << \"Rot is not initialized - cannot bind port address\" << rotProfile.netport;\n        return false;\n    }\n\n    qCDebug(runtime) << \"Listening port\" << rotProfile.netport + 1;\n\n    const QHostInfo &hostInfo = QHostInfo::fromName(rotProfile.hostname);\n    if ( hostInfo.error() != QHostInfo::NoError )\n    {\n        lastErrorText = tr(\"Cannot get IP Address for\") + \" \" + rotProfile.hostname;\n        qCWarning(runtime) << \"Cannot get Rotator hostname\" << hostInfo.errorString();\n        return false;\n    }\n\n    const QList<QHostAddress> addresses = hostInfo.addresses();\n    for ( const QHostAddress &address : addresses )\n    {\n        // currently, it seems that PSTRotator supports only IPv4 Addresses\n        // therefore it is necessary to filter out IPv6 adresses\n        if ( address.protocol() == QAbstractSocket::IPv4Protocol )\n        {\n            rotatorAddress = address;\n            qCDebug(runtime) << \"Found IPv4 address \" << address;\n        }\n    }\n\n    if ( rotatorAddress.isNull() )\n    {\n        lastErrorText = tr(\"No IPv4 Address for\") + \" \" + rotProfile.hostname;\n        qCWarning(runtime) << \"No IPv4 Address for \" << rotProfile.hostname;\n        return false;\n    }\n\n    qCDebug(runtime) << rotatorAddress;\n\n    connect(&receiveSocket, &QUdpSocket::readyRead,\n            this, &PSTRotDrv::readPendingDatagrams);\n\n    connect(&refreshTimer, &QTimer::timeout,\n            this, &PSTRotDrv::checkRotStateChange);\n\n    connect(&timeoutTimer, &QTimer::timeout,\n            this, [this]()\n    {\n        timeoutTimer.stop();\n        qCWarning(runtime) << \"Operation Timeout\";\n        emit errorOccurred(tr(\"Error Occurred\"),\n                          tr(\"Operation Timeout\"));\n    });\n\n    refreshTimer.start(POOL_INTERVAL);\n    emit rotIsReady();\n    opened = true;\n\n    return rc;\n}\n\nvoid PSTRotDrv::sendState()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    forceSendState = true;\n}\n\nvoid PSTRotDrv::setPosition(double in_azimuth, double in_elevation)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_azimuth << in_elevation;\n\n    MUTEXLOCKER;\n\n   if ( !opened )\n       return;\n\n   QString positionCommand = QString(\"<PST>\"\n                                     \"<TRACK>0</TRACK>\"\n                                     \"<AZIMUTH>%1</AZIMUTH>\"\n                                     \"<ELEVATION>%2</ELEVATION>\"\n                                     \"</PST>\").arg(in_azimuth, 0, 'f', 1)\n                                              .arg(in_elevation, 0, 'f', 1);\n\n   sendCommand(positionCommand);\n}\n\nvoid PSTRotDrv::stopTimers()\n{\n    FCT_IDENTIFICATION;\n\n    receiveSocket.close();\n    refreshTimer.stop();\n    timeoutTimer.stop();\n}\n\nvoid PSTRotDrv::checkRotStateChange()\n{\n    FCT_IDENTIFICATION;\n\n    MUTEXLOCKER;\n\n    QUdpSocket sendSocket;\n\n    QString azCommand = \"<PST>AZ?</PST>\";\n    QString elCommand = \"<PST>EL?</PST>\";\n\n    sendCommand(azCommand);\n    sendCommand(elCommand);\n\n    timeoutTimer.start(COMMAND_TIMEOUT);\n}\n\nvoid PSTRotDrv::commandSleep()\n{\n    QThread::msleep(100);\n}\n\nvoid PSTRotDrv::sendCommand(const QString &cmd)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << cmd;\n\n    QUdpSocket sendSocket;\n\n    sendSocket.writeDatagram(cmd.toUtf8(),\n                             rotatorAddress,\n                             rotProfile.netport);\n    commandSleep();\n}\n\nvoid PSTRotDrv::readPendingDatagrams()\n{\n\n    FCT_IDENTIFICATION;\n\n    timeoutTimer.stop();\n\n    while ( receiveSocket.hasPendingDatagrams() )\n    {\n        QNetworkDatagram datagram = receiveSocket.receiveDatagram();\n        QString data(datagram.data());\n\n        qCDebug(runtime) << \"Received from\" << datagram.senderAddress();\n        qCDebug(runtime) << data;\n\n        // TODO: Check if sender has the IP Address from ROT Profile?\n\n        // TODO: we assume that the entire response fits into one packet,\n        // so there is no need to implement sequential loading of fragmented packets.\n        // But we prefer to check whether the length is at least expected.\n        if ( data.size() < 4 )\n        {\n            qCWarning(runtime) << \"Unexpected length of packet !!! - skipping\";\n            continue;\n        }\n\n        double newAzimuth = azimuth;\n        double newElevation = elevation;\n\n        if ( data.startsWith(\"EL\") )\n            newElevation = data.mid(3).toDouble();\n        else if ( data.startsWith(\"AZ\") )\n            newAzimuth = data.mid(3).toDouble();\n\n        qCDebug(runtime) << \"PSTRotator Positioning\"\n                         << newAzimuth\n                         << newElevation;\n        qCDebug(runtime) << \"Object Positioning\"\n                         << azimuth\n                         << elevation;\n\n        if ( newAzimuth != azimuth\n             || newElevation != elevation\n             || forceSendState )\n        {\n            forceSendState = false;\n            azimuth = newAzimuth;\n            elevation = newElevation;\n            qCDebug(runtime) << \"emitting POSITIONING changed\" << azimuth << elevation;\n            emit positioningChanged(azimuth, elevation);\n        }\n    }\n}\n#undef MUTEXLOCKER\n#undef POOL_INTERVAL\n"
  },
  {
    "path": "rotator/drivers/PSTRotDrv.h",
    "content": "#ifndef QLOG_ROTATOR_DRIVERS_PSTROTDRV_H\n#define QLOG_ROTATOR_DRIVERS_PSTROTDRV_H\n\n#include <QUdpSocket>\n#include <QTimer>\n#include \"GenericRotDrv.h\"\n#include \"rotator/RotCaps.h\"\n\nclass PSTRotDrv : public GenericRotDrv\n{\n    Q_OBJECT\n\npublic:\n    static QList<QPair<int, QString>> getModelList();\n    static RotCaps getCaps(int);\n\n    explicit PSTRotDrv(const RotProfile &profile,\n                       QObject *parent = nullptr);\n\n    virtual ~PSTRotDrv();\n\n    virtual bool open() override;\n    virtual void sendState() override;\n    virtual void setPosition(double in_azimuth, double in_elevation) override;\n    virtual void stopTimers() override;\n\nprivate slots:\n    void checkRotStateChange();\n\nprivate:\n    void commandSleep();\n    void sendCommand(const QString& cmd);\n    void readPendingDatagrams();\n\n    bool forceSendState;\n\n    QTimer refreshTimer;\n    QTimer timeoutTimer;\n    QUdpSocket receiveSocket;\n    QMutex drvLock;\n    QHostAddress rotatorAddress;\n};\n\n#endif // QLOG_ROTATOR_DRIVERS_PSTROTDRV_H\n"
  },
  {
    "path": "rpm_spec/qlog.spec",
    "content": "%define REPO_VERSION %(echo $REPO_VERSION)\n\nSummary: Qt Logging program for hamradio operators\nName: QLog\nVersion: %{REPO_VERSION}\nRelease: 1%{?dist}\nLicense: GPLv3\nGroup: Productivity/Hamradio/Logging\nSource: https://github.com/foldynl/QLog/archive/refs/tags/v%{version}.tar.gz#/qlog-%{version}.tar.gz\nURL: https://github.com/foldynl/QLog/wiki\nPackager: Ladislav Foldyna <ok1mlg@gmail.com>\nBuildRequires: gcc-c++\nBuildRequires: make\nBuildRequires: pkg-config\nBuildRequires: qt5-qtbase-devel\nBuildRequires: qt5-qtcharts-devel\nBuildRequires: qt5-qtwebengine-devel\nBuildRequires: qt5-qtserialport-devel\nBuildRequires: qt5-qtwebsockets-devel\nBuildRequires: hamlib-devel\nBuildRequires: libsqlite3x-devel\nBuildRequires: openssl-devel\nBuildRequires: qtkeychain-qt5-devel\n\n%description\nQLog is an Amateur Radio logging application for Linux, Windows and Mac OS. It\nis based on the Qt 5 framework and uses SQLite as database backend.\n\n%prep\n%global debug_package %{nil}\n%setup\n\n\n%build\n/usr/bin/qmake-qt5 PREFIX='/usr'\n%make_build\n\n%install\nINSTALL_ROOT=%{buildroot} make -f Makefile install\n\n%post\n\n%postun\n\n%files\n%{_bindir}/*\n%license LICENSE\n%doc README.md Changelog\n%{_datadir}/applications/qlog.desktop\n%{_datadir}//icons/hicolor/256x256/apps/qlog.png\n%{_metainfodir}/*\n%{_mandir}/man1/*\n\n%changelog\n* Sun Apr 26 2026 Ladislav Foldyna - 0.50.0-1\n- [NEW] - Added Split detection\n- [NEW] - Added Developer and Support tools (PR #991 @aa5sh @foldynl)\n- [NEW] - Added a simple QSL label printing dialog (issue #562)\n- [NEW] - Added Cabrillo contest export\n- [NEW] - Added direct labeling of QSL Requested and QSL Received to the QSO context menu (PR #982 @aa5sh)\n- [NEW] - DXCC Submission Report (PR #967 @aa5sh)\n- [NEW] - DXC - Search pre-fills the callsign from New Contact if callsign is present\n- [NEW] - Settings - Added Danger Zone tab with Delete all passwords and QSOs\n- [CHANGED] - Mutex-free Omnirig1 and Omnirig2\n- [CHANGED] - POTA/SOTA/WWFF/SAT list are download from QLog LOV-repo\n- [CHANGED] - Used an external lib for CSV parsing for LOV Download\n- [CHANGED] - Import - ADIF import updates DXCC only if it is missing in the QSO (issue #983)\n- [REMOVED] - Import - ADIF import does not include the option to update DXCC during the import - no longer needed\n- Fixed Callsign disappears when calling a DX in a split via VFO-B (issue #799)\n- Fixing Rendering issue (issue #989)\n- Updated debian packaging (PR @979 thx @dawkagaming)\n- Hamlib rigctld switching between VFO A/B doesnt change the band mode - added workaround (issue #999)\n- Awards internal redesign\n- Removed AN from the WAC award (issue #1010)\n\n* Thu Mar 19 2026 Ladislav Foldyna - 0.49.1-1\n- Fixed Online Map OSM Access Blocked banner (issue #956)\n- Fixed Package build process issue - openssl-dev is missing (issue #957)\n- Fixed Missing dependence for QTKeychain (issue #964)\n- Added French Translation (PR #969 thx @fillods)\n\n* Fri Mar 13 2026 Ladislav Foldyna - 0.49.0-1\n- [NEW] - Added Pack and Unpack Data and Setting - Computer to Computer Migration (issue #535)\n- [NEW] - Added Rig Sharing via Rigctld (PR #736 issue #159 @aa5sh @foldynl)\n- [NEW] - Added QSL Gallery\n- [NEW] - QSO Filter - Added REGEXP operator\n- [NEW] - Settings - TQSL - Added Path auto-detect and validation\n- [NEW] - Upload QSO - Added LoTW Station Location Combo (PR #929 @TrgoSk @foldynl)\n- [NEW] - QSO Export - Added Station Profile Filter\n- [NEW] - BandMap shows emergency frequencies (issue #462)\n- [NEW] - Added Speed Up Down Macros - WinKey and CWDaemon (issue #491)\n- [NEW] - Settings Winkey v2 - Added PaddleOnly Sidetone (issue #739)\n- [NEW] - Settings Winkey v2 and CWDaemon - Added Sidetone Freq\n- [NEW] - All County fields contain Completer for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n- [NEW] - Added County Awards for Ukraine, US, Japan, NZ, Spanish, Russia (PR #785 @aa5sh @foldynl)\n- [NEW] - ADIF 3.1.7 - Added new modes FT2, FREEDATA, RIBBIT_PIX, RIBBIT_SMS (issue #934)\n- [CHANGED] - Generic FTx for FT8/FT4 (FT2) in Alert and DXC filter (issue #937)\n- [CHANGED] - LoTW QSL matching algorithm uses Mode and Mode Group matching (issue #942)\n- [CHANGED] - Reduced download period for DXCC Entities from 21 to 7 days\n- LogbookWidget: Delete Performance Optimization\n- Fixed Awards POTA Activator Filter\n- Fixed man page\n- Fixing SATmode Activity is blank (issue #948)\n\n* Fri Jan 30 2026 Ladislav Foldyna - 0.48.0-1\n- [NEW] - Rig Widget - tuning rig with mouse (issue #855)\n- [NEW] - Awards - Added User Filter Combo (issue #870)\n- [NEW] - Statistics - Added User Filter; new Dialog layout (issue #870)\n- [NEW] - Alerts - Added detailed Log Status settings (issue #817)\n- [NEW] - Settings - Enable/Disable sending color-coded status indicators back to WSJT-X (issue #885 @aa5sh @foldynl)\n- [CHANGED] - Omnirig Drivers: Removed QT AXContainers - pure Windows API code\n- [CHANGED] - Enabled Chekbox in Alerts Table (issue #867)\n- [CHANGED] - Serial Port Completer contains Horizontal ScrollBar\n- [CHANGED] - TCI - Settings - Default PWR defines the maximum output power\n- Fixed Omnirig drivers keep sending frequency change (issue #872)\n- Fixed ADIF import does not accept a default operator name (issue #884)\n- Fixed HamQTH URL from http to https (PR #886 @aa5sh)\n- Fixed Missing Band value when QSO from FLDigi (issue #892)\n\n* Fri Dec 19 2025 Ladislav Foldyna - 0.47.1-1\n- [CHANGED] - DXC - VE7CC-type Cluster is correctly detected (PR #851 @kyleboyle)\n- [CHANGED] - Chat - Changed ON4KST URL (issue #857)\n- Fixed missing clear button for Search Callsign (issue #753)\n- Fixed Updated QSOs are not sent to wavelog (issue #847)\n- Fixed Fixed Omnirig(v2) getFreq, getVFO, setFreq (issue #853)\n- Fixed ADI Header does not follow ADIF Spec (issue #859)\n- Fixed OmniRig settings are not saved (issue #862)\n\n* Sat Dec 6 2025 Ladislav Foldyna - 0.47.0-1\n- [NEW] - Adds theme options - native, light, dark (PR #718 @kyleboyle)\n- [NEW] - Implemented ADIF 3.1.6\n- [NEW] - ADIF 3.1.6 - Added new modes FSK and MTONE\n- [NEW] - ADIF 3.1.6 - Added new contest IDs\n- [NEW] - ADIF 3.1.6 - Added new column EQSL_AG (Import/Export only)\n- [NEW] - Statistics, QSODetail contain deleted DXCC Entities (PR #728 @aa5sh @foldynl)\n- [NEW] - Settings Hamlib - Added support to define CIV Addr for Icom and Ten-Tec (issue #747)\n- [NEW] - Settings Hamlib - Added RTS and DTR control (PR #809 @aa5sh)\n- [NEW] - Settings GUI - Added options to switch distance unit\n- [NEW] - Added Linux manpage (PR #791 @dawkagaming)\n- [NEW] - Added a link to the GitHub release notes under Help-Whats New\n- [NEW] - Added workaround for WriteLog - always call callbook lookups (PR #833 @sjwoodr)\n- [NEW] - Awards - Added Not-Confirmed filter (PR #836 @aa5sh)\n- [NEW] - Rotator Widget - Added buttons to change button profiles\n- [CHANGED] - Settings - Added network loop detection for WSJTX Forward (issue #815 @aa5sh @foldynl)\n- [CHANGED] - Rotator - Rotator timeout is set to 5s (PR #823 @aa5sh)\n- [CHANGED] - Double Spin Boxes - the decimal separator is forced to be a period\n- [DELETED] - WSJTX Widget - Removed Freq and Mode\n- Fixed QSODetail - Anti-meridian bug on map (issue #786)\n- Fixed Statistics: Center maps on QTH longitude (issue #824)\n- Fixed OmniRig disconnecting when its status changed unexpectedly (issue #832)\n\n* Fri Oct 31 2025 Ladislav Foldyna - 0.46.2-1\n- Fixed Spaces after QRZ.com name (issue #767)\n- Fixed SPID Rot1Prog Rotator more 360 deg (issue #775)\n- Fixed build instructions on Debian (PR #777 @leventelist)\n- Fixed Bandmap truncated output despite having space (issue #779)\n- Fixed Statistics - Anti-meridian bug on map (issue #786)\n- Fixed Binary file in the tarballs (issue #794)\n- Fixed LOTW and eQSL upload status updated even when nothing is uploaded (issue #807)\n- Fixed Imported QSOs contain incorrect My DXCC info (issue #812)\n- Fixed Statistics Dialog does not show confirmed grids\n\n* Fri Sep 26 2025 Ladislav Foldyna - 0.46.1-1\n- Fixed QSO filter incorrectly displays inserted date (issue #752)\n- Fixed Logbook Search Icon is not centered (issue #753)\n- Fixed Using CQRLog API Key for Clublog (issue #759)\n- Fixed Online Service Password leaking via debug files (issue #760)\n- Fixed Tabs are not showed properly (PR #762 @aa5sh)\n- Fixed inability to edit Power in QSO Detail (issue #763)\n\n* Fri Sep 12 2025 Ladislav Foldyna - 0.46.0-1\n- [NEW] - NewContact: POTA/SOTA/WWFF/IOTA info is taken from the nearest spot (@aa5sh @foldynl)\n- [NEW] - DXSpots are sent to Flex Radio (PR #694 @aa5sh)\n- [NEW] - CWConsole - Added support for automatic periodic sending of CW Macros (issue #708)\n- [NEW] - Added mapping of Winkey hardware buttons to CW macro keys F1–F4 (issue #711)\n- [NEW] - Added Search Types to the Logbook Search Editbox (issue #733)\n- [NEW] - Rig - Periodic Rig status reporting independent of its changes (PR #730 @aa5sh)\n- [NEW] - Settings - Serial Port Completer for MacOS and Linux (PR #737 @aa5sh)\n- [NEW] - Hamlib - Attempt to send Power On when connecting the Rig\n- [NEW] - POTA Spots Info is received from the API at api.pota.app to improve POTA detection\n- [CHANGED] - Logbook Search Filter Widget - Added Search Widget\n- [CHANGED] - QSO Detail Country boxes use the new Search Filter Widget\n- [CHANGED] - NewContact - RST field uses the Overwrite Mode\n- [CHANGED] - NewContact - Default cursor position in RST is at the first character\n- [CHANGED] - Setting Dialog - Modes - Default Report can define cursor position\n- [CHANGED] - HamlibRot - Changed Poll Interval from 500 to 2000ms\n- Fixed DUPE is not detected for the first Contest QSO (issue #699)\n- Fixed FREQ_RX/BAND_RX is present only when RX and TX freqs are different (issue #714)\n- Fixed Repeated log recording (issue #722)\n- Fixed QSO Filter contains untranslated QSO items (issue #732)\n\n* Fri Jul 11 2025 Ladislav Foldyna - 0.45.0-1\n- [NEW] - Single Dialog for Upload/Download Online Services (issue #448)\n- [NEW] - Added option to swap paddles to Winkey settings (issue #676)\n- [NEW] - Added native support for the FLRig interface (issue #679)\n- [NEW] - Added New Version Notification - only for MacOS and Windows (PR #669 @aa5sh)\n- [NEW] - QRZ Upload - Added support for multiple API Keys\n- [NEW] - Logbook - Added highlighting to the filter button when a filter is active\n- [NEW] - WSJTX - Filtered label is shown when filter is enabled\n- [NEW] - DXC - Filtered label is shown when filter is enabled\n- [NEW] - Added support to Upload Cloudlog/Wavelog\n- [NEW] - Add JS8 to legacy_modes.json (issue #677)\n- [CHANGED] - Unification Settings storage\n- [CHANGED] - Calculate distances according to IARU rules\n- Fixed missing Wsjtx Spot values in the AlertWindow\n\n* Sun May 11 2025 Ladislav Foldyna - 0.44.1-1\n- Fixed Rotator Widget Seg Fault for new users (issue #666)\n\n* Fri May 9 2025 Ladislav Foldyna - 0.44.0-1\n- [NEW] - Activity Manager - Added SKCC, UKSMG and FISTS as Dynamic Fields\n- [NEW] - QSO - FISTS, SKCC, and UKSMG are auto-filled from MembershipQE (issue #628)\n- [NEW] - Rotator - Added QSO destination needle (issue #644)\n- [NEW] - QSO Detail - Adds grayline and short path (PR #653 @kyleboyle)\n- [CHANGED] - Rotator - Needle colors correspond to the online map (issue #644)\n- Fixed TCI cw_macros must contain RigID (issue #663)\n- Fixed TCI setKeySpeed sets keyer and macros speed (issue #663)\n- Fixed Data mode missing in rig control window - rigctld (issue #660 @aa5sh)\n- Improved DXC Mode detection\n- Updated Simplified Chinese translation\n\n* Sat Apr 19 2025 Ladislav Foldyna - 0.43.1-1\n- Fixed Click on PHONE DX Spots sets wrong mode (issue #453)\n- Fixed No freq via Omnirig for IC7400 (issue #639)\n\n* Fri Apr 4 2025 Ladislav Foldyna - 0.43.0-1\n- [NEW] - Added support to receive QSOs from CSN SAT Device (PR #610 @aa5sh)\n- [NEW] - Bandmap - Multiple independent bandmap windows (PR #593 @kyleboyle @foldynl)\n- [NEW] - Winkey Keyer driver currently supports v1 and v2 hardware\n- [NEW] - QSO Detail - QSLs QSLr Msg is editable\n- [NEW] - Activity Manager - Added new dynamic field - QSL Message Send\n- [CHANGED] - HamlibDrv - Enabled Power, RIT, XIT, Morse for RIG Netctl\n- [CHANGED] - QSO Detail - QSLMSG replaced by QSLMSG_RCVD (issue #633)\n- [CHANGED] - eQSL Upload - Added an option to choose a QSLMsg field\n- [CHANGED] - eQSL Download - eQSL QSLMSG is stored to QLog QSLMSG_RCVD\n- [CHANGED] - eQSL Download - Added QSLMSG_RCVD merging - eQSL message is appended\n- Fixed Speed pot doesn't seem to work with a WinKeyer; double chars (issue #618)\n- Fixed BandMap Spots colour change after a QSO (issue #632)\n- Fixed Incorrect Field Mapping for Received eQSL Messages (issue #633)\n\n* Fri Mar 7 2025 Ladislav Foldyna - 0.42.2-1\n- Fixed Logbook country translations (issue #608)\n- Fixed Unexpected dialog when QSO after contest (issue #614)\n- Fixed Statistics Widget does not display NULL continents (@aa5sh)\n- Fixed Statistics Widget does not display NULL Band, Mode\n- Fixed Statistics Widget TOP10 does not display removed DXCCs\n- Fixed Statistics Widget TOP10 does not display translated country names\n- Fixed Awards Widget does not display removed DXCCs\n\n* Sat Feb 22 2025 Ladislav Foldyna - 0.42.1-1\n- Fixed Unexpected timezone info (issue #600)\n- Fixed DXCC Statistics picks more entities (issue #601)\n- Fixed a crash when no internet connection\n\n* Fri Feb 14 2025 Ladislav Foldyna - 0.42.0-1\n- [NEW] - Awards - Added Slots - total over each band (issue #538)\n- [NEW] - Awards - Added Grid Award - 2/4/6 Chars grid (issue #564)\n- [NEW] - Settings - Added options to switch 12/24 time and date format (issue #573)\n- [NEW] - Activity Manager - Added new dynamic fields - Rig (issue #575)\n- [NEW] - LoTW Import - Fill missing information also for confirmed QSOs (@aa5sh)\n- [NEW] - Added CW macro QTH\n- [NEW] - DXC - Added 15min Trend\n- [CHANGED] - Changed IOTA LOV Source, the official web is used\n- [CHANGED] - CSV Export: Time and Date formats use ISO8601 format (issue #562)\n- [CHANGED] - Settings - Renamed Shortcuts to GUI tab\n- [CHANGED] - LOV - Improved LOV download performance (PR #582 @aa5sh)\n- Partial fix Windows State/Size does not save in case of fullscreen (issue #418)\n- Fixing TCI error when you change Rig (issue #526)\n- Fixed DXCC Award total worked confirmed counts included deleted entities (PR #588 @aa5sh)\n- Fixed Raspberry PI Flatpak - Import Select file dialog crashes (issue #589)\n- Suppressed the ability to edit Contest fields after the start (issue #590)\n\n* Tue Jan 21 2025 Ladislav Foldyna - 0.41.1-1\n- Fixed compilation issue under Debian 12 (issue #571)\n- Fixed Incorrect GPL version in rpm/deb packages (issue #572)\n- Fixed MacOS floating utility window bug (PR #576 @kyleboyle)\n- Updated IT translation\n\n* Sat Jan 11 2025 Ladislav Foldyna - 0.41.0-1\n- [NEW] - Logbook - Added a new context menu item - Update QSO from Callbook (issue #450 @aa5sh)\n- [NEW] - DIGI mode is used in case of DXC Digi Spots (issue #480)\n- [NEW] - DXC - Retrieve information about SOTA, POTA, IOTA and WWFF from comment (issue #482)\n- [NEW] - Alert - Added SOTA, POTA, IOTA and WWFF filter\n- [NEW] - Added the COM Port Completer for Windows platform (issue #490)\n- [NEW] - Settings - Added DXCC Confirmed By options (issue #508)\n- [NEW] - Added POTA Export Formatter (activator/hunter) (PR #514 @kyleboyle)\n- [NEW] - CW Console - CW Halt with the user-defined shortcut (issue #518)\n- [NEW] - Added an input parameter to save debug message to file\n- [NEW] - Logbook - Added sorting function to logbook table columns (PR #540 @kyleboyle)\n- [NEW] - Network Notification - Added Rig Status Notification\n- [NEW] - Implemented ADIF 3.1.5\n- [NEW] - ADIF 3.1.5 - Added new submodes FSKH245 and FSKH105 for HELL\n- [NEW] - ADIF 3.1.5 - Added new contest IDs\n- [NEW] - ADIF 3.1.5 - Added new columns (Import/Export only)\n- [NEW] - ADIF 3.1.5 - Added My DARC DOK to Station Profile\n- [CHANGED] - Settings: disabled band and mode name modification\n- [CHANGED] - DX Stats contain all enabled bands (issue #538)\n- [CHANGED] - Removed Freq, TimeDate On/Off Data Type Indicators (issue #552)\n- [CHANGED] - ADIF 3.1.5 - VUCC and MY_VUCC can contain 6 or 4-chars locators\n- [CHANGED] - Stop exporting default value N for qsl_rcvd, qsl_sent, lotw/dcl/eslq_qsl_rcvd/sent\n- [CHANGED] - Extended QSL/Import Dupe matching rule to Callsign, Band, Mode, Time and Sat_Name (issue #563)\n- Fixed MacOS - keep floating windows visible on app unfocus (issue #530)\n- Fixed Contest Filter ignores the first QSO (issue #529)\n- Fixed It is not possible to quit Qlog with detached widgets Rot and Rig (issue #534)\n- Fixed ADX/CSV/JSON do not export non-ASCII chars (issue #542)\n- Fixed Checking the 60m checkbox in cluster filters allows 160m spots to appear (issue #543 @aa5sh)\n- Fixed Problems uploading to QRZ.com (issue #559 PR #561 @aa5sh)\n- Fixed DX Stat screen is jumping up/down\n- Fixed Omnirig drivers: Digi modes are not correclty recognized\n\n* Fri Nov 29 2024 Ladislav Foldyna - 0.40.1-1\n- Fixed Bands - Added missing 8m band (issue #515)\n- Fixed CW Console - EXCSTR does not work properly (issue #517)\n- Fixed Activity Manager - Missing Propagation Mode None (issue #519)\n- Fixed QSO Filter - filter fields with random order (PR #525 @aa5sh)\n- Fixed TCI error when you change Rig (issue #526)\n- Fixed NewContact - satellite mode too wide (issue #527)\n\n* Sun Nov 24 2024 Ladislav Foldyna - 0.40.0-1\n- [NEW] - Activity Manager - merged Layout Manager and profiles (issue #408)\n- [NEW] - Activity Manager - Added new dynamic fields - Contest fields, RX/TX Power\n- [NEW] - Added light support for contests (issue #345)\n- [NEW] - Added CW macros EXCHSTR, EXCHNR, EXCHNRN\n- [NEW] - Export Filter - Added user filter combo (original idea PR #476 @aa5sh)\n- [NEW] - New Contact -  Added expand/collapse button to QSO field tab widget (PR #495 @kyleboyle)\n- [NEW] - Alert - Added CQZ and ITUZ filters\n- [NEW] - KSTChat - Added a new 40MHz room (PR #496 @kyleboyle)\n- [NEW] - Station Profile contains Operator Callsign (issue #441 @kyleboyle)\n- [NEW] - Station Profile contains County (issue #493 @kyleboyle)\n- [NEW] - Statistics - Adds time of day and better qso mapping (PR #501 @kyleboyle)\n- [NEW] - Bandmap - Tooltip shows a spotter callsign (PR #507 @Skittlebrau)\n- [CHANGED] - New Contact - Renamed DXCC Tab to DX Stats contains DXCC and Station Statistics (issue #477)\n- [CHANGED] - QSL Import dialog - Detail text is selectable by mouse and keyboard\n- [CHANGED] - Removed Main Menu Layout; Activity Manager is in the bottom-left corner\n- [CHANGED] - Removed Keep Options from the Equipment Menu - use Activity Manager for it\n- Fixed issue when CW is always selected after Settings exiting or connecting the Rig\n- Updated Timezone definition file - version 2024b\n\n* Sat Oct 5 2024 Ladislav Foldyna - 0.39.0-1\n- [NEW] - DXC - Added Full-text search\n- [NEW] - Select S in RST Edit when focused (issue #454)\n- [NEW] - Alerts - Added Member Column\n- [CHANGED] - HamlibDrv Rig/Rot- Added multiplatform reliable sleep\n- [CHANGED] - Changed Backup policy\n- [CHANGED] - Logbook page size - improved performance\n- [CHANGED] - Logbook - CTRL-A (Select All) is disabled\n- [CHANGED] - Awards - Bands are displayed based on the Settings (issue #452)\n- [CHANGED] - WSJTX - More reliable detection of CQ stations (PR #471 @aa5sh)\n- [CHANGED] - WSJTX - SOTA/POTA/WWFF/SIG are being added to the logged QSO (PR #463 @aa5sh)\n- [CHANGED] - Stats - Add a confirmation dialog for displaying over 50k QSOs on the map\n- [CHANGED] - New Contact - Starting QSO Timer when Rig online and WSJTX Update Callsign Status is received\n- [CHANGED] - Added a postponed handling for Rig soft errors (issue #472)\n- Fixed WSJT-X does not emit band change if rig is disconnected (issue #447)\n- Fixed Wrong import of ADIF file of another log program (issue #455)\n- Fixed WSJTX log record is stored incorrectly if it contains non-ASCII chars(issue #458)\n- Fixed ADIF import does not import records with old DXCC Entities (issue #459)\n- Fixed ADIF import incorrectly uses Station Profile parameters (issue #461)\n- Fixed Logbook - QSO Table Column Width Does Not Stick (issue #464)\n- Fixed Alerts Window displays OOB Spots (issue #469)\n- Fixed Field values from past QSOs are used incorrectly in case of WSJTX QSOs (#issue 470)\n\n* Thu Aug 29 2024 Ladislav Foldyna - 0.38.0-1\n- [NEW] - Logbook - Added Send DX Spot to the QSO Context Menu\n- [NEW] - DX Filter - Added Dedup Time/Freq difference setting (@aa5sh)\n- [NEW] - Rig Setting - Added RTS/DTR PTT Type support (issue #353)\n- [NEW] - Bandmap - Scrollbar position is saved per band (issue #415)\n- [NEW] - New Contact - Added a dynamic value completer for SIG field (issue #425)\n- [NEW] - Awards - Added SOTA/POTA/WWFF (@aa5sh issue #311)\n- [NEW] - Awards - Added Not-Worked Filter\n- [NEW] - New Contact - Added Long Path Azimuth info\n- [NEW] - POTA Fields allow a comma-delimited list of one or more POTA Refs\n- [NEW] - WSJTX tunes freq/mode like Rig if rig is disconnected\n- [CHANGED] - Alert Widget is a Dock Widget (issue #399)\n- [CHANGED] - QLog adds more information from callbook for WSJTX QSOs (issues #403 #405 #420)\n- [CHANGED] - File Open dialogs are not a native dialog under Linux (issue #427)\n- [CHANGED] - Profiles transferred to DB\n- [CHANGED] - LOV last_dates transferred to DB\n- [CHANGED] - DX Cluster - Login Callsign is always the base Callsign\n- [REMOVED] - Setting DXCC Date\n- Fix for MacOS Layout Geometry Restore (@aa5sh)\n- Fixed TQSL does not block GUI thread\n- Fixed MacOS build process (@aa5sh)\n\n* Fri Jul 26 2024 Ladislav Foldyna - 0.37.2-1\n- Fixed Field QSL Send Via should be retained (issue #413)\n- Fixed Set rotator position fails if azimuth > 180 (issue #417)\n- Fixed Windows State/Size does not save in case of fullscreen (issue #418)\n- Fixed Significant rounding during azimuth calculation (issue #422)\n- Updated Simplified Chinese translation\n- Updated Spanish translaction\n- Added Italian translation (thx IK1VQY)\n\n* Wed Jul 10 2024 Ladislav Foldyna - 0.37.1-1\n- Fixed QSO Table Callsign filter is not filled properly (issue #401)\n- Fixed DXC zero frequency for last QSO in case of FT8 QSOs (issue #404)\n- Fixed Callsign Context Menu does not work (issue #409)\n- Fixed QSO Detail Save and Edit buttons are not translated (issue #410)\n\n* Mon Jul 1 2024 Ladislav Foldyna - 0.37.0-1\n- [NEW] - Added Shortcuts Editor (issue #293)\n- [NEW] - Added QO100 Bandplan to correctly categorize the DX Spots\n- [NEW] - Improveded detection of SH/DX SHF Spots\n- [NEW] - Online Map - Added WSJTX CQ Spots\n- [NEW] - WSJTX - Sortable View\n- [NEW] - Alerts - Sortable View\n- [NEW] - Added Spanish translation (thx LU1IDC)\n- [NEW[ - Added Search Callsign Clear Button (issue #396)\n- [CHANGED] - QRZ auth should be over POST with form data (issue #389)\n- [CHANGED] - Big CTY file is used\n- [CHANGED] - Callbook Country DXCC ID is used in case of difference from Big CTY\n- [CHANGED] - Removed ALT+W and CTRL+DEL shortcuts\n- [CHANGED] - Removed New Contact and Save Contact from Logbook Main Menu\n- Fixed Guantanamo KG4 Issue (issue #372)\n- Fixed QRZ Lookup Not Including Full Name - History (issue #388)\n- Fixed Spot Last QSO contains TX freq, should contain RX freq (issue #390)\n- Fixed Spot Last QSO must contain Freq in kHz (issue #391)\n- Fixed Bandmap select previous selected callsign issue (issue #394)\n- Fixed Malfunctioning tuning of WSJTX Alert spot\n- Fixed DXCC Status for FT4 Spots incorrectly identified in WSJTX\n\n* Fri Jun 7 2024 Ladislav Foldyna - 0.36.0-1\n- [NEW] - WSJTX: Added support to received ADIF QSO Log record\n- [NEW] - Sat mode is derived from RX/TX Freq\n- [NEW] - Logbook filters change color when enabled\n- [NEW] - Frequency input boxes PageUp/Dn switches the band (issue #360)\n- [NEW] - CTRL + PgUp/Dn switch band on the connected rig - global shortcut (issue #360)\n- [NEW] - Added number of filtered QSOs (issue #374)\n- Fixed Callbook query does not work (issue #377)\n- Fixed Logbook columns are reordered after Delete (issue #383)\n- Fixed Missing Republic of Kosovo flag (issue #384)\n\n* Tue May 21 2024 Ladislav Foldyna - 0.35.2-1\n- Improved delete performance; added delete progress bar (issue #351)\n- Fixed Password with plus is incorrectly sent to online services (issue #366)\n- Fixed Compilation issue under v4.6 (issue #368)\n- Fixed Network Rig configuration is not saved (issue #370)\n\n* Mon May 6 2024 Ladislav Foldyna - 0.35.1-1\n- Fixed Free QRZ callbook - Name is not populating (issue #363)\n- Fixed Incorrect CW segment freqs (issue #365)\n\n* Fri May 3 2024 Ladislav Foldyna - 0.35.0-1\n- [NEW] - Added Rot Interface PSTRotator Network\n- [NEW] - Added QSO/QSL Since option to eQSL Dialog\n- [NEW] - Bandmap - Current Mode segment visualisation\n- [NEW] - CW Console - Added Word/Whole mode switch\n- [NEW] - Added Callbook Profile Image Widget\n- [NEW] - ASCII conversion based on Text-Unidecode/iconv algorithm (issue #316 #350)\n- [NEW] - ITU/CQ Zones can be defined in Station Profile (issue #358)\n- [CHANGED] - Spacebar is used as a focus changer for fields where space is not allowed\n- [CHANGED] - Focus does not select text in the input fields\n- [CHANGED] - Force XCB under Linux Wayland\n- [CHANGED] - Bandmap - Added Callsign/Freq/Mode to tooltip (issue #355)\n- Fixed incorrect ADIF date format for clublog_qso_upload_date (issue #342)\n- Fixed The last name from Callbooks queries (issue #346)\n\n* Mon Mar 25 2024 Ladislav Foldyna - 0.34.0-1\n- [NEW] - Rotator Widget - Azimuth by Clicking\n- [NEW] - Rotator Widget - QSO button provides Short/Long Path (issue #330)\n- [NEW] - Equipment Menu - Added Keep Options between application restart (issue #331)\n- Fixed TCI - Thetis Connection issue (issue #327)\n- Fixed TCI - Spots To Rig are not displayed (issue #328)\n- Fixed Bandmap unintentionally emits frequency labels (issue #333)\n- Fixed Failing to load grid square for G and EI SOTA summits (issue #336)\n- Fixed HRDLog On-Air message is not sent (issue #337)\n- Fixed Offline Map - Improved Path drawing\n\n* Sat Mar 9 2024 Ladislav Foldyna - 0.33.1-1\n- Fixed Rotator offline map is incorrectly centered (issue #324)\n- Fixed Hamlib integration not working (issue #325)\n- Fixed issue when Hamlib reopen rig caused Initialization Error\n- Fixed issue when Omnirig Drv did not emit rigIsReady signal\n\n* Fri Mar 8 2024 Ladislav Foldyna - 0.33.0-1\n- [NEW] - Added Rig Interface TCI\n- [NEW] - Callbook search can be temporarily paused\n- Improved DXC Mode recognition\n- Fixed Modal dialog blinks - Windows platform (issue #315)\n- Fixed LoTW and eQSL download are only QSLs dowloads - button label changed (issue #318)\n- Fixed i18n: Country Names and Prop-modes are translated (issue #322)\n\n* Sat Feb 10 2024 Ladislav Foldyna - 0.32.0-1\n- [NEW] - Added Rig Interface Omnirig v1 (Windows only)\n- [NEW] - Added Rig Interface Omnirig v2 (Windows only)\n- [NEW] - Clublog - Added Clear Clublog and reupload QSOs\n- [NEW] - Clublog - Added Real-time Insert/Update/Delete\n- [CHANGED] - Clublog - Upload callsign is derived from the Current Profile Callsign\n- Fixed clang linker failed issue (issue #301)\n- Fixed SAT Mode U/U missing (issue #308 PR #309 thanks ea5wa)\n- Fixed Multiple QSO selection. Callsigns modified by mistake (issue #310)\n- Fixed Callbook query cache is not properly cleared when Callbook settings change (issue #313)\n\n* Fri Jan 5 2024 Ladislav Foldyna - 0.31.0-1\n- [NEW] - DXC - Improved Mode recognition\n- [NEW] - DXC - Switch Rig mode based on DXC Spot Mode (issue #217)\n- [NEW] - DXC - Added Spot Country Column (issue #273)\n- [NEW] - DXC - Added Menu for server management\n- [NEW] - DXC - Added Auto-connect to server\n- [NEW] - DXC - Added Keep QSOs Context Menu\n- [NEW] - DXC - Added Clear QSO Context Menu\n- [NEW] - DXC - Added support for SH/DX response parsing\n- [NEW] - DXC - Added support for username, password for connection\n- [CHANGED] - DXC - Commands Combo changed to function button with selectable function\n- [CHANGED] - DXC - DX Spot is prepared via DXC Command Line, Remark dialog was removed\n- [NEW] - Online Map - IBP station double-click tunes freq and switch Rig mode\n- [NEW] - Main Window - Current profile name is shown (issue #282)\n- [NEW] - Import - Details can be saved to file (issue #284)\n- [NEW] - Added Simplified Chinese translation (PR #285 thank BG7JAF)\n- [NEW] - New Contact - Enter saves QSO if QSO time is running (issue #293 - partial)\n- [NEW] - New Contact - Callsign Enter event saves QSO if no Callbook is active - Pileup Mode (issue #293)\n- [NEW] - RIG Widget - RIT/XIT are displayed with user-friendly units (issue #294)\n- [CHANGED] - SAT List download - Shortened download period for SAT list from 30 to 7 days\n- Fixed ADI Import is too slow (issue #270)\n- Improved Import/Export Performance\n- Fixed Missing Satellite Mode SX (issue #291)\n- Fixed QSO Detail - Issue when Sat-Name field was always disabled\n- Fixed RPM build - Installed (but unpackaged) metainfo file issue\n\n* Fri Dec 1 2023 Ladislav Foldyna - 0.30.0-1\n- [NEW] - QSL Images are stored in the database\n- [NEW] - Added AppStream Metainfo File (PR #262 thanks AsciiWolf)\n- [NEW] - Added (WPX) prefix (issue #263)\n- [NEW] - Added WPX Award statistics\n- [NEW] - Added support for external translation files(issue #275)\n- [CHANGED] - Removed QSOID from Export dialog column setting (issue #258)\n- Fixed Date editor does not support NULL value in Logbook Direct Editor (issue #256)\n- Fixed duplicate entry in Windows Add or Remove - only Window platform (issue #260)\n- Fixed RST fields revert to 59 after changing them (issue #261)\n- Fixed Cannot change TQSL Path in Settings - flatpak (issue #271)\n\n* Mon Nov 13 2023 Ladislav Foldyna - 0.29.2-1\n- Fixed QLog is already running error popup on MacOS (issue #257 thanks rjesson)\n\n* Fri Nov 10 2023 Ladislav Foldyna - 0.29.1-1\n- Fixed QSL cards tooltip are not displayed under qt6.5 (issue #248)\n- Fixed Distance unit is not displayed in QSO Info under Windows (issue #250)\n- Fixed Editing STATION_CALLSIGN can cause unwanted change in QSO Detail (issue #251)\n- Fixed QSO Detail Operator Name containes an incorrect value (issue #252)\n- Fixed Calls with VE, VA are coding as Amsterdam & St Paul Islands instead of Canada (issue #253)\n- Fixed LoTW QSL import reports unmatched QSOs sometime (issue #254)\n\n* Fri Oct 20 2023 Ladislav Foldyna - 0.29.0-1\n- [NEW] - Added user-defined layout for New QSO Detail widget\n- [NEW] - Main window State and Geometry can be saved to layout profile\n- [NEW] - Awards - Added WAS\n- [NEW] - Awards - WAZ/ITU/WAC show all possible values\n- [NEW] - Distance unit (km/miles) is controlled by OS Locale\n- [CHANGED] - Removed SAT Tab - field can be added via Layout Editor\n- Improved Import QSO performance\n- Fixed QLog crashes if POTA, SOTA or WWFF contain incorrect values (issue #245)\n- Fixed QSOs are not uploaded to QRZ and HRDLog if fields contain HTML delimiter strings (issue #247)\n\n* Fri Sep 22 2023 Ladislav Foldyna - 0.28.0-1\n- [NEW] - Added ON4KST Chat Support\n- [NEW] - Added Az BeamWidth and Az Offset to Antenna Profile\n- [NEW] - Double-Clicking the IBP callsign in the online map tunes the frequency\n- Fixed Browse button should open an expecting folder (issue #241)\n- Fixed Reword QSL buttons and Settings in QSO Details and Settings (issue #242)\n\n* Mon Aug 21 2023 Ladislav Foldyna - 0.27.0-1\n- [NEW] - Added HRDLog Support\n- Fixed Text field alignment (issue #233)\n- Fixed Rig/Rot Connection port type selection (issue #235)\n- Fixed Incorrect Distance Value in WSJTX Widget (issue #236)\n- Fixed Incorrect WSJTX locator target on the map (issue #237)\n\n* Sun Jul 30 2023 Ladislav Foldyna - 0.26.0-1\n- [NEW] - Added user-defined layout for New QSO widget\n- [NEW] - Pressing Spacebar in Callsign field skips RST fields\n- [NEW] - Added user-defined URL for web lookup (issue #230)\n- Fixed WSJTX QSOs should have an Operator Name from Callbook (issue #223)\n- Fixed US call area suffixes not handled correctly (issue #226 thanks Florian)\n- Fixed QSO Filter Detail allows to save an empty Filter Name (issue #228)\n\n* Mon Jul 17 2023 Ladislav Foldyna 0.25.1-1\n- Fixed Unexpected mode change when Setting Dialog is saved (issue #222)\n- Fixed QSL_SENT field has an incorrect ADIF name (issue #225)\n\n* Tue Jul 4 2023 Ladislav Foldyna - 0.25.0-1\n- [NEW] - Export - Added CSV Format\n- [NEW] - Export - Added Type of Export Generic/QSLs (issue #209)\n- [NEW] - Export - Added Exported Columns Setting\n- [NEW] - Export - All export formats use the ADIF field name convention\n- [CHANGED] - Export - JSON format contains a header - JSON format change\n- [CHANGED] - Default Statistics Interval is curr_date-1 and curr_day\n- Fixed Errors from Secure Storage are not shown (issue #216)\n- Fixed RX/TX Bands are uneditable when RX/TX freqs are missing (issue #220)\n\n* Fri Jun 16 2023 Ladislav Foldyna - 0.24.0-1\n- Fixed Incorrect FT4 mode-submode (issue #212)\n- Fixed CONTESTIA mode should be CONTESTI (issue #213)\n- Fixed Context menu deselects NewContactEditLine (issue #215)\n- Fixed incorrect WSJTX Filter initialization (issue #218)\n\n* Fri Jun 9 2023 Ladislav Foldyna - 0.23.0-1\n- [NEW] - Added CWDaemon Keyer Support\n- [NEW] - Added FLDigi Keyer Support\n- [NEW] - Online Map - based on locale, the map language is selected (Only EN, FR, GE supported - issue #180)\n- Fixed After entering longer QTH, the field content is not left-aligned (issue #157)\n- Fixed wrong QSO Time in case of JTDX (issue #204)\n- Fixed QSL Sent Date fields are not filled if QSL Sent Status fields are Y (issue #207)\n\n* Sun May 7 2023 Ladislav Foldyna - 0.22.0-1\n- [NEW] - ADIF Import - My Profile is used to define default values\n- [NEW] - ADIF Import - Checking a minimal set of input fields (start_time, call, band, mode, station_callsign)\n- [NEW] - ADIF Import - Added Import Result Summary + Import Detail Info\n- [NEW] - Main Menu - Added Help -> Mailing List.\n- [NEW] - Export - Filter for the exported QSOs\n- [CHANGE] - Renamed Locator to Gridsquare\n- Fixed Some anomalies in the input and processing of QSLr Date (issue #192)\n- Fixed User unfriedly CW Keyer Error (issue #194)\n- Fixed ADIF import (issue #196)\n- Fixed Operator field is incorrectly used  (issue #197)\n- Fixed Crash if an unknown POTA & SOTA/WWFF Setting is entered (issue #198)\n- Fixed FLDIGI cannot connect QLog (issue #199)\n- Fixed if ADIF record is missing band info, add this from freq field (thx DJ5CW)\n\n* Sun Apr 16 2023 Ladislav Foldyna - 0.21.0-1\n- [NEW] - Rotator - Added Used-Defined Buttons\n- [NEW] - Rotator - Added Destination Azimuth Needle\n- [NEW] - Online Map - Added Antenna Beam Path\n- [NEW] - Rig - Combos are disbled when disconnected\n- [NEW] - Club Member Lists (issue #60)\n- [NEW] - Alert Table shows rule names\n- [CHANGED] - Alerts, DXC and WSJTX Network Notifications\n- Fixed Antenna Azimuth Negative Value (issue #191)\n- Fixed CTY file is not loaded when duplicate record (issue #193)\n\n* Tue Mar 14 2023 Ladislav Foldyna - 0.20.0-1\n- [NEW] - Added MUF Layer to online map\n- [NEW] - Added International Beacon Project (IBP) Beacons to online map\n- [NEW] - Centering the map on the current profile at start (issue #185)\n- Fixed incorrect ADIF interpretation of _SENT fields (issue #176)\n- Fixed Awards Dialog, Table double click for ITU/CQZ/WAZ/IOTA shows incorrect QSOs (issue #177)\n- Fixed ADIF double-type fields when 0.0 is currently mapped to NULL (issue #178)\n- Fixed QSO Detail to save NULL instead of empty string (issue #179)\n- Fixed ADIF Import default _INTL values are now stored correctly (issue #183)\n- Fixed Maps show an incorrect path if from/to grids are the same (issue #186)\n- Fixed Online Maps incorrect Bounds if Bandmap callsign double-click (issue #188)\n- Updated German translation (thx DL2KI)\n\n* Fri Feb 17 2023 Ladislav Foldyna - 0.19.0-1\n- [NEW] - Added Aurora Layer to online map\n- [NEW] - Logbook - filter options are saved and restored\n- [NEW] - Map Setting is saved and restored (issue #140)\n- [NEW] - QSO Duration (issue #158)\n- [NEW] - DX Cluster uses monospace font (issue #164)\n- [NEW] - Awards - if click on the Entity/band the logbook filter is set (issue #168)\n- [NEW] - WSJTX - Added Multicast support (issue #172)\n- Fixed WWFF LOV Download (issue #169)\n\n* Sun Jan 15 2023 Ladislav Foldyna - 0.18.0-1\n- [NEW] - ADIF 3.1.4 updates\n-   Added new modes FREEDV and M17\n-   Added new band (submm)\n-   Adopted Altitude (for SOTA only)\n-   Adopted POTA (includes POTA List)\n-   Adopted Gridsquare_ext (only import/export)\n-   Adopted Hamlogeu_* (only import/export)\n-   Adopted HamQTH_* (only import/export)\n- [NEW] - Added new DXCC Status and color for it - Confirmed\n- [NEW] - New Contact - Tab selection is saved\n- [NEW] - Grid can contain 8-characters\n- [NEW] - User filter can contain NULL value\n- [NEW] - Compilation - added variables for external sources\n- [NEW] - My DXCC/CQZ/ITUZ/Country is filled\n- [NEW] - Alerts - Added Aging (issue #153)\n- [NEW] - Alerts - Added DXCC Status Color (issue #153)\n- [NEW] - DXC - Added Log Status to filter (issue #154)\n- [NEW] - DXC - Added Spot deduplication to filter (issue #154)\n- [NEW] - WSJTX - Added CQ-Spot Filter (issue #155)\n- [NEW] - QSO Detail contains DXCC Tab (issue #156)\n- [CHANGED] - New QSO DXCC Tab reworked (issue #144)\n- [CHANGED] - All DXCC Stats are computed based on My DXCC instead of My Callsign\n- [CHANGED] - Station Profile Setting layout\n\n* Sun Dec 18 2022 Ladislav Foldyna - 0.17.0-1\n- [NEW] - NetPort and Polling interval can be defined for NET Rigs\n- [NEW] - NetPort can be defined for NET Rots\n- [NEW] - Added Saving Bandmap Zoom per band (issue #137)\n- [NEW] - CW speed synchronisation (issue #139)\n- Fixed Missing callbook data when callsign has prefix (issue #133)\n- Fixed Winkey2 echo chars are incorrectly displayed in CW Console (issue #141)\n- [CHANGED] - Online Map - Gray-Line is enabled by default\n- Update Timezone database\n\n* Sun Nov 20 2022 Ladislav Foldyna - 0.16.0-1\n- [NEW] - SOTA/IOTA lists updated regularly\n- [NEW] - Added WWFF list, updated regularly\n- [NEW] - QTH/Grid are filled based on SOTA/WWFF\n- [NEW] - DXC/WSJTX columns are movable, added column visibility setting\n- [NEW] - DXC/WSJTX columns layout is saved\n- [NEW] - Added Wiki&Report Issue links to Help section\n- [NEW] - About dialog contains run-time information\n- [NEW] - Solar Info as a ToolTip\n- [NEW] - QSO Manual Entry Mode\n- Fixed Bandmap unlogical animation when band is changed (issue #128)\n- Fixed Bandmap marks are not displayed correctly when RIT/XI (issue #131)\n- Fixed Setting Dialog size\n- Update Timezone database\n\n* Sun Oct 16 2022 Ladislav Foldyna - 0.15.0-1\n- Fixed Keeping the Bandmap RX mark always visible when centre RX is disabled (issue #115)\n- Fixed Equipment Menu: Swapped Connect Keyer and Rig (issue #122)\n- Fixed Callsign is deleted when clicking bandmap (issue #126)\n- Fixed typo in the Map layer menu (issue #127)\n- Fixed compilation issues & warning under QT6 - preparation for QT6 migration\n\n* Sun Oct 2 2022 Ladislav Foldyna - 0.14.1-1\n- Fixed CW Console - HALT Button is not enabled under Ubuntu flavours (issue #124)\n\n* Thu Sep 29 2022 Ladislav Foldyna - 0.14.0-1\n- [NEW] CW Console (Winkey2, Morse over CAT support)\n- [NEW] DX Cluster pre-defined commands (send last spot, get stats)\n- [NEW] Added DX Cluster Views (Spots, WCY, WWV, ToALL)\n- [NEW] Implemented DX Cluster Reconnection\n- [NEW] Remember last used DX Cluster\n- [CHANGED] - UI unifications - Rot/Rig/DXC\n- Fixed COM port validation for Windows platform\n- Fixed Reconnecting (DXC/Callbook) (issue #110)\n- Fixed DX Cluster crashes when DXC server is not connected and a command is sent (issue #111)\n- Fixed Bandmap callsign selection not fully works (issue #116)\n\n* Sat Aug 6 2022 Ladislav Foldyna - 0.13.0-1\n- [NEW] QSY Contact Wiping (issue #100)\n- [NEW] Timeoff is highlighted when QSO timer is running (issue #100)\n- [NEW] Callsign whisperer\n- [NEW] Bandmap - Spot's color is recalculated when QSO is saved\n- [NEW] BandMap - CTRL + Wheel zooming\n- [NEW] BandMap - Zooming via buttons keeps a focus on centre freq\n- [NEW] BandMap - DX Spot's Comment as a tooltip\n- [CHANGED] BandMap - UI Layout\n- Fixed MacOS builds (PR #102) (thx gerbert)\n- Fixed templates under MacOS (PR #101) (thx gerbert)\n- Fixed WindowsOS Installer - Unable to upgrade version\n\n* Fri Jul 15 2022 Ladislav Foldyna - 0.12.0-1\n- [NEW] Statistics - Show ODX on the map\n- [EXPERIMENTAL] Support for QT Styles (issue #88)\n- [CHANGED] - Removed F2 as a shortcut for QSO field editing\n- Next fixing of a high CPU load when DXC is processed (issue #52)\n- Fixed QSO fields from prev QSOs when Prefix - Callsign - Suffix (issue #90)\n- Fixed Chaotic QSO start time (issue #93)\n- Offline maps - Lighter colors, night sky removed, Sun position removed (issue #97)\n- Fixed incorrect A-Index colort (issue #98)\n- Fixed Stats Widget - percents - does not reflect date range (issue #99)\n- Fixed potential LogParam Cache issue\n- Import/Export polishing\n\n* Sun Jun 26 2022 Ladislav Foldyna - 0.11.0-1\n- [NEW] QSO Detail/Edit Dialog\n- [NEW] Added mW power Support\n- [NEW] Implemented ADIF 3.1.3\n- [NEW] Rigwidget saves last used freq for bands\n- Fixed Rig Combo size when Rig Profile name is long (issue #31)\n- Fixed CQZ, ITUZ do not validate whether their entered value is a number (issue #75)\n- Fixed vucc, myvucc must be uppercase - Edit mode (issue #76)\n- Fixed Greyline-Map is very dark (issue #78)\n- Fixed DX Country is not saved properly when name is between S-Z (issue #79)\n- Fixed Bandmap call selection - only left mouse button (issue #82)\n- Fixed My Notes Copy & Paste - Rich Text (issue #83)\n- Fixed Font appearance in the context menu (issue #84)\n\n* Sun Jun 5 2022 Ladislav Foldyna - 0.10.0-1\n- [NEW] Bandmap shows XIT/RIT Freq\n- [NEW] Bandmap RX Mark Center (issue #69)\n- [NEW] Getting PTT State from RIG - only for CAT-controlled rigs\n- [NEW] PTT Shortchut - only for CAT-controlled rigs\n- Fixed Lost internet conneciton is not detected properly (issue #56)\n- Fixed Cannot manually edit QSO Date&Time (issue #66)\n- Fixed Field contents in capital letters (issue #67)\n- Fixed Band RX is not updated when RX Freq is edited (issue #72)\n- Fixed Stat Windget does not handle a date range correctly (issue #73)\n- Fixed eQSL card is incorreclty handled when a callsign contains special characters (issue #74)\n\n* Fri May 20 2022 Ladislav Foldyna - 0.9.0-1\n- [NEW] User-defined Spot Alerts\n- [NEW] User filter contains a new operator \"Starts with\"\n- [NEW] a real local time is shown for the DX callsign (issue #45)\n- [NEW] Lotw/eQSL registration info is showed from callbooks\n- [NEW] Added shortcuts for menu and tabs\n- [NEW] Bandmap - Switching a band view via Bandmap context menu (issue #57)\n- [CHANGED] - Network Notification format\n- Fixed issue with My Notes multiple lines edit/show mode (issue #39)\n- Fixed issue when GUI froze when Rig disconnect was called (issue #50)\n- Partially fixed a high CPU load when DXC is processed (issue #52)\n- Fixed crashes under Debian \"bullseye\" - 32bit (issue #55)\n- Fixed Bandmap Callsign selection margin (issue #61)\n- Fixed issue when it was not possible to enter RX/TX freq manually\n\n* Fri Apr 22 2022 Ladislav Foldyna - 0.8.0-1\n- RIT/XIT offset enable/disable detection (issue #26)\n- Fixed Rig Setting, Data Bits (issue #28)\n- Added default PWR for Rig profile (issue #30)\n- Fixed issue when GUI freezes during Rig connection (issue #32 & #33)\n- Fixed issue with an incorrect value of A-Index (issue #34)\n- Fixed ADI Import - incorrect _INTL fields import (issue #35)\n- Fixed isuue with an editing of bands in Setting dialog (#issue 36)\n- Fixed issue with hamlib when get_pwr crashes for a network rig (issue #37)\n- Improved new QSO fields are filled from prev QSO (issue #40)\n- Added mode for a network Rig (issue #41)\n- Fixed warning - processing a new request but the previous one hasn't been completed (issue #42)\n- Fixed Info widget when Country name is long (issue #43)\n- Reordered column visibility Tabs (issue #46)\n- Improved Rig tunning when XIT/RIT is enabled (issue #47)\n\n* Fri Apr 8 2022 Ladislav Foldyna - 0.7.0-1\n- [NEW] Ant/Rig/Rot Profiles\n- [NEW] Rig widget shows additional information\n- [NEW] Rig widget Band/Mode/Profile Changer\n- [NEW] Rot profile Changer\n- [NEW] AZ/EL are stored when Rot is connected\n- Fixed an issue with Statistic widget (issue #25)\n- Fixed Rot AZ current value (issue #22)\n\n* Thu Mar 10 2022 Ladislav Foldyna - 0.6.5-1\n- Fixed missing modes in Setting Dialog (issue #11)\n- Fixed Station Profile text color in dark mode (issue #10)\n- Fixed DXCluster Server Combo (issue #12)\n- Fixed TAB focus on QSO Fields (issue #14)\n\n* Sun Mar 6 2022 Ladislav Foldyna - 0.6.0-1\n- [NEW] QSL - added import a file with QSL - QSLr column\n- Fixed QLog start when Band is 3cm (too long start time due to the Bandmap drawing) (issue #6)\n- Fixed Rotator Widget Warning - map transformation issue (issue #8)\n- Changed Bandmap window narrow size (issue #3)\n- Changed User Filter Widget size\n- Removed Units from Logbook widget\n- Removed UTC string\n- Renamed RSTs, RSTr etc. (issue #4)\n- Renamed Main Menu Services->Service and Station->Equipment\n- Internal - reworked Service networking signal handling\n\n* Sat Feb 19 2022 Ladislav Foldyna - 0.5.0-1\n- DB: Started to use *_INTL fields\n- DB: Added all ADIF-supported modes/submodes\n- GUI: Dark Mode\n- GUI: TIme format controlled by Locale\n- Import/Export: ADI do not export UTF-8 characters and *_INTL fields\n- Import/Export: ADX exports UTF-8 characters and *_INTL fields\n- Import/Export: Added Import of ADX file format\n- Logbook: Shows QSO summary as a Callsign's tooltip\n- Logbook: QSO time is shown with seconds; added timezone\n- New QSO: Added My notes - free text for your personal notes\n- Backup: Change backup format form ADI to ADX (ADX supports UTF-8)\n- Settings: WSJTX Port is changable\n\n* Sun Jan 9 2022 Ladislav Foldyna - 0.4.0-1\n- Stats: Added Show on Map - QSOs and Worked&Confirmed Grids\n- Stats: Stats are refreshed after every QSO\n- WSJTX: Remove TRX/Monitoring Status\n- Added Split mode - RX/TX RIG Offset\n- Added export of selected QSOs\n- Fixed FLdigi interface\n- CPPChecks & Clazy cleanup\n\n* Sun Dec 19 2021 Ladislav Foldyna - 0.3.0-1\n- Rework Station Profile - stored in DB, new fields\n- Added VUCC fields support\n- Added BandMap marks (CTRL+M)\n- Clublog is uploaded the same way as EQSL and LOTW (modified QSO are resent)\n- Clublog real-time upload is temporary disabled\n- Added QRZ suppor - upload QSO and Callsign query\n- Callbook cooperation - Primary&Secondary - Secondary used when Primary did not find\n\n* Sat Nov 27 2021 Ladislav Foldyna - 0.2.0-1\n- Initial version of the package based on v0.2.0\n"
  },
  {
    "path": "service/GenericCallbook.cpp",
    "content": "#include <QTextDocument>\n\n#include \"GenericCallbook.h\"\n#include \"core/LogParam.h\"\n\nconst QString GenericCallbook::SECURE_STORAGE_KEY = \"Callbook\";\nconst QString GenericCallbook::CALLBOOK_NAME = \"none\";\n\nGenericCallbook::GenericCallbook(QObject *parent) :\n    QObject(parent)\n{\n    nam = new QNetworkAccessManager(this);\n    connect(nam, &QNetworkAccessManager::finished, this, &GenericCallbook::onNetworkReply);\n}\n\nconst QString GenericCallbook::getWebLookupURL(const QString &callsign,\n                                               const QString &URL,\n                                               bool replaceMacro )\n{\n    QString url = ( URL.isEmpty() ) ? LogParam::getCallbookWebLookupURL(\"https://www.qrz.com/lookup/<DXCALL>\")\n                                    : URL;\n\n    if ( replaceMacro ) url.replace(\"<DXCALL>\", callsign);\n    return url;\n}\n\nQString GenericCallbook::decodeHtmlEntities(const QString &text)\n{\n    QTextDocument doc;\n    doc.setHtml(text);\n    return doc.toRawText().trimmed();\n}\n\nvoid GenericCallbook::onNetworkReply(QNetworkReply *reply)\n{\n    processReply(reply);\n}\n\n\n"
  },
  {
    "path": "service/GenericCallbook.h",
    "content": "#ifndef QLOG_SERVICE_GENERICCALLBOOK_H\n#define QLOG_SERVICE_GENERICCALLBOOK_H\n\n#include <QObject>\n#include <QNetworkReply>\n\nstruct CallbookResponseData\n{\n    QString call;\n    QString nick;\n    QString qth;\n    QString gridsquare;\n    QString qsl_via;\n    QString cqz;\n    QString ituz;\n    QString dok;\n    QString iota;\n    QString email;\n    QString dxcc;\n    QString name_fmt;\n    QString fname;\n    QString lname;\n    QString addr1;\n    QString us_state;\n    QString zipcode;\n    QString country;\n    QString latitude;\n    QString longitude;\n    QString county;\n    QString lic_year;\n    QString utc_offset;\n    QString eqsl;\n    QString pqsl;\n    QString born;\n    QString lotw;\n    QString url;\n    QString image_url;\n};\n\nQ_DECLARE_METATYPE(CallbookResponseData)\n\nclass GenericCallbook : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit GenericCallbook(QObject *parent = nullptr);\n    virtual ~GenericCallbook() {nam->deleteLater();};\n\n    const static QString SECURE_STORAGE_KEY;\n    const static QString CALLBOOK_NAME;\n\n    static const QString getWebLookupURL(const QString &callsign,\n                                         const QString &URL = QString(),\n                                         bool replaceMacro = true);\n\n    virtual QString getDisplayName() = 0;\n\nprotected:\n    QNetworkAccessManager* getNetworkAccessManager() {return nam;};\n    virtual void processReply(QNetworkReply *reply) = 0;\n    QString decodeHtmlEntities(const QString &text);\n\nsignals:\n    void callsignResult(CallbookResponseData);\n    void lookupError(const QString);\n    void loginFailed();\n    void callsignNotFound(QString);\n\npublic slots:\n    virtual void queryCallsign(const QString &callsign) = 0;\n    virtual void abortQuery() = 0;\n\nprivate:\n    QNetworkAccessManager* nam;\n\nprivate slots:\n    void onNetworkReply(QNetworkReply *reply);\n};\n#endif // QLOG_SERVICE_GENERICCALLBOOK_H\n"
  },
  {
    "path": "service/GenericQSLDownloader.cpp",
    "content": "#include \"GenericQSLDownloader.h\"\n#include <QNetworkReply>\n\nGenericQSLDownloader::GenericQSLDownloader(QObject *parent)\n    : QObject{parent}\n{\n    nam = new QNetworkAccessManager(this);\n    connect(nam, &QNetworkAccessManager::finished, this, &GenericQSLDownloader::onNetworkReply);\n}\n\nvoid GenericQSLDownloader::onNetworkReply(QNetworkReply *reply)\n{\n    processReply(reply);\n}\n"
  },
  {
    "path": "service/GenericQSLDownloader.h",
    "content": "#ifndef GENERICQSLDOWNLOADER_H\n#define GENERICQSLDOWNLOADER_H\n\n#include <QObject>\n#include <QNetworkAccessManager>\n#include <logformat/LogFormat.h>\n\nclass GenericQSLDownloader : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit GenericQSLDownloader(QObject *parent = nullptr);\n    virtual ~GenericQSLDownloader() {nam->deleteLater();};\n    virtual void receiveQSL(const QDate&, bool, const QString&) = 0;\n\nsignals:\n    void receiveQSLProgress(qulonglong value);\n    void receiveQSLStarted();\n    void receiveQSLComplete(QSLMergeStat);\n    void receiveQSLFailed(QString);\n\npublic slots:\n    virtual void abortDownload() = 0;\n    QNetworkAccessManager* getNetworkAccessManager() {return nam;};\n\nprotected:\n    virtual void processReply(QNetworkReply *reply) = 0;\n\nprivate slots:\n    void onNetworkReply(QNetworkReply *reply);\n\nprivate:\n        QNetworkAccessManager* nam;\n};\n\n#endif // GENERICQSLDOWNLOADER_H\n"
  },
  {
    "path": "service/GenericQSOUploader.cpp",
    "content": "#include \"GenericQSOUploader.h\"\n#include <QNetworkReply>\n#include <QTextStream>\n#include \"logformat/AdiFormat.h\"\n\nGenericQSOUploader::GenericQSOUploader(const QStringList &uploadedFields, QObject *parent)\n    : QObject{parent},\n      uploadedFields(uploadedFields)\n{\n    nam = new QNetworkAccessManager(this);\n\n    connect(nam, &QNetworkAccessManager::finished, this, &GenericQSOUploader::onNetworkReply);\n}\n\nconst QByteArray GenericQSOUploader::generateADIF(const QList<QSqlRecord> &qsos, QMap<QString, QString> *applTags)\n{\n    QByteArray data;\n    QTextStream stream(&data, QIODevice::ReadWrite);\n    AdiFormat adi(stream);\n\n    adi.exportStart();\n\n    for ( const QSqlRecord &qso : qsos )\n        adi.exportContact(stripRecord(qso), applTags);\n\n    adi.exportEnd();\n    stream.flush();\n    return data;\n}\n\nconst QSqlRecord GenericQSOUploader::stripRecord(const QSqlRecord &inRecord)\n{\n    if ( uploadedFields.isEmpty() )\n        return inRecord;\n\n    QSqlRecord ret;\n\n    for ( int i = 0; i < inRecord.count(); i++ )\n    {\n        QSqlField curr = inRecord.field(i);\n        if ( uploadedFields.contains(curr.name()) )\n            ret.append(curr);\n    }\n    return ret;\n}\n\nvoid GenericQSOUploader::onNetworkReply(QNetworkReply *reply)\n{\n    processReply(reply);\n}\n"
  },
  {
    "path": "service/GenericQSOUploader.h",
    "content": "#ifndef QLOG_SERVICE_GENERICQSOUPLOADER_H\n#define QLOG_SERVICE_GENERICQSOUPLOADER_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include <QNetworkAccessManager>\n\nclass GenericQSOUploader : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit GenericQSOUploader(const QStringList &uploadedFields, QObject *parent = nullptr);\n    virtual ~GenericQSOUploader() {nam->deleteLater();};\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) = 0;\n\nsignals:\n    void uploadFinished();\n    void uploadError(QString);\n    void uploadedQSO(qulonglong);\n\npublic slots:\n    virtual void abortRequest() = 0;\n\nprotected:\n    virtual const QByteArray generateADIF(const QList<QSqlRecord> &qsos, QMap<QString,\n                                          QString> *applTags = nullptr);\n    virtual const QSqlRecord stripRecord(const QSqlRecord &inRecord);\n    virtual void processReply(QNetworkReply *reply) = 0;\n    QNetworkAccessManager* getNetworkAccessManager() {return nam;};\n\nprivate:\n    QNetworkAccessManager* nam;\n    QStringList uploadedFields;\n\nprivate slots:\n    void onNetworkReply(QNetworkReply *reply);\n};\n\n#endif // QLOG_SERVICE_GENERICQSOUPLOADER_H\n"
  },
  {
    "path": "service/cloudlog/Cloudlog.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QJsonObject>\n#include <QJsonDocument>\n\n#include \"Cloudlog.h\"\n#include \"core/debug.h\"\n#include \"core/LogParam.h\"\n#include \"logformat/AdiFormat.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.cloudlog\");\n\nconst QString CloudlogBase::SECURE_STORAGE_API_KEY = \"Cloudlog\";\nconst QString CloudlogBase::CONFIG_USERNAME_API_CONST = \"logbookapi\";\nREGISTRATION_SECURE_SERVICE(CloudlogBase);\n\nQString CloudlogBase::getLogbookAPIKey()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(SECURE_STORAGE_API_KEY, getUsername());\n}\n\nvoid CloudlogBase::saveLogbookAPIKey(const QString &newKey)\n{\n    FCT_IDENTIFICATION;\n\n    deletePassword(CloudlogBase::SECURE_STORAGE_API_KEY, getUsername());\n\n    if ( newKey.isEmpty() ) return;\n\n    savePassword(CloudlogBase::SECURE_STORAGE_API_KEY,\n                 getUsername(), newKey);\n}\n\nQString CloudlogBase::getAPIEndpoint()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getCloudlogAPIEndpoint();\n}\n\nvoid CloudlogBase::setAPIEndpoint(const QString &endpoint)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setCloudlogAPIEndpoint(endpoint);\n}\n\nvoid CloudlogBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_API_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_API_KEY, [](){ return getUsername(); } }\n        };\n    });\n}\n\nCloudlogUploader::CloudlogUploader(QObject *parent) :\n      GenericQSOUploader(QStringList(), parent),\n      CloudlogBase(),\n      currentReply(nullptr),\n      cancelUpload(false),\n      stationID(0)\n{\n    FCT_IDENTIFICATION;\n}\n\nCloudlogUploader::~CloudlogUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n\nQVariantMap CloudlogUploader::generateUploadConfigMap(uint stationID)\n{\n    FCT_IDENTIFICATION;\n\n    return QVariantMap({{\"stationID\", stationID}});\n}\n\nvoid CloudlogUploader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    cancelUpload = true;\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply = nullptr;\n    }\n}\n\nvoid CloudlogUploader::sendStationInfoReq()\n{\n    FCT_IDENTIFICATION;\n\n    QUrl url(LogParam::getCloudlogAPIEndpoint() + \"/api/station_info/\" + getLogbookAPIKey());\n    QNetworkRequest request(url);\n\n    //qCDebug(runtime) << url;\n    QNetworkReply *reply = getNetworkAccessManager()->get(request); // do not use currentReply\n    reply->setProperty(\"messageType\", QVariant(\"getStationID\"));\n}\n\nvoid CloudlogUploader::uploadContact(const QSqlRecord &record, uint stationID)\n{\n    FCT_IDENTIFICATION;\n\n    const QByteArray &data = generateADIF({record});\n    cancelUpload = false;\n    uploadAdif(data, stationID);\n    currentReply->setProperty(\"contactID\", record.value(\"id\"));\n}\n\nvoid CloudlogUploader::uploadAdif(const QByteArray &data, uint stationID)\n{\n    FCT_IDENTIFICATION;\n\n    QUrl url(LogParam::getCloudlogAPIEndpoint() + \"/api/qso\");\n    QNetworkRequest request(url);\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/json\");\n    request.setRawHeader(\"Accept\", \"application/json\");\n\n    QJsonObject json;\n    json[\"key\"] = getLogbookAPIKey();\n    json[\"station_profile_id\"] = (qint64)stationID;\n    json[\"type\"] = \"adif\";\n    json[\"string\"] = QString::fromUtf8(data);\n\n    QJsonDocument doc(json);\n    qCDebug(runtime) << \"Request Json:\" << doc.toJson();\n\n    currentReply = getNetworkAccessManager()->post(request, doc.toJson());\n    currentReply->setProperty(\"messageType\", QVariant(\"uploadADIF\"));\n}\n\nvoid CloudlogUploader::uploadQSOList(const QList<QSqlRecord> &qsos, const QVariantMap &addlParams)\n{\n    FCT_IDENTIFICATION;\n\n    if ( qsos.isEmpty() )\n    {\n        /* Nothing to do */\n        emit uploadFinished();\n        return;\n    }\n\n    /* Even though Cloudlog can upload batches, we will upload QSOs one by one. This has several advantages\n     *  - we don't have to verify the upload size limit for PHP\n     *  - we don't have to search for errors for individual QSOs\n     *  - we correctly display the upload progress dialog.\n     */\n    stationID = addlParams[\"stationID\"].toUInt();\n    cancelUpload = false;\n    queuedContacts4Upload = qsos;\n    uploadContact(queuedContacts4Upload.first(), stationID);\n    queuedContacts4Upload.removeFirst();\n}\n\nconst QMap<uint, CloudlogUploader::StationProfile> &CloudlogUploader::getAvailableStationIDs() const\n{\n    return availableStationIDs;\n}\n\nvoid CloudlogUploader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n    const QString &messageType = reply->property(\"messageType\").toString();\n    const QByteArray &response = reply->readAll();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType\n                     << \"HTTP Code\" << replyStatusCode\n                     << \"Cloudlog URL\" << reply->request().url().toString();\n    qCDebug(runtime) << \"Response:\" << response;\n\n    /*************/\n    /* uploadQSO */\n    /*************/\n    if ( messageType == \"uploadADIF\" )\n    {\n        switch (replyStatusCode)\n        {\n            case 201: // Created\n            case 400: // Bad Request (e.g., duplicate)\n            {\n                const QVariantMap &resp = parseResponse(response);\n                const QString &status = resp.value(\"status\").toString();\n                const QStringList &messages = resp.value(\"messages\").toStringList();\n                QString reason = messages.isEmpty() ? QString() : messages.first();\n                reason = (reason.isEmpty() && messages.size() >= 2) ? messages.at(1) : reason;\n\n                /* The idea behind this was that QLog would submit all new and modified QSOs\n                 * to Wavelog even though Wavelog rejects duplicates. The goal was that once\n                 * Wavelog starts accepting QSO updates, QLog could remain unchanged. Unfortunately,\n                 * the issue is that Wavelog reports duplicates as errors, and worse, the message\n                 * text is translated into multiple languages. As a result, QLog cannot reliably\n                 * distinguish an actual error from a duplicate. Therefore, I am removing this check,\n                 * and it is necessary to ensure that QLog sends only new QSOs to Cloudlog/Wavelog. */\n                bool success = (status == \"created\");\n                               //|| (status == \"abort\" && reason.contains(\"Duplicate for\"));\n\n\n                if (success)\n                {\n                    emit uploadedQSO(reply->property(\"contactID\").toULongLong());\n\n                    if (queuedContacts4Upload.isEmpty())\n                    {\n                        cancelUpload = false;\n                        emit uploadFinished();\n                    }\n                    else if (!cancelUpload)\n                    {\n                        uploadContact(queuedContacts4Upload.first(), stationID);\n                        queuedContacts4Upload.removeFirst();\n                    }\n                }\n                else\n                {\n                    cancelUpload = false;\n                    queuedContacts4Upload.clear();\n                    emit uploadError(reason.isEmpty() ? reply->errorString() : reason);\n                }\n                break;\n            }\n\n            case 401: // Unauthorized\n                cancelUpload = false;\n                queuedContacts4Upload.clear();\n                emit uploadError(tr(\"Invalid API Key\"));\n                break;\n\n            default:\n                qCWarning(runtime) << \"Unexpected HTTP status code:\" << replyStatusCode;\n                cancelUpload = false;\n                queuedContacts4Upload.clear();\n                emit uploadError(reply->errorString());\n                break;\n        }\n    }\n    /*************/\n    /* uploadQSO */\n    /*************/\n    else if ( messageType == \"getStationID\" )\n    {\n        if ( replyStatusCode == 200 )\n        {\n            QJsonDocument doc = QJsonDocument::fromJson(response);\n\n            if (doc.isArray())\n            {\n                const QJsonArray &array = doc.array();\n                for ( const QJsonValue &value : array )\n                    if (value.isObject())\n                    {\n                        StationProfile profile = StationProfile::fromJson(value.toObject());\n                        availableStationIDs.insert(profile.station_id, profile);\n                    }\n            }\n            emit stationIDsUpdated();\n        }\n    }\n\n    reply->deleteLater();\n}\n\nconst QByteArray CloudlogUploader::generateADIF(const QList<QSqlRecord> &qsos, QMap<QString, QString> *applTags)\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray data;\n    QTextStream stream(&data, QIODevice::ReadWrite);\n    AdiFormat adi(stream);\n\n    //adi.exportStart(); // don't add header\n    for ( const QSqlRecord &qso : qsos )\n        adi.exportContact(stripRecord(qso), applTags);\n    //adi.exportEnd();   // don't add footer\n\n    stream.flush();\n    return data;\n}\n\nQVariantMap CloudlogUploader::parseResponse(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    QJsonParseError error;\n    QJsonDocument doc = QJsonDocument::fromJson(data, &error);\n\n    if ( error.error != QJsonParseError::NoError || !doc.isObject())\n    {\n        qCWarning(runtime) << \"JSON parse error:\" << error.errorString();\n        return {};\n    }\n\n    QJsonObject obj = doc.object();\n    return obj.toVariantMap();\n}\n\n\nCloudlogUploader::StationProfile CloudlogUploader::StationProfile::fromJson(const QJsonObject &obj)\n{\n    FCT_IDENTIFICATION;\n\n    StationProfile profile;\n    profile.station_id = obj.value(\"station_id\").toString().toInt();\n    profile.station_profile_name = obj.value(\"station_profile_name\").toString();\n    profile.station_gridsquare = obj.value(\"station_gridsquare\").toString();\n    profile.station_callsign = obj.value(\"station_callsign\").toString();\n    profile.station_active = obj.contains(\"station_active\") && obj.value(\"station_active\").toString() == \"1\";\n    return profile;\n}\n"
  },
  {
    "path": "service/cloudlog/Cloudlog.h",
    "content": "#ifndef QLOG_SERVICE_CLOUDLOG_CLOUDLOG_H\n#define QLOG_SERVICE_CLOUDLOG_CLOUDLOG_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include \"service/GenericQSOUploader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkReply;\nclass QNetworkAccessManager;\n\nclass CloudlogBase : public SecureServiceBase<CloudlogBase>\n{\nprotected:\n    const static QString SECURE_STORAGE_API_KEY;\n    const static QString CONFIG_USERNAME_API_CONST;\n\npublic:\n    explicit CloudlogBase() {};\n    virtual ~CloudlogBase() {};\n\n    DECLARE_SECURE_SERVICE(CloudlogBase);\n\n    static QString getUsername() {return CONFIG_USERNAME_API_CONST;}\n    static QString getLogbookAPIKey();\n    static void saveLogbookAPIKey(const QString& newKey);\n\n    static QString getAPIEndpoint();\n    static void setAPIEndpoint(const QString &endpoint);\n};\n\nclass CloudlogUploader : public GenericQSOUploader, private CloudlogBase\n{\n    Q_OBJECT\n\npublic:\n    class StationProfile\n    {\n    public:\n        int station_id;\n        QString station_profile_name;\n        QString station_gridsquare;\n        QString station_callsign;\n        bool station_active = false;\n\n        static StationProfile fromJson(const QJsonObject &obj);\n    };\n\n    explicit CloudlogUploader(QObject *parent = nullptr);\n    virtual ~CloudlogUploader();\n    static QVariantMap generateUploadConfigMap(uint stationID);\n    void uploadAdif(const QByteArray &data, uint stationID);\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n    const QMap<uint, StationProfile>& getAvailableStationIDs() const;\n    void sendStationInfoReq();\n\npublic slots:\n    virtual void abortRequest() override;\n    void uploadContact(const QSqlRecord &record, uint stationID);\n\nsignals:\n    void stationIDsUpdated();\n\nprotected:\n    virtual void processReply(QNetworkReply* reply) override;\n    virtual const QByteArray generateADIF(const QList<QSqlRecord> &qsos, QMap<QString,\n                                          QString> *applTags = nullptr) override;\nprivate:\n\n    QMap<uint, StationProfile> availableStationIDs;\n    QNetworkReply *currentReply;\n    QList<QSqlRecord> queuedContacts4Upload;\n    bool cancelUpload;\n    uint stationID;\n\n    QVariantMap parseResponse(const QByteArray &data);\n};\n\n#endif // QLOG_SERVICE_CLOUDLOG_CLOUDLOG_H\n"
  },
  {
    "path": "service/clublog/ClubLog.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QHttpMultiPart>\n#include <QSqlError>\n#include <QSqlField>\n#include <QTimeZone>\n#include \"ClubLog.h\"\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/LogParam.h\"\n#include \"data/Data.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.clublog\");\n\nconst QString ClubLogBase::SECURE_STORAGE_KEY = \"Clublog\";\nconst QString ClubLogBase::API_KEY = \"7a45c2b20f932ca8908b975a60f0a78a7602f65a\";\n\nREGISTRATION_SECURE_SERVICE(ClubLogBase);\n\n// https://clublog.freshdesk.com/support/solutions/articles/53202-which-adif-fields-does-club-log-use-\nQStringList ClubLogUploader::uploadedFields =\n{\n    \"start_time\",\n    \"qsl_rdate\",\n    \"qsl_sdate\",\n    \"callsign\",\n    \"operator\",\n    \"mode\",\n    \"band\",\n    \"band_rx\",\n    \"freq\",\n    \"qsl_rcvd\",\n    \"lotw_qsl_rcvd\",\n    \"qsl_sent\",\n    \"dxcc\",\n    \"prop_mode\",\n    \"credit_granted\",\n    \"rst_sent\",\n    \"rst_rcvd\",\n    \"notes\",\n    \"gridsquare\",\n    \"vucc_grids\",\n    \"sat_name\"\n};\n\nconst QString ClubLogBase::getEmail()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getClublogLogbookReqEmail();\n}\n\nbool ClubLogBase::isUploadImmediatelyEnabled()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getClublogUploadImmediatelyEnabled();\n}\n\nconst QString ClubLogBase::getPasswd()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(ClubLogBase::SECURE_STORAGE_KEY, getEmail());\n}\n\nvoid ClubLogBase::saveUsernamePassword(const QString &newEmail, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &oldEmail = getEmail();\n    if ( oldEmail != newEmail )\n    {\n        deletePassword(ClubLogBase::SECURE_STORAGE_KEY, oldEmail);\n    }\n    LogParam::setClublogLogbookReqEmail(newEmail);\n    savePassword(ClubLogBase::SECURE_STORAGE_KEY,\n                 newEmail, newPassword);\n}\n\nvoid ClubLogBase::saveUploadImmediatelyConfig(bool value)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setClublogUploadImmediatelyEnabled(value);\n}\n\nvoid ClubLogBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getEmail(); } }\n        };\n    });\n}\n\nClubLogUploader::ClubLogUploader(QObject *parent) :\n    GenericQSOUploader(uploadedFields, parent),\n    ClubLogBase(),\n    rx(\"[a-zA-Z]\")\n{\n    FCT_IDENTIFICATION;\n\n    if ( !query_updateRT.prepare(\"UPDATE contacts \"\n                                 \"SET clublog_qso_upload_status='Y', clublog_qso_upload_date = strftime('%Y-%m-%d',DATETIME('now', 'utc')) \"\n                                 \"WHERE id = :id AND callsign = :callsign\") )\n        qCWarning(runtime) << \"Update statement is not prepared\";\n}\n\nClubLogUploader::~ClubLogUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( activeReplies.count() > 0 )\n    {\n        QMutableListIterator<QNetworkReply*> i(activeReplies);\n\n        while ( i.hasNext() )\n        {\n            QNetworkReply* curr = i.next();\n            curr->abort();\n            curr->deleteLater();\n            i.remove();\n        }\n    }\n}\n\nvoid ClubLogUploader::sendRealtimeRequest(const OnlineUploadCommand command,\n                                          const QSqlRecord &record,\n                                          const QString &uploadCallsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << command << uploadCallsign;\n\n    if ( !isUploadImmediatelyEnabled() )\n    {\n        qCDebug(runtime) << \"Instant Upload is disabled, no action\";\n        return;\n    }\n\n    const QString &email = getEmail();\n    const QString &password = getPasswd();\n\n    if ( email.isEmpty() || uploadCallsign.isEmpty() || password.isEmpty() )\n        return;\n\n    QUrl url;\n    QUrlQuery query;\n\n    query.addQueryItem(\"email\", email.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"callsign\", uploadCallsign.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"password\", password.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"api\", API_KEY);\n\n    switch (command)\n    {\n    case ClubLogUploader::INSERT_QSO:\n    {\n        url.setUrl(API_LIVE_UPLOAD_URL);\n        QByteArray data = generateADIF({record});\n        data.replace(\"\\n\", \" \");\n        query.addQueryItem(\"adif\", data.trimmed().toPercentEncoding());\n    }\n        break;\n    case ClubLogUploader::UPDATE_QSO:\n    case ClubLogUploader::DELETE_QSO:\n        url.setUrl(API_LIVE_DELETE_URL);\n        query.addQueryItem(\"dxcall\", record.value(\"callsign\").toByteArray());\n        query.addQueryItem(\"datetime\", record.value(\"start_time\").toDateTime().toTimeZone(QTimeZone::utc()).toString(\"yyyy-MM-dd hh:mm:ss\").toUtf8());\n        query.addQueryItem(\"bandid\", record.value(\"band\").toString().replace(rx, \"\").toUtf8()); //clublog support non-ADIF bands enumaration, need remove m, cm, mm string\n        break;\n    default:\n        qCWarning(runtime) << \"Unsupported RT Command\" << command;\n        return;\n    }\n\n    qCDebug(runtime) << Data::safeQueryString(query);\n\n    QNetworkRequest request(url);\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n    QNetworkReply *currentReply = getNetworkAccessManager()->post(request, query.query(QUrl::FullyEncoded).toUtf8());\n\n    QVariant messageType;\n    switch ( command )\n    {\n    case ClubLogUploader::INSERT_QSO:\n        messageType = \"realtimeInsert\";\n        currentReply->setProperty(\"dxcall\", record.value(\"callsign\"));\n        break;\n    case ClubLogUploader::UPDATE_QSO:\n        messageType = \"realtimeUpdate\";\n        RTupdatesInProgress.insert(record.value(\"id\").toULongLong(), record);\n        break;\n    case ClubLogUploader::DELETE_QSO:\n        messageType = \"realtimeDelete\";\n        break;\n    }\n\n    currentReply->setProperty(\"contactID\", record.value(\"id\"));\n    currentReply->setProperty(\"messageType\", messageType);\n    currentReply->setProperty(\"uploadCallsign\", uploadCallsign);\n    activeReplies << currentReply;\n}\n\nvoid ClubLogUploader::uploadQSOList(const QList<QSqlRecord> &qsos, const QVariantMap &addlParams)\n{\n    FCT_IDENTIFICATION;\n\n    uploadAdif(generateADIF(qsos),\n               addlParams[\"uploadCallsign\"].toString(),\n               addlParams[\"clearFlag\"].toBool());\n}\n\nvoid ClubLogUploader::uploadAdif(const QByteArray& data,\n                         const QString &uploadCallsign,\n                         bool clearFlag)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << data;\n\n    const QString &email = getEmail();\n    const QString &password = getPasswd();\n\n    if ( email.isEmpty() || uploadCallsign.isEmpty() || password.isEmpty() )\n        return;\n\n    QUrl url(API_LOG_UPLOAD_URL);\n\n    QHttpMultiPart* multipart = new QHttpMultiPart(QHttpMultiPart::FormDataType);\n\n    QHttpPart emailPart;\n    emailPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"email\\\"\"));\n    emailPart.setBody(email.toUtf8());\n\n    QHttpPart callsignPart;\n    callsignPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"callsign\\\"\"));\n    callsignPart.setBody(uploadCallsign.toUtf8());\n\n    QHttpPart passwordPart;\n    passwordPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"password\\\"\"));\n    passwordPart.setBody(password.toUtf8());\n\n    QHttpPart clearPart;\n    clearPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"clear\\\"\"));\n    clearPart.setBody( (clearFlag) ? \"1\" : \"0\");\n\n    QHttpPart apiPart;\n    apiPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"api\\\"\"));\n    apiPart.setBody(API_KEY.toUtf8());\n\n    QHttpPart filePart;\n    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(\"application/octet-stream\"));\n    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"file\\\"; filename=\\\"clublog.adi\\\"\"));\n    filePart.setBody(data);\n\n    multipart->append(emailPart);\n    multipart->append(passwordPart);\n    multipart->append(callsignPart);\n    multipart->append(clearPart);\n    multipart->append(apiPart);\n    multipart->append(filePart);\n\n    QNetworkRequest request(url);\n\n    if ( activeReplies.count() > 0 )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    QNetworkReply * currentReply = getNetworkAccessManager()->post(request, multipart);\n    currentReply->setProperty(\"messageType\", QVariant(\"uploadADIFFile\"));\n    currentReply->setProperty(\"uploadCallsign\", uploadCallsign);\n    multipart->setParent(currentReply);\n    activeReplies << currentReply;\n}\n\nvoid ClubLogUploader::processReply(QNetworkReply* reply)\n{\n    FCT_IDENTIFICATION;\n\n    activeReplies.removeAll(reply);\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"Clublog error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"Clublog error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit uploadError(tr(\"Clublog Operation for Callsign %1 failed.<br>%2\").arg(reply->property(\"uploadCallsign\").toString(),\n                                                                                    reply->errorString()));\n            reply->deleteLater();\n        }\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    /******************/\n    /* uploadADIFFile */\n    /******************/\n    if ( messageType == \"uploadADIFFile\" )\n    {\n        emit uploadFinished();\n    }\n    /******************/\n    /* realtimeInsert */\n    /******************/\n    else if ( messageType == \"realtimeInsert\" )\n    {\n        query_updateRT.bindValue(\":id\", reply->property(\"contactID\"));\n        query_updateRT.bindValue(\":callsign\", reply->property(\"dxcall\")); //to be sure that the QSO with the ID is still the same sa before sending\n        if ( !query_updateRT.exec() )\n            qCWarning(runtime) << \"RT Response: SQL Error\" << query_updateRT.lastError();\n        else\n            emit uploadedQSO(reply->property(\"contactID\").toULongLong());\n    }\n    /******************/\n    /* realtimeUpdate */\n    /******************/\n    else if ( messageType == \"realtimeUpdate\")\n    {\n        QSqlRecord insertRecord = RTupdatesInProgress.take(reply->property(\"contactID\").toULongLong());\n\n        if ( insertRecord != QSqlRecord() )\n        {\n            sendRealtimeRequest(ClubLogUploader::INSERT_QSO,\n                                insertRecord,\n                                reply->property(\"uploadCallsign\").toString());\n        }\n        else\n            qWarning() << \"Cannot find record for update in Update In-Progress Table\";\n    }\n    /******************/\n    /* realtimeDelete */\n    /******************/\n    else if ( messageType == \"realtimeDelete\")\n    {\n        //delete response - no action\n    }\n    /*************/\n    /* Otherwise */\n    /*************/\n    else\n        qWarning() << \"Unrecognized Clublog response\" << reply->property(\"messageType\").toString();\n\n    reply->deleteLater(); \n}\n\nvoid ClubLogUploader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    if ( activeReplies.count() > 0 )\n    {\n        QMutableListIterator<QNetworkReply*> i(activeReplies);\n\n        while ( i.hasNext() )\n        {\n            QNetworkReply* curr = i.next();\n            curr->abort();\n            //curr->deleteLater(); // pointer is deleted later in processReply\n            i.remove();\n        }\n    }\n    RTupdatesInProgress.clear();\n}\n\nvoid ClubLogUploader::insertQSOImmediately(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    sendRealtimeRequest(ClubLogUploader::INSERT_QSO,\n                        record,\n                        generateUploadCallsign(record));\n}\n\nvoid ClubLogUploader::updateQSOImmediately(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &uploadStatus = record.value(\"clublog_qso_upload_status\").toString();\n\n    if ( uploadStatus.isEmpty() || uploadStatus == \"N\" )\n    {\n        qCDebug(runtime) << \"QSO would not be uploaded to Clublog - nothing to do\";\n        return;\n    }\n    sendRealtimeRequest(ClubLogUploader::UPDATE_QSO,\n                        record,\n                        generateUploadCallsign(record));\n}\n\nvoid ClubLogUploader::deleteQSOImmediately(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &uploadStatus = record.value(\"clublog_qso_upload_status\").toString();\n\n    if ( uploadStatus.isEmpty() || uploadStatus == \"N\" )\n    {\n        qCDebug(runtime) << \"QSO would not be uploaded to Clublog - nothing to do\";\n        return;\n    }\n\n    sendRealtimeRequest(ClubLogUploader::DELETE_QSO,\n                        record,\n                        generateUploadCallsign(record));\n}\n\nconst QString ClubLogUploader::generateUploadCallsign(const QSqlRecord &record) const\n{\n    FCT_IDENTIFICATION;\n\n#if 0\n    //for cases when QSOs are uploaded to the Clublog log with QSO's station_callsign without the prefix\n    Callsign uploadCallsign(record.value(\"station_callsign\").toString());\n\n    if ( !uploadCallsign.isValid() )\n        qCWarning(runtime) << \"Station callsign is not valid\" << record.value(\"station_callsign\").toString();\n\n    // QSOs are uploaded to the Clublog log with a name such\n    // as QSO's station_callsign without the prefix\n    return uploadCallsign.getHostPrefixWithDelimiter() + uploadCallsign.getBase();\n#endif\n    return record.value(\"station_callsign\").toString();\n}\n"
  },
  {
    "path": "service/clublog/ClubLog.h",
    "content": "#ifndef QLOG_SERVICE_CLUBLOG_CLUBLOG_H\n#define QLOG_SERVICE_CLUBLOG_CLUBLOG_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include <QSqlQuery>\n#include <QHash>\n#include <QRegularExpression>\n#include \"service/GenericQSOUploader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkReply;\nclass QNetworkAccessManager;\n\nclass ClubLogBase : public SecureServiceBase<ClubLogBase>\n{\nprotected:\n    const static QString SECURE_STORAGE_KEY;\n    const static QString API_KEY ;\n\npublic:\n    explicit ClubLogBase() {};\n    virtual ~ClubLogBase() {} ;\n\n    DECLARE_SECURE_SERVICE(ClubLogBase);\n\n    static const QString getEmail();\n    static bool isUploadImmediatelyEnabled();\n    static const QString getPasswd();\n    static void saveUsernamePassword(const QString &, const QString &);\n    static void saveUploadImmediatelyConfig(bool value);\n    static const QString getCTYUrl()  {return QString(\"https://cdn.clublog.org/cty.php?api=%1\").arg(API_KEY);};\n};\n\nclass ClubLogUploader : public GenericQSOUploader, private ClubLogBase\n{\n    Q_OBJECT\n\npublic:\n    static QStringList uploadedFields;\n    static QVariantMap generateUploadConfigMap(const QString uploadCallsign, bool clearFlag)\n    {\n        return QVariantMap({{\"uploadCallsign\", uploadCallsign}, {\"clearFlag\", clearFlag}});\n    }\n\n    enum OnlineUploadCommand\n    {\n      INSERT_QSO,\n      UPDATE_QSO,\n      DELETE_QSO\n    };\n\n    explicit ClubLogUploader(QObject *parent = nullptr);\n    virtual ~ClubLogUploader();\n\n    void uploadAdif(const QByteArray &data,\n                    const QString &uploadCallsign,\n                    bool clearFlag = false);\n    void sendRealtimeRequest(const OnlineUploadCommand command,\n                             const QSqlRecord &record,\n                             const QString &uploadCallsign);\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n\npublic slots:\n    virtual void abortRequest() override;\n    void insertQSOImmediately(const QSqlRecord &record);\n    void updateQSOImmediately(const QSqlRecord &record);\n    void deleteQSOImmediately(const QSqlRecord &record);\n\nprotected:\n    virtual void processReply(QNetworkReply *reply) override;\n\nprivate:\n    const QString API_LIVE_UPLOAD_URL = \"https://clublog.org/realtime.php\";\n    const QString API_LIVE_DELETE_URL = \"https://clublog.org/delete.php\";\n    const QString API_LOG_UPLOAD_URL = \"https://clublog.org/putlogs.php\";\n\n    QList<QNetworkReply*> activeReplies;\n    QSqlQuery query_updateRT;\n    QHash<qulonglong, QSqlRecord> RTupdatesInProgress;\n    QRegularExpression rx;\n\n    const QString generateUploadCallsign(const QSqlRecord &record) const;\n};\n\n#endif // QLOG_SERVICE_CLUBLOG_CLUBLOG_H\n"
  },
  {
    "path": "service/eqsl/Eqsl.cpp",
    "content": "#include <QUrlQuery>\n#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QRegularExpression>\n#include <QRegularExpressionMatch>\n#include <QHttpMultiPart>\n#include <QSqlRecord>\n#include <QDir>\n#include <QTemporaryDir>\n\n#include \"Eqsl.h\"\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"core/LogParam.h\"\n#include \"data/Data.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.eqsl\");\n\nextern QTemporaryDir tempDir;\n\n/* http://www.eqsl.cc/qslcard/ADIFContentSpecs.cfm */\nQStringList EQSLUploader::uploadedFields =\n{\n    \"start_time\",\n    \"callsign\",\n    \"mode\",\n    \"freq\",\n    \"band\",\n    \"prop_mode\",\n    \"rst_sent\",\n    \"submode\",\n    \"sat_mode\",\n    \"sat_name\",\n    \"my_cnty\",\n    \"my_gridsquare\",\n    \"qslmsg\",\n    \"comment\"\n};\n\nconst QString EQSLBase::SECURE_STORAGE_KEY = \"eQSL\";\nREGISTRATION_SECURE_SERVICE(EQSLBase);\n\nconst QString EQSLBase::getUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getEQSLLogbookUsername();\n}\n\nconst QString EQSLBase::getPasswd()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(EQSLBase::SECURE_STORAGE_KEY, getUsername());\n}\n\n\nvoid EQSLBase::saveUsernamePassword(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &oldUsername = getUsername();\n\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(EQSLBase::SECURE_STORAGE_KEY, oldUsername);\n    }\n    LogParam::setEQSLLogbookUsername(newUsername);\n\n    savePassword(EQSLBase::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nvoid EQSLBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getUsername(); } }\n        };\n    });\n}\n\nEQSLUploader::EQSLUploader( QObject *parent ):\n   GenericQSOUploader(uploadedFields, parent),\n   currentReply(nullptr),\n   commentAsQSLMSG(false),\n   disableqslmsg(true)\n{\n    FCT_IDENTIFICATION;\n}\n\nEQSLUploader::~EQSLUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n\nvoid EQSLUploader::uploadAdif(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &username = getUsername();\n    const QString &password = getPassword(EQSLUploader::SECURE_STORAGE_KEY, username);\n\n    /* http://www.eqsl.cc/qslcard/ImportADIF.txt */\n    QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType, this);\n\n    /* UserName */\n    QHttpPart userPart;\n    userPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"eqsl_user\\\"\"));\n    userPart.setBody(username.toUtf8());\n\n    /* Password */\n    QHttpPart passPart;\n    passPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(\"form-data; name=\\\"eqsl_pswd\\\"\"));\n    passPart.setBody(password.toUtf8());\n\n    /* File */\n    QTemporaryFile file;\n    file.open();\n    file.write(data);\n    file.flush();\n\n    QHttpPart filePart;\n    QString aux = QString(\"form-data; name=\\\"Filename\\\"; filename=\\\"%1\\\"\").arg(file.fileName());\n    filePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant(\"application/octet-stream\"));\n    filePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant(aux));\n    filePart.setBody(data);\n\n    multiPart->append(userPart);\n    multiPart->append(passPart);\n    multiPart->append(filePart);\n\n    QUrl url(UPLOAD_ADIF_PAGE);\n    QNetworkRequest request(url);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->post(request, multiPart);\n    currentReply->setProperty(\"messageType\", QVariant(\"uploadADIFFile\"));\n}\n\nconst QSqlRecord EQSLUploader::stripRecord(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    QSqlRecord newRecord(GenericQSOUploader::stripRecord(record));\n\n    if ( disableqslmsg )\n        newRecord.remove(newRecord.indexOf(\"qslmsg\"));\n    else if ( commentAsQSLMSG )\n        newRecord.setValue(\"qslmsg\", record.value(\"comment\"));\n\n    int commentIndex = newRecord.indexOf(\"comment\");\n    if (commentIndex != -1) newRecord.remove(commentIndex);\n\n    return newRecord;\n}\n\nvoid EQSLUploader::uploadQSOList(const QList<QSqlRecord> &qsos, const QVariantMap &addlParams)\n{\n    FCT_IDENTIFICATION;\n\n    QString qthProfile = addlParams[\"qthprofile\"].toString();\n    commentAsQSLMSG = addlParams[\"commentasqslmsg\"].toBool();\n    disableqslmsg = addlParams[\"disableqslmsg\"].toBool();\n\n    QMap<QString, QString> *applTags = nullptr;\n    if ( !qthProfile.isEmpty() )\n    {\n        applTags = new QMap<QString, QString>;\n        applTags->insert(\"app_eqsl_qth_nickname\", qthProfile);\n    }\n\n    QByteArray data = generateADIF(qsos, applTags);\n\n    if ( applTags )\n        delete applTags;\n\n    uploadAdif(data);\n}\n\nvoid EQSLUploader::processReply(QNetworkReply* reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"eQSL error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"eQSL error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit uploadError(reply->errorString());\n            reply->deleteLater();\n        }\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    /******************/\n    /* uploadADIFFile */\n    /******************/\n    if ( messageType == \"uploadADIFFile\" )\n    {\n        const QString replyString(reply->readAll());\n        qCDebug(runtime) << replyString;\n\n        static QRegularExpression rOK(\"Result: (.*)\");\n        QRegularExpressionMatch matchOK = rOK.match(replyString);\n        static QRegularExpression rError(\"Error: (.*)\");\n        QRegularExpressionMatch matchError = rError.match(replyString);\n        static QRegularExpression rWarning(\"Warning: (.*)\");\n        QRegularExpressionMatch matchWarning = rWarning.match(replyString);\n        static QRegularExpression rCaution(\"Caution: (.*)\");\n        QRegularExpressionMatch matchCaution = rCaution.match(replyString);\n        QString msg;\n\n        if ( matchOK.hasMatch() )\n        {\n            emit uploadFinished();\n        }\n        else if (matchError.hasMatch() )\n        {\n            msg = matchError.captured(1);\n            emit uploadError(msg);\n        }\n        else if (matchWarning.hasMatch() )\n        {\n            emit uploadFinished();\n        }\n        else if (matchCaution.hasMatch() )\n        {\n            msg = matchCaution.captured(1);\n            emit uploadError(msg);\n        }\n        else\n        {\n            qCInfo(runtime) << \"Unknown Reply \";\n            qCInfo(runtime) << replyString;\n            emit uploadError(tr(\"Unknown Reply from eQSL\"));\n        }\n    }\n\n    reply->deleteLater();\n}\n\nvoid EQSLUploader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply = nullptr;\n    }\n}\n\nEQSLQSLDownloader::EQSLQSLDownloader(QObject *parent) :\n    GenericQSLDownloader(parent),\n    EQSLBase(),\n    currentReply(nullptr),\n    qslStorage(new QSLStorage(this))\n{\n    FCT_IDENTIFICATION;\n}\n\nEQSLQSLDownloader::~EQSLQSLDownloader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n    qslStorage->deleteLater();\n}\n\nvoid EQSLQSLDownloader::receiveQSL(const QDate &start_date, bool qso_since, const QString &qthNick)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << start_date << qso_since << qthNick;\n\n    QList<QPair<QString, QString>> params;\n\n    if ( !qthNick.isEmpty() )\n        params.append(qMakePair(QString(\"QTHNickname\"), qthNick));\n\n    if ( start_date.isValid() )\n    {\n        if ( qso_since )\n        {\n            const QString &start = start_date.toString(\"MM/dd/yyyy\");\n            const QString &stop = QDate::currentDate().addDays(1).toString(\"MM/dd/yyyy\");\n            params.append(qMakePair(QString(\"LimitDateLo\"), start));\n            params.append(qMakePair(QString(\"LimitDateHi\"), stop));\n        }\n        else\n        {\n            //qsl_since\n            const QString &start = start_date.toString(\"yyyyMMdd\");\n            params.append(qMakePair(QString(\"RcvdSince\"), start));\n        }\n    }\n\n    get(params);\n}\n\nvoid EQSLQSLDownloader::getQSLImage(const QSqlRecord &qso)\n{\n    FCT_IDENTIFICATION;\n\n    QString inCacheFilename;\n\n    if ( isQSLImageInCache(qso, inCacheFilename) )\n    {\n        emit QSLImageFound(inCacheFilename);\n        return;\n    }\n\n    /* QSL image is not in Cache */\n    qCDebug(runtime) << \"QSL is not in Cache\";\n\n    const QString &username = getUsername();\n    const QString &password = getPasswd();\n    const QDateTime &time_start = qso.value(\"start_time\").toDateTime().toTimeZone(QTimeZone::utc());\n\n    QUrlQuery query;\n\n    query.addQueryItem(\"UserName\", username.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"Password\", password.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"CallsignFrom\", qso.value(\"callsign\").toString());\n    query.addQueryItem(\"QSOYear\", time_start.toString(\"yyyy\"));\n    query.addQueryItem(\"QSOMonth\", time_start.toString(\"MM\"));\n    query.addQueryItem(\"QSODay\", time_start.toString(\"dd\"));\n    query.addQueryItem(\"QSOHour\", time_start.toString(\"hh\"));\n    query.addQueryItem(\"QSOMinute\", time_start.toString(\"mm\"));\n    query.addQueryItem(\"QSOBand\", qso.value(\"band\").toString());\n    query.addQueryItem(\"QSOMode\", qso.value(\"mode\").toString());\n\n    QUrl url(QSL_IMAGE_FILENAME_PAGE);\n    url.setQuery(query);\n\n    qCDebug(runtime) << Data::safeQueryString(query);\n\n    if ( currentReply )\n    {\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n    }\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n    currentReply->setProperty(\"messageType\", QVariant(\"getQSLImageFileName\"));\n    currentReply->setProperty(\"onDiskFilename\", QVariant(inCacheFilename));\n    currentReply->setProperty(\"QSORecordID\", QVariant(qso.value(\"id\")));\n}\n\nvoid EQSLQSLDownloader::abortDownload()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n\nvoid EQSLQSLDownloader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"eQSL error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"eQSL error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit receiveQSLFailed(reply->errorString());\n            emit QSLImageError(reply->errorString());\n            reply->deleteLater();\n        }\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    /*******************/\n    /* getADIFFileName */\n    /*******************/\n    if ( messageType == \"getADIFFileName\" )\n    {\n        //getting the first page where a ADIF filename is present\n        QString replyString(reply->readAll());\n\n        qCDebug(runtime) << replyString;\n\n        if ( replyString.contains(\"No such Username/Password found\")\n             || replyString.contains(\"No such Callsign found\") )\n        {\n            qCDebug(runtime) << \"Incorrect Password or QTHProfile Id\";\n            emit receiveQSLFailed(tr(\"Incorrect Password or QTHProfile Id\"));\n        }\n        else\n        {\n            static QRegularExpression re(\"/downloadedfiles/(.*.adi)\\\">.ADI file\");\n            QRegularExpressionMatch match = re.match(replyString);\n\n            if ( match.hasMatch() )\n            {\n                const QString &filename = match.captured(1);\n                downloadADIF(filename);\n            }\n            else if ( replyString.contains(\"You have no log entries\"))\n            {\n                emit receiveQSLComplete(QSLMergeStat());\n            }\n            else\n            {\n                qCInfo(runtime) << \"File not found in HTTP reply \";\n                emit receiveQSLFailed(tr(\"ADIF file not found in eQSL response\"));\n            }\n        }\n    }\n    /***********************/\n    /* getQSLImageFileName */\n    /***********************/\n    else if ( messageType == \"getQSLImageFileName\" )\n    {\n        //getting the first page where an Image filename is present\n\n        QString replyString(reply->readAll());\n\n        qCDebug(runtime) << replyString;\n\n        if ( replyString.contains(\"No such Username/Password found\") )\n            emit QSLImageError(tr(\"Incorrect Username or password\"));\n        else\n        {\n            static QRegularExpression re(\"<img src=\\\"(.*)\\\" alt\");\n            QRegularExpressionMatch match = re.match(replyString);\n\n            if ( match.hasMatch() )\n            {\n                QString filename = match.captured(1);\n                QString onDiskFilename = reply->property(\"onDiskFilename\").toString();\n                qulonglong qsoid = reply->property(\"QSORecordID\").toULongLong();\n                downloadImage(filename, onDiskFilename, qsoid);\n            }\n            else\n            {\n                static QRegularExpression rError(\"Error: (.*)\");\n                QRegularExpressionMatch matchError = rError.match(replyString);\n\n                if (matchError.hasMatch() )\n                {\n                    QString msg = matchError.captured(1);\n                    emit QSLImageError(msg);\n                }\n                else\n                {\n                    static QRegularExpression rWarning(\"Warning: (.*) --\");\n                    QRegularExpressionMatch matchWarning = rWarning.match(replyString);\n\n                    if ( matchWarning.hasMatch() )\n                    {\n                        QString msg = matchWarning.captured(1);\n                        emit QSLImageError(msg);\n                    }\n                    else\n                    {\n                        qCInfo(runtime) << replyString;\n                        emit QSLImageError(tr(\"Unknown Error\"));\n                    }\n\n                }\n            }\n        }\n    }\n    /***********/\n    /* getADIF */\n    /***********/\n    else if ( messageType == \"getADIF\")\n    {\n        qint64 size = reply->size();\n        qCDebug(runtime) << \"Reply size: \" << size;\n\n        /* Currently, QT returns an incorrect stream position value in Network stream\n         * when the stream is used in QTextStream. Therefore\n         * QLog downloads a response, saves it to a temp file and opens\n         * the file as a stream */\n        QTemporaryFile tempFile;\n\n        if ( ! tempFile.open() )\n        {\n            qCDebug(runtime) << \"Cannot open temp file\";\n            emit receiveQSLFailed(tr(\"Cannot opet temporary file\"));\n            reply->deleteLater();\n            return;\n        }\n\n        const QByteArray &data = reply->readAll();\n\n        tempFile.write(data);\n        tempFile.flush();\n        tempFile.seek(0);\n\n        emit receiveQSLStarted();\n\n        /* see above why QLog uses a temp file */\n        QTextStream stream(&tempFile);\n        AdiFormat adi(stream);\n\n        connect(&adi, &AdiFormat::importPosition, this, [this, size](qint64 position)\n        {\n            if ( size > 0 )\n            {\n                double progress = position * 100.0 / size;\n                emit receiveQSLProgress(static_cast<qulonglong>(progress));\n            }\n        });\n\n        connect(&adi, &AdiFormat::QSLMergeFinished, this, [this](QSLMergeStat stats)\n        {\n            emit receiveQSLComplete(stats);\n        });\n\n        adi.runQSLImport(adi.EQSL);\n\n        tempFile.close();\n    }\n    /********************/\n    /* downloadQSLImage */\n    /********************/\n    else if ( messageType == \"downloadQSLImage\")\n    {\n        qint64 size = reply->size();\n        qCDebug(runtime) << \"Reply size: \" << size;\n\n        const QByteArray &data = reply->readAll();\n\n        const QString &onDiskFilename = reply->property(\"onDiskFilename\").toString();\n        qulonglong qsoID = reply->property(\"QSORecordID\").toULongLong();\n\n        QFile file(onDiskFilename);\n        if ( !file.open(QIODevice::WriteOnly))\n        {\n            emit QSLImageError(tr(\"Cannot save the image to file\") + \" \" + onDiskFilename);\n\n            return;\n        }\n        file.write(data);\n        file.flush();\n        file.close();\n        if ( !qslStorage->add(QSLObject(qsoID, QSLObject::EQSL,\n                                        QFileInfo(onDiskFilename).fileName(), data,\n                                        QSLObject::RAWBYTES)) )\n        {\n            qWarning() << \"Cannot save the eQSL image to database cache\";\n            // ??? database is only a cache for images. not needed to inform operator about this ????\n        }\n        emit QSLImageFound(onDiskFilename);\n    }\n\n    reply->deleteLater();\n}\n\nvoid EQSLQSLDownloader::get(const QList<QPair<QString, QString>> &params)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &username = getUsername();\n    const QString &password = getPasswd();\n\n    QUrlQuery query;\n    query.setQueryItems(params);\n    query.addQueryItem(\"UserName\", username.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"Password\", password.toUtf8().toPercentEncoding());\n\n    QUrl url(DOWNLOAD_1ST_PAGE);\n    url.setQuery(query);\n\n    qCDebug(runtime) << Data::safeQueryString(query);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n    currentReply->setProperty(\"messageType\", QVariant(\"getADIFFileName\"));\n}\n\nvoid EQSLQSLDownloader::downloadADIF(const QString &filename)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filename;\n\n    QUrlQuery query;\n    QUrl url(DOWNLOAD_2ND_PAGE + filename);\n    url.setQuery(query);\n\n    qCDebug(runtime) << url.toString();\n\n    if ( currentReply )\n    {\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n    }\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n    currentReply->setProperty(\"messageType\", QVariant(\"getADIF\"));\n}\n\nvoid EQSLQSLDownloader::downloadImage(const QString &URLFilename,\n                         const QString &onDiskFilename,\n                         const qulonglong qsoid)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << URLFilename << onDiskFilename << qsoid;\n\n    QUrlQuery query;\n    QUrl url(QSL_IMAGE_DOWNLOAD_PAGE + URLFilename);\n    url.setQuery(query);\n\n    qCDebug(runtime) << url.toString();\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n    currentReply->setProperty(\"messageType\", QVariant(\"downloadQSLImage\"));\n    currentReply->setProperty(\"onDiskFilename\", QVariant(onDiskFilename));\n    currentReply->setProperty(\"QSORecordID\", qsoid);\n}\n\nQString EQSLQSLDownloader::QSLImageFilename(const QSqlRecord &qso)\n{\n    FCT_IDENTIFICATION;\n\n    /* QSL Fileformat YYYYMMDD_ID_Call_eqsl.jpg */\n\n    const QDateTime &time_start = qso.value(\"start_time\").toDateTime().toTimeZone(QTimeZone::utc());\n\n    const QString &ret = QString(\"%1_%2_%3_eqsl.jpg\").arg(time_start.toString(\"yyyyMMdd\"),\n                                                   qso.value(\"id\").toString(),\n                                                   qso.value(\"callsign\").toString().replace(QRegularExpression(QString::fromUtf8(\"[-`~!@#$%^&*()_—+=|:;<>«»,.?/{}\\'\\\"]\")),\"_\"));\n    qCDebug(runtime) << \"EQSL Image Filename: \" << ret;\n    return ret;\n}\n\nbool EQSLQSLDownloader::isQSLImageInCache(const QSqlRecord &qso, QString &fullPath)\n{\n    FCT_IDENTIFICATION;\n\n    bool isFileExists = false;\n\n    const QString &expectingFilename = QSLImageFilename(qso);\n    const QSLObject &eqsl = qslStorage->getQSL(qso, QSLObject::EQSL, expectingFilename);\n    QFile f(tempDir.path() + QDir::separator() + eqsl.getQSLName());\n    qCDebug(runtime) << \"Using temp file\" << f.fileName();\n    fullPath = f.fileName();\n\n    if ( eqsl.getBLOB() != QByteArray()\n         && f.open(QFile::WriteOnly) )\n    {\n        f.write(eqsl.getBLOB());\n        f.flush();\n        f.close();\n        isFileExists = true;\n    }\n\n    qCDebug(runtime) << isFileExists << \" \" << fullPath;\n\n    return isFileExists;\n}\n"
  },
  {
    "path": "service/eqsl/Eqsl.h",
    "content": "#ifndef QLOG_SERVICE_EQSL_EQSL_H\n#define QLOG_SERVICE_EQSL_EQSL_H\n\n#include <QObject>\n#include <logformat/LogFormat.h>\n\n#include \"core/QSLStorage.h\"\n#include \"service/GenericQSOUploader.h\"\n#include \"service/GenericQSLDownloader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkAccessManager;\nclass QNetworkReply;\n\nclass EQSLBase : public SecureServiceBase<EQSLBase>\n{\nprotected:\n    static const QString SECURE_STORAGE_KEY;\n\npublic:\n    explicit EQSLBase() {};\n    virtual ~EQSLBase() {};\n\n    DECLARE_SECURE_SERVICE(EQSLBase);\n\n    static const QString getUsername();\n    static const QString getPasswd();\n    static void saveUsernamePassword(const QString&, const QString&);\n};\n\nclass EQSLUploader : public GenericQSOUploader, private EQSLBase\n{\n    Q_OBJECT\npublic:\n    static QStringList uploadedFields;\n    static QVariantMap generateUploadConfigMap(const QString qthProfile, bool disableQSLMSG, bool commentAsQSLMSG)\n    {\n        return QVariantMap({{\"qthprofile\", qthProfile},\n                            {\"disableqslmsg\", disableQSLMSG},\n                            {\"commentasqslmsg\", commentAsQSLMSG}});\n    }\n\n    explicit EQSLUploader(QObject *parent = nullptr);\n    virtual ~EQSLUploader();\n\n    void uploadAdif(const QByteArray&);\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n\npublic slots:\n    virtual void abortRequest() override;\n\nprotected:\n    virtual const QSqlRecord stripRecord(const QSqlRecord &record) override;\n\nprivate:\n    const QString UPLOAD_ADIF_PAGE = \"https://www.eQSL.cc/qslcard/ImportADIF.cfm\";\n    QNetworkReply *currentReply;\n    bool commentAsQSLMSG;\n    bool disableqslmsg;\n    virtual void processReply(QNetworkReply*) override;\n};\n\nclass EQSLQSLDownloader : public GenericQSLDownloader, private EQSLBase\n{\n    Q_OBJECT\n\npublic:\n    explicit EQSLQSLDownloader(QObject *parent = nullptr);\n    virtual ~EQSLQSLDownloader();\n\n    virtual void receiveQSL(const QDate &, bool, const QString &) override;\n    void getQSLImage(const QSqlRecord&);\n\nsignals:\n    void QSLImageFound(QString);\n    void QSLImageError(QString);\n\npublic slots:\n    virtual void abortDownload() override;\n\nprivate:\n    QNetworkReply *currentReply;\n    QSLStorage *qslStorage;\n    const QString DOWNLOAD_1ST_PAGE = \"https://www.eQSL.cc/qslcard/DownloadInBox.cfm\";\n    const QString DOWNLOAD_2ND_PAGE = \"https://www.eQSL.cc/downloadedfiles/\";\n    const QString QSL_IMAGE_FILENAME_PAGE = \"https://www.eQSL.cc/qslcard/GeteQSL.cfm\";\n    const QString QSL_IMAGE_DOWNLOAD_PAGE = \"https://www.eQSL.cc\";\n\n    virtual void processReply(QNetworkReply* reply) override;\n    void get(const QList<QPair<QString, QString> > &);\n    void downloadADIF(const QString &);\n    void downloadImage(const QString &, const QString &, const qulonglong);\n    QString QSLImageFilename(const QSqlRecord &);\n    bool isQSLImageInCache(const QSqlRecord &, QString &);\n};\n\n#endif // QLOG_SERVICE_EQSL_EQSL_H\n"
  },
  {
    "path": "service/hamqth/HamQTH.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QtXml>\n#include <QDebug>\n#include \"HamQTH.h\"\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.hamqth\");\n\nconst QString HamQTHBase::SECURE_STORAGE_KEY = \"HamQTH\";\nconst QString HamQTHCallbook::CALLBOOK_NAME = \"hamqth\";\nREGISTRATION_SECURE_SERVICE(HamQTHBase);\n\nconst QString HamQTHBase::getUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getHamQTHCallbookUsername();\n}\n\nconst QString HamQTHBase::getPasswd()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(HamQTHBase::SECURE_STORAGE_KEY, getUsername());\n}\n\nvoid HamQTHBase::saveUsernamePassword(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    QString oldUsername = getUsername();\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(HamQTHBase::SECURE_STORAGE_KEY, oldUsername);\n    }\n\n    LogParam::setHamQTHCallbookUsername(newUsername);\n\n    savePassword(HamQTHBase::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nvoid HamQTHBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getUsername(); } }\n        };\n    });\n}\n\nHamQTHCallbook::HamQTHCallbook(QObject* parent) :\n    GenericCallbook(parent),\n    HamQTHBase(),\n    currentReply(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    incorrectLogin = false;\n}\n\nHamQTHCallbook::~HamQTHCallbook()\n{\n    if ( currentReply ) currentReply->abort();\n}\n\nQString HamQTHCallbook::getDisplayName()\n{\n    FCT_IDENTIFICATION;\n    return QString(tr(\"HamQTH\"));\n}\n\nvoid HamQTHCallbook::queryCallsign(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< callsign;\n\n    if (sessionId.isEmpty())\n    {\n        queuedCallsign = callsign;\n        authenticate();\n        return;\n    }\n\n    QUrlQuery query;\n    query.addQueryItem(\"id\", sessionId);\n    query.addQueryItem(\"callsign\", callsign);\n    query.addQueryItem(\"prg\", \"QLog\");\n\n    QUrl url(API_URL);\n    url.setQuery(query);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n    currentReply->setProperty(\"queryCallsign\", callsign);\n\n    // Attention, variable callsign and queuedCallsign point to the same object\n    // queuedCallsign must be cleared after the last use of the callsign variable\n    queuedCallsign = QString();\n}\n\nvoid HamQTHCallbook::abortQuery()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        //currentReply->deleteLater(); // pointer is deleted later in processReply\n        currentReply = nullptr;\n    }\n}\n\nvoid HamQTHCallbook::authenticate()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &username = getUsername();\n    const QString &password = getPasswd();\n\n    if ( incorrectLogin && password == lastSeenPassword)\n    {\n        /* User already knows that login failed */\n        emit callsignNotFound(queuedCallsign);\n        queuedCallsign = QString();\n        return;\n    }\n\n    if (!username.isEmpty() && !password.isEmpty())\n    {\n        QUrlQuery query;\n        query.addQueryItem(\"u\", username.toUtf8().toPercentEncoding());\n        query.addQueryItem(\"p\", password.toUtf8().toPercentEncoding());\n\n        QUrl url(API_URL);\n        url.setQuery(query);\n\n        if ( currentReply )\n            qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n        currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n        lastSeenPassword = password;\n        qCDebug(runtime) << \"Sent Auth message\";\n    }\n    else\n    {\n        emit callsignNotFound(queuedCallsign);\n        qCDebug(runtime) << \"Empty username or password\";\n    }\n}\n\nvoid HamQTHCallbook::processReply(QNetworkReply* reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"HamQTH error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        emit lookupError(reply->errorString());\n        reply->deleteLater();\n        return;\n    }\n\n    const QByteArray &response = reply->readAll();\n    qCDebug(runtime) << response;\n    QXmlStreamReader xml(response);\n    CallbookResponseData resposeData;\n\n    while (!xml.atEnd() && !xml.hasError())\n    {\n        QXmlStreamReader::TokenType token = xml.readNext();\n\n        if (token != QXmlStreamReader::StartElement)\n            continue;\n\n        const QString &elementName = xml.name().toString();\n\n        if ( elementName == \"error\" )\n        {\n            queuedCallsign = QString();\n            QString errorString = xml.readElementText();\n\n            if ( errorString == \"Wrong user name or password\" )\n            {\n                incorrectLogin = true;\n                emit loginFailed();\n            }\n            else if ( errorString == \"Callsign not found\" )\n            {\n                incorrectLogin = false;\n                emit callsignNotFound(reply->property(\"queryCallsign\").toString());\n                return;\n            }\n            else\n                qWarning() << \"HamQTH Error - \" << errorString;\n\n            sessionId = QString();\n            emit lookupError(errorString);\n            return;\n        }\n        else\n            incorrectLogin = false;\n\n        if      (elementName == \"session_id\")  sessionId = xml.readElementText();\n        else if (elementName == \"callsign\")    resposeData.call = decodeHtmlEntities(xml.readElementText().toUpper());\n        else if (elementName == \"nick\")        resposeData.nick = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"qth\")         resposeData.qth = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"grid\")        resposeData.gridsquare = decodeHtmlEntities(xml.readElementText().toUpper());\n        else if (elementName == \"qsl_via\")     resposeData.qsl_via = decodeHtmlEntities(xml.readElementText().toUpper());\n        else if (elementName == \"cq\")          resposeData.cqz = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"itu\")         resposeData.ituz = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"dok\")         resposeData.dok = decodeHtmlEntities(xml.readElementText().toUpper());\n        else if (elementName == \"iota\")        resposeData.iota = decodeHtmlEntities(xml.readElementText().toUpper());\n        else if (elementName == \"email\")       resposeData.email = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"adif\")        resposeData.dxcc = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"adr_name\")    resposeData.name_fmt = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"adr_street1\") resposeData.addr1 = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"us_state\")    resposeData.us_state = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"adr_zip\")     resposeData.zipcode = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"country\")     resposeData.country = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"latitude\")    resposeData.latitude = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"longitude\")   resposeData.longitude = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"county\")      resposeData.county = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"lic_year\")    resposeData.lic_year = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"utc_offset\")  resposeData.utc_offset = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"eqsl\")        resposeData.eqsl = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"qsl\")         resposeData.pqsl = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"birth_year\")  resposeData.born = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"lotw\")        resposeData.lotw = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"web\")         resposeData.url = decodeHtmlEntities(xml.readElementText());\n        else if (elementName == \"picture\")     resposeData.image_url = decodeHtmlEntities(xml.readElementText());\n\n        // HamQTH sends \"http\" URLs, which are redirected automatically\n        // to their \"https\" variants. It's pointless to implement redirection\n        // so let's replace http with https\n        if ( !resposeData.image_url.contains(\"https\")) resposeData.image_url.replace(\"http\", \"https\");\n    }\n\n    reply->deleteLater();\n\n    if ( !resposeData.call.isEmpty() )\n        emit callsignResult(resposeData);\n\n    if (!queuedCallsign.isEmpty())\n        queryCallsign(queuedCallsign);\n}\n"
  },
  {
    "path": "service/hamqth/HamQTH.h",
    "content": "#ifndef QLOG_SERVICE_HAMQTH_HAMQTH_H\n#define QLOG_SERVICE_HAMQTH_HAMQTH_H\n\n#include <QObject>\n#include <QString>\n#include \"service/GenericCallbook.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkAccessManager;\nclass QNetworkReply;\n\nclass HamQTHBase : public SecureServiceBase<HamQTHBase>\n{\nprotected:\n    const static QString SECURE_STORAGE_KEY;\n\npublic:\n    explicit HamQTHBase() {};\n    virtual ~HamQTHBase() {};\n\n    DECLARE_SECURE_SERVICE(HamQTHBase);\n\n    static const QString getUsername();\n    static const QString getPasswd();\n    static void saveUsernamePassword(const QString&, const QString&);\n};\n\nclass HamQTHCallbook : public GenericCallbook, private HamQTHBase\n{\n    Q_OBJECT\n\npublic:\n    const static QString CALLBOOK_NAME;\n\n    explicit HamQTHCallbook(QObject *parent = nullptr);\n    virtual ~HamQTHCallbook();\n\n    QString getDisplayName() override;\n\npublic slots:\n    virtual void queryCallsign(const QString &callsign) override;\n    virtual void abortQuery() override;\n\nprotected:\n    void processReply(QNetworkReply* reply) override;\n\nprivate:\n    const QString API_URL = \"https://www.hamqth.com/xml.php\";\n    QString sessionId;\n    QString queuedCallsign;\n    bool incorrectLogin;\n    QString lastSeenPassword;\n    QNetworkReply *currentReply;\n\n    void authenticate();\n};\n\n#endif // QLOG_SERVICE_HAMQTH_HAMQTH_H\n"
  },
  {
    "path": "service/hrdlog/HRDLog.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QDomDocument>\n\n#include \"HRDLog.h\"\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"rig/macros.h\"\n#include \"core/LogParam.h\"\n#include \"data/Data.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.hrdlog\");\n\nconst QString HRDLogBase::SECURE_STORAGE_KEY = \"HRDLog\";\nREGISTRATION_SECURE_SERVICE(HRDLogBase);\n\n// http://www.iw1qlh.net/projects/hrdlog/HRDLognet_4.pdf\n\nQStringList HRDLogUploader::uploadedFields =\n{\n    \"start_time\",\n    \"freq\",\n    \"band\",\n    \"callsign\",\n    \"mode\",\n    \"submode\",\n    \"rst_rcvd\",\n    \"rst_sent\",\n    \"qsl_sent\",\n    \"qsl_rcvd\",\n    \"qsl_via\",\n    \"eqsl_qslrdate\",\n    \"eqsl_qsl_rcvd\",\n    \"eqsl_qslsdate\",\n    \"eqsl_qsl_sent\",\n    \"lotw_qsl_rcvd\",\n    \"lotw_qslrdate\",\n    \"lotw_qsl_sent\",\n    \"lotw_qslsdate\",\n    \"gridsquare\",\n    \"dxcc\",\n    \"qslmsg\",\n    \"comment\",\n    \"distance\",\n    \"operator\",\n    \"sat_mode\",\n    \"sat_name\",\n    \"prop_mode\"\n};\n\nconst QString HRDLogBase::getRegisteredCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getHRDLogLogbookReqCallsign();\n}\n\nconst QString HRDLogBase::getUploadCode()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(HRDLogBase::SECURE_STORAGE_KEY,\n                       getRegisteredCallsign());\n}\n\nvoid HRDLogBase::saveUploadCode(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    QString oldUsername = getRegisteredCallsign();\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(HRDLogBase::SECURE_STORAGE_KEY,\n                       oldUsername);\n    }\n\n    LogParam::setHRDLogLogbookReqCallsign(newUsername);\n\n    savePassword(HRDLogBase::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nbool HRDLogBase::getOnAirEnabled()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getHRDLogOnAir();\n}\n\nvoid HRDLogBase::saveOnAirEnabled(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setHRDLogOnAir(state);\n}\n\nvoid HRDLogBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getRegisteredCallsign(); } }\n        };\n    });\n}\n\n// http://www.iw1qlh.net/projects/hrdlog/HRDLognet_4.pdf\n// It is not clear what QLog should send to HRDLog. Therefore it will\n// send all ADIF-fields\n\nHRDLogUploader::HRDLogUploader(QObject *parent)\n    : GenericQSOUploader(uploadedFields, parent),\n      HRDLogBase(),\n      currentReply(nullptr),\n      cancelUpload(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nHRDLogUploader::~HRDLogUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n\nvoid HRDLogUploader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    cancelUpload = true;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        //currentReply->deleteLater(); // pointer is deleted later in processReply\n        currentReply = nullptr;\n    }\n}\n\nvoid HRDLogUploader::uploadAdif(const QByteArray &data,\n                                const QVariant &contactID,\n                                bool update)\n{\n    FCT_IDENTIFICATION;\n\n    QUrlQuery params;\n    params.addQueryItem(\"Callsign\", getRegisteredCallsign().toUtf8().toPercentEncoding());\n    params.addQueryItem(\"Code\", getUploadCode().toUtf8().toPercentEncoding());\n    params.addQueryItem(\"App\", \"QLog\");\n    params.addQueryItem(\"ADIFData\", data.trimmed().toPercentEncoding());\n\n    if ( update )\n    {\n        params.addQueryItem(\"ADIFKey\", data.trimmed().toPercentEncoding());\n        params.addQueryItem(\"Cmd\", \"UPDATE\");\n    }\n\n    QUrl url(API_LOG_UPLOAD_URL);\n    QNetworkRequest request(url);\n\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n\n    qCDebug(runtime) << Data::safeQueryString(params);\n\n    if ( currentReply )\n    {\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n    }\n\n    currentReply = getNetworkAccessManager()->post(request, params.query(QUrl::FullyEncoded).toUtf8());\n    currentReply->setProperty(\"messageType\", \"uploadQSO\");\n    currentReply->setProperty(\"ADIFData\", data);\n    currentReply->setProperty(\"contactID\", contactID);\n}\n\nvoid HRDLogUploader::uploadContact(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray data = generateADIF({record});\n    cancelUpload = false;\n    uploadAdif(data.trimmed(),\n               record.value(\"id\"),\n               (record.value(\"hrdlog_qso_upload_status\").toString() == \"M\"));\n}\n\nvoid HRDLogUploader::uploadQSOList(const QList<QSqlRecord> &qsos, const QVariantMap &)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n\n    if ( qsos.isEmpty() )\n    {\n        /* Nothing to do */\n        emit uploadFinished();\n        return;\n    }\n\n    cancelUpload = false;\n    queuedContacts4Upload = qsos;\n\n    uploadContact(queuedContacts4Upload.first());\n    queuedContacts4Upload.removeFirst();\n}\n\nvoid HRDLogUploader::sendOnAir(double freq, const QString &mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq << mode;\n\n    QUrlQuery params;\n\n    params.addQueryItem(\"Callsign\", getRegisteredCallsign().toUtf8().toPercentEncoding());\n    params.addQueryItem(\"Code\", getUploadCode().toUtf8().toPercentEncoding());\n    params.addQueryItem(\"App\", \"QLog\");\n    params.addQueryItem(\"Frequency\", QString::number(static_cast<unsigned long long>(MHz(freq))));\n    params.addQueryItem(\"Mode\", mode);\n    params.addQueryItem(\"Radio\", \" \");\n\n    QUrl url(API_ONAIR_URL);\n    QNetworkRequest request(url);\n\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n\n    qCDebug(runtime) << Data::safeQueryString(params);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->post(request, params.query(QUrl::FullyEncoded).toUtf8());\n    currentReply->setProperty(\"messageType\", QVariant(\"onAir\"));\n}\n\nvoid HRDLogUploader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"HDRLog.com error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"HDRLog.com error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit uploadError(reply->errorString());\n            reply->deleteLater();\n        }\n        cancelUpload = true;\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    const QByteArray &response = reply->readAll();\n    qCDebug(runtime) << response;\n\n    /*************/\n    /* uploadQSO */\n    /*************/\n    if ( messageType == \"uploadQSO\" )\n    {\n        QDomDocument doc;\n\n        if ( !doc.setContent(response) )\n        {\n            qWarning() << \"Failed to parse XML document from HRDLog\";\n            emit uploadError(tr(\"Response message malformed\"));\n            cancelUpload = true;\n        }\n        else\n        {\n            QDomElement root = doc.documentElement();\n            QDomNodeList errorNodes = root.elementsByTagName(\"error\");\n\n            if ( !errorNodes.isEmpty() )\n            {\n                QDomElement errorElement = errorNodes.at(0).toElement();\n                QString errorText = errorElement.text();\n                qCDebug(runtime) << \"XML contains an error element:\" << errorText;\n                if ( errorText.contains(\"Unable to find QSO\") )\n                {\n                    // Try to resend it without UPDATE Flag\n                    uploadAdif(reply->property(\"ADIFData\").toByteArray(),\n                               reply->property(\"contactID\"));\n                }\n                else\n                {\n                    emit uploadError(errorText);\n                    cancelUpload = true;\n                }\n            }\n            else\n            {\n                qCDebug(runtime) << \"Confirmed Upload for QSO Id \" << reply->property(\"contactID\").toInt();\n                emit uploadedQSO(reply->property(\"contactID\").toULongLong());\n\n                if ( queuedContacts4Upload.isEmpty() )\n                {\n                    cancelUpload = false;\n                    emit uploadFinished();\n                }\n                else if ( ! cancelUpload )\n                {\n                    uploadContact(queuedContacts4Upload.first());\n                    queuedContacts4Upload.removeFirst();\n                }\n            }\n        }\n    }\n    else if ( messageType == \"onAir\" )\n    {\n        // Do no handle onAir response - error handling is unclear from spec\n    }\n\n    reply->deleteLater();\n}\n\n"
  },
  {
    "path": "service/hrdlog/HRDLog.h",
    "content": "#ifndef QLOG_SERVICE_HRDLOG_HRDLOG_H\n#define QLOG_SERVICE_HRDLOG_HRDLOG_H\n\n#include <QObject>\n#include <QSqlRecord>\n#include \"service/GenericQSOUploader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkReply;\nclass QNetworkAccessManager;\n\n\nclass HRDLogBase : public SecureServiceBase<HRDLogBase>\n{\nprotected:\n    const static QString SECURE_STORAGE_KEY;\n\npublic:\n    explicit HRDLogBase() {};\n    virtual ~HRDLogBase() {};\n\n    DECLARE_SECURE_SERVICE(HRDLogBase);\n\n    static const QString getRegisteredCallsign();\n    static const QString getUploadCode();\n    static bool getOnAirEnabled();\n    static void saveUploadCode(const QString &newUsername, const QString &newPassword);\n    static void saveOnAirEnabled(bool state);\n};\n\nclass HRDLogUploader : public GenericQSOUploader, private HRDLogBase\n{\n    Q_OBJECT\n\npublic:\n    static QStringList uploadedFields;\n\n    explicit HRDLogUploader(QObject *parent = nullptr);\n    virtual ~HRDLogUploader();\n\n    void uploadAdif(const QByteArray &data,\n                    const QVariant &contactID,\n                    bool update = false);\n    void uploadContact(const QSqlRecord &record);\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n    void sendOnAir(double freq, const QString &mode);\n\npublic slots:\n    virtual void abortRequest() override;\n\nprotected:\n    virtual void processReply(QNetworkReply* reply) override;\n\nprivate:\n    QNetworkReply *currentReply;\n    QList<QSqlRecord> queuedContacts4Upload;\n    bool cancelUpload;\n\n    const QString API_LOG_UPLOAD_URL = \"https://robot.hrdlog.net/NewEntry.aspx\";\n    const QString API_ONAIR_URL = \"https://robot.hrdlog.net/OnAir.aspx\";\n};\n\n#endif // QLOG_SERVICE_HRDLOG_HRDLOG_H\n"
  },
  {
    "path": "service/kstchat/KSTChat.cpp",
    "content": "#include <QRegularExpression>\n#include <QTimer>\n#include <QSqlQuery>\n#include <QSqlError>\n#ifdef Q_OS_WIN\n#include <Ws2tcpip.h>\n#include <winsock2.h>\n#include <Mstcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#endif\n\n#include \"KSTChat.h\"\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"data/StationProfile.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.kstchat\");\n\nREGISTRATION_SECURE_SERVICE(KSTChat);\n\nKSTChat::KSTChat(int chatRoomIndex,\n                 const QString &username,\n                 const QString &password,\n                 const NewContactWidget *contact,\n                 QObject *parent)\n    : QObject{parent},\n      chatRoomIdx(chatRoomIndex),\n      userName(username),\n      password(password),\n      socket(nullptr),\n      currCommand(NO_CMD),\n      contact(contact)\n{\n    FCT_IDENTIFICATION;\n\n#if 0 // Only for debug. It generate a testing message.\n    QTimer *timer = new QTimer(this);\n    connect(timer, &QTimer::timeout, this, [this]() {\n        KSTChatMsg msg;\n        msg.time = QDateTime::currentDateTimeUtc().toString(\"hhmm\");\n        msg.sender = \"OK1MLF\";\n        msg.message = \"Toto je pokusna zprava pro vsechny\";\n        msg.grid = Gridsquare(\"JN79HK\");\n        emit chatMsg(msg);\n    });\n    timer->start(5000);\n#endif\n}\n\nKSTChat::~KSTChat()\n{\n    FCT_IDENTIFICATION;\n\n    disconnectChat();\n}\n\nQList<KSTUsersInfo> KSTChat::getUsersList() const\n{\n    FCT_IDENTIFICATION;\n\n    return userList;\n}\n\nKSTUsersInfo KSTChat::getUserInfo(const QString &username) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << username;\n\n    for ( const KSTUsersInfo &info : static_cast<const QList<KSTUsersInfo>&>(userList) )\n    {\n        if ( info.callsign == username )\n            return info;\n    }\n    return KSTUsersInfo();\n}\n\nconst QString KSTChat::getUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getKSTChatUsername();\n}\n\nconst QString KSTChat::getPasswd()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(KSTChat::SECURE_STORAGE_KEY, getUsername());\n}\n\nvoid KSTChat::saveUsernamePassword(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &oldUsername = getUsername();\n\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(KSTChat::SECURE_STORAGE_KEY, oldUsername);\n    }\n    LogParam::setKSTChatUsername(newUsername);\n    savePassword(KSTChat::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nvoid KSTChat::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getUsername(); } }\n        };\n    });\n}\n\nvoid KSTChat::connectChat()\n{\n    FCT_IDENTIFICATION;\n\n    socket = new QTcpSocket(this);\n\n    connect(socket, &QTcpSocket::readyRead, this, &KSTChat::receiveData);\n    connect(socket, &QTcpSocket::connected, this, &KSTChat::socketConnected);\n#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))\n    connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),\n            this, &KSTChat::socketError);\n#else\n    connect(socket, &QTcpSocket::errorOccurred, this, &KSTChat::socketError);\n#endif\n    socket->connectToHost(KST_HOSTNAME, KST_PORT);\n}\n\nvoid KSTChat::disconnectChat()\n{\n    FCT_IDENTIFICATION;\n\n    if ( socket )\n    {\n       socket->disconnect();\n       socket->close();\n\n       socket->deleteLater();\n       socket = nullptr;\n    }\n    currCommand = NO_CMD;\n    commandQueue.clear();\n    receiveBuffer.clear();\n    commandLineBuffer.clear();\n    emit chatDisconnected();\n}\n\nvoid KSTChat::sendMessage(const QString &msg)\n{\n    FCT_IDENTIFICATION;\n\n    if ( msg.length() == 0 )\n        return;\n\n    if ( msg.startsWith(\"/chat\",Qt::CaseInsensitive) )\n    {\n        emit chatError(\"Changing chat is not supported\");\n        return;\n    }\n\n    sendCommand(( msg.startsWith(\"/\") ) ? USER_CMD : NO_CMD, msg);\n}\n\nvoid KSTChat::reloadStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    sendSetGridCommand();\n}\n\nvoid KSTChat::resetDupe()\n{\n    FCT_IDENTIFICATION;\n\n    for ( KSTUsersInfo &user: userList )\n        user.dupeCount = 0;\n    emit usersListUpdated();\n}\n\nvoid KSTChat::recalculateDupe()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !contact )\n        return;\n\n    const QString &modeGroupString = BandPlan::modeToDXCCModeGroup(contact->getMode());\n\n    for ( KSTUsersInfo &user: userList )\n        user.dupeCount = Data::countDupe(user.callsign, contact->getBand(), modeGroupString);\n\n    emit usersListUpdated();\n}\n\nvoid KSTChat::recalculateDxccStatus()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !contact )\n        return;\n\n    const QString &currBand = contact->getBand();\n    const QString &modeGroupString = BandPlan::modeToDXCCModeGroup(contact->getMode());\n\n    for ( KSTUsersInfo &user: userList )\n        user.status = Data::instance()->dxccStatus(user.dxcc.dxcc, currBand, modeGroupString);\n\n    emit usersListUpdated();\n\n}\n\nvoid KSTChat::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !contact )\n        return;\n\n    qint32 dxcc = record.value(\"dxcc\").toInt();\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n    const QString &callsign = record.value(\"callsign\").toString();\n    const QString &currBand = contact->getBand();\n    const QString &modeGroupString = BandPlan::modeToDXCCModeGroup(contact->getMode());\n\n    for ( KSTUsersInfo &user: userList )\n    {\n        user.status = Data::dxccNewStatusWhenQSOAdded(user.status,\n                                                      user.dxcc.dxcc,\n                                                      currBand,\n                                                      modeGroupString,\n                                                      dxcc,\n                                                      currBand,\n                                                      dxccModeGroup);\n        if ( user.callsign == callsign )\n            user.dupeCount = Data::dupeNewCountWhenQSOAdded(user.dupeCount,\n                                                            currBand,\n                                                            modeGroupString,\n                                                            band,\n                                                            dxccModeGroup);\n    }\n    emit usersListUpdated();\n}\n\nvoid KSTChat::updateSpotsStatusWhenQSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !contact )\n        return;\n\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n    const QString &callsign = record.value(\"callsign\").toString();\n    const QString &currBand = contact->getBand();\n    const QString &modeGroupString = BandPlan::modeToDXCCModeGroup(contact->getMode());\n\n    for ( KSTUsersInfo &user: userList )\n    {\n        if ( user.dupeCount && user.callsign == callsign )\n            user.dupeCount = Data::dupeNewCountWhenQSODelected(user.dupeCount,\n                                                               currBand,\n                                                               modeGroupString,\n                                                               band,\n                                                               dxccModeGroup);\n    }\n\n}\n\nvoid KSTChat::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    FCT_IDENTIFICATION;\n\n    // this method is called at the end of QSO Delete (after commit).\n\n    if ( entities.isEmpty() || !contact)\n        return;\n\n    const QString &currBand = contact->getBand();\n    const QString &modeGroupString = BandPlan::modeToDXCCModeGroup(contact->getMode());\n\n    for ( KSTUsersInfo &user: userList )\n    {\n        if ( !entities.contains(user.dxcc.dxcc) )\n            continue;\n\n        user.status = Data::instance()->dxccStatus(user.dxcc.dxcc, currBand, modeGroupString);\n    }\n    emit usersListUpdated();\n}\n\nvoid KSTChat::sendShowUsersCommand()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(SHOW_USERS_CMD, \"/sh us\");\n}\n\nvoid KSTChat::sendCommand(const Command &cmd, const QString &msg)\n{\n    FCT_IDENTIFICATION;\n\n    if ( currCommand != NO_CMD )\n    {\n        qCDebug(runtime) << \"Storing: \" << msg;\n        commandQueue << QPair<Command, QString>(cmd, msg);\n        return;\n    }\n\n    currCommand = cmd;\n\n    if ( socket && socket->isOpen() )\n    {\n        QByteArray data;\n        data.append(msg.toLatin1());\n        data.append(\"\\r\\n\");\n        qCDebug(runtime) << \"Sending: \" << msg;\n        socket->write(data);\n    }\n}\n\nvoid KSTChat::sendSetGridCommand()\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    sendCommand(SET_GRID_CMD, \"/set qra \" + profile.locator);\n}\n\nQStringList KSTChat::joinLines(const QByteArray &data)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << data;\n\n    QByteArray fixedData(data);\n    QStringList retList;\n\n    fixedData.replace('\\0', \"\");\n    receiveBuffer.append(QString::fromUtf8(fixedData));\n    int index = receiveBuffer.indexOf(\"\\n\");\n\n    while ( index != -1 )\n    {\n        QString line = receiveBuffer.left(index + 1); //including \"\\n\" char\n        receiveBuffer = receiveBuffer.mid(index + 1);\n\n        retList.append(line.trimmed());\n        index = receiveBuffer.indexOf('\\n');\n    }\n    return retList;\n}\n\nvoid KSTChat::receiveData()\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression chatLineRE(\"([0-9]{4})Z (.*)>(.*)\");\n    QRegularExpressionMatch chatLineMatch;\n    QString chatName(chatRooms.at(chatRoomIdx-1));\n    QRegularExpression chatCMDEndRE(\"([0-9]{4})Z \" + userName.toUpper() + \" \" + QRegularExpression::escape(chatName) + \" chat>(.*)\");\n    QRegularExpressionMatch chatCMDEndMatch;\n\n    const QStringList &lines = joinLines(socket->readAll());\n\n    for (const QString &line : lines )\n    {\n        qCDebug(runtime) << \"Processing Line\" << line << \"CMD\" << currCommand;\n        // Skip empty lines\n        if ( line.length() == 0 )\n        {\n            continue;\n        }\n        else if ( line.startsWith(\"Login:\") )\n        {\n            sendMessage(userName);\n            return;\n        }\n        else if ( line.startsWith(\"Password:\") )\n        {\n            sendMessage(password);\n            return;\n        }\n        else if ( line.startsWith(\"Your choice           :\") )\n        {\n            sendCommand(LOGIN_CMD, QString::number(chatRoomIdx));\n            return;\n        }\n        else if ( line.startsWith(\"Unknown user\") )\n        {\n            emit chatError(tr(\"Unknown User\"));\n            disconnectChat();\n            return;\n        }\n        else if ( line.startsWith(\"Wrong password!\") )\n        {\n            emit chatError(tr(\"Invalid password\"));\n            disconnectChat();\n            return;\n        }\n        else\n        {\n            chatCMDEndMatch = chatCMDEndRE.match(line);\n\n            if ( chatCMDEndMatch.hasMatch() )\n            {\n                qCDebug(runtime) << \"CMD\" << currCommand << \" - End Detected\";\n\n                KSTChatMsg msg;\n                msg.time = QDateTime::currentDateTimeUtc().toString(\"hhmm\");\n                msg.sender = QString();\n\n                switch ( currCommand )\n                {\n                case LOGIN_CMD:\n                    emit chatConnected();\n                    msg.message = commandLineBuffer.join(\"\\n\");\n                    emit chatMsg(msg);\n                    sendSetGridCommand();\n                    sendShowUsersCommand();\n                    break;\n                case SET_GRID_CMD:\n                    msg.message = commandLineBuffer.join(\"\\n\");\n                    emit chatMsg(msg);\n                    break;\n                case SHOW_USERS_CMD:\n                    finalizeShowUsersCommand(commandLineBuffer);\n                    break;\n                case USER_CMD:\n                    msg.message = commandLineBuffer.join(\"\\n\");\n                    emit chatMsg(msg);\n                    break;\n                default:\n                {}\n                }\n                currCommand = NO_CMD;\n                commandLineBuffer.clear();\n                if ( !commandQueue.isEmpty() )\n                {\n                    QPair<Command, QString> cmd = commandQueue.takeFirst();\n                    sendCommand(cmd.first, cmd.second);\n                }\n            }\n            else\n            {\n                chatLineMatch = chatLineRE.match(line);\n                if ( chatLineMatch.hasMatch() )\n                {\n                    KSTChatMsg msg;\n                    msg.time = QDateTime::currentDateTimeUtc().toString(\"hhmm\");// own time to be better // chatLineMatch.captured(1);\n                    msg.sender = chatLineMatch.captured(2);\n                    msg.message = chatLineMatch.captured(3);\n                    msg.grid = getUserInfo(msg.sender).grid;\n                    emit chatMsg(msg);\n                }\n                else\n                {\n                    if ( currCommand != NO_CMD)\n                        commandLineBuffer.append(line);\n                }\n            }\n        }\n    }\n}\n\nvoid KSTChat::socketConnected()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !socket )\n    {\n        qWarning() << \"Socket is not opened\";\n        return;\n    }\n\n    int fd = socket->socketDescriptor();\n\n#ifdef Q_OS_WIN\n    DWORD  dwBytesRet = 0;\n\n    struct tcp_keepalive   alive;    // your options for \"keepalive\" mode\n    alive.onoff = TRUE;              // turn it on\n    alive.keepalivetime = 10000;     // delay (ms) between requests, here is 10s, default is 2h (7200000)\n    alive.keepaliveinterval = 5000;  // delay between \"emergency\" ping requests, their number (6) is not configurable\n      /* So with this config  socket will send keepalive requests every 30 seconds after last data transaction when everything is ok.\n          If there is no reply (wire plugged out) it'll send 6 requests with 5s delay  between them and then close.\n          As a result we will get disconnect after approximately 1 min timeout.\n       */\n    if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR) {\n           qWarning() << \"WSAIotcl(SIO_KEEPALIVE_VALS) failed with err#\" <<  WSAGetLastError();\n    }\n#else\n    int enableKeepAlive = 1;\n    int maxIdle = 10;\n    int count = 3;\n    int interval = 10;\n\n    if ( setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive)) !=0 )\n    {\n         qWarning() << \"Cannot set keepalive for DXC\";\n    }\n    else\n    {\n#ifndef Q_OS_MACOS\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle)) != 0 )\n#else\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &maxIdle, sizeof(maxIdle)) != 0 )\n#endif /* Q_OS_MACOS */\n        {\n            qWarning() << \"Cannot set keepalive idle for DXC\";\n        }\n\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &count, sizeof(count)) != 0 )\n        {\n            qWarning() << \"Cannot set keepalive counter for DXC\";\n        }\n\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(interval)) != 0 )\n        {\n            qWarning() << \"Cannot set keepalive interval for DXC\";\n        }\n\n        // TODO: setup TCP_USER_TIMEOUT????\n    }\n#endif\n    receiveBuffer.clear();\n    commandLineBuffer.clear();\n}\n\nvoid KSTChat::socketError(QAbstractSocket::SocketError socker_error)\n{\n    FCT_IDENTIFICATION;\n\n    QString error_msg;\n\n    qCDebug(runtime) << socker_error;\n\n    switch (socker_error)\n    {\n    case QAbstractSocket::ConnectionRefusedError:\n        error_msg.append(QObject::tr(\"Connection Refused\"));\n        break;\n    case QAbstractSocket::RemoteHostClosedError:\n        error_msg.append(QObject::tr(\"Host closed the connection\"));\n        disconnectChat();\n        //reconectRequested = true;\n        break;\n    case QAbstractSocket::HostNotFoundError:\n        error_msg.append(QObject::tr(\"Host not found\"));\n        break;\n    case QAbstractSocket::SocketTimeoutError:\n        error_msg.append(QObject::tr(\"Timeout\"));\n        disconnectChat();\n        //reconectRequested = true;\n        break;\n    case QAbstractSocket::NetworkError:\n        error_msg.append(QObject::tr(\"Network Error\"));\n        disconnectChat();\n        break;\n    default:\n        error_msg.append(QObject::tr(\"Internal Error\"));\n        disconnectChat();\n    }\n   emit chatError(error_msg);\n}\n\nvoid KSTChat::finalizeShowUsersCommand(const QStringList &buffer)\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression recordRE(\"^(\\\\S{3,})\\\\s{1,}(\\\\S+)\\\\s(.*)$\");\n\n    userList.clear();\n\n    for ( const QString &record : static_cast<const QList<QString>&>(buffer) )\n    {\n        QRegularExpressionMatch match = recordRE.match(record);\n\n        if ( match.hasMatch() )\n        {\n            KSTUsersInfo user;\n            user.callsign = match.captured(1).remove('(').remove(')');\n            user.grid = Gridsquare(match.captured(2));\n            user.stationComment = match.captured(3);\n            user.dxcc = Data::instance()->lookupDxcc(user.callsign);\n            user.status = DxccStatus::UnknownStatus;\n            if ( contact )\n            {\n                const QString &modeGroup = BandPlan::modeToDXCCModeGroup(contact->getMode());\n                user.status = Data::instance()->dxccStatus(user.dxcc.dxcc, contact->getBand(), modeGroup);\n                user.dupeCount = Data::countDupe(user.callsign, contact->getBand(), modeGroup);\n            }\n            userList << user;\n        }\n        else\n        {\n            qCDebug(runtime) << \"Record does not match the pattern\";\n        }\n    }\n    emit usersListUpdated();\n    QTimer::singleShot(1000 * KST_UPDATE_USERS_LIST, this, [this]()\n    {\n        qCDebug(runtime) << \"Updating User List\";\n        sendShowUsersCommand();\n    });\n}\n\nconst QStringList KSTChat::chatRooms = {\"50/70 MHz\",\n                                       \"144/432 MHz\",\n                                       \"Microwave\",\n                                       \"EME/JT65\",\n                                       \"Low Band (160-80m)\",\n                                       \"50 MHz IARU Region 3\",\n                                       \"50 MHz IARU Region 2\",\n                                       \"144/432 MHz IARU R 2\",\n                                       \"144/432 MHz IARU R 3\",\n                                       \"kHz (2000-630m)\",\n                                       \"Warc (30,17,12m)\",\n                                       \"28 MHz\",\n                                       \"40 MHz\"};\n\nconst QString KSTChat::SECURE_STORAGE_KEY = \"KST\";\n\nchatHighlightEvaluator::chatHighlightEvaluator(const int roomIndex,\n                                               QObject *parent)\n    : QObject(parent),\n      roomIndex(roomIndex)\n{\n    FCT_IDENTIFICATION;\n    loadRules();\n}\n\nvoid chatHighlightEvaluator::clearRules()\n{\n    FCT_IDENTIFICATION;\n\n    qDeleteAll(ruleList);\n    ruleList.clear();\n}\n\nQStringList chatHighlightEvaluator::getAllRuleNames()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    QSqlQuery ruleStmt;\n    if ( ! ruleStmt.prepare(\"SELECT rule_name FROM chat_highlight_rules ORDER BY rule_name\") )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n    }\n    else\n    {\n        if ( ruleStmt.exec() )\n        {\n            while (ruleStmt.next())\n            {\n                ret << ruleStmt.value(0).toString();\n            }\n        }\n        else\n        {\n            qWarning()<< \"Cannot get rule names from DB\" << ruleStmt.lastError();;\n        }\n    }\n    return ret;\n}\n\nvoid chatHighlightEvaluator::loadRules()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ruleList.size() > 0 )\n    {\n        clearRules();\n    }\n\n    QSqlQuery ruleStmt;\n\n    if ( ! ruleStmt.prepare(\"SELECT rule_name FROM chat_highlight_rules \"\n                            \"WHERE (room_id = :room_id or room_id = 0) AND enabled = 1\") )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n    }\n    else\n    {\n        ruleStmt.bindValue(\":room_id\", roomIndex);\n        if ( ruleStmt.exec() )\n        {\n            while ( ruleStmt.next() )\n            {\n                chatHighlightRule *rule;\n                rule = new chatHighlightRule();\n                if ( rule )\n                {\n                    if ( rule->load(ruleStmt.value(0).toString()) )\n                        ruleList.append(rule);\n                    else\n                        rule->deleteLater();\n                }\n            }\n        }\n        else\n        {\n            qWarning()<< \"Cannot get rule names from DB\" << ruleStmt.lastError();\n        }\n    }\n}\n\nbool chatHighlightEvaluator::shouldHighlight(const KSTChatMsg &msg,\n                                             QStringList &matchedRules)\n{\n    FCT_IDENTIFICATION;\n\n    for ( const chatHighlightRule *rule : static_cast<const QList<chatHighlightRule *>&>(ruleList) )\n    {\n        qCDebug(runtime) << \"Processing \" << rule->ruleName;\n        if ( rule->match(roomIndex, msg) )\n        {\n            matchedRules << rule->ruleName;\n        }\n    }\n\n    return ( matchedRules.size() > 0 );\n}\n\n\nchatHighlightRule::chatHighlightRule(QObject *parent) :\n    QObject(parent),\n    enabled(false),\n    ruleRoomIndex(-1),\n    interConditionOperand(OPERAND_OR),\n    ruleValid(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nbool chatHighlightRule::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ruleName.isEmpty() )\n    {\n        qCDebug(runtime) << \"rule name is empty - do not save\";\n        return false;\n    }\n\n    QSqlQuery insertUpdateStmt;\n\n    if ( ! insertUpdateStmt.prepare(\"INSERT INTO chat_highlight_rules(rule_name, room_id, enabled, rule_definition) \"\n                                    \" VALUES (:ruleName, :room_id, :enabled, :rule_definition)  \"\n                                    \" ON CONFLICT(rule_name) DO UPDATE SET rule_definition = :rule_definition, enabled = :enabled, room_id = :room_id \"\n                                    \" WHERE rule_name = :ruleName\"))\n    {\n        qWarning() << \"Cannot prepare insert/update Alert Rule statement\" << insertUpdateStmt.lastError();\n        return false;\n    }\n\n    insertUpdateStmt.bindValue(\":ruleName\", ruleName);\n    insertUpdateStmt.bindValue(\":enabled\", enabled);\n    insertUpdateStmt.bindValue(\":room_id\", ruleRoomIndex);\n    insertUpdateStmt.bindValue(\":rule_definition\", toJson());\n\n    if ( ! insertUpdateStmt.exec() )\n    {\n        qCDebug(runtime)<< \"Cannot Update Alert Rules - \" << insertUpdateStmt.lastError().text();\n        return false;\n    }\n    return true;\n}\n\nbool chatHighlightRule::load(const QString &ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << ruleName;\n\n    QSqlQuery query;\n\n    if ( ! query.prepare(\"SELECT rule_definition \"\n                         \"FROM chat_highlight_rules \"\n                         \"WHERE rule_name = :rule_name\") )\n    {\n        qWarning() << \"Cannot prepare select statement\";\n        return false;\n    }\n\n    query.bindValue(\":rule_name\", ruleName);\n\n    if ( query.exec()  && query.next() )\n    {\n        fromJson(QJsonDocument::fromJson(query.value(0).toByteArray()));\n    }\n    else\n    {\n        qCDebug(runtime) << \"SQL execution error: \" << query.lastError().text();\n        return false;\n    }\n    return true;\n}\n\nQByteArray chatHighlightRule::toJson()\n{\n    FCT_IDENTIFICATION;\n\n    QJsonObject ruleJsonObject;\n\n    ruleJsonObject[\"rulename\"] = ruleName;\n    ruleJsonObject[\"enabled\"] = enabled;\n    ruleJsonObject[\"roomId\"] = ruleRoomIndex;\n    ruleJsonObject[\"operand\"] = interConditionOperand;\n\n    QJsonArray conditionsArray;\n\n    for ( const Condition &condition : static_cast<const QList<Condition>&>(conditions) )\n    {\n        QJsonObject conditionObject;\n\n        conditionObject[\"source\"] = condition.source;\n        conditionObject[\"operatorid\"] = condition.operatorID;\n        conditionObject[\"value\"] = condition.value;\n        conditionsArray.push_back(conditionObject);\n    }\n    ruleJsonObject[\"conditions\"] = conditionsArray;\n\n    QJsonDocument doc(ruleJsonObject);\n    return doc.toJson();\n}\n\nvoid chatHighlightRule::fromJson(const QJsonDocument &ruleDefinition)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ruleDefinition.isNull() )\n        return;\n    /*\n     * {\n     *    rulename = \"xxxx\",\n     *    enabled = true/false,\n     *    roomId = x,\n     *    operand = 1,\n     *    conditions = [ {source = 1,\n     *                    operatorID = 1,\n     *                    value = \"xxxx'},\n     *                 ]\n     *  }\n     */\n    ruleName = ruleDefinition[\"rulename\"].toString();\n    enabled = ruleDefinition[\"enabled\"].toBool();\n    ruleRoomIndex = ruleDefinition[\"roomId\"].toInt();\n    interConditionOperand = static_cast<InterConditionOperand>(ruleDefinition[\"operand\"].toInt());\n    const QJsonArray &conditionArray = ruleDefinition[\"conditions\"].toArray();\n    for ( const QJsonValue &value : conditionArray )\n    {\n        QJsonObject obj = value.toObject();\n        Condition condition;\n        condition.source = static_cast<InfoSource>(obj[\"source\"].toInt());\n        condition.operatorID = static_cast<Operator>(obj[\"operatorid\"].toInt());\n        condition.value = obj[\"value\"].toString();\n        conditions.append(condition);\n    }\n    ruleValid = true;\n}\n\nbool chatHighlightRule::match(const int inRoomIndex,\n                              const KSTChatMsg &msg) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << inRoomIndex\n                                 << ruleRoomIndex\n                                 << msg.sender\n                                 << msg.message\n                                 << msg.grid.getGrid();\n\n    if ( !ruleValid )\n    {\n        qCDebug(runtime) << \"Rule is invalid\";\n        return false;\n    }\n\n    if ( !enabled )\n    {\n        qCDebug(runtime) << \"Rule is disabled\";\n        return false;\n    }\n\n    if ( inRoomIndex != ruleRoomIndex\n         && ruleRoomIndex != 0 )\n    {\n        qCDebug(runtime) << \"Rule for different room ID\";\n        return false;\n    }\n\n    bool result = false;\n    bool isFirstCondition = true;\n\n    for ( const Condition &condition : static_cast<const QList<Condition>&>(conditions) )\n    {\n        QString columnValue;\n\n        switch ( condition.source )\n        {\n        case SENDER:\n            columnValue = msg.sender;\n            qCDebug(runtime) << \"Sender\";\n            break;\n        case MESSAGE:\n            columnValue = msg.message;\n            qCDebug(runtime) << \"Message\";\n            break;\n        case GRIDSQUARE:\n            columnValue = msg.grid.getGrid();\n            qCDebug(runtime) << \"Grid\";\n            break;\n        }\n\n        bool operatorResult = false;\n\n        switch ( condition.operatorID )\n        {\n        case OPERATOR_CONTAINS:\n            qCDebug(runtime) << \"Contains\" << condition.value;\n            operatorResult = columnValue.contains(condition.value, Qt::CaseInsensitive);\n            break;\n        case OPERATOR_STARTWITH:\n            qCDebug(runtime) << \"StartWith\" << condition.value;\n            operatorResult = columnValue.startsWith(condition.value, Qt::CaseInsensitive);\n            break;\n        }\n\n        if ( isFirstCondition )\n        {\n            result = operatorResult;\n        }\n        else\n        {\n            switch( interConditionOperand )\n            {\n            case OPERAND_OR:\n                qCDebug(runtime) << \"OR\";\n                result = result || operatorResult;\n                break;\n            case OPERAND_AND:\n                qCDebug(runtime) << \"AND\";\n                result = result && operatorResult;\n            }\n        }\n        qCDebug(runtime) << \"matching sub-result\" << result;\n        isFirstCondition = false;\n    }\n\n    qCDebug(runtime) << \"matching result\"<< result;\n    return result;\n}\n"
  },
  {
    "path": "service/kstchat/KSTChat.h",
    "content": "#ifndef QLOG_SERVICE_KSTCHAT_KSTCHAT_H\n#define QLOG_SERVICE_KSTCHAT_KSTCHAT_H\n\n#include <QObject>\n#include <QTcpSocket>\n\n#include \"data/Gridsquare.h\"\n#include \"data/Dxcc.h\"\n#include \"ui/NewContactWidget.h\"\n#include \"core/CredentialStore.h\"\n\nstruct KSTChatMsg\n{\n    QString time;\n    QString sender;\n    QString message;\n    Gridsquare grid;\n    QStringList matchedHighlightRules;\n};\n\nQ_DECLARE_METATYPE(KSTChatMsg);\n\nstruct KSTUsersInfo\n{\n    QString callsign; // do not use Callsign class because KST users a free text here\n    Gridsquare grid;\n    QString stationComment;\n    DxccEntity dxcc;\n    DxccStatus status;\n    qulonglong dupeCount = 0;\n};\n\nQ_DECLARE_METATYPE(KSTUsersInfo);\n\n\nclass chatHighlightRule : public QObject\n{\n    Q_OBJECT\n\npublic:\n    enum InfoSource {\n        SENDER = 0,\n        MESSAGE = 1,\n        GRIDSQUARE = 2\n    };\n\n    enum Operator {\n        OPERATOR_CONTAINS = 0,\n        OPERATOR_STARTWITH = 1\n    };\n\n    enum InterConditionOperand{\n        OPERAND_AND = 0,\n        OPERAND_OR = 1\n    };\n\n    struct Condition\n    {\n        InfoSource source;\n        Operator operatorID;\n        QString value;\n\n        Condition() : source(SENDER), operatorID(OPERATOR_CONTAINS) {};\n    };\n\npublic:\n    explicit chatHighlightRule(QObject *parent = nullptr);\n    ~chatHighlightRule(){};\n\n    bool save();\n    bool load(const QString &);\n    bool match(const int inRoomIndex,\n               const KSTChatMsg &msg) const;\n\n    QString ruleName;\n    bool enabled;\n    int ruleRoomIndex;\n    InterConditionOperand interConditionOperand;\n    QList<Condition> conditions;\n    bool ruleValid;\n\nprivate:\n    void fromJson(const QJsonDocument &ruleDefinition);\n    QByteArray toJson();\n};\n\nclass chatHighlightEvaluator : public QObject\n{\n    Q_OBJECT\n\npublic:\n    explicit chatHighlightEvaluator(const int roomIndex,\n                                    QObject *parent = nullptr);\n    ~chatHighlightEvaluator() { clearRules();}\n\n    void clearRules();\n\n    static QStringList getAllRuleNames();\n\npublic slots:\n    void loadRules();\n    bool shouldHighlight(const KSTChatMsg &msg,\n                         QStringList &matchedRules);\n\nprivate:\n    QList<chatHighlightRule *>ruleList;\n    int roomIndex;\n};\n\nclass KSTChat : public QObject, public SecureServiceBase<KSTChat>\n{\n    Q_OBJECT\n\nprotected:\n    static const QString SECURE_STORAGE_KEY;\n\npublic:\n    const static QStringList chatRooms;\n\n    DECLARE_SECURE_SERVICE(KSTChat);\n\n    explicit KSTChat(int chatRoomIndex,\n                     const QString &username,\n                     const QString &password,\n                     const NewContactWidget *contact,\n                     QObject *parent = nullptr);\n    ~KSTChat();\n\n    QList<KSTUsersInfo> getUsersList() const;\n    KSTUsersInfo getUserInfo(const QString& username) const;\n\n    static const QString getUsername();\n    static const QString getPasswd();\n    static void saveUsernamePassword(const QString&, const QString&);\n\npublic slots:\n    void connectChat();\n    void disconnectChat();\n    void sendMessage(const QString&);\n    void reloadStationProfile();\n    void resetDupe();\n    void recalculateDupe();\n    void recalculateDxccStatus();\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsStatusWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n\nprivate slots:\n    void receiveData();\n    void socketConnected();\n    void socketError(QAbstractSocket::SocketError socker_error);\n\nsignals:\n    void chatConnected();\n    void chatDisconnected();\n    void chatError(QString);\n    void chatMsg(KSTChatMsg);\n    void usersListUpdated();\n\nprivate:\n    enum Command\n    {\n        NO_CMD = 0,\n        LOGIN_CMD = 1,\n        USER_CMD = 2,\n        SHOW_USERS_CMD = 3,\n        SET_GRID_CMD = 4\n    };\n\n    int chatRoomIdx;\n    QString userName;\n    QString password;\n    QTcpSocket* socket;\n    Command currCommand;\n    QString receiveBuffer;\n    QStringList commandLineBuffer;\n\n    void sendShowUsersCommand();\n    void sendCommand(const Command&, const QString&);\n    void sendSetGridCommand();\n    void finalizeShowUsersCommand(const QStringList&);\n    QStringList joinLines(const QByteArray &data);\n    QList<KSTUsersInfo> userList;\n    QList<QPair<Command, QString>> commandQueue;\n\n    const NewContactWidget *contact;\n    const QString KST_HOSTNAME = \"www.on4kst.org\";\n    const quint16 KST_PORT = 23000;\n    const quint16 KST_UPDATE_USERS_LIST = 3 * 60;// update user list every 3*60 seconds\n};\n\n#endif // QLOG_SERVICE_KSTCHAT_KSTCHAT_H\n"
  },
  {
    "path": "service/lotw/Lotw.cpp",
    "content": "#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkAccessManager>\n#include <QNetworkReply>\n#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QTemporaryFile>\n#include <QMessageBox>\n#include <QProcess>\n#include <QRegularExpression>\n#include <QStandardPaths>\n#include <QFile>\n#include <QDir>\n#include <QXmlStreamReader>\n#include \"Lotw.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/LogParam.h\"\n#include \"data/Data.h\"\n\nMODULE_IDENTIFICATION(\"qlog.core.lotw\");\n\nQStringList LotwUploader::uploadedFields =\n{\n    \"callsign\",\n    \"freq\",\n    \"band\",\n    \"freq_rx\",\n    \"mode\",\n    \"submode\",\n    \"start_time\",\n    \"prop_mode\",\n    \"sat_name\",\n    \"station_callsign\",\n    \"operator\",\n    \"rst_sent\",\n    \"rst_rcvd\",\n    \"my_state\",\n    \"my_cnty\",\n    \"my_vucc_grids\"\n};\n\nconst QString LotwBase::SECURE_STORAGE_KEY = \"LoTW\";\nREGISTRATION_SECURE_SERVICE(LotwBase);\n\nconst QString LotwBase::getUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getLoTWCallbookUsername();\n}\n\nconst QString LotwBase::getPasswd()\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(LotwBase::SECURE_STORAGE_KEY, getUsername());\n}\n\nvoid LotwBase::saveUsernamePassword(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &oldUsername = getUsername();\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(LotwBase::SECURE_STORAGE_KEY, oldUsername);\n    }\n\n    LogParam::setLoTWCallbookUsername(newUsername);\n    savePassword(LotwBase::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nconst QString LotwBase::getTQSLPath(const QString &defaultPath)\n{\n    FCT_IDENTIFICATION;\n\n#ifdef QLOG_FLATPAK\n    // flatpak package contain an internal tqsl that is always on the same path\n    Q_UNUSED(defaultPath);\n    return QString(\"/app/bin/tqsl\");\n#else\n    return LogParam::getLoTWTQSLPath(defaultPath);\n#endif\n}\n\nvoid LotwBase::saveTQSLPath(const QString &newPath)\n{\n    FCT_IDENTIFICATION;\n\n#ifdef QLOG_FLATPAK\n    // do not save path for Flatpak version - an internal tqsl instance is present in the package\n    Q_UNUSED(newPath);\n#else\n    LogParam::setLoTWTQSLPath(newPath);\n#endif\n}\n\nQString LotwBase::findTQSLPath()\n{\n    FCT_IDENTIFICATION;\n\n    // Platform-specific well-known paths\n    const QStringList platformPaths =\n    {\n#ifdef Q_OS_WIN\n        \"C:/Program Files/ARRL/TQSL/tqsl.exe\",\n        \"C:/Program Files (x86)/ARRL/TQSL/tqsl.exe\",\n        QDir::homePath() + \"/AppData/Local/Programs/TQSL/tqsl.exe\"\n#elif defined(Q_OS_MACOS)\n        \"/Applications/tqsl.app/Contents/MacOS/tqsl\",\n        \"/Applications/TQSL.app/Contents/MacOS/tqsl\"\n#else\n        \"/usr/bin/tqsl\",\n        \"/usr/local/bin/tqsl\",\n        \"/opt/tqsl/bin/tqsl\"\n#endif\n    };\n\n    for ( const QString &p : platformPaths )\n    {\n        if ( QFile::exists(p) )\n        {\n            qCDebug(runtime) << \"Found TQSL at:\" << p;\n            return p;\n        }\n    }\n\n    // Last resort: search in $PATH\n    const QString path = QStandardPaths::findExecutable(\"tqsl\");\n    if ( !path.isEmpty() )\n    {\n        qCDebug(runtime) << \"Found TQSL in PATH:\" << path;\n        return path;\n    }\n\n    qCWarning(runtime) << \"TQSL not found\";\n    return QString();\n}\n\nTQSLVersion LotwBase::getTQSLVersion(const QString &tqslPath)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << tqslPath;\n\n    TQSLVersion version;\n\n    const QString path = tqslPath.trimmed().isEmpty() ? findTQSLPath() : tqslPath.trimmed();\n\n    if ( path.isEmpty() )\n    {\n        qCDebug(runtime) << \"TQSL not found\";\n        return version;\n    }\n\n    QProcess process;\n    process.setProcessChannelMode(QProcess::MergedChannels);\n    process.start(path, QStringList(\"--version\"));\n\n    if ( !process.waitForFinished(2000) )\n    {\n        qCDebug(runtime) << \"tqsl --version timed out\";\n        return version;\n    }\n\n    const QString output = QString::fromLocal8Bit(process.readAllStandardOutput()).trimmed();\n    qCDebug(runtime) << \"tqsl version output:\" << output;\n\n    // \"TQSL Version 2.7.2 [unknown]\"\n    QRegularExpression re(\"TQSL\\\\s+Version\\\\s+(\\\\d+)\\\\.(\\\\d+)\\\\.(\\\\d+)\");\n    QRegularExpressionMatch match = re.match(output); // clazy:exclude=use-static-qregularexpression\n\n    if ( match.hasMatch() )\n    {\n        version.major = match.captured(1).toInt();\n        version.minor = match.captured(2).toInt();\n        version.patch = match.captured(3).toInt();\n        qCDebug(runtime) << \"Parsed TQSL version:\" << version.major << version.minor << version.patch;\n    }\n    else\n    {\n        qCDebug(runtime) << \"Failed to parse TQSL version from output:\" << output;\n    }\n\n    return version;\n}\n\nvoid LotwBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_KEY, []()\n    {\n        return QList<CredentialDescriptor>\n        {\n            { SECURE_STORAGE_KEY, [](){ return getUsername(); } }\n        };\n    });\n}\n\nQString LotwBase::getTQSLStationDataPath()\n{\n    FCT_IDENTIFICATION;\n\n    // QStandardPaths::GenericDataLocation is redirected by Flatpak to\n    // ~/.var/app/<app-id>/data, where the bundled TQSL stores its data.\n    // On a standard install TQSL uses the legacy ~/.tqsl/ directory.\n    // On Windows, TQSL stores station_data in %APPDATA%\\TrustedQSL\\station_data.\n    const QStringList candidates = {\n#ifdef Q_OS_WIN\n        QDir::cleanPath(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)\n            + \"/../TrustedQSL/station_data\"),\n        QDir::homePath() + \"/AppData/Roaming/TrustedQSL/station_data\"\n#else\n        QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation)\n            + \"/tqsl/station_data\",\n        QDir::homePath() + \"/.tqsl/station_data\"\n#endif\n    };\n\n    for ( const QString &path : candidates )\n    {\n        if ( QFile::exists(path) )\n        {\n            qCDebug(runtime) << \"Found TQSL station_data at:\" << path;\n            return path;\n        }\n    }\n\n    qCDebug(runtime) << \"TQSL station_data not found\";\n    return {};\n}\n\nQList<TQSLStationLocation> LotwBase::getTQSLStationLocations()\n{\n    FCT_IDENTIFICATION;\n\n    const QString path = getTQSLStationDataPath();\n\n    if ( path.isEmpty() )\n        return {};\n\n    QFile file(path);\n    if ( !file.open(QIODevice::ReadOnly) )\n    {\n        qCDebug(runtime) << \"Cannot open TQSL station_data:\" << path;\n        return {};\n    }\n\n    QList<TQSLStationLocation> locations;\n    QXmlStreamReader xml(&file);\n    TQSLStationLocation current;\n    bool inStationData = false;\n\n    while ( !xml.atEnd() && !xml.hasError() )\n    {\n        const QXmlStreamReader::TokenType tokenType = xml.readNext();\n\n        if ( tokenType == QXmlStreamReader::StartElement )\n        {\n            if ( xml.name().compare(QLatin1String(\"StationData\"), Qt::CaseInsensitive) == 0 )\n            {\n                current = TQSLStationLocation{};\n                current.name = xml.attributes().value(\"name\").toString();\n                inStationData = true;\n            }\n            else if ( inStationData )\n            {\n                if ( xml.name().compare(QLatin1String(\"CALL\"), Qt::CaseInsensitive) == 0 )\n                    current.callsign = xml.readElementText();\n                else if ( xml.name().compare(QLatin1String(\"GRIDSQUARE\"), Qt::CaseInsensitive) == 0 )\n                    current.grid = xml.readElementText();\n            }\n        }\n        else if ( tokenType == QXmlStreamReader::EndElement\n                  && xml.name().compare(QLatin1String(\"StationData\"), Qt::CaseInsensitive) == 0 )\n        {\n            if ( !current.name.isEmpty() )\n                locations << current;\n            inStationData = false;\n        }\n    }\n\n    qCDebug(runtime) << \"TQSL locations count:\" << locations.size();\n    return locations;\n}\n\nLotwUploader::LotwUploader(QObject *parent) :\n    GenericQSOUploader(uploadedFields, parent),\n    LotwBase()\n{\n    FCT_IDENTIFICATION;\n}\n\nLotwUploader::~LotwUploader()\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid LotwUploader::uploadAdif(const QByteArray &data, const QString &location)\n{\n    FCT_IDENTIFICATION;\n\n    file.open();\n    file.write(data);\n    file.flush();\n\n    QStringList args;\n    args << \"-d\" << \"-q\" << \"-u\" << file.fileName();\n\n    // Pass -l <location> only when the user explicitly selected a location\n    if ( !location.trimmed().isEmpty() )\n        args << \"-l\" << location.trimmed();\n\n    QProcess *tqslProcess = new QProcess();\n\n    connect(tqslProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),\n            this, [this, tqslProcess](int exitCode, QProcess::ExitStatus exitStatus)\n    {\n        qCDebug(runtime) << \"Process finished with exit code\" << exitCode << \"and exit status\" << exitStatus;\n\n        /* list of Error Codes: http://www.arrl.org/command-1 */\n        switch ( exitCode )\n        {\n        case 0: // Success\n            emit uploadFinished();\n            break;\n\n        case 1: // Cancelled by user\n            emit uploadError(tr(\"Upload cancelled by user\"));\n            break;\n\n        case 2: // Rejected by LoTW\n            emit uploadError(tr(\"Upload rejected by LoTW\"));\n            break;\n\n        case 3: // Unexpected response from TQSL server\n            emit uploadError(tr(\"Unexpected response from TQSL server\"));\n            break;\n\n        case 4: // TQSL error\n            emit uploadError(tr(\"TQSL utility error\"));\n            break;\n\n        case 5: // TQSLlib error\n            emit uploadError(tr(\"TQSLlib error\"));\n            break;\n\n        case 6: // Unable to open input file\n            emit uploadError(tr(\"Unable to open input file\"));\n            break;\n\n        case 7: // Unable to open output file\n            emit uploadError(tr(\"Unable to open output file\"));\n            break;\n\n        case 8: // All QSOs were duplicates or out of date range\n            emit uploadError(tr(\"All QSOs were duplicates or out of date range\"));\n            break;\n\n        case 9: // Some QSOs were duplicates or out of date range\n            emit uploadError(tr(\"Some QSOs were duplicates or out of date range\"));\n            break;\n\n        case 10: // Command syntax error\n            emit uploadError(tr(\"Command syntax error\"));\n            break;\n\n        case 11: // LoTW Connection error (no network or LoTW is unreachable)\n            emit uploadError(tr(\"LoTW Connection error (no network or LoTW is unreachable)\"));\n            break;\n\n        default:\n            emit uploadError(tr(\"Unexpected Error from TQSL\"));\n        }\n\n        tqslProcess->deleteLater();\n    });\n\n    connect(tqslProcess, &QProcess::errorOccurred, this, [this, tqslProcess](QProcess::ProcessError error)\n    {\n        qDebug() << \"Process error:\" << error;\n\n        switch ( error )\n        {\n        case QProcess::FailedToStart: // Error code of QProcess::execute - Process cannot start\n            emit uploadError(tr(\"TQSL not found\"));\n            break;\n\n        case QProcess::Crashed: // Error code of QProcess::execute - Process crashed\n            emit uploadError(tr(\"TQSL crashed\"));\n            break;\n        default:\n            emit uploadError(tr(\"Unexpected Error from TQSL\"));\n        }\n        tqslProcess->deleteLater();\n    });\n\n    connect(tqslProcess, &QProcess::readyReadStandardOutput, this, [tqslProcess]()\n    {\n        qCDebug(runtime)<< \"TQSL output: \" << qPrintable(tqslProcess->readAllStandardOutput());\n    });\n\n    tqslProcess->setProcessChannelMode(QProcess::MergedChannels);\n    tqslProcess->setReadChannel(QProcess::StandardOutput);\n\n    qCDebug(runtime) << getTQSLPath(\"tqsl\") << args;\n    tqslProcess->start(getTQSLPath(\"tqsl\"),args);\n}\n\nvoid LotwUploader::uploadQSOList(const QList<QSqlRecord> &qsos, const QVariantMap &addlParams)\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray data = generateADIF(qsos);\n    const QString location = addlParams[\"tqsl_location\"].toString();\n    uploadAdif(data, location);\n}\n\nLotwQSLDownloader::LotwQSLDownloader(QObject *parent) :\n    GenericQSLDownloader(parent),\n    LotwBase(),\n    currentReply(nullptr)\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid LotwQSLDownloader::receiveQSL(const QDate &start_date, bool qso_since, const QString &station_callsign)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << start_date << \" \" << qso_since;\n\n    QList<QPair<QString, QString>> params;\n    params.append(qMakePair(QString(\"qso_query\"), QString(\"1\")));\n    params.append(qMakePair(QString(\"qso_qsldetail\"), QString(\"yes\")));\n    params.append(qMakePair(QString(\"qso_owncall\"), station_callsign));\n\n    const QString &start = start_date.toString(\"yyyy-MM-dd\");\n\n    if (qso_since)\n    {\n        params.append(qMakePair(QString(\"qso_qsl\"), QString(\"no\")));\n        params.append(qMakePair(QString(\"qso_qsorxsince\"), start));\n    }\n    else\n    {\n        params.append(qMakePair(QString(\"qso_qsl\"), QString(\"yes\")));\n        params.append(qMakePair(QString(\"qso_qslsince\"), start));\n    }\n\n    get(params);\n}\n\nvoid LotwQSLDownloader::abortDownload()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply = nullptr;\n    }\n}\n\nvoid LotwQSLDownloader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if (reply->error() != QNetworkReply::NoError\n        || replyStatusCode < 200\n        || replyStatusCode >= 300)\n    {\n        qCInfo(runtime) << \"LotW error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n           emit receiveQSLFailed(reply->errorString());\n           reply->deleteLater();\n        }\n        return;\n    }\n\n    qint64 size = reply->size();\n    qCDebug(runtime) << \"Reply received, size: \" << size;\n\n    /* Currently, QT returns an incorrect stream position value in Network stream\n     * when the stream is used in QTextStream. Therefore\n     * QLog downloads a response, saves it to a temp file and opens\n     * the file as a stream */\n    QTemporaryFile tempFile;\n\n    if ( ! tempFile.open() )\n    {\n        qCDebug(runtime) << \"Cannot open temp file\";\n        emit receiveQSLFailed(tr(\"Cannot open temporary file\"));\n        return;\n    }\n\n    const QByteArray &data = reply->readAll();\n\n    qCDebug(runtime) << data;\n\n    /* verify the Username/password incorrect only in case when message is short (10k).\n     * otherwise, it is a long ADIF and it is not necessary to verify login status */\n    if ( size < 10000 && data.contains(\"Username/password incorrect\") )\n    {\n        emit receiveQSLFailed(tr(\"Incorrect login or password\"));\n        return;\n    }\n\n    tempFile.write(data);\n    tempFile.flush();\n    tempFile.seek(0);\n\n    emit receiveQSLStarted();\n\n    /* see above why QLog uses a temp file */\n    QTextStream stream(&tempFile);\n    AdiFormat adi(stream);\n\n    connect(&adi, &AdiFormat::importPosition, this, [this, size](qint64 position)\n    {\n        if ( size > 0 )\n        {\n            double progress = position * 100.0 / size;\n            emit receiveQSLProgress(static_cast<qulonglong>(progress));\n        }\n    });\n\n    connect(&adi, &AdiFormat::QSLMergeFinished, this, [this](QSLMergeStat stats)\n    {\n        emit receiveQSLComplete(stats);\n    });\n\n    adi.runQSLImport(adi.LOTW);\n\n    tempFile.close();\n\n    reply->deleteLater();\n}\n\nvoid LotwQSLDownloader::get(QList<QPair<QString, QString>> params)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &username = getUsername();\n    const QString &password = getPasswd();\n\n    QUrlQuery query;\n    query.setQueryItems(params);\n    query.addQueryItem(\"login\", username.toUtf8().toPercentEncoding());\n    query.addQueryItem(\"password\", password.toUtf8().toPercentEncoding());\n\n    QUrl url(ADIF_API);\n    url.setQuery(query);\n\n    qCDebug(runtime) << Data::safeQueryString(query);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->get(QNetworkRequest(url));\n}\n\nLotwQSLDownloader::~LotwQSLDownloader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n"
  },
  {
    "path": "service/lotw/Lotw.h",
    "content": "#ifndef QLOG_SERVISE_LOTW_LOTW_H\n#define QLOG_SERVISE_LOTW_LOTW_H\n\n#include <QObject>\n#include <QNetworkReply>\n#include <logformat/LogFormat.h>\n#include \"service/GenericQSOUploader.h\"\n#include \"service/GenericQSLDownloader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkAccessManager;\n\nstruct TQSLVersion\n{\n    int major = -1;\n    int minor = -1;\n    int patch = -1;\n    bool isValid() const { return major >= 0; }\n};\n\nstruct TQSLStationLocation\n{\n    QString name;\n    QString callsign;\n    QString grid;\n};\n\nclass LotwBase : public SecureServiceBase<LotwBase>\n{\nprotected:\n    static const QString SECURE_STORAGE_KEY;\n\npublic:\n    explicit LotwBase() {};\n    virtual ~LotwBase() {};\n\n    DECLARE_SECURE_SERVICE(LotwBase);\n\n    static const QString getUsername();\n    static const QString getPasswd();\n    static const QString getTQSLPath(const QString &defaultPath = QDir::rootPath());\n    static QString findTQSLPath();\n    static TQSLVersion getTQSLVersion(const QString &tqslPath = QString());\n    static QString getTQSLStationDataPath();\n    static QList<TQSLStationLocation> getTQSLStationLocations();\n\n    static void saveUsernamePassword(const QString&, const QString&);\n    static void saveTQSLPath(const QString&);\n\n    // Returns the QLog dxcc group (\"CW\", \"PHONE\", \"DIGITAL\") for the given\n    // LoTW generic mode group name, or an empty string for specific mode names.\n    static QString lotwGroupNameToDxcc(const QString &lotwMode)\n    {\n        static const QMap<QString, QString> map =\n        {\n            { \"DATA\",  \"DIGITAL\" },\n            { \"PHONE\", \"PHONE\"   },\n            { \"CW\",    \"CW\"      },\n            { \"IMAGE\", \"DIGITAL\" }\n        };\n        return map.value(lotwMode.toUpper());\n    }\n};\n\nclass LotwUploader : public GenericQSOUploader, private LotwBase\n{\n    Q_OBJECT\n\npublic:\n    static QStringList uploadedFields;\n\n    static QVariantMap generateUploadConfigMap(const QString &location)\n    {\n        return QVariantMap({{\"tqsl_location\", location}});\n    }\n    explicit LotwUploader(QObject *parent = nullptr);\n    virtual ~LotwUploader();\n\n    void uploadAdif(const QByteArray &, const QString &location = QString());\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n\npublic slots:\n    virtual void abortRequest() override {};\n\nprivate:\n    QTemporaryFile file;\n    virtual void processReply(QNetworkReply*) override {};\n};\n\nclass LotwQSLDownloader : public GenericQSLDownloader, private LotwBase\n{\n    Q_OBJECT\n\npublic:\n    explicit LotwQSLDownloader(QObject *parent = nullptr);\n    virtual ~LotwQSLDownloader();\n\n    virtual void receiveQSL(const QDate &, bool, const QString &) override;\n\npublic slots:\n    virtual void abortDownload() override;\n\nprivate:\n    QNetworkReply *currentReply;\n    const QString ADIF_API = \"https://lotw.arrl.org/lotwuser/lotwreport.adi\";\n\n    virtual void processReply(QNetworkReply* reply) override;\n    void get(QList<QPair<QString, QString>> params);\n};\n\n#endif // QLOG_SERVISE_LOTW_LOTW_H\n"
  },
  {
    "path": "service/potaapp/PotaApp.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QNetworkReply>\n\n#include \"PotaApp.h\"\n#include \"core/debug.h\"\n#include \"data/Callsign.h\"\n\nMODULE_IDENTIFICATION(\"qlog.service.potaapp.potaapp\");\n\nPotaAppActivatorDownloader::PotaAppActivatorDownloader(QObject *parent) :\n    QObject(parent),\n    nam(new QNetworkAccessManager(this))\n{\n    FCT_IDENTIFICATION;\n\n    connect(nam, &QNetworkAccessManager::finished, this, &PotaAppActivatorDownloader::processReply);\n}\n\nPotaAppActivatorDownloader::~PotaAppActivatorDownloader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( nam ) nam->deleteLater();\n}\n\nvoid PotaAppActivatorDownloader::swapActivators(ActivatorStorage &a)\n{\n    FCT_IDENTIFICATION;\n\n    QMutexLocker locker(&activatorLock);\n    a.swap(activators);\n}\n\nvoid PotaAppActivatorDownloader::updateActivators()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currReply )\n    {\n        qCWarning(runtime) << \"request is still running\";\n        currReply->abort();\n        currReply = nullptr;\n    }\n    const QUrl url(API_URL);\n    QNetworkRequest req(url);\n    req.setHeader(QNetworkRequest::UserAgentHeader, \"QLog\");\n    currReply = nam->get(req);\n}\n\n\nvoid PotaAppActivatorDownloader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    currReply = nullptr;\n\n    if (!reply) return;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"POTA API error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n        reply->deleteLater();\n        return;\n    }\n\n    const QByteArray body = reply->readAll();\n    if ( body.isEmpty() ) return;\n\n    // Parse JSON array of spots\n    QJsonParseError jerr{};\n\n    const QJsonDocument doc = QJsonDocument::fromJson(body, &jerr);\n    if (jerr.error != QJsonParseError::NoError || !doc.isArray())\n    {\n        qCWarning(runtime) << \"POTA JSON Error\" << jerr.errorString();\n        return;\n    }\n\n    const QJsonArray arr = doc.array();\n    ActivatorStorage newActivators;\n\n    for ( const QJsonValue &val : arr )\n    {\n        if (!val.isObject()) continue;\n\n        const QJsonObject o = val.toObject();\n\n        //qCDebug(runtime) << \"Received Spot\" << o;\n\n        if ( o.value(\"comments\").toString().toUpper().contains(\"QRT\") )\n        {\n            qCDebug(runtime) << \"QRT - skipping\";\n            continue;\n        }\n\n        POTASpot s;\n\n        s.spotId = static_cast<quint64>(o.value(\"spotId\").toVariant().toULongLong());\n        s.activator = o.value(\"activator\").toString().toUpper();\n        Callsign activator(s.activator);\n        if (activator.isValid()) s.activatorBaseCallsign = activator.getBase();\n        s.frequency = o.value(\"frequency\").toString().toDouble() / 1000;\n        s.mode = o.value((\"mode\")).toString();\n        s.reference = o.value((\"reference\")).toString().toUpper();\n        s.parkName = o.value((\"parkName\")).toString();\n        s.spotter = o.value((\"spotter\")).toString().toUpper();\n        s.comments = o.value((\"comments\")).toString();\n        s.source = o.value((\"source\")).toString();\n        s.name = o.value((\"name\")).toString();\n        s.locationDesc = o.value((\"locationDesc\")).toString();\n\n        const QString st = o.value((\"spotTime\")).toString();\n        s.spotTime = QDateTime::fromString(st, Qt::ISODate);\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n        s.spotTime.setTimeZone(QTimeZone::UTC);\n#else\n        s.spotTime.setTimeSpec(Qt::UTC);\n#endif\n\n        if ( !s.activator.isEmpty() && s.frequency > 0.0 && !s.mode.isEmpty() )\n        {\n            qCDebug(runtime) << \"Adding\"\n                             << s.activator << s.frequency << s.mode\n                             << s.reference << s.comments;\n            newActivators.insert(s.activatorBaseCallsign, s);\n        }\n    }\n    // atomic swap\n    activatorLock.lock();\n    activators.swap(newActivators);\n    activatorLock.unlock();\n    emit activatorsUpdated();\n    reply->deleteLater();\n}\n"
  },
  {
    "path": "service/potaapp/PotaApp.h",
    "content": "#ifndef QLOG_SERVICE_POTAAPP_POTAAPP_H\n#define QLOG_SERVICE_POTAAPP_POTAAPP_H\n\n#include <QObject>\n#include \"data/POTASpot.h\"\n\nclass QNetworkAccessManager;\nclass QNetworkReply;\n\nclass PotaAppActivatorDownloader : public QObject\n{\n    Q_OBJECT\n\npublic:\n    using ActivatorStorage = QMultiHash<QString, POTASpot>;\n\n    explicit PotaAppActivatorDownloader(QObject *parent = nullptr);\n    virtual ~PotaAppActivatorDownloader();\n    void swapActivators(ActivatorStorage &a);\n\nsignals:\n    void activatorsUpdated();\n\npublic slots:\n    void updateActivators();\n\nprivate slots:\n    void processReply(QNetworkReply *reply);\n\nprivate:\n    QNetworkAccessManager *nam = nullptr;\n    QNetworkReply *currReply = nullptr;\n    QMutex activatorLock;\n    ActivatorStorage activators;\n    const QString API_URL = \"https://api.pota.app/spot/activator\";\n};\n\n#endif // QLOG_SERVICE_POTAAPP_POTAAPP_H\n"
  },
  {
    "path": "service/qrzcom/QRZ.cpp",
    "content": "#include <QNetworkAccessManager>\n#include <QUrl>\n#include <QUrlQuery>\n#include <QNetworkRequest>\n#include <QNetworkReply>\n#include <QtXml>\n#include <QDebug>\n#include \"QRZ.h\"\n#include <QMessageBox>\n#include \"core/debug.h\"\n#include \"core/CredentialStore.h\"\n#include \"data/Callsign.h\"\n#include \"core/LogParam.h\"\n#include \"data/Data.h\"\n\n//https://www.qrz.com/docs/logbook/QRZLogbookAPI.html\n\nMODULE_IDENTIFICATION(\"qlog.core.qrz\");\nconst QString QRZBase::SECURE_STORAGE_KEY = \"QRZCOM\";\nconst QString QRZBase::SECURE_STORAGE_API_KEY = \"QRZCOMAPI\";\nconst QString QRZBase::CONFIG_USERNAME_API_CONST = \"logbookapi\";\nconst QString QRZCallbook::CALLBOOK_NAME = \"qrzcom\";\n\nREGISTRATION_SECURE_SERVICE(QRZBase);\n\nconst QString QRZBase::getUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getQRZCOMCallbookUsername();\n}\n\nconst QString QRZBase::getPasswd(const QString &username)\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(QRZBase::SECURE_STORAGE_KEY, username);\n}\n\nvoid QRZBase::saveUsernamePassword(const QString &newUsername, const QString &newPassword)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &oldUsername = getUsername();\n    if ( oldUsername != newUsername )\n    {\n        deletePassword(QRZBase::SECURE_STORAGE_KEY, oldUsername);\n    }\n\n    LogParam::setQRZCOMCallbookUsername(newUsername);\n\n    savePassword(QRZBase::SECURE_STORAGE_KEY,\n                 newUsername, newPassword);\n}\n\nQString QRZBase::getInternalAPIUsername()\n{\n    FCT_IDENTIFICATION;\n\n    return QRZBase::CONFIG_USERNAME_API_CONST;\n}\n\nconst QString QRZBase::getLogbookAPIKey(const QString &username)\n{\n    FCT_IDENTIFICATION;\n\n    return getPassword(QRZBase::SECURE_STORAGE_API_KEY, username);\n}\n\n\nvoid QRZBase::saveLogbookAPIKey(const QString &newKey, const QString &username)\n{\n    FCT_IDENTIFICATION;\n\n    deletePassword(QRZBase::SECURE_STORAGE_API_KEY, username);\n\n    if ( ! newKey.isEmpty() )\n        savePassword(QRZBase::SECURE_STORAGE_API_KEY, username, newKey);\n}\n\nconst QStringList QRZBase::getLogbookAPIAddlCallsigns()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getQRZCOMAPICallsignsList();\n}\n\nvoid QRZBase::setLogbookAPIAddlCallsigns(const QStringList &list)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setQRZCOMAPICallsignsList(list);\n}\n\nvoid QRZBase::registerCredentials()\n{\n    // both storage keys belong to the same logical service\n    CredentialRegistry::instance().add(SECURE_STORAGE_API_KEY, []()\n    {\n        QList<CredentialDescriptor> ret;\n\n        ret.append({ SECURE_STORAGE_KEY, [](){ return getUsername(); }});\n        ret.append({ SECURE_STORAGE_API_KEY, [](){ return getInternalAPIUsername(); }});\n\n        const QStringList &addCallsigns = QRZBase::getLogbookAPIAddlCallsigns();\n\n        for ( QString callsign : addCallsigns ) // do not use referece callsign here.\n            ret.append({ SECURE_STORAGE_API_KEY, [callsign]() {return callsign;}});\n\n        return ret;\n    });\n}\n\nQRZCallbook::QRZCallbook(QObject* parent) :\n    GenericCallbook(parent),\n    QRZBase(),\n    incorrectLogin(false),\n    lastSeenPassword(QString()),\n    currentReply(nullptr)\n{\n    FCT_IDENTIFICATION;\n}\n\nQRZCallbook::~QRZCallbook()\n{\n    if ( currentReply ) currentReply->abort();\n}\n\nQString QRZCallbook::getDisplayName()\n{\n    FCT_IDENTIFICATION;\n\n    return QString(tr(\"QRZ.com\"));\n}\n\nvoid QRZCallbook::queryCallsign(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<< callsign;\n\n    if (sessionId.isEmpty())\n    {\n        queuedCallsign = callsign;\n        authenticate();\n        return;\n    }\n\n    QUrlQuery params;\n    params.addQueryItem(\"s\", sessionId);\n\n    const Callsign qCall(callsign);\n\n    // currently QRZ.com does not handle correctly prefixes and suffixes.\n    // That's why it's better to give it away if possible\n    params.addQueryItem(\"callsign\", (qCall.isValid()) ? qCall.getBase()\n                                                      : callsign);\n\n    QUrl url(API_URL);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    QNetworkRequest request(url);\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n\n    qCDebug(runtime) << url;\n\n    currentReply = getNetworkAccessManager()->post(request, params.query(QUrl::FullyEncoded).toUtf8());\n\n    currentReply->setProperty(\"queryCallsign\", QVariant(callsign));\n    currentReply->setProperty(\"messageType\", QVariant(\"callsignInfoQuery\"));\n\n    // Attention, variable callsign and queuedCallsign point to the same object\n    // queuedCallsign must be cleared after the last use of the callsign variable\n    queuedCallsign = QString();\n}\n\nvoid QRZCallbook::abortQuery()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        //currentReply->deleteLater(); // pointer is deleted later in processReply\n        currentReply = nullptr;\n    }\n}\n\nvoid QRZCallbook::authenticate()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &username = getUsername();\n    const QString &password = getPasswd(username);\n\n    if ( incorrectLogin && password == lastSeenPassword)\n    {\n        /* User already knows that login failed */\n        emit callsignNotFound(queuedCallsign);\n        queuedCallsign = QString();\n        return;\n    }\n\n    if ( !username.isEmpty() && !password.isEmpty() )\n    {\n        QUrlQuery params;\n        params.addQueryItem(\"username\", username.toUtf8().toPercentEncoding());\n        params.addQueryItem(\"password\", password.toUtf8().toPercentEncoding());\n        params.addQueryItem(\"agent\", \"QLog\");\n\n        QUrl url(API_URL);\n\n        if ( currentReply )\n            qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n        QNetworkRequest request(url);\n        request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n\n        currentReply = getNetworkAccessManager()->post(request, params.query(QUrl::FullyEncoded).toUtf8());\n        currentReply->setProperty(\"messageType\", QVariant(\"authenticate\"));\n        lastSeenPassword = password;\n    }\n    else\n    {\n        emit callsignNotFound(queuedCallsign);\n        qCDebug(runtime) << \"Empty username or password\";\n    }\n}\n\nvoid QRZCallbook::processReply(QNetworkReply* reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"QRZ.com error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"QRZ.com error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit lookupError(reply->errorString());\n            reply->deleteLater();\n        }\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    /*********************/\n    /* callsignInfoQuery */\n    /*********************/\n    if ( messageType == \"callsignInfoQuery\"\n         || messageType == \"authenticate\" )\n    {\n        const QByteArray &response = reply->readAll();\n        qCDebug(runtime) << response;\n        QXmlStreamReader xml(response);\n        CallbookResponseData resposeData;\n\n        /* Reset Session Key */\n        /* Every response contains a valid key. If the key is not present */\n        /* then it is needed to request a new one */\n\n        sessionId = QString();\n\n        while ( !xml.atEnd() && !xml.hasError() )\n        {\n            QXmlStreamReader::TokenType token = xml.readNext();\n\n            if (token != QXmlStreamReader::StartElement)\n                continue;\n\n            const QString elementName = xml.name().toString();\n\n            if ( elementName == \"Error\" )\n            {\n                queuedCallsign = QString();\n                QString errorString = xml.readElementText();\n\n                if ( errorString.contains(\"Username/password incorrect\"))\n                {\n                    incorrectLogin = true;\n                    emit loginFailed();\n                    emit lookupError(errorString);\n                    return;\n                }\n                else if ( errorString.contains(\"Not found:\") )\n                {\n                    incorrectLogin = false;\n                    emit callsignNotFound(reply->property(\"queryCallsign\").toString());\n                    //return;\n                }\n                else\n                {\n                    qInfo() << \"QRZ Error - \" << errorString;\n                    emit lookupError(errorString);\n                }\n\n                // do not call return here, we need to obtain Key from error message (if present)\n            }\n            else\n                incorrectLogin = false;\n\n            if      (elementName == \"Key\")       sessionId = xml.readElementText();\n            else if (elementName == \"call\")      resposeData.call = decodeHtmlEntities(xml.readElementText().toUpper());\n            else if (elementName == \"dxcc\")      resposeData.dxcc = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"fname\")     resposeData.fname = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"name\")      resposeData.lname = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"addr1\")     resposeData.addr1 = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"addr2\")     resposeData.qth = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"state\")     resposeData.us_state = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"zip\")       resposeData.zipcode = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"country\")   resposeData.country = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"lat\")       resposeData.latitude = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"lon\")       resposeData.longitude = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"county\")    resposeData.county = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"grid\")      resposeData.gridsquare = decodeHtmlEntities(xml.readElementText().toUpper());\n            else if (elementName == \"efdate\")    resposeData.lic_year = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"qslmgr\")    resposeData.qsl_via = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"email\")     resposeData.email = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"GMTOffset\") resposeData.utc_offset = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"eqsl\")      resposeData.eqsl = (xml.readElementText() == \"1\") ? \"Y\" : \"N\";\n            else if (elementName == \"mqsl\")      resposeData.pqsl = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"cqzone\")    resposeData.cqz = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"ituzone\")   resposeData.ituz = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"born\")      resposeData.born = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"lotw\")      resposeData.lotw = (xml.readElementText() == \"1\") ? \"Y\" : \"N\";\n            else if (elementName == \"iota\")      resposeData.iota = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"nickname\")  resposeData.nick = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"url\")       resposeData.url = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"name_fmt\")  resposeData.name_fmt = decodeHtmlEntities(xml.readElementText());\n            else if (elementName == \"image\")     resposeData.image_url = decodeHtmlEntities(xml.readElementText());\n        }\n\n        if (!resposeData.call.isEmpty())\n            emit callsignResult(resposeData);\n\n        if (!queuedCallsign.isEmpty())\n            queryCallsign(queuedCallsign);\n    }\n\n    else\n\n    reply->deleteLater();\n}\n\n/* https://www.qrz.com/docs/logbook/QRZLogbookAPI.html */\n/* ??? QRZ Support all ADIF Fields ??? */\n\nQRZUploader::QRZUploader(QObject *parent) :\n    GenericQSOUploader(QStringList(), parent),\n    QRZBase(),\n    currentReply(nullptr),\n    cancelUpload(false)\n{\n    FCT_IDENTIFICATION;\n}\n\nQRZUploader::~QRZUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply->deleteLater();\n    }\n}\n\nvoid QRZUploader::uploadContact(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    //qCDebug(function_parameters) << record;\n\n    QByteArray data = generateADIF({record});\n    cancelUpload = false;\n    QString stationCallsign = record.value(\"station_callsign\").toString();\n    if ( stationCallsign.isEmpty() )\n        stationCallsign = record.value(\"operator\").toString();\n\n    qCDebug(runtime) << \"Using station Callsign\" << stationCallsign;\n\n    const QString &logbookAPIKey = (addlCallsign.contains(stationCallsign)) ? getLogbookAPIKey(stationCallsign)\n                                                                            : getLogbookAPIKey(getInternalAPIUsername());\n    actionInsert(logbookAPIKey, data, \"REPLACE\");\n    currentReply->setProperty(\"contactID\", record.value(\"id\"));\n}\n\nvoid QRZUploader::uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &)\n{\n    FCT_IDENTIFICATION;\n\n    if ( qsos.isEmpty() )\n    {\n        /* Nothing to do */\n        emit uploadFinished();\n        return;\n    }\n\n    cancelUpload = false;\n    queuedContacts4Upload = qsos;\n    addlCallsign.clear();\n    addlCallsign = QRZBase::getLogbookAPIAddlCallsigns();\n    uploadContact(queuedContacts4Upload.first());\n    queuedContacts4Upload.removeFirst();\n}\n\nvoid QRZUploader::actionInsert(const QString &logbookAPIKey, QByteArray& data, const QString &insertPolicy)\n{\n    FCT_IDENTIFICATION;\n\n    QUrlQuery params;\n    params.addQueryItem(\"KEY\", logbookAPIKey);\n    params.addQueryItem(\"ACTION\", \"INSERT\");\n    params.addQueryItem(\"OPTION\", insertPolicy);\n    params.addQueryItem(\"ADIF\", data.trimmed().toPercentEncoding());\n\n    QUrl url(API_LOGBOOK_URL);\n\n    QNetworkRequest request(url);\n    request.setHeader(QNetworkRequest::ContentTypeHeader, \"application/x-www-form-urlencoded\");\n    QString rheader = QString(\"QLog/%1\").arg(VERSION);\n    request.setRawHeader(\"User-Agent\", rheader.toUtf8());\n\n    qCDebug(runtime) << Data::safeQueryString(params);\n\n    if ( currentReply )\n        qCWarning(runtime) << \"processing a new request but the previous one hasn't been completed yet !!!\";\n\n    currentReply = getNetworkAccessManager()->post(request, params.query(QUrl::FullyEncoded).toUtf8());\n\n    currentReply->setProperty(\"messageType\", QVariant(\"actionsInsert\"));\n}\n\nvoid QRZUploader::abortRequest()\n{\n    FCT_IDENTIFICATION;\n\n    cancelUpload = true;\n    if ( currentReply )\n    {\n        currentReply->abort();\n        currentReply = nullptr;\n    }\n}\n\nvoid QRZUploader::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"QRZ.com error URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"QRZ.com error\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            emit uploadError(reply->errorString());\n            reply->deleteLater();\n        }\n\n        cancelUpload = true;\n        return;\n    }\n\n    const QString &messageType = reply->property(\"messageType\").toString();\n\n    qCDebug(runtime) << \"Received Message Type: \" << messageType;\n\n    /*****************/\n    /* actionsInsert */\n    /*****************/\n    if ( messageType == \"actionsInsert\")\n    {\n        const QString replayString(reply->readAll());\n        qCDebug(runtime) << replayString;\n\n        const QMap<QString, QString> &data = parseActionResponse(replayString);\n        const QString &status = data.value(\"RESULT\", \"FAILED\");\n\n        if ( status == \"OK\" || status == \"REPLACE\" )\n        {\n            qCDebug(runtime) << \"Confirmed Upload for QSO Id \" << reply->property(\"contactID\").toULongLong();\n            emit uploadedQSO(reply->property(\"contactID\").toULongLong());\n\n            if ( queuedContacts4Upload.isEmpty() )\n            {\n                cancelUpload = false;\n                emit uploadFinished();\n            }\n            else\n            {\n                if ( ! cancelUpload )\n                {\n                    uploadContact(queuedContacts4Upload.first());\n                    queuedContacts4Upload.removeFirst();\n                }\n            }\n        }\n        else\n        {\n            emit uploadError(data.value(\"REASON\", tr(\"General Error\")));\n            cancelUpload = false;\n        }\n    }\n    reply->deleteLater();\n}\n\nQMap<QString, QString> QRZUploader::parseActionResponse(const QString &responseString) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << responseString;\n\n    QMap<QString, QString> data;\n    const QStringList &parsedResponse = responseString.split(\"&\");\n\n    for ( const QString &param : parsedResponse )\n    {\n        QStringList parsedParams;\n        parsedParams << param.split(\"=\");\n\n        if ( parsedParams.count() == 1 )\n            data[parsedParams.at(0)] = QString();\n        else if ( parsedParams.count() >= 2 )\n            data[parsedParams.at(0)] = parsedParams.at(1);\n    }\n\n    return data;\n}\n"
  },
  {
    "path": "service/qrzcom/QRZ.h",
    "content": "#ifndef QLOG_SERVICE_QRZ_QRZ_H\n#define QLOG_SERVICE_QRZ_QRZ_H\n\n#include <QObject>\n#include <QString>\n#include <QSqlRecord>\n#include \"service/GenericCallbook.h\"\n#include \"service/GenericQSOUploader.h\"\n#include \"core/CredentialStore.h\"\n\nclass QNetworkAccessManager;\nclass QNetworkReply;\n\nclass QRZBase : public SecureServiceBase<QRZBase>\n{\nprotected:\n    const static QString SECURE_STORAGE_KEY;\n    const static QString SECURE_STORAGE_API_KEY;\n    const static QString CONFIG_USERNAME_API_CONST;\n\npublic:\n    explicit QRZBase() {};\n    virtual ~QRZBase() {};\n\n    DECLARE_SECURE_SERVICE(QRZBase);\n\n    static const QString getUsername();\n    static const QString getPasswd(const QString &username);\n    static void saveUsernamePassword(const QString&, const QString&);\n    static QString getInternalAPIUsername();\n    static const QString getLogbookAPIKey(const QString& username);\n    static const QStringList getLogbookAPIAddlCallsigns();\n    static void setLogbookAPIAddlCallsigns(const QStringList &list);\n    static void saveLogbookAPIKey(const QString& newKey, const QString &username);\n};\n\nclass QRZCallbook : public GenericCallbook, private QRZBase\n{\n    Q_OBJECT\n\npublic:\n    const static QString CALLBOOK_NAME;\n\n    explicit QRZCallbook(QObject *parent = nullptr);\n    virtual ~QRZCallbook();\n\n    QString getDisplayName() override;\n\npublic slots:\n    virtual void queryCallsign(const QString &callsign) override;\n    virtual void abortQuery() override;\n\nprotected:\n    virtual void processReply(QNetworkReply* reply) override;\n\nprivate:\n    QString sessionId;\n    QString queuedCallsign;\n    bool incorrectLogin;\n    QString lastSeenPassword;\n    QNetworkReply *currentReply;\n    const QString API_URL = \"https://xmldata.qrz.com/xml/current/\";\n\n    void authenticate();\n};\n\nclass QRZUploader : public GenericQSOUploader, private QRZBase\n{\n    Q_OBJECT\n\npublic:\n    explicit QRZUploader(QObject *parent = nullptr);\n    virtual ~QRZUploader();\n\n    void uploadContact(const QSqlRecord &record);\n    virtual void uploadQSOList(const QList<QSqlRecord>& qsos, const QVariantMap &addlParams) override;\n\npublic slots:\n    virtual void abortRequest() override;\n\nprotected:\n    virtual void processReply(QNetworkReply* reply) override;\n\nprivate:\n    QNetworkReply *currentReply;\n    QList<QSqlRecord> queuedContacts4Upload;\n    QStringList addlCallsign;\n    bool cancelUpload;\n    const QString API_LOGBOOK_URL = \"https://logbook.qrz.com/api\";\n\n    void actionInsert(const QString &logbookAPIKey, QByteArray& data, const QString &insertPolicy);\n    QMap<QString, QString> parseActionResponse(const QString&) const;\n};\n\n#endif // QLOG_SERVICE_QRZ_QRZ_H\n"
  },
  {
    "path": "tests/AlertEvaluatorTest/AlertEvaluatorTest.pro",
    "content": "QT += testlib core sql network widgets\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_alertevaluator\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_alertevaluator.cpp \\\n    ../../core/AlertEvaluator.cpp \\\n    ../../data/BandPlan.cpp\n\nHEADERS += \\\n    ../../core/AlertEvaluator.h \\\n    ../../data/DxSpot.h \\\n    ../../data/WsjtxEntry.h \\\n    ../../data/SpotAlert.h \\\n    ../../data/BandPlan.h\n"
  },
  {
    "path": "tests/AlertEvaluatorTest/tst_alertevaluator.cpp",
    "content": "#include <QtTest>\n#include <QLoggingCategory>\n#include <memory>\n\n#define private public\n#include \"core/AlertEvaluator.h\"\n#undef private\n\n#include \"data/SpotAlert.h\"\n#include \"data/WsjtxEntry.h\"\n#include \"data/DxSpot.h\"\n\nClubInfo::ClubInfo(const QString &callsign,\n                   const QString &ID,\n                   const QDate &validFrom,\n                   const QDate &validTo,\n                   const QString &club) :\n    callsign(callsign),\n    id(ID),\n    validFrom(validFrom),\n    validTo(validTo),\n    club(club)\n{\n}\n\nconst QString& ClubInfo::getCallsign() const\n{\n    return callsign;\n}\n\nconst QString& ClubInfo::getID() const\n{\n    return id;\n}\n\nconst QDate& ClubInfo::getValidFrom() const\n{\n    return validFrom;\n}\n\nconst QDate& ClubInfo::getValidTo() const\n{\n    return validTo;\n}\n\nconst QString& ClubInfo::getClubInfo() const\n{\n    return club;\n}\n\nstruct RuleSpec {\n    int source = SpotAlert::WSJTXCQSPOT;\n    bool enabled = true;\n    int dxLogStatusMap = DxccStatus::Worked;\n    QString mode = QStringLiteral(\"*\");\n    QString band = QStringLiteral(\"*\");\n    int dxCountry = 0;\n    int ituz = 0;\n    int cqz = 0;\n    bool pota = false;\n    bool sota = false;\n    bool iota = false;\n    bool wwff = false;\n    QString dxContinent = QStringLiteral(\"*\");\n    int spotterCountry = 0;\n    QString spotterContinent = QStringLiteral(\"*\");\n    QStringList dxMember = {QStringLiteral(\"*\")};\n    QString callsignRe = QStringLiteral(\".*\");\n    QString commentRe = QStringLiteral(\".*\");\n};\n\nstruct WsjtxSpec {\n    QString callsign = QStringLiteral(\"OK1TEST\");\n    QString message = QStringLiteral(\"CQ TEST\");\n    QString decodedMode = QStringLiteral(\"FT8\");\n    QString band = QStringLiteral(\"20m\");\n    int dxcc = 123;\n    int ituz = 28;\n    int cqz = 15;\n    QString cont = QStringLiteral(\"EU\");\n    int spotterDxcc = 45;\n    QString spotterCont = QStringLiteral(\"EU\");\n    int status = DxccStatus::Worked;\n    bool containsPOTA = false;\n    bool containsSOTA = false;\n    bool containsIOTA = false;\n    bool containsWWFF = false;\n    QStringList members;\n};\n\nstruct DxSpotSpec {\n    QString callsign = QStringLiteral(\"OK1TEST\");\n    QString comment = QStringLiteral(\"CQ TEST\");\n    QString modeGroupString = QStringLiteral(\"DIGITAL\");\n    QString band = QStringLiteral(\"20m\");\n    int dxcc = 123;\n    int ituz = 28;\n    int cqz = 15;\n    QString cont = QStringLiteral(\"EU\");\n    int spotterDxcc = 45;\n    QString spotterCont = QStringLiteral(\"EU\");\n    int status = DxccStatus::Worked;\n    bool containsPOTA = false;\n    bool containsSOTA = false;\n    bool containsIOTA = false;\n    bool containsWWFF = false;\n    QStringList members;\n};\n\nQ_DECLARE_METATYPE(RuleSpec)\nQ_DECLARE_METATYPE(WsjtxSpec)\nQ_DECLARE_METATYPE(DxSpotSpec)\n\nnamespace {\n\nstd::unique_ptr<AlertRule> makeRule(const RuleSpec &spec, int source)\n{\n    std::unique_ptr<AlertRule> rule(new AlertRule());\n    rule->ruleName = QStringLiteral(\"rule\");\n    rule->enabled = spec.enabled;\n    rule->sourceMap = source;\n    rule->dxCountry = spec.dxCountry;\n    rule->dxLogStatusMap = spec.dxLogStatusMap;\n    rule->dxContinent = spec.dxContinent;\n    rule->dxComment = spec.commentRe;\n    rule->dxMember = spec.dxMember;\n    rule->dxMemberSet = QSet<QString>(spec.dxMember.begin(), spec.dxMember.end());\n    rule->mode = spec.mode;\n    rule->band = spec.band;\n    rule->spotterCountry = spec.spotterCountry;\n    rule->spotterContinent = spec.spotterContinent;\n    rule->ituz = spec.ituz;\n    rule->cqz = spec.cqz;\n    rule->pota = spec.pota;\n    rule->sota = spec.sota;\n    rule->iota = spec.iota;\n    rule->wwff = spec.wwff;\n    rule->ruleValid = true;\n\n    rule->callsignRE.setPattern(spec.callsignRe);\n    rule->callsignRE.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    rule->commentRE.setPattern(spec.commentRe);\n    rule->commentRE.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    return rule;\n}\n\nWsjtxEntry makeWsjtxEntry(const WsjtxSpec &spec)\n{\n    WsjtxEntry entry;\n    entry.callsign = spec.callsign;\n    entry.decode.message = spec.message;\n    entry.decodedMode = spec.decodedMode;\n    entry.band = spec.band;\n    entry.dxcc.dxcc = spec.dxcc;\n    entry.dxcc.ituz = spec.ituz;\n    entry.dxcc.cqz = spec.cqz;\n    entry.dxcc.cont = spec.cont;\n    entry.dxcc_spotter.dxcc = spec.spotterDxcc;\n    entry.dxcc_spotter.cont = spec.spotterCont;\n    entry.status = static_cast<DxccStatus>(spec.status);\n    entry.containsPOTA = spec.containsPOTA;\n    entry.containsSOTA = spec.containsSOTA;\n    entry.containsIOTA = spec.containsIOTA;\n    entry.containsWWFF = spec.containsWWFF;\n    for (const QString &member : spec.members)\n    {\n        entry.callsign_member.append(ClubInfo(entry.callsign, QString(), QDate(), QDate(), member));\n    }\n    return entry;\n}\n\nDxSpot makeDxSpot(const DxSpotSpec &spec)\n{\n    DxSpot spot;\n    spot.callsign = spec.callsign;\n    spot.comment = spec.comment;\n    spot.modeGroupString = spec.modeGroupString;\n    spot.band = spec.band;\n    spot.dxcc.dxcc = spec.dxcc;\n    spot.dxcc.ituz = spec.ituz;\n    spot.dxcc.cqz = spec.cqz;\n    spot.dxcc.cont = spec.cont;\n    spot.dxcc_spotter.dxcc = spec.spotterDxcc;\n    spot.dxcc_spotter.cont = spec.spotterCont;\n    spot.status = static_cast<DxccStatus>(spec.status);\n    spot.containsPOTA = spec.containsPOTA;\n    spot.containsSOTA = spec.containsSOTA;\n    spot.containsIOTA = spec.containsIOTA;\n    spot.containsWWFF = spec.containsWWFF;\n    for (const QString &member : spec.members)\n    {\n        spot.callsign_member.append(ClubInfo(spot.callsign, QString(), QDate(), QDate(), member));\n    }\n    return spot;\n}\n}\n\nclass AlertEvaluatorTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void match_wsjtx_data();\n    void match_wsjtx();\n    void match_dxspot_data();\n    void match_dxspot();\n    void cross_valid_data();\n    void cross_valid();\n    void cross_valid2_data();\n    void cross_valid2();\n};\n\nvoid AlertEvaluatorTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid AlertEvaluatorTest::match_wsjtx_data()\n{\n    QTest::addColumn<RuleSpec>(\"rule\");\n    QTest::addColumn<WsjtxSpec>(\"input\");\n    QTest::addColumn<bool>(\"expected\");\n\n    /* Rule is disabled */\n    /* Test DXCC STATUS */\n    for (int bit = DxccStatus::NewEntity; bit <= DxccStatus::UnknownStatus; bit <<= 1)\n    {\n        RuleSpec rule;\n        rule.enabled = false;\n        rule.dxLogStatusMap = static_cast<DxccStatus>(bit);\n\n        for (int bit2 = DxccStatus::NewEntity; bit2 <= DxccStatus::UnknownStatus; bit2 <<= 1)\n        {\n            WsjtxSpec input;\n            input.status = static_cast<DxccStatus>(bit2);\n            QTest::addRow(\"wsjtx_disabled_%d_%d\", bit, bit2) << rule << input << false;\n        }\n    }\n\n    /* Rule is enable */\n    /* Test DXCC STATUS */\n    for (int bit = DxccStatus::NewEntity; bit <= DxccStatus::UnknownStatus; bit <<= 1)\n    {\n        RuleSpec rule;\n        rule.dxLogStatusMap = static_cast<DxccStatus>(bit);\n\n        for (int bit2 = DxccStatus::NewEntity; bit2 <= DxccStatus::UnknownStatus; bit2 <<= 1)\n        {\n            WsjtxSpec input;\n            input.status = static_cast<DxccStatus>(bit2);\n            QTest::addRow(\"wsjtx_DXstatus_%d_%d\", bit, bit2) << rule << input << (bit == bit2);\n        }\n    }\n\n    /* Test Country */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.dxCountry = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            WsjtxSpec input;\n            input.dxcc = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"wsjtx_DXCountry_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test Country */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.spotterCountry = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            WsjtxSpec input;\n            input.spotterDxcc = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"wsjtx_SpotterCountry_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test ITU  */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.ituz = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            WsjtxSpec input;\n            input.ituz = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"wsjtx_ITU_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test ITU  */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.cqz = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            WsjtxSpec input;\n            input.cqz = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"wsjtx_CQZ_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* POTA/SOTA/IOTA/WWFF setting */\n    for (int ruleMask = 0; ruleMask < 16; ++ruleMask)\n    {\n        for (int inputMask = 0; inputMask < 16; ++inputMask)\n        {\n\n            RuleSpec rule;\n            rule.pota = (ruleMask & 1) != 0;\n            rule.sota = (ruleMask & 2) != 0;\n            rule.iota = (ruleMask & 4) != 0;\n            rule.wwff = (ruleMask & 8) != 0;\n\n            WsjtxSpec in;\n            in.containsPOTA = (inputMask & 1) != 0;\n            in.containsSOTA = (inputMask & 2) != 0;\n            in.containsIOTA = (inputMask & 4) != 0;\n            in.containsWWFF = (inputMask & 8) != 0;\n\n            const bool expected =\n                (ruleMask == 0) ? true : ((inputMask & ruleMask) != 0);\n\n            QTest::newRow(\n                QString(\"wsjtx_ref_rule_0x%1_input_0x%2\")\n                    .arg(ruleMask, 2, 16, QLatin1Char('0'))\n                    .arg(inputMask, 2, 16, QLatin1Char('0'))\n                    .toUtf8().constData()\n            ) << rule << in << expected;\n        }\n    }\n\n    /* Callsign match */\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK2T\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TE\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK2T.*\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TE.*\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST\";\n\n        WsjtxSpec in;\n        in.callsign=\"OK1TEST/P\";\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST.*\";\n\n        WsjtxSpec in;\n        in.callsign=\"OK1TEST/P\";\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \".*TEST\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    /* DX Continent */\n    {\n        QStringList conts = {\"NA\", \"SA\", \"EU\", \"AF\", \"OC\", \"AS\", \"AN\"};\n\n        for ( const QString &c : conts )\n        {\n            RuleSpec rule;\n            rule.dxContinent = \"|\" + c;\n            for ( const QString &c1: conts )\n            {\n               WsjtxSpec in;\n               in.cont = c1;\n               QTest::newRow(QString(\"wsjtx_continents_%1_%2\").arg(rule.dxContinent,\n                                                                 in.cont).toUtf8().constData()\n                             ) << rule << in << (rule.dxContinent.contains(in.cont));\n            }\n        }\n    }\n\n    {\n        RuleSpec rule;\n        rule.dxContinent = \"|EU|NA\";\n\n        WsjtxSpec in;\n        in.cont = \"NA\";\n        QTest::newRow(QString(\"wsjtx_continents_%1_%2\").arg(rule.dxContinent,\n                                                          in.cont).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.dxContinent = \"|EU|NA\";\n\n        WsjtxSpec in;\n        in.cont = \"OC\";\n        QTest::newRow(QString(\"wsjtx_continents_%1_%2\").arg(rule.dxContinent,\n                                                          in.cont).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    /* Spotter Continent */\n    {\n        QStringList conts = {\"NA\", \"SA\", \"EU\", \"AF\", \"OC\", \"AS\", \"AN\"};\n\n        for ( const QString &c : conts )\n        {\n            RuleSpec rule;\n            rule.spotterContinent = \"|\" + c;\n            for ( const QString &c1: conts )\n            {\n               WsjtxSpec in;\n               in.spotterCont = c1;\n               QTest::newRow(QString(\"wsjtx_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                                 in.spotterCont).toUtf8().constData()\n                             ) << rule << in << (rule.spotterContinent.contains(in.spotterCont));\n            }\n        }\n    }\n\n    {\n        RuleSpec rule;\n        rule.spotterContinent = \"|EU|NA\";\n\n        WsjtxSpec in;\n        in.cont = \"NA\";\n        QTest::newRow(QString(\"wsjtx_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                          in.spotterCont).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.spotterContinent = \"|EU|NA\";\n\n        WsjtxSpec in;\n        in.spotterCont = \"OC\";\n        QTest::newRow(QString(\"wsjtx_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                          in.spotterCont).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    // message\n    {\n        RuleSpec rule;\n        rule.commentRe = \"TEST\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.message).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \"^TEST\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.message).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \".*TEST.*\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.message).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \".*TAST.*\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.message).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \"C.*TEST.*\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.message).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    // mode\n    {\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"FT4\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << true;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"FT2\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << true;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"FT8\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"FT4\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"FT2\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        WsjtxSpec in;\n        in.decodedMode = \"DIGITAL\";\n        QTest::newRow(QString(\"wsjtx_mode_%1_%2\").arg(rule.mode,\n                                                          in.decodedMode).toUtf8().constData()\n                      ) << rule << in << true;\n    }\n    // members\n    {\n        QStringList m1 = {\"A1\", \"A2\", \"B1\"};\n        QStringList m2 = {\"B2\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        WsjtxSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"wsjtx_members_notmatch\") << rule << in << false;\n    }\n\n    {\n        QStringList m1 = {\"A1\", \"A2\", \"B1\"};\n        QStringList m2 = {\"B2\", \"B1\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        WsjtxSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"wsjtx_members_match\") << rule << in << true;\n    }\n\n    {\n        QStringList m1 = {\"B1\"};\n        QStringList m2 = {\"B1\", \"B2\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        WsjtxSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"wsjtx_members_match2\") << rule << in << true;\n    }\n    // band\n    {\n        RuleSpec rule;\n        rule.band = \"|20m|60m\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << true;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|60m\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|120m\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|10m|20m|60m|80m|\";\n\n        WsjtxSpec in;\n        QTest::newRow(QString(\"wsjtx_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << true;\n    }\n}\n\nvoid AlertEvaluatorTest::match_wsjtx()\n{\n    QFETCH(RuleSpec, rule);\n    QFETCH(WsjtxSpec, input);\n    QFETCH(bool, expected);\n\n    auto alertRule = makeRule(rule, SpotAlert::WSJTXCQSPOT);\n    WsjtxEntry entry = makeWsjtxEntry(input);\n\n    QCOMPARE(alertRule->match(entry), expected);\n}\n\nvoid AlertEvaluatorTest::match_dxspot_data()\n{\n    QTest::addColumn<RuleSpec>(\"rule\");\n    QTest::addColumn<DxSpotSpec>(\"input\");\n    QTest::addColumn<bool>(\"expected\");\n\n    /* Rule is disabled */\n    /* Test DXCC STATUS */\n    for (int bit = DxccStatus::NewEntity; bit <= DxccStatus::UnknownStatus; bit <<= 1)\n    {\n        RuleSpec rule;\n        rule.enabled = false;\n        rule.dxLogStatusMap = static_cast<DxccStatus>(bit);\n\n        for (int bit2 = DxccStatus::NewEntity; bit2 <= DxccStatus::UnknownStatus; bit2 <<= 1)\n        {\n            DxSpotSpec input;\n            input.status = static_cast<DxccStatus>(bit2);\n            QTest::addRow(\"dxspot_disabled_%d_%d\", bit, bit2) << rule << input << false;\n        }\n    }\n\n    /* Rule is enable */\n    /* Test DXCC STATUS */\n    for (int bit = DxccStatus::NewEntity; bit <= DxccStatus::UnknownStatus; bit <<= 1)\n    {\n        RuleSpec rule;\n        rule.dxLogStatusMap = static_cast<DxccStatus>(bit);\n\n        for (int bit2 = DxccStatus::NewEntity; bit2 <= DxccStatus::UnknownStatus; bit2 <<= 1)\n        {\n            DxSpotSpec input;\n            input.status = static_cast<DxccStatus>(bit2);\n            QTest::addRow(\"dxspot_DXstatus_%d_%d\", bit, bit2) << rule << input << (bit == bit2);\n        }\n    }\n\n    /* Test Country */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.dxCountry = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            DxSpotSpec input;\n            input.dxcc = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"dxspot_DXCountry_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test Country */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.spotterCountry = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            DxSpotSpec input;\n            input.spotterDxcc = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"dxspot_SpotterCountry_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test ITU  */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.ituz = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            DxSpotSpec input;\n            input.ituz = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"dxspot_ITU_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* Test ITU  */\n    for (int x = 0; x <= 10; x++)\n    {\n        RuleSpec rule;\n        rule.cqz = x;\n\n        for (int y = 0; y <= 10; y++)\n        {\n            DxSpotSpec input;\n            input.cqz = y;\n            bool result = (x == 0) ? true : (x == y);    // country == 0 ->no filter;\n            QTest::addRow(\"dxspot_CQZ_%d_%d\", x, y) << rule << input << result;\n        }\n    }\n\n    /* POTA/SOTA/IOTA/WWFF setting */\n    for (int ruleMask = 0; ruleMask < 16; ++ruleMask)\n    {\n        for (int inputMask = 0; inputMask < 16; ++inputMask)\n        {\n\n            RuleSpec rule;\n            rule.pota = (ruleMask & 1) != 0;\n            rule.sota = (ruleMask & 2) != 0;\n            rule.iota = (ruleMask & 4) != 0;\n            rule.wwff = (ruleMask & 8) != 0;\n\n            DxSpotSpec in;\n            in.containsPOTA = (inputMask & 1) != 0;\n            in.containsSOTA = (inputMask & 2) != 0;\n            in.containsIOTA = (inputMask & 4) != 0;\n            in.containsWWFF = (inputMask & 8) != 0;\n\n            const bool expected =\n                (ruleMask == 0) ? true : ((inputMask & ruleMask) != 0);\n\n            QTest::newRow(\n                QString(\"dxspot_ref_rule_0x%1_input_0x%2\")\n                    .arg(ruleMask, 2, 16, QLatin1Char('0'))\n                    .arg(inputMask, 2, 16, QLatin1Char('0'))\n                    .toUtf8().constData()\n            ) << rule << in << expected;\n        }\n    }\n\n    /* Callsign match */\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK2T\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TE\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK2T.*\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TE.*\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST\";\n\n        DxSpotSpec in;\n        in.callsign=\"OK1TEST/P\";\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \"OK1TEST.*\";\n\n        DxSpotSpec in;\n        in.callsign=\"OK1TEST/P\";\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.callsignRe = \".*TEST\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_callsign_%1_%2\").arg(rule.callsignRe,\n                                                          in.callsign).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    /* DX Continent */\n    {\n        QStringList conts = {\"NA\", \"SA\", \"EU\", \"AF\", \"OC\", \"AS\", \"AN\"};\n\n        for ( const QString &c : conts )\n        {\n            RuleSpec rule;\n            rule.dxContinent = \"|\" + c;\n            for ( const QString &c1: conts )\n            {\n               DxSpotSpec in;\n               in.cont = c1;\n               QTest::newRow(QString(\"dxspot_continents_%1_%2\").arg(rule.dxContinent,\n                                                                 in.cont).toUtf8().constData()\n                             ) << rule << in << (rule.dxContinent.contains(in.cont));\n            }\n        }\n    }\n\n    {\n        RuleSpec rule;\n        rule.dxContinent = \"|EU|NA\";\n\n        DxSpotSpec in;\n        in.cont = \"NA\";\n        QTest::newRow(QString(\"dxspot_continents_%1_%2\").arg(rule.dxContinent,\n                                                          in.cont).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.dxContinent = \"|EU|NA\";\n\n        DxSpotSpec in;\n        in.cont = \"OC\";\n        QTest::newRow(QString(\"dxspot_continents_%1_%2\").arg(rule.dxContinent,\n                                                          in.cont).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    /* Spotter Continent */\n    {\n        QStringList conts = {\"NA\", \"SA\", \"EU\", \"AF\", \"OC\", \"AS\", \"AN\"};\n\n        for ( const QString &c : conts )\n        {\n            RuleSpec rule;\n            rule.spotterContinent = \"|\" + c;\n            for ( const QString &c1: conts )\n            {\n               DxSpotSpec in;\n               in.spotterCont = c1;\n               QTest::newRow(QString(\"dxspot_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                                 in.spotterCont).toUtf8().constData()\n                             ) << rule << in << (rule.spotterContinent.contains(in.spotterCont));\n            }\n        }\n    }\n\n    {\n        RuleSpec rule;\n        rule.spotterContinent = \"|EU|NA\";\n\n        DxSpotSpec in;\n        in.spotterCont = \"NA\";\n        QTest::newRow(QString(\"dxspot_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                          in.spotterCont).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.spotterContinent = \"|EU|NA\";\n\n        DxSpotSpec in;\n        in.spotterCont = \"OC\";\n        QTest::newRow(QString(\"dxspot_spottercontinents_%1_%2\").arg(rule.spotterContinent,\n                                                          in.spotterCont).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    // comment\n    {\n        RuleSpec rule;\n        rule.commentRe = \"TEST\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.comment).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \"^TEST\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.comment).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \".*TEST.*\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.comment).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \".*TAST.*\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.comment).toUtf8().constData()\n                      ) << rule << in << false;\n\n    }\n\n    {\n        RuleSpec rule;\n        rule.commentRe = \"C.*TEST.*\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_comment_%1_%2\").arg(rule.commentRe,\n                                                          in.comment).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    // mode\n    {\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(QString(\"dxspot_mode_%1_%2\").arg(rule.mode,\n                                                          in.modeGroupString).toUtf8().constData()\n                      ) << rule << in << true;\n\n    }\n\n    {\n        // FT4 spot: at a FT4 frequency the band plan assigns modeGroupString \"FTx\"\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(\"dxspot_mode_|FTx_FT4\") << rule << in << true;\n    }\n\n    {\n        // FT2 spot: at a FT2 frequency the band plan assigns modeGroupString \"FTx\"\n        RuleSpec rule;\n        rule.mode = \"|FTx\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(\"dxspot_mode_|FTx_FT2\") << rule << in << true;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(QString(\"dxspot_mode_%1_%2\").arg(rule.mode,\n                                                          in.modeGroupString).toUtf8().constData()\n                      ) << rule << in << false;\n    }\n\n    {\n        // FT4 spot (modeGroupString \"FTx\") does not match DIGITAL filter\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(\"dxspot_mode_|DIGITAL_FT4\") << rule << in << false;\n    }\n\n    {\n        // FT2 spot (modeGroupString \"FTx\") does not match DIGITAL filter\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"FTx\";\n        QTest::newRow(\"dxspot_mode_|DIGITAL_FT2\") << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.mode = \"|DIGITAL\";\n\n        DxSpotSpec in;\n        in.modeGroupString = \"DIGITAL\";\n        QTest::newRow(QString(\"dxspot_mode_%1_%2\").arg(rule.mode,\n                                                          in.modeGroupString).toUtf8().constData()\n                      ) << rule << in << true;\n    }\n    // members\n    {\n        QStringList m1 = {\"A1\", \"A2\", \"B1\"};\n        QStringList m2 = {\"B2\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        DxSpotSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"dxspot_members_notmatch\") << rule << in << false;\n    }\n\n    {\n        QStringList m1 = {\"A1\", \"A2\", \"B1\"};\n        QStringList m2 = {\"B2\", \"B1\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        DxSpotSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"dxspot_members_match\") << rule << in << true;\n    }\n\n    {\n        QStringList m1 = {\"B1\"};\n        QStringList m2 = {\"B1\", \"B2\"};\n\n        RuleSpec rule;\n        rule.dxMember = m1;\n        DxSpotSpec in;\n        in.members = m2;\n\n        QTest::newRow(\"dxspot_members_match2\") << rule << in << true;\n    }\n    // band\n    {\n        RuleSpec rule;\n        rule.band = \"|20m|60m\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << true;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|60m\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|120m\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << false;\n    }\n\n    {\n        RuleSpec rule;\n        rule.band = \"|10m|20m|60m|80m|\";\n\n        DxSpotSpec in;\n        QTest::newRow(QString(\"dxspot_band_%1_%2\").arg(rule.band,\n                                                      in.band).toUtf8().constData()) << rule << in << true;\n    }\n}\n\nvoid AlertEvaluatorTest::match_dxspot()\n{\n    QFETCH(RuleSpec, rule);\n    QFETCH(DxSpotSpec, input);\n    QFETCH(bool, expected);\n\n    auto alertRule = makeRule(rule, SpotAlert::DXSPOT);\n    DxSpot spot = makeDxSpot(input);\n\n    QCOMPARE(alertRule->match(spot), expected);\n}\n\nvoid AlertEvaluatorTest::cross_valid_data()\n{\n    QTest::addColumn<RuleSpec>(\"rule\");\n    QTest::addColumn<DxSpotSpec>(\"input\");\n    QTest::addColumn<bool>(\"expected\");\n\n    {\n        RuleSpec rule;\n        DxSpotSpec in;\n        QTest::newRow(\"Cross\") << rule << in << false;\n    }\n}\n\nvoid AlertEvaluatorTest::cross_valid()\n{\n    QFETCH(RuleSpec, rule);\n    QFETCH(DxSpotSpec, input);\n    QFETCH(bool, expected);\n\n    auto alertRule = makeRule(rule, SpotAlert::WSJTXCQSPOT);\n    DxSpot spot = makeDxSpot(input);\n\n    QCOMPARE(alertRule->match(spot), expected);\n}\n\nvoid AlertEvaluatorTest::cross_valid2_data()\n{\n    QTest::addColumn<RuleSpec>(\"rule\");\n    QTest::addColumn<WsjtxSpec>(\"input\");\n    QTest::addColumn<bool>(\"expected\");\n\n    {\n        RuleSpec rule;\n        WsjtxSpec in;\n        QTest::newRow(\"Cross2\") << rule << in << false;\n    }\n}\n\nvoid AlertEvaluatorTest::cross_valid2()\n{\n    QFETCH(RuleSpec, rule);\n    QFETCH(WsjtxSpec, input);\n    QFETCH(bool, expected);\n\n    auto alertRule = makeRule(rule, SpotAlert::DXSPOT);\n    WsjtxEntry spot = makeWsjtxEntry(input);\n\n    QCOMPARE(alertRule->match(spot), expected);\n}\n\n\nQTEST_APPLESS_MAIN(AlertEvaluatorTest)\n\n#include \"tst_alertevaluator.moc\"\n"
  },
  {
    "path": "tests/BandPlanTest/BandPlanTest.pro",
    "content": "QT += testlib core sql\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_bandplan\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_bandplan.cpp \\\n    ../../data/BandPlan.cpp\n\nHEADERS += \\\n    ../../data/BandPlan.h \\\n    ../../data/Band.h\n"
  },
  {
    "path": "tests/BandPlanTest/tst_bandplan.cpp",
    "content": "#include <QtTest>\n#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QSqlError>\n\n#include \"data/BandPlan.h\"\n\nnamespace {\nQString lastErrorString(const QSqlQuery &query)\n{\n    return query.lastError().isValid() ? query.lastError().text() : QString();\n}\n}\n\nclass BandPlanTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n\n    void freq2BandMode_data();\n    void freq2BandMode();\n    void freq2BandModeGroupString_data();\n    void freq2BandModeGroupString();\n    void freq2ExpectedMode_data();\n    void freq2ExpectedMode();\n    void freq2Band_data();\n    void freq2Band();\n    void bandsList_onlyDXCC();\n    void modeToDXCCModeGroup_data();\n    void modeToDXCCModeGroup();\n    void isFTxMode_data();\n    void isFTxMode();\n    void isFTxBandMode_data();\n    void isFTxBandMode();\n};\n\nvoid BandPlanTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n\n    qRegisterMetaType<BandPlan::BandPlanMode>(\"BandPlan::BandPlanMode\");\n\n    QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\");\n    db.setDatabaseName(\":memory:\");\n    QVERIFY(db.open());\n\n    QSqlQuery createBands;\n    QVERIFY2(createBands.exec(\"CREATE TABLE bands (\"\n                              \"id INTEGER PRIMARY KEY AUTOINCREMENT,\"\n                              \"name TEXT UNIQUE NOT NULL,\"\n                              \"start_freq FLOAT,\"\n                              \"end_freq FLOAT,\"\n                              \"enabled BOOLEAN,\"\n                              \"sat_designator TEXT)\"),\n             qPrintable(lastErrorString(createBands)));\n\n    struct BandRow {\n        const char *name;\n        double start;\n        double end;\n        int enabled;\n    };\n\n    const BandRow bandRows[] = {\n        {\"2190m\", 0.134, 0.140, 1},\n        {\"630m\", 0.470, 0.490, 1},\n        {\"160m\", 1.800, 2.000, 1},\n        {\"80m\", 3.500, 4.000, 1},\n        {\"60m\", 5.350, 5.450, 1},\n        {\"40m\", 7.000, 7.300, 1},\n        {\"30m\", 10.100, 10.150, 1},\n        {\"20m\", 14.000, 14.350, 1},\n        {\"17m\", 18.068, 18.168, 1},\n        {\"15m\", 21.000, 21.450, 1},\n        {\"12m\", 24.890, 24.990, 1},\n        {\"10m\", 28.000, 29.700, 1},\n        {\"6m\", 50.000, 54.000, 1},\n        {\"4m\", 70.000, 71.000, 1},\n        {\"2m\", 144.000, 148.000, 1},\n        {\"1.25m\", 222.000, 225.000, 1},\n        {\"70cm\", 420.000, 450.000, 1},\n        {\"33cm\", 902.000, 928.000, 1},\n        {\"23cm\", 1240.000, 1300.000, 1},\n        {\"13cm\", 2300.000, 2450.000, 1},\n        {\"3cm\", 10000.000, 11000.000, 1}\n    };\n\n    QSqlQuery insertBand;\n    QVERIFY2(insertBand.prepare(\"INSERT INTO bands \"\n                                \"(name, start_freq, end_freq, enabled, sat_designator) \"\n                                \"VALUES (?, ?, ?, ?, ?)\"),\n             qPrintable(lastErrorString(insertBand)));\n    for (const BandRow &row : bandRows)\n    {\n        insertBand.bindValue(0, QString::fromLatin1(row.name));\n        insertBand.bindValue(1, row.start);\n        insertBand.bindValue(2, row.end);\n        insertBand.bindValue(3, row.enabled);\n        insertBand.bindValue(4, QString());\n        QVERIFY2(insertBand.exec(), qPrintable(lastErrorString(insertBand)));\n    }\n\n    QSqlQuery createModes;\n    QVERIFY2(createModes.exec(\"CREATE TABLE modes (\"\n                              \"name TEXT PRIMARY KEY,\"\n                              \"dxcc TEXT NOT NULL)\"),\n             qPrintable(lastErrorString(createModes)));\n\n    struct ModeRow { const char *name; const char *dxcc; };\n    const ModeRow modeRows[] = {\n        {\"CW\", \"CW\"},\n        {\"SSB\", \"PHONE\"},\n        {\"FT8\", \"DIGITAL\"},\n        {\"FT4\", \"DIGITAL\"},\n        {\"FT2\", \"DIGITAL\"},\n        {\"RTTY\", \"DIGITAL\"}\n    };\n\n    QSqlQuery insertMode;\n    QVERIFY2(insertMode.prepare(\"INSERT INTO modes (name, dxcc) VALUES (?, ?)\"),\n             qPrintable(lastErrorString(insertMode)));\n    for (const ModeRow &row : modeRows)\n    {\n        insertMode.bindValue(0, QString::fromLatin1(row.name));\n        insertMode.bindValue(1, QString::fromLatin1(row.dxcc));\n        QVERIFY2(insertMode.exec(), qPrintable(lastErrorString(insertMode)));\n    }\n}\n\nvoid BandPlanTest::cleanupTestCase()\n{\n    const QString connectionName = QString::fromLatin1(QSqlDatabase::defaultConnection);\n    {\n        QSqlDatabase db = QSqlDatabase::database();\n        if (db.isValid())\n        {\n            db.close();\n        }\n    }\n    if (QSqlDatabase::contains(connectionName))\n    {\n        QSqlDatabase::removeDatabase(connectionName);\n    }\n}\n\nvoid BandPlanTest::freq2BandMode_data()\n{\n    QTest::addColumn<double>(\"frequency\");\n    QTest::addColumn<BandPlan::BandPlanMode>(\"expectedMode\");\n\n    QTest::newRow(\"cw\") << 14.0 << BandPlan::BAND_MODE_CW;\n    QTest::newRow(\"digital\") << 14.071 << BandPlan::BAND_MODE_DIGITAL;\n    QTest::newRow(\"ft8\") << 14.074 << BandPlan::BAND_MODE_FT8;\n    QTest::newRow(\"usb\") << 14.200 << BandPlan::BAND_MODE_USB;\n    QTest::newRow(\"out_of_band\") << 1.0 << BandPlan::BAND_MODE_PHONE;\n    QTest::newRow(\"negative\") << -1.0 << BandPlan::BAND_MODE_PHONE;\n}\n\nvoid BandPlanTest::freq2BandMode()\n{\n    QFETCH(double, frequency);\n    QFETCH(BandPlan::BandPlanMode, expectedMode);\n\n    QCOMPARE(BandPlan::freq2BandMode(frequency), expectedMode);\n}\n\nvoid BandPlanTest::freq2BandModeGroupString_data()\n{\n    QTest::addColumn<double>(\"frequency\");\n    QTest::addColumn<QString>(\"expectedGroup\");\n\n    QTest::newRow(\"cw\") << 14.0 << QStringLiteral(\"CW\");\n    QTest::newRow(\"digital\") << 14.071 << QStringLiteral(\"DIGITAL\");\n    QTest::newRow(\"ft8\") << 14.074 << QStringLiteral(\"FTx\");\n    QTest::newRow(\"phone\") << 14.200 << QStringLiteral(\"PHONE\");\n    QTest::newRow(\"out_of_band\") << 1.0 << QStringLiteral(\"PHONE\");\n    QTest::newRow(\"negative\") << -1.0 << QStringLiteral(\"PHONE\");\n}\n\nvoid BandPlanTest::freq2BandModeGroupString()\n{\n    QFETCH(double, frequency);\n    QFETCH(QString, expectedGroup);\n\n    QCOMPARE(BandPlan::freq2BandModeGroupString(frequency), expectedGroup);\n}\n\nvoid BandPlanTest::freq2ExpectedMode_data()\n{\n    QTest::addColumn<double>(\"frequency\");\n    QTest::addColumn<QString>(\"expectedMode\");\n    QTest::addColumn<QString>(\"expectedSubmode\");\n\n    QTest::newRow(\"cw\") << 14.0 << QStringLiteral(\"CW\") << QString();\n    QTest::newRow(\"digital_usb\") << 14.071 << QStringLiteral(\"SSB\") << QStringLiteral(\"USB\");\n    QTest::newRow(\"ft8\") << 14.074 << QStringLiteral(\"FT8\") << QString();\n    QTest::newRow(\"ft4\") << 14.081 << QStringLiteral(\"MFSK\") << QStringLiteral(\"FT4\");\n    QTest::newRow(\"usb_voice\") << 14.200 << QStringLiteral(\"SSB\") << QStringLiteral(\"USB\");\n}\n\nvoid BandPlanTest::freq2ExpectedMode()\n{\n    QFETCH(double, frequency);\n    QFETCH(QString, expectedMode);\n    QFETCH(QString, expectedSubmode);\n\n    QString submode;\n    QCOMPARE(BandPlan::freq2ExpectedMode(frequency, submode), expectedMode);\n    QCOMPARE(submode, expectedSubmode);\n}\n\nvoid BandPlanTest::freq2Band_data()\n{\n    QTest::addColumn<double>(\"frequency\");\n    QTest::addColumn<QString>(\"expectedBand\");\n\n    const struct Case { double freq; const char *name; } cases[] = {\n        {0.136, \"2190m\"},\n        {0.473, \"630m\"},\n        {1.9, \"160m\"},\n        {3.6, \"80m\"},\n        {5.36, \"60m\"},\n        {7.1, \"40m\"},\n        {10.11, \"30m\"},\n        {14.2, \"20m\"},\n        {18.1, \"17m\"},\n        {21.1, \"15m\"},\n        {24.9, \"12m\"},\n        {28.1, \"10m\"},\n        {50.1, \"6m\"},\n        {70.1, \"4m\"},\n        {144.1, \"2m\"},\n        {222.1, \"1.25m\"},\n        {430.1, \"70cm\"},\n        {902.1, \"33cm\"},\n        {1240.1, \"23cm\"}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(QByteArray::number(c.freq).constData())\n            << c.freq\n            << QString::fromLatin1(c.name);\n    }\n}\n\nvoid BandPlanTest::freq2Band()\n{\n    QFETCH(double, frequency);\n    QFETCH(QString, expectedBand);\n\n    const Band band = BandPlan::freq2Band(frequency);\n    QCOMPARE(band.name, expectedBand);\n}\n\nvoid BandPlanTest::bandsList_onlyDXCC()\n{\n    const QList<Band> bands = BandPlan::bandsList(true);\n    QStringList bandNames;\n    for (const Band &band : bands)\n    {\n        bandNames << band.name;\n    }\n\n    const QStringList expected = {\n        QStringLiteral(\"160m\"),\n        QStringLiteral(\"80m\"),\n        QStringLiteral(\"40m\"),\n        QStringLiteral(\"30m\"),\n        QStringLiteral(\"20m\"),\n        QStringLiteral(\"17m\"),\n        QStringLiteral(\"15m\"),\n        QStringLiteral(\"12m\"),\n        QStringLiteral(\"10m\"),\n        QStringLiteral(\"6m\"),\n        QStringLiteral(\"2m\"),\n        QStringLiteral(\"70cm\"),\n        QStringLiteral(\"23cm\"),\n        QStringLiteral(\"13cm\"),\n        QStringLiteral(\"3cm\")\n    };\n\n    QCOMPARE(bandNames, expected);\n}\n\nvoid BandPlanTest::modeToDXCCModeGroup_data()\n{\n    QTest::addColumn<QString>(\"mode\");\n    QTest::addColumn<QString>(\"expectedGroup\");\n\n    QTest::newRow(\"ssb\") << QStringLiteral(\"SSB\") << QStringLiteral(\"PHONE\");\n    QTest::newRow(\"cw\") << QStringLiteral(\"CW\") << QStringLiteral(\"CW\");\n    QTest::newRow(\"ft8\") << QStringLiteral(\"FT8\") << QStringLiteral(\"DIGITAL\");\n    QTest::newRow(\"ft4\") << QStringLiteral(\"FT4\") << QStringLiteral(\"DIGITAL\");\n    QTest::newRow(\"ft2\") << QStringLiteral(\"FT2\") << QStringLiteral(\"DIGITAL\");\n    QTest::newRow(\"rtty\") << QStringLiteral(\"RTTY\") << QStringLiteral(\"DIGITAL\");\n}\n\nvoid BandPlanTest::modeToDXCCModeGroup()\n{\n    QFETCH(QString, mode);\n    QFETCH(QString, expectedGroup);\n\n    QCOMPARE(BandPlan::modeToDXCCModeGroup(mode), expectedGroup);\n}\n\nvoid BandPlanTest::isFTxMode_data()\n{\n    QTest::addColumn<QString>(\"mode\");\n    QTest::addColumn<bool>(\"expected\");\n\n    QTest::newRow(\"ft8\")  << QStringLiteral(\"FT8\")  << true;\n    QTest::newRow(\"ft4\")  << QStringLiteral(\"FT4\")  << true;\n    QTest::newRow(\"ft2\")  << QStringLiteral(\"FT2\")  << true;\n    QTest::newRow(\"cw\")   << QStringLiteral(\"CW\")   << false;\n    QTest::newRow(\"rtty\") << QStringLiteral(\"RTTY\") << false;\n    QTest::newRow(\"ft\")   << QStringLiteral(\"FT\")   << false;\n}\n\nvoid BandPlanTest::isFTxMode()\n{\n    QFETCH(QString, mode);\n    QFETCH(bool, expected);\n\n    QCOMPARE(BandPlan::isFTxMode(mode), expected);\n}\n\nvoid BandPlanTest::isFTxBandMode_data()\n{\n    QTest::addColumn<BandPlan::BandPlanMode>(\"mode\");\n    QTest::addColumn<bool>(\"expected\");\n\n    QTest::newRow(\"ft8\")     << BandPlan::BAND_MODE_FT8     << true;\n    QTest::newRow(\"ft4\")     << BandPlan::BAND_MODE_FT4     << true;\n    QTest::newRow(\"ft2\")     << BandPlan::BAND_MODE_FT2     << true;\n    QTest::newRow(\"cw\")      << BandPlan::BAND_MODE_CW      << false;\n    QTest::newRow(\"digital\") << BandPlan::BAND_MODE_DIGITAL << false;\n    QTest::newRow(\"phone\")   << BandPlan::BAND_MODE_PHONE   << false;\n}\n\nvoid BandPlanTest::isFTxBandMode()\n{\n    QFETCH(BandPlan::BandPlanMode, mode);\n    QFETCH(bool, expected);\n\n    QCOMPARE(BandPlan::isFTxBandMode(mode), expected);\n}\n\nQTEST_MAIN(BandPlanTest)\n\n#include \"tst_bandplan.moc\"\n"
  },
  {
    "path": "tests/CallsignTest/CallsignTest.pro",
    "content": "QT += testlib core\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_callsign\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_callsign.cpp \\\n    ../../data/Callsign.cpp\n\nHEADERS += \\\n    ../../data/Callsign.h \\\n    generated_cases.h\n"
  },
  {
    "path": "tests/CallsignTest/generated_cases.h",
    "content": "#pragma once\n\nstruct ParseCase { const char *name; const char *callsign; bool valid; const char *normalized; const char *host; const char *hostDelim; const char *base; const char *basePrefix; const char *basePrefixNumber; const char *suffix; const char *suffixDelim; const char *wpx; };\nstatic const ParseCase kParseCases[] = {\n    {\"Callsign empty\", \"\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC\", \"ABC\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC/1\", \"ABC/1\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC/P\", \"ABC/P\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign 1/ABC\", \"1/ABC\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign P/ABC\", \"P/ABC\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign #ABC\", \"#ABC\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC$\", \"ABC$\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC AB\", \"ABC AB\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign 12345\", \"12345\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign INVALID\", \"INVALID\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC@123.AA\", \"ABC@123.AA\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign ABC12AA\", \"ABC12AA\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign AB1234\", \"AB1234\", false, \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\"},\n    {\"Callsign OK1ABC\", \"OK1ABC\", true, \"OK1ABC\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"OK1\"},\n    {\"Callsign OK10ABC\", \"OK10ABC\", true, \"OK10ABC\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"\", \"\", \"OK10\"},\n    {\"Callsign OK100ABC\", \"OK100ABC\", true, \"OK100ABC\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"\", \"\", \"OK100\"},\n    {\"Callsign OK2ABC\", \"OK2ABC\", true, \"OK2ABC\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"\", \"\", \"OK2\"},\n    {\"Callsign 9A1ABC\", \"9A1ABC\", true, \"9A1ABC\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"\", \"\", \"9A1\"},\n    {\"Callsign 9A12ABC\", \"9A12ABC\", true, \"9A12ABC\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"\", \"\", \"9A12\"},\n    {\"Callsign A12ABC\", \"A12ABC\", true, \"A12ABC\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"\", \"\", \"A12\"},\n    {\"Callsign OK1abc\", \"OK1abc\", true, \"OK1ABC\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"OK1\"},\n    {\"Callsign ok10ABC\", \"ok10ABC\", true, \"OK10ABC\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"\", \"\", \"OK10\"},\n    {\"Callsign ok100abc\", \"ok100abc\", true, \"OK100ABC\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"\", \"\", \"OK100\"},\n    {\"Callsign oK2ABc\", \"oK2ABc\", true, \"OK2ABC\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"\", \"\", \"OK2\"},\n    {\"Callsign 9a1ABC\", \"9a1ABC\", true, \"9A1ABC\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"\", \"\", \"9A1\"},\n    {\"Callsign 9A12AbC\", \"9A12AbC\", true, \"9A12ABC\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"\", \"\", \"9A12\"},\n    {\"Callsign A12ABc\", \"A12ABc\", true, \"A12ABC\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"\", \"\", \"A12\"},\n    {\"Callsign OK1ABC/P\", \"OK1ABC/P\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK1ABC/p\", \"OK1ABC/p\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK1aBC/p\", \"OK1aBC/p\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK10ABC/P\", \"OK10ABC/P\", true, \"OK10ABC/P\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"P\", \"/P\", \"OK10\"},\n    {\"Callsign OK100ABC/P\", \"OK100ABC/P\", true, \"OK100ABC/P\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"P\", \"/P\", \"OK100\"},\n    {\"Callsign OK2ABC/P\", \"OK2ABC/P\", true, \"OK2ABC/P\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"P\", \"/P\", \"OK2\"},\n    {\"Callsign 9A1ABC/P\", \"9A1ABC/P\", true, \"9A1ABC/P\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"P\", \"/P\", \"9A1\"},\n    {\"Callsign 9A12ABC/P\", \"9A12ABC/P\", true, \"9A12ABC/P\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"P\", \"/P\", \"9A12\"},\n    {\"Callsign A12ABC/P\", \"A12ABC/P\", true, \"A12ABC/P\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"P\", \"/P\", \"A12\"},\n    {\"Callsign OK1ABC/A\", \"OK1ABC/A\", true, \"OK1ABC/A\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"A\", \"/A\", \"OK1\"},\n    {\"Callsign OK1ABC/a\", \"OK1ABC/a\", true, \"OK1ABC/A\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"A\", \"/A\", \"OK1\"},\n    {\"Callsign OK1aBC/a\", \"OK1aBC/a\", true, \"OK1ABC/A\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"A\", \"/A\", \"OK1\"},\n    {\"Callsign OK10ABC/A\", \"OK10ABC/A\", true, \"OK10ABC/A\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"A\", \"/A\", \"OK10\"},\n    {\"Callsign OK100ABC/A\", \"OK100ABC/A\", true, \"OK100ABC/A\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"A\", \"/A\", \"OK100\"},\n    {\"Callsign OK2ABC/A\", \"OK2ABC/A\", true, \"OK2ABC/A\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"A\", \"/A\", \"OK2\"},\n    {\"Callsign 9A1ABC/A\", \"9A1ABC/A\", true, \"9A1ABC/A\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"A\", \"/A\", \"9A1\"},\n    {\"Callsign 9A12ABC/A\", \"9A12ABC/A\", true, \"9A12ABC/A\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"A\", \"/A\", \"9A12\"},\n    {\"Callsign A12ABC/A\", \"A12ABC/A\", true, \"A12ABC/A\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"A\", \"/A\", \"A12\"},\n    {\"Callsign OK1ABC/AM\", \"OK1ABC/AM\", true, \"OK1ABC/AM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"AM\", \"/AM\", \"OK1\"},\n    {\"Callsign OK1ABC/AM\", \"OK1ABC/AM\", true, \"OK1ABC/AM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"AM\", \"/AM\", \"OK1\"},\n    {\"Callsign OK1aBC/AM\", \"OK1aBC/AM\", true, \"OK1ABC/AM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"AM\", \"/AM\", \"OK1\"},\n    {\"Callsign OK10ABC/AM\", \"OK10ABC/AM\", true, \"OK10ABC/AM\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"AM\", \"/AM\", \"OK10\"},\n    {\"Callsign OK100ABC/AM\", \"OK100ABC/AM\", true, \"OK100ABC/AM\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"AM\", \"/AM\", \"OK100\"},\n    {\"Callsign OK2ABC/AM\", \"OK2ABC/AM\", true, \"OK2ABC/AM\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"AM\", \"/AM\", \"OK2\"},\n    {\"Callsign 9A1ABC/AM\", \"9A1ABC/AM\", true, \"9A1ABC/AM\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"AM\", \"/AM\", \"9A1\"},\n    {\"Callsign 9A12ABC/AM\", \"9A12ABC/AM\", true, \"9A12ABC/AM\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"AM\", \"/AM\", \"9A12\"},\n    {\"Callsign A12ABC/AM\", \"A12ABC/AM\", true, \"A12ABC/AM\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"AM\", \"/AM\", \"A12\"},\n    {\"Callsign OK1ABC/M\", \"OK1ABC/M\", true, \"OK1ABC/M\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"M\", \"/M\", \"OK1\"},\n    {\"Callsign OK1ABC/M\", \"OK1ABC/M\", true, \"OK1ABC/M\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"M\", \"/M\", \"OK1\"},\n    {\"Callsign OK1aBC/M\", \"OK1aBC/M\", true, \"OK1ABC/M\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"M\", \"/M\", \"OK1\"},\n    {\"Callsign OK10ABC/M\", \"OK10ABC/M\", true, \"OK10ABC/M\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"M\", \"/M\", \"OK10\"},\n    {\"Callsign OK100ABC/M\", \"OK100ABC/M\", true, \"OK100ABC/M\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"M\", \"/M\", \"OK100\"},\n    {\"Callsign OK2ABC/M\", \"OK2ABC/M\", true, \"OK2ABC/M\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"M\", \"/M\", \"OK2\"},\n    {\"Callsign 9A1ABC/M\", \"9A1ABC/M\", true, \"9A1ABC/M\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"M\", \"/M\", \"9A1\"},\n    {\"Callsign 9A12ABC/M\", \"9A12ABC/M\", true, \"9A12ABC/M\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"M\", \"/M\", \"9A12\"},\n    {\"Callsign A12ABC/M\", \"A12ABC/M\", true, \"A12ABC/M\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"M\", \"/M\", \"A12\"},\n    {\"Callsign OK1ABC/MM\", \"OK1ABC/MM\", true, \"OK1ABC/MM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"MM\", \"/MM\", \"OK1\"},\n    {\"Callsign OK1ABC/MM\", \"OK1ABC/MM\", true, \"OK1ABC/MM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"MM\", \"/MM\", \"OK1\"},\n    {\"Callsign OK1aBC/MM\", \"OK1aBC/MM\", true, \"OK1ABC/MM\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"MM\", \"/MM\", \"OK1\"},\n    {\"Callsign OK10ABC/MM\", \"OK10ABC/MM\", true, \"OK10ABC/MM\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"MM\", \"/MM\", \"OK10\"},\n    {\"Callsign OK100ABC/MM\", \"OK100ABC/MM\", true, \"OK100ABC/MM\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"MM\", \"/MM\", \"OK100\"},\n    {\"Callsign OK2ABC/MM\", \"OK2ABC/MM\", true, \"OK2ABC/MM\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"MM\", \"/MM\", \"OK2\"},\n    {\"Callsign 9A1ABC/MM\", \"9A1ABC/MM\", true, \"9A1ABC/MM\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"MM\", \"/MM\", \"9A1\"},\n    {\"Callsign 9A12ABC/MM\", \"9A12ABC/MM\", true, \"9A12ABC/MM\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"MM\", \"/MM\", \"9A12\"},\n    {\"Callsign A12ABC/MM\", \"A12ABC/MM\", true, \"A12ABC/MM\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"MM\", \"/MM\", \"A12\"},\n    {\"Callsign OK1ABC/P\", \"OK1ABC/P\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK1ABC/P\", \"OK1ABC/P\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK1aBC/P\", \"OK1aBC/P\", true, \"OK1ABC/P\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"P\", \"/P\", \"OK1\"},\n    {\"Callsign OK10ABC/P\", \"OK10ABC/P\", true, \"OK10ABC/P\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"P\", \"/P\", \"OK10\"},\n    {\"Callsign OK100ABC/P\", \"OK100ABC/P\", true, \"OK100ABC/P\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"P\", \"/P\", \"OK100\"},\n    {\"Callsign OK2ABC/P\", \"OK2ABC/P\", true, \"OK2ABC/P\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"P\", \"/P\", \"OK2\"},\n    {\"Callsign 9A1ABC/P\", \"9A1ABC/P\", true, \"9A1ABC/P\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"P\", \"/P\", \"9A1\"},\n    {\"Callsign 9A12ABC/P\", \"9A12ABC/P\", true, \"9A12ABC/P\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"P\", \"/P\", \"9A12\"},\n    {\"Callsign A12ABC/P\", \"A12ABC/P\", true, \"A12ABC/P\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"P\", \"/P\", \"A12\"},\n    {\"Callsign OK1ABC/QRP\", \"OK1ABC/QRP\", true, \"OK1ABC/QRP\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"QRP\", \"/QRP\", \"OK1\"},\n    {\"Callsign OK1ABC/QRP\", \"OK1ABC/QRP\", true, \"OK1ABC/QRP\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"QRP\", \"/QRP\", \"OK1\"},\n    {\"Callsign OK1aBC/QRP\", \"OK1aBC/QRP\", true, \"OK1ABC/QRP\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"QRP\", \"/QRP\", \"OK1\"},\n    {\"Callsign OK10ABC/QRP\", \"OK10ABC/QRP\", true, \"OK10ABC/QRP\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"QRP\", \"/QRP\", \"OK10\"},\n    {\"Callsign OK100ABC/QRP\", \"OK100ABC/QRP\", true, \"OK100ABC/QRP\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"QRP\", \"/QRP\", \"OK100\"},\n    {\"Callsign OK2ABC/QRP\", \"OK2ABC/QRP\", true, \"OK2ABC/QRP\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"QRP\", \"/QRP\", \"OK2\"},\n    {\"Callsign 9A1ABC/QRP\", \"9A1ABC/QRP\", true, \"9A1ABC/QRP\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"QRP\", \"/QRP\", \"9A1\"},\n    {\"Callsign 9A12ABC/QRP\", \"9A12ABC/QRP\", true, \"9A12ABC/QRP\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"QRP\", \"/QRP\", \"9A12\"},\n    {\"Callsign A12ABC/QRP\", \"A12ABC/QRP\", true, \"A12ABC/QRP\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"QRP\", \"/QRP\", \"A12\"},\n    {\"Callsign OK1ABC/R\", \"OK1ABC/R\", true, \"OK1ABC/R\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"R\", \"/R\", \"OK1\"},\n    {\"Callsign OK1ABC/R\", \"OK1ABC/R\", true, \"OK1ABC/R\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"R\", \"/R\", \"OK1\"},\n    {\"Callsign OK1aBC/R\", \"OK1aBC/R\", true, \"OK1ABC/R\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"R\", \"/R\", \"OK1\"},\n    {\"Callsign OK10ABC/R\", \"OK10ABC/R\", true, \"OK10ABC/R\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"R\", \"/R\", \"OK10\"},\n    {\"Callsign OK100ABC/R\", \"OK100ABC/R\", true, \"OK100ABC/R\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"R\", \"/R\", \"OK100\"},\n    {\"Callsign OK2ABC/R\", \"OK2ABC/R\", true, \"OK2ABC/R\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"R\", \"/R\", \"OK2\"},\n    {\"Callsign 9A1ABC/R\", \"9A1ABC/R\", true, \"9A1ABC/R\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"R\", \"/R\", \"9A1\"},\n    {\"Callsign 9A12ABC/R\", \"9A12ABC/R\", true, \"9A12ABC/R\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"R\", \"/R\", \"9A12\"},\n    {\"Callsign A12ABC/R\", \"A12ABC/R\", true, \"A12ABC/R\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"R\", \"/R\", \"A12\"},\n    {\"Callsign OK1ABC/B\", \"OK1ABC/B\", true, \"OK1ABC/B\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"B\", \"/B\", \"OK1\"},\n    {\"Callsign OK1ABC/B\", \"OK1ABC/B\", true, \"OK1ABC/B\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"B\", \"/B\", \"OK1\"},\n    {\"Callsign OK1aBC/B\", \"OK1aBC/B\", true, \"OK1ABC/B\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"B\", \"/B\", \"OK1\"},\n    {\"Callsign OK10ABC/B\", \"OK10ABC/B\", true, \"OK10ABC/B\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"B\", \"/B\", \"OK10\"},\n    {\"Callsign OK100ABC/B\", \"OK100ABC/B\", true, \"OK100ABC/B\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"B\", \"/B\", \"OK100\"},\n    {\"Callsign OK2ABC/B\", \"OK2ABC/B\", true, \"OK2ABC/B\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"B\", \"/B\", \"OK2\"},\n    {\"Callsign 9A1ABC/B\", \"9A1ABC/B\", true, \"9A1ABC/B\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"B\", \"/B\", \"9A1\"},\n    {\"Callsign 9A12ABC/B\", \"9A12ABC/B\", true, \"9A12ABC/B\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"B\", \"/B\", \"9A12\"},\n    {\"Callsign A12ABC/B\", \"A12ABC/B\", true, \"A12ABC/B\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"B\", \"/B\", \"A12\"},\n    {\"Callsign OK1ABC/LGT\", \"OK1ABC/LGT\", true, \"OK1ABC/LGT\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"LGT\", \"/LGT\", \"OK1\"},\n    {\"Callsign OK1ABC/LGT\", \"OK1ABC/LGT\", true, \"OK1ABC/LGT\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"LGT\", \"/LGT\", \"OK1\"},\n    {\"Callsign OK1aBC/LGT\", \"OK1aBC/LGT\", true, \"OK1ABC/LGT\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"LGT\", \"/LGT\", \"OK1\"},\n    {\"Callsign OK10ABC/LGT\", \"OK10ABC/LGT\", true, \"OK10ABC/LGT\", \"\", \"\", \"OK10ABC\", \"OK\", \"10\", \"LGT\", \"/LGT\", \"OK10\"},\n    {\"Callsign OK100ABC/LGT\", \"OK100ABC/LGT\", true, \"OK100ABC/LGT\", \"\", \"\", \"OK100ABC\", \"OK\", \"100\", \"LGT\", \"/LGT\", \"OK100\"},\n    {\"Callsign OK2ABC/LGT\", \"OK2ABC/LGT\", true, \"OK2ABC/LGT\", \"\", \"\", \"OK2ABC\", \"OK\", \"2\", \"LGT\", \"/LGT\", \"OK2\"},\n    {\"Callsign 9A1ABC/LGT\", \"9A1ABC/LGT\", true, \"9A1ABC/LGT\", \"\", \"\", \"9A1ABC\", \"9A\", \"1\", \"LGT\", \"/LGT\", \"9A1\"},\n    {\"Callsign 9A12ABC/LGT\", \"9A12ABC/LGT\", true, \"9A12ABC/LGT\", \"\", \"\", \"9A12ABC\", \"9A\", \"12\", \"LGT\", \"/LGT\", \"9A12\"},\n    {\"Callsign A12ABC/LGT\", \"A12ABC/LGT\", true, \"A12ABC/LGT\", \"\", \"\", \"A12ABC\", \"A1\", \"2\", \"LGT\", \"/LGT\", \"A12\"},\n    {\"Callsign OK1ABC/E\", \"OK1ABC/E\", true, \"OK1ABC/E\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"E\", \"/E\", \"OK1\"},\n    {\"Callsign OK1ABC-1\", \"OK1ABC-1\", true, \"OK1ABC-1\", \"\", \"\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"OK1\"},\n    {\"Callsign OE/OK1ABC\", \"OE/OK1ABC\", true, \"OE/OK1ABC\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"OE0\"},\n    {\"Callsign Oe/OK1ABC\", \"Oe/OK1ABC\", true, \"OE/OK1ABC\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"OE0\"},\n    {\"Callsign SP1/OK1ABC\", \"SP1/OK1ABC\", true, \"SP1/OK1ABC\", \"SP1\", \"SP1/\", \"OK1ABC\", \"OK\", \"1\", \"\", \"\", \"SP1\"},\n    {\"Callsign OE/OK1ABC/M\", \"OE/OK1ABC/M\", true, \"OE/OK1ABC/M\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"M\", \"/M\", \"OE0\"},\n    {\"Callsign OE/OK1ABC/MM\", \"OE/OK1ABC/MM\", true, \"OE/OK1ABC/MM\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"MM\", \"/MM\", \"OE0\"},\n    {\"Callsign OE/OK1ABC/AM\", \"OE/OK1ABC/AM\", true, \"OE/OK1ABC/AM\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"AM\", \"/AM\", \"OE0\"},\n    {\"Callsign OE/OK1ABC/qrp\", \"OE/OK1ABC/qrp\", true, \"OE/OK1ABC/QRP\", \"OE\", \"OE/\", \"OK1ABC\", \"OK\", \"1\", \"QRP\", \"/QRP\", \"OE0\"},\n    {\"Callsign KH6XX/W0\", \"KH6XX/W0\", true, \"KH6XX/W0\", \"\", \"\", \"KH6XX\", \"KH\", \"6\", \"W0\", \"/W0\", \"W0\"},\n    {\"Callsign VE7ABC/2\", \"VE7ABC/2\", true, \"VE7ABC/2\", \"\", \"\", \"VE7ABC\", \"VE\", \"7\", \"2\", \"/2\", \"VE2\"},\n};\n\nstruct WPXCase { const char *name; const char *callsign; const char *wpx; };\nstatic const WPXCase kWPXCases[] = {\n    {\"Callsign OK1AA\", \"OK1AA\", \"OK1\"},\n    {\"Callsign OK2AA\", \"OK2AA\", \"OK2\"},\n    {\"Callsign OL80ABC\", \"OL80ABC\", \"OL80\"},\n    {\"Callsign 9A1AA\", \"9A1AA\", \"9A1\"},\n    {\"Callsign 9A10AA\", \"9A10AA\", \"9A10\"},\n    {\"Callsign SP/OK1AA\", \"SP/OK1AA\", \"SP0\"},\n    {\"Callsign SP1/OK1AA\", \"SP1/OK1AA\", \"SP1\"},\n    {\"Callsign SP1/OK1AA/P\", \"SP1/OK1AA/P\", \"SP1\"},\n    {\"Callsign SP1/OK1AA/M\", \"SP1/OK1AA/M\", \"SP1\"},\n    {\"Callsign A1/OK1AA\", \"A1/OK1AA\", \"A1\"},\n    {\"Callsign VE7aBC/2\", \"VE7aBC/2\", \"VE2\"},\n    {\"Callsign OK1AA/P\", \"OK1AA/P\", \"OK1\"},\n    {\"Callsign OK1AA/E\", \"OK1AA/E\", \"OK1\"},\n    {\"Callsign OK1AA/AM\", \"OK1AA/AM\", \"OK1\"},\n    {\"Callsign OK1AA/QRP\", \"OK1AA/QRP\", \"OK1\"},\n    {\"Callsign N8ABC/KH9\", \"N8ABC/KH9\", \"KH9\"},\n    {\"Callsign OK1AA/22\", \"OK1AA/22\", \"OK1\"},\n    {\"Callsign OK1AA-22\", \"OK1AA-22\", \"OK1\"},\n    {\"Callsign OK1AA/KH\", \"OK1AA/KH\", \"KH0\"},\n};\n"
  },
  {
    "path": "tests/CallsignTest/tst_callsign.cpp",
    "content": "#include <QtTest>\n#include \"data/Callsign.h\"\n#include \"generated_cases.h\"\n\nclass CallsignTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void parse_data();\n    void parse();\n    void wpx_data();\n    void wpx();\n};\n\nvoid CallsignTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid CallsignTest::parse_data()\n{\n    QTest::addColumn<QString>(\"callsign\");\n    QTest::addColumn<bool>(\"valid\");\n    QTest::addColumn<QString>(\"normalized\");\n    QTest::addColumn<QString>(\"hostPrefix\");\n    QTest::addColumn<QString>(\"hostPrefixWithDelimiter\");\n    QTest::addColumn<QString>(\"base\");\n    QTest::addColumn<QString>(\"basePrefix\");\n    QTest::addColumn<QString>(\"basePrefixNumber\");\n    QTest::addColumn<QString>(\"suffix\");\n    QTest::addColumn<QString>(\"suffixWithDelimiter\");\n    QTest::addColumn<QString>(\"wpxPrefix\");\n\n    int idx = 0;\n    for (const ParseCase &parseCase : kParseCases)\n    {\n        const QString rowId = QStringLiteral(\"%1_%2\").arg(parseCase.name).arg(idx++);\n        const QByteArray rowBytes = rowId.toUtf8();\n        QTest::newRow(rowBytes.constData())\n                << QString::fromLatin1(parseCase.callsign)\n                << parseCase.valid\n                << QString::fromLatin1(parseCase.normalized)\n                << QString::fromLatin1(parseCase.host)\n                << QString::fromLatin1(parseCase.hostDelim)\n                << QString::fromLatin1(parseCase.base)\n                << QString::fromLatin1(parseCase.basePrefix)\n                << QString::fromLatin1(parseCase.basePrefixNumber)\n                << QString::fromLatin1(parseCase.suffix)\n                << QString::fromLatin1(parseCase.suffixDelim)\n                << QString::fromLatin1(parseCase.wpx);\n    }\n}\n\nvoid CallsignTest::parse()\n{\n    QFETCH(QString, callsign);\n    QFETCH(bool, valid);\n    QFETCH(QString, normalized);\n    QFETCH(QString, hostPrefix);\n    QFETCH(QString, hostPrefixWithDelimiter);\n    QFETCH(QString, base);\n    QFETCH(QString, basePrefix);\n    QFETCH(QString, basePrefixNumber);\n    QFETCH(QString, suffix);\n    QFETCH(QString, suffixWithDelimiter);\n    QFETCH(QString, wpxPrefix);\n\n    Callsign cs(callsign);\n\n    QCOMPARE(cs.isValid(), valid);\n\n    if (!valid)\n    {\n        QVERIFY(cs.getCallsign().isEmpty());\n        QCOMPARE(cs.getWPXPrefix(), wpxPrefix);\n        return;\n    }\n\n    QCOMPARE(cs.getCallsign(), normalized);\n    QCOMPARE(cs.getHostPrefix(), hostPrefix);\n    QCOMPARE(cs.getHostPrefixWithDelimiter(), hostPrefixWithDelimiter);\n    QCOMPARE(cs.getBase(), base);\n    QCOMPARE(cs.getBasePrefix(), basePrefix);\n    QCOMPARE(cs.getBasePrefixNumber(), basePrefixNumber);\n    QCOMPARE(cs.getSuffix(), suffix);\n    QCOMPARE(cs.getSuffixWithDelimiter(), suffixWithDelimiter);\n    QCOMPARE(cs.getWPXPrefix(), wpxPrefix);\n}\n\nvoid CallsignTest::wpx_data()\n{\n    QTest::addColumn<QString>(\"callsign\");\n    QTest::addColumn<QString>(\"expectedPrefix\");\n\n    int idx = 0;\n    for (const WPXCase &wpxCase : kWPXCases)\n    {\n        const QString rowId = QStringLiteral(\"%1_%2\").arg(wpxCase.name).arg(idx++);\n        const QByteArray rowBytes = rowId.toUtf8();\n        QTest::newRow(rowBytes.constData())\n                << QString::fromLatin1(wpxCase.callsign)\n                << QString::fromLatin1(wpxCase.wpx);\n    }\n}\n\nvoid CallsignTest::wpx()\n{\n    QFETCH(QString, callsign);\n    QFETCH(QString, expectedPrefix);\n\n    Callsign cs(callsign);\n\n    QCOMPARE(cs.getWPXPrefix(), expectedPrefix);\n}\n\nQTEST_APPLESS_MAIN(CallsignTest)\n\n#include \"tst_callsign.moc\"\n"
  },
  {
    "path": "tests/CredentialStoreTest/CredentialStoreTest.pro",
    "content": "QT += testlib core widgets sql\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_credentialstore\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_credentialstore.cpp \\\n    test_stubs.cpp \\\n    ../../core/CredentialStore.cpp \\\n    ../../core/PasswordCipher.cpp \\\n    ../../core/LogParam.cpp\n\nHEADERS += \\\n    ../../core/CredentialStore.h \\\n    ../../core/PasswordCipher.h \\\n    ../../core/LogParam.h\n\n# QtKeychain\n!isEmpty(QTKEYCHAININCLUDEPATH) {\n   INCLUDEPATH += $$QTKEYCHAININCLUDEPATH\n}\n\n!isEmpty(QTKEYCHAINLIBPATH) {\n   LIBS += -L$$QTKEYCHAINLIBPATH\n}\n\nequals(QT_MAJOR_VERSION, 6): LIBS += -lqt6keychain\nequals(QT_MAJOR_VERSION, 5): LIBS += -lqt5keychain\n\n# OpenSSL (for PasswordCipher)\n!isEmpty(OPENSSLINCLUDEPATH) {\n    INCLUDEPATH += $$OPENSSLINCLUDEPATH\n}\n!isEmpty(OPENSSLLIBPATH) {\n    LIBS += -L$$OPENSSLLIBPATH\n}\n\nwin32 {\n    LIBS += -llibcrypto\n} else {\n    LIBS += -lcrypto\n}\n"
  },
  {
    "path": "tests/CredentialStoreTest/test_stubs.cpp",
    "content": "// Stubs for missing dependencies in CredentialStore tests\n// These provide minimal implementations to satisfy linker\n\n#include <QString>\n#include \"core/LogDatabase.h\"\n#include \"data/BandPlan.h\"\n\n// Stub for LogDatabase::currentPlatformId()\nQString LogDatabase::currentPlatformId()\n{\n    return QStringLiteral(\"TestPlatform\");\n}\n\n// Stubs for BandPlan constants used in LogParam\nconst QString BandPlan::MODE_GROUP_STRING_PHONE = QStringLiteral(\"PHONE\");\nconst QString BandPlan::MODE_GROUP_STRING_CW = QStringLiteral(\"CW\");\nconst QString BandPlan::MODE_GROUP_STRING_FTx = QStringLiteral(\"FTx\");\nconst QString BandPlan::MODE_GROUP_STRING_DIGITAL = QStringLiteral(\"DIGITAL\");\n"
  },
  {
    "path": "tests/CredentialStoreTest/tst_credentialstore.cpp",
    "content": "#include <QtTest>\n#include <QApplication>\n#include <QCoreApplication>\n#include <QDateTime>\n#include <QMessageBox>\n#include <QTimer>\n#include <QTemporaryDir>\n#include <QSqlDatabase>\n#include <QSqlQuery>\n\n#include \"core/CredentialStore.h\"\n#include \"core/PasswordCipher.h\"\n#include \"core/LogParam.h\"\n\nnamespace {\nQtMessageHandler previousHandler = nullptr;\n\nvoid credentialStoreTestMessageHandler(QtMsgType type, const QMessageLogContext &context,\n                                       const QString &message)\n{\n    if (type == QtWarningMsg)\n    {\n        if (message.contains(QStringLiteral(\"This plugin does not support propagateSizeHints()\")))\n            return;\n        if (message.contains(QStringLiteral(\"Cannot save a password. Error\")))\n            return;\n        if (message.contains(QStringLiteral(\"Cannot get a password\")))\n            return;\n    }\n\n    if (previousHandler)\n        previousHandler(type, context, message);\n}\n\nstruct ScopedMessageHandler\n{\n    ScopedMessageHandler()\n    {\n        previousHandler = qInstallMessageHandler(credentialStoreTestMessageHandler);\n    }\n\n    ~ScopedMessageHandler()\n    {\n        qInstallMessageHandler(previousHandler);\n        previousHandler = nullptr;\n    }\n};\n\n}  // anonymous namespace\n\n// Helper class to access protected CredentialStore methods via SecureServiceBase\n// Must be outside anonymous namespace for friend declaration to work\nclass TestCredentialService : public SecureServiceBase<TestCredentialService>\n{\npublic:\n    DECLARE_SECURE_SERVICE(TestCredentialService)\n\n    // Expose protected methods from SecureServiceBase for testing\n    static QString testGetPassword(const QString &key, const QString &user)\n    {\n        return getPassword(key, user);\n    }\n\n    static void testSavePassword(const QString &key, const QString &user, const QString &pass)\n    {\n        savePassword(key, user, pass);\n    }\n\n    static void testDeletePassword(const QString &key, const QString &user)\n    {\n        deletePassword(key, user);\n    }\n\n    // Test if save succeeded by trying to get the password back\n    static bool testSaveAndVerify(const QString &key, const QString &user, const QString &pass)\n    {\n        savePassword(key, user, pass);\n        return getPassword(key, user) == pass;\n    }\n};\n\n// Required registration for TestCredentialService\nvoid TestCredentialService::registerCredentials()\n{\n    CredentialRegistry::instance().add(\"TestCredentialService\", []() {\n        return QList<CredentialDescriptor>{};\n    });\n}\n\nREGISTRATION_SECURE_SERVICE(TestCredentialService);\n\nclass CredentialStoreTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void instance_isStable();\n    void savePassword_emptyInputs_noEffect_data();\n    void savePassword_emptyInputs_noEffect();\n    void getPassword_emptyKeyOrUser_returnsEmpty();\n    void deletePassword_emptyKeyOrUser_noCrash();\n    void saveGetDelete_worksAndCleansUp();\n    void getPassword_benchmark_keychain();\n\n    // New tests for export/import functionality\n    void exportImportPasswords_roundTrip();\n    void importPasswords_wrongPassword_fails();\n    void importPassphrase_saveGetDelete();\n\nprivate:\n    void setupMessageBoxCloser();\n    QTimer messageBoxCloser;\n    QTemporaryDir *tempDir = nullptr;\n};\n\nvoid CredentialStoreTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n    setupMessageBoxCloser();\n\n    // Create temporary database for LogParam tests\n    tempDir = new QTemporaryDir();\n    QVERIFY(tempDir->isValid());\n\n    QString dbPath = tempDir->filePath(\"test.db\");\n\n    // Create a minimal database with log_param table\n    {\n        QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\", \"testdb\");\n        db.setDatabaseName(dbPath);\n        QVERIFY(db.open());\n\n        QSqlQuery query(db);\n        QVERIFY(query.exec(\"CREATE TABLE log_param (name TEXT PRIMARY KEY, value TEXT)\"));\n        db.close();\n    }\n    QSqlDatabase::removeDatabase(\"testdb\");\n\n    // Set as default database connection for LogParam\n    QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\");\n    db.setDatabaseName(dbPath);\n    QVERIFY(db.open());\n}\n\nvoid CredentialStoreTest::cleanupTestCase()\n{\n    QSqlDatabase::database().close();\n    QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);\n\n    delete tempDir;\n    tempDir = nullptr;\n}\n\nvoid CredentialStoreTest::setupMessageBoxCloser()\n{\n    messageBoxCloser.setInterval(25);\n    messageBoxCloser.setSingleShot(false);\n    connect(&messageBoxCloser, &QTimer::timeout, this, []() {\n        const auto widgets = QApplication::topLevelWidgets();\n        for (QWidget *widget : widgets)\n        {\n            if (auto *box = qobject_cast<QMessageBox *>(widget))\n                box->reject();\n        }\n    });\n    messageBoxCloser.start();\n}\n\nvoid CredentialStoreTest::instance_isStable()\n{\n    CredentialStore *first = CredentialStore::instance();\n    CredentialStore *second = CredentialStore::instance();\n    QVERIFY(first != nullptr);\n    QCOMPARE(first, second);\n}\n\nvoid CredentialStoreTest::savePassword_emptyInputs_noEffect_data()\n{\n    QTest::addColumn<QString>(\"storageKey\");\n    QTest::addColumn<QString>(\"user\");\n    QTest::addColumn<QString>(\"pass\");\n\n    QTest::newRow(\"empty_all\") << QString() << QString() << QString();\n    QTest::newRow(\"empty_key\") << QString() << QStringLiteral(\"u\") << QStringLiteral(\"p\");\n    QTest::newRow(\"empty_user\") << QStringLiteral(\"k\") << QString() << QStringLiteral(\"p\");\n    QTest::newRow(\"empty_pass\") << QStringLiteral(\"k\") << QStringLiteral(\"u\") << QString();\n}\n\nvoid CredentialStoreTest::savePassword_emptyInputs_noEffect()\n{\n    QFETCH(QString, storageKey);\n    QFETCH(QString, user);\n    QFETCH(QString, pass);\n\n    // Empty inputs should have no effect (password should remain empty)\n    TestCredentialService::testSavePassword(storageKey, user, pass);\n\n    // If key or user is empty, getPassword should return empty\n    if (storageKey.isEmpty() || user.isEmpty())\n    {\n        QCOMPARE(TestCredentialService::testGetPassword(storageKey, user), QString());\n    }\n}\n\nvoid CredentialStoreTest::getPassword_emptyKeyOrUser_returnsEmpty()\n{\n    QCOMPARE(TestCredentialService::testGetPassword(QString(), QStringLiteral(\"u\")), QString());\n    QCOMPARE(TestCredentialService::testGetPassword(QStringLiteral(\"k\"), QString()), QString());\n    QCOMPARE(TestCredentialService::testGetPassword(QString(), QString()), QString());\n}\n\nvoid CredentialStoreTest::deletePassword_emptyKeyOrUser_noCrash()\n{\n    TestCredentialService::testDeletePassword(QString(), QStringLiteral(\"u\"));\n    TestCredentialService::testDeletePassword(QStringLiteral(\"k\"), QString());\n    TestCredentialService::testDeletePassword(QString(), QString());\n    QVERIFY(true);\n}\n\nvoid CredentialStoreTest::saveGetDelete_worksAndCleansUp()\n{\n    const QString unique = QStringLiteral(\"%1-%2\")\n                               .arg(QCoreApplication::applicationPid())\n                               .arg(QDateTime::currentMSecsSinceEpoch());\n    const QString testKey = QStringLiteral(\"CredentialStoreTest-%1\").arg(unique);\n    const QString testUser = QStringLiteral(\"user-%1\").arg(unique);\n    const QString testPwd = QStringLiteral(\"pass-%1\").arg(unique);\n\n    struct Cleanup\n    {\n        QString key;\n        QString user;\n        ~Cleanup()\n        {\n            TestCredentialService::testDeletePassword(key, user);\n        }\n    } cleanup{testKey, testUser};\n\n    // Ensure clean state\n    TestCredentialService::testDeletePassword(testKey, testUser);\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), QString());\n\n    // Save and verify\n    if (!TestCredentialService::testSaveAndVerify(testKey, testUser, testPwd))\n        QSKIP(\"Credential store backend not available (save failed).\");\n\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), testPwd);\n\n    // Delete and verify\n    TestCredentialService::testDeletePassword(testKey, testUser);\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), QString());\n}\n\nvoid CredentialStoreTest::getPassword_benchmark_keychain()\n{\n    const ScopedMessageHandler handlerScope;\n\n    const QString unique = QStringLiteral(\"%1-%2-bench\")\n                               .arg(QCoreApplication::applicationPid())\n                               .arg(QDateTime::currentMSecsSinceEpoch());\n    const QString testKey = QStringLiteral(\"CredentialStoreBench-%1\").arg(unique);\n    const QString testUser = QStringLiteral(\"user-%1\").arg(unique);\n    const QString testPwd = QStringLiteral(\"pass-%1\").arg(unique);\n\n    struct Cleanup\n    {\n        QString key;\n        QString user;\n        ~Cleanup()\n        {\n            TestCredentialService::testDeletePassword(key, user);\n        }\n    } cleanup{testKey, testUser};\n\n    TestCredentialService::testDeletePassword(testKey, testUser);\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), QString());\n\n    if (!TestCredentialService::testSaveAndVerify(testKey, testUser, testPwd))\n        QSKIP(\"Credential store backend not available (save failed).\");\n\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), testPwd);\n\n    QString out;\n    QBENCHMARK { out = TestCredentialService::testGetPassword(testKey, testUser); }\n    QCOMPARE(out, testPwd);\n}\n\nvoid CredentialStoreTest::exportImportPasswords_roundTrip()\n{\n    const ScopedMessageHandler handlerScope;\n\n    const QString unique = QStringLiteral(\"%1-%2-export\")\n                               .arg(QCoreApplication::applicationPid())\n                               .arg(QDateTime::currentMSecsSinceEpoch());\n    const QString testKey = QStringLiteral(\"ExportTest-%1\").arg(unique);\n    const QString testUser = QStringLiteral(\"user-%1\").arg(unique);\n    const QString testPwd = QStringLiteral(\"secret-%1\").arg(unique);\n    const QString passphrase = QStringLiteral(\"test-passphrase-12345\");\n\n    struct Cleanup\n    {\n        QString key;\n        QString user;\n        ~Cleanup()\n        {\n            TestCredentialService::testDeletePassword(key, user);\n            LogParam::removeEncryptedPasswords();\n            LogParam::removeSourcePlatform();\n        }\n    } cleanup{testKey, testUser};\n\n    // Save a test password\n    if (!TestCredentialService::testSaveAndVerify(testKey, testUser, testPwd))\n        QSKIP(\"Credential store backend not available (save failed).\");\n\n    // Register test credential for export\n    CredentialRegistry::instance().add(\"ExportTest\", [testKey, testUser]() {\n        return QList<CredentialDescriptor>{{testKey, [testUser]() { return testUser; }}};\n    });\n\n    // Export\n    QVERIFY(CredentialStore::instance()->exportPasswords(passphrase));\n\n    // Verify encrypted blob was saved\n    QByteArray blob = LogParam::getEncryptedPasswords();\n    QVERIFY(!blob.isEmpty());\n\n    // Delete the original password\n    TestCredentialService::testDeletePassword(testKey, testUser);\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), QString());\n\n    // Import\n    QVERIFY(CredentialStore::instance()->importPasswords(passphrase));\n\n    // Verify password was restored\n    QCOMPARE(TestCredentialService::testGetPassword(testKey, testUser), testPwd);\n}\n\nvoid CredentialStoreTest::importPasswords_wrongPassword_fails()\n{\n    const ScopedMessageHandler handlerScope;\n\n    const QString unique = QStringLiteral(\"%1-%2-wrongpwd\")\n                               .arg(QCoreApplication::applicationPid())\n                               .arg(QDateTime::currentMSecsSinceEpoch());\n    const QString testKey = QStringLiteral(\"WrongPwdTest-%1\").arg(unique);\n    const QString testUser = QStringLiteral(\"user-%1\").arg(unique);\n    const QString testPwd = QStringLiteral(\"secret-%1\").arg(unique);\n    const QString correctPassphrase = QStringLiteral(\"correct-passphrase\");\n    const QString wrongPassphrase = QStringLiteral(\"wrong-passphrase\");\n\n    struct Cleanup\n    {\n        QString key;\n        QString user;\n        ~Cleanup()\n        {\n            TestCredentialService::testDeletePassword(key, user);\n            LogParam::removeEncryptedPasswords();\n            LogParam::removeSourcePlatform();\n        }\n    } cleanup{testKey, testUser};\n\n    // Save and export with correct passphrase\n    if (!TestCredentialService::testSaveAndVerify(testKey, testUser, testPwd))\n        QSKIP(\"Credential store backend not available (save failed).\");\n\n    CredentialRegistry::instance().add(\"WrongPwdTest\", [testKey, testUser]() {\n        return QList<CredentialDescriptor>{{testKey, [testUser]() { return testUser; }}};\n    });\n\n    QVERIFY(CredentialStore::instance()->exportPasswords(correctPassphrase));\n\n    // Try to import with wrong passphrase\n    QVERIFY(!CredentialStore::instance()->importPasswords(wrongPassphrase));\n}\n\nvoid CredentialStoreTest::importPassphrase_saveGetDelete()\n{\n    const ScopedMessageHandler handlerScope;\n\n    const QString testPassphrase = QStringLiteral(\"import-test-passphrase-67890\");\n\n    struct Cleanup\n    {\n        ~Cleanup()\n        {\n            CredentialStore::instance()->deleteImportPassphrase();\n        }\n    } cleanup;\n\n    // Initially should be empty\n    CredentialStore::instance()->deleteImportPassphrase();\n    QCOMPARE(CredentialStore::instance()->getImportPassphrase(), QString());\n\n    // Save\n    CredentialStore::instance()->saveImportPassphrase(testPassphrase);\n\n    // Get\n    QString retrieved = CredentialStore::instance()->getImportPassphrase();\n    if (retrieved.isEmpty())\n        QSKIP(\"Credential store backend not available (save failed).\");\n\n    QCOMPARE(retrieved, testPassphrase);\n\n    // Delete\n    CredentialStore::instance()->deleteImportPassphrase();\n    QCOMPARE(CredentialStore::instance()->getImportPassphrase(), QString());\n}\n\nint main(int argc, char **argv)\n{\n    if (qEnvironmentVariableIsEmpty(\"QT_QPA_PLATFORM\"))\n        qputenv(\"QT_QPA_PLATFORM\", \"offscreen\");\n\n    QApplication app(argc, argv);\n    CredentialStoreTest tc;\n    return QTest::qExec(&tc, argc, argv);\n}\n\n#include \"tst_credentialstore.moc\"\n"
  },
  {
    "path": "tests/DataTest/DataTest.pro",
    "content": "QT += testlib core sql\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_data\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_data.cpp \\\n    ../../data/Accents.cpp\n"
  },
  {
    "path": "tests/DataTest/tst_data.cpp",
    "content": "#include <QtTest>\n#include <QLoggingCategory>\n#include \"data/Data.h\"\n\nnamespace {\nQString expectedExtendedChar(unsigned char value)\n{\n    switch (value)\n    {\n    case 0xA0: return \" \";\n    case 0xA1: return \"!\";\n    case 0xA2: return \"C/\";\n    case 0xA3: return \"PS\";\n    case 0xA4: return \"$?\";\n    case 0xA5: return \"Y=\";\n    case 0xA6: return \"|\";\n    case 0xA7: return \"SS\";\n    case 0xA8: return \"\\\"\";\n    case 0xA9: return \"(c)\";\n    case 0xAA: return \"a\";\n    case 0xAB: return \"<<\";\n    case 0xAC: return \"!\";\n    case 0xAE: return \"(r)\";\n    case 0xAF: return \"-\";\n    case 0xB0: return \"deg\";\n    case 0xB1: return \"+-\";\n    case 0xB2: return \"2\";\n    case 0xB3: return \"3\";\n    case 0xB4: return \"'\";\n    case 0xB5: return \"u\";\n    case 0xB6: return \"P\";\n    case 0xB7: return \"*\";\n    case 0xB8: return \",\";\n    case 0xB9: return \"1\";\n    case 0xBA: return \"o\";\n    case 0xBB: return \">>\";\n    case 0xBC: return \" 1/4 \";\n    case 0xBD: return \" 1/2 \";\n    case 0xBE: return \" 3/4 \";\n    case 0xC0:\n    case 0xC1:\n    case 0xC2:\n    case 0xC3:\n    case 0xC4:\n    case 0xC5: return \"A\";\n    case 0xC6: return \"AE\";\n    case 0xC7: return \"C\";\n    case 0xC8:\n    case 0xC9:\n    case 0xCA:\n    case 0xCB: return \"E\";\n    case 0xCC:\n    case 0xCD:\n    case 0xCE:\n    case 0xCF: return \"I\";\n    case 0xD0: return \"D\";\n    case 0xD1: return \"N\";\n    case 0xD2:\n    case 0xD3:\n    case 0xD4:\n    case 0xD5:\n    case 0xD6: return \"O\";\n    case 0xD7: return \"x\";\n    case 0xD8: return \"O\";\n    case 0xD9:\n    case 0xDA:\n    case 0xDB:\n    case 0xDC: return \"U\";\n    case 0xDD: return \"Y\";\n    case 0xDE: return \"Th\";\n    case 0xDF: return \"ss\";\n    case 0xE0:\n    case 0xE1:\n    case 0xE2:\n    case 0xE3:\n    case 0xE4:\n    case 0xE5: return \"a\";\n    case 0xE6: return \"ae\";\n    case 0xE7: return \"c\";\n    case 0xE8:\n    case 0xE9:\n    case 0xEA:\n    case 0xEB: return \"e\";\n    case 0xEC:\n    case 0xED:\n    case 0xEE:\n    case 0xEF: return \"i\";\n    case 0xF0: return \"d\";\n    case 0xF1: return \"n\";\n    case 0xF2:\n    case 0xF3:\n    case 0xF4:\n    case 0xF5:\n    case 0xF6: return \"o\";\n    case 0xF7: return \"/\";\n    case 0xF8: return \"o\";\n    case 0xF9:\n    case 0xFA:\n    case 0xFB:\n    case 0xFC: return \"u\";\n    case 0xFD: return \"y\";\n    case 0xFE: return \"th\";\n    default:\n        return \"?\";\n    }\n}\n}\n\nclass DataTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void removeAccents_basic();\n    void removeAccents_asciiPrintable();\n    void removeAccents_nonPrintable();\n    void removeAccents_limits();\n    void removeAccents_benchmark();\n};\n\nvoid DataTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid DataTest::removeAccents_basic()\n{\n    struct Case { const char *input; const char *expected; };\n    const Case cases[] = {\n        {\"ěščřžýáíé\", \"escrzyaie\"},\n        {\"ĚŠČŘŽÝÁÍÉ\", \"ESCRZYAIE\"},\n        {\"äöüß\", \"aouss\"},\n        {\"ÄÖÜẞ\", \"AOUSs\"},\n        {\"âêîôûàèùéëïü\", \"aeiouaeueeiu\"},\n        {\"鍖椾喊\", \"Chen Zhan Han \"},\n        {\"Питер. Лето. Любов\", \"Piter. Leto. Liubov\"},\n        {\"10°C\", \"10degC\"},\n        {\"⾦\", \"?\"}\n    };\n\n    for (const Case &c : cases)\n    {\n        QCOMPARE(Data::removeAccents(QString::fromUtf8(c.input)), QString::fromUtf8(c.expected));\n    }\n}\n\nvoid DataTest::removeAccents_asciiPrintable()\n{\n    for (int i = 32; i <= 127; ++i)\n    {\n        const QString input{QChar(i)};\n        QCOMPARE(Data::removeAccents(input), input);\n    }\n}\n\nvoid DataTest::removeAccents_nonPrintable()\n{\n    for (int i = 128; i <= 254; ++i)\n    {\n        const QString input{QChar(i)};\n        const QString expected = expectedExtendedChar(static_cast<unsigned char>(i));\n        QCOMPARE(Data::removeAccents(input), expected);\n    }\n}\n\nvoid DataTest::removeAccents_limits()\n{\n    const QString lastInput = QString::fromUtf8(\"\\uFFFE\");\n    QVERIFY(!lastInput.isEmpty());\n    QCOMPARE(Data::removeAccents(lastInput), QString(\"?\"));\n\n    const QString firstInput = QString::fromUtf8(\"\\u0080\");\n    QVERIFY(!firstInput.isEmpty());\n    QCOMPARE(Data::removeAccents(firstInput), QString(\"?\"));\n}\n\nvoid DataTest::removeAccents_benchmark()\n{\n    QBENCHMARK\n    {\n        Data::removeAccents(QStringLiteral(\"ĚŠČŘŽÝÁÍÉdkfj dfj dlkfj dslfkj dslfj dlfkjdfljdslfd lasdjkas jdlkasj dlkasj dlksajd lsajdlas jdls\"));\n    };\n}\n\nQTEST_APPLESS_MAIN(DataTest)\n\n#include \"tst_data.moc\"\n"
  },
  {
    "path": "tests/DxServerStringTest/DxServerStringTest.pro",
    "content": "QT += testlib core\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_dxserverstring\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_dxserverstring.cpp \\\n    ../../data/DxServerString.cpp\n\nHEADERS += \\\n    ../../data/DxServerString.h\n"
  },
  {
    "path": "tests/DxServerStringTest/tst_dxserverstring.cpp",
    "content": "#include <QtTest>\n\n#include \"data/DxServerString.h\"\n\nclass DxServerStringTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void invalidServerStrings_data();\n    void invalidServerStrings();\n    void validServerStrings_data();\n    void validServerStrings();\n};\n\nvoid DxServerStringTest::initTestCase()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid DxServerStringTest::invalidServerStrings_data()\n{\n    QTest::addColumn<QString>(\"serverString\");\n\n    const QStringList invalidStrings = {\n        \"\",\n        \"1\",\n        \"192.\",\n        \"aa.\",\n        \".11\",\n        \".aa\",\n        \".11.11\",\n        \".aa.aa\",\n        \"a1.11\",\n        \"aa.cz:1234567\",\n        \"aa.cz:-1234\",\n        \"aa.cz:a234\",\n        \"aa.cz#1234\",\n        \"aa/aa@aa.cz:1234\",\n        \"aa:1234567\",\n        \"aa:-1234\",\n        \"aa:a234\",\n        \"aa#1234\",\n        \"aa/aa@aa:1234\",\n        \"192.168.2.1:1234567\",\n        \"192.168.2.1:-1234\",\n        \"192.168.2.1:a234\",\n        \"192.168.2.1#1234\",\n        \"aa/aa@192.168.2.1:1234\",\n        \"a1@aaa@localhost:7000\"\n    };\n\n    for (const QString &value : invalidStrings)\n    {\n        QTest::newRow(value.toUtf8().constData()) << value;\n    }\n}\n\nvoid DxServerStringTest::invalidServerStrings()\n{\n    QFETCH(QString, serverString);\n\n    const DxServerString server(serverString);\n    QVERIFY(!DxServerString::isValidServerString(serverString));\n    QVERIFY(!server.isValid());\n    QCOMPARE(server.getUsername(), QString());\n    QCOMPARE(server.getHostname(), QString());\n    QCOMPARE(server.getPort(), 7300);\n    QCOMPARE(server.getPasswordStorageKey(), QString());\n}\n\nvoid DxServerStringTest::validServerStrings_data()\n{\n    QTest::addColumn<QString>(\"serverString\");\n    QTest::addColumn<QString>(\"expectedUsername\");\n    QTest::addColumn<QString>(\"expectedHostname\");\n    QTest::addColumn<int>(\"expectedPort\");\n    QTest::addColumn<QString>(\"expectedPasswordKey\");\n\n    struct Case\n    {\n        const char *name;\n        const char *server;\n        const char *username;\n        const char *hostname;\n        int port;\n    };\n\n    const Case cases[] = {\n        {\"localhost_default\", \"localhost:7300\", \"\", \"localhost\", 7300},\n        {\"localhost_user\", \"aa@localhost:7300\", \"aa\", \"localhost\", 7300},\n        {\"localhost_useralpha\", \"a1aaa@localhost:7300\", \"a1aaa\", \"localhost\", 7300},\n        {\"localhost_custom_port\", \"a1aaa@localhost:7000\", \"a1aaa\", \"localhost\", 7000},\n        {\"localhost_mixed_case\", \"a1Aaa@localHost:7000\", \"a1Aaa\", \"localHost\", 7000},\n        {\"loopback_default\", \"127.0.0.1:7300\", \"\", \"127.0.0.1\", 7300},\n        {\"loopback_user\", \"aa@127.0.0.1:7300\", \"aa\", \"127.0.0.1\", 7300},\n        {\"loopback_useralpha\", \"a1aaa@127.0.0.1:7300\", \"a1aaa\", \"127.0.0.1\", 7300},\n        {\"loopback_custom_port\", \"a1aaa@127.0.0.1:7000\", \"a1aaa\", \"127.0.0.1\", 7000},\n        {\"loopback_mixed_case\", \"a1Aaa@127.0.0.1:7000\", \"a1Aaa\", \"127.0.0.1\", 7000},\n        {\"domain_default\", \"aa.cz:7300\", \"\", \"aa.cz\", 7300},\n        {\"domain_user\", \"aa@aa.cz:7300\", \"aa\", \"aa.cz\", 7300},\n        {\"domain_useralpha\", \"a1aaa@aa.cz:7300\", \"a1aaa\", \"aa.cz\", 7300},\n        {\"domain_custom_port\", \"a1aaa@aa.cz:7000\", \"a1aaa\", \"aa.cz\", 7000},\n        {\"domain_mixed_case\", \"a1Aaa@aa.cZ:7000\", \"a1Aaa\", \"aa.cZ\", 7000},\n        {\"subdomain_default\", \"aa.bb.cz:7300\", \"\", \"aa.bb.cz\", 7300},\n        {\"subdomain_user\", \"aa@aa.bb.cz:7300\", \"aa\", \"aa.bb.cz\", 7300},\n        {\"subdomain_useralpha\", \"a1aaa@aa.bb.cz:7300\", \"a1aaa\", \"aa.bb.cz\", 7300},\n        {\"subdomain_custom_port\", \"a1aaa@aa.bb.cz:7000\", \"a1aaa\", \"aa.bb.cz\", 7000},\n        {\"subdomain_mixed_case\", \"a1Aaa@aa.bb.cZ:7000\", \"a1Aaa\", \"aa.bb.cZ\", 7000}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << QString::fromLatin1(c.server)\n            << QString::fromLatin1(c.username)\n            << QString::fromLatin1(c.hostname)\n            << c.port\n            << QStringLiteral(\"%1:%2\").arg(QString::fromLatin1(c.hostname)).arg(c.port);\n    }\n}\n\nvoid DxServerStringTest::validServerStrings()\n{\n    QFETCH(QString, serverString);\n    QFETCH(QString, expectedUsername);\n    QFETCH(QString, expectedHostname);\n    QFETCH(int, expectedPort);\n    QFETCH(QString, expectedPasswordKey);\n\n    const DxServerString server(serverString);\n\n    QVERIFY(DxServerString::isValidServerString(serverString));\n    QVERIFY(server.isValid());\n    QCOMPARE(server.getUsername(), expectedUsername);\n    QCOMPARE(server.getHostname(), expectedHostname);\n    QCOMPARE(server.getPort(), expectedPort);\n    QCOMPARE(server.getPasswordStorageKey(), expectedPasswordKey);\n}\n\nQTEST_APPLESS_MAIN(DxServerStringTest)\n\n#include \"tst_dxserverstring.moc\"\n"
  },
  {
    "path": "tests/FileCompressorTest/FileCompressorTest.pro",
    "content": "QT += testlib core widgets\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_filecompressor\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_filecompressor.cpp \\\n    ../../core/FileCompressor.cpp\n\nHEADERS += \\\n    ../../core/FileCompressor.h\n\n# zlib\n!isEmpty(ZLIBINCLUDEPATH) {\n    INCLUDEPATH += $$ZLIBINCLUDEPATH\n}\n!isEmpty(ZLIBLIBPATH) {\n    LIBS += -L$$ZLIBLIBPATH\n}\nunix: LIBS += -lz\nwin32: LIBS += -lzlib\n"
  },
  {
    "path": "tests/FileCompressorTest/tst_filecompressor.cpp",
    "content": "#include <QtTest>\n#include <QTemporaryDir>\n#include <QTemporaryFile>\n#include <QFile>\n#include <QRandomGenerator>\n\n#include \"core/FileCompressor.h\"\n\nclass FileCompressorTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n\n    // In-memory tests\n    void gzip_emptyData_returnsEmpty();\n    void gzip_smallData_compressesAndDecompresses();\n    void gzip_largeData_compressesAndDecompresses();\n    void gzip_binaryData_compressesAndDecompresses();\n    void gunzip_invalidData_returnsEmpty();\n    void gunzip_truncatedData_returnsEmpty();\n\n    // File-based tests\n    void gzipFile_smallFile_compressesAndDecompresses();\n    void gzipFile_largeFile_compressesAndDecompresses();\n    void gzipFile_nonExistentSource_returnsFalse();\n    void gzipFile_invalidDestPath_returnsFalse();\n    void gzipFile_progressCallback_isCalled();\n    void gzipFile_progressCallbackCancel_stopsCompression();\n\n    // Benchmarks\n    void gzip_benchmark_compression();\n    void gzip_benchmark_decompression();\n\nprivate:\n    QByteArray generateRandomData(int size);\n    QByteArray generateCompressibleData(int size);\n\n    QTemporaryDir *tempDir = nullptr;\n};\n\nvoid FileCompressorTest::initTestCase()\n{\n    tempDir = new QTemporaryDir();\n    QVERIFY(tempDir->isValid());\n}\n\nvoid FileCompressorTest::cleanupTestCase()\n{\n    delete tempDir;\n    tempDir = nullptr;\n}\n\nQByteArray FileCompressorTest::generateRandomData(int size)\n{\n    QByteArray data(size, '\\0');\n    for (int i = 0; i < size; ++i)\n        data[i] = static_cast<char>(QRandomGenerator::global()->bounded(256));\n    return data;\n}\n\nQByteArray FileCompressorTest::generateCompressibleData(int size)\n{\n    // Generate data with repeated patterns (highly compressible)\n    QByteArray pattern = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\";\n    QByteArray data;\n    data.reserve(size);\n    while (data.size() < size)\n        data.append(pattern);\n    return data.left(size);\n}\n\n// ============================================================================\n// In-memory tests\n// ============================================================================\n\nvoid FileCompressorTest::gzip_emptyData_returnsEmpty()\n{\n    QByteArray empty;\n    QByteArray compressed = FileCompressor::gzip(empty);\n    QVERIFY(compressed.isEmpty());\n\n    QByteArray decompressed = FileCompressor::gunzip(empty);\n    QVERIFY(decompressed.isEmpty());\n}\n\nvoid FileCompressorTest::gzip_smallData_compressesAndDecompresses()\n{\n    QByteArray original = \"Hello, World! This is a test message for compression.\";\n\n    QByteArray compressed = FileCompressor::gzip(original);\n    QVERIFY(!compressed.isEmpty());\n    QVERIFY(compressed != original);\n\n    QByteArray decompressed = FileCompressor::gunzip(compressed);\n    QCOMPARE(decompressed, original);\n}\n\nvoid FileCompressorTest::gzip_largeData_compressesAndDecompresses()\n{\n    // 1 MB of compressible data\n    QByteArray original = generateCompressibleData(1024 * 1024);\n\n    QByteArray compressed = FileCompressor::gzip(original);\n    QVERIFY(!compressed.isEmpty());\n    // Compressible data should be significantly smaller\n    QVERIFY(compressed.size() < original.size() / 2);\n\n    QByteArray decompressed = FileCompressor::gunzip(compressed);\n    QCOMPARE(decompressed, original);\n}\n\nvoid FileCompressorTest::gzip_binaryData_compressesAndDecompresses()\n{\n    // Random binary data (less compressible)\n    QByteArray original = generateRandomData(10000);\n\n    QByteArray compressed = FileCompressor::gzip(original);\n    QVERIFY(!compressed.isEmpty());\n\n    QByteArray decompressed = FileCompressor::gunzip(compressed);\n    QCOMPARE(decompressed, original);\n}\n\nvoid FileCompressorTest::gunzip_invalidData_returnsEmpty()\n{\n    QByteArray invalid = \"This is not gzip compressed data\";\n    QByteArray result = FileCompressor::gunzip(invalid);\n    QVERIFY(result.isEmpty());\n}\n\nvoid FileCompressorTest::gunzip_truncatedData_returnsEmpty()\n{\n    QByteArray original = \"Test data for truncation test\";\n    QByteArray compressed = FileCompressor::gzip(original);\n    QVERIFY(!compressed.isEmpty());\n\n    // Truncate the compressed data\n    QByteArray truncated = compressed.left(compressed.size() / 2);\n    QByteArray result = FileCompressor::gunzip(truncated);\n    // Should return empty or partial data, but not crash\n    QVERIFY(result != original);\n}\n\n// ============================================================================\n// File-based tests\n// ============================================================================\n\nvoid FileCompressorTest::gzipFile_smallFile_compressesAndDecompresses()\n{\n    QString sourceFile = tempDir->filePath(\"small_source.txt\");\n    QString compressedFile = tempDir->filePath(\"small_compressed.gz\");\n    QString decompressedFile = tempDir->filePath(\"small_decompressed.txt\");\n\n    // Create source file\n    QByteArray original = \"Small file content for compression test.\\n\";\n    {\n        QFile file(sourceFile);\n        QVERIFY(file.open(QIODevice::WriteOnly));\n        file.write(original);\n    }\n\n    // Compress\n    QVERIFY(FileCompressor::gzipFile(sourceFile, compressedFile));\n    QVERIFY(QFile::exists(compressedFile));\n\n    // Decompress\n    QVERIFY(FileCompressor::gunzipFile(compressedFile, decompressedFile));\n    QVERIFY(QFile::exists(decompressedFile));\n\n    // Verify content\n    QFile resultFile(decompressedFile);\n    QVERIFY(resultFile.open(QIODevice::ReadOnly));\n    QCOMPARE(resultFile.readAll(), original);\n}\n\nvoid FileCompressorTest::gzipFile_largeFile_compressesAndDecompresses()\n{\n    QString sourceFile = tempDir->filePath(\"large_source.bin\");\n    QString compressedFile = tempDir->filePath(\"large_compressed.gz\");\n    QString decompressedFile = tempDir->filePath(\"large_decompressed.bin\");\n\n    // Create 5 MB source file with compressible data\n    QByteArray original = generateCompressibleData(5 * 1024 * 1024);\n    {\n        QFile file(sourceFile);\n        QVERIFY(file.open(QIODevice::WriteOnly));\n        file.write(original);\n    }\n\n    // Compress\n    QVERIFY(FileCompressor::gzipFile(sourceFile, compressedFile));\n    QVERIFY(QFile::exists(compressedFile));\n\n    // Compressed file should be smaller\n    QFileInfo compressedInfo(compressedFile);\n    QVERIFY(compressedInfo.size() < original.size() / 2);\n\n    // Decompress\n    QVERIFY(FileCompressor::gunzipFile(compressedFile, decompressedFile));\n\n    // Verify content\n    QFile resultFile(decompressedFile);\n    QVERIFY(resultFile.open(QIODevice::ReadOnly));\n    QCOMPARE(resultFile.readAll(), original);\n}\n\nvoid FileCompressorTest::gzipFile_nonExistentSource_returnsFalse()\n{\n    QString sourceFile = tempDir->filePath(\"non_existent_file.txt\");\n    QString compressedFile = tempDir->filePath(\"output.gz\");\n\n    QVERIFY(!FileCompressor::gzipFile(sourceFile, compressedFile));\n    QVERIFY(!QFile::exists(compressedFile));\n}\n\nvoid FileCompressorTest::gzipFile_invalidDestPath_returnsFalse()\n{\n    QString sourceFile = tempDir->filePath(\"source_for_invalid_dest.txt\");\n    QString invalidDest = \"/nonexistent/path/output.gz\";\n\n    // Create source file\n    {\n        QFile file(sourceFile);\n        QVERIFY(file.open(QIODevice::WriteOnly));\n        file.write(\"test\");\n    }\n\n    QVERIFY(!FileCompressor::gzipFile(sourceFile, invalidDest));\n}\n\nvoid FileCompressorTest::gzipFile_progressCallback_isCalled()\n{\n    QString sourceFile = tempDir->filePath(\"progress_source.bin\");\n    QString compressedFile = tempDir->filePath(\"progress_compressed.gz\");\n\n    // Create 1 MB file\n    QByteArray original = generateCompressibleData(1024 * 1024);\n    {\n        QFile file(sourceFile);\n        QVERIFY(file.open(QIODevice::WriteOnly));\n        file.write(original);\n    }\n\n    int callCount = 0;\n    qint64 lastProcessed = 0;\n    bool progressValid = true;\n\n    auto progressCallback = [&](qint64 processed, qint64 total) -> bool {\n        ++callCount;\n        if (processed < lastProcessed || total <= 0)\n            progressValid = false;\n        lastProcessed = processed;\n        return true;  // Continue\n    };\n\n    QVERIFY(FileCompressor::gzipFile(sourceFile, compressedFile, progressCallback));\n    QVERIFY(callCount > 0);\n    QVERIFY(progressValid);\n}\n\nvoid FileCompressorTest::gzipFile_progressCallbackCancel_stopsCompression()\n{\n    QString sourceFile = tempDir->filePath(\"cancel_source.bin\");\n    QString compressedFile = tempDir->filePath(\"cancel_compressed.gz\");\n\n    // Create 2 MB file\n    QByteArray original = generateCompressibleData(2 * 1024 * 1024);\n    {\n        QFile file(sourceFile);\n        QVERIFY(file.open(QIODevice::WriteOnly));\n        file.write(original);\n    }\n\n    int callCount = 0;\n\n    auto progressCallback = [&](qint64, qint64) -> bool {\n        ++callCount;\n        // Cancel after a few calls\n        return callCount < 3;\n    };\n\n    QVERIFY(!FileCompressor::gzipFile(sourceFile, compressedFile, progressCallback));\n    // Destination file should be cleaned up\n    QVERIFY(!QFile::exists(compressedFile));\n}\n\n// ============================================================================\n// Benchmarks\n// ============================================================================\n\nvoid FileCompressorTest::gzip_benchmark_compression()\n{\n    QByteArray data = generateCompressibleData(1024 * 1024);  // 1 MB\n\n    QByteArray compressed;\n    QBENCHMARK {\n        compressed = FileCompressor::gzip(data);\n    }\n\n    QVERIFY(!compressed.isEmpty());\n}\n\nvoid FileCompressorTest::gzip_benchmark_decompression()\n{\n    QByteArray data = generateCompressibleData(1024 * 1024);  // 1 MB\n    QByteArray compressed = FileCompressor::gzip(data);\n\n    QByteArray decompressed;\n    QBENCHMARK {\n        decompressed = FileCompressor::gunzip(compressed);\n    }\n\n    QCOMPARE(decompressed, data);\n}\n\nint main(int argc, char **argv)\n{\n    QCoreApplication app(argc, argv);\n    FileCompressorTest tc;\n    return QTest::qExec(&tc, argc, argv);\n}\n\n#include \"tst_filecompressor.moc\"\n"
  },
  {
    "path": "tests/GridsquareTest/GridsquareTest.pro",
    "content": "QT += testlib core\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_gridsquare\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_gridsquare.cpp \\\n    ../../data/Gridsquare.cpp \\\n    ../../core/LogLocale.cpp\n\nHEADERS += \\\n    ../../data/Gridsquare.h \\\n    ../../core/LogLocale.h\n"
  },
  {
    "path": "tests/GridsquareTest/tst_gridsquare.cpp",
    "content": "#include <QtTest>\n#include <QtMath>\n\n#include \"data/Gridsquare.h\"\n\nclass GridsquareTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTest();\n    void invalidGridStrings_data();\n    void invalidGridStrings();\n    void validGridStrings_data();\n    void validGridStrings();\n    void invalidCoordinateCtor_data();\n    void invalidCoordinateCtor();\n    void validCoordinateCtor_data();\n    void validCoordinateCtor();\n    void gridToLatLon_data();\n    void gridToLatLon();\n    void gridToLatLon_invalid_data();\n    void gridToLatLon_invalid();\n    void latLonInput_data();\n    void latLonInput();\n    void getGrid_data();\n    void getGrid();\n    void distanceToCoordinates_data();\n    void distanceToCoordinates();\n    void distanceToGrids_data();\n    void distanceToGrids();\n    void distanceSymmetry();\n    void bearingToCoordinates_data();\n    void bearingToCoordinates();\n    void bearingToGrids_data();\n    void bearingToGrids();\n    void bearingSymmetry();\n};\n\nvoid GridsquareTest::initTest()\n{\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid GridsquareTest::invalidGridStrings_data()\n{\n    QTest::addColumn<QString>(\"grid\");\n\n    const QStringList invalidGrids = {\n        \"aabbcc\",\n        \"112233\",\n        \"AA1122\",\n        \"11AA22\",\n        \"ZZ99AA\",\n        \"AABBCCDD\",\n        \"AABBCC11\",\n        \"11223344\",\n        \"AA112233\",\n        \"11AA2233\",\n        \"11AA22AA\",\n        \"ZZ99AA00\",\n        \"AA11AA00AA\"\n    };\n\n    for (const QString &grid : invalidGrids)\n    {\n        const QByteArray rowId = grid.toUtf8();\n        QTest::newRow(rowId.constData()) << grid;\n    }\n}\n\nvoid GridsquareTest::invalidGridStrings()\n{\n    QFETCH(QString, grid);\n\n    const Gridsquare gs(grid);\n    QVERIFY(!gs.isValid());\n    QCOMPARE(gs.getGrid(), QString());\n    QVERIFY(qIsNaN(gs.getLatitude()));\n    QVERIFY(qIsNaN(gs.getLongitude()));\n}\n\nvoid GridsquareTest::validGridStrings_data()\n{\n    QTest::addColumn<QString>(\"input\");\n    QTest::addColumn<QString>(\"expectedGrid\");\n\n    const struct Case { const char *input; const char *expected; } cases[] = {\n        {\"AA\", \"AA\"},\n        {\"AA11\", \"AA11\"},\n        {\"AA11AA\", \"AA11AA\"},\n        {\"AA11AA11\", \"AA11AA11\"},\n        {\"aa\", \"AA\"},\n        {\"aa11\", \"AA11\"},\n        {\"aa11aa\", \"AA11AA\"},\n        {\"aa11aa11\", \"AA11AA11\"},\n        {\"aA\", \"AA\"},\n        {\"aA11\", \"AA11\"},\n        {\"aA11Aa\", \"AA11AA\"},\n        {\"Aa11Aa11\", \"AA11AA11\"}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.input) << QString::fromLatin1(c.input)\n                               << QString::fromLatin1(c.expected);\n    }\n}\n\nvoid GridsquareTest::validGridStrings()\n{\n    QFETCH(QString, input);\n    QFETCH(QString, expectedGrid);\n\n    const Gridsquare gs(input);\n    QVERIFY(gs.isValid());\n    QCOMPARE(gs.getGrid(), expectedGrid);\n}\n\nvoid GridsquareTest::invalidCoordinateCtor_data()\n{\n    QTest::addColumn<double>(\"latitude\");\n    QTest::addColumn<double>(\"longitude\");\n\n    const struct Case { double lat; double lon; } cases[] = {\n        {250.0, 250.0},\n        {-250.0, 250.0},\n        {250.0, -250.0},\n        {-250.0, -250.0}\n    };\n\n    const int casesCount = sizeof(cases) / sizeof(cases[0]);\n    for (int i = 0; i < casesCount; ++i)\n    {\n        QTest::newRow(QString(\"invalid_coord_%1\").arg(i).toUtf8().constData())\n            << cases[i].lat << cases[i].lon;\n    }\n}\n\nvoid GridsquareTest::invalidCoordinateCtor()\n{\n    QFETCH(double, latitude);\n    QFETCH(double, longitude);\n\n    const Gridsquare gs(latitude, longitude);\n    QVERIFY(!gs.isValid());\n    QVERIFY(qIsNaN(gs.getLatitude()));\n    QVERIFY(qIsNaN(gs.getLongitude()));\n    QCOMPARE(gs.getGrid(), QString());\n}\n\nvoid GridsquareTest::validCoordinateCtor_data()\n{\n    QTest::addColumn<double>(\"latitude\");\n    QTest::addColumn<double>(\"longitude\");\n\n    const struct Case { double lat; double lon; } cases[] = {\n        {40.0, -179.0},\n        {40.0, 179.0},\n        {-40.0, -179.0},\n        {-40.0, 179.0}\n    };\n\n    const int casesCount = sizeof(cases) / sizeof(cases[0]);\n    for (int i = 0; i < casesCount; ++i)\n    {\n        QTest::newRow(QString(\"valid_coord_%1\").arg(i).toUtf8().constData())\n            << cases[i].lat << cases[i].lon;\n    }\n}\n\nvoid GridsquareTest::validCoordinateCtor()\n{\n    QFETCH(double, latitude);\n    QFETCH(double, longitude);\n\n    const Gridsquare gs(latitude, longitude);\n    QVERIFY(gs.isValid());\n    QCOMPARE(gs.getLatitude(), latitude);\n    QCOMPARE(gs.getLongitude(), longitude);\n}\n\nvoid GridsquareTest::gridToLatLon_data()\n{\n    QTest::addColumn<QString>(\"grid\");\n    QTest::addColumn<int>(\"expectedLatitude\");\n    QTest::addColumn<int>(\"expectedLongitude\");\n\n    const struct Case { const char *grid; int lat; int lon; } cases[] = {\n        {\"AA11\", -88, -177},\n        {\"AR11\", 82, -177},\n        {\"RA11\", -88, 163},\n        {\"RR11\", 82, 163},\n        {\"IJ11\", 2, -17},\n        {\"aa11\", -88, -177},\n        {\"ar11\", 82, -177},\n        {\"AA11AA\", -89, -178},\n        {\"AR11AA\", 81, -178},\n        {\"RA11AA\", -89, 162},\n        {\"RR11AA\", 81, 162},\n        {\"IJ11AA\", 1, -18},\n        {\"aa11aa\", -89, -178},\n        {\"ar11aa\", 81, -178},\n        {\"aa11AA\", -89, -178},\n        {\"ar11AA\", 81, -178},\n        {\"AA11aa\", -89, -178},\n        {\"AR11aa\", 81, -178},\n        {\"AA11AA11\", -89, -178},\n        {\"AR11AA11\", 81, -178},\n        {\"RA11AA11\", -89, 162},\n        {\"RR11AA11\", 81, 162},\n        {\"IJ11AA11\", 1, -18},\n        {\"aa11aa11\", -89, -178},\n        {\"ar11aa11\", 81, -178},\n        {\"aa11AA11\", -89, -178},\n        {\"ar11AA11\", 81, -178},\n        {\"AA11aa11\", -89, -178},\n        {\"AR11aa11\", 81, -178}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.grid)\n            << QString::fromLatin1(c.grid)\n            << c.lat\n            << c.lon;\n    }\n}\n\nvoid GridsquareTest::gridToLatLon()\n{\n    QFETCH(QString, grid);\n    QFETCH(int, expectedLatitude);\n    QFETCH(int, expectedLongitude);\n\n    const Gridsquare gs(grid);\n    QVERIFY(gs.isValid());\n    // Use floor(d + 0.5) instead of qRound() to get consistent \"round half up\"\n    // behaviour across platforms. qRound() for negative half-integers (e.g. -88.5)\n    // produces different results on MSVC vs GCC due to floating-point precision.\n    QCOMPARE(static_cast<int>(std::floor(gs.getLatitude()  + 0.5)), expectedLatitude);\n    QCOMPARE(static_cast<int>(std::floor(gs.getLongitude() + 0.5)), expectedLongitude);\n}\n\nvoid GridsquareTest::gridToLatLon_invalid_data()\n{\n    QTest::addColumn<QString>(\"grid\");\n\n    const QStringList invalids = {\n        \"ZZ11\",\n        \"ZZ11AA\",\n        \"ZZ11AA11\"\n    };\n\n    for (const QString &grid : invalids)\n    {\n        QTest::newRow(grid.toUtf8().constData()) << grid;\n    }\n}\n\nvoid GridsquareTest::gridToLatLon_invalid()\n{\n    QFETCH(QString, grid);\n    const Gridsquare gs(grid);\n    QVERIFY(!gs.isValid());\n    QVERIFY(qIsNaN(gs.getLatitude()));\n    QVERIFY(qIsNaN(gs.getLongitude()));\n}\n\nvoid GridsquareTest::latLonInput_data()\n{\n    QTest::addColumn<double>(\"latitude\");\n    QTest::addColumn<double>(\"longitude\");\n\n    const struct Case { double lat; double lon; } cases[] = {\n        {18.0, 17.9},\n        {-14.9, 179.0},\n        {14.9, -179.0},\n        {-14.9, -179.0}\n    };\n\n    const int casesCount = sizeof(cases) / sizeof(cases[0]);\n    for (int i = 0; i < casesCount; ++i)\n    {\n        QTest::newRow(QString(\"latlon_input_%1\").arg(i).toUtf8().constData())\n            << cases[i].lat << cases[i].lon;\n    }\n}\n\nvoid GridsquareTest::latLonInput()\n{\n    QFETCH(double, latitude);\n    QFETCH(double, longitude);\n\n    const Gridsquare gs(latitude, longitude);\n    QVERIFY(gs.isValid());\n    QCOMPARE(gs.getLatitude(), latitude);\n    QCOMPARE(gs.getLongitude(), longitude);\n}\n\nvoid GridsquareTest::getGrid_data()\n{\n    QTest::addColumn<bool>(\"fromCoordinates\");\n    QTest::addColumn<QString>(\"gridInput\");\n    QTest::addColumn<double>(\"latitude\");\n    QTest::addColumn<double>(\"longitude\");\n    QTest::addColumn<QString>(\"expectedGrid\");\n\n    struct Case\n    {\n        const char *name;\n        bool fromCoordinates;\n        const char *gridInput;\n        double lat;\n        double lon;\n        const char *expected;\n    };\n\n    const Case cases[] = {\n        {\"invalid_string\", false, \"INVALID\", 0.0, 0.0, \"\"},\n        {\"from_coordinates\", true, \"\", 18.0, 17.9, \"JK88WA\"},\n        {\"two_chars\", false, \"AA\", 0.0, 0.0, \"AA\"},\n        {\"four_chars\", false, \"AA11\", 0.0, 0.0, \"AA11\"},\n        {\"six_chars\", false, \"AA11CD\", 0.0, 0.0, \"AA11CD\"},\n        {\"eight_chars\", false, \"AA11CD22\", 0.0, 0.0, \"AA11CD22\"},\n        {\"normalize\", false, \"AA11cd22\", 0.0, 0.0, \"AA11CD22\"}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << c.fromCoordinates\n            << QString::fromLatin1(c.gridInput)\n            << c.lat\n            << c.lon\n            << QString::fromLatin1(c.expected);\n    }\n}\n\nvoid GridsquareTest::getGrid()\n{\n    QFETCH(bool, fromCoordinates);\n    QFETCH(QString, gridInput);\n    QFETCH(double, latitude);\n    QFETCH(double, longitude);\n    QFETCH(QString, expectedGrid);\n\n    const Gridsquare gs = fromCoordinates\n                              ? Gridsquare(latitude, longitude)\n                              : Gridsquare(gridInput);\n    QCOMPARE(gs.getGrid(), expectedGrid);\n}\n\nvoid GridsquareTest::distanceToCoordinates_data()\n{\n    QTest::addColumn<bool>(\"fromCoordinates\");\n    QTest::addColumn<QString>(\"gridInput\");\n    QTest::addColumn<double>(\"sourceLat\");\n    QTest::addColumn<double>(\"sourceLon\");\n    QTest::addColumn<double>(\"targetLat\");\n    QTest::addColumn<double>(\"targetLon\");\n    QTest::addColumn<bool>(\"expectedResult\");\n    QTest::addColumn<int>(\"expectedRoundedDistance\");\n\n    struct Case\n    {\n        const char *name;\n        bool fromCoordinates;\n        const char *gridInput;\n        double sourceLat;\n        double sourceLon;\n        double targetLat;\n        double targetLon;\n        bool expectedResult;\n        int expectedRoundedDistance;\n    };\n\n    const Case cases[] = {\n        {\"invalid_grid\", false, \"18123\", 0.0, 0.0, 12.0, 17.9, false, 0},\n        {\"from_latlon\", true, \"\", 18.0, 17.9, 12.0, 17.9, true, 667},\n        {\"grid_aa11\", false, \"AA11\", 0.0, 0.0, 12.0, 17.9, true, 11504},\n        {\"grid_aa11cd\", false, \"AA11CD\", 0.0, 0.0, 12.0, 17.9, true, 11465},\n        {\"grid_aa11cd22\", false, \"AA11CD22\", 0.0, 0.0, 12.0, 17.9, true, 11464},\n        {\"grid_aa11cd22_lower\", false, \"AA11cd22\", 0.0, 0.0, 12.0, 17.9, true, 11464}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << c.fromCoordinates\n            << QString::fromLatin1(c.gridInput)\n            << c.sourceLat\n            << c.sourceLon\n            << c.targetLat\n            << c.targetLon\n            << c.expectedResult\n            << c.expectedRoundedDistance;\n    }\n}\n\nvoid GridsquareTest::distanceToCoordinates()\n{\n    QFETCH(bool, fromCoordinates);\n    QFETCH(QString, gridInput);\n    QFETCH(double, sourceLat);\n    QFETCH(double, sourceLon);\n    QFETCH(double, targetLat);\n    QFETCH(double, targetLon);\n    QFETCH(bool, expectedResult);\n    QFETCH(int, expectedRoundedDistance);\n\n    const Gridsquare source = fromCoordinates\n                                  ? Gridsquare(sourceLat, sourceLon)\n                                  : Gridsquare(gridInput);\n\n    double distance = -1.0;\n    QCOMPARE(source.distanceTo(targetLat, targetLon, distance), expectedResult);\n\n    if (expectedResult)\n    {\n        QCOMPARE(qRound(distance), expectedRoundedDistance);\n    }\n    else\n    {\n        QCOMPARE(distance, 0.0);\n    }\n}\n\nvoid GridsquareTest::distanceToGrids_data()\n{\n    QTest::addColumn<QString>(\"sourceGrid\");\n    QTest::addColumn<QString>(\"targetGrid\");\n    QTest::addColumn<int>(\"expectedRoundedDistance\");\n\n    const struct Case { const char *name; const char *source; const char *target; int distance; } cases[] = {\n        {\"long_short_path\", \"JO80AA\", \"CD01AA\", 18189},\n        {\"long_short_path2\", \"JO80AA\", \"RE01AA\", 17439},\n        {\"dateline_shortest\", \"RB80AA\", \"AA01AA\", 1001}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << QString::fromLatin1(c.source)\n            << QString::fromLatin1(c.target)\n            << c.distance;\n    }\n}\n\nvoid GridsquareTest::distanceToGrids()\n{\n    QFETCH(QString, sourceGrid);\n    QFETCH(QString, targetGrid);\n    QFETCH(int, expectedRoundedDistance);\n\n    const Gridsquare source(sourceGrid);\n    const Gridsquare target(targetGrid);\n\n    double distance = -1.0;\n    QVERIFY(source.distanceTo(target, distance));\n    QCOMPARE(qRound(distance), expectedRoundedDistance);\n}\n\nvoid GridsquareTest::distanceSymmetry()\n{\n    const Gridsquare gridA(\"RB80AA\");\n    const Gridsquare gridB(\"AA01AA\");\n\n    QVERIFY(gridA.isValid());\n    QVERIFY(gridB.isValid());\n\n    double distanceAB = -1.0;\n    double distanceBA = -1.0;\n    QVERIFY(gridA.distanceTo(gridB, distanceAB));\n    QVERIFY(gridB.distanceTo(gridA, distanceBA));\n    QCOMPARE(distanceAB, distanceBA);\n\n    double sameDistance = -1.0;\n    QVERIFY(gridA.distanceTo(gridA, sameDistance));\n    QCOMPARE(sameDistance, 0.0);\n}\n\nvoid GridsquareTest::bearingToCoordinates_data()\n{\n    QTest::addColumn<bool>(\"fromCoordinates\");\n    QTest::addColumn<QString>(\"gridInput\");\n    QTest::addColumn<double>(\"sourceLat\");\n    QTest::addColumn<double>(\"sourceLon\");\n    QTest::addColumn<double>(\"targetLat\");\n    QTest::addColumn<double>(\"targetLon\");\n    QTest::addColumn<bool>(\"expectedResult\");\n    QTest::addColumn<int>(\"expectedRoundedBearing\");\n\n    struct Case\n    {\n        const char *name;\n        bool fromCoordinates;\n        const char *gridInput;\n        double sourceLat;\n        double sourceLon;\n        double targetLat;\n        double targetLon;\n        bool expectedResult;\n        int expectedRoundedBearing;\n    };\n\n    const Case cases[] = {\n        {\"invalid_grid\", false, \"18123\", 0.0, 0.0, 12.0, 17.9, false, 0},\n        {\"from_latlon\", true, \"\", 18.0, 17.9, 12.0, 17.9, true, 180},\n        {\"grid_aa11\", false, \"AA11\", 0.0, 0.0, 12.0, 17.9, true, 195},\n        {\"grid_aa11cd\", false, \"AA11CD\", 0.0, 0.0, 12.0, 17.9, true, 196},\n        {\"grid_aa11cd22\", false, \"AA11CD22\", 0.0, 0.0, 12.0, 17.9, true, 196},\n        {\"grid_aa11cd22_lower\", false, \"AA11cd22\", 0.0, 0.0, 12.0, 17.9, true, 196}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << c.fromCoordinates\n            << QString::fromLatin1(c.gridInput)\n            << c.sourceLat\n            << c.sourceLon\n            << c.targetLat\n            << c.targetLon\n            << c.expectedResult\n            << c.expectedRoundedBearing;\n    }\n}\n\nvoid GridsquareTest::bearingToCoordinates()\n{\n    QFETCH(bool, fromCoordinates);\n    QFETCH(QString, gridInput);\n    QFETCH(double, sourceLat);\n    QFETCH(double, sourceLon);\n    QFETCH(double, targetLat);\n    QFETCH(double, targetLon);\n    QFETCH(bool, expectedResult);\n    QFETCH(int, expectedRoundedBearing);\n\n    const Gridsquare source = fromCoordinates\n                                  ? Gridsquare(sourceLat, sourceLon)\n                                  : Gridsquare(gridInput);\n\n    double bearing = -1.0;\n    QCOMPARE(source.bearingTo(targetLat, targetLon, bearing), expectedResult);\n\n    if (expectedResult)\n    {\n        QCOMPARE(qRound(bearing), expectedRoundedBearing);\n    }\n    else\n    {\n        QCOMPARE(bearing, 0.0);\n    }\n}\n\nvoid GridsquareTest::bearingToGrids_data()\n{\n    QTest::addColumn<QString>(\"sourceGrid\");\n    QTest::addColumn<QString>(\"targetGrid\");\n    QTest::addColumn<int>(\"expectedRoundedBearing\");\n\n    const struct Case { const char *name; const char *source; const char *target; int bearing; } cases[] = {\n        {\"long_short_path\", \"JO80AA\", \"CD01AA\", 228},\n        {\"long_short_path2\", \"JO80AA\", \"RE01AA\", 101},\n        {\"dateline_shortest\", \"RB80AA\", \"AA01AA\", 180}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name)\n            << QString::fromLatin1(c.source)\n            << QString::fromLatin1(c.target)\n            << c.bearing;\n    }\n}\n\nvoid GridsquareTest::bearingToGrids()\n{\n    QFETCH(QString, sourceGrid);\n    QFETCH(QString, targetGrid);\n    QFETCH(int, expectedRoundedBearing);\n\n    const Gridsquare source(sourceGrid);\n    const Gridsquare target(targetGrid);\n\n    double bearing = -1.0;\n    QVERIFY(source.bearingTo(target, bearing));\n    QCOMPARE(qRound(bearing), expectedRoundedBearing);\n}\n\nvoid GridsquareTest::bearingSymmetry()\n{\n    const Gridsquare gridA(\"JO80AA\");\n    const Gridsquare gridB(\"JO80AA\");\n\n    QVERIFY(gridA.isValid());\n    QVERIFY(gridB.isValid());\n\n    double bearingAB = -1.0;\n    double bearingBA = -1.0;\n    QVERIFY(gridA.bearingTo(gridB, bearingAB));\n    QVERIFY(gridB.bearingTo(gridA, bearingBA));\n    QCOMPARE(bearingAB, bearingBA);\n    QCOMPARE(bearingAB, 0.0);\n}\n\nQTEST_APPLESS_MAIN(GridsquareTest)\n\n#include \"tst_gridsquare.moc\"\n"
  },
  {
    "path": "tests/HostsPortStringTest/HostsPortStringTest.pro",
    "content": "QT += testlib core network\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_hostsportstring\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_hostsportstring.cpp \\\n    ../../data/HostsPortString.cpp\n\nHEADERS += \\\n    ../../data/HostsPortString.h\n"
  },
  {
    "path": "tests/HostsPortStringTest/tst_hostsportstring.cpp",
    "content": "#include <QtTest>\n\n#include \"data/HostsPortString.h\"\n\nusing AddressExpectation = QList<QPair<QString, quint16>>;\nQ_DECLARE_METATYPE(AddressExpectation)\n\nclass HostsPortStringTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n\n    void regexValidation_data();\n    void regexValidation();\n    void parsing_data();\n    void parsing();\n    void hasLocalIPWithPort_data();\n    void hasLocalIPWithPort();\n    void hostPortAddress_basic();\n    void hostPortAddress_equality();\n};\n\nvoid HostsPortStringTest::initTestCase()\n{\n    qRegisterMetaType<QList<QPair<QString, quint16>>>(\"AddressExpectation\");\n    QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid HostsPortStringTest::regexValidation_data()\n{\n    QTest::addColumn<QString>(\"input\");\n    QTest::addColumn<bool>(\"expectedMatch\");\n\n    struct Case { const char *name; const char *input; bool match; } cases[] = {\n        {\"single_address\", \"127.0.0.1:80\", true},\n        {\"multiple_addresses\", \"192.168.1.1:1 10.0.0.1:65535\", true},\n        {\"trailing_space\", \"10.10.10.10:12345 \", true},\n        {\"empty_string\", \"\", false},\n        {\"missing_port\", \"127.0.0.1\", false},\n        {\"invalid_ip\", \"300.0.0.1:80\", false},\n        {\"hostname\", \"example.com:80\", false}\n    };\n\n    for (const Case &c : cases)\n    {\n        QTest::newRow(c.name) << QString::fromLatin1(c.input) << c.match;\n    }\n}\n\nvoid HostsPortStringTest::regexValidation()\n{\n    QFETCH(QString, input);\n    QFETCH(bool, expectedMatch);\n\n    const QRegularExpression regex = HostsPortString::hostsPortRegEx();\n    const bool actual = regex.match(input).hasMatch();\n    QCOMPARE(actual, expectedMatch);\n}\n\nvoid HostsPortStringTest::parsing_data()\n{\n    QTest::addColumn<QString>(\"input\");\n    QTest::addColumn<AddressExpectation>(\"expected\");\n\n    QTest::newRow(\"empty\") << QString() << AddressExpectation{};\n\n    AddressExpectation basic;\n    basic << qMakePair(QStringLiteral(\"127.0.0.1\"), quint16(80))\n          << qMakePair(QStringLiteral(\"10.0.0.5\"), quint16(123));\n    QTest::newRow(\"basic_valid\") << QStringLiteral(\"127.0.0.1:80 10.0.0.5:123\") << basic;\n\n    AddressExpectation filtered;\n    filtered << qMakePair(QStringLiteral(\"127.0.0.1\"), quint16(80))\n             << qMakePair(QStringLiteral(\"1.1.1.1\"), quint16(65535));\n    QTest::newRow(\"mixed_tokens\") << QStringLiteral(\"127.0.0.1:80 invalid 192.168.0.1:-1 0.0.0.0:70000 1.1.1.1:65535\")\n                                  << filtered;\n}\n\nvoid HostsPortStringTest::parsing()\n{\n    QFETCH(QString, input);\n    QFETCH(AddressExpectation, expected);\n\n    const HostsPortString hosts(input);\n    const QList<HostPortAddress> actual = hosts.getAddrList();\n\n    QCOMPARE(actual.size(), expected.size());\n\n    for (int i = 0; i < actual.size(); ++i)\n    {\n        QCOMPARE(actual.at(i).toString(), expected.at(i).first);\n        QCOMPARE(actual.at(i).getPort(), expected.at(i).second);\n    }\n}\n\nvoid HostsPortStringTest::hasLocalIPWithPort_data()\n{\n    QTest::addColumn<QString>(\"input\");\n    QTest::addColumn<int>(\"port\");\n    QTest::addColumn<bool>(\"expected\");\n\n    QTest::newRow(\"loopback_match\") << QStringLiteral(\"127.0.0.1:4321\") << 4321 << true;\n    QTest::newRow(\"loopback_wrong_port\") << QStringLiteral(\"127.0.0.1:4321\") << 1111 << false;\n    QTest::newRow(\"wildcard_match\") << QStringLiteral(\"0.0.0.0:5555\") << 5555 << true;\n    QTest::newRow(\"non_local\") << QStringLiteral(\"192.0.2.1:6000\") << 6000 << false;\n}\n\nvoid HostsPortStringTest::hasLocalIPWithPort()\n{\n    QFETCH(QString, input);\n    QFETCH(int, port);\n    QFETCH(bool, expected);\n\n    const HostsPortString hosts(input);\n    QCOMPARE(hosts.hasLocalIPWithPort(port), expected);\n}\n\nvoid HostsPortStringTest::hostPortAddress_basic()\n{\n    HostPortAddress addr(QStringLiteral(\"127.0.0.1\"), 1234);\n    QCOMPARE(addr.getPort(), quint16(1234));\n\n    addr.setPort(4321);\n    QCOMPARE(addr.getPort(), quint16(4321));\n    QCOMPARE(addr.toString(), QStringLiteral(\"127.0.0.1\"));\n}\n\nvoid HostsPortStringTest::hostPortAddress_equality()\n{\n    const HostPortAddress addr1(QStringLiteral(\"127.0.0.1\"), 80);\n    const HostPortAddress addr2(QStringLiteral(\"127.0.0.1\"), 80);\n    const HostPortAddress addrDifferentPort(QStringLiteral(\"127.0.0.1\"), 81);\n    const HostPortAddress addrDifferentHost(QStringLiteral(\"10.0.0.1\"), 80);\n\n    QVERIFY(addr1 == addr2);\n    QVERIFY(!(addr1 == addrDifferentPort));\n    QVERIFY(!(addr1 == addrDifferentHost));\n}\n\nQTEST_APPLESS_MAIN(HostsPortStringTest)\n\n#include \"tst_hostsportstring.moc\"\n"
  },
  {
    "path": "tests/MigrationTest/MigrationTest.pro",
    "content": "QT += testlib sql core widgets network\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_migration\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_migration.cpp\n\nRESOURCES += \\\n    ../../res/res.qrc\n\nHEADERS += \\\n    ../../core/Migration.h\n"
  },
  {
    "path": "tests/MigrationTest/tst_migration.cpp",
    "content": "#include <QtTest>\n#include <QTemporaryDir>\n#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QFile>\n#include <QTextStream>\n\n\n#include \"core/Migration.h\"\n\nclass MigrationSqlTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n    void migrateVersion_data();\n    void migrateVersion();\n\nprivate:\n    QScopedPointer<QTemporaryDir> tempDir;\n    QString dbPath;\n\n    bool executeSqlFile(int version);\n    int currentVersion() const;\n};\n\nvoid MigrationSqlTest::initTestCase()\n{\n    Q_INIT_RESOURCE(res);\n\n    tempDir.reset(new QTemporaryDir);\n    QVERIFY(tempDir->isValid());\n    dbPath = tempDir->filePath(QStringLiteral(\"migration_sql_test.sqlite\"));\n\n    QSqlDatabase db = QSqlDatabase::addDatabase(QStringLiteral(\"QSQLITE\"));\n    db.setDatabaseName(dbPath);\n    db.setConnectOptions(\"QSQLITE_ENABLE_REGEXP\");\n    QVERIFY2(db.open(), qPrintable(db.lastError().text()));\n\n    QSqlQuery query(QStringLiteral(\"CREATE TABLE schema_versions (version INTEGER PRIMARY KEY, updated TEXT NOT NULL)\"));\n    QVERIFY2(query.isActive(), qPrintable(query.lastError().text()));\n\n    QSqlQuery insert(QStringLiteral(\"INSERT INTO schema_versions (version, updated) VALUES (0, datetime('now'))\"));\n    QVERIFY2(insert.isActive(), qPrintable(insert.lastError().text()));\n}\n\nvoid MigrationSqlTest::cleanupTestCase()\n{\n    {\n        QSqlDatabase db = QSqlDatabase::database();\n        if (db.isValid())\n            db.close();\n    }\n    QSqlDatabase::removeDatabase(QSqlDatabase::defaultConnection);\n}\n\nbool MigrationSqlTest::executeSqlFile(int version)\n{\n    const QString resourceName = QStringLiteral(\":/res/sql/migration_%1.sql\")\n                                     .arg(version, 3, 10, QChar('0'));\n    QFile sqlFile(resourceName);\n    if (!sqlFile.open(QIODevice::ReadOnly | QIODevice::Text))\n    {\n        QWARN(qPrintable(QStringLiteral(\"Cannot open %1\").arg(resourceName)));\n        return false;\n    }\n\n    const QString sqlContent = QTextStream(&sqlFile).readAll();\n    sqlFile.close();\n\n    const QStringList statements = sqlContent.split('\\n').join(QStringLiteral(\" \")).split(';');\n\n    QSqlDatabase db = QSqlDatabase::database();\n    QSqlQuery query(db);\n\n    if (!db.transaction())\n        return false;\n\n    for (const QString &statement : statements)\n    {\n        const QString trimmed = statement.trimmed();\n        if (trimmed.isEmpty())\n            continue;\n\n        if (!query.exec(trimmed))\n        {\n            qWarning() << \"SQL execution failed for version\" << version\n                       << \":\" << trimmed << query.lastError();\n            db.rollback();\n            return false;\n        }\n    }\n\n    QSqlQuery versionInsert(db);\n    if (!versionInsert.prepare(QStringLiteral(\"INSERT INTO schema_versions (version, updated) VALUES (:version, datetime('now'))\")))\n    {\n        db.rollback();\n        return false;\n    }\n    versionInsert.bindValue(QStringLiteral(\":version\"), version);\n    if (!versionInsert.exec())\n    {\n        db.rollback();\n        return false;\n    }\n\n    return db.commit();\n}\n\nint MigrationSqlTest::currentVersion() const\n{\n    QSqlQuery query(QStringLiteral(\"SELECT MAX(version) FROM schema_versions\"));\n    if (!query.first())\n        return -1;\n    return query.value(0).toInt();\n}\n\nclass MigrationSqlTest_FriendAccessor\n{\npublic:\n    static int latestVersion() { return DBSchemaMigration::latestVersion; }\n};\n\nvoid MigrationSqlTest::migrateVersion_data()\n{\n    QTest::addColumn<int>(\"targetVersion\");\n\n    const int latestVersion = MigrationSqlTest_FriendAccessor::latestVersion();\n    for (int version = 1; version <= latestVersion; ++version)\n    {\n        QTest::newRow(QStringLiteral(\"migration_%1\").arg(version, 3, 10, QChar('0')).toUtf8().constData())\n            << version;\n    }\n}\n\nvoid MigrationSqlTest::migrateVersion()\n{\n    QFETCH(int, targetVersion);\n\n    const int expectedCurrent = targetVersion - 1;\n    QCOMPARE(currentVersion(), expectedCurrent);\n\n    QVERIFY2(executeSqlFile(targetVersion),\n             qPrintable(QStringLiteral(\"Migration SQL file %1 failed\").arg(targetVersion, 3, 10, QChar('0'))));\n    QCOMPARE(currentVersion(), targetVersion);\n}\n\nQTEST_MAIN(MigrationSqlTest)\n\n#include \"tst_migration.moc\"\n"
  },
  {
    "path": "tests/PasswordCipherTest/PasswordCipherTest.pro",
    "content": "QT += testlib core\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_passwordcipher\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_passwordcipher.cpp \\\n    ../../core/PasswordCipher.cpp\n\nHEADERS += \\\n    ../../core/PasswordCipher.h\n\n# OpenSSL\n!isEmpty(OPENSSLINCLUDEPATH) {\n    INCLUDEPATH += $$OPENSSLINCLUDEPATH\n}\n!isEmpty(OPENSSLLIBPATH) {\n    LIBS += -L$$OPENSSLLIBPATH\n}\n\nwin32 {\n    LIBS += -llibcrypto\n} else {\n    LIBS += -lcrypto\n}\n"
  },
  {
    "path": "tests/PasswordCipherTest/tst_passwordcipher.cpp",
    "content": "#include <QtTest>\n#include <QRandomGenerator>\n\n#include \"core/PasswordCipher.h\"\n\nclass PasswordCipherTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    // Basic functionality\n    void encrypt_emptyPlaintext_succeeds();\n    void encrypt_smallData_encryptsAndDecrypts();\n    void encrypt_largeData_encryptsAndDecrypts();\n    void encrypt_binaryData_encryptsAndDecrypts();\n    void encrypt_unicodePassword_works();\n    void encrypt_longPassword_works();\n\n    // Decryption failures\n    void decrypt_wrongPassword_fails();\n    void decrypt_invalidBase64_fails();\n    void decrypt_truncatedData_fails();\n    void decrypt_corruptedData_fails();\n    void decrypt_modifiedCiphertext_fails();\n    void decrypt_modifiedTag_fails();\n\n    // Edge cases\n    void encrypt_emptyPassword_succeeds();\n    void encrypt_sameDataTwice_producesDifferentOutput();\n\n    // Security properties\n    void encrypt_outputIsBase64();\n    void encrypt_outputContainsMagicHeader();\n\n    // Benchmarks\n    void encrypt_benchmark();\n    void decrypt_benchmark();\n\nprivate:\n    QByteArray generateRandomData(int size);\n};\n\nQByteArray PasswordCipherTest::generateRandomData(int size)\n{\n    QByteArray data(size, '\\0');\n    for (int i = 0; i < size; ++i)\n        data[i] = static_cast<char>(QRandomGenerator::global()->bounded(256));\n    return data;\n}\n\n// ============================================================================\n// Basic functionality\n// ============================================================================\n\nvoid PasswordCipherTest::encrypt_emptyPlaintext_succeeds()\n{\n    // PasswordCipher intentionally rejects empty plaintext for security reasons\n    QString password = \"test-password\";\n    QByteArray plaintext;  // empty\n    QByteArray encrypted;\n\n    // Empty plaintext should be rejected\n    QVERIFY(!PasswordCipher::encrypt(password, plaintext, encrypted));\n    QVERIFY(encrypted.isEmpty());\n}\n\nvoid PasswordCipherTest::encrypt_smallData_encryptsAndDecrypts()\n{\n    QString password = \"my-secret-password-123\";\n    QByteArray plaintext = \"Hello, World! This is a secret message.\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n    QVERIFY(!encrypted.isEmpty());\n    QVERIFY(encrypted != plaintext);\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\nvoid PasswordCipherTest::encrypt_largeData_encryptsAndDecrypts()\n{\n    QString password = \"password-for-large-data\";\n    QByteArray plaintext = generateRandomData(1024 * 1024);  // 1 MB\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n    QVERIFY(!encrypted.isEmpty());\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\nvoid PasswordCipherTest::encrypt_binaryData_encryptsAndDecrypts()\n{\n    QString password = \"binary-data-password\";\n    // Create binary data with all byte values including null bytes\n    QByteArray plaintext;\n    for (int i = 0; i < 256; ++i)\n        plaintext.append(static_cast<char>(i));\n\n    QByteArray encrypted;\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\nvoid PasswordCipherTest::encrypt_unicodePassword_works()\n{\n    QString password = QString::fromUtf8(\"密码测试🔐\");  // Chinese + emoji\n    QByteArray plaintext = \"Secret data with unicode password\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\nvoid PasswordCipherTest::encrypt_longPassword_works()\n{\n    // Very long password (1000 characters)\n    QString password = QString(\"a\").repeated(1000);\n    QByteArray plaintext = \"Data encrypted with very long password\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\n// ============================================================================\n// Decryption failures\n// ============================================================================\n\nvoid PasswordCipherTest::decrypt_wrongPassword_fails()\n{\n    QString correctPassword = \"correct-password\";\n    QString wrongPassword = \"wrong-password\";\n    QByteArray plaintext = \"Secret message\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(correctPassword, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(wrongPassword, encrypted, decrypted));\n}\n\nvoid PasswordCipherTest::decrypt_invalidBase64_fails()\n{\n    QString password = \"password\";\n    QByteArray invalidBase64 = \"This is not valid base64!!!@@@\";\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(password, invalidBase64, decrypted));\n}\n\nvoid PasswordCipherTest::decrypt_truncatedData_fails()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Some data to encrypt\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Truncate the encrypted data\n    QByteArray truncated = encrypted.left(encrypted.size() / 2);\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(password, truncated, decrypted));\n}\n\nvoid PasswordCipherTest::decrypt_corruptedData_fails()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Data to be corrupted\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Decode, corrupt, re-encode\n    QByteArray decoded = QByteArray::fromBase64(encrypted);\n    if (decoded.size() > 20)\n        decoded[20] = static_cast<char>(decoded[20] ^ 0xFF);  // Flip bits in the middle\n    QByteArray corrupted = decoded.toBase64();\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(password, corrupted, decrypted));\n}\n\nvoid PasswordCipherTest::decrypt_modifiedCiphertext_fails()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Original plaintext data\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Decode and modify ciphertext portion (after header)\n    QByteArray decoded = QByteArray::fromBase64(encrypted);\n    // Header is about 16 bytes + salt(16) + iv(12) = 44 bytes, then ciphertext starts\n    if (decoded.size() > 50)\n        decoded[50] = static_cast<char>(decoded[50] ^ 0xFF);\n    QByteArray modified = decoded.toBase64();\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(password, modified, decrypted));\n}\n\nvoid PasswordCipherTest::decrypt_modifiedTag_fails()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Data with protected integrity\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Decode and modify the last byte (part of tag)\n    QByteArray decoded = QByteArray::fromBase64(encrypted);\n    if (!decoded.isEmpty())\n        decoded[decoded.size() - 1] = static_cast<char>(decoded[decoded.size() - 1] ^ 0xFF);\n    QByteArray modified = decoded.toBase64();\n\n    QByteArray decrypted;\n    QVERIFY(!PasswordCipher::decrypt(password, modified, decrypted));\n}\n\n// ============================================================================\n// Edge cases\n// ============================================================================\n\nvoid PasswordCipherTest::encrypt_emptyPassword_succeeds()\n{\n    QString password;  // empty\n    QByteArray plaintext = \"Data with empty password\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted, decrypted));\n    QCOMPARE(decrypted, plaintext);\n}\n\nvoid PasswordCipherTest::encrypt_sameDataTwice_producesDifferentOutput()\n{\n    QString password = \"same-password\";\n    QByteArray plaintext = \"Same plaintext data\";\n\n    QByteArray encrypted1, encrypted2;\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted1));\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted2));\n\n    // Due to random salt and IV, outputs should be different\n    QVERIFY(encrypted1 != encrypted2);\n\n    // But both should decrypt to the same plaintext\n    QByteArray decrypted1, decrypted2;\n    QVERIFY(PasswordCipher::decrypt(password, encrypted1, decrypted1));\n    QVERIFY(PasswordCipher::decrypt(password, encrypted2, decrypted2));\n    QCOMPARE(decrypted1, plaintext);\n    QCOMPARE(decrypted2, plaintext);\n}\n\n// ============================================================================\n// Security properties\n// ============================================================================\n\nvoid PasswordCipherTest::encrypt_outputIsBase64()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Test data\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Verify it's valid base64 by decoding\n    QByteArray decoded = QByteArray::fromBase64(encrypted, QByteArray::Base64Encoding);\n    QVERIFY(!decoded.isEmpty());\n\n    // Re-encode should match (possibly with padding differences)\n    QByteArray reencoded = decoded.toBase64();\n    QCOMPARE(reencoded, encrypted);\n}\n\nvoid PasswordCipherTest::encrypt_outputContainsMagicHeader()\n{\n    QString password = \"password\";\n    QByteArray plaintext = \"Test data\";\n    QByteArray encrypted;\n\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    // Decode and check magic header\n    QByteArray decoded = QByteArray::fromBase64(encrypted);\n    QVERIFY(decoded.size() >= 4);\n    QCOMPARE(decoded.left(4), QByteArray(\"PMGR\"));\n}\n\n// ============================================================================\n// Benchmarks\n// ============================================================================\n\nvoid PasswordCipherTest::encrypt_benchmark()\n{\n    QString password = \"benchmark-password\";\n    QByteArray plaintext = generateRandomData(10000);  // 10 KB\n\n    QByteArray encrypted;\n    QBENCHMARK {\n        PasswordCipher::encrypt(password, plaintext, encrypted);\n    }\n}\n\nvoid PasswordCipherTest::decrypt_benchmark()\n{\n    QString password = \"benchmark-password\";\n    QByteArray plaintext = generateRandomData(10000);  // 10 KB\n    QByteArray encrypted;\n    QVERIFY(PasswordCipher::encrypt(password, plaintext, encrypted));\n\n    QByteArray decrypted;\n    QBENCHMARK {\n        PasswordCipher::decrypt(password, encrypted, decrypted);\n    }\n}\n\nint main(int argc, char **argv)\n{\n    QCoreApplication app(argc, argv);\n    PasswordCipherTest tc;\n    return QTest::qExec(&tc, argc, argv);\n}\n\n#include \"tst_passwordcipher.moc\"\n"
  },
  {
    "path": "tests/QuadKeyCacheTest/QuadKeyCacheTest.pro",
    "content": "QT += testlib core\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_quadkeycache\n\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_quadkeycache.cpp\n\nHEADERS += \\\n    ../../core/QuadKeyCache.h\n"
  },
  {
    "path": "tests/QuadKeyCacheTest/tst_quadkeycache.cpp",
    "content": "#include <QtTest>\n\n#include \"core/QuadKeyCache.h\"\n\nnamespace {\nstruct DummyValue\n{\n    DummyValue(int v = 0) : payload(v) {}\n    int payload = 0;\n};\n}\n\nclass QuadKeyCacheTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void insertAndRetrieve();\n    void containsCheck();\n    void invalidateByPair();\n    void evictionFollowsCapacity();\n};\n\nvoid QuadKeyCacheTest::initTestCase()\n{\n     QLoggingCategory::setFilterRules(QStringLiteral(\"*.debug=false\"));\n}\n\nvoid QuadKeyCacheTest::insertAndRetrieve()\n{\n    QuadKeyCache<DummyValue> cache;\n\n    auto value1 = new DummyValue{42};\n    auto value2 = new DummyValue{73};\n\n    cache.insert(1, 10, QStringLiteral(\"A\"), QStringLiteral(\"alpha\"), value1);\n    cache.insert(2, 20, QStringLiteral(\"B\"), QStringLiteral(\"beta\"), value2);\n\n    DummyValue *retrieved1 = cache.value(1, 10, QStringLiteral(\"A\"), QStringLiteral(\"alpha\"));\n    DummyValue *retrieved2 = cache.value(2, 20, QStringLiteral(\"B\"), QStringLiteral(\"beta\"));\n\n    QVERIFY(retrieved1 != nullptr);\n    QVERIFY(retrieved2 != nullptr);\n    QCOMPARE(retrieved1->payload, 42);\n    QCOMPARE(retrieved2->payload, 73);\n    QCOMPARE(cache.size(), 2);\n}\n\nvoid QuadKeyCacheTest::containsCheck()\n{\n    QuadKeyCache<DummyValue> cache;\n    auto value = new DummyValue{5};\n    cache.insert(3, 30, QStringLiteral(\"C\"), QStringLiteral(\"gamma\"), value);\n\n    QVERIFY(cache.contains(3, 30, QStringLiteral(\"C\"), QStringLiteral(\"gamma\")));\n    QVERIFY(!cache.contains(4, 40, QStringLiteral(\"D\"), QStringLiteral(\"delta\")));\n}\n\nvoid QuadKeyCacheTest::invalidateByPair()\n{\n    QuadKeyCache<DummyValue> cache;\n    cache.insert(1, 1, QStringLiteral(\"X\"), QStringLiteral(\"x\"), new DummyValue{1});\n    cache.insert(1, 1, QStringLiteral(\"Y\"), QStringLiteral(\"y\"), new DummyValue{2});\n    cache.insert(2, 2, QStringLiteral(\"X\"), QStringLiteral(\"x\"), new DummyValue{3});\n\n    QCOMPARE(cache.size(), 3);\n\n    cache.invalidate(1, 1);\n\n    QCOMPARE(cache.size(), 1);\n    QVERIFY(cache.contains(2, 2, QStringLiteral(\"X\"), QStringLiteral(\"x\")));\n    QVERIFY(!cache.contains(1, 1, QStringLiteral(\"X\"), QStringLiteral(\"x\")));\n    QVERIFY(!cache.contains(1, 1, QStringLiteral(\"Y\"), QStringLiteral(\"y\")));\n}\n\nvoid QuadKeyCacheTest::evictionFollowsCapacity()\n{\n    QuadKeyCache<DummyValue> cache;\n    cache.setMaxCost(2);\n\n    cache.insert(1, 1, QStringLiteral(\"A\"), QStringLiteral(\"a\"), new DummyValue{1});\n    cache.insert(2, 2, QStringLiteral(\"B\"), QStringLiteral(\"b\"), new DummyValue{2});\n    cache.insert(3, 3, QStringLiteral(\"C\"), QStringLiteral(\"c\"), new DummyValue{3});\n\n    QCOMPARE(cache.size(), 2);\n    QVERIFY(cache.value(1, 1, QStringLiteral(\"A\"), QStringLiteral(\"a\")) == nullptr);\n    QVERIFY(cache.value(2, 2, QStringLiteral(\"B\"), QStringLiteral(\"b\")) != nullptr);\n    QVERIFY(cache.value(3, 3, QStringLiteral(\"C\"), QStringLiteral(\"c\")) != nullptr);\n}\n\nQTEST_APPLESS_MAIN(QuadKeyCacheTest)\n\n#include \"tst_quadkeycache.moc\"\n"
  },
  {
    "path": "tests/RigctldManagerTest/RigctldManagerTest.pro",
    "content": "QT += testlib core network\nCONFIG += console testcase c++11\nTEMPLATE = app\nTARGET = tst_rigctldmanager\n\n# Local stubs first, then project includes\nINCLUDEPATH += $$PWD\nINCLUDEPATH += $$PWD/../..\n\nSOURCES += \\\n    tst_rigctldmanager.cpp \\\n    ../../rig/RigctldManager.cpp \\\n    ../../data/SerialPort.cpp \\\n    test_stubs.cpp\n\nHEADERS += \\\n    ../../rig/RigctldManager.h \\\n    ../../data/SerialPort.h \\\n    data/RigProfile.h \\\n    core/debug.h\n\n# Hamlib\n!isEmpty(HAMLIBINCLUDEPATH) {\n    INCLUDEPATH += $$HAMLIBINCLUDEPATH\n}\n\nisEmpty(HAMLIBVERSION_MAJOR): HAMLIBVERSION_MAJOR = 4\nisEmpty(HAMLIBVERSION_MINOR): HAMLIBVERSION_MINOR = 0\nisEmpty(HAMLIBVERSION_PATCH): HAMLIBVERSION_PATCH = 0\n\nDEFINES += HAMLIBVERSION_MAJOR=$$HAMLIBVERSION_MAJOR\nDEFINES += HAMLIBVERSION_MINOR=$$HAMLIBVERSION_MINOR\nDEFINES += HAMLIBVERSION_PATCH=$$HAMLIBVERSION_PATCH\n\n# pthreads (needed by hamlib headers on Windows)\n!isEmpty(PTHREADINCLUDEPATH) {\n    INCLUDEPATH += $$PTHREADINCLUDEPATH\n}\n!isEmpty(PTHREADLIBPATH) {\n    LIBS += -L$$PTHREADLIBPATH\n}\n\n# Hamlib link\n!isEmpty(HAMLIBLIBPATH) {\n    LIBS += -L$$HAMLIBLIBPATH\n}\nwin32: LIBS += -lws2_32 -llibhamlib-4\nunix:  LIBS += -lhamlib\n"
  },
  {
    "path": "tests/RigctldManagerTest/core/debug.h",
    "content": "#ifndef TEST_CORE_DEBUG_H\n#define TEST_CORE_DEBUG_H\n\n#include <QLoggingCategory>\n\n// Declare logging categories\nQ_DECLARE_LOGGING_CATEGORY(runtime)\nQ_DECLARE_LOGGING_CATEGORY(function_parameters)\n\n// Empty macros for testing\n#define FCT_IDENTIFICATION\n#define MODULE_IDENTIFICATION(x)\n\n#endif // TEST_CORE_DEBUG_H\n"
  },
  {
    "path": "tests/RigctldManagerTest/data/RigProfile.h",
    "content": "#ifndef TEST_DATA_RIGPROFILE_H\n#define TEST_DATA_RIGPROFILE_H\n\n#include <QString>\n\n// Minimal RigProfile stub for testing RigctldManager\n\nclass RigProfile\n{\npublic:\n    enum rigPortType\n    {\n        SERIAL_ATTACHED,\n        NETWORK_ATTACHED,\n        SPECIAL_OMNIRIG_ATTACHED\n    };\n\n    RigProfile() {\n        model = 1; netport = 0; baudrate = 0;\n        databits = 0; stopbits = 0.0;\n        shareRigctld = false; rigctldPort = 4532;\n        civAddr = -1;\n    }\n\n    QString profileName;\n    qint32 model;\n    QString portPath;\n    QString hostname;\n    quint16 netport;\n    quint32 baudrate;\n    quint8 databits;\n    float stopbits;\n    QString flowcontrol;\n    QString parity;\n    QString dtr;\n    QString rts;\n    qint16 civAddr;\n    bool shareRigctld;\n    quint16 rigctldPort;\n    QString rigctldPath;\n    QString rigctldArgs;\n\n    rigPortType getPortType() const\n    {\n        if (!hostname.isEmpty() && portPath.isEmpty())\n            return NETWORK_ATTACHED;\n        return SERIAL_ATTACHED;\n    }\n};\n\n#endif // TEST_DATA_RIGPROFILE_H\n"
  },
  {
    "path": "tests/RigctldManagerTest/test_stubs.cpp",
    "content": "// Stub implementations for testing RigctldManager\n\n#include <QLoggingCategory>\n\n// Debug category definitions\nQ_LOGGING_CATEGORY(runtime, \"qlog.runtime\")\nQ_LOGGING_CATEGORY(function_parameters, \"qlog.function_parameters\")\n"
  },
  {
    "path": "tests/RigctldManagerTest/tst_rigctldmanager.cpp",
    "content": "#include <QtTest>\n#include <QSignalSpy>\n#include <QTcpServer>\n#include <QFile>\n#include <QDir>\n#include <QCoreApplication>\n\n#include \"rig/RigctldManager.h\"\n#include \"data/RigProfile.h\"\n\nclass RigctldManagerTest : public QObject\n{\n    Q_OBJECT\n\nprivate slots:\n    void initTestCase();\n    void cleanupTestCase();\n\n    // findRigctldPath tests\n    void findRigctldPath_returnsNonEmptyIfInstalled();\n    void findRigctldPath_prefersAppDirectory();\n\n    // buildArguments tests (via start with mock)\n    void buildArguments_includesModel();\n    void buildArguments_includesPort();\n    void buildArguments_includesSerialSettings();\n    void buildArguments_includesAdditionalArgs();\n\n    // Lifecycle tests\n    void isRunning_initiallyFalse();\n    void start_failsWithInvalidPath();\n    void start_failsWithInvalidProfile();\n    void getConnectHost_returnsLocalhost();\n    void getConnectPort_returnsConfiguredPort();\n\n    // getVersion tests\n    void getVersion_returnsInvalidForNonexistentPath();\n    void getVersion_returnsValidIfInstalled();\n    void getVersion_autodetectsPath();\n\n    // Integration test (skipped if rigctld not available)\n    void start_stop_integration();\n\nprivate:\n    QString findRigctld();\n    bool rigctldAvailable = false;\n    QString rigctldPath;\n};\n\nvoid RigctldManagerTest::initTestCase()\n{\n    rigctldPath = RigctldManager::findRigctldPath();\n    rigctldAvailable = !rigctldPath.isEmpty();\n\n    if (!rigctldAvailable)\n    {\n        qWarning() << \"rigctld not found - some tests will be skipped\";\n    }\n    else\n    {\n        qDebug() << \"Found rigctld at:\" << rigctldPath;\n    }\n}\n\nvoid RigctldManagerTest::cleanupTestCase()\n{\n}\n\nQString RigctldManagerTest::findRigctld()\n{\n    return RigctldManager::findRigctldPath();\n}\n\n// ============================================================================\n// findRigctldPath tests\n// ============================================================================\n\nvoid RigctldManagerTest::findRigctldPath_returnsNonEmptyIfInstalled()\n{\n    // This test passes if rigctld is installed, otherwise we just note it\n    QString path = RigctldManager::findRigctldPath();\n\n    if (path.isEmpty())\n    {\n        QSKIP(\"rigctld not installed on this system\");\n    }\n\n    QVERIFY(QFile::exists(path));\n}\n\nvoid RigctldManagerTest::findRigctldPath_prefersAppDirectory()\n{\n    // Create a mock rigctld in app directory\n    QString appDir = QCoreApplication::applicationDirPath();\n#ifdef Q_OS_WIN\n    QString mockPath = appDir + \"/rigctld.exe\";\n#else\n    QString mockPath = appDir + \"/rigctld\";\n#endif\n\n    // Create empty file to simulate rigctld\n    QFile mockFile(mockPath);\n    bool created = mockFile.open(QIODevice::WriteOnly);\n\n    if (!created)\n    {\n        QSKIP(\"Cannot create mock rigctld in app directory\");\n    }\n    mockFile.close();\n\n    // Now findRigctldPath should return the app directory path\n    QString foundPath = RigctldManager::findRigctldPath();\n    QCOMPARE(foundPath, mockPath);\n\n    // Cleanup\n    QFile::remove(mockPath);\n}\n\n// ============================================================================\n// buildArguments tests (indirect via profile inspection)\n// ============================================================================\n\nvoid RigctldManagerTest::buildArguments_includesModel()\n{\n    // We can't directly test buildArguments (private), but we can verify\n    // that start() uses the correct model from profile\n    // This is more of a documentation test\n\n    RigProfile profile;\n    profile.model = 1234;\n    profile.rigctldPort = 14532;\n    profile.portPath = \"/dev/ttyUSB0\";\n\n    // Verify profile is set correctly\n    QCOMPARE(profile.model, 1234);\n}\n\nvoid RigctldManagerTest::buildArguments_includesPort()\n{\n    RigProfile profile;\n    profile.rigctldPort = 5000;\n\n    QCOMPARE(profile.rigctldPort, static_cast<quint16>(5000));\n}\n\nvoid RigctldManagerTest::buildArguments_includesSerialSettings()\n{\n    RigProfile profile;\n    profile.baudrate = 9600;\n    profile.databits = 8;\n    profile.stopbits = 1;\n    profile.parity = \"None\";\n    profile.flowcontrol = \"None\";\n\n    QCOMPARE(profile.baudrate, 9600u);\n    QCOMPARE(profile.databits, static_cast<quint8>(8));\n}\n\nvoid RigctldManagerTest::buildArguments_includesAdditionalArgs()\n{\n    RigProfile profile;\n    profile.rigctldArgs = \"-v -v --debug\";\n\n    QCOMPARE(profile.rigctldArgs, QString(\"-v -v --debug\"));\n}\n\n// ============================================================================\n// Lifecycle tests\n// ============================================================================\n\nvoid RigctldManagerTest::isRunning_initiallyFalse()\n{\n    RigctldManager manager;\n    QVERIFY(!manager.isRunning());\n}\n\nvoid RigctldManagerTest::start_failsWithInvalidPath()\n{\n    RigctldManager manager;\n    QSignalSpy errorSpy(&manager, &RigctldManager::errorOccurred);\n\n    RigProfile profile;\n    profile.model = 1;\n    profile.rigctldPort = 14532;\n    profile.rigctldPath = \"/nonexistent/path/to/rigctld\";\n    profile.portPath = \"/dev/ttyUSB0\";\n\n    bool result = manager.start(profile);\n\n    QVERIFY(!result);\n    QVERIFY(!manager.isRunning());\n}\n\nvoid RigctldManagerTest::start_failsWithInvalidProfile()\n{\n    if (!rigctldAvailable)\n    {\n        QSKIP(\"rigctld not available\");\n    }\n\n    RigctldManager manager;\n\n    RigProfile profile;\n    profile.model = 1;  // Dummy rig - should fail to open\n    profile.rigctldPort = 14533;\n    profile.portPath = \"/dev/nonexistent_port\";\n\n    // This should fail because the serial port doesn't exist\n    bool result = manager.start(profile);\n\n    // Even if rigctld starts, it should fail to connect to the rig\n    // The behavior depends on how rigctld handles invalid ports\n    // We just verify the manager handles this gracefully\n    if (result)\n    {\n        manager.stop();\n    }\n\n    QVERIFY(!manager.isRunning());\n}\n\nvoid RigctldManagerTest::getConnectHost_returnsLocalhost()\n{\n    RigctldManager manager;\n    QCOMPARE(manager.getConnectHost(), QString(\"127.0.0.1\"));\n}\n\nvoid RigctldManagerTest::getConnectPort_returnsConfiguredPort()\n{\n    RigctldManager manager;\n\n    // Default port should be 4532\n    QCOMPARE(manager.getConnectPort(), static_cast<quint16>(4532));\n}\n\n// ============================================================================\n// getVersion tests\n// ============================================================================\n\nvoid RigctldManagerTest::getVersion_returnsInvalidForNonexistentPath()\n{\n    RigctldVersion version = RigctldManager::getVersion(\"/nonexistent/path/to/rigctld\");\n\n    QVERIFY(!version.isValid());\n    QCOMPARE(version.major, -1);\n    QCOMPARE(version.minor, -1);\n    QCOMPARE(version.patch, -1);\n}\n\nvoid RigctldManagerTest::getVersion_returnsValidIfInstalled()\n{\n    if ( !rigctldAvailable )\n        QSKIP(\"rigctld not available\");\n\n    RigctldVersion version = RigctldManager::getVersion(rigctldPath);\n\n    QVERIFY(version.isValid());\n    QVERIFY(version.major >= 0);\n    QVERIFY(version.minor >= 0);\n    QVERIFY(version.patch >= 0);\n\n    qDebug() << \"rigctld version:\" << version.major << \".\" << version.minor << \".\" << version.patch;\n}\n\nvoid RigctldManagerTest::getVersion_autodetectsPath()\n{\n    if ( !rigctldAvailable )\n        QSKIP(\"rigctld not available\");\n\n    // Call without path - should autodetect\n    RigctldVersion version = RigctldManager::getVersion();\n\n    QVERIFY(version.isValid());\n    QVERIFY(version.major >= 0);\n}\n\n// ============================================================================\n// Integration test\n// ============================================================================\n\nvoid RigctldManagerTest::start_stop_integration()\n{\n    if (!rigctldAvailable)\n    {\n        QSKIP(\"rigctld not available for integration test\");\n    }\n\n    RigctldManager manager;\n    QSignalSpy startedSpy(&manager, &RigctldManager::started);\n    QSignalSpy stoppedSpy(&manager, &RigctldManager::stopped);\n    QSignalSpy errorSpy(&manager, &RigctldManager::errorOccurred);\n\n    RigProfile profile;\n    profile.model = 1;  // Dummy rig (Hamlib model 1 = Dummy)\n    profile.rigctldPort = 14534;\n    profile.rigctldPath = rigctldPath;\n    // For dummy rig, we don't need a real port\n\n    bool result = manager.start(profile);\n\n    if (!result)\n    {\n        // If start failed, check why\n        if (!errorSpy.isEmpty())\n        {\n            qWarning() << \"Start failed with error:\" << errorSpy.first().first().toString();\n        }\n        QSKIP(\"Could not start rigctld with dummy rig\");\n    }\n\n    QVERIFY(result);\n    QVERIFY(manager.isRunning());\n    QCOMPARE(manager.getConnectPort(), static_cast<quint16>(14534));\n\n    // Verify we can connect to the port\n    QTcpSocket socket;\n    socket.connectToHost(\"127.0.0.1\", 14534);\n    bool connected = socket.waitForConnected(2000);\n    QVERIFY(connected);\n    socket.disconnectFromHost();\n\n    // Stop\n    manager.stop();\n    QVERIFY(!manager.isRunning());\n\n    // Verify port is no longer listening\n    QTcpSocket socket2;\n    socket2.connectToHost(\"127.0.0.1\", 14534);\n    bool stillConnected = socket2.waitForConnected(1000);\n    QVERIFY(!stillConnected);\n}\n\nint main(int argc, char **argv)\n{\n    QCoreApplication app(argc, argv);\n    RigctldManagerTest tc;\n    return QTest::qExec(&tc, argc, argv);\n}\n\n#include \"tst_rigctldmanager.moc\"\n"
  },
  {
    "path": "tests/tests.pro",
    "content": "TEMPLATE = subdirs\nCONFIG += ordered\nSUBDIRS += CallsignTest \\\n           CredentialStoreTest \\\n           DataTest \\\n           FileCompressorTest \\\n           GridsquareTest \\\n           BandPlanTest \\\n           AlertEvaluatorTest \\\n           DxServerStringTest \\\n           HostsPortStringTest \\\n           MigrationTest \\\n           PasswordCipherTest \\\n           QuadKeyCacheTest \\\n           RigctldManagerTest\n"
  },
  {
    "path": "ui/ActivityEditor.cpp",
    "content": "#include <QMessageBox>\n\n#include \"ActivityEditor.h\"\n#include \"ui_ActivityEditor.h\"\n#include \"core/debug.h\"\n#include \"ui/NewContactWidget.h\"\n#include \"ui/MainWindow.h\"\n#include \"data/StationProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/RotProfile.h\"\n#include \"models/LogbookModel.h\"\n#include \"data/Data.h\"\n#include \"data/ActivityProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.mainlayouteditor\");\n\nActivityEditor::ActivityEditor(const QString &activityName,\n                                   QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::ActivityEditor),\n    availableFieldsModel(new StringListModel(this)),\n    qsoRowAFieldsModel(new StringListModel(this)),\n    qsoRowBFieldsModel(new StringListModel(this)),\n    detailColAFieldsModel(new StringListModel(this)),\n    detailColBFieldsModel(new StringListModel(this)),\n    detailColCFieldsModel(new StringListModel(this)),\n    dynamicWidgets(new NewContactDynamicWidgets(false, this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))\n    // disabled for QT 5.12 (ubuntu 20.04) due to issue in QT\n    // moveRow does not work\n    ui->qsoRowADownButton->setVisible(false);\n    ui->qsoRowAUpButton->setVisible(false);\n    ui->qsoRowBDownButton->setVisible(false);\n    ui->qsoRowBUpButton->setVisible(false);\n    ui->detailColADownButton->setVisible(false);\n    ui->detailColAUpButton->setVisible(false);\n    ui->detailColBDownButton->setVisible(false);\n    ui->detailColBUpButton->setVisible(false);\n    ui->detailColCDownButton->setVisible(false);\n    ui->detailColCUpButton->setVisible(false);\n#endif\n\n    availableFieldsModel->setStringList(dynamicWidgets->getAllFieldLabelNames());\n    availableFieldsModel->sort(0);\n\n    ui->availableFieldsListView->setModel(availableFieldsModel);\n    ui->qsoRowAFieldsListView->setModel(qsoRowAFieldsModel);\n    ui->qsoRowBFieldsListView->setModel(qsoRowBFieldsModel);\n    ui->detailColAFieldsListView->setModel(detailColAFieldsModel);\n    ui->detailColBFieldsListView->setModel(detailColBFieldsModel);\n    ui->detailColCFieldsListView->setModel(detailColCFieldsModel);\n\n    connectQSORowButtons();\n    connectDetailColsButtons();\n\n    if ( ! activityName.isEmpty() )\n    {\n        MainLayoutProfile profile = MainLayoutProfilesManager::instance()->getProfile(activityName);\n\n        ui->activityNameEdit->setEnabled(false);\n        ui->activityNameEdit->setText(profile.profileName);\n\n        fillWidgets(profile);\n    }\n    else\n        fillWidgets(MainLayoutProfile::getClassicLayout());\n\n    setupValuesTab(activityName);\n}\n\nActivityEditor::~ActivityEditor()\n{\n    delete ui;\n    delete dynamicWidgets;\n}\n\nvoid ActivityEditor::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->activityNameEdit->text().isEmpty() )\n    {\n        ui->activityNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( activityNameExists(ui->activityNameEdit->text()) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Activity name is already exists.\"));\n        return;\n    }\n\n\n    /**********************\n     * Save Layout profile\n     **********************/\n    MainLayoutProfile profile;\n\n    profile.profileName = ui->activityNameEdit->text();\n    profile.rowA = getFieldIndexes(qsoRowAFieldsModel);\n    profile.rowB = getFieldIndexes(qsoRowBFieldsModel);\n    profile.detailColA = getFieldIndexes(detailColAFieldsModel);\n    profile.detailColB = getFieldIndexes(detailColBFieldsModel);\n    profile.detailColC = getFieldIndexes(detailColCFieldsModel);\n    profile.mainGeometry = mainGeometry;\n    profile.mainState = mainState;\n    profile.addlBandmaps = addlBandmaps;\n    profile.darkMode = darkMode;\n    MainLayoutProfilesManager::instance()->addProfile(profile.profileName, profile);\n    MainLayoutProfilesManager::instance()->save();\n\n    /***********************\n     * Save Activity profile\n     ***********************/\n\n    ActivityProfile activity;\n\n    activity.profileName = ui->activityNameEdit->text();\n\n    auto insertProfile = [&](ActivityProfile::ProfileType profileType,\n                             bool save,\n                             const QString &profileName,\n                             QCheckBox* connectCheckbox = nullptr)\n    {\n        if ( save )\n        {\n            ActivityProfile::ProfileRecord rec;\n            rec.name = profileName;\n\n            if ( connectCheckbox )\n                rec.params[ActivityProfile::ProfileParamType::CONNECT] = connectCheckbox->isChecked();\n\n            activity.profiles.insert(profileType, rec);\n        }\n    };\n\n    auto insertParam = [&] (LogbookModel::ColumnID fieldID,\n                            QCheckBox* profileCheckbox,\n                            QVariant value)\n    {\n        if ( profileCheckbox->isChecked() )\n            activity.fieldValues.insert(fieldID, value);\n    };\n\n    insertProfile(ActivityProfile::ProfileType::MAIN_LAYOUT_PROFILE, true, ui->activityNameEdit->text());\n    insertProfile(ActivityProfile::ProfileType::ANTENNA_PROFILE, ui->antennaProfileCheckbox->isChecked(), ui->antennaProfileCombo->currentText());\n    insertProfile(ActivityProfile::ProfileType::STATION_PROFILE, ui->stationProfileCheckbox->isChecked(), ui->stationProfileCombo->currentText());\n    insertProfile(ActivityProfile::ProfileType::RIG_PROFILE, ui->rigProfileCheckbox->isChecked(), ui->rigProfileCombo->currentText(), ui->rigAutoconnectCheckbox);\n    insertProfile(ActivityProfile::ProfileType::ROT_PROFILE, ui->rotatorProfileCheckbox->isChecked(), ui->rotatorProfileCombo->currentText(), ui->rotatorAutoconnectCheckbox);\n\n    insertParam(LogbookModel::COLUMN_CONTEST_ID, ui->contestIDCheckbox, ui->contestIDEdit->text());\n    insertParam(LogbookModel::COLUMN_PROP_MODE, ui->propagationModeCheckbox, ui->propagationModeCombo->currentText());\n    insertParam(LogbookModel::COLUMN_SAT_MODE, ui->satModeCheckbox, ui->satModeCombo->currentText());\n    insertParam(LogbookModel::COLUMN_SAT_NAME, ui->satNameCheckbox, ui->satNameEdit->text());\n    insertParam(LogbookModel::COLUMN_STX_STRING, ui->stxStringCheckbox, ui->stxStringEdit->text());\n\n    ActivityProfilesManager::instance()->addProfile(ui->activityNameEdit->text(), activity);\n    ActivityProfilesManager::instance()->save();\n    accept();\n}\n\nvoid ActivityEditor::profileNameChanged(const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n    p.setColor(QPalette::Text, ( activityNameExists(profileName) ) ? Qt::red\n                                                                   : qApp->palette().text().color());\n    ui->activityNameEdit->setPalette(p);\n}\n\nvoid ActivityEditor::clearMainLayoutClick()\n{\n    FCT_IDENTIFICATION;\n\n    mainGeometry = QByteArray();\n    mainState = QByteArray();\n    addlBandmaps = QList<QPair<QString, QString>>();\n    darkMode = false;\n    ui->mainLayoutStateLabel->setText(statusUnSavedText);\n    ui->mainLayoutClearButton->setEnabled(false);\n}\n\nvoid ActivityEditor::setValueState()\n{\n    FCT_IDENTIFICATION;\n\n    ui->antennaProfileCombo->setEnabled(ui->antennaProfileCheckbox->isChecked());\n    ui->stationProfileCombo->setEnabled(ui->stationProfileCheckbox->isChecked());\n    ui->rigProfileCombo->setEnabled(ui->rigProfileCheckbox->isChecked());\n    ui->rigAutoconnectCheckbox->setEnabled(ui->rigProfileCheckbox->isChecked());\n    ui->rotatorProfileCombo->setEnabled(ui->rotatorProfileCheckbox->isChecked());\n    ui->rotatorAutoconnectCheckbox->setEnabled(ui->rotatorProfileCheckbox->isChecked());\n\n    bool isContestActive = !availableFieldsModel->stringList().contains(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_CONTEST_ID));\n    bool isSTXStringActive = !availableFieldsModel->stringList().contains(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_STX_STRING));\n\n    if ( !isContestActive )\n        ui->contestIDCheckbox->setChecked(false);\n    ui->contestIDCheckbox->setVisible(isContestActive);\n    ui->contestIDEdit->setVisible(isContestActive);\n    ui->contestIDEdit->setEnabled(ui->contestIDCheckbox->isChecked());\n\n    if ( !isSTXStringActive )\n        ui->stxStringCheckbox->setChecked(false);\n    ui->stxStringCheckbox->setVisible(isSTXStringActive);\n    ui->stxStringEdit->setVisible(isSTXStringActive);\n    ui->stxStringEdit->setEnabled(ui->stxStringCheckbox->isChecked());\n\n    ui->propagationModeCombo->setEnabled(ui->propagationModeCheckbox->isChecked());\n\n    bool isSatActive = ui->propagationModeCombo->currentText() == Data::instance()->propagationModeIDToText(\"SAT\")\n                       && ui->propagationModeCheckbox->isChecked();\n    if ( !isSatActive )\n    {\n        ui->satModeCheckbox->setChecked(false);\n        ui->satNameCheckbox->setChecked(false);\n    }\n\n    ui->satModeCheckbox->setVisible(isSatActive);\n    ui->satModeCombo->setVisible(isSatActive);\n    ui->satModeCombo->setEnabled(ui->satModeCheckbox->isChecked());\n\n    ui->satNameCheckbox->setVisible(isSatActive);\n    ui->satNameEdit->setVisible(isSatActive);\n    ui->satNameEdit->setEnabled(ui->satNameCheckbox->isChecked());\n}\n\nvoid ActivityEditor::moveField(StringListModel *source,\n                               StringListModel *destination,\n                               const QModelIndexList &sourceIndexList)\n{\n    FCT_IDENTIFICATION;\n\n    QModelIndexList selectedIndexes = sourceIndexList;\n\n    if ( selectedIndexes.isEmpty() )\n            return;\n\n    std::sort(selectedIndexes.begin(),\n              selectedIndexes.end(),\n              [](const QModelIndex &a, const QModelIndex &b)\n    {\n        return a.row() > b.row();\n    });\n\n    for ( const QModelIndex &index : sourceIndexList )\n        destination->append(source->data(index).toString());\n\n    /* Delete the sorted index list becuase without sorting\n     * it deletes wrong records\n     */\n    for ( const QModelIndex &index : selectedIndexes )\n        source->deleteItem(index);\n\n    setValueState();\n}\n\nvoid ActivityEditor::connectQSORowButtons()\n{\n    FCT_IDENTIFICATION;\n\n    // Connect buttons for QSO Row A\n    connectMoveButtons(ui->qsoRowADownButton, ui->qsoRowAUpButton,\n                       ui->qsoRowAFieldsListView, qsoRowAFieldsModel);\n    connectFieldButtons(ui->moveToQSORowAButton, ui->removeFromQSORowAButton,\n                        qsoRowAFieldsModel, ui->qsoRowAFieldsListView);\n\n    // Connect buttons for QSO Row B\n    connectMoveButtons(ui->qsoRowBDownButton, ui->qsoRowBUpButton,\n                       ui->qsoRowBFieldsListView, qsoRowBFieldsModel);\n    connectFieldButtons(ui->moveToQSORowBButton, ui->removeFromQSORowBButton,\n                        qsoRowBFieldsModel, ui->qsoRowBFieldsListView);\n}\n\nvoid ActivityEditor::connectDetailColsButtons()\n{\n    FCT_IDENTIFICATION;\n\n    connectMoveButtons(ui->detailColADownButton, ui->detailColAUpButton,\n                       ui->detailColAFieldsListView, detailColAFieldsModel);\n    connectFieldButtons(ui->moveToDetailColAButton, ui->removeFromDetailColAButton,\n                        detailColAFieldsModel, ui->detailColAFieldsListView);\n\n    connectMoveButtons(ui->detailColBDownButton, ui->detailColBUpButton,\n                       ui->detailColBFieldsListView, detailColBFieldsModel);\n    connectFieldButtons(ui->moveToDetailColBButton, ui->removeFromDetailColBButton,\n                        detailColBFieldsModel, ui->detailColBFieldsListView);\n\n    connectMoveButtons(ui->detailColCDownButton, ui->detailColCUpButton,\n                       ui->detailColCFieldsListView, detailColCFieldsModel);\n    connectFieldButtons(ui->moveToDetailColCButton, ui->removeFromDetailColCButton,\n                        detailColCFieldsModel, ui->detailColCFieldsListView);\n}\n\nvoid ActivityEditor::connectMoveButtons(QPushButton *downButton, QPushButton *upButton,\n                                        QListView *listView, StringListModel *model)\n{\n    FCT_IDENTIFICATION;\n\n    connect(downButton, &QPushButton::clicked, this, [listView, model]()\n    {\n        const QModelIndexList &modelList = listView->selectionModel()->selectedRows();\n        if ( !modelList.isEmpty() )\n            model->moveDown(modelList.at(0));\n    });\n\n    connect(upButton, &QPushButton::clicked, this, [listView, model]()\n    {\n        const QModelIndexList &modelList = listView->selectionModel()->selectedRows();\n        if ( !modelList.isEmpty() )\n            model->moveUp(modelList.at(0));\n    });\n}\n\nvoid ActivityEditor::connectFieldButtons(QPushButton *moveToButton, QPushButton *removeButton,\n                                         StringListModel *targetModel, QListView *targetListView)\n{\n    FCT_IDENTIFICATION;\n\n    connect(moveToButton, &QPushButton::clicked, this, [this, targetModel]()\n    {\n         moveField(availableFieldsModel, targetModel,\n         ui->availableFieldsListView->selectionModel()->selectedIndexes());\n    });\n\n    connect(removeButton, &QPushButton::clicked, this, [this, targetModel, targetListView]()\n    {\n         moveField(targetModel, availableFieldsModel,\n         targetListView->selectionModel()->selectedRows());\n    });\n}\n\nQList<int> ActivityEditor::getFieldIndexes(StringListModel *model)\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &list = model->stringList();\n    QList<int> ret;\n\n    for ( const QString &fieldName : list )\n    {\n        int index = dynamicWidgets->getIndex4FieldLabelName(fieldName);\n        if ( index >= 0 )\n            ret << index;\n    }\n\n    return ret;\n}\n\nvoid ActivityEditor::setupValuesTab(const QString &activityName)\n{\n    FCT_IDENTIFICATION;\n\n    auto assignCompleter = [&] (QLineEdit *field, const QStringList &list)\n    {\n        QStringListModel *model = new QStringListModel(list);\n        QCompleter *completer = new QCompleter(model, field);\n        model->setParent(completer);\n        completer->setCaseSensitivity(Qt::CaseInsensitive);\n        completer->setFilterMode(Qt::MatchStartsWith);\n        field->setCompleter(completer);\n    };\n\n    auto assignTableCompleter = [&] (QLineEdit *field, const QString &tableName)\n    {\n         QSqlTableModel* model = new QSqlTableModel();\n         model->setTable(tableName);\n         QCompleter *completer = new QCompleter(model, field);\n         model->setParent(completer);\n         completer->setCaseSensitivity(Qt::CaseInsensitive);\n         completer->setFilterMode(Qt::MatchStartsWith);\n         field->setCompleter(completer);\n         model->select();\n    };\n\n\n    auto assignModel = [&] (QComboBox *field, const QStringList &list)\n    {\n        QStringListModel *model = new QStringListModel(list, field);\n        field->setModel(model);\n    };\n\n    auto setProfileVisible = [&] (QCheckBox *checkbox, QComboBox *field, QCheckBox *connectCheckbox = nullptr)\n    {\n        if ( field->count() == 0)\n        {\n            checkbox->setChecked(false);\n            checkbox->setVisible(false);\n            field->setVisible(false);\n            if ( connectCheckbox )\n                connectCheckbox->setVisible(false);\n        }\n        else\n        {\n            checkbox->setVisible(true);\n            field->setVisible(true);\n            if ( connectCheckbox )\n                connectCheckbox->setVisible(true);\n        }\n    };\n\n    auto loadProfileValue = [&] (const ActivityProfile &activityProfile,\n                                 ActivityProfile::ProfileType profileType,\n                                 QCheckBox *profileCheckbox,\n                                 QComboBox *profileCombo,\n                                 QCheckBox *connectCheckbox = nullptr)\n    {\n        auto currProfile = activityProfile.profiles.value(profileType);\n        int index = profileCombo->findText(currProfile.name);\n        profileCheckbox->setChecked(index != -1);\n        if ( index != -1 )\n        {\n            profileCombo->setCurrentIndex(index);\n            if ( connectCheckbox )\n                connectCheckbox->setChecked(activityProfile.getProfileParam(profileType, ActivityProfile::ProfileParamType::CONNECT).toBool());\n        }\n    };\n\n    ui->stationProfileCombo->addItems(StationProfilesManager::instance()->profileNameList());\n    ui->antennaProfileCombo->addItems(AntProfilesManager::instance()->profileNameList());\n    ui->rigProfileCombo->addItems(RigProfilesManager::instance()->profileNameList());\n    ui->rotatorProfileCombo->addItems(RotProfilesManager::instance()->profileNameList());\n\n    setProfileVisible(ui->antennaProfileCheckbox, ui->antennaProfileCombo);\n    setProfileVisible(ui->stationProfileCheckbox, ui->stationProfileCombo);\n    setProfileVisible(ui->rigProfileCheckbox, ui->rigProfileCombo, ui->rigAutoconnectCheckbox);\n    setProfileVisible(ui->rotatorProfileCheckbox, ui->rotatorProfileCombo, ui->rotatorAutoconnectCheckbox);\n\n    ui->contestIDCheckbox->setText(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_CONTEST_ID));\n    ui->propagationModeCheckbox->setText(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_PROP_MODE));\n    ui->satModeCheckbox->setText(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_SAT_MODE));\n    ui->satNameCheckbox->setText(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_SAT_NAME));\n    ui->stxStringCheckbox->setText(LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_STX_STRING));\n\n    assignCompleter(ui->contestIDEdit, Data::instance()->contestList());\n    assignTableCompleter(ui->satNameEdit, \"sat_info\");\n\n    assignModel(ui->propagationModeCombo, Data::instance()->propagationModesList());\n    assignModel(ui->satModeCombo, Data::instance()->satModeList());\n\n    if ( !activityName.isEmpty() )\n    {\n        const ActivityProfile &activity = ActivityProfilesManager::instance()->getProfile(activityName);\n        loadProfileValue(activity, ActivityProfile::ProfileType::ANTENNA_PROFILE, ui->antennaProfileCheckbox, ui->antennaProfileCombo);\n        loadProfileValue(activity, ActivityProfile::ProfileType::STATION_PROFILE, ui->stationProfileCheckbox, ui->stationProfileCombo);\n        loadProfileValue(activity, ActivityProfile::ProfileType::RIG_PROFILE, ui->rigProfileCheckbox, ui->rigProfileCombo, ui->rigAutoconnectCheckbox);\n        loadProfileValue(activity, ActivityProfile::ProfileType::ROT_PROFILE, ui->rotatorProfileCheckbox, ui->rotatorProfileCombo, ui->rotatorAutoconnectCheckbox);\n\n        for ( auto i = activity.fieldValues.begin(); i != activity.fieldValues.end(); i++ )\n        {\n            switch (i.key())\n            {\n            case LogbookModel::COLUMN_CONTEST_ID:\n                ui->contestIDCheckbox->setChecked(true);\n                ui->contestIDEdit->setText(i.value().toString());\n                break;\n\n            case LogbookModel::COLUMN_PROP_MODE:\n                ui->propagationModeCheckbox->setChecked(true);\n                ui->propagationModeCombo->setCurrentText(i.value().toString());\n                break;\n\n            case LogbookModel::COLUMN_SAT_MODE:\n                ui->satModeCheckbox->setChecked(true);\n                ui->satModeCombo->setCurrentText(i.value().toString());\n                break;\n\n            case LogbookModel::COLUMN_SAT_NAME:\n                ui->satNameCheckbox->setChecked(true);\n                ui->satNameEdit->setText(i.value().toString());\n                break;\n\n            case LogbookModel::COLUMN_STX_STRING:\n                ui->stxStringCheckbox->setChecked(true);\n                ui->stxStringEdit->setText(i.value().toString());\n                break;\n\n            default:\n                qWarning() << \"Unsupported Parameter\" << i.key();\n            }\n        }\n    }\n\n    setValueState();\n}\n\nvoid ActivityEditor::fillWidgets(const MainLayoutProfile &profile)\n{\n    FCT_IDENTIFICATION;\n\n    auto processFields = [this](const QList<int>& fieldIndices, StringListModel* targetModel)\n    {\n        for (int fieldIndex : fieldIndices)\n        {\n            const QString &fieldName = dynamicWidgets->getFieldLabelName4Index(fieldIndex);\n            targetModel->append(fieldName);\n            availableFieldsModel->deleteItem(fieldName);\n        }\n    };\n\n    // Process each row and detail column using the helper\n    processFields(static_cast<const QList<int>&>(profile.rowA), qsoRowAFieldsModel);\n    processFields(static_cast<const QList<int>&>(profile.rowB), qsoRowBFieldsModel);\n    processFields(static_cast<const QList<int>&>(profile.detailColA), detailColAFieldsModel);\n    processFields(static_cast<const QList<int>&>(profile.detailColB), detailColBFieldsModel);\n    processFields(static_cast<const QList<int>&>(profile.detailColC), detailColCFieldsModel);\n\n    mainGeometry = profile.mainGeometry;\n    mainState = profile.mainState;\n    addlBandmaps = profile.addlBandmaps;\n    darkMode = profile.darkMode;\n\n    if ( mainGeometry == QByteArray()\n         && mainState == QByteArray() )\n    {\n        ui->mainLayoutStateLabel->setText(statusUnSavedText);\n        ui->mainLayoutClearButton->setEnabled(false);\n    }\n}\n\nbool ActivityEditor::activityNameExists(const QString &activityName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << activityName;\n\n    return  ui->activityNameEdit->isEnabled()\n            && MainLayoutProfilesManager::instance()->profileNameList().contains(activityName);\n}\n"
  },
  {
    "path": "ui/ActivityEditor.h",
    "content": "#ifndef QLOG_UI_ACTIVITYEDITOR_H\n#define QLOG_UI_ACTIVITYEDITOR_H\n\n#include <QDialog>\n#include <QPointer>\n#include <QStringListModel>\n#include \"ui/NewContactWidget.h\"\n#include \"data/MainLayoutProfile.h\"\n\nnamespace Ui {\nclass ActivityEditor;\n}\n\nclass StringListModel : public QStringListModel\n{\npublic:\n    StringListModel(QObject *parent = nullptr) :\n        QStringListModel(parent){};\n\n    void append (const QString& string)\n    {\n        insertRows(rowCount(), 1);\n        setData(index(rowCount()-1), string);\n    };\n\n    void deleteItem(const QModelIndex &index)\n    {\n        if (!index.isValid() || index.row() >= stringList().size())\n                return;\n        removeRow(index.row());\n    }\n\n    void deleteItem(const QString &value)\n    {\n        const QModelIndexList &itemIndexList = match(index(0,0),\n              Qt::DisplayRole,\n              value,\n              1,\n              Qt::MatchExactly);\n\n        for ( const QModelIndex & itemIndex: itemIndexList )\n        {\n            deleteItem(itemIndex);\n        }\n    }\n\n    void moveUp(const QModelIndex &index)\n    {\n        if ( index.row() - 1 < 0 )\n            return;\n\n        moveRow(index.parent(), index.row(), index.parent(), index.row() - 1);\n    }\n\n    void moveDown(const QModelIndex &inIndex)\n    {\n        if ( inIndex.row() + 1 >= rowCount() )\n            return;\n\n         moveUp(index(inIndex.row()+1));\n    }\n\n    StringListModel& operator<<(const QString& string)\n    {\n        append(string);\n        return *this;\n    };\n};\n\nclass ActivityEditor : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ActivityEditor(const QString &activityName = QString(),\n                            QWidget *parent = nullptr);\n    ~ActivityEditor();\n\nprivate:\n    Ui::ActivityEditor *ui;\n    StringListModel *availableFieldsModel;\n    StringListModel *qsoRowAFieldsModel;\n    StringListModel *qsoRowBFieldsModel;\n    StringListModel *detailColAFieldsModel;\n    StringListModel *detailColBFieldsModel;\n    StringListModel *detailColCFieldsModel;\n    QByteArray mainGeometry;\n    QByteArray mainState;\n    QList<QPair<QString, QString>> addlBandmaps;\n    bool darkMode;\n\n    NewContactDynamicWidgets *dynamicWidgets;\n\nprivate slots:\n    void save();\n    void profileNameChanged(const QString&);\n    void clearMainLayoutClick();\n    void setValueState();\n\nprivate:\n    void fillWidgets(const MainLayoutProfile &profile);\n    bool activityNameExists(const QString &activityName);\n    void moveField(StringListModel *source,\n                   StringListModel *destination,\n                   const QModelIndexList &sourceIndexList);\n    void connectQSORowButtons();\n    void connectDetailColsButtons();\n    void connectMoveButtons(QPushButton* downButton, QPushButton* upButton,\n                            QListView* listView, StringListModel* model);\n    void connectFieldButtons(QPushButton* moveToButton, QPushButton* removeButton,\n                             StringListModel* targetModel, QListView* targetListView);\n\n    QList<int> getFieldIndexes(StringListModel *model);\n    void setupValuesTab(const QString &activityName);\n\n    const QString statusUnSavedText = tr(\"Unsaved\");\n};\n\n#endif // QLOG_UI_ACTIVITYEDITOR_H\n"
  },
  {
    "path": "ui/ActivityEditor.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ActivityEditor</class>\n <widget class=\"QDialog\" name=\"ActivityEditor\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>530</width>\n    <height>535</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Activity Editor</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <layout class=\"QFormLayout\" name=\"formLayout\">\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QLabel\" name=\"activityNameLabel\">\n         <property name=\"text\">\n          <string>Activity Name</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"1\">\n        <widget class=\"QLineEdit\" name=\"activityNameEdit\"/>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <property name=\"documentMode\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"layoutTab\">\n      <attribute name=\"title\">\n       <string>Layout</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n         <property name=\"topMargin\">\n          <number>0</number>\n         </property>\n         <item>\n          <widget class=\"QLabel\" name=\"mainLayoutLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Window Arrangement:</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"mainLayoutStateLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Saved</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_2\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeType\">\n            <enum>QSizePolicy::Expanding</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"mainLayoutClearButton\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Clear</string>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n         <item>\n          <widget class=\"QGroupBox\" name=\"groupBox_3\">\n           <property name=\"title\">\n            <string>Available Fields</string>\n           </property>\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n            <property name=\"leftMargin\">\n             <number>4</number>\n            </property>\n            <property name=\"topMargin\">\n             <number>4</number>\n            </property>\n            <property name=\"rightMargin\">\n             <number>4</number>\n            </property>\n            <property name=\"bottomMargin\">\n             <number>4</number>\n            </property>\n            <item>\n             <widget class=\"QListView\" name=\"availableFieldsListView\">\n              <property name=\"toolTip\">\n               <string>List of fields that can be used</string>\n              </property>\n              <property name=\"editTriggers\">\n               <set>QAbstractItemView::NoEditTriggers</set>\n              </property>\n              <property name=\"showDropIndicator\" stdset=\"0\">\n               <bool>false</bool>\n              </property>\n              <property name=\"selectionMode\">\n               <enum>QAbstractItemView::MultiSelection</enum>\n              </property>\n              <property name=\"verticalScrollMode\">\n               <enum>QAbstractItemView::ScrollPerPixel</enum>\n              </property>\n              <property name=\"horizontalScrollMode\">\n               <enum>QAbstractItemView::ScrollPerPixel</enum>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </widget>\n         </item>\n         <item>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n           <property name=\"spacing\">\n            <number>0</number>\n           </property>\n           <property name=\"rightMargin\">\n            <number>0</number>\n           </property>\n           <item>\n            <widget class=\"QStackedWidget\" name=\"stackedWidget\">\n             <property name=\"currentIndex\">\n              <number>0</number>\n             </property>\n             <widget class=\"QWidget\" name=\"newQSOAreaPage\">\n              <layout class=\"QVBoxLayout\" name=\"verticalLayout_13\">\n               <property name=\"leftMargin\">\n                <number>4</number>\n               </property>\n               <property name=\"topMargin\">\n                <number>0</number>\n               </property>\n               <property name=\"rightMargin\">\n                <number>4</number>\n               </property>\n               <property name=\"bottomMargin\">\n                <number>4</number>\n               </property>\n               <item>\n                <widget class=\"QGroupBox\" name=\"qsoRowAGroupBox\">\n                 <property name=\"title\">\n                  <string>Row A</string>\n                 </property>\n                 <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n                  <property name=\"leftMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"topMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"rightMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"bottomMargin\">\n                   <number>4</number>\n                  </property>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n                    <item>\n                     <spacer name=\"verticalSpacer_4\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"moveToQSORowAButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Move selected fields from the Available Fields List to the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"removeFromQSORowAButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Remove selected field from the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_7\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                  <item>\n                   <widget class=\"QListView\" name=\"qsoRowAFieldsListView\">\n                    <property name=\"toolTip\">\n                     <string>List of fields in the first variable row</string>\n                    </property>\n                    <property name=\"editTriggers\">\n                     <set>QAbstractItemView::NoEditTriggers</set>\n                    </property>\n                    <property name=\"showDropIndicator\" stdset=\"0\">\n                     <bool>false</bool>\n                    </property>\n                    <property name=\"verticalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                    <property name=\"horizontalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                   </widget>\n                  </item>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n                    <item>\n                     <spacer name=\"verticalSpacer_6\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"qsoRowAUpButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field up</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"qsoRowADownButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field down</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_5\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                 </layout>\n                </widget>\n               </item>\n               <item>\n                <widget class=\"QGroupBox\" name=\"qsoRowBGroupBox\">\n                 <property name=\"title\">\n                  <string>Row B</string>\n                 </property>\n                 <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n                  <property name=\"spacing\">\n                   <number>6</number>\n                  </property>\n                  <property name=\"leftMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"topMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"rightMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"bottomMargin\">\n                   <number>4</number>\n                  </property>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n                    <item>\n                     <spacer name=\"verticalSpacer_8\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"moveToQSORowBButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Move selected fields from the Available Fields List to the Row B</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"removeFromQSORowBButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Remove selected field from the Row B</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_3\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                  <item>\n                   <widget class=\"QListView\" name=\"qsoRowBFieldsListView\">\n                    <property name=\"toolTip\">\n                     <string>List of fields in the second variable row</string>\n                    </property>\n                    <property name=\"editTriggers\">\n                     <set>QAbstractItemView::NoEditTriggers</set>\n                    </property>\n                    <property name=\"showDropIndicator\" stdset=\"0\">\n                     <bool>false</bool>\n                    </property>\n                    <property name=\"verticalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                    <property name=\"horizontalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                   </widget>\n                  </item>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n                    <property name=\"rightMargin\">\n                     <number>0</number>\n                    </property>\n                    <item>\n                     <spacer name=\"verticalSpacer_9\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"qsoRowBUpButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field up</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"qsoRowBDownButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field down</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_10\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                 </layout>\n                </widget>\n               </item>\n              </layout>\n             </widget>\n             <widget class=\"QWidget\" name=\"newQSODetailPage\">\n              <layout class=\"QVBoxLayout\" name=\"verticalLayout_20\">\n               <property name=\"leftMargin\">\n                <number>4</number>\n               </property>\n               <property name=\"topMargin\">\n                <number>0</number>\n               </property>\n               <property name=\"rightMargin\">\n                <number>4</number>\n               </property>\n               <property name=\"bottomMargin\">\n                <number>4</number>\n               </property>\n               <item>\n                <widget class=\"QGroupBox\" name=\"detailColAGroupBox\">\n                 <property name=\"title\">\n                  <string>Column A</string>\n                 </property>\n                 <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n                  <property name=\"leftMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"topMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"rightMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"bottomMargin\">\n                   <number>4</number>\n                  </property>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_14\">\n                    <item>\n                     <spacer name=\"verticalSpacer_23\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"moveToDetailColAButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Move selected fields from the Available Fields List to the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"removeFromDetailColAButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Remove selected field from the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_24\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                  <item>\n                   <widget class=\"QListView\" name=\"detailColAFieldsListView\">\n                    <property name=\"toolTip\">\n                     <string>List of fields in the first QSO Detail Column</string>\n                    </property>\n                    <property name=\"editTriggers\">\n                     <set>QAbstractItemView::NoEditTriggers</set>\n                    </property>\n                    <property name=\"showDropIndicator\" stdset=\"0\">\n                     <bool>false</bool>\n                    </property>\n                    <property name=\"verticalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                    <property name=\"horizontalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                   </widget>\n                  </item>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_15\">\n                    <item>\n                     <spacer name=\"verticalSpacer_25\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColAUpButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field up</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColADownButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field down</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_26\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                 </layout>\n                </widget>\n               </item>\n               <item>\n                <widget class=\"QGroupBox\" name=\"detailColBGroupBox\">\n                 <property name=\"title\">\n                  <string>Column B</string>\n                 </property>\n                 <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n                  <property name=\"leftMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"topMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"rightMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"bottomMargin\">\n                   <number>4</number>\n                  </property>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_16\">\n                    <item>\n                     <spacer name=\"verticalSpacer_27\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"moveToDetailColBButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Move selected fields from the Available Fields List to the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"removeFromDetailColBButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Remove selected field from the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_28\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                  <item>\n                   <widget class=\"QListView\" name=\"detailColBFieldsListView\">\n                    <property name=\"toolTip\">\n                     <string>List of fields in the second QSO Detail Column</string>\n                    </property>\n                    <property name=\"editTriggers\">\n                     <set>QAbstractItemView::NoEditTriggers</set>\n                    </property>\n                    <property name=\"showDropIndicator\" stdset=\"0\">\n                     <bool>false</bool>\n                    </property>\n                    <property name=\"verticalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                    <property name=\"horizontalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                   </widget>\n                  </item>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_17\">\n                    <item>\n                     <spacer name=\"verticalSpacer_29\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColBUpButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field up</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColBDownButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field down</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_30\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                 </layout>\n                </widget>\n               </item>\n               <item>\n                <widget class=\"QGroupBox\" name=\"detailColCGroupBox\">\n                 <property name=\"title\">\n                  <string>Column C</string>\n                 </property>\n                 <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n                  <property name=\"leftMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"topMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"rightMargin\">\n                   <number>4</number>\n                  </property>\n                  <property name=\"bottomMargin\">\n                   <number>4</number>\n                  </property>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_18\">\n                    <item>\n                     <spacer name=\"verticalSpacer_31\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"moveToDetailColCButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Move selected fields from the Available Fields List to the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"removeFromDetailColCButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Remove selected field from the Row A</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_32\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                  <item>\n                   <widget class=\"QListView\" name=\"detailColCFieldsListView\">\n                    <property name=\"toolTip\">\n                     <string>List of fields in the third QSO Detail Column</string>\n                    </property>\n                    <property name=\"editTriggers\">\n                     <set>QAbstractItemView::NoEditTriggers</set>\n                    </property>\n                    <property name=\"showDropIndicator\" stdset=\"0\">\n                     <bool>false</bool>\n                    </property>\n                    <property name=\"verticalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                    <property name=\"horizontalScrollMode\">\n                     <enum>QAbstractItemView::ScrollPerPixel</enum>\n                    </property>\n                   </widget>\n                  </item>\n                  <item>\n                   <layout class=\"QVBoxLayout\" name=\"verticalLayout_19\">\n                    <item>\n                     <spacer name=\"verticalSpacer_33\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColCUpButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field up</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <widget class=\"QPushButton\" name=\"detailColCDownButton\">\n                      <property name=\"sizePolicy\">\n                       <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                        <horstretch>0</horstretch>\n                        <verstretch>0</verstretch>\n                       </sizepolicy>\n                      </property>\n                      <property name=\"maximumSize\">\n                       <size>\n                        <width>24</width>\n                        <height>24</height>\n                       </size>\n                      </property>\n                      <property name=\"toolTip\">\n                       <string>Change the order. Move selected field down</string>\n                      </property>\n                      <property name=\"text\">\n                       <string notr=\"true\"/>\n                      </property>\n                      <property name=\"icon\">\n                       <iconset resource=\"../res/icons/icons.qrc\">\n                        <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n                      </property>\n                     </widget>\n                    </item>\n                    <item>\n                     <spacer name=\"verticalSpacer_34\">\n                      <property name=\"orientation\">\n                       <enum>Qt::Vertical</enum>\n                      </property>\n                      <property name=\"sizeHint\" stdset=\"0\">\n                       <size>\n                        <width>20</width>\n                        <height>40</height>\n                       </size>\n                      </property>\n                     </spacer>\n                    </item>\n                   </layout>\n                  </item>\n                 </layout>\n                </widget>\n               </item>\n              </layout>\n             </widget>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"layoutTypeComboBox\">\n             <item>\n              <property name=\"text\">\n               <string>New QSO Rows</string>\n              </property>\n             </item>\n             <item>\n              <property name=\"text\">\n               <string>New QSO Detail Columns</string>\n              </property>\n             </item>\n            </widget>\n           </item>\n          </layout>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"valuesTab\">\n      <attribute name=\"title\">\n       <string>Values</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"profilesGroupBox\">\n         <property name=\"title\">\n          <string>Profiles</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_2\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"stationProfileCheckbox\">\n            <property name=\"toolTip\">\n             <string>If unchecked, the profile does not change</string>\n            </property>\n            <property name=\"text\">\n             <string>Station</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_13\">\n            <item>\n             <widget class=\"QComboBox\" name=\"stationProfileCombo\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"antennaProfileCheckbox\">\n            <property name=\"toolTip\">\n             <string>If unchecked, the profile does not change</string>\n            </property>\n            <property name=\"text\">\n             <string>Antenna</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_12\">\n            <item>\n             <widget class=\"QComboBox\" name=\"antennaProfileCombo\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"rigProfileCheckbox\">\n            <property name=\"toolTip\">\n             <string>If unchecked, the profile does not change</string>\n            </property>\n            <property name=\"text\">\n             <string>Rig</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n            <item>\n             <widget class=\"QComboBox\" name=\"rigProfileCombo\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"rigAutoconnectCheckbox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Connect automatically</string>\n              </property>\n              <property name=\"text\">\n               <string>Connect</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item row=\"3\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"rotatorProfileCheckbox\">\n            <property name=\"toolTip\">\n             <string>If unchecked, the profile does not change</string>\n            </property>\n            <property name=\"text\">\n             <string>Rotator</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n            <item>\n             <widget class=\"QComboBox\" name=\"rotatorProfileCombo\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"rotatorAutoconnectCheckbox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Connect automatically</string>\n              </property>\n              <property name=\"text\">\n               <string>Connect</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"fieldsGroupBox\">\n         <property name=\"title\">\n          <string>Fields</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_4\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"contestIDCheckbox\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"contestIDEdit\">\n            <property name=\"enabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"propagationModeCheckbox\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <widget class=\"QComboBox\" name=\"propagationModeCombo\">\n            <property name=\"enabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"satModeCheckbox\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"1\">\n           <widget class=\"QComboBox\" name=\"satModeCombo\">\n            <property name=\"enabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"satNameCheckbox\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"satNameEdit\">\n            <property name=\"enabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QCheckBox\" name=\"stxStringCheckbox\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"stxStringEdit\">\n            <property name=\"enabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>activityNameEdit</tabstop>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>mainLayoutClearButton</tabstop>\n  <tabstop>availableFieldsListView</tabstop>\n  <tabstop>qsoRowAFieldsListView</tabstop>\n  <tabstop>moveToQSORowAButton</tabstop>\n  <tabstop>removeFromQSORowAButton</tabstop>\n  <tabstop>qsoRowAUpButton</tabstop>\n  <tabstop>qsoRowADownButton</tabstop>\n  <tabstop>qsoRowBFieldsListView</tabstop>\n  <tabstop>moveToQSORowBButton</tabstop>\n  <tabstop>removeFromQSORowBButton</tabstop>\n  <tabstop>qsoRowBUpButton</tabstop>\n  <tabstop>qsoRowBDownButton</tabstop>\n  <tabstop>layoutTypeComboBox</tabstop>\n  <tabstop>detailColAFieldsListView</tabstop>\n  <tabstop>moveToDetailColAButton</tabstop>\n  <tabstop>removeFromDetailColAButton</tabstop>\n  <tabstop>detailColAUpButton</tabstop>\n  <tabstop>detailColADownButton</tabstop>\n  <tabstop>detailColBFieldsListView</tabstop>\n  <tabstop>moveToDetailColBButton</tabstop>\n  <tabstop>removeFromDetailColBButton</tabstop>\n  <tabstop>detailColBUpButton</tabstop>\n  <tabstop>detailColBDownButton</tabstop>\n  <tabstop>detailColCFieldsListView</tabstop>\n  <tabstop>moveToDetailColCButton</tabstop>\n  <tabstop>removeFromDetailColCButton</tabstop>\n  <tabstop>detailColCUpButton</tabstop>\n  <tabstop>detailColCDownButton</tabstop>\n  <tabstop>stationProfileCheckbox</tabstop>\n  <tabstop>stationProfileCombo</tabstop>\n  <tabstop>antennaProfileCheckbox</tabstop>\n  <tabstop>antennaProfileCombo</tabstop>\n  <tabstop>rigProfileCheckbox</tabstop>\n  <tabstop>rigProfileCombo</tabstop>\n  <tabstop>rigAutoconnectCheckbox</tabstop>\n  <tabstop>rotatorProfileCheckbox</tabstop>\n  <tabstop>rotatorProfileCombo</tabstop>\n  <tabstop>rotatorAutoconnectCheckbox</tabstop>\n  <tabstop>contestIDCheckbox</tabstop>\n  <tabstop>contestIDEdit</tabstop>\n  <tabstop>stxStringCheckbox</tabstop>\n  <tabstop>stxStringEdit</tabstop>\n  <tabstop>propagationModeCheckbox</tabstop>\n  <tabstop>propagationModeCombo</tabstop>\n  <tabstop>satModeCheckbox</tabstop>\n  <tabstop>satModeCombo</tabstop>\n  <tabstop>satNameCheckbox</tabstop>\n  <tabstop>satNameEdit</tabstop>\n </tabstops>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>save()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>254</x>\n     <y>516</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>322</x>\n     <y>516</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>activityNameEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>profileNameChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>218</x>\n     <y>23</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>190</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>layoutTypeComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>stackedWidget</receiver>\n   <slot>setCurrentIndex(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>512</x>\n     <y>475</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>405</x>\n     <y>258</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>mainLayoutClearButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>clearMainLayoutClick()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>513</x>\n     <y>105</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>249</x>\n     <y>249</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>antennaProfileCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>64</x>\n     <y>108</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>249</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationProfileCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>53</x>\n     <y>90</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>249</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigProfileCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>45</x>\n     <y>108</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>249</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotatorProfileCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>61</x>\n     <y>108</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>249</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>contestIDCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>114</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>propagationModeCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>39</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>satModeCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>114</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>satNameCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>114</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>propagationModeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>114</x>\n     <y>114</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stxStringCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ActivityEditor</receiver>\n   <slot>setValueState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>33</x>\n     <y>332</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>261</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>save()</slot>\n  <slot>profileNameChanged(QString)</slot>\n  <slot>clearMainLayoutClick()</slot>\n  <slot>setValueState()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/AlertRuleDetail.cpp",
    "content": "#include <QCheckBox>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QSqlRecord>\n#include <QMessageBox>\n\n#include \"AlertRuleDetail.h\"\n#include \"ui_AlertRuleDetail.h\"\n#include \"core/debug.h\"\n#include \"../models/SqlListModel.h\"\n#include \"data/Data.h\"\n#include \"data/SpotAlert.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.alerruledetail\");\n\nAlertRuleDetail::AlertRuleDetail(const QString &ruleName, QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::AlertRuleDetail),\n    ruleName(ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->cqzEdit->setValidator(new QIntValidator(Data::getCQZMin(), Data::getCQZMax(), ui->cqzEdit));\n    ui->ituEdit->setValidator(new QIntValidator(Data::getITUZMin(), Data::getITUZMax(), ui->ituEdit));\n\n    /*************/\n    /* Get Bands */\n    /*************/\n    const QList<Band> bands = BandPlan::bandsList(false, true);\n    int i = 0;\n    for ( const Band &enabledBand : bands )\n    {\n        const QString &bandName = enabledBand.name;\n        QCheckBox *bandCheckbox = new QCheckBox(ui->band_group->parentWidget());\n        bandCheckbox->setText(bandName);\n        bandCheckbox->setObjectName(\"band_\" + bandName);\n\n        int row = i / MAXCOLUMNS;\n        int column = i % MAXCOLUMNS;\n        ui->band_group->addWidget(bandCheckbox, row, column);\n        i++;\n    }\n\n    /****************/\n    /* DX Countries */\n    /****************/\n    const QLatin1String countryStmt(\"SELECT id, translate_to_locale(name) \"\n                                    \"FROM dxcc_entities_ad1c \"\n                                    \"ORDER BY 2 COLLATE LOCALEAWARE ASC;\");\n\n    SqlListModel *countryModel = new SqlListModel(countryStmt, tr(\"All\"), ui->countryCombo);\n    while (countryModel->canFetchMore()) countryModel->fetchMore();\n    ui->countryCombo->setModel(countryModel);\n    ui->countryCombo->setModelColumn(1);\n    ui->countryCombo->adjustMaxSize();\n\n    /********************/\n    /* Spotter Coutries */\n    /********************/\n    SqlListModel *countryModel2 = new SqlListModel(countryStmt, tr(\"All\"), ui->spotterCountryCombo);\n    while (countryModel2->canFetchMore()) countryModel2->fetchMore();\n    ui->spotterCountryCombo->setModel(countryModel2);\n    ui->spotterCountryCombo->setModelColumn(1);    \n    ui->spotterCountryCombo->adjustMaxSize();\n\n    /**************************************/\n    /* Load or Prepare Rule Dialog Values */\n    /**************************************/\n    if ( ! ruleName.isEmpty() )\n    {\n        loadRule(ruleName);\n    }\n    else\n    {\n        /* get Rule name from DB to checking whether a new filter name\n         * will be unique */\n        QSqlQuery ruleStmt;\n        if ( ! ruleStmt.prepare(\"SELECT rule_name FROM alert_rules ORDER BY rule_name\") )\n        {\n            qWarning() << \"Cannot prepare select statement\";\n        }\n        else\n        {\n            if ( ruleStmt.exec() )\n                while (ruleStmt.next())\n                    ruleNamesList << ruleStmt.value(0).toString();\n            else\n                qWarning()<< \"Cannot get filters names from DB\" << ruleStmt.lastError();\n        }\n        setDefaultValues();\n        generateMembershipCheckboxes();\n    }\n}\n\nAlertRuleDetail::~AlertRuleDetail()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid AlertRuleDetail::save()\n{\n    FCT_IDENTIFICATION;\n\n\n    if ( ui->ruleNameEdit->text().isEmpty() )\n    {\n        ui->ruleNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ruleExists(ui->ruleNameEdit->text()) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Rule name is already exists.\"));\n        return;\n    }\n\n    QRegularExpression rxCall(ui->dxCallsignEdit->text());\n    QRegularExpression rxComm(ui->spotCommentEdit->text());\n\n    if ( !rxCall.isValid() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Callsign Regular Expression is incorrect.\"));\n        return;\n    }\n\n    if ( !rxComm.isValid() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Comment Regular Expression is incorrect.\"));\n        return;\n    }\n\n    AlertRule rule;\n    /*************\n     * Rule Name *\n     *************/\n    rule.ruleName = ui->ruleNameEdit->text();\n\n    /***********\n     * Enabled *\n     ***********/\n    rule.enabled = ui->ruleEnabledCheckBox->isChecked();\n\n    /**********\n     * Source *\n     **********/\n    int finalSource = 0;\n    finalSource |= (ui->dxcCheckBox->isChecked()   ? SpotAlert::DXSPOT      : 0)\n                |  (ui->wsjtxCheckBox->isChecked() ? SpotAlert::WSJTXCQSPOT : 0);\n\n    rule.sourceMap = finalSource;\n\n    /***************\n     * DX Callsign *\n     ***************/\n    rule.dxCallsign = ui->dxCallsignEdit->text();\n\n    /**************\n     * DX Country *\n     **************/\n    bool OK = false;\n    int countryCode = ui->countryCombo->currentValue(1).toInt(&OK);\n    rule.dxCountry = ( OK && countryCode > 0 ) ? countryCode : 0; // 0 = all\n\n    /*************\n     * DX Member *\n     *************/\n    QStringList dxMember;\n\n    if ( ui->memberGroupBox->isChecked() )\n    {\n        for ( QCheckBox* item : static_cast<const QList<QCheckBox*>&>(memberListCheckBoxes) )\n            if ( item->isChecked() ) dxMember.append(QString(\"%1\").arg(item->text()));\n    }\n    else\n        dxMember.append(\"*\");\n\n    rule.dxMember = dxMember;\n\n    /*****************\n     * DX Log Status *\n     *****************/\n    int status = 0;\n    if ( ui->newEntityCheckbox->isChecked() ) status |=  DxccStatus::NewEntity;\n    if ( ui->newBandCheckbox->isChecked() )   status |=  DxccStatus::NewBand;\n    if ( ui->newModeCheckbox->isChecked() )   status |=  DxccStatus::NewMode;\n    if ( ui->newSlotCheckbox->isChecked() )   status |=  DxccStatus::NewSlot;\n    if ( ui->workedCheckbox->isChecked() )    status |=  DxccStatus::Worked;\n    if ( ui->confirmedCheckbox->isChecked() ) status |=  DxccStatus::Confirmed;\n    if ( ui->allCheckbox->isChecked() )       status = DxccStatus::All;\n    rule.dxLogStatusMap = status;\n\n    /****************\n     * DX Continent *\n     ****************/\n    QString continentRE(\"*\");\n\n    if ( ui->continent->isChecked() )\n    {\n        continentRE = \"NOTHING\";\n\n        if ( ui->afcheckbox->isChecked() ) continentRE.append(\"|AF\");\n        if ( ui->ancheckbox->isChecked() ) continentRE.append(\"|AN\");\n        if ( ui->ascheckbox->isChecked() ) continentRE.append(\"|AS\");\n        if ( ui->eucheckbox->isChecked() ) continentRE.append(\"|EU\");\n        if ( ui->nacheckbox->isChecked() ) continentRE.append(\"|NA\");\n        if ( ui->occheckbox->isChecked() ) continentRE.append(\"|OC\");\n        if ( ui->sacheckbox->isChecked() ) continentRE.append(\"|SA\");\n    }\n\n    rule.dxContinent = continentRE;\n\n    /*******************\n     * Spotter Comment *\n     *******************/\n    rule.dxComment = ui->spotCommentEdit->text();\n\n    /********\n     * Mode *\n     ********/\n    QString modeRE(\"*\");\n\n    if ( ui->modes->isChecked() )\n    {\n        modeRE = \"NOTHING\";\n        if ( ui->cwcheckbox->isChecked() ) modeRE.append(\"|\" + BandPlan::MODE_GROUP_STRING_CW);\n        if ( ui->phonecheckbox->isChecked() ) modeRE.append(\"|\" + BandPlan::MODE_GROUP_STRING_PHONE);\n        if ( ui->digitalcheckbox->isChecked() ) modeRE.append(\"|\" + BandPlan::MODE_GROUP_STRING_DIGITAL);\n        if ( ui->ftxcheckbox->isChecked() ) modeRE.append(\"|\" + BandPlan::MODE_GROUP_STRING_FTx);\n    }\n\n    rule.mode = modeRE;\n\n    /********\n     * band *\n     ********/\n    QString bandRE(\"*\");\n\n    if ( ui->bands->isChecked() )\n    {\n        bandRE = \"NOTHING\";\n\n        for ( int i = 0; i < ui->band_group->count(); i++)\n        {\n            QLayoutItem *item = ui->band_group->itemAt(i);\n            if ( !item || !item->widget() ) continue;\n            QCheckBox *bandcheckbox = qobject_cast<QCheckBox*>(item->widget());\n\n            if ( bandcheckbox )\n            {\n                if ( bandcheckbox->isChecked() )\n                {\n                    //NOTHING|20m|40m\n                    bandRE.append(\"|\" + bandcheckbox->objectName().split(\"_\").at(1));\n                }\n            }\n        }\n    }\n\n    rule.band = bandRE;\n\n    /*******************\n     * Spotter Country *\n     *******************/\n    OK = false;\n    int countryCodeSpotter = ui->spotterCountryCombo->currentValue(1).toInt(&OK);\n    rule.spotterCountry = ( OK && countryCodeSpotter > 0 ) ? countryCodeSpotter : 0; // 0 = all\n\n    /*********************\n     * Spotter Continent *\n     *********************/\n    QString spotterContinentRE(\"*\");\n\n    if ( ui->continent_spotter->isChecked() )\n    {\n        spotterContinentRE = \"NOTHING\" ;\n\n        if ( ui->afcheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|AF\");\n        if ( ui->ancheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|AN\");\n        if ( ui->ascheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|AS\");\n        if ( ui->eucheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|EU\");\n        if ( ui->nacheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|NA\");\n        if ( ui->occheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|OC\");\n        if ( ui->sacheckbox_spotter->isChecked() ) spotterContinentRE.append(\"|SA\");\n    }\n\n    rule.spotterContinent = spotterContinentRE;\n\n    /************\n     * CQ Zones\n     ***********/\n    rule.cqz = (ui->cqzEdit->text().isEmpty() ? 0 : ui->cqzEdit->text().toInt());\n\n    /************\n     * ITU Zones\n     ***********/\n    rule.ituz = (ui->ituEdit->text().isEmpty() ? 0 : ui->ituEdit->text().toInt());\n\n    /***********\n     * POTA\n     **********/\n    rule.pota = ui->potaCheckbox->isChecked();\n\n    /***********\n     * SOTA\n     **********/\n    rule.sota = ui->sotaCheckbox->isChecked();\n\n    /***********\n     * IOTA\n     **********/\n    rule.iota = ui->iotaCheckbox->isChecked();\n\n    /***********\n     * WWFF\n     **********/\n    rule.wwff = ui->wwffCheckbox->isChecked();\n\n    qCDebug(runtime) << rule;\n\n    if ( ! rule.save() )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"Cannot Update Alert Rules\"));\n        return;\n    }\n\n    accept();\n}\n\nvoid AlertRuleDetail::ruleNameChanged(const QString &newRuleName)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n\n    p.setColor(QPalette::Text, ( ruleExists(newRuleName) ) ? Qt::red\n                                                           : qApp->palette().text().color());\n    ui->ruleNameEdit->setPalette(p);\n}\n\nvoid AlertRuleDetail::callsignChanged(const QString &enteredRE)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n\n    QRegularExpression rx(enteredRE);\n\n    p.setColor(QPalette::Text, ( !rx.isValid() ) ? Qt::red : qApp->palette().text().color());\n    ui->dxCallsignEdit->setPalette(p);\n}\n\nvoid AlertRuleDetail::spotCommentChanged(const QString &enteredRE)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n\n    QRegularExpression rx(enteredRE);\n\n    p.setColor(QPalette::Text, ( !rx.isValid() ) ? Qt::red : qApp->palette().text().color());\n    ui->spotCommentEdit->setPalette(p);\n}\n\nvoid AlertRuleDetail::enabledLogStatusAll(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    if ( enabled )\n    {\n        ui->newEntityCheckbox->setChecked(enabled);\n        ui->newBandCheckbox->setChecked(enabled);\n        ui->newModeCheckbox->setChecked(enabled);\n        ui->newSlotCheckbox->setChecked(enabled);\n        ui->workedCheckbox->setChecked(enabled);\n        ui->confirmedCheckbox->setChecked(enabled);\n    }\n\n    ui->newEntityCheckbox->setEnabled(!enabled);\n    ui->newBandCheckbox->setEnabled(!enabled);\n    ui->newModeCheckbox->setEnabled(!enabled);\n    ui->newSlotCheckbox->setEnabled(!enabled);\n    ui->workedCheckbox->setEnabled(!enabled);\n    ui->confirmedCheckbox->setEnabled(!enabled);\n}\n\nvoid AlertRuleDetail::setDefaultValues()\n{\n    FCT_IDENTIFICATION;\n\n    ui->allCheckbox->setChecked(true);\n    ui->countryCombo->setCurrentValue(ALLCOUNTRYIDX, 1);\n}\n\nbool AlertRuleDetail::ruleExists(const QString &ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << ruleName;\n\n    return ruleNamesList.contains(ruleName);\n}\n\nvoid AlertRuleDetail::loadRule(const QString &ruleName)\n{\n\n    FCT_IDENTIFICATION;\n\n    ui->ruleNameEdit->setText(ruleName);\n    ui->ruleNameEdit->setEnabled(false);\n\n    AlertRule rule;\n\n    if ( rule.load(ruleName) )\n    {\n        /***********\n         * Enabled *\n         ***********/\n        ui->ruleEnabledCheckBox->setChecked(rule.enabled);\n\n        /**********\n         * Source *\n         **********/\n        ui->dxcCheckBox->setChecked((rule.sourceMap & SpotAlert::DXSPOT));\n        ui->wsjtxCheckBox->setChecked((rule.sourceMap & SpotAlert::WSJTXCQSPOT));\n\n        /***************\n         * DX Callsign *\n         ***************/\n        ui->dxCallsignEdit->setText(rule.dxCallsign);\n\n        /**************\n         * DX Country *\n         **************/\n        ui->countryCombo->setCurrentValue(rule.dxCountry, 1);\n\n        /*************\n         * DX Member *\n         *************/\n        generateMembershipCheckboxes(&rule);\n        const bool isDefaultAny = (rule.dxMember.size() == 1 && rule.dxMember.front() == \"*\");\n        ui->memberGroupBox->setChecked(!isDefaultAny);\n\n        /*****************\n         * DX Log Status *\n         *****************/\n        uint statusSetting = rule.dxLogStatusMap;\n        ui->allCheckbox->setChecked(statusSetting == DxccStatus::All);\n        ui->newEntityCheckbox->setChecked(statusSetting & DxccStatus::NewEntity);\n        ui->newBandCheckbox->setChecked(statusSetting & DxccStatus::NewBand);\n        ui->newModeCheckbox->setChecked(statusSetting & DxccStatus::NewMode);\n        ui->newSlotCheckbox->setChecked(statusSetting & DxccStatus::NewSlot);\n        ui->workedCheckbox->setChecked(statusSetting & DxccStatus::Worked);\n        ui->confirmedCheckbox->setChecked(statusSetting & DxccStatus::Confirmed);\n\n        /*************\n         * Continent *\n         *************/\n        QString continentRE = rule.dxContinent;\n\n        if ( continentRE == \"*\" )\n        {\n            ui->continent->setChecked(false);\n        }\n        else\n        {\n            ui->continent->setChecked(true);\n\n            ui->afcheckbox->setChecked(continentRE.contains(\"|AF\"));\n            ui->ancheckbox->setChecked(continentRE.contains(\"|AN\"));\n            ui->ascheckbox->setChecked(continentRE.contains(\"|AS\"));\n            ui->eucheckbox->setChecked(continentRE.contains(\"|EU\"));\n            ui->nacheckbox->setChecked(continentRE.contains(\"|NA\"));\n            ui->occheckbox->setChecked(continentRE.contains(\"|OC\"));\n            ui->sacheckbox->setChecked(continentRE.contains(\"|SA\"));\n        }\n\n        /*******************\n         * Spotter Comment *\n         *******************/\n        ui->spotCommentEdit->setText(rule.dxComment);\n\n        /********\n         * Mode *\n         ********/\n        QString modeRE = rule.mode;\n\n        if ( modeRE == \"*\" )\n        {\n            ui->modes->setChecked(false);\n        }\n        else\n        {\n            ui->modes->setChecked(true);\n\n            ui->cwcheckbox->setChecked(modeRE.contains(\"|\" + BandPlan::MODE_GROUP_STRING_CW));\n            ui->phonecheckbox->setChecked(modeRE.contains(\"|\" + BandPlan::MODE_GROUP_STRING_PHONE));\n            ui->digitalcheckbox->setChecked(modeRE.contains(\"|\" + BandPlan::MODE_GROUP_STRING_DIGITAL));\n            ui->ftxcheckbox->setChecked(modeRE.contains(\"|\" + BandPlan::MODE_GROUP_STRING_FTx));\n        }\n\n        /********\n         * band *\n         ********/\n        QString bandRE = rule.band;\n\n        if ( bandRE == \"*\" )\n        {\n            ui->bands->setChecked(false);\n        }\n        else\n        {\n            ui->bands->setChecked(true);\n\n            for ( int i = 0; i < ui->band_group->count(); i++)\n            {\n                QLayoutItem *item = ui->band_group->itemAt(i);\n                if ( !item || !item->widget() ) continue;\n                QCheckBox *bandcheckbox = qobject_cast<QCheckBox*>(item->widget());\n\n                if (bandcheckbox)\n                {\n                    // object name: ex. band_20m\n                    // rule : NOTHING|20m|40m\n                    bandcheckbox->setChecked(bandRE.contains(\"|\" + bandcheckbox->objectName().split(\"_\").at(1)));\n                }\n            }\n        }\n\n        /*******************\n         * Spotter Country *\n         *******************/\n        ui->spotterCountryCombo->setCurrentValue(rule.spotterCountry, 1);\n\n        /*********************\n         * Spotter Continent *\n         *********************/\n        QString spotterContinentRE = rule.spotterContinent;\n\n        if ( spotterContinentRE == \"*\" )\n        {\n            ui->continent_spotter->setChecked(false);\n        }\n        else\n        {\n            ui->continent_spotter->setChecked(true);\n\n            ui->afcheckbox_spotter->setChecked(spotterContinentRE.contains(\"|AF\"));\n            ui->ancheckbox_spotter->setChecked(spotterContinentRE.contains(\"|AN\"));\n            ui->ascheckbox_spotter->setChecked(spotterContinentRE.contains(\"|AS\"));\n            ui->eucheckbox_spotter->setChecked(spotterContinentRE.contains(\"|EU\"));\n            ui->nacheckbox_spotter->setChecked(spotterContinentRE.contains(\"|NA\"));\n            ui->occheckbox_spotter->setChecked(spotterContinentRE.contains(\"|OC\"));\n            ui->sacheckbox_spotter->setChecked(spotterContinentRE.contains(\"|SA\"));\n        }\n\n        /***********\n         * CQ Zones\n         **********/\n        ui->cqzEdit->setText(( rule.cqz != 0) ? QString::number(rule.cqz) : QString());\n\n        /***********\n         * ITU Zones\n         **********/\n        ui->ituEdit->setText(( rule.ituz != 0) ? QString::number(rule.ituz) : QString());\n\n        /***********\n         * POTA\n         **********/\n        ui->potaCheckbox->setChecked(rule.pota);\n\n        /***********\n         * SOTA\n         **********/\n        ui->sotaCheckbox->setChecked(rule.sota);\n\n        /***********\n         * IOTA\n         **********/\n        ui->iotaCheckbox->setChecked(rule.iota);\n\n        /***********\n         * WWFF\n         **********/\n        ui->wwffCheckbox->setChecked(rule.wwff);\n    }\n    else\n        qCDebug(runtime) << \"Cannot load rule \" << ruleName;\n}\n\nvoid AlertRuleDetail::generateMembershipCheckboxes(const AlertRule * rule)\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList enabledLists = MembershipQE::getEnabledClubLists();\n\n    for ( const QString &enabledClub : enabledLists )\n    {\n        QCheckBox *columnCheckbox = new QCheckBox(ui->dxMemberGrid->parentWidget());\n        columnCheckbox->setText(enabledClub);\n        if ( rule ) columnCheckbox->setChecked(rule->dxMember.contains(enabledClub));\n        memberListCheckBoxes.append(columnCheckbox);\n    }\n\n    if ( memberListCheckBoxes.isEmpty() )\n    {\n        ui->dxMemberGrid->addWidget(new QLabel(tr(\"No Club List is enabled\"), this));\n    }\n    else\n    {\n        int elementIndex = 0;\n\n        for ( QCheckBox* item : static_cast<const QList<QCheckBox*>&>(memberListCheckBoxes) )\n        {\n            ui->dxMemberGrid->addWidget(item, elementIndex / MAXCOLUMNS, elementIndex % MAXCOLUMNS);\n            elementIndex++;\n        }\n    }\n}\n"
  },
  {
    "path": "ui/AlertRuleDetail.h",
    "content": "#ifndef QLOG_UI_ALERTRULEDETAIL_H\n#define QLOG_UI_ALERTRULEDETAIL_H\n\n#include <QDialog>\n#include <QCheckBox>\n\n#include \"core/AlertEvaluator.h\"\n\nnamespace Ui {\nclass AlertRuleDetail;\n}\n\nclass AlertRuleDetail : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit AlertRuleDetail(const QString &ruleName, QWidget *parent);\n    ~AlertRuleDetail();\n\npublic slots:\n    void save();\n    void ruleNameChanged(const QString&);\n    void callsignChanged(const QString&);\n    void spotCommentChanged(const QString&);\n\nprivate:\n    Ui::AlertRuleDetail *ui;\n    QString ruleName;\n    QStringList ruleNamesList;\n    QList<QCheckBox*> memberListCheckBoxes;\n\n\nprivate slots:\n    void enabledLogStatusAll(bool enabled);\n\nprivate:\n    void setDefaultValues();\n    bool ruleExists(const QString &ruleName);\n    void loadRule(const QString &ruleName);\n    void generateMembershipCheckboxes(const AlertRule * rule = nullptr);\n\n    const quint8 MAXCOLUMNS = 8;\n    const quint8 ALLCOUNTRYIDX = 0;\n};\n\n#endif // QLOG_UI_ALERTRULEDETAIL_H\n"
  },
  {
    "path": "ui/AlertRuleDetail.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AlertRuleDetail</class>\n <widget class=\"QDialog\" name=\"AlertRuleDetail\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>577</width>\n    <height>604</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Alert Rule Detail</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <layout class=\"QFormLayout\" name=\"formLayout\">\n       <property name=\"horizontalSpacing\">\n        <number>4</number>\n       </property>\n       <property name=\"verticalSpacing\">\n        <number>2</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QLabel\" name=\"ruleNameLabel\">\n         <property name=\"text\">\n          <string>Rule Name</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"1\">\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n         <item>\n          <widget class=\"QLineEdit\" name=\"ruleNameEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_8\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeType\">\n            <enum>QSizePolicy::Maximum</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item>\n          <widget class=\"QCheckBox\" name=\"ruleEnabledCheckBox\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Enabled</string>\n           </property>\n           <property name=\"checked\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <widget class=\"QLabel\" name=\"sourceLabel\">\n         <property name=\"text\">\n          <string>Sources</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"1\">\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n         <item>\n          <widget class=\"QCheckBox\" name=\"dxcCheckBox\">\n           <property name=\"text\">\n            <string>DX Cluster</string>\n           </property>\n           <property name=\"checked\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QCheckBox\" name=\"wsjtxCheckBox\">\n           <property name=\"text\">\n            <string>WSJTX</string>\n           </property>\n           <property name=\"checked\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_2\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>40</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Preferred</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <property name=\"tabsClosable\">\n      <bool>false</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"dx\">\n      <attribute name=\"title\">\n       <string>DX</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_3\">\n         <property name=\"horizontalSpacing\">\n          <number>12</number>\n         </property>\n         <property name=\"verticalSpacing\">\n          <number>2</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"logStatusLabel\">\n           <property name=\"text\">\n            <string>Log Status</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <layout class=\"QGridLayout\" name=\"gridLayout\">\n           <property name=\"spacing\">\n            <number>0</number>\n           </property>\n           <item row=\"1\" column=\"2\">\n            <widget class=\"QCheckBox\" name=\"workedCheckbox\">\n             <property name=\"text\">\n              <string>Worked</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QCheckBox\" name=\"newSlotCheckbox\">\n             <property name=\"text\">\n              <string>New Slot</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"3\">\n            <widget class=\"QCheckBox\" name=\"confirmedCheckbox\">\n             <property name=\"text\">\n              <string>Confirmed</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"0\" column=\"1\">\n            <widget class=\"QCheckBox\" name=\"newEntityCheckbox\">\n             <property name=\"text\">\n              <string>New Entity</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"0\" column=\"3\">\n            <widget class=\"QCheckBox\" name=\"newModeCheckbox\">\n             <property name=\"text\">\n              <string>New Mode</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"0\" column=\"2\">\n            <widget class=\"QCheckBox\" name=\"newBandCheckbox\">\n             <property name=\"text\">\n              <string>New Band</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"0\" column=\"0\">\n            <widget class=\"QCheckBox\" name=\"allCheckbox\">\n             <property name=\"text\">\n              <string>All</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"dxCallsignLabel\">\n           <property name=\"text\">\n            <string>DX Callsign</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"QLineEdit\" name=\"dxCallsignEdit\">\n           <property name=\"toolTip\">\n            <string>Use Perl-like regular expression</string>\n           </property>\n           <property name=\"text\">\n            <string>.*</string>\n           </property>\n           <property name=\"placeholderText\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"countryLabel\">\n           <property name=\"text\">\n            <string>Country</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n           <item>\n            <widget class=\"SmartSearchBox\" name=\"countryCombo\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_4\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Maximum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"ituLabel\">\n             <property name=\"text\">\n              <string>ITU</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_5\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Maximum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>10</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLineEdit\" name=\"ituEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"maximumSize\">\n              <size>\n               <width>40</width>\n               <height>16777215</height>\n              </size>\n             </property>\n             <property name=\"maxLength\">\n              <number>2</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_7\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Maximum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>10</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"cqzLabel\">\n             <property name=\"text\">\n              <string>CQZ</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_6\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Maximum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>10</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLineEdit\" name=\"cqzEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"maximumSize\">\n              <size>\n               <width>40</width>\n               <height>16777215</height>\n              </size>\n             </property>\n             <property name=\"maxLength\">\n              <number>2</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_3\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"spotCommentLabel\">\n           <property name=\"text\">\n            <string>Spot Comment</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"QLineEdit\" name=\"spotCommentEdit\">\n           <property name=\"toolTip\">\n            <string>Use Perl-like regular expression</string>\n           </property>\n           <property name=\"text\">\n            <string>.*</string>\n           </property>\n           <property name=\"placeholderText\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label\">\n           <property name=\"text\">\n            <string>Special Programs</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n           <property name=\"spacing\">\n            <number>9</number>\n           </property>\n           <item>\n            <widget class=\"QCheckBox\" name=\"iotaCheckbox\">\n             <property name=\"text\">\n              <string>IOTA</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QCheckBox\" name=\"sotaCheckbox\">\n             <property name=\"text\">\n              <string>SOTA</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QCheckBox\" name=\"potaCheckbox\">\n             <property name=\"text\">\n              <string>POTA</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QCheckBox\" name=\"wwffCheckbox\">\n             <property name=\"text\">\n              <string>WWFF</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"modes\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"title\">\n          <string>Modes</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>false</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n          <property name=\"spacing\">\n           <number>2</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>2</number>\n          </property>\n          <item>\n           <layout class=\"QGridLayout\" name=\"modes_group\">\n            <property name=\"horizontalSpacing\">\n             <number>4</number>\n            </property>\n            <property name=\"verticalSpacing\">\n             <number>2</number>\n            </property>\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"ftxcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>FTx (FT8/FT4)</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"digitalcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>Digital</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"phonecheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>Phone</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"cwcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>CW</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"bands\">\n         <property name=\"title\">\n          <string>Bands</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>false</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n          <property name=\"spacing\">\n           <number>2</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>2</number>\n          </property>\n          <item>\n           <layout class=\"QGridLayout\" name=\"band_group\">\n            <property name=\"horizontalSpacing\">\n             <number>4</number>\n            </property>\n            <property name=\"verticalSpacing\">\n             <number>2</number>\n            </property>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"continent\">\n         <property name=\"title\">\n          <string>Continent</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>false</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n          <property name=\"spacing\">\n           <number>2</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>2</number>\n          </property>\n          <item>\n           <layout class=\"QGridLayout\" name=\"cont_group\">\n            <property name=\"horizontalSpacing\">\n             <number>4</number>\n            </property>\n            <property name=\"verticalSpacing\">\n             <number>2</number>\n            </property>\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"sacheckbox\">\n              <property name=\"text\">\n               <string>South America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"ancheckbox\">\n              <property name=\"text\">\n               <string>Antarctica</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"nacheckbox\">\n              <property name=\"text\">\n               <string>North America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"occheckbox\">\n              <property name=\"text\">\n               <string>Oceania</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"ascheckbox\">\n              <property name=\"text\">\n               <string>Asia</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"eucheckbox\">\n              <property name=\"text\">\n               <string>Europe</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"afcheckbox\">\n              <property name=\"text\">\n               <string>Africa</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"memberGroupBox\">\n         <property name=\"title\">\n          <string>Member</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>false</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n          <property name=\"spacing\">\n           <number>2</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>2</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>2</number>\n          </property>\n          <item>\n           <layout class=\"QGridLayout\" name=\"dxMemberGrid\">\n            <property name=\"horizontalSpacing\">\n             <number>4</number>\n            </property>\n            <property name=\"verticalSpacing\">\n             <number>2</number>\n            </property>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"Spotter\">\n      <attribute name=\"title\">\n       <string>Spotter</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_4\">\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"spotterCountry\">\n           <property name=\"text\">\n            <string>Country</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"SmartSearchBox\" name=\"spotterCountryCombo\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"continent_spotter\">\n         <property name=\"title\">\n          <string>Continent</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>false</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"cont_group_spotter\">\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"ancheckbox_spotter\">\n              <property name=\"text\">\n               <string>Antarctica</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"ascheckbox_spotter\">\n              <property name=\"text\">\n               <string>Asia</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"eucheckbox_spotter\">\n              <property name=\"text\">\n               <string>Europe</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"afcheckbox_spotter\">\n              <property name=\"text\">\n               <string>Africa</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"nacheckbox_spotter\">\n              <property name=\"text\">\n               <string>North America</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"occheckbox_spotter\">\n              <property name=\"text\">\n               <string>Oceania</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"sacheckbox_spotter\">\n              <property name=\"text\">\n               <string>South America</string>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_3\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>SmartSearchBox</class>\n   <extends>QComboBox</extends>\n   <header>ui/component/SmartSearchBox.h</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>ruleNameEdit</tabstop>\n  <tabstop>ruleEnabledCheckBox</tabstop>\n  <tabstop>dxcCheckBox</tabstop>\n  <tabstop>wsjtxCheckBox</tabstop>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>allCheckbox</tabstop>\n  <tabstop>newEntityCheckbox</tabstop>\n  <tabstop>newBandCheckbox</tabstop>\n  <tabstop>newModeCheckbox</tabstop>\n  <tabstop>newSlotCheckbox</tabstop>\n  <tabstop>workedCheckbox</tabstop>\n  <tabstop>confirmedCheckbox</tabstop>\n  <tabstop>dxCallsignEdit</tabstop>\n  <tabstop>countryCombo</tabstop>\n  <tabstop>ituEdit</tabstop>\n  <tabstop>cqzEdit</tabstop>\n  <tabstop>spotCommentEdit</tabstop>\n  <tabstop>iotaCheckbox</tabstop>\n  <tabstop>sotaCheckbox</tabstop>\n  <tabstop>potaCheckbox</tabstop>\n  <tabstop>wwffCheckbox</tabstop>\n  <tabstop>modes</tabstop>\n  <tabstop>cwcheckbox</tabstop>\n  <tabstop>phonecheckbox</tabstop>\n  <tabstop>digitalcheckbox</tabstop>\n  <tabstop>ftxcheckbox</tabstop>\n  <tabstop>bands</tabstop>\n  <tabstop>continent</tabstop>\n  <tabstop>afcheckbox</tabstop>\n  <tabstop>ancheckbox</tabstop>\n  <tabstop>nacheckbox</tabstop>\n  <tabstop>sacheckbox</tabstop>\n  <tabstop>ascheckbox</tabstop>\n  <tabstop>eucheckbox</tabstop>\n  <tabstop>occheckbox</tabstop>\n  <tabstop>memberGroupBox</tabstop>\n  <tabstop>spotterCountryCombo</tabstop>\n  <tabstop>continent_spotter</tabstop>\n  <tabstop>afcheckbox_spotter</tabstop>\n  <tabstop>ancheckbox_spotter</tabstop>\n  <tabstop>nacheckbox_spotter</tabstop>\n  <tabstop>sacheckbox_spotter</tabstop>\n  <tabstop>ascheckbox_spotter</tabstop>\n  <tabstop>eucheckbox_spotter</tabstop>\n  <tabstop>occheckbox_spotter</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>save()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>257</x>\n     <y>610</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>325</x>\n     <y>610</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>ruleNameEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>ruleNameChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>195</x>\n     <y>23</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>178</x>\n     <y>309</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dxCallsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>callsignChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>232</x>\n     <y>149</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>178</x>\n     <y>309</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>spotCommentEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>spotCommentChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>232</x>\n     <y>242</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>178</x>\n     <y>309</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>allCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>AlertRuleDetail</receiver>\n   <slot>enabledLogStatusAll(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>203</x>\n     <y>132</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>288</x>\n     <y>301</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>save()</slot>\n  <slot>ruleNameChanged(QString)</slot>\n  <slot>callsignChanged(QString)</slot>\n  <slot>spotCommentChanged(QString)</slot>\n  <slot>enabledLogStatusAll(bool)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/AlertSettingDialog.cpp",
    "content": "#include \"AlertSettingDialog.h\"\n#include \"ui_AlertSettingDialog.h\"\n#include \"core/debug.h\"\n#include \"ui/AlertRuleDetail.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.alertsettingdialog\");\n\nAlertSettingDialog::AlertSettingDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::AlertSettingDialog)\n{\n    ui->setupUi(this);\n\n    rulesModel = new QSqlTableModel(this);\n    rulesModel->setTable(\"alert_rules\");\n    rulesModel->setHeaderData(0, Qt::Horizontal, tr(\"Name\"));\n    rulesModel->setHeaderData(1, Qt::Horizontal, tr(\"State\"));\n    rulesModel->setEditStrategy(QSqlTableModel::OnFieldChange);\n    rulesModel->setSort(0, Qt::AscendingOrder);\n\n    ui->rulesTableView->setModel(rulesModel);\n\n    for ( int i = 0 ; i < rulesModel->columnCount(); i++ )\n    {\n        ui->rulesTableView->hideColumn(i);\n    }\n\n    ui->rulesTableView->showColumn(0);\n    ui->rulesTableView->showColumn(1);\n\n    ui->rulesTableView->setColumnWidth(0,300);\n\n    ui->rulesTableView->setItemDelegateForColumn(0, new ReadOnlyDelegate(ui->rulesTableView));\n    ui->rulesTableView->setItemDelegateForColumn(1,new CheckBoxDelegate(ui->rulesTableView));\n\n    rulesModel->select();\n}\n\nAlertSettingDialog::~AlertSettingDialog()\n{\n    delete ui;\n}\n\nvoid AlertSettingDialog::addRule()\n{\n    FCT_IDENTIFICATION;\n    AlertRuleDetail dialog(QString(), this);\n    dialog.exec();\n    rulesModel->select();\n}\n\nvoid AlertSettingDialog::removeRule()\n{\n    FCT_IDENTIFICATION;\n\n    rulesModel->removeRow(ui->rulesTableView->currentIndex().row());\n    ui->rulesTableView->clearSelection();\n    rulesModel->select();\n\n}\n\nvoid AlertSettingDialog::editRule(QModelIndex idx)\n{\n    FCT_IDENTIFICATION;\n\n    if (idx.column() != 0) return;\n\n    QModelIndex nameIdx = ui->rulesTableView->model()->index(idx.row(),0);\n\n    QString ruleName = ui->rulesTableView->model()->data(nameIdx).toString();\n\n    AlertRuleDetail dialog(ruleName, this);\n    dialog.exec();\n    rulesModel->select();\n}\n\nvoid AlertSettingDialog::editRuleButton()\n{\n    FCT_IDENTIFICATION;\n\n    foreach (QModelIndex index, ui->rulesTableView->selectionModel()->selectedRows())\n    {\n       editRule(index);\n    }\n}\n"
  },
  {
    "path": "ui/AlertSettingDialog.h",
    "content": "#ifndef QLOG_UI_ALERTSETTINGDIALOG_H\n#define QLOG_UI_ALERTSETTINGDIALOG_H\n\n#include <QDialog>\n#include <QSqlTableModel>\n\nnamespace Ui {\nclass AlertSettingDialog;\n}\n\nclass AlertSettingDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit AlertSettingDialog(QWidget *parent = nullptr);\n    ~AlertSettingDialog();\n\nprivate:\n    Ui::AlertSettingDialog *ui;\n    QSqlTableModel* rulesModel;\n\npublic slots:\n    void addRule();\n    void removeRule();\n    void editRule(QModelIndex);\n    void editRuleButton();\n\n};\n\n#endif // QLOG_UI_ALERTSETTINGDIALOG_H\n"
  },
  {
    "path": "ui/AlertSettingDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AlertSettingDialog</class>\n <widget class=\"QDialog\" name=\"AlertSettingDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>560</width>\n    <height>427</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Alerts Rules</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox\">\n       <property name=\"title\">\n        <string>Rules</string>\n       </property>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n        <item>\n         <widget class=\"QTableView\" name=\"rulesTableView\">\n          <property name=\"editTriggers\">\n           <set>QAbstractItemView::DoubleClicked</set>\n          </property>\n          <property name=\"alternatingRowColors\">\n           <bool>true</bool>\n          </property>\n          <property name=\"selectionMode\">\n           <enum>QAbstractItemView::SingleSelection</enum>\n          </property>\n          <property name=\"selectionBehavior\">\n           <enum>QAbstractItemView::SelectRows</enum>\n          </property>\n          <property name=\"verticalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"horizontalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"showGrid\">\n           <bool>true</bool>\n          </property>\n          <attribute name=\"horizontalHeaderMinimumSectionSize\">\n           <number>50</number>\n          </attribute>\n          <attribute name=\"horizontalHeaderDefaultSectionSize\">\n           <number>100</number>\n          </attribute>\n          <attribute name=\"horizontalHeaderStretchLastSection\">\n           <bool>true</bool>\n          </attribute>\n          <attribute name=\"verticalHeaderVisible\">\n           <bool>false</bool>\n          </attribute>\n          <attribute name=\"verticalHeaderMinimumSectionSize\">\n           <number>20</number>\n          </attribute>\n          <attribute name=\"verticalHeaderDefaultSectionSize\">\n           <number>20</number>\n          </attribute>\n          <attribute name=\"verticalHeaderStretchLastSection\">\n           <bool>false</bool>\n          </attribute>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"addRuleButton\">\n         <property name=\"text\">\n          <string>Add</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"editRuleButton\">\n         <property name=\"text\">\n          <string>Edit</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"removeRuleButton\">\n         <property name=\"text\">\n          <string>Remove</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>removeRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>removeRule()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>508</x>\n     <y>229</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>279</x>\n     <y>213</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>editRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>editRuleButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>508</x>\n     <y>198</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>279</x>\n     <y>213</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>addRule()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>508</x>\n     <y>167</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>279</x>\n     <y>213</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rulesTableView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>AlertSettingDialog</receiver>\n   <slot>editRule(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>235</x>\n     <y>207</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>279</x>\n     <y>213</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>removeRule()</slot>\n  <slot>editRule(QModelIndex)</slot>\n  <slot>editRuleButton()</slot>\n  <slot>addRule()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/AlertWidget.cpp",
    "content": "#include \"AlertWidget.h\"\n#include \"ui_AlertWidget.h\"\n#include \"core/debug.h\"\n#include \"AlertSettingDialog.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.alertwidget\");\n\n//Maximal Aging interval is 20s\n#define ALERT_AGING_CHECK_TIME 20000\n\nAlertWidget::AlertWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::AlertWidget)\n{\n    FCT_IDENTIFICATION;\n    ui->setupUi(this);\n\n    proxyModel = new QSortFilterProxyModel(this);\n    alertTableModel = new AlertTableModel(proxyModel);\n    proxyModel->setSourceModel(alertTableModel);\n    proxyModel->setSortRole(Qt::UserRole);\n\n    ui->alertTableView->setModel(proxyModel);\n    ui->alertTableView->setSortingEnabled(true);\n    ui->alertTableView->sortByColumn(AlertTableModel::COLUMN_UPDATED, Qt::DescendingOrder);\n    ui->alertTableView->horizontalHeader()->setSectionsMovable(true);\n\n    ui->alertTableView->addAction(ui->actionEditRules);\n    ui->alertTableView->addAction(ui->actionColumnVisibility);\n    ui->alertTableView->addAction(ui->actionClear);\n\n    restoreTableHeaderState();\n\n    ui->clearAlertOlderSpinBox->setValue(LogParam::getAlertAging());\n\n    aging_timer = new QTimer;\n    connect(aging_timer, &QTimer::timeout, this, &AlertWidget::alertAging);\n    aging_timer->start(ALERT_AGING_CHECK_TIME);\n}\n\nAlertWidget::~AlertWidget()\n{\n    FCT_IDENTIFICATION;\n\n    if ( aging_timer )\n    {\n        aging_timer->stop();\n        aging_timer->deleteLater();\n    }\n\n    delete ui;\n}\n\nvoid AlertWidget::addAlert(const SpotAlert &alert)\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->addAlert(alert);\n    ui->alertTableView->repaint();\n}\n\nvoid AlertWidget::clearAllAlerts()\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->clear();\n    emit alertsCleared();\n}\n\nvoid AlertWidget::entryDoubleClicked(QModelIndex index)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &source_index = proxyModel->mapToSource(index);\n    const AlertTableModel::AlertTableRecord &record = alertTableModel->getTableRecord(source_index);\n\n    if ( record.alert.source == SpotAlert::WSJTXCQSPOT )\n        emit tuneWsjtx(record.alert.spot);\n    else\n        emit tuneDx(record.alert.getDxSpot());\n}\n\nvoid AlertWidget::alertAgingChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setAlertAging(ui->clearAlertOlderSpinBox->value());\n}\n\nvoid AlertWidget::showEditRules()\n{\n    FCT_IDENTIFICATION;\n\n    AlertSettingDialog dialog(this);\n    dialog.exec();\n    emit rulesChanged();\n}\n\nvoid AlertWidget::resetDupe()\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->resetDupe();\n}\n\nvoid AlertWidget::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->updateSpotsStatusWhenQSOAdded(record);\n}\n\nvoid AlertWidget::updateSpotsStatusWhenQSOUpdated(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->updateSpotsStatusWhenQSOUpdated(record);\n}\n\nvoid AlertWidget::updateSpotsDupeWhenQSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    // Pay attention: this method is called before the QSO is added to contacts\n    alertTableModel->updateSpotsStatusWhenQSODeleted(record);\n}\n\nvoid AlertWidget::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    alertTableModel->updateSpotsDxccStatusWhenQSODeleted(entities);\n}\n\nvoid AlertWidget::recalculateDupe()\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->recalculateDupe();\n}\n\nvoid AlertWidget::recalculateDxccStatus()\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->recalculateDxccStatus();\n}\n\nvoid AlertWidget::showColumnVisibility()\n{\n    FCT_IDENTIFICATION;\n\n    ColumnSettingSimpleDialog dialog(ui->alertTableView);\n    dialog.exec();\n    saveTableHeaderState();\n}\n\nvoid AlertWidget::alertAging()\n{\n    FCT_IDENTIFICATION;\n\n    alertTableModel->aging(ui->clearAlertOlderSpinBox->value() * 60);\n    ui->alertTableView->repaint();\n    emit alertsCleared();\n}\n\nvoid AlertWidget::saveTableHeaderState()\n{\n    FCT_IDENTIFICATION;\n\n    const QByteArray &state = ui->alertTableView->horizontalHeader()->saveState();\n    LogParam::setAlertWidgetState(state);\n}\n\nvoid AlertWidget::restoreTableHeaderState()\n{\n    FCT_IDENTIFICATION;\n\n    const QByteArray &state = LogParam::getAlertWidgetState();\n\n    if ( !state.isEmpty() )\n        ui->alertTableView->horizontalHeader()->restoreState(state);\n}\n\nint AlertWidget::alertCount() const\n{\n    FCT_IDENTIFICATION;\n\n    return alertTableModel->rowCount();\n}\n\nvoid AlertWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    saveTableHeaderState();\n}\n"
  },
  {
    "path": "ui/AlertWidget.h",
    "content": "#ifndef QLOG_UI_ALERTWIDGET_H\n#define QLOG_UI_ALERTWIDGET_H\n\n#include <QWidget>\n#include \"data/SpotAlert.h\"\n#include \"models/AlertTableModel.h\"\n#include \"data/DxSpot.h\"\n#include \"component/ShutdownAwareWidget.h\"\n\nnamespace Ui {\nclass AlertWidget;\n}\n\nclass AlertWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit AlertWidget(QWidget *parent = nullptr);\n    ~AlertWidget();\n\n   int alertCount() const;\n   virtual void finalizeBeforeAppExit() override;\n\npublic slots:\n    void addAlert(const SpotAlert &alert);\n    void clearAllAlerts();\n    void entryDoubleClicked(QModelIndex index);\n    void alertAgingChanged(int);\n    void showEditRules();\n    void resetDupe();\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsStatusWhenQSOUpdated(const QSqlRecord &record);\n    void updateSpotsDupeWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n    void recalculateDupe();\n    void recalculateDxccStatus();\n    void saveTableHeaderState();\n\nprivate slots:\n    void showColumnVisibility();\n\nsignals:\n    void alertsCleared();\n    void tuneDx(DxSpot);\n    void tuneWsjtx(WsjtxEntry);\n    void rulesChanged();\n\nprivate:\n    Ui::AlertWidget *ui;\n    AlertTableModel* alertTableModel;\n    QSortFilterProxyModel *proxyModel;\n    QTimer *aging_timer;\n\nprivate slots:\n    void alertAging();\n    void restoreTableHeaderState();\n\n};\n\n#endif // QLOG_UI_ALERTWIDGET_H\n"
  },
  {
    "path": "ui/AlertWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AlertWidget</class>\n <widget class=\"QWidget\" name=\"AlertWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>773</width>\n    <height>326</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Alerts</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QTableView\" name=\"alertTableView\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"contextMenuPolicy\">\n      <enum>Qt::ActionsContextMenu</enum>\n     </property>\n     <property name=\"editTriggers\">\n      <set>QAbstractItemView::NoEditTriggers</set>\n     </property>\n     <property name=\"tabKeyNavigation\">\n      <bool>false</bool>\n     </property>\n     <property name=\"showDropIndicator\" stdset=\"0\">\n      <bool>false</bool>\n     </property>\n     <property name=\"dragDropOverwriteMode\">\n      <bool>false</bool>\n     </property>\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::SingleSelection</enum>\n     </property>\n     <property name=\"selectionBehavior\">\n      <enum>QAbstractItemView::SelectRows</enum>\n     </property>\n     <property name=\"verticalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"horizontalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <attribute name=\"horizontalHeaderHighlightSections\">\n      <bool>false</bool>\n     </attribute>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderCascadingSectionResizes\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderMinimumSectionSize\">\n      <number>20</number>\n     </attribute>\n     <attribute name=\"verticalHeaderDefaultSectionSize\">\n      <number>20</number>\n     </attribute>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"clearAlertOlderLabel\">\n       <property name=\"text\">\n        <string>Clear older than</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"clearAlertOlderSpinBox\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"specialValueText\">\n        <string>Never</string>\n       </property>\n       <property name=\"suffix\">\n        <string> min(s)</string>\n       </property>\n       <property name=\"maximum\">\n        <number>9999</number>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionEditRules\">\n   <property name=\"text\">\n    <string>Edit Rules</string>\n   </property>\n  </action>\n  <action name=\"actionColumnVisibility\">\n   <property name=\"text\">\n    <string>Column Visibility...</string>\n   </property>\n  </action>\n  <action name=\"actionClear\">\n   <property name=\"text\">\n    <string>Clear</string>\n   </property>\n  </action>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>alertTableView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>AlertWidget</receiver>\n   <slot>entryDoubleClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>386</x>\n     <y>147</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>386</x>\n     <y>162</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clearAlertOlderSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>AlertWidget</receiver>\n   <slot>alertAgingChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>178</x>\n     <y>302</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>386</x>\n     <y>162</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionEditRules</sender>\n   <signal>triggered()</signal>\n   <receiver>AlertWidget</receiver>\n   <slot>showEditRules()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>386</x>\n     <y>162</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionColumnVisibility</sender>\n   <signal>triggered()</signal>\n   <receiver>AlertWidget</receiver>\n   <slot>showColumnVisibility()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>386</x>\n     <y>162</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionClear</sender>\n   <signal>triggered()</signal>\n   <receiver>AlertWidget</receiver>\n   <slot>clearAllAlerts()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>386</x>\n     <y>162</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>clearAllAlerts()</slot>\n  <slot>entryDoubleClicked(QModelIndex)</slot>\n  <slot>alertAgingChanged(int)</slot>\n  <slot>showEditRules()</slot>\n  <slot>showColumnVisibility()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/AwardsDialog.cpp",
    "content": "#include <QPushButton>\n#include <QStackedWidget>\n#include <QTableView>\n#include \"AwardsDialog.h\"\n#include \"ui_AwardsDialog.h\"\n#include \"models/SqlListModel.h\"\n#include \"core/debug.h\"\n#include \"core/QSOFilterManager.h\"\n\n#include \"awards/AwardDXCC.h\"\n#include \"awards/AwardITU.h\"\n#include \"awards/AwardWAC.h\"\n#include \"awards/AwardWAZ.h\"\n#include \"awards/AwardWAS.h\"\n#include \"awards/AwardWPX.h\"\n#include \"awards/AwardIOTA.h\"\n#include \"awards/AwardPOTAHunter.h\"\n#include \"awards/AwardPOTAActivator.h\"\n#include \"awards/AwardSOTA.h\"\n#include \"awards/AwardWWFF.h\"\n#include \"awards/AwardGridsquare.h\"\n#include \"awards/AwardUSCounty.h\"\n#include \"awards/AwardRDA.h\"\n#include \"awards/AwardJapan.h\"\n#include \"awards/AwardNZ.h\"\n#include \"awards/AwardSpanishDME.h\"\n#include \"awards/AwardUKD.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.awardsdialog\");\n\nAwardsDialog::AwardsDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::AwardsDialog)\n{\n    FCT_IDENTIFICATION;\n    ui->setupUi(this);\n\n    entityCallsignModel = new SqlListModel(\"SELECT my_dxcc, my_country_intl || ' (' || CASE WHEN LENGTH(GROUP_CONCAT(station_callsign, ', ')) > 50 \"\n                                           \"THEN SUBSTR(GROUP_CONCAT(station_callsign, ', '), 0, 50) || '...' ELSE GROUP_CONCAT(station_callsign, ', ') END || ')' \"\n                                           \"FROM(SELECT DISTINCT my_dxcc, my_country_intl, station_callsign FROM contacts) GROUP BY my_dxcc ORDER BY my_dxcc;\", \"\", this);\n\n    ui->myEntityComboBox->blockSignals(true);\n    while (entityCallsignModel->canFetchMore())\n    {\n        entityCallsignModel->fetchMore();\n    }\n    ui->myEntityComboBox->setModel(entityCallsignModel);\n    ui->myEntityComboBox->setModelColumn(1);\n    ui->myEntityComboBox->blockSignals(false);\n\n    m_awards = createAwards();\n\n    ui->awardComboBox->blockSignals(true);\n    for ( const AwardDefinition *award : static_cast<const QList<AwardDefinition*>>(m_awards) )\n        ui->awardComboBox->addItem(award->displayName(), award->key());\n    ui->awardComboBox->blockSignals(false);\n\n    ui->userFilterComboBox->blockSignals(true);\n    ui->userFilterComboBox->setModel(QSOFilterManager::QSOFilterModel(tr(\"No User Filter\"),\n                                                                      ui->userFilterComboBox));\n    ui->userFilterComboBox->blockSignals(false);\n\n    refreshTable(0);\n}\n\nAwardsDialog::~AwardsDialog()\n{\n    FCT_IDENTIFICATION;\n\n    qDeleteAll(m_awards);\n    delete ui;\n}\n\nvoid AwardsDialog::refreshTable(int)\n{\n    FCT_IDENTIFICATION;\n\n    AwardDefinition *award = currentAward();\n    if ( !award )\n        return;\n\n    setEntityInputEnabled(award->entityInputEnabled());\n    setNotWorkedEnabled(award->notWorkedEnabled());\n\n    if ( !award->widget() )\n    {\n        QWidget *w = award->createWidget(ui->stackedWidget);\n        ui->stackedWidget->addWidget(w);\n\n        const QTableView *tableView = qobject_cast<QTableView*>(w);\n        if ( tableView )\n        {\n            connect(tableView, &QTableView::doubleClicked, this, [this](const QModelIndex &idx)\n            {\n                AwardDefinition::ConditionResult result = currentAward()->getConditionSelected(idx);\n                if ( result.valid )\n                    emit awardConditionSelected(result.country, result.band, result.filter);\n            });\n        }\n    }\n\n    ui->stackedWidget->setCurrentWidget(award->widget());\n    award->updateData(buildFilterParams());\n}\n\nAwardDefinition* AwardsDialog::currentAward() const\n{\n    FCT_IDENTIFICATION;\n\n    int idx = ui->awardComboBox->currentIndex();\n    if ( idx >= 0 && idx < m_awards.size() )\n        return m_awards.at(idx);\n    return nullptr;\n}\n\nAwardFilterParams AwardsDialog::buildFilterParams() const\n{\n    FCT_IDENTIFICATION;\n\n    AwardFilterParams params;\n\n    params.entitySelected = getSelectedEntity();\n\n    params.modes << \"'NONE'\";\n    if ( ui->cwCheckBox->isChecked() )\n        params.modes << \"'CW'\";\n    if ( ui->phoneCheckBox->isChecked() )\n        params.modes << \"'PHONE'\";\n    if ( ui->digiCheckBox->isChecked() )\n        params.modes << \"'DIGITAL'\";\n\n    params.confirmedConditions << \"1=2 \";\n    if ( ui->eqslCheckBox->isChecked() )\n        params.confirmedConditions << \" eqsl_qsl_rcvd = 'Y' \";\n    if ( ui->lotwCheckBox->isChecked() )\n        params.confirmedConditions << \" lotw_qsl_rcvd = 'Y' \";\n    if ( ui->paperCheckBox->isChecked() )\n        params.confirmedConditions << \" qsl_rcvd = 'Y' \";\n\n    params.notWorkedOnly = ui->notWorkedCheckBox->isChecked();\n    params.notConfirmedOnly = ui->notConfirmedCheckBox->isChecked();\n\n    params.userFilterWhereClause = ( ui->userFilterComboBox->currentIndex() > 0 )\n                                       ? \"AND \" + QSOFilterManager::instance()->getWhereClause(ui->userFilterComboBox->currentText())\n                                       : \"\";\n    return params;\n}\n\nQString AwardsDialog::getSelectedEntity() const\n{\n    FCT_IDENTIFICATION;\n\n    int row = ui->myEntityComboBox->currentIndex();\n    const QModelIndex &idx = ui->myEntityComboBox->model()->index(row,0);\n    const QString comboData = ui->myEntityComboBox->model()->data(idx).toString();\n\n    qCDebug(runtime) << comboData;\n\n    return comboData;\n}\n\nvoid AwardsDialog::setEntityInputEnabled(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    ui->myEntityComboBox->setVisible(enabled);\n    ui->myEntityLabel->setVisible(enabled);\n}\n\nvoid AwardsDialog::setNotWorkedEnabled(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    ui->notWorkedCheckBox->blockSignals(true);\n    ui->notWorkedCheckBox->setVisible(enabled);\n    ui->notWorkedLabel->setVisible(enabled);\n    ui->notWorkedCheckBox->setChecked(enabled && ui->notWorkedCheckBox->isChecked());\n    ui->notWorkedCheckBox->blockSignals(false);\n    ui->notConfirmedCheckBox->blockSignals(true);\n    ui->notConfirmedCheckBox->setVisible(enabled);\n    ui->notConfirmedCheckBox->setChecked(enabled && ui->notConfirmedCheckBox->isChecked());\n    ui->notConfirmedCheckBox->blockSignals(false);\n}\n\nQList<AwardDefinition*> AwardsDialog::createAwards()\n{\n    return {\n        new AwardDXCC(),\n        new AwardITU(),\n        new AwardWAC(),\n        new AwardWAZ(),\n        new AwardWAS(),\n        new AwardWPX(),\n        new AwardIOTA(),\n        new AwardPOTAHunter(),\n        new AwardPOTAActivator(),\n        new AwardSOTA(),\n        new AwardWWFF(),\n        new AwardGridsquare(2),\n        new AwardGridsquare(4),\n        new AwardGridsquare(6),\n        new AwardUSCounty(),\n        new AwardRDA(),\n        new AwardJapan(),\n        new AwardNZ(),\n        new AwardSpanishDME(),\n        new AwardUKD(),\n    };\n}\n"
  },
  {
    "path": "ui/AwardsDialog.h",
    "content": "#ifndef QLOG_UI_AWARDSDIALOG_H\n#define QLOG_UI_AWARDSDIALOG_H\n\n#include <QDialog>\n#include <QComboBox>\n#include \"awards/AwardDefinition.h\"\n#include \"models/SqlListModel.h\"\n\nnamespace Ui {\nclass AwardsDialog;\n}\n\nclass AwardsDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit AwardsDialog(QWidget *parent = nullptr);\n    ~AwardsDialog();\n\npublic slots:\n    void refreshTable(int);\n\nsignals:\n    void awardConditionSelected(QString, QString, QString);\n\nprivate:\n    Ui::AwardsDialog *ui;\n    QList<AwardDefinition*> m_awards;\n    SqlListModel* entityCallsignModel;\n\n    AwardDefinition* currentAward() const;\n    AwardFilterParams buildFilterParams() const;\n    QString getSelectedEntity() const;\n    void setEntityInputEnabled(bool);\n    void setNotWorkedEnabled(bool);\n\n    static QList<AwardDefinition*> createAwards();\n};\n\n#endif // QLOG_UI_AWARDSDIALOG_H\n"
  },
  {
    "path": "ui/AwardsDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>AwardsDialog</class>\n <widget class=\"QDialog\" name=\"AwardsDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>1016</width>\n    <height>702</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Awards</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>4</number>\n   </property>\n   <item>\n    <widget class=\"QGroupBox\" name=\"awardGroupBox\">\n     <property name=\"title\">\n      <string>Options</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_2\">\n      <property name=\"horizontalSpacing\">\n       <number>2</number>\n      </property>\n      <property name=\"verticalSpacing\">\n       <number>2</number>\n      </property>\n      <property name=\"leftMargin\">\n       <number>6</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>2</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>6</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>2</number>\n      </property>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"awardNameLabel\">\n        <property name=\"text\">\n         <string>Award</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n        <item>\n         <widget class=\"QComboBox\" name=\"awardComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"myEntityLabel\">\n          <property name=\"text\">\n           <string>My DXCC Entity</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_3\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Minimum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>20</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"myEntityComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_2\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"userFilterLabel\">\n          <property name=\"text\">\n           <string>User Filter</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_5\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>20</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"userFilterComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_6\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"confirmedLabel\">\n        <property name=\"text\">\n         <string>Confirmed by</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\" stretch=\"1,1,5\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"lotwCheckBox\">\n          <property name=\"text\">\n           <string>LoTW</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"eqslCheckBox\">\n          <property name=\"text\">\n           <string>eQSL</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"paperCheckBox\">\n          <property name=\"text\">\n           <string>Paper</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QLabel\" name=\"modelabel\">\n        <property name=\"text\">\n         <string>Mode</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\" stretch=\"1,1,5\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"cwCheckBox\">\n          <property name=\"text\">\n           <string>CW</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"phoneCheckBox\">\n          <property name=\"text\">\n           <string>Phone</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"digiCheckBox\">\n          <property name=\"text\">\n           <string>Digi</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item row=\"3\" column=\"0\">\n       <widget class=\"QLabel\" name=\"notWorkedLabel\">\n        <property name=\"text\">\n         <string>Show</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"showFilterLayout\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"notWorkedCheckBox\">\n          <property name=\"text\">\n           <string>Not-Worked Only</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"notConfirmedCheckBox\">\n          <property name=\"text\">\n           <string>Not-Confirmed Only</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_4\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QStackedWidget\" name=\"stackedWidget\"/>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>awardComboBox</tabstop>\n  <tabstop>myEntityComboBox</tabstop>\n  <tabstop>userFilterComboBox</tabstop>\n  <tabstop>lotwCheckBox</tabstop>\n  <tabstop>eqslCheckBox</tabstop>\n  <tabstop>paperCheckBox</tabstop>\n  <tabstop>cwCheckBox</tabstop>\n  <tabstop>phoneCheckBox</tabstop>\n  <tabstop>digiCheckBox</tabstop>\n  <tabstop>notWorkedCheckBox</tabstop>\n  <tabstop>notConfirmedCheckBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>259</x>\n     <y>738</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>327</x>\n     <y>738</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>awardComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>409</x>\n     <y>69</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myEntityComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>409</x>\n     <y>109</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>eqslCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>689</x>\n     <y>164</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>lotwCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>236</x>\n     <y>149</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>paperCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>960</x>\n     <y>164</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>236</x>\n     <y>189</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>phoneCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>689</x>\n     <y>204</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>digiCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>960</x>\n     <y>204</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>345</x>\n     <y>295</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>notWorkedCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>545</x>\n     <y>96</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>507</x>\n     <y>350</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>notConfirmedCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>667</x>\n     <y>96</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>507</x>\n     <y>350</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>AwardsDialog</receiver>\n   <slot>refreshTable(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>616</x>\n     <y>135</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>503</x>\n     <y>350</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>refreshTable(int)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/BandmapWidget.cpp",
    "content": "#include <QGraphicsScene>\n#include <QGraphicsTextItem>\n#include <QMutableMapIterator>\n#include <QMenu>\n#include <QTextDocument>\n#include <QScrollBar>\n#include <QGraphicsSceneMouseEvent>\n#include <QLinearGradient>\n#include <QPainterPath>\n#include <algorithm>\n#include <QWheelEvent>\n\n#include \"BandmapWidget.h\"\n#include \"ui_BandmapWidget.h\"\n#include \"data/Data.h\"\n#include \"data/BandPlan.h\"\n#include \"core/debug.h\"\n#include \"rig/macros.h\"\n#include \"core/LogParam.h\"\n#include \"core/EmergencyFrequency.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.bandmapwidget\");\n\n#define WIDGET_CENTER ( height()/2 - 50 )\n\nQMap<double, DxSpot> BandmapWidget::spots;\nQList<BandmapWidget *> BandmapWidget::nonVfoWidgets;\ndouble BandmapWidget::lastSeenVFOFreq = 0.0;\nBandmapWidget *BandmapWidget::vfoWidget = nullptr;\n\nBandmapWidget::BandmapWidget(const QString &widgetID,\n                             const Band &widgetBand,\n                             QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::BandmapWidget),\n    rx_freq(0.0),\n    tx_freq(0.0),\n    bandmapScene(new GraphicsScene(this)),\n    update_timer(new QTimer(this)),\n    rxMark(nullptr),\n    txMark(nullptr),\n    keepRXCenter(true),\n    showEmergencyMarkers(true),\n    pendingSpots(0),\n    lastStationUpdate(0),\n    bandmapAnimation(true),\n    isNonVfo(!widgetID.isEmpty()),\n    isActive(false)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n    setObjectName((isNonVfo) ? widgetID : MAIN_WIDGET_OBJECT_NAME);\n\n    double newContactFreq = (lastSeenVFOFreq == 0.0 ) ? LogParam::getNewContactFreq()\n                                                      : lastSeenVFOFreq;\n    double ritFreq = newContactFreq + RigProfilesManager::instance()->getCurProfile1().ritOffset;\n    double xitFreq = newContactFreq + RigProfilesManager::instance()->getCurProfile1().xitOffset;\n    const QString &mode = LogParam::getNewContactMode();\n    const QString &submode = LogParam::getNewContactSubMode();\n\n    keepRXCenter = LogParam::getBandmapCenterRX(objectName());\n    showEmergencyMarkers = LogParam::getBandmapShowEmergency(objectName());\n\n    if ( isNonVfo )\n    {\n        ui->bottomRow->setVisible(false);\n        ui->clearAllButton->setVisible(false);\n        nonVfoWidgets.append(this);\n    }\n    else\n    {\n        vfoWidget = this;\n        ui->clearSpotOlderSpin->setValue(LogParam::getBandmapAging(objectName()));\n    }\n\n    setBand((widgetBand == Band()) ? BandPlan::freq2Band(ritFreq)\n                                   : widgetBand,\n            false);\n\n    bandmapScene->setFocusOnTouch(false);\n\n    connect(bandmapScene, &GraphicsScene::spotClicked,\n            this, &BandmapWidget::spotClicked);\n    connect(ui->scrollArea->verticalScrollBar(), &QScrollBar::rangeChanged,\n            this, &BandmapWidget::focusZoomFreq);\n\n    ui->graphicsView->setScene(bandmapScene);\n    ui->graphicsView->installEventFilter(this);\n    //ui->scrollArea->verticalScrollBar()->setSingleStep(5);\n\n    connect(update_timer, &QTimer::timeout, this, &BandmapWidget::updateStationTimer);\n    update_timer->start(BANDMAP_MAX_REFRESH_TIME);\n\n    updateMode(VFO1, QString(), mode, submode, 0);\n    updateTunedFrequency(VFO1, newContactFreq, ritFreq, xitFreq);\n\n    ui->zoomSlider->setSliderPosition(zoom);\n}\n\nvoid BandmapWidget::update()\n{\n    FCT_IDENTIFICATION;\n\n    /****************\n     * Restart Time *\n     ****************/\n    update_timer->setInterval(BANDMAP_MAX_REFRESH_TIME);\n\n    /*************\n     * Clear All *\n     *************/\n    clearAllCallsignFromScene();\n\n    clearFreqMark(&rxMark);\n    clearFreqMark(&txMark);\n\n    bandmapScene->clear();\n\n    // do not show bandmap for submm bands\n    if ( rx_freq > 250000.0 || currentBand.start >= 300000.0 ) return;\n\n    /*******************\n     * Determine Scale *\n     *******************/\n    double step;\n    int digits;\n\n    determineStepDigits(step, digits);\n\n    const int steps = static_cast<int>(round((currentBand.end - currentBand.start) / step));\n\n    minHeight = steps * PIXELSPERSTEP + 30;\n    ui->graphicsView->setFixedSize(270, minHeight);\n\n    /****************/\n    /* Draw bandmap */\n    /****************/\n    const QPen gridPen(QColor(192, 192, 192));\n    const QBrush highlightBrush(QColor(102, 153, 255, 100));\n\n    for ( int i = 0; i <= steps; i++ )\n    {\n        double plottedFreq = currentBand.start + step * i;\n        const double y = i * PIXELSPERSTEP;\n\n        // Add colored square\n        if ( !currBandMode.isEmpty()\n             && i < steps\n             && currBandMode == BandPlan::freq2BandModeGroupString(plottedFreq) )\n            bandmapScene->addRect(0, y, 10, 10, QPen(Qt::NoPen), highlightBrush);\n\n        const int lineLength = (i % 5 == 0) ? 15 : 10;\n\n        bandmapScene->addLine(0, y, lineLength, y, gridPen);\n\n        if ( i % 5 == 0 )\n        {\n            QGraphicsTextItem* text = bandmapScene->addText(QString::number(plottedFreq, 'f', digits));\n            const QRectF rect = text->boundingRect();\n            text->setPos(-rect.width() - 5, y - (rect.height() / 2));\n        }\n    }\n\n    const QString &endFreqDigits= QString::number(currentBand.end + step*steps, 'f', digits);\n    bandmapScene->setSceneRect(135 - (endFreqDigits.size() * PIXELSPERSTEP),\n                               0,\n                               0,\n                               steps * PIXELSPERSTEP + 10);\n\n    /************************/\n    /* Draw TX and RX Marks */\n    /************************/\n    drawTXRXMarks(step);\n\n    /*****************************/\n    /* Draw Emergency Freq Marks */\n    /*****************************/\n    drawEmergencyMarkers(step);\n\n    /*****************\n     * Draw Stations *\n     *****************/\n    updateStations();\n}\n\nvoid BandmapWidget::spotAging()\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget removes spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    int clear_interval_sec = ui->clearSpotOlderSpin->value() * 60;\n\n    qCDebug(function_parameters)<<clear_interval_sec;\n\n    if ( clear_interval_sec <= 0 ) return;\n\n    QMutableMapIterator<double, DxSpot> spotIterator(spots);\n\n    while ( spotIterator.hasNext() )\n    {\n        spotIterator.next();\n        //clear spots automatically\n        if ( spotIterator.value().dateTime.addSecs(clear_interval_sec) <= QDateTime::currentDateTimeUtc() )\n        {\n            spotIterator.remove();\n        }\n    }\n}\n\nvoid BandmapWidget::updateStations()\n{\n    FCT_IDENTIFICATION;\n\n    /****************\n     * Restart Time *\n     ****************/\n    update_timer->setInterval(BANDMAP_MAX_REFRESH_TIME);\n\n    clearAllCallsignFromScene();\n\n    spotAging();\n\n    // do not show bandmap for submm bands\n    if ( rx_freq > 250000.0 || currentBand.start >= 300000.0 )return;\n\n    double step;\n    int digits;\n    double min_y = 0;\n    const QColor lineColor(192,192,192);\n    const QColor defaultTextColor = qApp->palette().color(QPalette::Text);\n    const QString timeFormat = locale.formatTimeShort();\n\n    determineStepDigits(step, digits);\n\n    QMap<double, DxSpot>::iterator lower = spots.lowerBound(currentBand.start);\n    QMap<double, DxSpot>::iterator upper = spots.upperBound(currentBand.end);\n\n    while ( lower != upper )\n    {\n        DxSpot &spot = lower.value();\n\n        double freq_y = ((lower.key() - currentBand.start) / step) * PIXELSPERSTEP;\n        double text_y = std::max(min_y + 5.0, freq_y);\n\n        /*************************\n         * Draw Line to Callsign *\n         *************************/\n        lineItemList.append(bandmapScene->addLine(17, freq_y, 40, text_y, QPen(lineColor)));\n\n        const QString &callsignTmp = spot.callsign;\n        const QString &timeTmp = locale.toString(spot.dateTime, timeFormat);\n\n        QGraphicsTextItem* text = bandmapScene->addText(callsignTmp + \" @ \" + timeTmp);\n        text->document()->setDocumentMargin(0);\n\n        qreal halfHeight = text->boundingRect().height() / 2;\n        text->setPos(40, text_y - halfHeight);\n        text->setFlags(QGraphicsItem::ItemIsFocusable |\n                       QGraphicsItem::ItemIsSelectable |\n                       text->flags());\n        text->setProperty(\"freq\", lower.key());\n        text->setProperty(\"bandmode\", static_cast<int>(spot.bandPlanMode));\n\n        QString unit;\n        unsigned char decP;\n        double spotFreq = Data::MHz2UserFriendlyFreq(lower.key(), unit, decP);\n        text->setToolTip(QString(\"<b>%1</b> de %2<br/>%3 %4; %5<br/>%6\").arg(callsignTmp,\n                                                             spot.spotter,\n                                                             QString::number(spotFreq, 'f', decP),\n                                                             unit,\n                                                             spot.modeGroupString,\n                                                             spot.comment));\n\n        min_y = text_y + halfHeight;\n\n        text->setDefaultTextColor(Data::statusToColor(spot.status,\n                                                      spot.dupeCount,\n                                                      defaultTextColor));\n\n        textItemList.append(text);\n        ++lower;\n    }\n\n    // Resize scene and view dynamically\n    const QRectF &itemsRect = bandmapScene->itemsBoundingRect();\n    QRectF sceneRect = bandmapScene->sceneRect();\n\n    double resultHeight = qMax(itemsRect.bottom(), minHeight);\n    sceneRect.setBottom(resultHeight + 10);\n    ui->graphicsView->setFixedSize(270, resultHeight + 30);\n    bandmapScene->setSceneRect(sceneRect);\n\n    pendingSpots = 0;\n    lastStationUpdate = QDateTime::currentMSecsSinceEpoch();\n    if ( !isNonVfo )\n    {\n        // signal to the non-vfo bandmaps that the spots should be redrawn\n        emit spotsUpdated();\n    }\n}\n\nvoid BandmapWidget::clearWidgetBand()\n{\n    FCT_IDENTIFICATION;\n\n    auto begin = spots.lowerBound(currentBand.start);\n    auto end = spots.upperBound(currentBand.end);\n\n    while (begin != end)\n        begin = spots.erase(begin);\n\n    if ( vfoWidget )\n        vfoWidget->updateStations(); // this causes that all bandmap will be updated\n    updateNearestSpot();\n}\n\nvoid BandmapWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    saveState();\n}\n\nvoid BandmapWidget::determineStepDigits(double &step, int &digits) const\n{\n    FCT_IDENTIFICATION;\n\n    switch (zoom) {\n    case ZOOM_100HZ: step = 0.0001; digits = 4; break;\n    case ZOOM_250HZ: step = 0.00025; digits = 4; break;\n    case ZOOM_500HZ: step = 0.0005; digits = 4; break;\n    case ZOOM_1KHZ: step = 0.001; digits = 3; break;\n    case ZOOM_2K5HZ: step = 0.0025; digits = 3; break;\n    case ZOOM_5KHZ: step = 0.005; digits = 3; break;\n    case ZOOM_10KHZ: step = 0.01; digits = 2; break;\n    }\n\n    /* bands below are too wide for BandMap, therefore it is needed to short them */\n    if ( currentBand.start >= 28.0 && currentBand.start < 420.0 )\n    {\n        step = step * 10;\n    }\n    if ( ( currentBand.start >= 420.0 && currentBand.start < 2300.0 )\n         || currentBand.start == 119980 )\n    {\n        step = step * 100;\n    }\n    else if ( currentBand.start >= 2300.0 && currentBand.start < 75500.0 )\n    {\n        step = step * 1000;\n    }\n    else if (currentBand.start == 75500.0 || currentBand.start >= 142000.0)\n    {\n        step = step * 10000;\n    }\n}\n\nvoid BandmapWidget::clearAllCallsignFromScene()\n{\n    FCT_IDENTIFICATION;\n\n    QMutableListIterator<QGraphicsLineItem*> lineIterator(lineItemList);\n\n    while ( lineIterator.hasNext() )\n    {\n        lineIterator.next();\n        bandmapScene->removeItem(lineIterator.value());\n        delete lineIterator.value();\n    }\n\n    lineItemList.clear();\n\n    QMutableListIterator<QGraphicsTextItem*> textIterator(textItemList);\n\n    while ( textIterator.hasNext() )\n    {\n        textIterator.next();\n        bandmapScene->removeItem(textIterator.value());\n        delete textIterator.value();\n    }\n\n    textItemList.clear();\n}\n\nvoid BandmapWidget::clearFreqMark(QGraphicsPolygonItem **currentPolygon)\n{\n    FCT_IDENTIFICATION;\n\n    if ( *currentPolygon != nullptr )\n    {\n        bandmapScene->removeItem(*currentPolygon);\n        delete *currentPolygon;\n        *currentPolygon = nullptr;\n    }\n}\n\nvoid BandmapWidget::drawFreqMark(const double freq,\n                                 const double step,\n                                 const QColor &color,\n                                 QGraphicsPolygonItem **currentPolygon)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq << step << color;\n\n    clearFreqMark(currentPolygon);\n\n    /* do not show the freq mark if it is outside the bandmap */\n    if ( freq < currentBand.start || freq > currentBand.end )\n    {\n        return;\n    }\n\n    int Yposition = Freq2ScenePos(freq).y();\n\n    QPolygonF poly;\n    poly << QPointF(-1, Yposition)\n         << QPointF(-7, Yposition - 7)\n         << QPointF(-7, Yposition + 7);\n\n    *currentPolygon = bandmapScene->addPolygon(poly,\n                                              QPen(Qt::NoPen),\n                                              QBrush(color, Qt::SolidPattern));\n}\n\nvoid BandmapWidget::drawTXRXMarks(double step)\n{\n    FCT_IDENTIFICATION;\n\n    // do not show bandmap for submm bands\n    if ( !isActive || rx_freq > 250000.0 || currentBand.start >= 300000.0 )\n    {\n        return;\n    }\n\n    /**************************/\n    /* Draw RX frequency mark */\n    /**************************/\n    drawFreqMark(rx_freq, step, QColor(30, 180, 30), &rxMark);\n\n    /**************************/\n    /* Draw TX frequency mark */\n    /**************************/\n    if ( tx_freq >= currentBand.start\n         && tx_freq <= currentBand.end\n         && tx_freq != rx_freq )\n    {\n        drawFreqMark(tx_freq, step, QColor(255, 0, 0), &txMark);\n    }\n    else\n    {\n        clearFreqMark(&txMark);\n    }\n}\n\nvoid BandmapWidget::removeDuplicates(DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    QMap<double, DxSpot>::iterator lower = spots.lowerBound(spot.freq - 0.005);\n    QMap<double, DxSpot>::iterator upper = spots.upperBound(spot.freq + 0.005);\n\n    while ( lower != upper )\n    {\n        if ( lower.value().callsign.compare(spot.callsign, Qt::CaseInsensitive) == 0 )\n        {\n            lower = spots.erase(lower);\n        }\n        else\n        {\n            ++lower;\n        }\n    }\n}\n\nvoid BandmapWidget::addSpot(DxSpot spot)\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget adds spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    qCDebug(function_parameters) << spot.freq << spot.callsign;\n\n    this->removeDuplicates(spot);\n    spots.insert(spot.freq, spot);\n\n    if ( spot.band == currentBand.name )\n    {\n        qint64 currTime = QDateTime::currentMSecsSinceEpoch();\n\n        /* if the spots are received slowly, this will guarantee\n         * that Spots will be displayed as soon as they are received.\n         * QLog does not have to wait for the timer to tick to update the stations.\n         */\n        if ( currTime -  BANDMAP_MAX_REFRESH_TIME >= lastStationUpdate )\n            updateStations();\n        else\n            /* If the spot are received quickly then store them and wait for QTimer tick */\n            increasePendingSpots();\n    }\n\n    //update NonVFO Pending spot counters\n    for ( BandmapWidget *nonVfoWidget : static_cast<const QList<BandmapWidget *>>(nonVfoWidgets) )\n        if ( nonVfoWidget->getBand().name == spot.band )\n            nonVfoWidget->increasePendingSpots();\n}\n\nvoid BandmapWidget::updateStationTimer()\n{\n    FCT_IDENTIFICATION;\n\n    /* This function handle QTime tick to update Stations */\n\n    qint64 currTime = QDateTime::currentMSecsSinceEpoch();\n\n    /* If there is (are) station(s) or Time to Aging occurred then update the bandmap */\n    if ( pendingSpots > 0\n         || currTime - BANDMAP_AGING_CHECK_TIME >= lastStationUpdate )\n    {\n        updateStations();\n    }\n}\n\nDxSpot BandmapWidget::nearestSpot(const double freq) const\n{\n    FCT_IDENTIFICATION;\n\n    QMap<double, DxSpot>::const_iterator it = spots.constFind(freq);\n\n    if( it == spots.cend() )\n    {\n        QMap<double, DxSpot>::const_iterator lower = spots.lowerBound(freq - Hz2MHz(1000));\n        QMap<double, DxSpot>::const_iterator upper = spots.upperBound(freq + Hz2MHz(1000));\n\n        it = std::min_element( lower, upper,\n                [freq](const DxSpot &p1,\n                       const DxSpot &p2)\n                {\n                return\n                    qAbs(p1.freq - freq) <\n                    qAbs(p2.freq - freq);\n                });\n\n        if ( it != upper )\n        {\n            /* FOUND */\n            return it.value();\n        }\n        else\n        {\n            /* Not found */\n            return DxSpot();\n        }\n    }\n\n    /* Exact Match */\n    return it.value();\n}\n\nvoid BandmapWidget::updateNearestSpot(bool force)\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spot\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    DxSpot currNearestSpot;\n\n    currNearestSpot = nearestSpot(rx_freq);\n\n    if ( force || currNearestSpot.callsign != lastNearestSpot.callsign )\n    {\n        emit nearestSpotFound(currNearestSpot);\n        lastNearestSpot = currNearestSpot;\n    }\n}\n\nvoid BandmapWidget::setBandmapAnimation(bool isEnable)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << isEnable;\n\n    bandmapAnimation = isEnable;\n}\n\nvoid BandmapWidget::setBand(const Band &newBand, bool savePrevBandZoom)\n{\n    FCT_IDENTIFICATION;\n\n    if ( savePrevBandZoom ) saveState();\n\n    currentBand = newBand;\n    zoom = getSavedZoom(newBand);\n    zoomFreq = getSavedScrollFreq(newBand);\n    zoomWidgetYOffset = WIDGET_CENTER;\n    ui->zoomSlider->blockSignals(true);\n    ui->zoomSlider->setSliderPosition(zoom);\n    ui->zoomSlider->blockSignals(false);\n\n    QWidget *dock = parentWidget();\n    if ( dock )\n        dock->setWindowTitle(tr(\"Bandmap\") + \" \" + newBand.name);\n}\n\nvoid BandmapWidget::saveCurrentZoom()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setBandmapZoom(objectName(), currentBand.name, zoom);\n}\n\nBandmapWidget::BandmapZoom BandmapWidget::getSavedZoom(const Band &band)\n{\n    FCT_IDENTIFICATION;\n\n    // if a zoom is not set, try to get it from the main Bandmap widget\n    const QVariant &zoomVariantMain = LogParam::getBandmapZoom(MAIN_WIDGET_OBJECT_NAME, band.name, ZOOM_10KHZ);\n    QVariant zoomVariant = LogParam::getBandmapZoom(objectName(), band.name, zoomVariantMain);\n    return zoomVariant.value<BandmapWidget::BandmapZoom>();\n}\n\nvoid BandmapWidget::saveCurrentScrollFreq()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setBandmapScrollFreq(objectName(), currentBand.name, visibleCentreFreq());\n}\n\ndouble BandmapWidget::getSavedScrollFreq(const Band &band)\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getBandmapScrollFreq(objectName(), band.name);\n}\n\ndouble BandmapWidget::visibleCentreFreq() const\n{\n    FCT_IDENTIFICATION;\n\n    QPoint point(0,ui->scrollArea->verticalScrollBar()->value() + WIDGET_CENTER);\n    double ret = ScenePos2Freq(ui->graphicsView->mapToScene(point));\n    qCDebug(runtime) << \"Centre freq\" << ret;\n    return ret;\n}\n\nbool BandmapWidget::isAlreadyOpened(const Band &band) const\n{\n    FCT_IDENTIFICATION;\n\n    for ( const BandmapWidget *widget : static_cast<const QList<BandmapWidget *>>(nonVfoWidgets))\n    {\n        if ( widget && widget->isVisible() && widget->getBand() == band )\n            return true;\n    }\n    return false;\n}\n\nvoid BandmapWidget::saveState()\n{\n    FCT_IDENTIFICATION;\n\n    saveCurrentZoom();\n    saveCurrentScrollFreq();\n}\n\nvoid BandmapWidget::spotAgingChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setBandmapAging(objectName(), ui->clearSpotOlderSpin->value());\n}\n\nvoid BandmapWidget::clearSpots()\n{\n    FCT_IDENTIFICATION;\n\n    spots.clear();\n    updateStations();\n    updateNearestSpot();\n}\n\nvoid BandmapWidget::setZoom(int zoomParam)\n{\n    FCT_IDENTIFICATION;\n\n    zoomWidgetYOffset = WIDGET_CENTER;\n    zoomFreq = ( keepRXCenter ) ? rx_freq\n                              : visibleCentreFreq();\n\n    zoom = static_cast<BandmapZoom>(static_cast<int>(zoomParam));\n    setBandmapAnimation(false);\n    update();\n    scrollToFreq(zoomFreq);\n    setBandmapAnimation(true);\n}\n\nvoid BandmapWidget::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget modifies spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    qint32 dxcc = record.value(\"dxcc\").toInt();\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n    const QString &callsign = record.value(\"callsign\").toString();\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n    {\n        DxSpot &spot =  it.value();\n        spot.status = Data::dxccNewStatusWhenQSOAdded(spot.status,\n                                                      spot.dxcc.dxcc,\n                                                      spot.band,\n                                                      ( ( spot.modeGroupString == BandPlan::MODE_GROUP_STRING_FTx )\n                                                           ? BandPlan::MODE_GROUP_STRING_DIGITAL\n                                                           : dxccModeGroup ),\n                                                      dxcc,\n                                                      band,\n                                                      dxccModeGroup);\n        if ( spot.callsign == callsign )\n            spot.dupeCount = Data::dupeNewCountWhenQSOAdded(spot.dupeCount,\n                                                            spot.band,\n                                                            spot.modeGroupString,\n                                                            band,\n                                                            dxccModeGroup);\n    }\n    updateStations();\n    if ( callsign == lastNearestSpot.callsign )\n        updateNearestSpot(true);\n}\n\nvoid BandmapWidget::updateSpotsStatusWhenQSOUpdated(const QSqlRecord &)\n{\n    FCT_IDENTIFICATION;\n\n    // at this point, we don't know if callsign has been changed or other field.\n    // TODO: DXCC status\n    // TODO: Dupe status update\n\n    // for ( auto it = spots.begin(); it != spots.end(); ++it )\n    // {\n    //     DxSpot &spot =  it.value();\n    //     spot.dupeCount = Data::countDupe(spot.callsign, spot.band, spot.modeGroupString);\n    // }\n}\n\nvoid BandmapWidget::updateSpotsDupeWhenQSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    // Pay attention: this method is called before the QSO is deleted from contacts\n    const QString &callsign = record.value(\"callsign\").toString();\n    const QString &band = record.value(\"band\").toString();\n    const QString &dxccModeGroup = BandPlan::modeToDXCCModeGroup(record.value(\"mode\").toString());\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n    {\n        DxSpot &spot =  it.value();\n\n        if ( spot.dupeCount && spot.callsign == callsign )\n            spot.dupeCount = Data::dupeNewCountWhenQSODelected(spot.dupeCount,\n                                                               spot.band,\n                                                               spot.modeGroupString,\n                                                               band,\n                                                               dxccModeGroup);\n    }\n    // do not call updateStation. it will be updated at the end of delete procedure\n    // by updateSpotsDxccStatusWhenQSODeleted;\n}\n\nvoid BandmapWidget::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    // this method is called at the end of QSO Delete (after commit).\n\n    if ( entities.isEmpty() )\n        return;\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n    {\n        DxSpot &spot =  it.value();\n\n        if ( !entities.contains(spot.dxcc.dxcc) )\n            continue;\n\n        spot.status = Data::instance()->dxccStatus(spot.dxcc.dxcc, spot.band, spot.modeGroupString);\n    }\n    updateStations();\n    updateNearestSpot(true);\n}\n\nvoid BandmapWidget::recalculateDxccStatus()\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n    {\n        DxSpot &spot = it.value();\n        spot.status = Data::instance()->dxccStatus(spot.dxcc.dxcc, spot.band, spot.modeGroupString);\n    }\n    updateStations();\n    updateNearestSpot(true);\n}\n\nvoid BandmapWidget::resetDupe()\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n        it.value().dupeCount = 0;\n\n    updateStations();\n}\n\nvoid BandmapWidget::recalculateDupe()\n{\n    FCT_IDENTIFICATION;\n\n    // only master Widget updates spots\n    if ( isNonVfo )\n    {\n        qCDebug(runtime) << \"NonVFO widget - skipping\";\n        return;\n    }\n\n    for ( auto it = spots.begin(); it != spots.end(); ++it )\n    {\n        DxSpot &spot = it.value();\n        spot.dupeCount = Data::countDupe(spot.callsign,\n                                         spot.band,\n                                         spot.modeGroupString);\n    }\n    updateStations();\n}\n\nvoid BandmapWidget::focusZoomFreq(int, int)\n{\n    FCT_IDENTIFICATION;\n\n    if ( zoomFreq > 0.0 )\n    {\n        int newScrollValue = qMin(qMax(Freq2ScenePos(zoomFreq).y() - ( zoomWidgetYOffset ), 0.0),\n                                  (double)ui->scrollArea->verticalScrollBar()->maximum());\n        ui->scrollArea->verticalScrollBar()->setValue(newScrollValue);\n        zoomFreq = 0.0;\n    }\n}\n\nvoid BandmapWidget::clickNewBandmapWindow()\n{\n    FCT_IDENTIFICATION;\n\n    const QString widgetID = QString(\"bandmap%1\").arg(QDateTime::currentMSecsSinceEpoch());\n    saveCurrentZoom();\n    emit requestNewNonVfoBandmapWindow(widgetID, currentBand.name);\n}\n\nvoid BandmapWidget::spotClicked(const QString &call,\n                                double freq,\n                                BandPlan::BandPlanMode mode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << call << freq << mode;\n    qCDebug(runtime) << \"Last Tuned DX\" << lastTunedDX.callsign << lastTunedDX.freq;\n\n    /* Do not emit the Spot two times - double click*/\n    if ( lastTunedDX.callsign == call\n         && lastTunedDX.freq == freq )\n        return;\n\n    emit tuneDx(spots.value(freq));\n\n    lastTunedDX.callsign = call;\n    lastTunedDX.freq = freq;\n\n    // allow to re-click the spot.\n    // I don't want to use double click here because users expect to single-clicking on the map and double click\n    // can emit tuneDX two times what causes an issue in Callbooks section and other parts of QLog.\n    // However, to be able to click on the callsign again, it needs to be disabled for a short while.\n    // That's why there is a delay.\n    QTimer::singleShot(3000, this, [this]() {\n        lastTunedDX.callsign.clear();\n        lastTunedDX.freq = 0.0;\n    });\n\n}\n\nvoid BandmapWidget::showContextMenu(const QPoint &point)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->graphicsView->itemAt(point) )\n    {\n        return;\n    }\n\n    QMenu contextMenu(this);\n    QMenu bandsMenu(tr(\"Show Band\"), &contextMenu);\n\n    for ( const Band &enabledBand : BandPlan::bandsList(false, true))\n    {\n        QAction* action = new QAction(enabledBand.name);\n        connect(action, &QAction::triggered, this, [this, enabledBand]()\n        {\n            setBand(enabledBand);\n            update();\n        });\n        if ( enabledBand == currentBand )\n        {\n            action->setCheckable(true);\n            action->setChecked(true);\n        }\n        bandsMenu.addAction(action);\n    }\n\n    QAction* centerRXAction = new QAction(tr(\"Center RX\"), &contextMenu);\n    centerRXAction->setCheckable(true);\n    centerRXAction->setChecked(keepRXCenter);\n    connect(centerRXAction, &QAction::triggered, this, &BandmapWidget::centerRXActionChecked);\n\n    QAction* emergencyAction = new QAction(tr(\"Show Emergency Frequencies\"), &contextMenu);\n    emergencyAction->setCheckable(true);\n    emergencyAction->setChecked(showEmergencyMarkers);\n    connect(emergencyAction, &QAction::triggered, this, &BandmapWidget::emergencyMarkersActionChecked);\n\n    contextMenu.addMenu(&bandsMenu);\n    contextMenu.addAction(centerRXAction);\n    contextMenu.addAction(emergencyAction);\n\n    contextMenu.exec(ui->graphicsView->mapToGlobal(point));\n}\n\nvoid BandmapWidget::updateTunedFrequency(VFOID vfoid, double vfoFreq, double ritFreq, double xitFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << vfoFreq << ritFreq << xitFreq;\n\n    // Bandmap tracks the RX frequency only\n    if ( vfoid == VFO2 )\n        return;\n\n    lastSeenVFOFreq = vfoFreq;\n\n    isActive = (ritFreq >= currentBand.start && ritFreq <= currentBand.end);\n\n    if ( isNonVfo )\n    {\n        if ( isActive )\n        {\n            rx_freq = ritFreq;\n            tx_freq = xitFreq;\n            // bandmap is showing the tuned frequency, so show the marker\n            drawMarkers(rx_freq);\n        }\n        else\n        {\n            rx_freq = (rx_freq == 0.0) ? getSavedScrollFreq(currentBand) : rx_freq;\n            tx_freq = (tx_freq == 0.0) ? getSavedScrollFreq(currentBand) : tx_freq;\n        }\n    }\n    else\n    {\n        if ( !isActive )\n        {\n            /* Operator switched a band */\n            const Band& newBand = BandPlan::freq2Band(ritFreq);\n            if ( !newBand.name.isEmpty() && !isAlreadyOpened(newBand) )\n            {\n                rx_freq = ritFreq;\n                tx_freq = xitFreq;\n                isActive = true;\n                setBand(newBand);\n                /**********************/\n                /* Redraw all bandmap */\n                /**********************/\n                update();\n            }\n            else\n            {\n                rx_freq = (rx_freq == 0.0) ? getSavedScrollFreq(currentBand) : rx_freq;\n                tx_freq = (tx_freq == 0.0) ? getSavedScrollFreq(currentBand) : tx_freq;\n            }\n        }\n        else\n        {\n            rx_freq = ritFreq;\n            tx_freq = xitFreq;\n            drawMarkers(rx_freq);\n        }\n        updateNearestSpot();\n    }\n\n    if ( !isActive )\n    {\n        clearFreqMark(&txMark);\n        clearFreqMark(&rxMark);\n    }\n}\n\nvoid BandmapWidget::drawEmergencyMarkers(double step)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !showEmergencyMarkers )\n        return;\n\n    QFont emergencyFont;\n    emergencyFont.setPointSize(7);\n    emergencyFont.setBold(true);\n\n    const QColor lineColor(220, 40, 40);\n    const QColor pillColor(185, 28, 28);\n    const qreal pillX = 157.0;\n    const qreal pillH = 14.0;\n    const qreal tolerancePx = (EmergencyFrequency::TOLERANCE_MHZ / step) * PIXELSPERSTEP;\n    const qreal glowH = qMin(tolerancePx, 15.0);\n\n    const EmergencyFreqEntry *entry = EmergencyFrequency::inBand(currentBand.start,\n                                                                 currentBand.end);\n\n    if ( !entry ) return;\n\n    const qreal y = ((entry->frequency - currentBand.start) / step) * PIXELSPERSTEP;\n\n    // Gradient glow — height proportional to zoom, fades to transparent at edges\n    QLinearGradient glow(0.0, y - glowH, 0.0, y + glowH);\n    glow.setColorAt(0.0,  QColor(220, 30, 30,   0));\n    glow.setColorAt(0.35, QColor(220, 30, 30,  70));\n    glow.setColorAt(0.5,  QColor(220, 30, 30, 115));\n    glow.setColorAt(0.65, QColor(220, 30, 30,  70));\n    glow.setColorAt(1.0,  QColor(220, 30, 30,   0));\n    bandmapScene->addRect(0, y - glowH, pillX, 2.0 * glowH,\n                          QPen(Qt::NoPen), QBrush(glow));\n\n    // Sharp centre line — runs from the scale up to the SOS pill\n    bandmapScene->addLine(0, y, pillX, y, QPen(lineColor, 2));\n\n    // Pill label — sized dynamically around the text\n    QGraphicsSimpleTextItem *textItem = bandmapScene->addSimpleText(tr(\"SOS\"), emergencyFont);\n    textItem->setBrush(QBrush(Qt::white));\n    const QRectF textRect = textItem->boundingRect();\n    const qreal pillW = textRect.width() + 10.0;\n    const qreal pillY = y - pillH / 2.0;\n\n    QPainterPath pillPath;\n    pillPath.addRoundedRect(QRectF(pillX, pillY, pillW, pillH), 4, 4);\n    QGraphicsPathItem *pillItem = bandmapScene->addPath(pillPath,\n                                                        QPen(Qt::NoPen),\n                                                        QBrush(pillColor));\n\n    textItem->setPos(pillX + (pillW - textRect.width()) / 2.0,\n                     pillY + (pillH - textRect.height()) / 2.0);\n\n    pillItem->setZValue(1);\n    textItem->setZValue(2);\n}\n\nvoid BandmapWidget::drawMarkers(double frequency)\n{\n    FCT_IDENTIFICATION;\n\n    double step;\n    int digits;\n\n    determineStepDigits(step, digits);\n\n    /************************/\n    /* Draw TX and RX Marks */\n    /************************/\n    drawTXRXMarks(step);\n    scrollToFreq(frequency);\n}\nvoid BandmapWidget::updateMode(VFOID, const QString &, const QString &mode,\n                               const QString &subMode, qint32 width)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode << width;\n\n    const QString &newMode = BandPlan::modeToModeGroup(mode);\n\n    if ( currBandMode != newMode )\n    {\n        currBandMode = newMode;\n        update();\n    }\n}\n\nBandmapWidget::~BandmapWidget()\n{\n    FCT_IDENTIFICATION;\n\n    if ( update_timer )\n    {\n        update_timer->stop();\n        update_timer->deleteLater();\n    }\n\n    nonVfoWidgets.removeAll(this);\n\n    delete ui;\n}\n\nvoid BandmapWidget::resizeEvent(QResizeEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    QWidget::resizeEvent(event);\n\n    scrollToFreq(rx_freq);\n}\n\nbool BandmapWidget::eventFilter(QObject *, QEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    if (event->type() == QEvent::Wheel)\n    {\n        QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent*>(event);\n\n        if ( wheelEvent )\n        {\n            if ( QApplication::keyboardModifiers() == Qt::ControlModifier )\n            {\n                /*\n                 * CRTL + Mouse Wheel\n                 *\n                 * Zoom In/Out\n                 */\n\n                QPoint zoomViewPoint = ui->graphicsView->mapFromGlobal(QCursor::pos());\n                zoomWidgetYOffset = zoomViewPoint.y() - ui->scrollArea->verticalScrollBar()->value();\n                zoomFreq = ScenePos2Freq(ui->graphicsView->mapToScene(zoomViewPoint));\n\n                QPoint wheelDelta(wheelEvent->angleDelta());\n                int delta = (wheelDelta.y() > 0) ? 1 : -1;\n                ui->zoomSlider->setValue(ui->zoomSlider->value() + delta * ui->zoomSlider->singleStep());\n\n                /*\n                 * DO NOT focus zoomed Freq here because the scrollbar\n                 * is not resized yet and it is not possible to compute\n                 * a correct value for scrollbar value (scrollbar min/max\n                 * is recomputed later and it emits RangeChanged signal).\n                 * SO focus zoomed Freq in SLOT for RangeChanged signal.\n                 */\n                event->accept();\n                return true;\n            }\n        }\n    }\n    return false;\n}\n\nvoid BandmapWidget::scrollToFreq(double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qreal freqScenePos = Freq2ScenePos(freq).y();\n\n    QPropertyAnimation *anim = new QPropertyAnimation(ui->scrollArea->verticalScrollBar(), \"value\", this);\n    anim->setDuration((bandmapAnimation) ? 300 : 0);\n    anim->setStartValue(ui->scrollArea->verticalScrollBar()->value());\n\n    if ( keepRXCenter )\n    {\n        /* If RX freq should be center then center it */\n        anim->setEndValue(freqScenePos - (WIDGET_CENTER));\n    }\n    else\n    {\n        /* If RX freq is out-of-scene then keep the RX mark visible - this is not centering !!! */\n        int sceneSize = height() - 60;\n        int sliderSceneMin = ui->scrollArea->verticalScrollBar()->value();\n        int sliderSceneMax = ui->scrollArea->verticalScrollBar()->value() + sceneSize;\n\n        if ( freqScenePos < sliderSceneMin )\n        {\n            anim->setEndValue(sliderSceneMin - (sliderSceneMin - freqScenePos) - 40);\n        }\n        else if ( freqScenePos > sliderSceneMax - 20 ) //asymetric becuase possible slider below\n        {\n            anim->setEndValue(sliderSceneMin + (freqScenePos - sliderSceneMax) + 60);\n        }\n        else\n        {\n            anim->setEndValue(ui->scrollArea->verticalScrollBar()->value());\n        }\n    }\n    anim->start(QAbstractAnimation::DeleteWhenStopped);\n}\n\nQPointF BandmapWidget::Freq2ScenePos(const double freq) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << freq;\n\n    if ( freq < currentBand.start || freq > currentBand.end )\n    {\n        return QPointF();\n    }\n\n    double step;\n    int digits;\n\n    determineStepDigits(step, digits);\n\n    QPointF ret(0, ((freq - currentBand.start) / step) * PIXELSPERSTEP);\n\n    qCDebug(runtime) << ret;\n\n    return ret;\n}\n\ndouble BandmapWidget::ScenePos2Freq(const QPointF &point) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << point;\n\n    double step;\n    int digits;\n\n    determineStepDigits(step, digits);\n\n    double ret = currentBand.start + (point.y() / PIXELSPERSTEP) * step;\n\n    if ( ret > currentBand.end )\n    {\n        ret = currentBand.end;\n    }\n\n    if ( ret < currentBand.start )\n    {\n        ret = currentBand.start;\n    }\n\n    qCDebug(runtime) << ret;\n\n    return ret;\n}\n\nvoid BandmapWidget::centerRXActionChecked(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    keepRXCenter = state;\n    zoomFreq = 0.0;\n    LogParam::setBandmapCenterRX(objectName(), keepRXCenter);\n\n    if ( keepRXCenter )\n        scrollToFreq(rx_freq);\n}\n\nvoid BandmapWidget::emergencyMarkersActionChecked(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    showEmergencyMarkers = state;\n    LogParam::setBandmapShowEmergency(objectName(), showEmergencyMarkers);\n    update();\n}\n\n\nvoid GraphicsScene::mousePressEvent(QGraphicsSceneMouseEvent *evt)\n{\n    FCT_IDENTIFICATION;\n\n    if ( evt->button() & Qt::LeftButton )\n    {\n        QGraphicsItem *item = itemAt(evt->scenePos(), QTransform());\n        QGraphicsTextItem *focusedSpot = dynamic_cast<QGraphicsTextItem*>(item);\n\n        if ( focusedSpot && focusedSpot->property(\"freq\").isValid() )\n            emit spotClicked(focusedSpot->toPlainText().split(\" \").first(),\n                             focusedSpot->property(\"freq\").toDouble(),\n                             static_cast<BandPlan::BandPlanMode>(focusedSpot->property(\"bandmode\").toInt()));\n    }\n    evt->accept();\n}\n\nvoid GraphicsScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *evt)\n{\n    FCT_IDENTIFICATION;\n\n    evt->accept();\n}\n\n#undef WIDGET_CENTER\n"
  },
  {
    "path": "ui/BandmapWidget.h",
    "content": "#ifndef QLOG_UI_BANDMAPWIDGET_H\n#define QLOG_UI_BANDMAPWIDGET_H\n\n#include <QWidget>\n#include <QMap>\n#include <QTimer>\n#include <QGraphicsItem>\n#include <QGraphicsScene>\n#include <QMutex>\n#include <QColor>\n#include <QSqlRecord>\n\n#include \"data/DxSpot.h\"\n#include \"data/Band.h\"\n#include \"rig/Rig.h\"\n#include \"core/LogLocale.h\"\n#include \"component/ShutdownAwareWidget.h\"\n\nnamespace Ui {\nclass BandmapWidget;\n}\n\nclass QGraphicsScene;\n\nclass GraphicsScene : public QGraphicsScene\n{\n    Q_OBJECT;\n\npublic:\n    explicit GraphicsScene(QObject *parent = nullptr) : QGraphicsScene(parent){};\n\nsignals:\n    void spotClicked(QString, double, BandPlan::BandPlanMode mode);\n\nprotected:\n    void mousePressEvent (QGraphicsSceneMouseEvent *evt) override;\n    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *evt) override;\n};\n\nclass BandmapWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit BandmapWidget(const QString &widgetID = QString(),\n                           const Band &widgetBand = Band(),\n                           QWidget *parent = nullptr);\n    ~BandmapWidget();\n    const Band& getBand() const {return currentBand;};\n    const QList<BandmapWidget *> getNonVfoWidgetList() {return nonVfoWidgets;};\n    enum BandmapZoom {\n        ZOOM_100HZ = 6,\n        ZOOM_250HZ = 5,\n        ZOOM_500HZ = 4,\n        ZOOM_1KHZ = 3,\n        ZOOM_2K5HZ = 2,\n        ZOOM_5KHZ = 1,\n        ZOOM_10KHZ = 0\n    };\n\npublic slots:\n    void update();\n    void updateTunedFrequency(VFOID, double, double, double);\n    void updateMode(VFOID, const QString &, const QString &mode,\n                    const QString &subMode, qint32 width);\n    void addSpot(DxSpot spot);\n    void spotAgingChanged(int);\n    void clearSpots();\n    void setZoom(int);\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsStatusWhenQSOUpdated(const QSqlRecord &);\n    void updateSpotsDupeWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n    void recalculateDxccStatus();\n    void resetDupe();\n    void recalculateDupe();\n    void updateStations();\n    void clearWidgetBand();\n    virtual void finalizeBeforeAppExit() override;\n    void increasePendingSpots() {pendingSpots++;};\n\nsignals:\n    void tuneDx(DxSpot);\n    void nearestSpotFound(const DxSpot &);\n    void spotsUpdated();\n    void requestNewNonVfoBandmapWindow(const QString &id, const QString &bandName);\n\nprivate:\n    void removeDuplicates(DxSpot &spot);\n    void spotAging();\n\n    void determineStepDigits(double &step, int &digits) const;\n    void clearAllCallsignFromScene();\n    void clearFreqMark(QGraphicsPolygonItem **);\n    void drawFreqMark(const double, const double, const QColor&, QGraphicsPolygonItem **);\n    void drawTXRXMarks(double);\n    void drawEmergencyMarkers(double step);\n    void drawMarkers(double frequency);\n    void resizeEvent(QResizeEvent * event) override;\n    bool eventFilter(QObject *obj, QEvent *event) override;\n    void scrollToFreq(double freq);\n    QPointF Freq2ScenePos(const double) const;\n    double ScenePos2Freq(const QPointF &point) const;\n    DxSpot nearestSpot(const double) const;\n    void updateNearestSpot(bool force = false);\n    void setBandmapAnimation(bool);\n    void setBand(const Band &newBand, bool savePrevBandZoom = true);\n    void saveCurrentZoom();\n    BandmapWidget::BandmapZoom getSavedZoom(const Band &);\n    void saveCurrentScrollFreq();\n    double getSavedScrollFreq(const Band &);\n    double visibleCentreFreq() const;\n    bool isAlreadyOpened(const Band &band) const;\n    void saveState();\n\nprivate slots:\n    void centerRXActionChecked(bool);\n    void emergencyMarkersActionChecked(bool);\n    void spotClicked(const QString&, double, BandPlan::BandPlanMode);\n    void showContextMenu(const QPoint&);\n    void updateStationTimer();\n    void focusZoomFreq(int, int);\n    void clickNewBandmapWindow();\n\nprivate:\n    Ui::BandmapWidget *ui;\n\n    double rx_freq;\n    double tx_freq;\n    Band currentBand;\n    BandmapZoom zoom;\n    GraphicsScene* bandmapScene;\n    static QMap<double, DxSpot> spots;\n    static QList<BandmapWidget *> nonVfoWidgets;\n    static BandmapWidget* vfoWidget;\n    static double lastSeenVFOFreq;\n    QTimer *update_timer;\n    QList<QGraphicsLineItem *> lineItemList;\n    QList<QGraphicsTextItem *> textItemList;\n    QGraphicsPolygonItem* rxMark;\n    QGraphicsPolygonItem* txMark;\n    bool keepRXCenter;\n    bool showEmergencyMarkers;\n    LogLocale locale;\n    quint32 pendingSpots;\n    qint64 lastStationUpdate;\n    double zoomFreq;\n    int zoomWidgetYOffset;\n    bool bandmapAnimation;\n    QString currBandMode;\n    bool isNonVfo;\n    bool isActive;\n    struct LastTuneDx\n    {\n        QString callsign;\n        double freq;\n    };\n    LastTuneDx lastTunedDX;\n    DxSpot lastNearestSpot;\n\n    double minHeight;\n    const QString MAIN_WIDGET_OBJECT_NAME = \"bandmapWidget\";\n\n    //Pixel between each step in BandMap\n    const int PIXELSPERSTEP = 10;\n\n    //Maximal Aging interval is 20s\n    const int BANDMAP_AGING_CHECK_TIME = 20000;\n\n    //Maximal refresh rate for bandmap is 1s\n    const int BANDMAP_MAX_REFRESH_TIME = 1000;\n};\n\nQ_DECLARE_METATYPE(BandmapWidget::BandmapZoom)\n\n#endif // QLOG_UI_BANDMAPWIDGET_H\n"
  },
  {
    "path": "ui/BandmapWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>BandmapWidget</class>\n <widget class=\"QWidget\" name=\"BandmapWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>283</width>\n    <height>662</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>250</width>\n    <height>0</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QWidget\" name=\"bottomRow\" native=\"true\">\n     <layout class=\"QHBoxLayout\" name=\"bottomRow2\">\n      <property name=\"leftMargin\">\n       <number>0</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>0</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>0</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>0</number>\n      </property>\n      <item>\n       <widget class=\"QPushButton\" name=\"newBandmapButton\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"toolTip\">\n         <string>Create an additional Bandmap Window</string>\n        </property>\n        <property name=\"text\">\n         <string notr=\"true\"/>\n        </property>\n        <property name=\"icon\">\n         <iconset resource=\"../res/icons/icons.qrc\">\n          <normaloff>:/icons/new-window.svg</normaloff>:/icons/new-window.svg</iconset>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"horizontalSpacer\">\n        <property name=\"orientation\">\n         <enum>Qt::Horizontal</enum>\n        </property>\n        <property name=\"sizeHint\" stdset=\"0\">\n         <size>\n          <width>40</width>\n          <height>20</height>\n         </size>\n        </property>\n       </spacer>\n      </item>\n      <item>\n       <widget class=\"QLabel\" name=\"clearSpotOlderLabel\">\n        <property name=\"text\">\n         <string>Clear older</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QSpinBox\" name=\"clearSpotOlderSpin\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"toolTip\">\n         <string/>\n        </property>\n        <property name=\"specialValueText\">\n         <string>Never</string>\n        </property>\n        <property name=\"suffix\">\n         <string> min(s)</string>\n        </property>\n        <property name=\"maximum\">\n         <number>9999</number>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QPushButton\" name=\"clearAllButton\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"text\">\n         <string>Clear All</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QScrollArea\" name=\"scrollArea\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"frameShadow\">\n      <enum>QFrame::Plain</enum>\n     </property>\n     <property name=\"midLineWidth\">\n      <number>-3</number>\n     </property>\n     <property name=\"widgetResizable\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"scrollAreaWidgetContents\">\n      <property name=\"geometry\">\n       <rect>\n        <x>0</x>\n        <y>0</y>\n        <width>283</width>\n        <height>590</height>\n       </rect>\n      </property>\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QGraphicsView\" name=\"graphicsView\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::CustomContextMenu</enum>\n         </property>\n         <property name=\"styleSheet\">\n          <string notr=\"true\">QWidget{background: transparent}</string>\n         </property>\n         <property name=\"frameShape\">\n          <enum>QFrame::NoFrame</enum>\n         </property>\n         <property name=\"verticalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAsNeeded</enum>\n         </property>\n         <property name=\"horizontalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAsNeeded</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustIgnored</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QPushButton\" name=\"clearBandButton\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Clear the current band</string>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"icon\">\n        <iconset resource=\"../res/icons/icons.qrc\">\n         <normaloff>:/icons/clear-button.svg</normaloff>:/icons/clear-button.svg</iconset>\n       </property>\n       <property name=\"iconSize\">\n        <size>\n         <width>24</width>\n         <height>24</height>\n        </size>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_4\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QSlider\" name=\"zoomSlider\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"minimum\">\n        <number>0</number>\n       </property>\n       <property name=\"maximum\">\n        <number>6</number>\n       </property>\n       <property name=\"pageStep\">\n        <number>1</number>\n       </property>\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"invertedAppearance\">\n        <bool>false</bool>\n       </property>\n       <property name=\"invertedControls\">\n        <bool>false</bool>\n       </property>\n       <property name=\"tickPosition\">\n        <enum>QSlider::TicksAbove</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"zoomLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\"/>\n       </property>\n       <property name=\"pixmap\">\n        <pixmap resource=\"../res/icons/icons.qrc\">:/icons/zoom_in-24px.svg</pixmap>\n       </property>\n       <property name=\"textInteractionFlags\">\n        <set>Qt::NoTextInteraction</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>graphicsView</sender>\n   <signal>customContextMenuRequested(QPoint)</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>showContextMenu(QPoint)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>225</x>\n     <y>297</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>225</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clearAllButton</sender>\n   <signal>clicked()</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>clearSpots()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>149</x>\n     <y>617</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>155</x>\n     <y>281</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>newBandmapButton</sender>\n   <signal>clicked()</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>clickNewBandmapWindow()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>426</x>\n     <y>638</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>225</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>zoomSlider</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>setZoom(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>377</x>\n     <y>612</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>225</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clearBandButton</sender>\n   <signal>clicked()</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>clearWidgetBand()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>14</x>\n     <y>613</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>225</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clearSpotOlderSpin</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>BandmapWidget</receiver>\n   <slot>spotAgingChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>309</x>\n     <y>13</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>225</x>\n     <y>330</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>clearSpots()</slot>\n  <slot>spotAgingChanged(int)</slot>\n  <slot>showContextMenu(QPoint)</slot>\n  <slot>clickNewBandmapWindow()</slot>\n  <slot>setZoom(int)</slot>\n  <slot>clearWidgetBand()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/CWConsoleWidget.cpp",
    "content": "#include <QStringListModel>\n#include <QShortcut>\n\n#include \"CWConsoleWidget.h\"\n#include \"ui_CWConsoleWidget.h\"\n#include \"core/debug.h\"\n#include \"data/CWKeyProfile.h\"\n#include \"cwkey/CWKeyer.h\"\n#include \"data/CWShortcutProfile.h\"\n#include \"core/LogParam.h\"\n#include \"component/RepeatButton.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.cwconsolewidget\");\n\nCWConsoleWidget::CWConsoleWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::CWConsoleWidget),\n    cwKeyOnline(false),\n    contact(nullptr),\n    sendWord(false),\n    macroButtonsConnected(false)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    connect(ui->macroButtonGroup, QOverload<QAbstractButton*>::of(&QButtonGroup::buttonClicked),\n            this, [=](const QAbstractButton *button)\n    {\n        int number = getMacroButtonID(button) - 1;\n        qCDebug(runtime) << \"Clicked number\" << number;\n\n        const CWShortcutProfile &profile = CWShortcutProfilesManager::instance()->getCurProfile1();\n        if ( number >= 0 && number < profile.macros.size()) sendCWText(profile.macros[number]);\n\n        const QList<QAbstractButton*> &macroButtonList = ui->macroButtonGroup->buttons();\n        for (QAbstractButton *btn : macroButtonList)\n        {\n            RepeatButton *rptButton = qobject_cast<RepeatButton*>(btn);\n            if ( rptButton && rptButton != button ) rptButton->stop();\n        }\n    });\n\n    QStringListModel* keyModel = new QStringListModel(this);\n    ui->cwKeyProfileCombo->setModel(keyModel);\n\n    QStringListModel* shortcutModel = new QStringListModel(this);\n    ui->cwShortcutProfileCombo->setModel(shortcutModel);\n\n    refreshKeyProfileCombo();\n    refreshShortcutProfileCombo();\n\n    connect(ui->modeSwitch, &SwitchButton::stateChanged, this, &CWConsoleWidget::sendWordSwitched);\n\n    sendWord = getSendWordConfig();\n    ui->modeSwitch->setChecked(sendWord);\n\n    addAction(ui->actionHaltCW);\n\n    cwKeyDisconnected();\n}\n\nCWConsoleWidget::~CWConsoleWidget()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nvoid CWConsoleWidget::registerContactWidget(const NewContactWidget * contactWidget)\n{\n    FCT_IDENTIFICATION;\n\n    contact = contactWidget;\n}\n\nvoid CWConsoleWidget::appendCWEchoText(QString text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text;\n\n    if ( ui->cwEchoConsoleText->isEnabled() )\n    {\n        ui->cwEchoConsoleText->moveCursor(QTextCursor::End);\n        ui->cwEchoConsoleText->insertPlainText(text);\n    }\n}\n\nvoid CWConsoleWidget::cwKeyProfileComboChanged(QString profileName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << profileName;\n\n    CWKeyProfilesManager::instance()->setCurProfile1(profileName);\n\n    emit cwKeyProfileChanged();\n}\n\nvoid CWConsoleWidget::cwShortcutProfileComboChanged(QString profileName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << profileName;\n\n    CWShortcutProfilesManager *shortcutManager =  CWShortcutProfilesManager::instance();\n    shortcutManager->setCurProfile1(profileName);\n\n    const CWShortcutProfile &profile = shortcutManager->getCurProfile1();\n\n    auto setupMacroButton = [&](RepeatButton *button, int index, int key)\n    {\n        button->setText(QString(\"F%1\\n%2\").arg(index+1).arg(profile.shortDescs[index]));\n        button->setToolTip(profile.macros[index]);\n        button->stop();\n        button->resetInterval();\n\n        if ( !macroButtonsConnected )\n        {\n            connect(new QShortcut(QKeySequence(key), button), &QShortcut::activated,\n                    button, [button]{ button->handleClick(); });\n\n            connect(new QShortcut(QKeySequence(Qt::SHIFT | key), button), &QShortcut::activated,\n                    button, [button]{ button->repeatClick(); });\n        }\n    };\n\n    setupMacroButton(ui->macroButton1, 0, Qt::Key_F1);\n    setupMacroButton(ui->macroButton2, 1, Qt::Key_F2);\n    setupMacroButton(ui->macroButton3, 2, Qt::Key_F3);\n    setupMacroButton(ui->macroButton4, 3, Qt::Key_F4);\n    setupMacroButton(ui->macroButton5, 4, Qt::Key_F5);\n    setupMacroButton(ui->macroButton6, 5, Qt::Key_F6);\n    setupMacroButton(ui->macroButton7, 6, Qt::Key_F7);\n    macroButtonsConnected = true;\n\n    emit cwShortcutProfileChanged();\n}\n\nvoid CWConsoleWidget::cwShortcutProfileIncrease()\n{\n    FCT_IDENTIFICATION;\n\n    shortcutComboMove(1);\n}\n\nvoid CWConsoleWidget::cwShortcutProfileDecrease()\n{\n    FCT_IDENTIFICATION;\n\n    shortcutComboMove(-1);\n}\n\nvoid CWConsoleWidget::shortcutComboMove(int step)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << step;\n\n    int count = ui->cwShortcutProfileCombo->count();\n    int currIndex = ui->cwShortcutProfileCombo->currentIndex();\n\n    if ( count > 0\n         && currIndex != -1\n         && step < count )\n    {\n        int nextIndex = currIndex + step;\n        nextIndex += (1 - nextIndex / count) * count;\n        ui->cwShortcutProfileCombo->setCurrentIndex(nextIndex % count);\n    }\n}\n\nvoid CWConsoleWidget::allowMorseSending(bool allow)\n{\n    FCT_IDENTIFICATION;\n\n    if ( allow )\n    {\n        ui->cwEchoConsoleText->setEnabled(CWKeyer::instance()->canEchoChar());\n        ui->haltButton->setEnabled(CWKeyer::instance()->canStopSending());\n        ui->cwKeySpeedSpinBox->setEnabled(CWKeyer::instance()->canSetSpeed());\n    }\n    else\n    {\n        ui->cwEchoConsoleText->setEnabled(allow);\n        ui->haltButton->setEnabled(allow);\n        ui->cwKeySpeedSpinBox->setEnabled(allow);\n    }\n    ui->clearButton->setEnabled(allow);\n    ui->cwConsoleText->setEnabled(allow);\n    ui->cwSendEdit->setEnabled(allow);\n    ui->cwShortcutProfileCombo->setEnabled(allow);\n\n    const QList<QAbstractButton*> &macroButtonList = ui->macroButtonGroup->buttons();\n    for (QAbstractButton *btn : macroButtonList)\n    {\n        RepeatButton *rptButton = qobject_cast<RepeatButton*>(btn);\n        if ( rptButton ) rptButton->stop();\n        btn->setEnabled(allow);\n    }\n    ui->modeSwitch->setEnabled(allow);\n}\n\nvoid CWConsoleWidget::saveSendWordConfig(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setCWConsoleSendWord(state);\n}\n\nbool CWConsoleWidget::getSendWordConfig()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getCWConsoleSendWord();\n}\n\nint CWConsoleWidget::getMacroButtonID(const QAbstractButton *button)\n{\n    FCT_IDENTIFICATION;\n\n    QString name = button->objectName();\n    name.remove(\"macroButton\");\n    return name.toInt();\n}\n\nvoid CWConsoleWidget::refreshKeyProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwKeyProfileCombo->blockSignals(true);\n\n    CWKeyProfilesManager *cwKeyManager =  CWKeyProfilesManager::instance();\n\n    QStringList currProfiles = cwKeyManager->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->cwKeyProfileCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( cwKeyManager->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->cwKeyProfileCombo->setCurrentText(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->cwKeyProfileCombo->setCurrentText(cwKeyManager->getCurProfile1().profileName);\n    }\n\n    cwKeyProfileComboChanged(ui->cwKeyProfileCombo->currentText());\n\n    ui->cwKeyProfileCombo->blockSignals(false);\n}\n\nvoid CWConsoleWidget::refreshShortcutProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwShortcutProfileCombo->blockSignals(true);\n\n    CWShortcutProfilesManager *shortcutManager =  CWShortcutProfilesManager::instance();\n\n    QStringList currProfiles = shortcutManager->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->cwShortcutProfileCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( shortcutManager->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->cwShortcutProfileCombo->setCurrentText(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->cwShortcutProfileCombo->setCurrentText(shortcutManager->getCurProfile1().profileName);\n    }\n\n    cwShortcutProfileComboChanged(ui->cwShortcutProfileCombo->currentText());\n\n    ui->cwShortcutProfileCombo->blockSignals(false);\n}\n\nvoid CWConsoleWidget::reloadSettings()\n{\n    FCT_IDENTIFICATION;\n\n    refreshKeyProfileCombo();\n    refreshShortcutProfileCombo();\n}\n\nvoid CWConsoleWidget::clearConsoles()\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwConsoleText->clear();\n    ui->cwEchoConsoleText->clear();\n\n}\n\nvoid CWConsoleWidget::cwKeyConnected(QString profile)\n{\n    FCT_IDENTIFICATION;\n    ui->cwKeyProfileCombo->setStyleSheet(\"QComboBox {color: green}\");\n\n    if ( profile != ui->cwKeyProfileCombo->currentText() )\n    {\n        ui->cwKeyProfileCombo->blockSignals(true);\n        ui->cwKeyProfileCombo->setCurrentText(profile);\n        ui->cwKeyProfileCombo->blockSignals(false);\n    }\n    allowMorseSending(true);\n    ui->cwKeySpeedSpinBox->setValue(CWKeyProfilesManager::instance()->getCurProfile1().defaultSpeed);\n    cwKeyOnline = true;\n\n    ui->cwSendEdit->setPlaceholderText(QString());\n}\n\nvoid CWConsoleWidget::cwKeyDisconnected()\n{\n    FCT_IDENTIFICATION;\n    ui->cwKeyProfileCombo->setStyleSheet(\"QComboBox {color: red}\");\n\n    allowMorseSending(false);\n\n    clearConsoles();\n\n    cwKeyOnline = false;\n}\n\nvoid CWConsoleWidget::cwKeySpeedChanged(int newWPM)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newWPM;\n\n    CWKeyer::instance()->setSpeed(newWPM);\n    Rig::instance()->syncKeySpeed(newWPM);\n}\n\nvoid CWConsoleWidget::cwKeySpeedIncrease()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !CWKeyer::instance()->canSetSpeed() ) return;\n    ui->cwKeySpeedSpinBox->setValue(ui->cwKeySpeedSpinBox->value() + 2);\n}\n\nvoid CWConsoleWidget::cwKeySpeedDecrease()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !CWKeyer::instance()->canSetSpeed() ) return;\n    ui->cwKeySpeedSpinBox->setValue(ui->cwKeySpeedSpinBox->value() - 2);\n}\n\nvoid CWConsoleWidget::cwSendButtonPressed(bool insertNewLine)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->cwSendEdit->text().isEmpty() )\n    {\n        return;\n    }\n\n    sendCWText(ui->cwSendEdit->text(), insertNewLine);\n    ui->cwSendEdit->clear();\n}\n\nvoid CWConsoleWidget::rigDisconnectHandler()\n{\n    FCT_IDENTIFICATION;\n\n    if ( CWKeyer::instance()->rigMustConnected() )\n    {\n        allowMorseSending(false);\n        if ( cwKeyOnline )\n        {\n            ui->cwSendEdit->setPlaceholderText(tr(\"Rig must be connected\"));\n        }\n    }\n}\n\nvoid CWConsoleWidget::rigConnectHandler()\n{\n    FCT_IDENTIFICATION;\n\n    if ( cwKeyOnline )\n    {\n        // if MorseOverCat Key\n        if (CWKeyer::instance()->rigMustConnected()\n            && Rig::instance()->isMorseOverCatSupported() )\n        {\n            allowMorseSending(true);\n            CWKeyer::instance()->setSpeed(ui->cwKeySpeedSpinBox->value());\n\n            ui->cwSendEdit->setPlaceholderText(QString());\n        }\n        else\n        {\n            Rig::instance()->syncKeySpeed(ui->cwKeySpeedSpinBox->value());\n        }\n    }\n}\n\nvoid CWConsoleWidget::haltButtonPressed()\n{\n    FCT_IDENTIFICATION;\n\n    ui->macroButton1->stop();\n\n    if ( !ui->haltButton->isEnabled() )\n        return;\n\n    CWKeyer::instance()->immediatelyStop();\n}\n\nvoid CWConsoleWidget::pressMacroButton(int buttonNumber)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << buttonNumber;\n\n    const CWShortcutProfile &profile = CWShortcutProfilesManager::instance()->getCurProfile1();\n    int index = buttonNumber - 1;\n    if ( index >= 0 && index < profile.macros.size()) sendCWText(profile.macros[index]);\n}\n\nvoid CWConsoleWidget::stopRepeateButtons()\n{\n    const QList<QAbstractButton*> &macroButtonList = ui->macroButtonGroup->buttons();\n    for (QAbstractButton *btn : macroButtonList)\n    {\n        RepeatButton *rptButton = qobject_cast<RepeatButton*>(btn);\n        if ( rptButton ) rptButton->stop();\n    }\n}\n\nvoid CWConsoleWidget::sendWordSwitched(int mode)\n{\n    FCT_IDENTIFICATION;\n\n    sendWord = (mode == Qt::Checked) ? true: false;\n\n    ui->sendModeLabel->setText(sendWord ? tr(\"Word\") : tr(\"Whole\"));\n    saveSendWordConfig(sendWord);\n}\n\nvoid CWConsoleWidget::cwTextChanged(QString text)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << text << text.endsWith(\" \") << text.size() << sendWord;\n\n    if ( sendWord && text.size() > 0 && text.endsWith(\" \") )\n    {\n        cwSendButtonPressed(false);\n    }\n}\n\nvoid CWConsoleWidget::setWPM(qint32 wpm)\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwKeySpeedSpinBox->blockSignals(true);\n    ui->cwKeySpeedSpinBox->setValue(wpm);\n    Rig::instance()->syncKeySpeed(wpm);\n    ui->cwKeySpeedSpinBox->blockSignals(false);\n}\n\nvoid CWConsoleWidget::sendCWText(const QString &text, bool insertNewLine)\n{\n    FCT_IDENTIFICATION;\n\n    QString expandedText(text.toUpper());\n\n    expandMacros(expandedText);\n\n    qCDebug(runtime) << \"CW text\" << expandedText;\n    QString newLine = (insertNewLine ? QString(\"\\n\")\n                                     : QString());\n    CWKeyer::instance()->sendText(expandedText + QString(\" \") + newLine); //insert extra space do divide words in echo console\n\n    newLine.replace(\"\\n\", QString::fromUtf8(\"\\u23ce\\n\")); // UTF8 Return char\n    ui->cwConsoleText->moveCursor(QTextCursor::End);\n    ui->cwConsoleText->insertPlainText(expandedText + newLine);\n}\n\nvoid CWConsoleWidget::expandMacros(QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression callRE(\"<DXCALL>\");\n    static QRegularExpression nameRE(\"<NAME>\");\n    static QRegularExpression rstRE(\"<RST>\");\n    static QRegularExpression rstnRE(\"<RSTN>\");\n    static QRegularExpression greetingRE(\"<GREETING>\");\n    static QRegularExpression qthRE(\"<QTH>\");\n\n    static QRegularExpression myCallRE(\"<MYCALL>\");\n    static QRegularExpression myNameRE(\"<MYNAME>\");\n    static QRegularExpression myQTHRE(\"<MYQTH>\");\n    static QRegularExpression myLocatorRE(\"<MYLOCATOR>\");\n    static QRegularExpression myGridRE(\"<MYGRID>\");\n    static QRegularExpression mySIGRE(\"<MYSIG>\");\n    static QRegularExpression mySIGInfoRE(\"<MYSIGINFO>\");\n    static QRegularExpression myIOTARE(\"<MYIOTA>\");\n    static QRegularExpression mySOTARE(\"<MYSOTA>\");\n    static QRegularExpression myWWFTRE(\"<MYWWFT>\");\n    static QRegularExpression myVUCCRE(\"<MYVUCC>\");\n    static QRegularExpression myPWRRE(\"<MYPWR>\");\n    static QRegularExpression myEXCHSTRRE(\"<EXCHSTR>\");\n    static QRegularExpression myEXCHNRRE(\"<EXCHNR>\");\n    static QRegularExpression myEXCHNRNRE(\"<EXCHNRN>\");\n\n    if ( contact )\n    {\n        text.replace(callRE, contact->getCallsign().toUpper());\n        text.replace(nameRE, contact->getName().toUpper());\n        text.replace(rstRE, contact->getRST().toUpper());\n        text.replace(rstnRE, contact->getRST().replace('9', 'N'));\n        text.replace(greetingRE, contact->getGreeting().toUpper());\n        text.replace(qthRE, contact->getQTH());\n\n        text.replace(myCallRE, contact->getMyCallsign().toUpper());\n        text.replace(myNameRE, contact->getMyName().toUpper());\n        text.replace(myQTHRE, contact->getMyQTH().toUpper());\n        text.replace(myLocatorRE, contact->getMyLocator().toUpper());\n        text.replace(myGridRE, contact->getMyLocator().toUpper());\n        text.replace(mySIGRE, contact->getMySIG().toUpper());\n        text.replace(mySIGInfoRE, contact->getMySIGInfo().toUpper());\n        text.replace(myIOTARE, contact->getMyIOTA().toUpper());\n        text.replace(mySOTARE, contact->getMySOTA().toUpper());\n        text.replace(myWWFTRE, contact->getMyWWFT().toUpper());\n        text.replace(myVUCCRE, contact->getMyVUCC().toUpper());\n        text.replace(myPWRRE, contact->getMyPWR().toUpper());\n        text.replace(myEXCHSTRRE, contact->getSentExch().toUpper());\n        text.replace(myEXCHNRRE, contact->getSentNr().rightJustified(3, '0'));\n        text.replace(myEXCHNRNRE, contact->getSentNr().rightJustified(3, '0')\n                                                      .replace('9', 'N')\n                                                      .replace('0', 'T'));\n    }\n}\n"
  },
  {
    "path": "ui/CWConsoleWidget.h",
    "content": "#ifndef QLOG_UI_CWCONSOLEWIDGET_H\n#define QLOG_UI_CWCONSOLEWIDGET_H\n\n#include <QWidget>\n#include \"ui/NewContactWidget.h\"\n\nnamespace Ui {\nclass CWConsoleWidget;\n}\n\nclass CWConsoleWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit CWConsoleWidget(QWidget *parent = nullptr);\n    ~CWConsoleWidget();\n    void registerContactWidget(const NewContactWidget*);\n\nsignals:\n    void cwKeyProfileChanged();\n    void cwShortcutProfileChanged();\n\npublic slots:\n    void appendCWEchoText(QString);\n    void reloadSettings();\n    void clearConsoles();\n    void setWPM(qint32);\n    void cwKeySpeedIncrease();\n    void cwKeySpeedDecrease();\n    void cwShortcutProfileIncrease();\n    void cwShortcutProfileDecrease();\n    void rigDisconnectHandler();\n    void rigConnectHandler();\n    void cwKeyConnected(QString);\n    void cwKeyDisconnected();\n    void haltButtonPressed();\n    void pressMacroButton(int);\n    void stopRepeateButtons();\n\nprivate slots:\n    void cwKeyProfileComboChanged(QString);\n    void cwShortcutProfileComboChanged(QString);\n    void refreshKeyProfileCombo();\n    void refreshShortcutProfileCombo();\n    void cwKeySpeedChanged(int);\n    void cwSendButtonPressed(bool insertNewLine = true);\n\n    void sendWordSwitched(int);\n    void cwTextChanged(QString);\n\nprivate:\n    Ui::CWConsoleWidget *ui;\n    bool cwKeyOnline;\n    const NewContactWidget *contact;\n    bool sendWord;\n    bool macroButtonsConnected;\n\n    void sendCWText(const QString &, bool insertNewLine = true);\n    void expandMacros(QString &);\n    void shortcutComboMove(int);\n    void allowMorseSending(bool);\n\n    void saveSendWordConfig(bool);\n    bool getSendWordConfig();\n\n    int getMacroButtonID(const QAbstractButton* button);\n\n};\n\n#endif // QLOG_UI_CWCONSOLEWIDGET_H\n"
  },
  {
    "path": "ui/CWConsoleWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CWConsoleWidget</class>\n <widget class=\"QWidget\" name=\"CWConsoleWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>412</width>\n    <height>295</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <property name=\"bottomMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QComboBox\" name=\"cwKeyProfileCombo\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>CW Keyer Profile</string>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"cwShortcutProfileCombo\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"contextMenuPolicy\">\n        <enum>Qt::DefaultContextMenu</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Shortcuts profile</string>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_3\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QSpinBox\" name=\"cwKeySpeedSpinBox\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Speed</string>\n       </property>\n       <property name=\"specialValueText\">\n        <string>N/A</string>\n       </property>\n       <property name=\"keyboardTracking\">\n        <bool>false</bool>\n       </property>\n       <property name=\"showGroupSeparator\" stdset=\"0\">\n        <bool>false</bool>\n       </property>\n       <property name=\"suffix\">\n        <string> WPM</string>\n       </property>\n       <property name=\"minimum\">\n        <number>0</number>\n       </property>\n       <property name=\"maximum\">\n        <number>99</number>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QSplitter\" name=\"splitter\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"frameShadow\">\n      <enum>QFrame::Plain</enum>\n     </property>\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"handleWidth\">\n      <number>4</number>\n     </property>\n     <widget class=\"QTextEdit\" name=\"cwConsoleText\">\n      <property name=\"focusPolicy\">\n       <enum>Qt::NoFocus</enum>\n      </property>\n      <property name=\"toolTip\">\n       <string>Sent text</string>\n      </property>\n      <property name=\"readOnly\">\n       <bool>true</bool>\n      </property>\n      <property name=\"textInteractionFlags\">\n       <set>Qt::TextSelectableByMouse</set>\n      </property>\n     </widget>\n     <widget class=\"QTextEdit\" name=\"cwEchoConsoleText\">\n      <property name=\"focusPolicy\">\n       <enum>Qt::NoFocus</enum>\n      </property>\n      <property name=\"toolTip\">\n       <string>Echoed text</string>\n      </property>\n      <property name=\"readOnly\">\n       <bool>true</bool>\n      </property>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <property name=\"bottomMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"text\">\n        <string>&amp;CW</string>\n       </property>\n       <property name=\"buddy\">\n        <cstring>cwSendEdit</cstring>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"cwSendEdit\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Text to send</string>\n       </property>\n       <property name=\"clearButtonEnabled\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"SwitchButton\" name=\"modeSwitch\" native=\"true\">\n       <property name=\"toolTip\">\n        <string>Switch between sending &lt;b&gt;words&lt;/b&gt; individually (separated by spaces)&lt;br&gt; and sending the entire text as a &lt;b&gt;whole&lt;/b&gt; (separated by a new line).</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"sendModeLabel\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer_4\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton1\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F1</string>\n       </property>\n       <property name=\"autoRepeatDelay\">\n        <number>300</number>\n       </property>\n       <property name=\"autoRepeatInterval\">\n        <number>100</number>\n       </property>\n       <property name=\"flat\">\n        <bool>false</bool>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton2\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F2</string>\n       </property>\n       <property name=\"checked\">\n        <bool>false</bool>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton3\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F3</string>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton4\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F4</string>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton5\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F5</string>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton6\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F6</string>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"RepeatButton\" name=\"macroButton7\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>F7</string>\n       </property>\n       <attribute name=\"buttonGroup\">\n        <string notr=\"true\">macroButtonGroup</string>\n       </attribute>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"haltButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Immediately stop CW sending</string>\n       </property>\n       <property name=\"text\">\n        <string>Halt</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_6\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Maximum</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"clearButton\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Clear Sent and Echo Console</string>\n       </property>\n       <property name=\"text\">\n        <string>Clear</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_5\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionHaltCW\">\n   <property name=\"text\">\n    <string notr=\"true\">HaltCW</string>\n   </property>\n   <property name=\"iconText\">\n    <string notr=\"true\">HaltCW</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>CW Console - Halt Sending</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+T</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>SwitchButton</class>\n   <extends>QWidget</extends>\n   <header>ui/component/SwitchButton.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>RepeatButton</class>\n   <extends>QPushButton</extends>\n   <header>ui/component/RepeatButton.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections>\n  <connection>\n   <sender>cwKeySpeedSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>cwKeySpeedChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>131</x>\n     <y>92</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>131</x>\n     <y>67</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwKeyProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>cwKeyProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>131</x>\n     <y>41</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>131</x>\n     <y>67</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwSendEdit</sender>\n   <signal>returnPressed()</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>cwSendButtonPressed()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>114</x>\n     <y>134</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>111</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>haltButton</sender>\n   <signal>clicked()</signal>\n   <receiver>actionHaltCW</receiver>\n   <slot>trigger()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>262</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwShortcutProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>cwShortcutProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>150</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>164</x>\n     <y>111</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clearButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>clearConsoles()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>279</x>\n     <y>22</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>164</x>\n     <y>147</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwSendEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>cwTextChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>220</x>\n     <y>215</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>205</x>\n     <y>147</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionHaltCW</sender>\n   <signal>triggered()</signal>\n   <receiver>CWConsoleWidget</receiver>\n   <slot>haltButtonPressed()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>205</x>\n     <y>147</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>cwKeySpeedChanged(int)</slot>\n  <slot>cwKeyProfileComboChanged(QString)</slot>\n  <slot>cwSendButtonPressed()</slot>\n  <slot>cwKeyMacroF1()</slot>\n  <slot>cwKeyMacroF2()</slot>\n  <slot>cwKeyMacroF3()</slot>\n  <slot>cwKeyMacroF4()</slot>\n  <slot>cwKeyMacroF5()</slot>\n  <slot>cwKeyMacroF6()</slot>\n  <slot>cwKeyMacroF7()</slot>\n  <slot>haltButtonPressed()</slot>\n  <slot>cwShortcutProfileComboChanged(QString)</slot>\n  <slot>clearConsoles()</slot>\n  <slot>cwTextChanged(QString)</slot>\n </slots>\n <buttongroups>\n  <buttongroup name=\"macroButtonGroup\"/>\n </buttongroups>\n</ui>\n"
  },
  {
    "path": "ui/CabrilloExportDialog.cpp",
    "content": "#include \"CabrilloExportDialog.h\"\n#include \"ui_CabrilloExportDialog.h\"\n\n#include <QSqlQuery>\n#include <QSqlRecord>\n#include <QSqlError>\n#include <QMessageBox>\n#include <QFileDialog>\n#include <QDir>\n#include <QProgressDialog>\n#include <QSettings>\n#include <QTimer>\n\n#include \"core/debug.h\"\n#include \"core/QSOFilterManager.h\"\n#include \"data/BandPlan.h\"\n#include \"data/StationProfile.h\"\n#include \"logformat/CabrilloFormat.h\"\n#include \"ui/CabrilloTemplateDialog.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.cabrilloexportdialog\");\n\nCabrilloExportDialog::CabrilloExportDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::CabrilloExportDialog),\n    bandStartFreq(0.0),\n    bandEndFreq(0.0),\n    bandFilterActive(false)\n{\n    FCT_IDENTIFICATION;\n\n    // Must be created before setupUi() because .ui signal connections\n    // may trigger scheduleQsoCountUpdate() during initialization\n    countDebounceTimer = new QTimer(this);\n    countDebounceTimer->setSingleShot(true);\n    countDebounceTimer->setInterval(300);\n    connect(countDebounceTimer, &QTimer::timeout,\n            this, &CabrilloExportDialog::updateQsoCount);\n\n    ui->setupUi(this);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"&Export\"));\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::bandCategories()) )\n        ui->catBandCombo->addItem(item.label, item.value);\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::modeCategories()) )\n        ui->catModeCombo->addItem(item.label, item.value);\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::powerCategories()) )\n        ui->catPowerCombo->addItem(item.label, item.value);\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::operatorCategories()) )\n        ui->catOperatorCombo->addItem(item.label, item.value);\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::assistedCategories()) )\n        ui->catAssistedCombo->addItem(item.label, item.value);\n\n    // Optional category combos — empty first item means \"not included in output\"\n    ui->catStationCombo->addItem(QString(), QString());\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::stationCategories()) )\n        ui->catStationCombo->addItem(item.label, item.value);\n\n    ui->catTransmitterCombo->addItem(QString(), QString());\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::transmitterCategories()) )\n        ui->catTransmitterCombo->addItem(item.label, item.value);\n\n    ui->catTimeCombo->addItem(QString(), QString());\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::timeCategories()) )\n        ui->catTimeCombo->addItem(item.label, item.value);\n\n    ui->catOverlayCombo->addItem(QString(), QString());\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::overlayCategories()) )\n        ui->catOverlayCombo->addItem(item.label, item.value);\n\n    connect(ui->catOperatorCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),\n            this, [this](int)\n    {\n        bool isMultiOp = (ui->catOperatorCombo->currentData().toString()\n                          == CabrilloFormat::OPERATOR_MULTI);\n        ui->transmitterIdSpin->setEnabled(isMultiOp);\n        if ( !isMultiOp )\n            ui->transmitterIdSpin->setValue(0);\n    });\n\n    ui->startDateEdit->setDateTime(QDateTime(QDate::currentDate().addDays(-2), QTime(0, 0), Qt::UTC));\n    ui->endDateEdit->setDateTime(QDateTime(QDate::currentDate(), QTime(23, 59), Qt::UTC));\n\n    const QStringList filterList = QSOFilterManager::instance()->getFilterList();\n    for ( const QString &name : filterList )\n        ui->userFilterCombo->addItem(name);\n\n    loadTemplates();\n    refreshCallsigns();\n\n    // select callsign from current station profile\n    const StationProfile currentProfile = StationProfilesManager::instance()->getCurProfile1();\n    if ( !currentProfile.callsign.isEmpty() )\n    {\n        int idx = ui->callsignCombo->findText(currentProfile.callsign.toUpper());\n        if ( idx >= 0 )\n            ui->callsignCombo->setCurrentIndex(idx);\n    }\n}\n\nCabrilloExportDialog::~CabrilloExportDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nvoid CabrilloExportDialog::browseFile()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n    const QString &lastPath = ( ui->fileEdit->text().isEmpty() )\n        ? settings.value(\"export/last_path\", QDir::homePath()).toString()\n        : ui->fileEdit->text();\n\n    const QString filename = QFileDialog::getSaveFileName(this, nullptr, lastPath,\n                                                          tr(\"Cabrillo Files (*.log);;CBR Files (*.cbr);;All Files (*)\"));\n    if ( !filename.isEmpty() )\n    {\n        settings.setValue(\"export/last_path\", QFileInfo(filename).path());\n        ui->fileEdit->setText(filename);\n    }\n}\n\nvoid CabrilloExportDialog::loadTemplates()\n{\n    FCT_IDENTIFICATION;\n\n    ui->templateCombo->clear();\n\n    const QList<CabrilloFormat::TemplateInfo> templates = CabrilloFormat::templateList();\n\n    for ( const CabrilloFormat::TemplateInfo &tmpl : templates )\n        ui->templateCombo->addItem(tmpl.name, tmpl.id);\n}\n\nvoid CabrilloExportDialog::manageTemplates()\n{\n    FCT_IDENTIFICATION;\n\n    CabrilloTemplateDialog dialog(this);\n\n    int currentId = ui->templateCombo->currentData().toInt();\n    dialog.selectTemplate(currentId);\n\n    if ( dialog.exec() == QDialog::Accepted )\n    {\n        loadTemplates();\n        int idx = ui->templateCombo->findData(currentId);\n        if ( idx >= 0 )\n            ui->templateCombo->setCurrentIndex(idx);\n    }\n}\n\nvoid CabrilloExportDialog::templateChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    if ( index < 0 )\n        return;\n\n    int tmplId = ui->templateCombo->itemData(index).toInt();\n    const CabrilloFormat::TemplateInfo info = CabrilloFormat::templateInfo(tmplId);\n\n    if ( !info.defaultCategoryMode.isEmpty() )\n    {\n        int modeIdx = ui->catModeCombo->findData(info.defaultCategoryMode);\n        if ( modeIdx >= 0 )\n            ui->catModeCombo->setCurrentIndex(modeIdx);\n    }\n}\n\nvoid CabrilloExportDialog::refreshCallsigns()\n{\n    FCT_IDENTIFICATION;\n\n    ui->callsignCombo->blockSignals(true);\n    const QString previousCallsign = ui->callsignCombo->currentText();\n    ui->callsignCombo->clear();\n\n    QStringList conditions;\n    conditions << \"1 = 1\";\n\n    if ( ui->userFilterCheckBox->isChecked()\n         && !ui->userFilterCombo->currentText().isEmpty() )\n    {\n        conditions << QSOFilterManager::getWhereClause(ui->userFilterCombo->currentText());\n    }\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n    {\n        conditions << \"(datetime(start_time) BETWEEN datetime(:start_date) AND datetime(:end_date))\";\n    }\n\n    QString sql = QString(\"SELECT UPPER(station_callsign) as cs, COUNT(*) as cnt \"\n                          \"FROM contacts WHERE %1 AND station_callsign IS NOT NULL \"\n                          \"AND station_callsign != '' \"\n                          \"GROUP BY cs ORDER BY cnt DESC\")\n                      .arg(conditions.join(\" AND \"));\n\n    QSqlQuery query;\n    if ( query.prepare(sql) )\n    {\n        if ( ui->dateRangeCheckBox->isChecked() )\n        {\n            query.bindValue(\":start_date\", ui->startDateEdit->dateTime().toUTC());\n            query.bindValue(\":end_date\", ui->endDateEdit->dateTime().toUTC());\n        }\n\n        if ( query.exec() )\n        {\n            while ( query.next() )\n                ui->callsignCombo->addItem(query.value(0).toString());\n        }\n        else\n        {\n            qCWarning(runtime) << query.lastError().text();\n        }\n    }\n\n    if ( !previousCallsign.isEmpty() )\n    {\n        int idx = ui->callsignCombo->findText(previousCallsign);\n        if ( idx >= 0 )\n            ui->callsignCombo->setCurrentIndex(idx);\n    }\n\n    ui->callsignCombo->blockSignals(false);\n\n    if ( ui->callsignCombo->count() > 0 )\n        callsignChanged(ui->callsignCombo->currentText());\n\n    scheduleQsoCountUpdate();\n}\n\nvoid CabrilloExportDialog::callsignChanged(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << callsign;\n\n    ui->operatorsEdit->setText(callsign);\n    loadStationProfile(callsign);\n    scheduleQsoCountUpdate();\n}\n\nvoid CabrilloExportDialog::scheduleQsoCountUpdate()\n{\n    FCT_IDENTIFICATION;\n\n    countDebounceTimer->start();\n}\n\nvoid CabrilloExportDialog::updateQsoCount()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->callsignCombo->currentText().isEmpty() )\n    {\n        ui->qsoCountLabel->setText(tr(\"QSO(s): %1\").arg(0));\n        return;\n    }\n\n    resolveBandFilter();\n\n    const QString sql = QString(\"SELECT COUNT(*) FROM contacts WHERE %1\").arg(buildWhereClause());\n\n    qCDebug(runtime) << sql;\n\n    QSqlQuery query;\n    if ( !query.prepare(sql) )\n    {\n        ui->qsoCountLabel->setText(tr(\"QSOs: ?\"));\n        return;\n    }\n\n    bindWhereClause(query);\n\n    if ( query.exec() && query.next() )\n        ui->qsoCountLabel->setText(tr(\"QSO(s): %1\").arg(query.value(0).toInt()));\n    else\n        ui->qsoCountLabel->setText(tr(\"QSOs: ?\"));\n}\n\nvoid CabrilloExportDialog::resolveBandFilter()\n{\n    FCT_IDENTIFICATION;\n\n    bandFilterActive = false;\n    const QString selectedBand = ui->catBandCombo->currentData().toString();\n\n    if ( selectedBand == CabrilloFormat::BAND_ALL\n         || selectedBand == CabrilloFormat::BAND_VHF_3_BAND\n         || selectedBand == CabrilloFormat::BAND_VHF_FM_ONLY\n         || selectedBand == CabrilloFormat::BAND_LIGHT )\n    {\n        return;\n    }\n\n    // Cabrillo VHF/UHF designators use different naming than QLog bands table\n    static const QMap<QString, QString> cabrilloToBandName =\n    {\n        {CabrilloFormat::BAND_222,  \"1.25m\"},\n        {CabrilloFormat::BAND_432,  \"70cm\"},\n        {CabrilloFormat::BAND_902,  \"33cm\"},\n        {CabrilloFormat::BAND_1_2G, \"23cm\"}\n    };\n\n    const QString bandName = cabrilloToBandName.value(selectedBand, selectedBand);\n    const Band band = BandPlan::bandName2Band(bandName);\n\n    if ( !band.name.isEmpty() )\n    {\n        bandStartFreq = band.start;\n        bandEndFreq = band.end;\n        bandFilterActive = true;\n    }\n}\n\nvoid CabrilloExportDialog::loadStationProfile(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << callsign;\n\n    ui->nameValue->clear();\n    ui->addressEdit->clear();\n    ui->gridLocatorEdit->clear();\n\n    if ( callsign.isEmpty() )\n        return;\n\n    const StationProfile profile = StationProfilesManager::instance()->findByCallsign(callsign);\n    if ( !profile.callsign.isEmpty() )\n    {\n        ui->nameValue->setText(profile.operatorName);\n        ui->addressEdit->setPlainText(profile.qthName);\n        ui->gridLocatorEdit->setText(profile.locator);\n    }\n}\n\nCabrilloFormat::HeaderData CabrilloExportDialog::buildHeaderData() const\n{\n    FCT_IDENTIFICATION;\n\n    CabrilloFormat::HeaderData data;\n\n    data.callsign = ui->callsignCombo->currentText();\n    data.operatorName = ui->nameValue->text();\n    data.email = ui->emailEdit->text();\n    data.operators = ui->operatorsEdit->text();\n    data.address = ui->addressEdit->toPlainText().trimmed();\n    data.gridLocator = ui->gridLocatorEdit->text();\n\n    data.categoryOperator = ui->catOperatorCombo->currentData().toString();\n    data.categoryBand = ui->catBandCombo->currentData().toString();\n    data.categoryPower = ui->catPowerCombo->currentData().toString();\n    data.categoryMode = ui->catModeCombo->currentData().toString();\n    data.categoryAssisted = ui->catAssistedCombo->currentData().toString();\n    data.categoryStation = ui->catStationCombo->currentData().toString();\n    data.categoryTransmitter = ui->catTransmitterCombo->currentData().toString();\n    data.categoryTime = ui->catTimeCombo->currentData().toString();\n    data.categoryOverlay = ui->catOverlayCombo->currentData().toString();\n\n    data.location = ui->locationEdit->text();\n    data.club = ui->clubEdit->text();\n    data.offtime = ui->offtimeEdit->toPlainText().trimmed();\n    data.soapbox = ui->soapboxEdit->toPlainText().trimmed();\n\n    return data;\n}\n\nQString CabrilloExportDialog::buildWhereClause() const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList conditions;\n    conditions << \"UPPER(station_callsign) = UPPER(:callsign)\";\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n        conditions << \"(datetime(start_time) BETWEEN datetime(:export_start_date) AND datetime(:export_end_date))\";\n\n    if ( ui->userFilterCheckBox->isChecked()\n         && !ui->userFilterCombo->currentText().isEmpty() )\n    {\n        conditions << QSOFilterManager::getWhereClause(ui->userFilterCombo->currentText());\n    }\n\n    if ( bandFilterActive )\n        conditions << \"freq BETWEEN :band_start_freq AND :band_end_freq\";\n\n    const QString selectedMode = ui->catModeCombo->currentData().toString();\n    if ( selectedMode != CabrilloFormat::MODE_MIXED )\n    {\n        if ( selectedMode == CabrilloFormat::MODE_DIGI )\n            conditions << \"mode IN (SELECT name FROM modes WHERE dxcc = 'DIGITAL')\";\n        else\n            conditions << \"UPPER(mode) = UPPER(:export_mode)\";\n    }\n\n    return conditions.join(\" AND \");\n}\n\nvoid CabrilloExportDialog::bindWhereClause(QSqlQuery &query) const\n{\n    FCT_IDENTIFICATION;\n\n    query.bindValue(\":callsign\", ui->callsignCombo->currentText());\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n    {\n        query.bindValue(\":export_start_date\", ui->startDateEdit->dateTime().toUTC());\n        query.bindValue(\":export_end_date\", ui->endDateEdit->dateTime().toUTC());\n    }\n\n    if ( bandFilterActive )\n    {\n        query.bindValue(\":band_start_freq\", bandStartFreq);\n        query.bindValue(\":band_end_freq\", bandEndFreq);\n    }\n\n    const QString selectedMode = ui->catModeCombo->currentData().toString();\n\n    if ( selectedMode != CabrilloFormat::MODE_MIXED && selectedMode != CabrilloFormat::MODE_DIGI )\n        query.bindValue(\":export_mode\", selectedMode);\n}\n\nvoid CabrilloExportDialog::accept()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->templateCombo->currentIndex() < 0 )\n    {\n        QMessageBox::warning(this, tr(\"QLog Warning\"),\n                             tr(\"Please select a contest template.\"));\n        return;\n    }\n\n    if ( ui->fileEdit->text().isEmpty() )\n    {\n        QMessageBox::warning(this, tr(\"QLog Warning\"),\n                             tr(\"Please select an output file.\"));\n        return;\n    }\n\n    if ( ui->callsignCombo->currentText().isEmpty() )\n    {\n        QMessageBox::warning(this, tr(\"QLog Warning\"),\n                             tr(\"No callsign available. Check your filters.\"));\n        return;\n    }\n\n    resolveBandFilter();\n\n    const QString whereClause = buildWhereClause();\n    QString sql = QString(\"SELECT * FROM contacts WHERE %1 ORDER BY start_time ASC\").arg(whereClause);\n\n    qCDebug(runtime) << sql;\n\n    QSqlQuery query;\n    if ( !query.prepare(sql) )\n    {\n        qCWarning(runtime) << \"Failed to prepare export query:\" << query.lastError().text();\n        QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Failed to prepare export query.\"));\n        return;\n    }\n    bindWhereClause(query);\n\n    if ( !query.exec() )\n    {\n        qCWarning(runtime) << \"Failed to execute export query:\" << query.lastError().text();\n        QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Failed to query QSOs for export.\"));\n        return;\n    }\n\n    QList<QSqlRecord> records;\n    while ( query.next() )\n        records.append(query.record());\n\n    QFile file(ui->fileEdit->text());\n    if ( !file.open(QIODevice::WriteOnly | QIODevice::Text) )\n    {\n        QMessageBox::critical(this, tr(\"QLog Error\"),\n                              tr(\"Cannot open file %1 for writing.\").arg(ui->fileEdit->text()));\n        return;\n    }\n\n    QTextStream stream(&file);\n    CabrilloFormat format(stream);\n    format.setTemplateId(ui->templateCombo->currentData().toInt());\n    format.setHeaderData(buildHeaderData());\n    format.setTransmitterId(ui->transmitterIdSpin->value());\n\n    QProgressDialog progress(tr(\"Exporting Cabrillo...\"), QString(), 0, 100, this);\n    progress.setWindowModality(Qt::WindowModal);\n    progress.setMinimumDuration(0);\n\n    connect(&format, &CabrilloFormat::exportProgress, this, [&progress](float pct) {\n        progress.setValue(static_cast<int>(pct));\n    });\n\n    long count = format.runExport(records);\n\n    file.close();\n    progress.close();\n\n    QMessageBox::information(this, tr(\"QLog Information\"),\n                             tr(\"Exported %n QSO(s) to Cabrillo file.\", \"\", count));\n\n    QDialog::accept();\n}\n"
  },
  {
    "path": "ui/CabrilloExportDialog.h",
    "content": "#ifndef QLOG_UI_CABRILLOEXPORTDIALOG_H\n#define QLOG_UI_CABRILLOEXPORTDIALOG_H\n\n#include <QDialog>\n#include \"logformat/CabrilloFormat.h\"\n\nclass QSqlQuery;\nclass QTimer;\n\nnamespace Ui {\nclass CabrilloExportDialog;\n}\n\nclass CabrilloExportDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit CabrilloExportDialog(QWidget *parent = nullptr);\n    ~CabrilloExportDialog();\n\nprivate slots:\n    void accept() override;\n    void templateChanged(int index);\n    void manageTemplates();\n    void browseFile();\n    void callsignChanged(const QString &callsign);\n    void refreshCallsigns();\n    void updateQsoCount();\n    void scheduleQsoCountUpdate();\n\nprivate:\n    void loadTemplates();\n    void loadStationProfile(const QString &callsign);\n    void resolveBandFilter();\n    CabrilloFormat::HeaderData buildHeaderData() const;\n    QString buildWhereClause() const;\n    void bindWhereClause(QSqlQuery &query) const;\n\n    Ui::CabrilloExportDialog *ui;\n    QTimer *countDebounceTimer;\n    double bandStartFreq;\n    double bandEndFreq;\n    bool bandFilterActive;\n};\n\n#endif // QLOG_UI_CABRILLOEXPORTDIALOG_H\n"
  },
  {
    "path": "ui/CabrilloExportDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CabrilloExportDialog</class>\n <widget class=\"QDialog\" name=\"CabrilloExportDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>700</width>\n    <height>691</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Cabrillo Export</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"mainLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"fileLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"fileLabel\">\n       <property name=\"text\">\n        <string>File:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"fileEdit\">\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"browseButton\">\n       <property name=\"text\">\n        <string>Browse</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"folder-open\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"contestGroup\">\n     <property name=\"title\">\n      <string>Contest</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"contestFormLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"templateLabel\">\n        <property name=\"text\">\n         <string>Format Template:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n        <property name=\"bottomMargin\">\n         <number>0</number>\n        </property>\n        <item>\n         <widget class=\"QComboBox\" name=\"templateCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"manageTemplatesButton\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string>Manage</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"preferences-system\">\n            <normaloff>.</normaloff>.</iconset>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"userFilterCheckBox\">\n        <property name=\"text\">\n         <string>User Filter:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"userFilterCombo\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"dateRangeCheckBox\">\n        <property name=\"text\">\n         <string>Date/Time:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"dateRangeLayout\">\n        <item>\n         <widget class=\"QDateTimeEdit\" name=\"startDateEdit\">\n          <property name=\"enabled\">\n           <bool>false</bool>\n          </property>\n          <property name=\"displayFormat\">\n           <string>yyyy-MM-dd HH:mm</string>\n          </property>\n          <property name=\"calendarPopup\">\n           <bool>true</bool>\n          </property>\n          <property name=\"timeSpec\">\n           <enum>Qt::UTC</enum>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"dateRangeSeparator\">\n          <property name=\"text\">\n           <string> - </string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QDateTimeEdit\" name=\"endDateEdit\">\n          <property name=\"enabled\">\n           <bool>false</bool>\n          </property>\n          <property name=\"displayFormat\">\n           <string>yyyy-MM-dd HH:mm</string>\n          </property>\n          <property name=\"calendarPopup\">\n           <bool>true</bool>\n          </property>\n          <property name=\"timeSpec\">\n           <enum>Qt::UTC</enum>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"utcLabel\">\n          <property name=\"text\">\n           <string>UTC</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"dateRangeSpacer\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>0</width>\n            <height>0</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"middleHLayout\">\n     <item>\n      <widget class=\"QGroupBox\" name=\"stationCategoryGroup\">\n       <property name=\"title\">\n        <string>Station &amp; Categories</string>\n       </property>\n       <layout class=\"QFormLayout\" name=\"stationCategoryFormLayout\">\n        <item row=\"0\" column=\"0\">\n         <widget class=\"QLabel\" name=\"callsignLabel\">\n          <property name=\"text\">\n           <string>Callsign:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"0\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"callsignCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"0\">\n         <widget class=\"QLabel\" name=\"operatorsLabel\">\n          <property name=\"text\">\n           <string>Operators:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"operatorsEdit\"/>\n        </item>\n        <item row=\"2\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catBandLabel\">\n          <property name=\"text\">\n           <string>Band:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"2\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catBandCombo\"/>\n        </item>\n        <item row=\"3\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catModeLabel\">\n          <property name=\"text\">\n           <string>Mode:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catModeCombo\"/>\n        </item>\n        <item row=\"4\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catPowerLabel\">\n          <property name=\"text\">\n           <string>Power:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"4\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catPowerCombo\"/>\n        </item>\n        <item row=\"5\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catOperatorLabel\">\n          <property name=\"text\">\n           <string>Operator:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"5\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catOperatorCombo\"/>\n        </item>\n        <item row=\"6\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catAssistedLabel\">\n          <property name=\"text\">\n           <string>Assisted:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"6\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catAssistedCombo\"/>\n        </item>\n        <item row=\"7\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catStationLabel\">\n          <property name=\"text\">\n           <string>Station:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"7\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catStationCombo\"/>\n        </item>\n        <item row=\"8\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catTransmitterLabel\">\n          <property name=\"text\">\n           <string>Transmitter:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"8\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catTransmitterCombo\"/>\n        </item>\n        <item row=\"9\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catTimeLabel\">\n          <property name=\"text\">\n           <string>Time:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"9\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catTimeCombo\"/>\n        </item>\n        <item row=\"10\" column=\"0\">\n         <widget class=\"QLabel\" name=\"catOverlayLabel\">\n          <property name=\"text\">\n           <string>Overlay:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"10\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"catOverlayCombo\"/>\n        </item>\n        <item row=\"11\" column=\"0\">\n         <widget class=\"QLabel\" name=\"transmitterIdLabel\">\n          <property name=\"text\">\n           <string>Transmitter ID:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"11\" column=\"1\">\n         <widget class=\"QSpinBox\" name=\"transmitterIdSpin\">\n          <property name=\"enabled\">\n           <bool>false</bool>\n          </property>\n          <property name=\"minimum\">\n           <number>0</number>\n          </property>\n          <property name=\"maximum\">\n           <number>1</number>\n          </property>\n          <property name=\"value\">\n           <number>0</number>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QGroupBox\" name=\"additionalGroup\">\n       <property name=\"title\">\n        <string>Additional</string>\n       </property>\n       <layout class=\"QFormLayout\" name=\"additionalFormLayout\">\n        <item row=\"0\" column=\"0\">\n         <widget class=\"QLabel\" name=\"nameLabel\">\n          <property name=\"text\">\n           <string>Name:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"0\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"nameValue\"/>\n        </item>\n        <item row=\"1\" column=\"0\">\n         <widget class=\"QLabel\" name=\"emailLabel\">\n          <property name=\"text\">\n           <string>Email:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"emailEdit\"/>\n        </item>\n        <item row=\"2\" column=\"0\">\n         <widget class=\"QLabel\" name=\"addressLabel\">\n          <property name=\"text\">\n           <string>Address:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"2\" column=\"1\">\n         <widget class=\"QTextEdit\" name=\"addressEdit\">\n          <property name=\"maximumSize\">\n           <size>\n            <width>16777215</width>\n            <height>80</height>\n           </size>\n          </property>\n          <property name=\"placeholderText\">\n           <string>Max 6 lines</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"0\">\n         <widget class=\"QLabel\" name=\"gridLocatorLabel\">\n          <property name=\"text\">\n           <string>Gridsquare</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"gridLocatorEdit\"/>\n        </item>\n        <item row=\"4\" column=\"0\">\n         <widget class=\"QLabel\" name=\"locationLabel\">\n          <property name=\"text\">\n           <string>Location:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"4\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"locationEdit\"/>\n        </item>\n        <item row=\"5\" column=\"0\">\n         <widget class=\"QLabel\" name=\"clubLabel\">\n          <property name=\"text\">\n           <string>Club:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"5\" column=\"1\">\n         <widget class=\"QLineEdit\" name=\"clubEdit\"/>\n        </item>\n        <item row=\"6\" column=\"0\">\n         <widget class=\"QLabel\" name=\"soapboxLabel\">\n          <property name=\"text\">\n           <string>Soapbox:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"6\" column=\"1\">\n         <widget class=\"QTextEdit\" name=\"soapboxEdit\">\n          <property name=\"maximumSize\">\n           <size>\n            <width>16777215</width>\n            <height>60</height>\n           </size>\n          </property>\n         </widget>\n        </item>\n        <item row=\"7\" column=\"0\">\n         <widget class=\"QLabel\" name=\"offtimeLabel\">\n          <property name=\"text\">\n           <string>Off-Time:</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"7\" column=\"1\">\n         <widget class=\"QTextEdit\" name=\"offtimeEdit\">\n          <property name=\"maximumSize\">\n           <size>\n            <width>16777215</width>\n            <height>60</height>\n           </size>\n          </property>\n          <property name=\"toolTip\">\n           <string>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</string>\n          </property>\n          <property name=\"placeholderText\">\n           <string>yyyy-mm-dd hhmm yyyy-mm-dd hhmm</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"bottomLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"qsoCountLabel\">\n       <property name=\"font\">\n        <font>\n         <bold>true</bold>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\">QSOs: ---</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"bottomSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>0</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>fileEdit</tabstop>\n  <tabstop>browseButton</tabstop>\n  <tabstop>templateCombo</tabstop>\n  <tabstop>manageTemplatesButton</tabstop>\n  <tabstop>userFilterCheckBox</tabstop>\n  <tabstop>userFilterCombo</tabstop>\n  <tabstop>dateRangeCheckBox</tabstop>\n  <tabstop>startDateEdit</tabstop>\n  <tabstop>endDateEdit</tabstop>\n  <tabstop>callsignCombo</tabstop>\n  <tabstop>operatorsEdit</tabstop>\n  <tabstop>catBandCombo</tabstop>\n  <tabstop>catModeCombo</tabstop>\n  <tabstop>catPowerCombo</tabstop>\n  <tabstop>catOperatorCombo</tabstop>\n  <tabstop>catAssistedCombo</tabstop>\n  <tabstop>catStationCombo</tabstop>\n  <tabstop>catTransmitterCombo</tabstop>\n  <tabstop>catTimeCombo</tabstop>\n  <tabstop>catOverlayCombo</tabstop>\n  <tabstop>transmitterIdSpin</tabstop>\n  <tabstop>nameValue</tabstop>\n  <tabstop>emailEdit</tabstop>\n  <tabstop>addressEdit</tabstop>\n  <tabstop>gridLocatorEdit</tabstop>\n  <tabstop>locationEdit</tabstop>\n  <tabstop>clubEdit</tabstop>\n  <tabstop>soapboxEdit</tabstop>\n  <tabstop>offtimeEdit</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>500</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>500</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>browseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>browseFile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>530</x>\n     <y>30</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>manageTemplatesButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>manageTemplates()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>450</x>\n     <y>90</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>templateCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>templateChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>350</x>\n     <y>65</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>callsignChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>200</x>\n     <y>160</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>userFilterCombo</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>350</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>refreshCallsigns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>refreshCallsigns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>350</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateRangeCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>startDateEdit</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>280</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>280</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateRangeCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>endDateEdit</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>280</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>400</x>\n     <y>280</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateRangeCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>refreshCallsigns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>280</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>startDateEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>refreshCallsigns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>200</x>\n     <y>280</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>endDateEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>refreshCallsigns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>400</x>\n     <y>280</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>catBandCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>scheduleQsoCountUpdate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>200</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>catModeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>CabrilloExportDialog</receiver>\n   <slot>scheduleQsoCountUpdate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>450</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>290</x>\n     <y>260</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>templateChanged(int)</slot>\n  <slot>manageTemplates()</slot>\n  <slot>browseFile()</slot>\n  <slot>callsignChanged(QString)</slot>\n  <slot>refreshCallsigns()</slot>\n  <slot>scheduleQsoCountUpdate()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/CabrilloTemplateDialog.cpp",
    "content": "#include \"CabrilloTemplateDialog.h\"\n#include \"ui_CabrilloTemplateDialog.h\"\n\n#include <QSqlDatabase>\n#include <QSqlQuery>\n#include <QSqlRecord>\n#include <QSqlError>\n#include <QMessageBox>\n#include <QComboBox>\n#include <QSpinBox>\n#include <QLineEdit>\n#include <QTableWidgetItem>\n#include <QListWidgetItem>\n#include <QHeaderView>\n#include <QEvent>\n#include <algorithm>\n#include <QFileDialog>\n#include <QSettings>\n#include <QStandardPaths>\n\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"models/LogbookModel.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.cabrillotemplatedialog\");\n\nCabrilloTemplateDialog::CabrilloTemplateDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::CabrilloTemplateDialog),\n    currentTemplateIndex(-1)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    // Left panel (template list) stays compact, right panel (editor) expands\n    ui->mainHLayout->setStretch(0, 0);\n    ui->mainHLayout->setStretch(1, 1);\n\n    // Columns table: auto-size columns to content\n    QHeaderView *hdr = ui->columnsTable->horizontalHeader();\n    hdr->setSectionResizeMode(QHeaderView::ResizeToContents);\n\n    // Populate available DB fields with translated names\n    QSqlRecord contactsRecord = QSqlDatabase::database().record(\"contacts\");\n\n    for ( int i = LogbookModel::ColumnID::COLUMN_ID; i < LogbookModel::ColumnID::COLUMN_LAST_ELEMENT; ++i )\n    {\n        LogbookModel::ColumnID columnID = static_cast<LogbookModel::ColumnID>(i);\n        const QString translation = LogbookModel::getFieldNameTranslation(columnID);\n        if ( translation.isEmpty() )\n            continue;\n\n        const QString dbField = contactsRecord.fieldName(i);\n        if ( dbField.isEmpty() )\n            continue;\n\n        dbFieldItems.append({dbField, translation});\n    }\n\n    std::sort(dbFieldItems.begin(), dbFieldItems.end(),\n              [](const CabrilloFormat::CategoryItem &a,\n                 const CabrilloFormat::CategoryItem &b)\n    {\n        return a.label.localeAwareCompare(b.label) < 0;\n    });\n\n    formatterItems = CabrilloFormat::formatterTypes();\n\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>>(CabrilloFormat::modeCategories()) )\n        ui->defaultModeCombo->addItem(item.label, item.value);\n\n    populateContestCombo();\n\n    connect(ui->nameEdit, &QLineEdit::textChanged, this, [this](const QString &text)\n    {\n        QListWidgetItem *item = ui->templateList->currentItem();\n        if ( item && currentTemplateIndex >= 0\n             && currentTemplateIndex < templates.size() )\n            item->setText(text);\n    });\n\n    loadTemplatesFromDB();\n    populateTemplateList();\n\n    if ( !templates.isEmpty() )\n        ui->templateList->setCurrentRow(0);\n\n    // Calculate dialog width so the columns table fits without horizontal scrollbar\n    int tableWidth = hdr->length() + ui->columnsTable->frameWidth() * 2;\n    int leftPanelWidth = ui->leftLayout->sizeHint().width();\n    QMargins m = ui->mainHLayout->contentsMargins();\n    int needed = m.left() + m.right()\n               + ui->mainHLayout->spacing()\n               + leftPanelWidth + tableWidth;\n\n    resize(qMax(needed, width()), height());\n\n    // After sizing, let last column stretch when user resizes the dialog\n    hdr->setSectionResizeMode(hdr->count() - 1, QHeaderView::Stretch);\n}\n\nCabrilloTemplateDialog::~CabrilloTemplateDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nvoid CabrilloTemplateDialog::installWheelGuard(QWidget *widget)\n{\n    widget->setFocusPolicy(Qt::StrongFocus);\n    widget->installEventFilter(this);\n}\n\n// Prevent mouse wheel from changing combo/spin values while scrolling the table;\n// wheel events are only handled when the widget has focus (after clicking on it)\nbool CabrilloTemplateDialog::eventFilter(QObject *obj, QEvent *event)\n{\n    if ( event->type() == QEvent::Wheel )\n    {\n        QWidget *widget = qobject_cast<QWidget *>(obj);\n        if ( widget && !widget->hasFocus() )\n        {\n            event->ignore();\n            return true;\n        }\n    }\n    return QDialog::eventFilter(obj, event);\n}\n\nvoid CabrilloTemplateDialog::selectTemplate(int templateId)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << templateId;\n\n    for ( int i = 0; i < ui->templateList->count(); i++ )\n    {\n        int idx = ui->templateList->item(i)->data(Qt::UserRole).toInt();\n        if ( idx >= 0 && idx < templates.size()\n             && templates[idx].id == templateId )\n        {\n            ui->templateList->setCurrentRow(i);\n            return;\n        }\n    }\n}\n\nvoid CabrilloTemplateDialog::populateContestCombo()\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList contests = Data::instance()->contestList();\n    for ( const QString &name : contests )\n        ui->contestCombo->addItem(name);\n}\n\nvoid CabrilloTemplateDialog::loadTemplatesFromDB()\n{\n    FCT_IDENTIFICATION;\n\n    templates.clear();\n\n    const QList<CabrilloFormat::TemplateInfo> infoList = CabrilloFormat::templateList();\n    for ( const CabrilloFormat::TemplateInfo &info : infoList )\n    {\n        TemplateData tmpl;\n        tmpl.id = info.id;\n        tmpl.name = info.name;\n        tmpl.contestName = info.contestName;\n        tmpl.defaultMode = info.defaultCategoryMode;\n        tmpl.columns = CabrilloFormat::loadTemplateColumns(info.id);\n        tmpl.isNew = false;\n        tmpl.isModified = false;\n        tmpl.isDeleted = false;\n        templates.append(tmpl);\n    }\n}\n\nvoid CabrilloTemplateDialog::populateTemplateList()\n{\n    FCT_IDENTIFICATION;\n\n    ui->templateList->clear();\n\n    for ( int i = 0; i < templates.size(); i++ )\n    {\n        const TemplateData &tmpl = templates[i];\n        if ( tmpl.isDeleted )\n            continue;\n\n        QListWidgetItem *item = new QListWidgetItem(tmpl.name, ui->templateList);\n        item->setData(Qt::UserRole, i);\n    }\n}\n\nvoid CabrilloTemplateDialog::templateSelectionChanged()\n{\n    FCT_IDENTIFICATION;\n\n    // Save current template before switching\n    if ( currentTemplateIndex >= 0 && currentTemplateIndex < templates.size() )\n        saveCurrentTemplate();\n\n    QListWidgetItem *item = ui->templateList->currentItem();\n    if ( !item )\n    {\n        currentTemplateIndex = -1;\n        return;\n    }\n\n    currentTemplateIndex = item->data(Qt::UserRole).toInt();\n    showTemplateEditor(currentTemplateIndex);\n}\n\nvoid CabrilloTemplateDialog::showTemplateEditor(int index)\n{\n    FCT_IDENTIFICATION;\n\n    if ( index < 0 || index >= templates.size() )\n        return;\n\n    const TemplateData &tmpl = templates[index];\n\n    ui->nameEdit->setText(tmpl.name);\n\n    int cidIdx = ui->contestCombo->findText(tmpl.contestName);\n\n    if ( cidIdx >= 0 )\n        ui->contestCombo->setCurrentIndex(cidIdx);\n    else\n        ui->contestCombo->setEditText(tmpl.contestName);\n\n    int modeIdx = ui->defaultModeCombo->findData(tmpl.defaultMode);\n\n    if ( modeIdx >= 0 )\n        ui->defaultModeCombo->setCurrentIndex(modeIdx);\n\n    populateColumnsTable(tmpl.columns);\n}\n\nvoid CabrilloTemplateDialog::populateColumnsTable(const QList<CabrilloFormat::ColumnDef> &columns)\n{\n    FCT_IDENTIFICATION;\n\n    ui->columnsTable->setRowCount(0);\n    ui->columnsTable->setRowCount(columns.size());\n\n    for ( int row = 0; row < columns.size(); row++ )\n        setupColumnRow(row, columns[row]);\n\n    ui->columnsTable->resizeColumnsToContents();\n}\n\nvoid CabrilloTemplateDialog::setupColumnRow(int row, const CabrilloFormat::ColumnDef &col)\n{\n    FCT_IDENTIFICATION;\n\n    // Position (read-only)\n    QTableWidgetItem *posItem = new QTableWidgetItem(QString::number(col.position));\n    posItem->setFlags(posItem->flags() & ~Qt::ItemIsEditable);\n    ui->columnsTable->setItem(row, 0, posItem);\n\n    // DB Field (ComboBox with translated names)\n    QComboBox *fieldCombo = new QComboBox(this);\n    installWheelGuard(fieldCombo);\n    fieldCombo->addItem(QString(), QLatin1String(\"\")); // empty entry for non-DB fields\n    for ( const CabrilloFormat::CategoryItem &item : static_cast<const QList<CabrilloFormat::CategoryItem>&>(dbFieldItems) )\n        fieldCombo->addItem(item.label, item.value);\n\n    int fieldIdx = fieldCombo->findData(col.dbField);\n\n    if ( fieldIdx >= 0 )\n        fieldCombo->setCurrentIndex(fieldIdx);\n\n    ui->columnsTable->setCellWidget(row, 1, fieldCombo);\n\n    // Formatter (ComboBox)\n    QComboBox *fmtCombo = new QComboBox(this);\n    installWheelGuard(fmtCombo);\n    for ( const CabrilloFormat::CategoryItem &fmt : static_cast<const QList<CabrilloFormat::CategoryItem>&>(formatterItems) )\n        fmtCombo->addItem(fmt.label, fmt.value);\n\n    int fmtIdx = fmtCombo->findData(col.formatter);\n\n    if ( fmtIdx >= 0 )\n        fmtCombo->setCurrentIndex(fmtIdx);\n\n    ui->columnsTable->setCellWidget(row, 2, fmtCombo);\n\n    // Width (SpinBox)\n    QSpinBox *widthSpin = new QSpinBox(this);\n    installWheelGuard(widthSpin);\n    widthSpin->setRange(1, 30);\n    widthSpin->setValue(col.width);\n    ui->columnsTable->setCellWidget(row, 3, widthSpin);\n\n    // Label (QLineEdit)\n    QLineEdit *labelEdit = new QLineEdit(col.label, this);\n    ui->columnsTable->setCellWidget(row, 4, labelEdit);\n\n    // Auto-adjust fields when Transmitter ID formatter is selected\n    auto applyTransmitterIdDefaults = [fieldCombo, widthSpin, labelEdit](const QString &fmtValue)\n    {\n        bool isTxId = (fmtValue == CabrilloFormat::FMT_TRANSMITTER_ID);\n        fieldCombo->setEnabled(!isTxId);\n        if ( isTxId )\n        {\n            fieldCombo->setCurrentIndex(0); // empty\n            widthSpin->setValue(1);\n            labelEdit->setText(\"t\");\n        }\n    };\n\n    connect(fmtCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),\n            this, [fmtCombo, applyTransmitterIdDefaults](int)\n    {\n        applyTransmitterIdDefaults(fmtCombo->currentData().toString());\n    });\n\n    // Apply defaults for initially loaded transmitter_id columns\n    applyTransmitterIdDefaults(col.formatter);\n}\n\nQList<CabrilloFormat::ColumnDef> CabrilloTemplateDialog::readColumnsFromTable() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<CabrilloFormat::ColumnDef> columns;\n\n    for ( int row = 0; row < ui->columnsTable->rowCount(); row++ )\n    {\n        CabrilloFormat::ColumnDef col;\n        col.position = row + 1;\n\n        QComboBox *fieldCombo = qobject_cast<QComboBox *>(ui->columnsTable->cellWidget(row, 1));\n        col.dbField = fieldCombo ? fieldCombo->currentData().toString() : QLatin1String(\"\");\n\n        QComboBox *fmtCombo = qobject_cast<QComboBox *>(ui->columnsTable->cellWidget(row, 2));\n        col.formatter = fmtCombo ? fmtCombo->currentData().toString() : \"\";\n\n        QSpinBox *widthSpin = qobject_cast<QSpinBox *>(ui->columnsTable->cellWidget(row, 3));\n        col.width = widthSpin ? widthSpin->value() : 5;\n\n        QLineEdit *labelEdit = qobject_cast<QLineEdit *>(ui->columnsTable->cellWidget(row, 4));\n        col.label = labelEdit ? labelEdit->text() : \"\";\n\n        columns.append(col);\n    }\n\n    return columns;\n}\n\nvoid CabrilloTemplateDialog::saveCurrentTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentTemplateIndex < 0 || currentTemplateIndex >= templates.size() )\n        return;\n\n    TemplateData &tmpl = templates[currentTemplateIndex];\n\n    tmpl.name = ui->nameEdit->text();\n    tmpl.contestName = ui->contestCombo->currentText();\n    tmpl.defaultMode = ui->defaultModeCombo->currentData().toString();\n    tmpl.columns = readColumnsFromTable();\n    tmpl.isModified = true;\n}\n\nvoid CabrilloTemplateDialog::newTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    TemplateData tmpl;\n    tmpl.id = -1;\n    tmpl.name = tr(\"New Template\");\n    tmpl.defaultMode = CabrilloFormat::MODE_CW;\n    tmpl.isNew = true;\n    tmpl.isModified = true;\n    tmpl.isDeleted = false;\n\n    // Default columns (common prefix)\n    tmpl.columns =\n    {\n        {1, \"freq\",       5,  CabrilloFormat::FMT_FREQ_KHZ,         \"Freq\"},\n        {2, \"mode\",       2,  CabrilloFormat::FMT_MODE_CABRILLO,    \"Mode\"},\n        {3, \"start_time\", 10, CabrilloFormat::FMT_DATE_YYYY_MM_DD,  \"Date\"},\n        {4, \"start_time\", 4,  CabrilloFormat::FMT_TIME_HHMM,        \"Time\"},\n    };\n\n    templates.append(tmpl);\n    populateTemplateList();\n    ui->templateList->setCurrentRow(ui->templateList->count() - 1);\n}\n\nvoid CabrilloTemplateDialog::copyTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentTemplateIndex < 0 || currentTemplateIndex >= templates.size() )\n        return;\n\n    // Save current state first\n    saveCurrentTemplate();\n\n    const TemplateData &src = templates[currentTemplateIndex];\n\n    TemplateData tmpl;\n    tmpl.id = -1;\n    tmpl.name = tr(\"Copy - %1\").arg(src.name);\n    tmpl.contestName = src.contestName;\n    tmpl.defaultMode = src.defaultMode;\n    tmpl.columns = src.columns;\n    tmpl.isNew = true;\n    tmpl.isModified = true;\n    tmpl.isDeleted = false;\n\n    templates.append(tmpl);\n    populateTemplateList();\n    ui->templateList->setCurrentRow(ui->templateList->count() - 1);\n}\n\nvoid CabrilloTemplateDialog::deleteTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentTemplateIndex < 0 || currentTemplateIndex >= templates.size() )\n        return;\n\n    TemplateData &tmpl = templates[currentTemplateIndex];\n\n    int ret = QMessageBox::question(this, tr(\"Delete Template\"),\n                                    tr(\"Delete template '%1'?\").arg(tmpl.name),\n                                    QMessageBox::Yes | QMessageBox::No);\n    if ( ret != QMessageBox::Yes )\n        return;\n\n    tmpl.isDeleted = true;\n    currentTemplateIndex = -1;\n    populateTemplateList();\n\n    if ( ui->templateList->count() > 0 )\n        ui->templateList->setCurrentRow(0);\n}\n\nvoid CabrilloTemplateDialog::addColumn()\n{\n    FCT_IDENTIFICATION;\n\n    int row = ui->columnsTable->rowCount();\n    ui->columnsTable->setRowCount(row + 1);\n\n    CabrilloFormat::ColumnDef col;\n    col.position = row + 1;\n    col.dbField = \"callsign\";\n    col.width = 13;\n\n    setupColumnRow(row, col);\n    ui->columnsTable->scrollToItem(ui->columnsTable->item(row, 0));\n    ui->columnsTable->setCurrentCell(row, 0);\n}\n\nvoid CabrilloTemplateDialog::removeColumn()\n{\n    FCT_IDENTIFICATION;\n\n    int row = ui->columnsTable->currentRow();\n    if ( row < 0 )\n        return;\n\n    ui->columnsTable->removeRow(row);\n\n    // Renumber positions\n    for ( int i = 0; i < ui->columnsTable->rowCount(); i++ )\n    {\n        QTableWidgetItem *posItem = ui->columnsTable->item(i, 0);\n        if ( posItem )\n            posItem->setText(QString::number(i + 1));\n    }\n}\n\nvoid CabrilloTemplateDialog::moveColumnUp()\n{\n    FCT_IDENTIFICATION;\n    moveColumn(-1);\n}\n\nvoid CabrilloTemplateDialog::moveColumnDown()\n{\n    FCT_IDENTIFICATION;\n    moveColumn(1);\n}\n\nvoid CabrilloTemplateDialog::loadTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    const QString filePath = QFileDialog::getOpenFileName(\n                this,\n                tr(\"Import Template\"),\n                QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation),\n                tr(\"QLog Cabrillo Template (*.qct)\"));\n\n    if ( filePath.isEmpty() )\n        return;\n\n    QString error;\n    TemplateData tmpl = readTemplateFromFile(filePath, &error);\n\n    if ( tmpl.name.isEmpty() )\n    {\n        QMessageBox::critical(this, tr(\"Import Failed\"), error);\n        return;\n    }\n\n    // Unique name\n    const QString baseName = tmpl.name;\n    int suffix = 1;\n    bool collision = true;\n    while ( collision )\n    {\n        collision = false;\n        for ( const TemplateData &existing : static_cast<const QList<TemplateData>&>(templates) )\n        {\n            if ( !existing.isDeleted && existing.name == tmpl.name )\n            {\n                tmpl.name = QString(\"%1 (%2)\").arg(baseName).arg(suffix++);\n                collision = true;\n                break;\n            }\n        }\n    }\n\n    templates.append(tmpl);\n    populateTemplateList();\n    ui->templateList->setCurrentRow(ui->templateList->count() - 1);\n}\n\nvoid CabrilloTemplateDialog::exportTemplate()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentTemplateIndex < 0 || currentTemplateIndex >= templates.size() )\n        return;\n\n    saveCurrentTemplate();\n\n    const TemplateData &tmpl = templates[currentTemplateIndex];\n    const QString defaultName = tmpl.name.simplified().replace(' ', '_') + \".qct\";\n    const QString filePath = QFileDialog::getSaveFileName(\n                this,\n                tr(\"Export Template\"),\n                QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation)\n                + \"/\" + defaultName,\n                tr(\"QLog Cabrillo Template (*.qct)\"));\n\n    if ( filePath.isEmpty() )\n        return;\n\n    QString error;\n\n    if ( !writeTemplateToFile(tmpl, filePath, &error) )\n        QMessageBox::critical(this, tr(\"Export Failed\"), error);\n}\n\nvoid CabrilloTemplateDialog::moveColumn(int direction)\n{\n    FCT_IDENTIFICATION;\n\n    int row = ui->columnsTable->currentRow();\n    int targetRow = row + direction;\n\n    if ( row < 0 || targetRow < 0 || targetRow >= ui->columnsTable->rowCount() )\n        return;\n\n    QList<CabrilloFormat::ColumnDef> columns = readColumnsFromTable();\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0))\n    columns.swapItemsAt(row, targetRow);\n#else\n    columns.swap(row, targetRow);\n#endif\n\n    for ( int i = 0; i < columns.size(); i++ )\n        columns[i].position = i + 1;\n\n    populateColumnsTable(columns);\n    ui->columnsTable->setCurrentCell(targetRow, 0);\n}\n\nbool CabrilloTemplateDialog::saveTemplateColumns(QSqlQuery &query, int templateId,\n                                                   const QList<CabrilloFormat::ColumnDef> &columns)\n{\n    FCT_IDENTIFICATION;\n\n    // Delete existing columns\n    if ( !query.prepare(\"DELETE FROM cabrillo_template_columns WHERE template_id = :tid\") )\n    {\n        qCWarning(runtime) << query.lastError().text();\n        return false;\n    }\n    query.bindValue(\":tid\", templateId);\n    if ( !query.exec() )\n    {\n        qCWarning(runtime) << query.lastError().text();\n        return false;\n    }\n\n    // Insert columns — prepare once, bind+exec in loop\n    if ( !query.prepare(\"INSERT INTO cabrillo_template_columns \"\n                        \"(template_id, position, db_field, width, formatter, label) \"\n                        \"VALUES (:tid, :pos, :field, :width, :fmt, :label)\") )\n    {\n        qCWarning(runtime) << query.lastError().text();\n        return false;\n    }\n\n    for ( const CabrilloFormat::ColumnDef &col : columns )\n    {\n        query.bindValue(\":tid\", templateId);\n        query.bindValue(\":pos\", col.position);\n        query.bindValue(\":field\", col.dbField);\n        query.bindValue(\":width\", col.width);\n        query.bindValue(\":fmt\", col.formatter);\n        query.bindValue(\":label\", col.label);\n\n        if ( !query.exec() )\n        {\n            qCWarning(runtime) << query.lastError().text();\n            return false;\n        }\n    }\n\n    return true;\n}\n\nbool CabrilloTemplateDialog::writeTemplateToFile(const TemplateData &tmpl,\n                                                 const QString &filePath,\n                                                 QString *error) const\n{\n    FCT_IDENTIFICATION;\n\n    QSettings s(filePath, QSettings::IniFormat);\n#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)\n    s.setIniCodec(\"UTF-8\");\n#endif\n\n    s.beginGroup(\"Template\");\n    s.setValue(\"name\",    tmpl.name);\n    s.setValue(\"contest\", tmpl.contestName);\n    s.setValue(\"mode\",    tmpl.defaultMode);\n    s.setValue(\"version\", 1);\n    s.endGroup();\n\n    s.beginGroup(\"Columns\");\n    s.setValue(\"count\", tmpl.columns.size());\n    for ( int i = 0; i < tmpl.columns.size(); i++ )\n    {\n        const CabrilloFormat::ColumnDef &col = tmpl.columns[i];\n        const QString prefix = QString(\"col%1\").arg(i + 1);\n        s.setValue(prefix + \".db_field\",  col.dbField);\n        s.setValue(prefix + \".formatter\", col.formatter);\n        s.setValue(prefix + \".width\",     col.width);\n        s.setValue(prefix + \".label\",     col.label);\n    }\n    s.endGroup();\n\n    s.sync();\n\n    if ( s.status() != QSettings::NoError )\n    {\n        if ( error ) *error = tr(\"Failed to write file: %1\").arg(filePath);\n        return false;\n    }\n\n    return true;\n}\n\nCabrilloTemplateDialog::TemplateData CabrilloTemplateDialog::readTemplateFromFile(const QString &filePath,\n                                                                                  QString *error)\n{\n    FCT_IDENTIFICATION;\n\n    TemplateData tmpl{};\n\n    if ( !QFile::exists(filePath) )\n    {\n        if ( error ) *error = tr(\"File not found: %1\").arg(filePath);\n        return tmpl;\n    }\n\n    QSettings s(filePath, QSettings::IniFormat);\n#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)\n    s.setIniCodec(\"UTF-8\");\n#endif\n\n    if ( s.status() != QSettings::NoError )\n    {\n        if ( error ) *error = tr(\"Cannot open file: %1\").arg(filePath);\n        return tmpl;\n    }\n\n    s.beginGroup(\"Template\");\n    tmpl.name        = s.value(\"name\").toString().trimmed();\n    tmpl.contestName = s.value(\"contest\").toString().trimmed();\n    tmpl.defaultMode = s.value(\"mode\", CabrilloFormat::MODE_CW).toString().trimmed();\n    s.endGroup();\n\n    if ( tmpl.name.isEmpty() )\n    {\n        if ( error ) *error = tr(\"Invalid template file: missing name\");\n        return TemplateData{};\n    }\n\n    s.beginGroup(\"Columns\");\n    const int count = s.value(\"count\", 0).toInt();\n    for ( int i = 1; i <= count; i++ )\n    {\n        const QString prefix = QString(\"col%1\").arg(i);\n        CabrilloFormat::ColumnDef col;\n        col.position  = i;\n        col.dbField   = s.value(prefix + \".db_field\").toString();\n        col.formatter = s.value(prefix + \".formatter\").toString();\n        col.width     = s.value(prefix + \".width\",  5).toInt();\n        col.label     = s.value(prefix + \".label\").toString();\n        tmpl.columns.append(col);\n    }\n    s.endGroup();\n\n    tmpl.id         = -1;\n    tmpl.isNew      = true;\n    tmpl.isModified = true;\n    tmpl.isDeleted  = false;\n\n    return tmpl;\n}\n\nvoid CabrilloTemplateDialog::accept()\n{\n    FCT_IDENTIFICATION;\n\n    saveCurrentTemplate();\n\n    QSqlDatabase db = QSqlDatabase::database();\n    if ( !db.transaction() )\n    {\n        qCWarning(runtime) << \"Failed to start transaction\";\n        QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Cannot start database transaction.\"));\n        return;\n    }\n\n    QSqlQuery query;\n\n    // Process deletions (ON DELETE CASCADE handles columns automatically)\n    for ( const TemplateData &tmpl : static_cast<const QList<TemplateData>&>(templates) )\n    {\n        if ( !tmpl.isDeleted || tmpl.isNew )\n            continue;\n\n        if ( !query.prepare(\"DELETE FROM cabrillo_templates WHERE id = :id\") )\n        {\n            qCWarning(runtime) << query.lastError().text();\n            Q_UNUSED(db.rollback());\n            return;\n        }\n        query.bindValue(\":id\", tmpl.id);\n        if ( !query.exec() )\n        {\n            qCWarning(runtime) << query.lastError().text();\n            Q_UNUSED(db.rollback());\n            return;\n        }\n    }\n\n    // Process new and modified templates\n    for ( const TemplateData &tmpl : static_cast<const QList<TemplateData>&>(templates) )\n    {\n        if ( tmpl.isDeleted )\n            continue;\n\n        int targetId = tmpl.id;\n\n        if ( tmpl.isNew )\n        {\n            if ( !query.prepare(\"INSERT INTO cabrillo_templates \"\n                                \"(name, contest_name_for_header, default_category_mode) \"\n                                \"VALUES (:name, :contest, :mode)\") )\n            {\n                qCWarning(runtime) << query.lastError().text();\n                Q_UNUSED(db.rollback());\n                return;\n            }\n            query.bindValue(\":name\", tmpl.name);\n            query.bindValue(\":contest\", tmpl.contestName);\n            query.bindValue(\":mode\", tmpl.defaultMode);\n\n            if ( !query.exec() )\n            {\n                qCWarning(runtime) << query.lastError().text();\n                QMessageBox::warning(this, tr(\"QLog Warning\"),\n                                     tr(\"Cannot save template '%1': %2\").arg(tmpl.name, query.lastError().text()));\n                Q_UNUSED(db.rollback());\n                return;\n            }\n\n            targetId = query.lastInsertId().toInt();\n        }\n        else if ( tmpl.isModified )\n        {\n            if ( !query.prepare(\"UPDATE cabrillo_templates SET name = :name, \"\n                                \"contest_name_for_header = :contest, default_category_mode = :mode \"\n                                \"WHERE id = :id\") )\n            {\n                qCWarning(runtime) << query.lastError().text();\n                Q_UNUSED(db.rollback());\n                return;\n            }\n            query.bindValue(\":name\", tmpl.name);\n            query.bindValue(\":contest\", tmpl.contestName);\n            query.bindValue(\":mode\", tmpl.defaultMode);\n            query.bindValue(\":id\", tmpl.id);\n\n            if ( !query.exec() )\n            {\n                qCWarning(runtime) << query.lastError().text();\n                Q_UNUSED(db.rollback());\n                return;\n            }\n        }\n        else\n        {\n            continue;\n        }\n\n        if ( !saveTemplateColumns(query, targetId, tmpl.columns) )\n        {\n            Q_UNUSED(db.rollback());\n            return;\n        }\n    }\n\n    if ( !db.commit() )\n    {\n        qCWarning(runtime) << \"Failed to commit transaction\";\n        Q_UNUSED(db.rollback());\n        return;\n    }\n\n    QDialog::accept();\n}\n"
  },
  {
    "path": "ui/CabrilloTemplateDialog.h",
    "content": "#ifndef QLOG_UI_CABRILLOTEMPLATEDIALOG_H\n#define QLOG_UI_CABRILLOTEMPLATEDIALOG_H\n\n#include <QDialog>\n#include <QList>\n#include <QMap>\n#include <QStringList>\n\n#include \"logformat/CabrilloFormat.h\"\n\nclass QSqlQuery;\n\nnamespace Ui {\nclass CabrilloTemplateDialog;\n}\n\nclass CabrilloTemplateDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit CabrilloTemplateDialog(QWidget *parent = nullptr);\n    ~CabrilloTemplateDialog();\n\n    void selectTemplate(int templateId);\n\nprotected:\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\nprivate slots:\n    void accept() override;\n    void templateSelectionChanged();\n    void newTemplate();\n    void copyTemplate();\n    void deleteTemplate();\n    void addColumn();\n    void removeColumn();\n    void moveColumnUp();\n    void moveColumnDown();\n    void loadTemplate();\n    void exportTemplate();\n\nprivate:\n    struct TemplateData\n    {\n        int id = -1;\n        QString name;\n        QString contestName;\n        QString defaultMode;\n        QList<CabrilloFormat::ColumnDef> columns;\n        bool isNew = true;\n        bool isModified = true;\n        bool isDeleted = false;\n    };\n\n    void loadTemplatesFromDB();\n    void populateTemplateList();\n    void showTemplateEditor(int index);\n    void saveCurrentTemplate();\n    void populateContestCombo();\n    void populateColumnsTable(const QList<CabrilloFormat::ColumnDef> &columns);\n    void setupColumnRow(int row, const CabrilloFormat::ColumnDef &col);\n    void installWheelGuard(QWidget *widget);\n    QList<CabrilloFormat::ColumnDef> readColumnsFromTable() const;\n    void moveColumn(int direction);\n    bool saveTemplateColumns(QSqlQuery &query, int templateId,\n                             const QList<CabrilloFormat::ColumnDef> &columns);\n    bool writeTemplateToFile(const TemplateData &tmpl,\n                             const QString &filePath,\n                             QString *error = nullptr) const;\n    TemplateData readTemplateFromFile(const QString &filePath,\n                                      QString *error = nullptr);\n\n    Ui::CabrilloTemplateDialog *ui;\n    QList<TemplateData> templates;\n    int currentTemplateIndex;\n    QList<CabrilloFormat::CategoryItem> dbFieldItems;\n    QList<CabrilloFormat::CategoryItem> formatterItems;\n};\n\n#endif // QLOG_UI_CABRILLOTEMPLATEDIALOG_H\n"
  },
  {
    "path": "ui/CabrilloTemplateDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>CabrilloTemplateDialog</class>\n <widget class=\"QDialog\" name=\"CabrilloTemplateDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>850</width>\n    <height>550</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Cabrillo Template Manager</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QHBoxLayout\" name=\"mainHLayout\">\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"leftLayout\">\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n       <item>\n        <widget class=\"QPushButton\" name=\"loadTemplateButton\">\n         <property name=\"toolTip\">\n          <string>Import template</string>\n         </property>\n         <property name=\"text\">\n          <string>Import</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"document-open\"/>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"exportTemplateButton\">\n         <property name=\"toolTip\">\n          <string>Export template</string>\n         </property>\n         <property name=\"text\">\n          <string>Export</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"document-save-as\"/>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QListWidget\" name=\"templateList\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"listButtonLayout\">\n       <item>\n        <widget class=\"QPushButton\" name=\"newButton\">\n         <property name=\"toolTip\">\n          <string>New template</string>\n         </property>\n         <property name=\"text\">\n          <string>New</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"document-new\"/>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"copyButton\">\n         <property name=\"toolTip\">\n          <string>Copy existing template</string>\n         </property>\n         <property name=\"text\">\n          <string>Copy</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"edit-copy\"/>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"deleteButton\">\n         <property name=\"toolTip\">\n          <string>Delete template</string>\n         </property>\n         <property name=\"text\">\n          <string>Delete</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"edit-delete\"/>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"rightLayout\">\n     <item>\n      <layout class=\"QFormLayout\" name=\"editorFormLayout\">\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QLabel\" name=\"nameEditorLabel\">\n         <property name=\"text\">\n          <string>Template Name:</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"1\">\n        <widget class=\"QLineEdit\" name=\"nameEdit\"/>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <widget class=\"QLabel\" name=\"contestEditorLabel\">\n         <property name=\"text\">\n          <string>Contest Name:</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"1\">\n        <widget class=\"QComboBox\" name=\"contestCombo\">\n         <property name=\"editable\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item row=\"2\" column=\"0\">\n        <widget class=\"QLabel\" name=\"defaultModeEditorLabel\">\n         <property name=\"text\">\n          <string>Default Mode:</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"2\" column=\"1\">\n        <widget class=\"QComboBox\" name=\"defaultModeCombo\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QComboBox::AdjustToContents</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"columnsLabel\">\n       <property name=\"text\">\n        <string>QSO Line Columns:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QTableWidget\" name=\"columnsTable\">\n         <property name=\"toolTip\">\n          <string>Contest name as required by the rules. It is possible to enter a custom string if it is not included in the list.</string>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::SingleSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectRows</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"columnCount\">\n          <number>5</number>\n         </property>\n         <attribute name=\"verticalHeaderVisible\">\n          <bool>false</bool>\n         </attribute>\n         <column>\n          <property name=\"text\">\n           <string>Seq.</string>\n          </property>\n         </column>\n         <column>\n          <property name=\"text\">\n           <string>QSO Field</string>\n          </property>\n         </column>\n         <column>\n          <property name=\"text\">\n           <string>Formatter</string>\n          </property>\n         </column>\n         <column>\n          <property name=\"text\">\n           <string>Width</string>\n          </property>\n         </column>\n         <column>\n          <property name=\"text\">\n           <string>Label</string>\n          </property>\n         </column>\n        </widget>\n       </item>\n       <item>\n        <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n         <property name=\"spacing\">\n          <number>0</number>\n         </property>\n         <property name=\"leftMargin\">\n          <number>0</number>\n         </property>\n         <item>\n          <spacer name=\"verticalSpacer_2\">\n           <property name=\"orientation\">\n            <enum>Qt::Vertical</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>40</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"moveUpButton\">\n           <property name=\"text\">\n            <string notr=\"true\"/>\n           </property>\n           <property name=\"icon\">\n            <iconset resource=\"../res/icons/icons.qrc\">\n             <normaloff>:/icons/baseline-play_up-24px.svg</normaloff>:/icons/baseline-play_up-24px.svg</iconset>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"moveDownButton\">\n           <property name=\"text\">\n            <string notr=\"true\"/>\n           </property>\n           <property name=\"icon\">\n            <iconset resource=\"../res/icons/icons.qrc\">\n             <normaloff>:/icons/baseline-play_down-24px.svg</normaloff>:/icons/baseline-play_down-24px.svg</iconset>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"verticalSpacer\">\n           <property name=\"orientation\">\n            <enum>Qt::Vertical</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>40</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"colButtonLayout\">\n       <item>\n        <spacer name=\"colButtonSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"addColumnButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"toolTip\">\n          <string>Add line</string>\n         </property>\n         <property name=\"text\">\n          <string>Add</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"removeColumnButton\">\n         <property name=\"toolTip\">\n          <string>Remove selected line</string>\n         </property>\n         <property name=\"text\">\n          <string>Remove</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>40</width>\n           <height>20</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>nameEdit</tabstop>\n  <tabstop>contestCombo</tabstop>\n  <tabstop>defaultModeCombo</tabstop>\n  <tabstop>newButton</tabstop>\n  <tabstop>copyButton</tabstop>\n  <tabstop>deleteButton</tabstop>\n  <tabstop>addColumnButton</tabstop>\n  <tabstop>removeColumnButton</tabstop>\n  <tabstop>templateList</tabstop>\n </tabstops>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>425</x>\n     <y>530</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>425</x>\n     <y>530</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>templateList</sender>\n   <signal>currentRowChanged(int)</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>templateSelectionChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>newButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>newTemplate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>60</x>\n     <y>480</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>copyButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>copyTemplate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>120</x>\n     <y>480</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>deleteButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>deleteTemplate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>160</x>\n     <y>480</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addColumnButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>addColumn()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>300</x>\n     <y>400</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>removeColumnButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>removeColumn()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>400</x>\n     <y>400</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>moveUpButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>moveColumnUp()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>500</x>\n     <y>400</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>moveDownButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>moveColumnDown()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>600</x>\n     <y>400</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>425</x>\n     <y>275</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>loadTemplateButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>loadTemplate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>72</x>\n     <y>24</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>424</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportTemplateButton</sender>\n   <signal>clicked()</signal>\n   <receiver>CabrilloTemplateDialog</receiver>\n   <slot>exportTemplate()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>202</x>\n     <y>24</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>424</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>templateSelectionChanged()</slot>\n  <slot>newTemplate()</slot>\n  <slot>copyTemplate()</slot>\n  <slot>deleteTemplate()</slot>\n  <slot>addColumn()</slot>\n  <slot>removeColumn()</slot>\n  <slot>moveColumnUp()</slot>\n  <slot>moveColumnDown()</slot>\n  <slot>loadTemplate()</slot>\n  <slot>exportTemplate()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/ChatWidget.cpp",
    "content": "#include <QPushButton>\n#include <QLabel>\n#include <QTabBar>\n#include <QMessageBox>\n\n#include \"ChatWidget.h\"\n#include \"ui_ChatWidget.h\"\n#include \"core/debug.h\"\n#include \"service/kstchat/KSTChat.h\"\n#include \"ui/KSTChatWidget.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.chatwidget\");\n\nChatWidget::ChatWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::ChatWidget)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->chatTabWidget->tabBar()->tabButton(0, QTabBar::RightSide)->hide();\n    ui->chatRoomCombo->addItems(KSTChat::chatRooms);\n\n    QWidget *w = ui->chatTabWidget->widget(0);\n    w->setProperty(\"chatName\", tr(\"New\"));\n    ui->chatTabWidget->setTabText(0, generateTabName(w));\n    ui->chatRoomCombo->setCurrentIndex(LogParam::getChatSelectedRoom());\n}\n\nChatWidget::~ChatWidget()\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        if ( qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i)) )\n            ui->chatTabWidget->widget(i)->disconnect(SIGNAL(chatClosed()));\n    }\n    delete ui;\n}\n\nvoid ChatWidget::registerContactWidget(const NewContactWidget *contactWidget)\n{\n    FCT_IDENTIFICATION;\n    contact = contactWidget;\n}\n\nvoid ChatWidget::setChatCallsign(QString callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->currentWidget());\n    if ( kstWidget )\n    {\n        kstWidget->setPrivateChatCallsign(callsign);\n    }\n}\n\nvoid ChatWidget::reloadStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->reloadStationProfile();\n    }\n}\n\nvoid ChatWidget::resetDupe()\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->resetDupe();\n    }\n}\n\nvoid ChatWidget::recalculateDupe()\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->recalculateDupe();\n    }\n\n}\n\nvoid ChatWidget::recalculateDxccStatus()\n{\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->recalculateDxccStatus();\n    }\n}\n\nvoid ChatWidget::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->updateSpotsStatusWhenQSOAdded(record);\n    }\n\n}\n\nvoid ChatWidget::updateSpotsDupeWhenQSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->updateSpotsStatusWhenQSODeleted(record);\n    }\n}\n\nvoid ChatWidget::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->chatTabWidget->count(); i++ )\n    {\n        KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(i));\n\n        if ( kstWidget )\n            kstWidget->updateSpotsDxccStatusWhenQSODeleted(entities);\n    }\n}\n\nvoid ChatWidget::connectChat()\n{\n    FCT_IDENTIFICATION;\n\n    QString username = KSTChat::getUsername();\n    QString password = KSTChat::getPasswd();\n\n    if ( username.isEmpty()\n         || password.isEmpty() )\n    {\n        QMessageBox::warning(this, tr(\"QLog Warning\"), tr(\"ON4KST Chat is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p>\"));\n        return;\n    }\n\n    KSTChatWidget *newWidget = new KSTChatWidget(ui->chatRoomCombo->currentIndex() + 1,\n                                                 username,\n                                                 password,\n                                                 contact,\n                                                 this);\n    newWidget->setProperty(\"chatName\", ui->chatRoomCombo->currentText());\n    newWidget->setProperty(\"unreadMsg\", 0);\n    newWidget->setProperty(\"valuableMsg\", 0);\n    ui->chatTabWidget->addTab(newWidget,generateTabName(newWidget));\n    ui->chatTabWidget->setCurrentWidget(newWidget);\n    connect(newWidget, &KSTChatWidget::chatClosed,\n            this, [this, newWidget]()\n    {\n        int i = this->findTabWidgetIndex(newWidget);\n        if ( i >= 0 )\n        {\n            this->closeTab(i);\n        }\n    });\n\n    connect(newWidget, &KSTChatWidget::chatUpdated,\n            this, &ChatWidget::tabActive);\n\n    connect(newWidget, &KSTChatWidget::valuableMessageUpdated,\n            this, &ChatWidget::valuableMessageActive);\n\n    connect(newWidget, &KSTChatWidget::prepareQSOInfo,\n            this, &ChatWidget::processQSOInfo);\n\n    connect(newWidget, &KSTChatWidget::userListUpdated,\n            this, &ChatWidget::userListUpdate);\n\n    connect(newWidget, &KSTChatWidget::beamingRequested,\n            this, &ChatWidget::beamRequest);\n\n#if 0 // see comments in closeTab\n    // Disable Chat Room in the Combobox\n    QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->chatRoomCombo->model());\n    if ( model )\n    {\n        QStandardItem *item = model->item(ui->chatRoomCombo->currentIndex());\n        item->setFlags(item->flags() & ~Qt::ItemIsEnabled);\n    }\n#endif\n    LogParam::setChatSelectedRoom(ui->chatRoomCombo->currentIndex());\n}\n\nvoid ChatWidget::closeTab(int tabIndex)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << tabIndex;\n\n    if ( tabIndex < 0 )\n        return;\n\n    KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(ui->chatTabWidget->widget(tabIndex));\n    ui->chatTabWidget->removeTab(tabIndex);\n\n#if 0 // It is not an user friednly to disable the item after connection\n    // because QLog save the last selected item and this items remains selected - it is chaotic\n    // Enable Chat Room in the Combobox\n\n    QStandardItemModel *model = qobject_cast<QStandardItemModel *>(ui->chatRoomCombo->model());\n\n    if ( model )\n    {\n        QStandardItem *item = model->item(ui->chatRoomCombo->findText(kstWidget->property(\"chatName\").toString()));\n        item->setFlags(item->flags() | Qt::ItemIsEnabled);\n    }\n#endif\n    kstWidget->deleteLater();\n    ui->chatTabWidget->setCurrentIndex(tabIndex - 1);\n    //emit userListUpdated(QList<KSTUsersInfo>());\n}\n\nvoid ChatWidget::tabActive(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    if ( w == ui->chatTabWidget->currentWidget() )\n        return;\n\n    int unread = w->property(\"unreadMsg\").toInt();\n    unread++;\n    w->setProperty(\"unreadMsg\", unread);\n\n    int i = findTabWidgetIndex(w);\n    if ( i >=0 )\n    {\n        ui->chatTabWidget->setTabText(i, generateTabName(w));\n        setTabUnreadInfo(i, w);\n    }\n}\n\nvoid ChatWidget::valuableMessageActive(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    if ( w == ui->chatTabWidget->currentWidget() )\n        return;\n\n    int valuableMsgCounter = w->property(\"valuableMsg\").toInt();\n    valuableMsgCounter++;\n    w->setProperty(\"valuableMsg\", valuableMsgCounter);\n\n    int i = findTabWidgetIndex(w);\n    if ( i >=0 )\n    {\n        ui->chatTabWidget->setTabText(i, generateTabName(w));\n        setTabUnreadInfo(i, w);\n    }\n}\n\nvoid ChatWidget::chatTabClicked(int tabIndex)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << tabIndex;\n\n    QWidget *w = ui->chatTabWidget->widget(tabIndex);\n    w->setProperty(\"unreadMsg\", 0);\n    w->setProperty(\"valuableMsg\", 0);\n    ui->chatTabWidget->setTabText(tabIndex, generateTabName(w));\n    setTabUnreadInfo(tabIndex, w);\n    KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(w);\n    if ( kstWidget )\n        emit userListUpdated(kstWidget->getUserList());\n    else\n        emit userListUpdated(QList<KSTUsersInfo>());\n}\n\nvoid ChatWidget::processQSOInfo(const QString &callsign, const QString &grid)\n{\n    FCT_IDENTIFICATION;\n    emit prepareQSOInfo(callsign, grid);\n}\n\nvoid ChatWidget::userListUpdate(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    if ( w != ui->chatTabWidget->currentWidget() )\n        return;\n\n    KSTChatWidget *kstWidget = qobject_cast<KSTChatWidget*>(w);\n    if ( kstWidget )\n        emit userListUpdated(kstWidget->getUserList());\n}\n\nvoid ChatWidget::beamRequest(double az)\n{\n    FCT_IDENTIFICATION;\n\n    emit beamingRequested(az);\n}\n\nint ChatWidget::findTabWidgetIndex(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0 ; i < ui->chatTabWidget->count(); i++ )\n    {\n        if ( ui->chatTabWidget->widget(i) == w )\n            return i;\n    }\n\n    return -1;\n}\n\nQString ChatWidget::generateTabName(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    return w->property(\"chatName\").toString();\n}\n\nQString ChatWidget::generateTabUnread(QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    int unread = w->property(\"unreadMsg\").toInt();\n    int valuableMsgCnt = w->property(\"valuableMsg\").toInt();\n\n    return (( unread > 0 ) ? QString::number(valuableMsgCnt) + \"/\" + QString::number(unread)\n                           : \"\");\n}\n\nvoid ChatWidget::setTabUnreadInfo(int tabIndex, QWidget *w)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !w )\n        return;\n\n    QWidget *tabButton = ui->chatTabWidget->tabBar()->tabButton(tabIndex, QTabBar::LeftSide);\n    int unread = w->property(\"unreadMsg\").toInt();\n    int valuableMsgCnt = w->property(\"valuableMsg\").toInt();\n\n    if ( tabButton )\n    {\n        tabButton->deleteLater();\n        ui->chatTabWidget->tabBar()->setTabButton(tabIndex, QTabBar::LeftSide, nullptr);\n        tabButton = nullptr;\n    }\n\n    if ( unread == 0 && valuableMsgCnt == 0 )\n    {\n        return;\n    }\n    else\n    {\n        // if I reuse the label then I have an issue with a geometry. Therefore I remove it and\n        // create it again.\n        tabButton = new QLabel(generateTabUnread(w));\n        tabButton->setObjectName((valuableMsgCnt > 0) ? \"chatValuableMsg\" : \"chatUnread\"); //based on this name, stylesheed is set from stylesheet.css\n        ui->chatTabWidget->tabBar()->setTabButton(tabIndex, QTabBar::LeftSide, tabButton);\n    }\n}\n"
  },
  {
    "path": "ui/ChatWidget.h",
    "content": "#ifndef QLOG_UI_CHATWIDGET_H\n#define QLOG_UI_CHATWIDGET_H\n\n#include <QWidget>\n#include \"service/kstchat/KSTChat.h\"\n#include \"ui/NewContactWidget.h\"\n\nnamespace Ui {\nclass ChatWidget;\n}\n\nclass ChatWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit ChatWidget(QWidget *parent = nullptr);\n    ~ChatWidget();\n\n    void registerContactWidget(const NewContactWidget *contactWidget);\n\npublic slots:\n    void setChatCallsign(QString);\n    void reloadStationProfile();\n    void resetDupe();\n    void recalculateDupe();\n    void recalculateDxccStatus();\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsDupeWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n\nprivate slots:\n    void connectChat();\n    void closeTab(int);\n    void tabActive(QWidget *);\n    void valuableMessageActive(QWidget *);\n    void chatTabClicked(int);\n    void processQSOInfo(const QString&, const QString&);\n    void userListUpdate(QWidget *w);\n    void beamRequest(double);\n\nsignals:\n    void prepareQSOInfo(QString, QString);\n    void userListUpdated(QList<KSTUsersInfo>);\n    void beamingRequested(double);\n\nprivate:\n    Ui::ChatWidget *ui;\n    const NewContactWidget *contact;\n\n    int findTabWidgetIndex(QWidget *);\n    QString generateTabName(QWidget *);\n    QString generateTabUnread(QWidget *);\n    void setTabUnreadInfo(int, QWidget *);\n};\n\n#endif // QLOG_UI_CHATWIDGET_H\n"
  },
  {
    "path": "ui/ChatWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ChatWidget</class>\n <widget class=\"QWidget\" name=\"ChatWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string notr=\"true\">Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QTabWidget\" name=\"chatTabWidget\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"styleSheet\">\n      <string notr=\"true\">QTabBar::tab {padding: 5px;}</string>\n     </property>\n     <property name=\"tabPosition\">\n      <enum>QTabWidget::North</enum>\n     </property>\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <property name=\"iconSize\">\n      <size>\n       <width>5</width>\n       <height>5</height>\n      </size>\n     </property>\n     <property name=\"tabsClosable\">\n      <bool>true</bool>\n     </property>\n     <property name=\"movable\">\n      <bool>true</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"connectTab\">\n      <attribute name=\"title\">\n       <string/>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n         <item>\n          <spacer name=\"verticalSpacer_2\">\n           <property name=\"orientation\">\n            <enum>Qt::Vertical</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>40</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item>\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n           <property name=\"leftMargin\">\n            <number>0</number>\n           </property>\n           <property name=\"topMargin\">\n            <number>0</number>\n           </property>\n           <item>\n            <spacer name=\"horizontalSpacer\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n             <item>\n              <widget class=\"QLabel\" name=\"label\">\n               <property name=\"text\">\n                <string>ON4KST Chat</string>\n               </property>\n               <property name=\"alignment\">\n                <set>Qt::AlignCenter</set>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"QComboBox\" name=\"chatRoomCombo\">\n               <property name=\"enabled\">\n                <bool>true</bool>\n               </property>\n               <property name=\"focusPolicy\">\n                <enum>Qt::ClickFocus</enum>\n               </property>\n               <property name=\"toolTip\">\n                <string>Chat Room</string>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"QPushButton\" name=\"chatConnectButton\">\n               <property name=\"enabled\">\n                <bool>true</bool>\n               </property>\n               <property name=\"focusPolicy\">\n                <enum>Qt::ClickFocus</enum>\n               </property>\n               <property name=\"text\">\n                <string>Connect</string>\n               </property>\n              </widget>\n             </item>\n            </layout>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_2\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item>\n          <spacer name=\"verticalSpacer\">\n           <property name=\"orientation\">\n            <enum>Qt::Vertical</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>40</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>chatTabWidget</sender>\n   <signal>tabCloseRequested(int)</signal>\n   <receiver>ChatWidget</receiver>\n   <slot>closeTab(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>chatConnectButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ChatWidget</receiver>\n   <slot>connectChat()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>223</x>\n     <y>195</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>chatTabWidget</sender>\n   <signal>currentChanged(int)</signal>\n   <receiver>ChatWidget</receiver>\n   <slot>chatTabClicked(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>closeTab(int)</slot>\n  <slot>connectChat()</slot>\n  <slot>chatTypeChanged(QString)</slot>\n  <slot>chatTabClicked(int)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/ClockWidget.cpp",
    "content": "#include <QTimer>\n#include <QDateTime>\n#include <QtMath>\n#include \"ClockWidget.h\"\n#include \"ui_ClockWidget.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/StationProfile.h\"\n\n#define EARTH_RADIUS 6371\n#define EARTH_CIRCUM 40075\n\n#define MSECS_PER_DAY (24.0 * 60.0 * 60.0 * 1000.0)\nMODULE_IDENTIFICATION(\"qlog.ui.clockwidget\");\n\nClockWidget::ClockWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::ClockWidget),\n    sunScene(new QGraphicsScene(this)),\n    clockScene(new QGraphicsScene(this)),\n    clockItem(new QGraphicsTextItem)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    QTimer *timer = new QTimer(this);\n    connect(timer, &QTimer::timeout, this, &ClockWidget::updateClock);\n    timer->start(500);\n\n    sunScene->setSceneRect(0, 0, 200, 10);\n    ui->sunGraphicsView->setScene(sunScene.data());\n\n    QFont font = clockItem->font();\n    font.setPointSize(20);\n    clockItem->setFont(font);\n    clockScene->addItem(clockItem.data());\n    ui->clockGraphicsView->setScene(clockScene.data());\n\n    updateClock();\n    updateSun();\n    updateSunGraph();\n}\n\nvoid ClockWidget::updateClock()\n{\n    FCT_IDENTIFICATION;\n\n    QDateTime now = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n    QColor textColor = qApp->palette().color(QPalette::Text);\n    clockItem->setDefaultTextColor(textColor);\n    clockItem->setPlainText(locale.toString(now, locale.formatTimeLongWithoutTZ()));\n\n    if (now.time().second() == 0)\n    {\n        updateSun();\n        updateSunGraph();\n    }\n\n    /* Use only in case when you want to debug which widget is focussed*/\n//#define SHOW_FOCUS\n#ifdef SHOW_FOCUS\n    QWidget * fw = qApp->focusWidget();\n    if ( fw ) qInfo() << fw->objectName() << fw->parent()->objectName();\n#endif\n\n}\n\nvoid ClockWidget::updateSun()\n{\n    FCT_IDENTIFICATION;\n\n    Gridsquare myGrid (StationProfilesManager::instance()->getCurProfile1().locator);\n\n    if ( myGrid.isValid() )\n    {\n        double lat = myGrid.getLatitude();\n        double lon = myGrid.getLongitude();\n\n        qint64 julianDay = QDate::currentDate().toJulianDay();\n        double n = static_cast<double>(julianDay) - 2451545.0 + 0.0008;\n\n        double Js = n - lon / 360.0;\n        double M = fmod(357.5291 + 0.98560028 * Js, 360.0);\n        double C = 1.9148 * sin(M / 180.0 * M_PI) + 0.0200 * sin(2 * M / 180.0 * M_PI) + 0.0003 * sin(3 * M / 180.0 * M_PI);\n        double L = fmod(M + C + 180 + 102.9372, 360.0);\n        double Jt = 2451545.0 + Js + 0.0053 * sin(M / 180.0 * M_PI) - 0.0069 * sin(2 * L / 180.0 * M_PI);\n        double sind = sin(L / 180.0 * M_PI) * sin(23.44 / 180.0 * M_PI);\n        double cosd = cos(asin(sind));\n        double w = acos((sin(-0.83 / 180.0 * M_PI) - sin(lat / 180.0 * M_PI) * sind) / (cos(lat / 180.0 * M_PI) * cosd));\n\n        double Jrise = Jt - w / (2*M_PI) + 0.5;\n        double Jset = Jt + w / (2*M_PI) + 0.5;\n\n        sunrise = QTime::fromMSecsSinceStartOfDay(static_cast<int>(fmod(Jrise, 1.0) * MSECS_PER_DAY));\n        sunset = QTime::fromMSecsSinceStartOfDay(static_cast<int>(fmod(Jset, 1.0) * MSECS_PER_DAY));\n\n        ui->sunRiseLabel->setText(locale.toString(sunrise, locale.formatTimeShort()));\n        ui->sunSetLabel->setText(locale.toString(sunset, locale.formatTimeShort()));\n    }\n    else\n    {\n        ui->sunRiseLabel->setText(tr(\"N/A\"));\n        ui->sunSetLabel->setText(tr(\"N/A\"));\n    }\n}\n\nvoid ClockWidget::updateSunGraph()\n{\n    FCT_IDENTIFICATION;\n\n    QColor dayColor(255, 253, 59);\n    QColor nightColor(33, 150, 243);\n    QColor currentColor(229, 57, 53);\n\n    qreal width = sunScene->width();\n\n    double rise = sunrise.msecsSinceStartOfDay() / MSECS_PER_DAY * width;\n    double set = sunset.msecsSinceStartOfDay() / MSECS_PER_DAY * width;\n    double cur = QDateTime::currentDateTimeUtc().time().msecsSinceStartOfDay() / MSECS_PER_DAY * width;\n\n    sunScene->clear();\n\n    if ( set > rise )\n    {\n        sunScene->addRect(0, 0, rise, 10, QPen(Qt::NoPen), QBrush(nightColor, Qt::SolidPattern));\n        sunScene->addRect(rise, 0, set-rise, 10, QPen(Qt::NoPen), QBrush(dayColor, Qt::SolidPattern));\n        sunScene->addRect(set, 0, width-set, 10, QPen(Qt::NoPen), QBrush(nightColor, Qt::SolidPattern));\n    }\n    else\n    {\n        sunScene->addRect(0, 0, set, 10, QPen(Qt::NoPen), QBrush(dayColor, Qt::SolidPattern));\n        sunScene->addRect(set, 0, rise-set, 10, QPen(Qt::NoPen), QBrush(nightColor, Qt::SolidPattern));\n        sunScene->addRect(rise, 0, width-rise, 10, QPen(Qt::NoPen), QBrush(dayColor, Qt::SolidPattern));\n    }\n\n    QPen currentPen(currentColor);\n    currentPen.setWidthF(2.0);\n    sunScene->addLine(cur, 0, cur, 10, currentPen);\n}\n\nClockWidget::~ClockWidget()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n"
  },
  {
    "path": "ui/ClockWidget.h",
    "content": "#ifndef QLOG_UI_CLOCKWIDGET_H\n#define QLOG_UI_CLOCKWIDGET_H\n\n#include <QWidget>\n#include <QTime>\n#include \"core/LogLocale.h\"\n#include <QGraphicsItem>\n\nnamespace Ui {\nclass ClockWidget;\n}\n\nclass QGraphicsScene;\n\nclass ClockWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit ClockWidget(QWidget *parent = nullptr);\n    ~ClockWidget();\n\npublic slots:\n    void updateClock();\n    void updateSun();\n    void updateSunGraph();\n\nprivate:\n    Ui::ClockWidget *ui;\n    QScopedPointer<QGraphicsScene> sunScene;\n    QScopedPointer<QGraphicsScene> clockScene;\n    QScopedPointer<QGraphicsTextItem> clockItem;\n    LogLocale locale;\n    QTime sunrise;\n    QTime sunset;\n};\n\n#endif // QLOG_UI_CLOCKWIDGET_H\n"
  },
  {
    "path": "ui/ClockWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ClockWidget</class>\n <widget class=\"QWidget\" name=\"ClockWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>303</width>\n    <height>106</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>0</number>\n   </property>\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QGraphicsView\" name=\"clockGraphicsView\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Minimum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"maximumSize\">\n      <size>\n       <width>16777215</width>\n       <height>40</height>\n      </size>\n     </property>\n     <property name=\"focusPolicy\">\n      <enum>Qt::NoFocus</enum>\n     </property>\n     <property name=\"styleSheet\">\n      <string notr=\"true\">background-color: transparent;</string>\n     </property>\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"frameShadow\">\n      <enum>QFrame::Plain</enum>\n     </property>\n     <property name=\"lineWidth\">\n      <number>0</number>\n     </property>\n     <property name=\"verticalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"horizontalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"interactive\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGraphicsView\" name=\"sunGraphicsView\">\n     <property name=\"maximumSize\">\n      <size>\n       <width>16777215</width>\n       <height>20</height>\n      </size>\n     </property>\n     <property name=\"focusPolicy\">\n      <enum>Qt::NoFocus</enum>\n     </property>\n     <property name=\"styleSheet\">\n      <string notr=\"true\">background-color: transparent;</string>\n     </property>\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"frameShadow\">\n      <enum>QFrame::Plain</enum>\n     </property>\n     <property name=\"lineWidth\">\n      <number>0</number>\n     </property>\n     <property name=\"verticalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"horizontalScrollBarPolicy\">\n      <enum>Qt::ScrollBarAlwaysOff</enum>\n     </property>\n     <property name=\"interactive\">\n      <bool>false</bool>\n     </property>\n     <property name=\"renderHints\">\n      <set>QPainter::TextAntialiasing</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <spacer name=\"horizontalSpacer_6\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"sunRiseLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>50</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>Sunrise</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Maximum</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>150</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"sunSetLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>50</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>Sunset</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_5\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer_3\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"label\">\n       <property name=\"enabled\">\n        <bool>true</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>50</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>Sunrise</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Maximum</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>150</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"label_2\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>50</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>Sunset</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_4\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>0</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "ui/ColumnSettingDialog.cpp",
    "content": "#include <QCheckBox>\n#include <QPushButton>\n#include \"ColumnSettingDialog.h\"\n#include \"ui_ColumnSettingDialog.h\"\n#include \"ui_ColumnSettingSimpleDialog.h\"\n#include \"core/debug.h\"\n\n#define CHECKBOXESPERROW  4\n\nMODULE_IDENTIFICATION(\"qlog.ui.ColumnSettingDialog\");\n\nColumnSettingDialog::ColumnSettingDialog(QTableView *table,\n                                         QWidget *parent,\n                                         const QList<LogbookModel::ColumnID> &columnIdExcludeFilter) :\n    ColumnSettingGenericDialog(table->model(), parent),\n    ui(new Ui::ColumnSettingDialog),\n    table(table),\n    columnIdExcludeFilter(columnIdExcludeFilter)\n{\n    FCT_IDENTIFICATION;\n\n    setupDialog();\n}\n\nColumnSettingDialog::ColumnSettingDialog(const QAbstractItemModel *model,\n                                         const QSet<int> &defaultStates,\n                                         QWidget *parent,\n                                         const QList<LogbookModel::ColumnID> &columnIdExcludeFilter) :\n    ColumnSettingGenericDialog(model, parent),\n    ui(new Ui::ColumnSettingDialog),\n    table(nullptr),\n    defaultColumnsState(defaultStates),\n    columnIdExcludeFilter(columnIdExcludeFilter)\n{\n    FCT_IDENTIFICATION;\n\n    setupDialog();\n}\n\n\nvoid ColumnSettingDialog::setupDialog()\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"Done\"));\n    ui->tabWidget->setCurrentIndex(0);\n\n    QList<QCheckBox*> generalCheckboxList;\n    QList<QCheckBox*> myInfoCheckboxList;\n    QList<QCheckBox*> qslInfoCheckboxList;\n    QList<QCheckBox*> membersInfoCheckboxList;\n    QList<QCheckBox*> otherInfoCheckboxList;\n    QList<QCheckBox*> conditionsCheckboxList;\n    QList<QCheckBox*> contestCheckboxList;\n\n    int columnIndex = 0;\n    while ( columnIndex < model->columnCount() )\n    {\n        if ( columnIdExcludeFilter.contains(static_cast<LogbookModel::ColumnID>(columnIndex) ) )\n        {\n            columnIndex++;\n            continue;\n        }\n\n        QCheckBox *columnCheckbox = new QCheckBox();\n        QString columnNameString = model->headerData(columnIndex, Qt::Horizontal).toString();\n\n        columnCheckbox->setChecked(((!table) ? defaultColumnsState.contains(columnIndex)\n                                             : !table->isColumnHidden(columnIndex)));\n        columnCheckbox->setText(columnNameString);\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))\n        connect(columnCheckbox, &QCheckBox::checkStateChanged, this, [columnIndex, this](Qt::CheckState state)\n#else\n        connect(columnCheckbox, &QCheckBox::stateChanged, this, [columnIndex, this](int state)\n#endif\n        {\n            emit columnChanged(columnIndex, state);\n            if ( table ) table->setColumnHidden(columnIndex, !table->isColumnHidden(columnIndex));\n        });\n\n        switch ( columnIndex )\n        {\n        case LogbookModel::COLUMN_MY_ALTITUDE:\n        case LogbookModel::COLUMN_MY_ARRL_SECT:\n        case LogbookModel::COLUMN_MY_ANTENNA:\n        case LogbookModel::COLUMN_MY_ANTENNA_INTL:\n        case LogbookModel::COLUMN_MY_CITY:\n        case LogbookModel::COLUMN_MY_CITY_INTL:\n        case LogbookModel::COLUMN_MY_CNTY:\n        case LogbookModel::COLUMN_MY_COUNTRY:\n        case LogbookModel::COLUMN_MY_COUNTRY_INTL:\n        case LogbookModel::COLUMN_MY_CQ_ZONE:\n        case LogbookModel::COLUMN_MY_DXCC:\n        case LogbookModel::COLUMN_MY_FISTS:\n        case LogbookModel::COLUMN_MY_GRIDSQUARE:\n        case LogbookModel::COLUMN_MY_GRIDSQUARE_EXT:\n        case LogbookModel::COLUMN_MY_IOTA:\n        case LogbookModel::COLUMN_MY_IOTA_ISLAND_ID:\n        case LogbookModel::COLUMN_MY_ITU_ZONE:\n        case LogbookModel::COLUMN_MY_LAT:\n        case LogbookModel::COLUMN_MY_LON:\n        case LogbookModel::COLUMN_MY_NAME:\n        case LogbookModel::COLUMN_MY_NAME_INTL:\n        case LogbookModel::COLUMN_MY_POSTAL_CODE:\n        case LogbookModel::COLUMN_MY_POSTAL_CODE_INTL:\n        case LogbookModel::COLUMN_MY_POTA_REF:\n        case LogbookModel::COLUMN_MY_RIG:\n        case LogbookModel::COLUMN_MY_RIG_INTL:\n        case LogbookModel::COLUMN_MY_SIG:\n        case LogbookModel::COLUMN_MY_SIG_INTL:\n        case LogbookModel::COLUMN_MY_SIG_INFO:\n        case LogbookModel::COLUMN_MY_SIG_INFO_INTL:\n        case LogbookModel::COLUMN_MY_SOTA_REF:\n        case LogbookModel::COLUMN_MY_STATE:\n        case LogbookModel::COLUMN_MY_STREET:\n        case LogbookModel::COLUMN_MY_STREET_INTL:\n        case LogbookModel::COLUMN_MY_USACA_COUNTIES:\n        case LogbookModel::COLUMN_MY_VUCC_GRIDS:\n        case LogbookModel::COLUMN_MY_WWFF_REF:\n        case LogbookModel::COLUMN_MY_CNTY_ALT:\n        case LogbookModel::COLUMN_MY_DARC_DOK:\n        case LogbookModel::COLUMN_MY_MORSE_KEY_INFO:\n        case LogbookModel::COLUMN_MY_MORSE_KEY_TYPE:\n\n            myInfoCheckboxList.append(columnCheckbox);\n            break;\n\n        case LogbookModel::COLUMN_QSL_RCVD:\n        case LogbookModel::COLUMN_QSL_RCVD_DATE:\n        case LogbookModel::COLUMN_QSL_SENT:\n        case LogbookModel::COLUMN_QSL_SENT_DATE:\n        case LogbookModel::COLUMN_EQSL_QSLRDATE:\n        case LogbookModel::COLUMN_EQSL_QSLSDATE:\n        case LogbookModel::COLUMN_EQSL_QSL_RCVD:\n        case LogbookModel::COLUMN_EQSL_QSL_SENT:\n        case LogbookModel::COLUMN_EQSL_AG:\n        case LogbookModel::COLUMN_QSLMSG:\n        case LogbookModel::COLUMN_QSLMSG_INTL:\n        case LogbookModel::COLUMN_QSL_RCVD_VIA:\n        case LogbookModel::COLUMN_QSL_SENT_VIA:\n        case LogbookModel::COLUMN_QSL_VIA:\n        case LogbookModel::COLUMN_LOTW_RCVD:\n        case LogbookModel::COLUMN_LOTW_SENT:\n        case LogbookModel::COLUMN_LOTW_RCVD_DATE:\n        case LogbookModel::COLUMN_LOTW_SENT_DATE:\n        case LogbookModel::COLUMN_QRZCOM_QSO_UPLOAD_DATE:\n        case LogbookModel::COLUMN_QRZCOM_QSO_UPLOAD_STATUS:\n        case LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_DATE:\n        case LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_STATUS:\n        case LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_DATE:\n        case LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_STATUS:\n        case LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_DATE:\n        case LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_STATUS:\n        case LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_DATE:\n        case LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_STATUS:\n        case LogbookModel::COLUMN_DCL_QSLRDATE:\n        case LogbookModel::COLUMN_DCL_QSLSDATE:\n        case LogbookModel::COLUMN_DCL_QSL_RCVD:\n        case LogbookModel::COLUMN_DCL_QSL_SENT:\n        case LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_DATE:\n        case LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_STATUS:\n        case LogbookModel::COLUMN_QSLMSG_RCVD:\n            qslInfoCheckboxList.append(columnCheckbox);\n            break;\n\n        case LogbookModel::COLUMN_TEN_TEN:\n        case LogbookModel::COLUMN_FISTS:\n        case LogbookModel::COLUMN_FISTS_CC:\n        case LogbookModel::COLUMN_SKCC:\n        case LogbookModel::COLUMN_UKSMG:\n        case LogbookModel::COLUMN_DARC_DOK:\n            membersInfoCheckboxList.append(columnCheckbox);\n            break;\n\n        case LogbookModel::COLUMN_VE_PROV:\n        case LogbookModel::COLUMN_USACA_COUNTIES:\n        case LogbookModel::COLUMN_PUBLIC_KEY:\n        case LogbookModel::COLUMN_FIELDS:\n        case LogbookModel::COLUMN_AWARD_GRANTED:\n        case LogbookModel::COLUMN_AWARD_SUBMITTED:\n        case LogbookModel::COLUMN_CREDIT_GRANTED:\n        case LogbookModel::COLUMN_CREDIT_SUBMITTED:\n        case LogbookModel::COLUMN_CLASS:\n        case LogbookModel::COLUMN_AGE:\n        case LogbookModel::COLUMN_REGION:\n        case LogbookModel::COLUMN_SILENT_KEY:\n        case LogbookModel::COLUMN_WEB:\n        case LogbookModel::COLUMN_GUEST_OP:\n        case LogbookModel::COLUMN_FORCE_INIT:\n        case LogbookModel::COLUMN_MAX_BURSTS:\n        case LogbookModel::COLUMN_MS_SHOWER:\n        case LogbookModel::COLUMN_NR_PINGS:\n        case LogbookModel::COLUMN_NR_BURSTS:\n        case LogbookModel::COLUMN_QSO_RANDOM:\n        case LogbookModel::COLUMN_QSO_COMPLETE:\n        case LogbookModel::COLUMN_LAT:\n        case LogbookModel::COLUMN_LON:\n        case LogbookModel::COLUMN_OWNER_CALLSIGN:\n        case LogbookModel::COLUMN_CONTACTED_OP:\n        case LogbookModel::COLUMN_OPERATOR:\n        case LogbookModel::COLUMN_STATION_CALLSIGN:\n        case LogbookModel::COLUMN_COMMENT:\n        case LogbookModel::COLUMN_COUNTRY:\n        case LogbookModel::COLUMN_IOTA_ISLAND_ID:\n        case LogbookModel::COLUMN_NAME:\n        case LogbookModel::COLUMN_NOTES:\n        case LogbookModel::COLUMN_QTH:\n        case LogbookModel::COLUMN_RIG:\n        case LogbookModel::COLUMN_ADDRESS:\n        case LogbookModel::COLUMN_RX_PWR:\n        case LogbookModel::COLUMN_GRID_EXT:\n        case LogbookModel::COLUMN_SIG:\n        case LogbookModel::COLUMN_SIG_INFO:  \n\n            otherInfoCheckboxList.append(columnCheckbox);\n            break;\n\n        case LogbookModel::COLUMN_A_INDEX:\n        case LogbookModel::COLUMN_K_INDEX:\n        case LogbookModel::COLUMN_PROP_MODE:\n        case LogbookModel::COLUMN_SFI:\n            conditionsCheckboxList.append(columnCheckbox);\n            break;\n\n        case LogbookModel::COLUMN_PRECEDENCE:\n        case LogbookModel::COLUMN_CONTEST_ID:\n        case LogbookModel::COLUMN_SRX:\n        case LogbookModel::COLUMN_SRX_STRING:\n        case LogbookModel::COLUMN_STX:\n        case LogbookModel::COLUMN_STX_STRING:\n        case LogbookModel::COLUMN_CHECK:\n            contestCheckboxList.append(columnCheckbox);\n            break;\n\n        default:\n            generalCheckboxList.append(columnCheckbox);\n        }\n\n        columnIndex++;\n    }\n\n    addSortedCheckboxes(ui->generalInfoGrid, generalCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->myInfoGrid, myInfoCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->qslInfoGrid, qslInfoCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->membersInfoGrig, membersInfoCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->conditionsInfoGrid, conditionsCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->contestsInfoGrid, contestCheckboxList, CHECKBOXESPERROW);\n    addSortedCheckboxes(ui->otherInfoGrid, otherInfoCheckboxList, CHECKBOXESPERROW);\n\n    addSelectUnselect(ui->generalInfoGrid, CHECKBOXESPERROW);\n    addSelectUnselect(ui->myInfoGrid, CHECKBOXESPERROW);\n    addSelectUnselect(ui->qslInfoGrid, CHECKBOXESPERROW);\n    addSelectUnselect(ui->membersInfoGrig, CHECKBOXESPERROW);\n    addSelectUnselect(ui->conditionsInfoGrid, CHECKBOXESPERROW);\n    addSelectUnselect(ui->contestsInfoGrid, CHECKBOXESPERROW);\n    addSelectUnselect(ui->otherInfoGrid, CHECKBOXESPERROW);\n}\n\nColumnSettingDialog::~ColumnSettingDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nColumnSettingGenericDialog::ColumnSettingGenericDialog(const QAbstractItemModel *model,\n                                                       QWidget *parent) :\n    QDialog(parent),\n    model(model)\n{\n    FCT_IDENTIFICATION;\n}\n\nvoid ColumnSettingGenericDialog::addSortedCheckboxes(QGridLayout *grid, QList<QCheckBox*> &checkboxlist, int elementsPerRow)\n{\n    FCT_IDENTIFICATION;\n\n    int elementIndex = 0;\n\n    std::sort(\n            checkboxlist.begin(),\n            checkboxlist.end(),\n            [](const QCheckBox* a, const QCheckBox *b)->bool\n    {\n       return a->text().localeAwareCompare(b->text()) < 0;\n    });\n\n    for (auto item: checkboxlist)\n    {\n        grid->addWidget(item, elementIndex/elementsPerRow, elementIndex%elementsPerRow);\n        elementIndex++;\n    }\n}\nvoid ColumnSettingGenericDialog::addSelectUnselect(QGridLayout *grid, int elementsPerRow)\n{\n    FCT_IDENTIFICATION;\n\n    const QString unselectAllLabel = tr(\"Unselect All\");\n    const QString selectAllLabel = tr(\"Select All\");\n\n    QPushButton *buttonUnselectAll=new QPushButton();\n    QPushButton *buttonSelectAll=new QPushButton();\n\n    buttonUnselectAll->setText(unselectAllLabel);\n    buttonSelectAll->setText(selectAllLabel);\n\n    int current_rows = grid->rowCount();\n\n    grid->addWidget(buttonUnselectAll, current_rows + 1, 0);\n    grid->addWidget(buttonSelectAll, current_rows + 1, elementsPerRow - 1);\n\n    connect(buttonUnselectAll, &QPushButton::clicked, this, [grid]() {\n        for(int idx = 0; idx < grid->count(); idx++)\n        {\n            QLayoutItem *item = grid->itemAt(idx);\n            if ( !item || !item->widget() )\n            {\n                continue;\n            }\n            QCheckBox *checkbox = qobject_cast<QCheckBox*>(item->widget());\n            if ( checkbox )\n            {\n                checkbox->setChecked(false);\n            }\n        }\n    });\n\n    connect(buttonSelectAll, &QPushButton::clicked, this, [grid]() {\n        for(int idx = 0; idx < grid->count(); idx++)\n        {\n            QLayoutItem *item = grid->itemAt(idx);\n            if ( !item || !item->widget() )\n            {\n                continue;\n            }\n            QCheckBox *checkbox = qobject_cast<QCheckBox*>(item->widget());\n            if ( checkbox )\n            {\n                checkbox->setChecked(true);\n            }\n        }\n    });\n}\n\n\nColumnSettingSimpleDialog::ColumnSettingSimpleDialog(QTableView *table, QWidget *parent) :\n    ColumnSettingGenericDialog(table->model(), parent),\n    ui(new Ui::ColumnSettingSimpleDialog),\n    table(table)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"Done\"));\n\n    QList<QCheckBox*> checkboxList;\n\n    int columnIndex = 0;\n    while ( columnIndex < model->columnCount() )\n    {\n        QCheckBox *columnCheckbox=new QCheckBox();\n        QString columnNameString = model->headerData(columnIndex, Qt::Horizontal).toString();\n\n        columnCheckbox->setChecked(!table->isColumnHidden(columnIndex));\n        columnCheckbox->setText(columnNameString);\n\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 7, 0))\n        connect(columnCheckbox, &QCheckBox::checkStateChanged, this, [columnIndex, table, this](Qt::CheckState state)\n#else\n        connect(columnCheckbox, &QCheckBox::stateChanged, this, [columnIndex, table, this](int state)\n#endif\n        {\n            emit columnChanged(columnIndex, state);\n            if ( table) table->setColumnHidden(columnIndex, !table->isColumnHidden(columnIndex));\n        });\n\n        checkboxList.append(columnCheckbox);\n        columnIndex++;\n    }\n\n    addSortedCheckboxes(ui->generalInfoGrid, checkboxList, CHECKBOXESPERROW);\n    addSelectUnselect(ui->generalInfoGrid, CHECKBOXESPERROW);\n}\n\nColumnSettingSimpleDialog::~ColumnSettingSimpleDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n"
  },
  {
    "path": "ui/ColumnSettingDialog.h",
    "content": "#ifndef QLOG_UI_COLUMNSETTINGDIALOG_H\n#define QLOG_UI_COLUMNSETTINGDIALOG_H\n\n#include <QDialog>\n#include <QTableView>\n#include <QGridLayout>\n#include <QCheckBox>\n#include <QPair>\n#include <QList>\n#include <QString>\n\n#include \"models/LogbookModel.h\"\nnamespace Ui {\nclass ColumnSettingDialog;\nclass ColumnSettingSimpleDialog;\n}\n\nclass ColumnSettingGenericDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ColumnSettingGenericDialog(const QAbstractItemModel *model,\n                                        QWidget *parent = nullptr);\n    ~ColumnSettingGenericDialog(){};\n\nsignals:\n    void columnChanged(int index, bool state);\n\nprotected:\n    void addSortedCheckboxes(QGridLayout *grid, QList<QCheckBox*> &checkboxlist, int elementsPerRow);\n    void addSelectUnselect(QGridLayout *, int);\n    const QAbstractItemModel *model;\n};\n\nclass ColumnSettingSimpleDialog : public ColumnSettingGenericDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ColumnSettingSimpleDialog(QTableView *table, QWidget *parent = nullptr);\n    ~ColumnSettingSimpleDialog();\n\nprivate:\n    Ui::ColumnSettingSimpleDialog *ui;\n    QTableView *table;\n};\n\nclass ColumnSettingDialog : public ColumnSettingGenericDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ColumnSettingDialog(QTableView *table,\n                                 QWidget *parent = nullptr,\n                                 const QList<LogbookModel::ColumnID> &columnIdExcludeFilter = QList<LogbookModel::ColumnID>());\n    explicit ColumnSettingDialog(const QAbstractItemModel *model,\n                                 const QSet<int> &defaultStates,\n                                 QWidget *parent = nullptr,\n                                 const QList<LogbookModel::ColumnID> &columnIdExcludeFilter = QList<LogbookModel::ColumnID>());\n    ~ColumnSettingDialog();\n\nprivate:\n    void setupDialog();\n    Ui::ColumnSettingDialog *ui;\n    QTableView *table;\n    QSet<int> defaultColumnsState;\n    QList<LogbookModel::ColumnID> columnIdExcludeFilter;\n};\n\n#endif // QLOG_UI_COLUMNSETTINGDIALOG_H\n"
  },
  {
    "path": "ui/ColumnSettingDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ColumnSettingDialog</class>\n <widget class=\"QDialog\" name=\"ColumnSettingDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>680</width>\n    <height>444</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Column Visibility Setting</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"generalInfoTab\">\n      <attribute name=\"title\">\n       <string>General</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"generalInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"myInfoTab\">\n      <attribute name=\"title\">\n       <string>My Info</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"myInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"QSLInfoTab\">\n      <attribute name=\"title\">\n       <string>QSL &amp;&amp; Callbooks</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"qslInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_3\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"membersInfoTab\">\n      <attribute name=\"title\">\n       <string>Members</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"membersInfoGrig\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_4\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"conditionsInfoTab\">\n      <attribute name=\"title\">\n       <string>Conditionals</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_10\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"conditionsInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_6\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"contestsInfoTab\">\n      <attribute name=\"title\">\n       <string>Contests</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"contestsInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_7\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"otherInfoTab\">\n      <attribute name=\"title\">\n       <string>Others</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"otherInfoGrid\"/>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_5\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n     <property name=\"centerButtons\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ColumnSettingDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ColumnSettingDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/ColumnSettingSimpleDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ColumnSettingSimpleDialog</class>\n <widget class=\"QDialog\" name=\"ColumnSettingSimpleDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>158</width>\n    <height>69</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Column Visibility Setting</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QGridLayout\" name=\"generalInfoGrid\"/>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ColumnSettingSimpleDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ColumnSettingSimpleDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/DXCCSubmissionDialog.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlError>\n#include <QHeaderView>\n#include <QMessageBox>\n#include <QButtonGroup>\n\n#include \"DXCCSubmissionDialog.h\"\n#include \"ui_DXCCSubmissionDialog.h\"\n#include \"models/SqlListModel.h\"\n#include \"core/debug.h\"\n#include \"core/QSOFilterManager.h\"\n#include \"data/BandPlan.h\"\n#include \"ui/ExportDialog.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.dxccsubmissiondialog\");\n\n//\n// ADIF credit_submitted / credit_granted are comma-delimited lists, e.g.:\n//   \"DXCC,DXCC_MODE,DXCC_BAND\"\n//\n// Standard DXCC credit tokens:\n//   DXCC      — basic DXCC award (any mode, any band)\n//   DXCC_MODE — DXCC mode endorsement (CW / Phone / Digital)\n//   DXCC_BAND — DXCC band endorsement (per-band, incl. 5-Band DXCC)\n//\n// We use comma-padding so \"DXCC\" never accidentally matches \"DXCC_MODE\" or\n// \"DXCC_BAND\":  INSTR(',' || field || ',', ',TOKEN,') > 0\n//\nstatic QString creditHas(const QString &field, const QString &token)\n{\n    return QString(\"INSTR(',' || COALESCE(%1,'') || ',', ',%2,') > 0\")\n               .arg(field, token);\n}\n\nDXCCSubmissionDialog::DXCCSubmissionDialog(QWidget *parent)\n    : QDialog(parent)\n    , ui(new Ui::DXCCSubmissionDialog)\n    , tableModel(new QSqlQueryModel(this))\n    , entityCallsignModel(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    /********************/\n    /* My Entity Combo  */\n    /********************/\n    entityCallsignModel = new SqlListModel(\n        \"SELECT my_dxcc, my_country_intl || ' (' || \"\n        \"CASE WHEN LENGTH(GROUP_CONCAT(station_callsign, ', ')) > 50 \"\n        \"THEN SUBSTR(GROUP_CONCAT(station_callsign, ', '), 0, 50) || '...' \"\n        \"ELSE GROUP_CONCAT(station_callsign, ', ') END || ')' \"\n        \"FROM(SELECT DISTINCT my_dxcc, my_country_intl, station_callsign FROM contacts) \"\n        \"GROUP BY my_dxcc ORDER BY my_dxcc;\",\n        \"\", ui->myEntityComboBox);\n\n    ui->myEntityComboBox->blockSignals(true);\n    while (entityCallsignModel->canFetchMore())\n        entityCallsignModel->fetchMore();\n    ui->myEntityComboBox->setModel(entityCallsignModel);\n    ui->myEntityComboBox->setModelColumn(1);\n    ui->myEntityComboBox->blockSignals(false);\n\n    /***************/\n    /* User Filter */\n    /***************/\n    ui->userFilterComboBox->blockSignals(true);\n    ui->userFilterComboBox->setModel(QSOFilterManager::QSOFilterModel(tr(\"No User Filter\"),\n                                                                      ui->userFilterComboBox));\n    ui->userFilterComboBox->blockSignals(false);\n\n    /*********/\n    /* Bands */\n    /*********/\n    ui->bandScopeComboBox->blockSignals(true);\n    ui->bandScopeComboBox->addItem(tr(\"Any Band (Entity Level)\"),\n                                   QVariant(static_cast<int>(DXCCBandScope::EntityLevel)));\n    ui->bandScopeComboBox->addItem(tr(\"5-Band DXCC (80/40/20/15/10m)\"),\n                                   QVariant(static_cast<int>(DXCCBandScope::FiveBand)));\n    ui->bandScopeComboBox->addItem(tr(\"All DXCC Bands\"),\n                                   QVariant(static_cast<int>(DXCCBandScope::AllDXCCBands)));\n    ui->bandScopeComboBox->addItem(tr(\"Custom Band Selection\"),\n                                   QVariant(static_cast<int>(DXCCBandScope::Custom)));\n    ui->bandScopeComboBox->blockSignals(false);\n\n    int i = 0;\n    dxccBands = BandPlan::bandsList(false, true);\n    for ( const Band &band : static_cast<const QList<Band>&>(dxccBands) )\n    {\n        const QString &bandName = band.name;\n        QCheckBox *cb = new QCheckBox(bandName, this);\n        cb->setChecked(true);\n        cb->setObjectName(\"bandCheckBox_\" + bandName);\n\n        int row = i / MAXCOLUMNS;\n        int column = i % MAXCOLUMNS;\n        ui->bandGroup->addWidget(cb, row, column);\n        i++;\n\n        bandCheckBoxes.append(cb);\n        connect(cb, &QCheckBox::stateChanged, this, &DXCCSubmissionDialog::refreshTable);\n    }\n\n    // Band controls only visible when Custom scope is active\n    setBandControlsVisible(false);\n\n    ui->submissionTableView->setModel(tableModel);\n    ui->submissionTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n\n    connect(ui->buttonGroup, QOverload<QAbstractButton*>::of(&QButtonGroup::buttonClicked), this, [this](QAbstractButton*)\n    {\n        refreshTable();\n    });\n\n    ui->exportADIFButton->setEnabled(false);  // enabled once table has results\n\n    ui->submissionTableView->setItemDelegateForColumn(6, new DateFormatDelegate(ui->submissionTableView));\n    refreshTable();\n}\n\nDXCCSubmissionDialog::~DXCCSubmissionDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid DXCCSubmissionDialog::onBandScopeChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    const DXCCBandScope scope = currentScope();\n    setBandControlsVisible(scope == DXCCBandScope::Custom);\n    refreshTable();\n}\n\nvoid DXCCSubmissionDialog::onFiveBandClicked()\n{\n    FCT_IDENTIFICATION;\n\n    ui->bandScopeComboBox->blockSignals(true);\n    ui->bandScopeComboBox->setCurrentIndex(\n        ui->bandScopeComboBox->findData(static_cast<int>(DXCCBandScope::Custom)));\n    ui->bandScopeComboBox->blockSignals(false);\n\n    setBandControlsVisible(true);\n\n    selectBandPreset(FIVE_BAND_DXCC);\n    refreshTable();\n}\n\nvoid DXCCSubmissionDialog::onAllBandsClicked()\n{\n    FCT_IDENTIFICATION;\n\n    for ( QCheckBox *cb : static_cast<const QList<QCheckBox*>&>(bandCheckBoxes) )\n    {\n        cb->blockSignals(true);\n        cb->setChecked(true);\n        cb->blockSignals(false);\n    }\n}\n\nvoid DXCCSubmissionDialog::refreshTable()\n{\n    FCT_IDENTIFICATION;\n\n    if ( dxccBands.isEmpty() )\n        return;\n\n    const DXCCBandScope scope   = currentScope();\n    const bool perBand = (scope != DXCCBandScope::EntityLevel);\n    const bool isMixed = ui->mixedRadioButton->isChecked();\n\n    const QStringList selectedBands    = getSelectedBands(scope);\n    const QString     modeGroupFilter  = buildModeGroupFilter();\n\n    /**********************/\n    /* Confirmation Level */\n    /**********************/\n    // ARRL DXCC accepts LoTW and paper/direct QSL cards only.\n    QStringList confConds;\n    if (ui->lotwCheckBox->isChecked())   confConds << \"c.lotw_qsl_rcvd = 'Y'\";\n    if (ui->paperCheckBox->isChecked())  confConds << \"c.qsl_rcvd = 'Y'\";\n\n    if ( confConds.isEmpty() )\n    {\n        clearTable();\n        updateStatusLabel(0, selectedBands, scope);\n        return;\n    }\n\n    const QString confFilter = confConds.join(\" OR \");\n\n    QString bandWhereClause;\n    if ( perBand )\n    {\n        if ( selectedBands.isEmpty() )\n        {\n            clearTable();\n            updateStatusLabel(0, selectedBands, scope);\n            return;\n        }\n        QStringList quoted;\n        for ( const QString &b : selectedBands )\n            quoted << QString(\"'%1'\").arg(b);\n        bandWhereClause = QString(\"AND c.band IN (%1)\").arg(quoted.join(\",\"));\n    }\n\n    const QString myEntity  = getSelectedEntity();\n    const QString userFilter = (ui->userFilterComboBox->currentIndex() > 0)\n        ? \"AND \" + QSOFilterManager::instance()->getWhereClause(\n                       ui->userFilterComboBox->currentText())\n        : \"\";\n\n    // ── ADIF credit token selection ────────────────────────────────────────\n    //\n    // ARRL DXCC credit tokens stored in credit_submitted / credit_granted:\n    //   DXCC      — basic DXCC (any mode, any band)\n    //   DXCC_MODE — mode endorsement (CW / Phone / Digital, entity-level)\n    //   DXCC_BAND — band endorsement (any mode per band, incl. 5-Band DXCC)\n    //\n    // For per-band scope, only DXCC_BAND matters — 5-Band DXCC (and all band\n    // endorsements) require one contact per entity per band, ANY mode.  There\n    // is no separate \"CW on 80m\" credit token; the mode filter just controls\n    // which contacts are eligible to show/submit, not the credit token itself.\n    //\n    // For entity-level:\n    //   Mixed          → DXCC\n    //   CW/Phone/Digi  → DXCC_MODE  (filter ensures only that mode is shown)\n\n    const QString creditToken = perBand ? \"DXCC_BAND\"\n                              : (isMixed ? \"DXCC\" : \"DXCC_MODE\");\n\n    // ── slot_credits CTE ───────────────────────────────────────────────────\n    //\n    // Key fix: credit status is aggregated across ALL QSOs for the slot, not\n    // just the single \"best display\" QSO selected by ROW_NUMBER().\n    //\n    // Example failure case without this: a newer LoTW-matched Alaska-10m QSO\n    // is ranked #1 for display but has no credit_granted yet; an older QSO\n    // that was actually submitted already has credit_granted=DXCC_BAND.\n    // Without slot_credits the Alaska-10m slot would wrongly appear as\n    // \"not yet submitted.\"\n    //\n    // slot_credits does NOT apply confFilter — credit_granted is authoritative\n    // regardless of the current QSL confirmation state in QLog.\n    // For entity-level mode awards it DOES apply modeGroupFilter so we don't\n    // mistake a Phone credit for a CW-mode check.\n    // For per-band it does NOT apply modeGroupFilter (any mode earns DXCC_BAND).\n\n    const QString slotGroupBy    = perBand ? \"c.dxcc, c.band\" : \"c.dxcc\";\n    const QString slotModeFilter = (perBand || isMixed)\n                                   ? \"\"\n                                   : \"AND (\" + modeGroupFilter + \") \";\n\n    const QString slotCreditsCTE =\n        \"slot_credits AS ( \"\n        \"  SELECT \" + slotGroupBy + \", \"\n        \"    MAX(CASE WHEN \" + creditHas(\"c.credit_submitted\", creditToken) + \" THEN 1 ELSE 0 END) AS slot_submitted, \"\n        \"    MAX(CASE WHEN \" + creditHas(\"c.credit_granted\",   creditToken) + \" THEN 1 ELSE 0 END) AS slot_granted \"\n        \"  FROM contacts c \"\n        \"  INNER JOIN modes m ON c.mode = m.name \"\n        \"  WHERE c.my_dxcc = '\" + myEntity + \"' \"\n        \"    AND c.dxcc IS NOT NULL \"\n        \"    \" + slotModeFilter +\n        \"    \" + bandWhereClause + \" \"\n        \"    \" + userFilter + \" \"\n        \"  GROUP BY \" + slotGroupBy + \" \"\n        \") \";\n\n    // ── ranked CTE ────────────────────────────────────────────────────────\n    // Picks the single best confirmed QSO per slot for display purposes.\n    // Priority: LoTW confirmed > Paper confirmed > most recent.\n    // Mode and confirmation filters are applied so we show the most relevant\n    // contact matching the user's selection.\n\n    const QString partitionClause = perBand\n        ? \"PARTITION BY c.dxcc, c.band\"\n        : \"PARTITION BY c.dxcc\";\n\n    const QString rankedCTE =\n        \"ranked AS ( \"\n        \"  SELECT \"\n        \"    c.id, c.callsign, c.band, c.mode, c.start_time, c.dxcc, \"\n        \"    c.lotw_qsl_rcvd, c.qsl_rcvd, \"\n        \"    ROW_NUMBER() OVER ( \"\n        \"      \" + partitionClause + \" \"\n        \"      ORDER BY \"\n        \"        CASE WHEN c.lotw_qsl_rcvd = 'Y' THEN 0 ELSE 1 END, \"\n        \"        CASE WHEN c.qsl_rcvd       = 'Y' THEN 0 ELSE 1 END, \"\n        \"        c.start_time DESC \"\n        \"    ) AS rn \"\n        \"  FROM contacts c \"\n        \"  INNER JOIN modes m ON c.mode = m.name \"\n        \"  WHERE c.my_dxcc = '\" + myEntity + \"' \"\n        \"    AND c.dxcc IS NOT NULL \"\n        \"    AND (\" + confFilter + \") \"\n        \"    AND (\" + modeGroupFilter + \") \"\n        \"    \" + bandWhereClause + \" \"\n        \"    \" + userFilter + \" \"\n        \") \";\n\n    // ── JOIN condition between ranked best-QSO and slot_credits ───────────\n    const QString slotJoinOn = perBand\n        ? \"sc.dxcc = bc.dxcc AND sc.band = bc.band\"\n        : \"sc.dxcc = bc.dxcc\";\n\n    // ── Status filter (uses aggregated slot_credits columns) ───────────────\n    QStringList statusConds;\n    if (ui->showUnsubmittedCheckBox->isChecked())\n        statusConds << \"(sc.slot_submitted = 0 AND sc.slot_granted = 0)\";\n    if (ui->showSubmittedCheckBox->isChecked())\n        statusConds << \"(sc.slot_submitted = 1 AND sc.slot_granted = 0)\";\n    if (ui->showGrantedCheckBox->isChecked())\n        statusConds << \"(sc.slot_granted = 1)\";\n\n    if ( statusConds.isEmpty() )\n    {\n        clearTable();\n        updateStatusLabel(0, selectedBands, scope);\n        return;\n    }\n    const QString statusFilter = \"(\" + statusConds.join(\" OR \") + \")\";\n\n    // ── Final SQL ──────────────────────────────────────────────────────────\n    // Column 0 is the contact id — hidden in the table view but used by\n    // exportAsADIF() to fetch full contact records for the export.\n    const QString sql =\n        \"WITH \" + slotCreditsCTE + \", \" + rankedCTE +\n        \"SELECT \"\n        \"  bc.id, \"                                                                        // col 0 (hidden)\n        \"  translate_to_locale(e.name)  AS '\" + tr(\"Entity\")    + \"', \"                   // col 1\n        \"  e.prefix AS '\" + tr(\"Prefix\")   + \"', \"                                        // col 2\n        \"  bc.callsign AS '\" + tr(\"Callsign\") + \"', \"                                     // col 3\n        \"  bc.band  AS '\" + tr(\"Band\")     + \"', \"                                        // col 4\n        \"  bc.mode  AS '\" + tr(\"Mode\")     + \"', \"                                        // col 5\n        \"  strftime('%Y-%m-%d', bc.start_time) AS '\" + tr(\"Date\") + \"', \"                 // col 6\n        \"  CASE WHEN bc.lotw_qsl_rcvd = 'Y' THEN 'Y' ELSE '' END AS '\" + tr(\"LoTW\")  + \"', \" // col 7\n        \"  CASE WHEN bc.qsl_rcvd      = 'Y' THEN 'Y' ELSE '' END AS '\" + tr(\"Paper\") + \"', \" // col 8\n        \"  CASE WHEN sc.slot_submitted = 1   THEN 'Y' ELSE '' END AS '\" + tr(\"Submitted\") + \"', \" // col 9\n        \"  CASE WHEN sc.slot_granted   = 1   THEN 'Y' ELSE '' END AS '\" + tr(\"Granted\")   + \"'  \" // col 10\n        \"FROM ranked bc \"\n        \"INNER JOIN dxcc_entities_clublog e ON bc.dxcc = e.id \"\n        \"INNER JOIN slot_credits sc ON \" + slotJoinOn + \" \"\n        \"WHERE bc.rn = 1 \"\n        \"  AND \" + statusFilter + \" \"\n        \"ORDER BY e.name COLLATE LOCALEAWARE ASC, bc.band ASC \";\n\n    qCDebug(runtime) << \"DXCC Submission SQL:\" << sql;\n\n    tableModel->setQuery(sql);\n\n    if ( tableModel->lastError().isValid() )\n        qCWarning(runtime) << \"DXCC Submission query error:\"\n                           << tableModel->lastError().text();\n\n    while (tableModel->canFetchMore())\n        tableModel->fetchMore();\n\n    // Column 0 carries the contact id for export — keep it hidden from the user\n    ui->submissionTableView->setColumnHidden(0, true);\n\n    const int count = tableModel->rowCount();\n    ui->exportADIFButton->setEnabled(count > 0);\n    updateStatusLabel(count, selectedBands, scope);\n}\n\nvoid DXCCSubmissionDialog::exportAsADIF()\n{\n    FCT_IDENTIFICATION;\n\n    // Collect contact IDs from hidden column 0 of the current result set\n    QStringList ids;\n    for ( int row = 0; row < tableModel->rowCount(); ++row )\n    {\n        const QString id = tableModel->data(tableModel->index(row, 0)).toString();\n        if ( !id.isEmpty() )\n            ids << id;\n    }\n\n    if ( ids.isEmpty() )\n    {\n        QMessageBox::information(this, tr(\"Export ADIF\"),\n                                 tr(\"No contacts to export.\"));\n        return;\n    }\n\n    // Fetch full contact records so ExportDialog has all ADIF fields available\n    QSqlQuery query;\n    if (!query.exec(QString(\"SELECT * FROM contacts WHERE id IN (%1) \"\n                            \"ORDER BY start_time ASC\").arg(ids.join(\",\"))))\n    {\n        qCWarning(runtime) << \"DXCC export fetch error:\" << query.lastError().text();\n        QMessageBox::critical(this, tr(\"Export ADIF\"),\n                              tr(\"Failed to retrieve contact records.\"));\n        return;\n    }\n\n    QList<QSqlRecord> records;\n    while ( query.next() )\n        records << query.record();\n\n    if ( records.isEmpty() )\n        return;\n\n    ExportDialog dialog(records, this);\n    dialog.setWindowTitle(tr(\"Export DXCC Submission List as ADIF\"));\n    dialog.exec();\n}\n\nconst QString DXCCSubmissionDialog::getSelectedEntity() const\n{\n    FCT_IDENTIFICATION;\n\n    const int row = ui->myEntityComboBox->currentIndex();\n    const QModelIndex idx = ui->myEntityComboBox->model()->index(row, 0);\n    return ui->myEntityComboBox->model()->data(idx).toString();\n}\n\nQStringList DXCCSubmissionDialog::getSelectedBands(DXCCBandScope scope) const\n{\n    FCT_IDENTIFICATION;\n\n    switch (scope)\n    {\n    case DXCCBandScope::FiveBand:\n        return FIVE_BAND_DXCC;\n\n    case DXCCBandScope::AllDXCCBands:\n    {\n        QStringList all;\n        all.reserve(dxccBands.size());\n        for (const Band &b : dxccBands)\n            all << b.name;\n        return all;\n    }\n\n    case DXCCBandScope::Custom:\n    {\n        QStringList selected;\n        for ( const QCheckBox *cb : static_cast<const QList<QCheckBox*>&>(bandCheckBoxes) )\n            if (cb->isChecked())\n                selected << cb->text();\n        return selected;\n    }\n\n    default:\n        return {};\n    }\n}\n\nQString DXCCSubmissionDialog::buildModeGroupFilter() const\n{\n    FCT_IDENTIFICATION;\n\n    if (ui->cwRadioButton->isChecked())           return \"m.dxcc = 'CW'\";\n    if (ui->phoneRadioButton->isChecked())        return \"m.dxcc = 'PHONE'\";\n    if (ui->digitalRadioButton->isChecked())      return \"m.dxcc = 'DIGITAL'\";\n    return \"m.dxcc IN ('CW', 'PHONE', 'DIGITAL')\";  // Mixed\n}\n\nvoid DXCCSubmissionDialog::selectBandPreset(const QStringList &bands)\n{\n    FCT_IDENTIFICATION;\n\n    for ( QCheckBox *cb : static_cast<const QList<QCheckBox*>&>(bandCheckBoxes) )\n    {\n        cb->blockSignals(true);\n        cb->setChecked(bands.contains(cb->text(), Qt::CaseInsensitive));\n        cb->blockSignals(false);\n    }\n}\n\nvoid DXCCSubmissionDialog::updateStatusLabel(int count, const QStringList &selectedBands, DXCCBandScope scope)\n{\n    FCT_IDENTIFICATION;\n\n    const bool perBand = ( scope != DXCCBandScope::EntityLevel) ;\n    QString modeStr;\n\n    if      ( ui->cwRadioButton->isChecked() )      modeStr = tr(\"CW\");\n    else if ( ui->phoneRadioButton->isChecked() )   modeStr = tr(\"Phone\");\n    else if ( ui->digitalRadioButton->isChecked() ) modeStr = tr(\"Digital\");\n    else                                            modeStr = tr(\"Mixed\");\n\n    QString scopeStr;\n\n    switch ( scope )\n    {\n    case DXCCBandScope::EntityLevel:  scopeStr = tr(\"any band\");  break;\n    case DXCCBandScope::FiveBand:     scopeStr = tr(\"5-band\");    break;\n    case DXCCBandScope::AllDXCCBands: scopeStr = tr(\"all bands\"); break;\n    case DXCCBandScope::Custom:\n        scopeStr = tr(\"%1 selected band(s)\").arg(selectedBands.size());\n        break;\n    }\n\n    if ( count == 0 )\n        ui->statusLabel->setText(tr(\"No contacts match the selected criteria.\"));\n    else\n        ui->statusLabel->setText(\n                    tr(\"%1 %2 %3 — DXCC %4 / %5\")\n                    .arg(count)\n                    .arg(perBand ? tr(\"band-slot\") : tr(\"entity\"))\n                    .arg(count == 1 ? tr(\"entry\") : tr(\"entries\"))\n                    .arg(modeStr)\n                    .arg(scopeStr));\n}\n\nvoid DXCCSubmissionDialog::setBandControlsVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->bandGroup->count(); ++i)\n    {\n        QLayoutItem *item = ui->bandGroup->itemAt(i);\n        if ( QWidget *w = item->widget() )\n            w->setVisible(visible);\n    }\n    ui->bandsLabel->setVisible(visible);\n    ui->fiveBandButton->setVisible(visible);\n    ui->allBandsButton->setVisible(visible);\n}\n\nDXCCSubmissionDialog::DXCCBandScope DXCCSubmissionDialog::currentScope() const\n{\n    FCT_IDENTIFICATION;\n\n    return static_cast<DXCCBandScope>(ui->bandScopeComboBox->currentData().toInt());\n}\n\nvoid DXCCSubmissionDialog::clearTable()\n{\n    tableModel->setQuery(QString());\n}\n"
  },
  {
    "path": "ui/DXCCSubmissionDialog.h",
    "content": "#ifndef QLOG_UI_DXCCSUBMISSIONDIALOG_H\n#define QLOG_UI_DXCCSUBMISSIONDIALOG_H\n\n#include <QDialog>\n#include <QSqlQueryModel>\n#include <QCheckBox>\n#include <QList>\n#include <QSqlRecord>\n#include \"models/SqlListModel.h\"\n#include \"data/Band.h\"\n\nnamespace Ui {\nclass DXCCSubmissionDialog;\n}\n\n\nclass DXCCSubmissionDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit DXCCSubmissionDialog(QWidget *parent = nullptr);\n    ~DXCCSubmissionDialog();\n\n    // DXCC band scope presets\n    enum class DXCCBandScope\n    {\n        EntityLevel,   // Any band — one entry per entity (basic DXCC)\n        FiveBand,      // 80/40/20/15/10m preset\n        AllDXCCBands,  // All enabled DXCC bands, per band\n        Custom         // User-selected bands\n    };\n\npublic slots:\n    void refreshTable();\n    void onBandScopeChanged(int index);\n    void onFiveBandClicked();\n    void onAllBandsClicked();\n    void exportAsADIF();\n\nprivate:\n    Ui::DXCCSubmissionDialog *ui;\n    QSqlQueryModel *tableModel;\n    SqlListModel   *entityCallsignModel;\n\n    // Band checkboxes added dynamically\n    QList<QCheckBox*> bandCheckBoxes;\n    QList<Band>       dxccBands;\n    const quint8 MAXCOLUMNS = 14;\n\n    // Helpers\n    const QString getSelectedEntity() const;\n    QStringList   getSelectedBands(DXCCBandScope scope) const;\n    QString       buildModeGroupFilter() const;\n    void          selectBandPreset(const QStringList &bands);\n    void          updateStatusLabel(int count,\n                                    const QStringList &selectedBands,\n                                    DXCCBandScope scope);\n    void          setBandControlsVisible(bool visible);\n    DXCCBandScope currentScope() const;\n    void          clearTable();\n    const QStringList FIVE_BAND_DXCC = { \"80m\", \"40m\", \"20m\", \"15m\", \"10m\" };\n};\n\n#endif // QLOG_UI_DXCCSUBMISSIONDIALOG_H\n"
  },
  {
    "path": "ui/DXCCSubmissionDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DXCCSubmissionDialog</class>\n <widget class=\"QDialog\" name=\"DXCCSubmissionDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>803</width>\n    <height>617</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>DXCC Submission List</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"optionsGroupBox\">\n     <property name=\"title\">\n      <string>Options</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"optionsFormLayout\">\n      <property name=\"horizontalSpacing\">\n       <number>4</number>\n      </property>\n      <property name=\"verticalSpacing\">\n       <number>3</number>\n      </property>\n      <property name=\"leftMargin\">\n       <number>6</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>2</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>6</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>4</number>\n      </property>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"myEntityLabel\">\n        <property name=\"text\">\n         <string>My DXCC Entity</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"entityFilterLayout\">\n        <item>\n         <widget class=\"QComboBox\" name=\"myEntityComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer1\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>30</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"userFilterLabel\">\n          <property name=\"text\">\n           <string>User Filter</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer2\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>10</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"userFilterComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer3\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"awardCategoryLabel\">\n        <property name=\"text\">\n         <string>Category</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"awardCategoryLayout\">\n        <item>\n         <widget class=\"QRadioButton\" name=\"mixedRadioButton\">\n          <property name=\"text\">\n           <string>Mixed</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n          <attribute name=\"buttonGroup\">\n           <string notr=\"true\">buttonGroup</string>\n          </attribute>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"cwRadioButton\">\n          <property name=\"text\">\n           <string>CW</string>\n          </property>\n          <attribute name=\"buttonGroup\">\n           <string notr=\"true\">buttonGroup</string>\n          </attribute>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"phoneRadioButton\">\n          <property name=\"text\">\n           <string>Phone</string>\n          </property>\n          <attribute name=\"buttonGroup\">\n           <string notr=\"true\">buttonGroup</string>\n          </attribute>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"digitalRadioButton\">\n          <property name=\"text\">\n           <string>Digital</string>\n          </property>\n          <attribute name=\"buttonGroup\">\n           <string notr=\"true\">buttonGroup</string>\n          </attribute>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer4\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QLabel\" name=\"confirmedByLabel\">\n        <property name=\"text\">\n         <string>Confirmed by</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"qslConfirmLayout\">\n        <property name=\"spacing\">\n         <number>25</number>\n        </property>\n        <item>\n         <widget class=\"QCheckBox\" name=\"lotwCheckBox\">\n          <property name=\"text\">\n           <string>LoTW</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"paperCheckBox\">\n          <property name=\"text\">\n           <string>Paper</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer7\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"3\" column=\"0\">\n       <widget class=\"QLabel\" name=\"showStatusLabel\">\n        <property name=\"text\">\n         <string>Show</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"showStatusLayout\">\n        <property name=\"spacing\">\n         <number>25</number>\n        </property>\n        <item>\n         <widget class=\"QCheckBox\" name=\"showUnsubmittedCheckBox\">\n          <property name=\"text\">\n           <string>Not Yet Submitted</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"showSubmittedCheckBox\">\n          <property name=\"text\">\n           <string>Submitted (Not Granted)</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"showGrantedCheckBox\">\n          <property name=\"text\">\n           <string>Already Granted</string>\n          </property>\n          <property name=\"checked\">\n           <bool>false</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer8\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"4\" column=\"0\">\n       <widget class=\"QLabel\" name=\"bandScopeLabel\">\n        <property name=\"text\">\n         <string>Band Scope</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"4\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"bandScopeLayout\">\n        <item>\n         <widget class=\"QComboBox\" name=\"bandScopeComboBox\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer5\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>10</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"fiveBandButton\">\n          <property name=\"toolTip\">\n           <string>Select 5-Band DXCC preset bands (80/40/20/15/10m)</string>\n          </property>\n          <property name=\"text\">\n           <string>5-Band DXCC</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Maximum</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>10</width>\n            <height>10</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"allBandsButton\">\n          <property name=\"toolTip\">\n           <string>Select all DXCC-eligible bands</string>\n          </property>\n          <property name=\"text\">\n           <string>All DXCC Bands</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"hSpacer6\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"5\" column=\"0\">\n       <widget class=\"QLabel\" name=\"bandsLabel\">\n        <property name=\"text\">\n         <string>Bands</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"5\" column=\"1\">\n       <layout class=\"QGridLayout\" name=\"bandGroup\"/>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLabel\" name=\"statusLabel\">\n     <property name=\"text\">\n      <string>Select options above and the list will update automatically.</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTableView\" name=\"submissionTableView\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"editTriggers\">\n      <set>QAbstractItemView::NoEditTriggers</set>\n     </property>\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::NoSelection</enum>\n     </property>\n     <property name=\"verticalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"horizontalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <attribute name=\"horizontalHeaderCascadingSectionResizes\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderVisible\">\n      <bool>false</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderMinimumSectionSize\">\n      <number>20</number>\n     </attribute>\n     <attribute name=\"verticalHeaderDefaultSectionSize\">\n      <number>20</number>\n     </attribute>\n     <attribute name=\"verticalHeaderHighlightSections\">\n      <bool>false</bool>\n     </attribute>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"bottomLayout\">\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"exportADIFButton\">\n       <property name=\"toolTip\">\n        <string>Export the contacts listed above to an ADIF file</string>\n       </property>\n       <property name=\"text\">\n        <string>Export</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"document-save-as\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"bottomSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Close</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>259</x>\n     <y>738</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myEntityComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>177</x>\n     <y>50</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>402</x>\n     <y>50</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>bandScopeComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>onBandScopeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>177</x>\n     <y>176</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>lotwCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>168</x>\n     <y>113</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>paperCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>241</x>\n     <y>113</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>showUnsubmittedCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>214</x>\n     <y>144</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>showSubmittedCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>401</x>\n     <y>144</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>showGrantedCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>refreshTable()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>580</x>\n     <y>144</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>fiveBandButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>onFiveBandClicked()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>294</x>\n     <y>176</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>allBandsButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>onAllBandsClicked()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>426</x>\n     <y>176</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportADIFButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DXCCSubmissionDialog</receiver>\n   <slot>exportAsADIF()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>76</x>\n     <y>725</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>549</x>\n     <y>374</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>refreshTable()</slot>\n  <slot>onBandScopeChanged(int)</slot>\n  <slot>onFiveBandClicked()</slot>\n  <slot>onAllBandsClicked()</slot>\n  <slot>exportAsADIF()</slot>\n </slots>\n <buttongroups>\n  <buttongroup name=\"buttonGroup\"/>\n </buttongroups>\n</ui>\n"
  },
  {
    "path": "ui/DevToolsDialog.cpp",
    "content": "#include \"DevToolsDialog.h\"\n#include \"ui_DevToolsDialog.h\"\n#include \"ui/component/SqlHighlighter.h\"\n#include \"ui/ExportDialog.h\"\n#include \"core/LogDatabase.h\"\n#include \"core/debug.h\"\n\n#include <QCheckBox>\n#include <QDir>\n#include <QElapsedTimer>\n#include <QFile>\n#include <QFileDialog>\n#include <QFileInfo>\n#include <QFontDatabase>\n#include <QHeaderView>\n#include <QKeyEvent>\n#include <QLineEdit>\n#include <QMenu>\n#include <QMessageBox>\n#include <QSettings>\n#include <QSqlDatabase>\n#include <QSqlError>\n#include <QSqlQuery>\n#include <QSqlRecord>\n#include <QTextStream>\n\nMODULE_IDENTIFICATION(\"qlog.ui.devtoolsdialog\");\n\nconst QString DevToolsDialog::READ_ONLY_CONNECTION(\"DevToolsDialog_readonly\");\n\n// ---------------------------------------------------------------------------\n// Construction / destruction\n// ---------------------------------------------------------------------------\n\nDevToolsDialog::DevToolsDialog(QWidget *parent)\n    : QDialog(parent),\n      ui(new Ui::DevToolsDialog),\n      highlighter(nullptr),\n      queryModel(new QSqlQueryModel(this)),\n      sortProxy(new QSortFilterProxyModel(this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    // Open a separate read-only connection to the database.\n    // SQLite itself enforces read-only access - no keyword blocklist needed.\n    {\n        QSqlDatabase roDb = QSqlDatabase::addDatabase(\"QSQLITE\", READ_ONLY_CONNECTION);\n        roDb.setDatabaseName(LogDatabase::dbFilename());\n        roDb.setConnectOptions(\"QSQLITE_OPEN_READONLY;QSQLITE_ENABLE_REGEXP\");\n        if ( !roDb.open() )\n            qCWarning(runtime) << \"Cannot open read-only DB connection:\" << roDb.lastError().text();\n    }\n\n    // Restore geometry & splitter state\n    QSettings settings;\n    restoreGeometry(settings.value(\"devtools/geometry\").toByteArray());\n    ui->splitter->restoreState(settings.value(\"devtools/splitter\").toByteArray());\n    if ( ui->splitter->sizes().value(0, 0) == 0 )\n    {\n        // First run - default split\n        ui->splitter->setSizes({250, 450});\n    }\n\n    // Monospace font for the editor\n    QFont editorFont = QFontDatabase::systemFont(QFontDatabase::FixedFont);\n    editorFont.setPointSize(10);\n    ui->sqlEditor->setFont(editorFont);\n\n    // Syntax highlighter\n    highlighter = new SqlHighlighter(ui->sqlEditor->document());\n\n    // Results model + sortable proxy\n    sortProxy->setSourceModel(queryModel);\n    ui->resultsTable->setModel(sortProxy);\n    ui->resultsTable->horizontalHeader()->setStretchLastSection(true);\n    ui->resultsTable->verticalHeader()->setVisible(false);\n\n    // Export drop-down menu\n    QMenu *exportMenu = new QMenu(this);\n    connect(exportMenu->addAction(tr(\"TXT\")), &QAction::triggered,\n            this, &DevToolsDialog::exportAsTxt);\n    connect(exportMenu->addAction(tr(\"CSV\")), &QAction::triggered,\n            this, &DevToolsDialog::exportAsCsv);\n    connect(exportMenu->addAction(tr(\"ADI\")), &QAction::triggered,\n            this, &DevToolsDialog::exportAsAdif);\n    ui->exportButton->setMenu(exportMenu);\n\n    ui->sqlEditor->installEventFilter(this);\n\n    // Load db schema into highlighter\n    loadSchema();\n\n    // Debug log controls\n    ui->logToFileCheckBox->setChecked(isLogToFileEnabled());\n    updateDebugLogFileLabel();\n}\n\nDevToolsDialog::~DevToolsDialog()\n{\n    QSettings settings;\n    settings.setValue(\"devtools/geometry\",  saveGeometry());\n    settings.setValue(\"devtools/splitter\",  ui->splitter->saveState());\n    delete ui;\n\n    // Must be removed after all QSql* objects using it are destroyed\n    QSqlDatabase::removeDatabase(READ_ONLY_CONNECTION);\n}\n\n// ---------------------------------------------------------------------------\n// Schema loading\n// ---------------------------------------------------------------------------\n\nvoid DevToolsDialog::loadSchema()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList schemaIds;\n    QSqlDatabase roDb = QSqlDatabase::database(READ_ONLY_CONNECTION);\n\n    QSqlQuery q(roDb);\n    if ( q.exec(\"SELECT name FROM sqlite_master WHERE type IN ('table','view') ORDER BY name\") )\n    {\n        while ( q.next() )\n        {\n            const QString tableName = q.value(0).toString();\n            schemaIds.append(tableName);\n\n            QSqlQuery colQ(roDb);\n            if ( colQ.exec(QString(\"PRAGMA table_info(\\\"%1\\\")\").arg(tableName)) )\n            {\n                while ( colQ.next() )\n                {\n                    const QString col = colQ.value(1).toString();\n                    if ( !schemaIds.contains(col, Qt::CaseInsensitive) )\n                        schemaIds.append(col);\n                }\n            }\n            else\n            {\n                qCWarning(runtime) << \"PRAGMA table_info failed for\" << tableName\n                                   << colQ.lastError().text();\n            }\n        }\n    }\n    else\n    {\n        qCWarning(runtime) << \"Failed to query sqlite_master:\" << q.lastError().text();\n    }\n\n    // Highlight schema names (tables, columns) in a distinct color\n    highlighter->setUserIdentifiers(schemaIds);\n}\n\n// ---------------------------------------------------------------------------\n// Event filter - keyboard shortcuts\n// ---------------------------------------------------------------------------\n\nbool DevToolsDialog::eventFilter(QObject *obj, QEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    if ( obj != ui->sqlEditor || event->type() != QEvent::KeyPress )\n        return QDialog::eventFilter(obj, event);\n\n    QKeyEvent *ke = static_cast<QKeyEvent *>(event);\n\n    // Ctrl+Return - run query\n    if ( ke->key() == Qt::Key_Return\n         && ( ke->modifiers() & Qt::ControlModifier ) )\n    {\n        runQuery();\n        return true;\n    }\n\n    return false;\n}\n\n// ---------------------------------------------------------------------------\n// File operations\n// ---------------------------------------------------------------------------\n\nvoid DevToolsDialog::openQuery()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n    const QString lastDir = settings.value(\"devtools/lastDir\", QDir::homePath()).toString();\n\n    const QString filename = QFileDialog::getOpenFileName(\n        this, tr(\"Open SQL Query\"), lastDir,\n        tr(\"SQL Files (*.sql);;All Files (*)\"));\n\n    if ( filename.isEmpty() )\n        return;\n\n    QFile file(filename);\n    if ( !file.open(QIODevice::ReadOnly | QIODevice::Text) )\n    {\n        QMessageBox::warning(this, tr(\"Open Error\"),\n            tr(\"Cannot open file:\\n%1\").arg(file.errorString()));\n        return;\n    }\n\n    QTextStream in(&file);\n    ui->sqlEditor->setPlainText(in.readAll());\n    settings.setValue(\"devtools/lastDir\", QFileInfo(filename).absolutePath());\n}\n\nvoid DevToolsDialog::saveQuery()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n    const QString lastDir = settings.value(\"devtools/lastDir\", QDir::homePath()).toString();\n\n    QString filename = QFileDialog::getSaveFileName(\n        this, tr(\"Save SQL Query\"), lastDir,\n        tr(\"SQL Files (*.sql);;All Files (*)\"));\n\n    if ( filename.isEmpty() )\n        return;\n\n    if ( !filename.endsWith(\".sql\", Qt::CaseInsensitive) )\n        filename += \".sql\";\n\n    QFile file(filename);\n    if ( !file.open(QIODevice::WriteOnly | QIODevice::Text) )\n    {\n        QMessageBox::warning(this, tr(\"Save Error\"),\n            tr(\"Cannot save file:\\n%1\").arg(file.errorString()));\n        return;\n    }\n\n    QTextStream out(&file);\n    out << ui->sqlEditor->toPlainText();\n    settings.setValue(\"devtools/lastDir\", QFileInfo(filename).absolutePath());\n    ui->statusLabel->setText(tr(\"Query saved to %1\").arg(QFileInfo(filename).fileName()));\n}\n\n// ---------------------------------------------------------------------------\n// Run query\n// ---------------------------------------------------------------------------\n\nvoid DevToolsDialog::runQuery()\n{\n    FCT_IDENTIFICATION;\n\n    const QString sql = ui->sqlEditor->toPlainText().trimmed();\n\n    if ( sql.isEmpty() )\n        return;\n\n    QElapsedTimer timer;\n    timer.start();\n\n    // Execute via the read-only connection; SQLite rejects any write attempt\n    queryModel->setQuery(sql, QSqlDatabase::database(READ_ONLY_CONNECTION));\n\n    if ( queryModel->lastError().isValid() )\n    {\n        ui->statusLabel->setText(\n            tr(\"Error: %1\").arg(queryModel->lastError().text()));\n        ui->statusLabel->setStyleSheet(\"QLabel { color : red; }\");\n        return;\n    }\n    ui->statusLabel->setStyleSheet(\"\");\n\n    // Fetch rows in batches; cap at a reasonable limit to avoid blocking UI\n    while ( queryModel->canFetchMore() && queryModel->rowCount() < MAX_FETCH_ROWS )\n        queryModel->fetchMore();\n\n    const qint64 elapsed = timer.elapsed();\n    const int rows = queryModel->rowCount();\n    const bool truncated = queryModel->canFetchMore();\n\n    ui->resultsTable->resizeColumnsToContents();\n    if ( truncated )\n        ui->statusLabel->setText(\n            tr(\"%1 row(s) shown (truncated at %2) in %3 ms\")\n            .arg(rows).arg(MAX_FETCH_ROWS).arg(elapsed));\n    else\n        ui->statusLabel->setText(\n            tr(\"%1 row(s) returned in %2 ms\").arg(rows).arg(elapsed));\n}\n\n// ---------------------------------------------------------------------------\n// Export helpers\n// ---------------------------------------------------------------------------\n\nstatic bool openFileForWrite(QWidget *parent,\n                             const QString &caption,\n                             const QString &filter,\n                             const QString &defaultSuffix,\n                             QString &outPath)\n{\n    QSettings settings;\n    const QString lastDir = settings.value(\"devtools/lastDir\", QDir::homePath()).toString();\n\n    QString path = QFileDialog::getSaveFileName(parent, caption, lastDir, filter);\n\n    if ( path.isEmpty() )\n        return false;\n\n    if ( !defaultSuffix.isEmpty()\n         && !path.endsWith('.' + defaultSuffix, Qt::CaseInsensitive) )\n        path += '.' + defaultSuffix;\n\n    settings.setValue(\"devtools/lastDir\", QFileInfo(path).absolutePath());\n    outPath = path;\n    return true;\n}\n\nvoid DevToolsDialog::exportModel( const QString &title,\n                                  const QString &filter,\n                                  const QString &defaultExt,\n                                  const QString &separator,\n                                  std::function<QString(const QString&)> formatter)\n{\n    FCT_IDENTIFICATION;\n\n    if ( queryModel->rowCount() == 0 )\n    {\n        QMessageBox::information(this, tr(\"Export\"),\n                                 tr(\"No results to export.\"));\n        return;\n    }\n\n    QString filename;\n    if ( !openFileForWrite(this, title, filter, defaultExt, filename) )\n        return;\n\n    QFile file(filename);\n    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))\n    {\n        QMessageBox::warning(this, tr(\"Export Error\"),\n                             tr(\"Cannot open file for writing:\\n%1\")\n                             .arg(file.errorString()));\n        return;\n    }\n\n    QTextStream out(&file);\n    const int rows = queryModel->rowCount();\n    const int cols = queryModel->columnCount();\n\n    std::function<void(std::function<QString(int)>)>\n            writeRow = [&](std::function<QString(int)> dataProvider)\n    {\n        QStringList row;\n        row.reserve(cols);\n\n        for (int c = 0; c < cols; ++c)\n            row << formatter(dataProvider(c));\n\n        out << row.join(separator) << \"\\n\";\n    };\n\n    // header\n    writeRow([&](int c)\n    {\n        return queryModel->headerData(c, Qt::Horizontal).toString();\n    });\n\n    // data\n    for ( int r = 0; r < rows; ++r )\n    {\n        writeRow([&](int c)\n        {\n            return queryModel->data(queryModel->index(r, c)).toString();\n        });\n    }\n\n    ui->statusLabel->setText(tr(\"Exported %1 row(s) to %2\").arg(rows)\n                                                           .arg(QFileInfo(filename).fileName()));\n}\n\nvoid DevToolsDialog::exportAsTxt()\n{\n    FCT_IDENTIFICATION;\n\n    exportModel(tr(\"TXT\"),\n                tr(\"Text Files (*.txt);;All Files (*)\"),\n                \"txt\",\n                \"\\t\",\n                [](const QString &s) { return s; });\n}\n\nvoid DevToolsDialog::exportAsCsv()\n{\n    FCT_IDENTIFICATION;\n\n    auto csvEscape = [](const QString &s) -> QString\n    {\n        if (s.contains(',') || s.contains('\"') || s.contains('\\n') || s.contains('\\r'))\n            return '\"' + QString(s).replace('\"', \"\\\"\\\"\") + '\"';\n        return s;\n    };\n\n    exportModel(tr(\"CSV\"),\n                tr(\"CSV Files (*.csv);;All Files (*)\"),\n                \"csv\",\n                \",\",\n                csvEscape);\n}\n\nvoid DevToolsDialog::exportAsAdif()\n{\n    FCT_IDENTIFICATION;\n\n    if ( queryModel->rowCount() == 0 )\n    {\n        QMessageBox::information(this, tr(\"Export\"),\n            tr(\"No results to export.\"));\n        return;\n    }\n\n    // Locate an 'id' column in the result set\n    int idCol = -1;\n    for ( int c = 0; c < queryModel->columnCount(); ++c )\n    {\n        if ( queryModel->headerData(c, Qt::Horizontal)\n                .toString().compare(\"id\", Qt::CaseInsensitive) == 0 )\n        {\n            idCol = c;\n            break;\n        }\n    }\n\n    if ( idCol < 0 )\n    {\n        QMessageBox::warning(this, tr(\"ADIF Export\"),\n            tr(\"ADIF export requires the query to include the contacts 'id' column.\\n\\n\"\n               \"Example:\\n\"\n               \"  SELECT id, callsign FROM contacts WHERE ...\"));\n        return;\n    }\n\n    // Collect all contact IDs from the result (validated as numbers)\n    QList<qlonglong> ids;\n    for ( int r = 0; r < queryModel->rowCount(); ++r )\n    {\n        const QVariant id = queryModel->data(queryModel->index(r, idCol));\n        bool ok = false;\n        const qlonglong numId = id.toLongLong(&ok);\n        if ( ok )\n            ids << numId;\n    }\n\n    if ( ids.isEmpty() )\n    {\n        QMessageBox::information(this, tr(\"ADIF Export\"),\n            tr(\"No valid contact IDs found in the result set.\"));\n        return;\n    }\n\n    // Build parameterized placeholders for the ID list\n    QStringList placeholders;\n    for ( int i = 0; i < ids.size(); ++i )\n        placeholders << \"?\";\n\n    QSqlQuery fetchQ;\n    if ( ! fetchQ.prepare(QString(\"SELECT * FROM contacts WHERE id IN (%1) ORDER BY start_time ASC\").arg(placeholders.join(','))))\n    {\n        qWarning() << \"Cannot prepare select statement for contacts table\";\n        return;\n    }\n    for ( int i = 0; i < ids.size(); ++i )\n        fetchQ.addBindValue(ids.at(i));\n\n    if ( !fetchQ.exec() )\n    {\n        QMessageBox::warning(this, tr(\"ADIF Export\"),\n            tr(\"Failed to retrieve contact records:\\n%1\")\n            .arg(fetchQ.lastError().text()));\n        return;\n    }\n\n    QList<QSqlRecord> records;\n    while ( fetchQ.next() )\n        records.append(fetchQ.record());\n\n    if ( records.isEmpty() )\n    {\n        QMessageBox::information(this, tr(\"ADIF Export\"),\n            tr(\"No matching contacts found in the database.\"));\n        return;\n    }\n\n    // Hand off to the standard ExportDialog (same path as LogbookWidget right-click)\n    ExportDialog dialog(records, this);\n    dialog.exec();\n}\n\n// ---------------------------------------------------------------------------\n// Debug log controls\n// ---------------------------------------------------------------------------\n\nvoid DevToolsDialog::logToFileToggled(bool checked)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << checked;\n\n    if ( !checked )\n    {\n        // Close the current log file so that re-enabling creates a new one\n        setLogToFile(false);\n        closeDebugLogFile();\n    }\n    else\n    {\n        setLogToFile(true);\n        // Force a log message so that the new log file gets created immediately\n        qWarning() << \"Debug file logging enabled by user\";\n    }\n\n    updateDebugLogFileLabel();\n}\n\nvoid DevToolsDialog::applyLoggingRules()\n{\n    FCT_IDENTIFICATION;\n\n    const QString userRules = ui->loggingRulesEdit->text().trimmed();\n\n    if ( userRules.isEmpty() )\n    {\n        // Empty rules - back to production defaults\n        set_debug_level(LEVEL_PRODUCTION);\n        ui->statusLabel->setText(tr(\"Logging rules cleared (defaults)\"));\n    }\n    else\n    {\n        // Disable all debug first, then apply user rules on top\n        const QString fullRules = \"*.debug=false\\n\" + userRules;\n        QLoggingCategory::setFilterRules(fullRules);\n        ui->statusLabel->setText(tr(\"Logging rules applied\"));\n    }\n}\n\nvoid DevToolsDialog::saveDebugLog()\n{\n    FCT_IDENTIFICATION;\n\n    const QString logFilename = currentDebugLogFilename();\n\n    if ( logFilename.isEmpty() || !QFile::exists(logFilename) )\n    {\n        QMessageBox::information(this,\n                                 tr(\"Save Debug Log\"),\n                                 tr(\"No debug log file is currently being written\"));\n        return;\n    }\n\n    QSettings settings;\n    const QString lastDir = settings.value(\"devtools/lastDir\", QDir::homePath()).toString();\n\n    QString destFilename = QFileDialog::getSaveFileName(\n        this, tr(\"Save Debug Log\"),\n        lastDir + \"/\" + QFileInfo(logFilename).fileName(),\n        tr(\"Log Files (*.log);;All Files (*)\"));\n\n    if ( destFilename.isEmpty() )\n        return;\n\n    if ( !destFilename.endsWith(\".log\", Qt::CaseInsensitive) )\n        destFilename += \".log\";\n\n    if ( QFile::exists(destFilename) )\n        QFile::remove(destFilename);\n\n    if ( QFile::copy(logFilename, destFilename) )\n    {\n        settings.setValue(\"devtools/lastDir\", QFileInfo(destFilename).absolutePath());\n        ui->statusLabel->setText(\n            tr(\"Debug log saved to %1\").arg(QFileInfo(destFilename).fileName()));\n    }\n    else\n    {\n        QMessageBox::warning(this, tr(\"Save Debug Log\"),\n            tr(\"Failed to copy the debug log file.\"));\n    }\n}\n\nvoid DevToolsDialog::updateDebugLogFileLabel()\n{\n    FCT_IDENTIFICATION;\n\n    const QString logFilename = currentDebugLogFilename();\n\n    if ( logFilename.isEmpty() || !isLogToFileEnabled() )\n        ui->debugLogFileLabel->setText(tr(\"File logging is disabled\"));\n    else\n        ui->debugLogFileLabel->setText(tr(\"Log file: %1\").arg(logFilename));\n\n    ui->saveDebugLogButton->setEnabled(\n        !logFilename.isEmpty() && QFile::exists(logFilename));\n}\n"
  },
  {
    "path": "ui/DevToolsDialog.h",
    "content": "#ifndef QLOG_UI_DEVTOOLSDIALOG_H\n#define QLOG_UI_DEVTOOLSDIALOG_H\n\n#include <QDialog>\n#include <QSqlQueryModel>\n#include <QSortFilterProxyModel>\n\nnamespace Ui {\nclass DevToolsDialog;\n}\n\nclass SqlHighlighter;\n\nclass DevToolsDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit DevToolsDialog(QWidget *parent = nullptr);\n    ~DevToolsDialog();\n\nprotected:\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\npublic slots:\n    void openQuery();\n    void saveQuery();\n    void runQuery();\n    void exportAsTxt();\n    void exportAsCsv();\n    void exportAsAdif();\n    void logToFileToggled(bool checked);\n    void applyLoggingRules();\n    void saveDebugLog();\n\nprivate:\n    static const QString READ_ONLY_CONNECTION;\n    static const int MAX_FETCH_ROWS = 50000;\n\n    Ui::DevToolsDialog *ui;\n    SqlHighlighter     *highlighter;\n    QSqlQueryModel     *queryModel;\n    QSortFilterProxyModel *sortProxy;\n\n    void loadSchema();\n    void updateDebugLogFileLabel();\n    void exportModel(const QString &title,\n                     const QString &filter,\n                     const QString &defaultExt,\n                     const QString &separator,\n                     std::function<QString(const QString&)> formatter);\n};\n\n#endif // QLOG_UI_DEVTOOLSDIALOG_H\n"
  },
  {
    "path": "ui/DevToolsDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DevToolsDialog</class>\n <widget class=\"QDialog\" name=\"DevToolsDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>729</width>\n    <height>620</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Developer Tools</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"debugLogGroup\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Maximum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"title\">\n      <string>Debug Log</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n        <item>\n         <widget class=\"QLabel\" name=\"loggingRulesLabel\">\n          <property name=\"text\">\n           <string>Logging Rules:</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"loggingRulesEdit\">\n          <property name=\"placeholderText\">\n           <string>e.g. qlog.ui.*.runtime=true</string>\n          </property>\n          <property name=\"clearButtonEnabled\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"applyRulesButton\">\n          <property name=\"text\">\n           <string>Apply</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"logToFileCheckBox\">\n          <property name=\"text\">\n           <string>Generate Debug File</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"saveDebugLogButton\">\n          <property name=\"text\">\n           <string>Export File</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"document-save-as\">\n            <normaloff>.</normaloff>.</iconset>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QLabel\" name=\"debugLogFileLabel\">\n        <property name=\"text\">\n         <string notr=\"true\"/>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"sqlConsoleGroup\">\n     <property name=\"title\">\n      <string>SQL Console</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n        <item>\n         <widget class=\"QPushButton\" name=\"openButton\">\n          <property name=\"text\">\n           <string>Open SQL</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"document-open\"/>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"saveButton\">\n          <property name=\"text\">\n           <string>Save SQL</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"document-save\"/>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"runButton\">\n          <property name=\"text\">\n           <string>Run SQL</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"media-playback-start\"/>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"exportButton\">\n          <property name=\"text\">\n           <string>Export As</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"document-save-as\"/>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QSplitter\" name=\"splitter\">\n        <property name=\"orientation\">\n         <enum>Qt::Vertical</enum>\n        </property>\n        <widget class=\"QPlainTextEdit\" name=\"sqlEditor\">\n         <property name=\"placeholderText\">\n          <string>Enter SQL query here... Ctrl+Return = run</string>\n         </property>\n        </widget>\n        <widget class=\"QTableView\" name=\"resultsTable\"/>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QLabel\" name=\"statusLabel\">\n        <property name=\"text\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>openButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>openQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>132</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>saveButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>saveQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>360</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>runButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>runQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>588</x>\n     <y>200</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>logToFileCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>logToFileToggled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>72</x>\n     <y>93</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>applyRulesButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>applyLoggingRules()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>887</x>\n     <y>57</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>saveDebugLogButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DevToolsDialog</receiver>\n   <slot>saveDebugLog()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>182</x>\n     <y>93</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>474</x>\n     <y>359</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>openQuery()</slot>\n  <slot>saveQuery()</slot>\n  <slot>exportQuery()</slot>\n  <slot>runQuery()</slot>\n  <slot>logToFileToggled(bool)</slot>\n  <slot>applyLoggingRules()</slot>\n  <slot>saveDebugLog()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/DownloadQSLDialog.cpp",
    "content": "#include <QMessageBox>\n#include <QProgressDialog>\n#include \"DownloadQSLDialog.h\"\n#include \"qpushbutton.h\"\n#include \"ui_DownloadQSLDialog.h\"\n#include \"models/SqlListModel.h\"\n#include \"core/debug.h\"\n#include \"data/StationProfile.h\"\n#include \"service/lotw/Lotw.h\"\n#include \"service/eqsl/Eqsl.h\"\n#include \"ui/QSLImportStatDialog.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.downloadqsldialog\");\n\nDownloadQSLDialog::DownloadQSLDialog(QWidget *parent)\n    : QDialog(parent),\n      ui(new Ui::DownloadQSLDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->lotwMyCallsignCombo->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(station_callsign) \"\n                                                       \"FROM contacts ORDER BY station_callsign\", \"\", ui->lotwMyCallsignCombo));\n    ui->lotwDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->eqslDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"&Download\"));\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    loadDialogState();\n\n    int index = ui->lotwMyCallsignCombo->findText(profile.callsign);\n\n    if ( index >= 0 )\n        ui->lotwMyCallsignCombo->setCurrentIndex(index);\n    else\n        ui->lotwMyCallsignCombo->setCurrentText(LogParam::getDownloadQSLLoTWLastCall());\n\n    // Enable options based on the configuration\n    if ( LotwBase::getUsername().isEmpty() )\n    {\n        ui->lotwGroupBox->setChecked(false);\n        ui->lotwGroupBox->setEnabled(false);\n        ui->lotwGroupBox->setToolTip(tr(\"LoTW is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p>\"));\n    }\n\n    if ( EQSLBase::getUsername().isEmpty() )\n    {\n        ui->eqslGroupBox->setChecked(false);\n        ui->eqslGroupBox->setEnabled(false);\n        ui->eqslGroupBox->setToolTip(tr(\"eQSL is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p>\"));\n    }\n}\n\nDownloadQSLDialog::~DownloadQSLDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid DownloadQSLDialog::startNextDownload()\n{\n    FCT_IDENTIFICATION;\n\n    if (!downloadQueue.isEmpty())\n    {\n        auto next = downloadQueue.dequeue();\n        next(); // call Lambda for service;\n    }\n    else\n    {\n        QSLImportStatDialog statDialog(downloadStat);\n        downloadStat.clear();\n        if ( statDialog.exec() == QDialog::Rejected )\n            done(QDialog::Accepted);\n    }\n}\n\nvoid DownloadQSLDialog::loadDialogState()\n{\n    FCT_IDENTIFICATION;\n\n    /********/\n    /* LoTW */\n    /********/\n    ui->lotwGroupBox->setChecked(LogParam::getDownloadQSLServiceState(\"lotw\"));\n    ui->lotwDateEdit->setDate(LogParam::getDownloadQSLServiceLastDate(\"lotw\"));\n    ui->lotwDateTypeCombo->setCurrentIndex((LogParam::getDownloadQSLServiceLastQSOQSL(\"lotw\")) ? 0 : 1);\n\n    /********/\n    /* eQSL */\n    /********/\n    ui->eqslGroupBox->setChecked(LogParam::getDownloadQSLServiceState(\"eqsl\"));\n    ui->eqslDateEdit->setDate(LogParam::getDownloadQSLServiceLastDate(\"eqsl\"));\n    ui->eqslDateTypeCombo->setCurrentIndex((LogParam::getDownloadQSLServiceLastQSOQSL(\"eqsl\")) ? 0 : 1);\n\n    ui->eqslQTHProfileEdit->setText(LogParam::getDownloadQSLeQSLLastProfile());\n}\n\nvoid DownloadQSLDialog::saveDialogState()\n{\n    FCT_IDENTIFICATION;\n\n    /********/\n    /* LoTW */\n    /********/\n    LogParam::setDownloadQSLServiceState(\"lotw\", ui->lotwGroupBox->isChecked());\n    LogParam::setDownloadQSLServiceLastDate(\"lotw\", QDateTime::currentDateTimeUtc().date());\n    LogParam::setDownloadQSLServiceLastQSOQSL(\"lotw\", ui->lotwDateTypeCombo->currentIndex() == 0);\n\n    /********/\n    /* eQSL */\n    /********/\n    LogParam::setDownloadQSLServiceState(\"eqsl\", ui->eqslGroupBox->isChecked());\n    LogParam::setDownloadQSLServiceLastDate(\"eqsl\", QDateTime::currentDateTimeUtc().date());\n    LogParam::setDownloadQSLServiceLastQSOQSL(\"eqsl\", ui->eqslDateTypeCombo->currentIndex() == 0);\n    LogParam::setDownloadQSLeQSLLastProfile(ui->eqslQTHProfileEdit->text());\n}\n\nvoid DownloadQSLDialog::prepareDownload(GenericQSLDownloader *service,\n                                        const QString &serviceName,\n                                        bool qslSinceActive,\n                                        const QString &settingString)\n{\n    FCT_IDENTIFICATION;\n\n    QProgressDialog* progressDialog = new QProgressDialog(\"\", tr(\"Cancel\"), 0, 0, this);\n    progressDialog->setWindowModality(Qt::WindowModal);\n    progressDialog->setRange(0, 0);\n    progressDialog->setAttribute(Qt::WA_DeleteOnClose, true);\n    progressDialog->show();\n    progressDialog->setLabelText(tr(\"Downloading from %1\").arg(serviceName));\n\n    connect(service, &GenericQSLDownloader::receiveQSLProgress, progressDialog, &QProgressDialog::setValue);\n\n    connect(service, &GenericQSLDownloader::receiveQSLStarted, this, [progressDialog, serviceName]\n    {\n        progressDialog->setLabelText(tr(\"Processing %1 QSLs\").arg(serviceName));\n        progressDialog->setRange(0, 100);\n    });\n\n    connect(service, &GenericQSLDownloader::receiveQSLComplete, this, [service, progressDialog, serviceName, qslSinceActive, settingString, this](QSLMergeStat stats)\n    {\n        qCDebug(runtime) << \"Service:\" << serviceName;\n        qCDebug(runtime) << \"New QSLs: \" << stats.newQSLs;\n        qCDebug(runtime) << \"Unmatched QSLs: \" << stats.unmatchedQSLs;\n\n        if ( qslSinceActive )\n            LogParam::setDownloadQSLServiceLastDate(settingString, QDateTime::currentDateTimeUtc().date());\n\n        progressDialog->done(QDialog::Accepted);\n        downloadStat[serviceName] = stats;\n\n        service->deleteLater();\n        startNextDownload();\n    });\n\n    connect(service, &GenericQSLDownloader::receiveQSLFailed, this, [this, service, progressDialog, serviceName](const QString &error)\n    {\n        progressDialog->done(QDialog::Accepted);\n        QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"%1 update failed: \").arg(serviceName) + error);\n        service->deleteLater();\n        startNextDownload();\n    });\n\n    connect(progressDialog, &QProgressDialog::canceled, this, [this, service]()\n    {\n        qCDebug(runtime)<< \"Operation canceled\";\n\n        service->abortDownload();\n        service->deleteLater();\n        downloadQueue.clear();\n    });\n}\n\nvoid DownloadQSLDialog::downloadQSLs()\n{\n    FCT_IDENTIFICATION;\n\n    saveDialogState();\n\n    downloadQueue.clear();\n\n    if ( ui->eqslGroupBox->isChecked() )\n        downloadQueue.enqueue([=]()\n        {\n            EQSLQSLDownloader* eqsl = new EQSLQSLDownloader(this);\n            bool qslSinceActive = ui->eqslDateTypeCombo->currentIndex() == 0;\n            prepareDownload(eqsl, \"eQSL\", qslSinceActive, \"eqsl\");\n            LogParam::setDownloadQSLeQSLLastProfile(ui->eqslQTHProfileEdit->text());\n            LogParam::setDownloadQSLServiceLastQSOQSL(\"eqsl\", qslSinceActive);\n            eqsl->receiveQSL(ui->eqslDateEdit->date(), !qslSinceActive, ui->eqslQTHProfileEdit->text());\n        });\n\n    if ( ui->lotwGroupBox->isChecked() )\n        downloadQueue.enqueue([=]()\n        {\n            LotwQSLDownloader* lotw = new LotwQSLDownloader(this);\n            bool qslSinceActive = ui->lotwDateTypeCombo->currentIndex() == 0;\n            prepareDownload(lotw, \"LoTW\", qslSinceActive, \"lotw\");\n            LogParam::setDownloadQSLLoTWLastCall(ui->lotwMyCallsignCombo->currentText());\n            LogParam::setDownloadQSLServiceLastQSOQSL(\"lotw\", qslSinceActive);\n            lotw->receiveQSL(ui->lotwDateEdit->date(), !qslSinceActive, ui->lotwMyCallsignCombo->currentText());\n        });\n\n    if ( downloadQueue.isEmpty() )\n    {\n        QMessageBox::information(this, tr(\"QLog Information\"), tr(\"No service selected\"));\n        return;\n    }\n\n    // Download Execution\n    startNextDownload();\n}\n"
  },
  {
    "path": "ui/DownloadQSLDialog.h",
    "content": "#ifndef DOWNLOADQSLDIALOG_H\n#define DOWNLOADQSLDIALOG_H\n\n#include <QDialog>\n#include \"core/LogLocale.h\"\n#include \"logformat/LogFormat.h\"\n#include \"service/GenericQSLDownloader.h\"\n\nnamespace Ui {\nclass DownloadQSLDialog;\n}\n\nclass DownloadQSLDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit DownloadQSLDialog(QWidget *parent = nullptr);\n    ~DownloadQSLDialog();\n\nprivate:\n    void prepareDownload(GenericQSLDownloader* service,\n                         const QString &serviceName,\n                         bool qslSinceActive,\n                         const QString &settingString);\n    void startNextDownload();\n    void loadDialogState();\n    void saveDialogState();\n\n    Ui::DownloadQSLDialog *ui;\n    LogLocale locale;\n    QHash<QString, QSLMergeStat> downloadStat;\n    QQueue<std::function<void()>> downloadQueue;\n\nprivate slots:\n    void downloadQSLs();\n\n};\n\n#endif // DOWNLOADQSLDIALOG_H\n"
  },
  {
    "path": "ui/DownloadQSLDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DownloadQSLDialog</class>\n <widget class=\"QDialog\" name=\"DownloadQSLDialog\">\n  <property name=\"windowTitle\">\n   <string>Download QSLs</string>\n  </property>\n  <layout class=\"QFormLayout\" name=\"formLayout_3\">\n   <item row=\"0\" column=\"0\" colspan=\"2\">\n    <widget class=\"QGroupBox\" name=\"eqslGroupBox\">\n     <property name=\"enabled\">\n      <bool>true</bool>\n     </property>\n     <property name=\"title\">\n      <string>eQSL</string>\n     </property>\n     <property name=\"checkable\">\n      <bool>true</bool>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_2\">\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"eqslQTHProfileLabel\">\n        <property name=\"text\">\n         <string>eQSL QTH Profile</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QLineEdit\" name=\"eqslQTHProfileEdit\">\n        <property name=\"minimumSize\">\n         <size>\n          <width>200</width>\n          <height>0</height>\n         </size>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QComboBox\" name=\"eqslDateTypeCombo\">\n        <item>\n         <property name=\"text\">\n          <string>QSLs Since</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>QSOs Since</string>\n         </property>\n        </item>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QDateEdit\" name=\"eqslDateEdit\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item row=\"1\" column=\"0\" colspan=\"2\">\n    <widget class=\"QGroupBox\" name=\"lotwGroupBox\">\n     <property name=\"title\">\n      <string>LoTW</string>\n     </property>\n     <property name=\"checkable\">\n      <bool>true</bool>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout\">\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"lotwMyCallsignLabel\">\n        <property name=\"text\">\n         <string>My Callsign</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"lotwMyCallsignCombo\"/>\n      </item>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QComboBox\" name=\"lotwDateTypeCombo\">\n        <item>\n         <property name=\"text\">\n          <string>QSLs Since</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>QSOs Since</string>\n         </property>\n        </item>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QDateEdit\" name=\"lotwDateEdit\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item row=\"2\" column=\"1\">\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>eqslGroupBox</tabstop>\n  <tabstop>eqslDateTypeCombo</tabstop>\n  <tabstop>eqslDateEdit</tabstop>\n  <tabstop>eqslQTHProfileEdit</tabstop>\n  <tabstop>lotwGroupBox</tabstop>\n  <tabstop>lotwDateTypeCombo</tabstop>\n  <tabstop>lotwDateEdit</tabstop>\n  <tabstop>lotwMyCallsignCombo</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>DownloadQSLDialog</receiver>\n   <slot>downloadQSLs()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>DownloadQSLDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>downloadQSLs()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/DxFilterDialog.cpp",
    "content": "#include <QDebug>\n#include <QCheckBox>\n#include <QSqlRecord>\n#include <QLayoutItem>\n#include <QLabel>\n\n#include \"DxFilterDialog.h\"\n#include \"ui_DxFilterDialog.h\"\n#include \"core/debug.h\"\n#include \"data/Dxcc.h\"\n#include \"core/MembershipQE.h\"\n#include \"DxWidget.h\"\n#include \"core/LogParam.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.dxfilterdialog\");\n\nDxFilterDialog::DxFilterDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::DxFilterDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    const QList<Band> &bands = BandPlan::bandsList(false, true);\n    const QStringList &excludedBandFilter = LogParam::getDXCExcludedBands();\n    /********************/\n    /* Bands Checkboxes */\n    /********************/\n    int i = 0;\n    for ( const Band &enabledBand : bands )\n    {\n        const QString &bandName = enabledBand.name;\n        QCheckBox *bandCheckbox = new QCheckBox(ui->band_group->parentWidget());\n        bandCheckbox->setText(bandName);\n        bandCheckbox->setProperty(\"bandName\", bandName); // just to be sure that Bandmap is not translated\n        bandCheckbox->setObjectName(\"bandCheckBox_\" + bandName);\n        bandCheckbox->setChecked(!excludedBandFilter.contains(bandName));\n\n        int row = i / MAXCOLUMNS;\n        int column = i % MAXCOLUMNS;\n        ui->band_group->addWidget(bandCheckbox, row, column);\n        i++;\n    }\n\n    /*********************/\n    /* Status Checkboxes */\n    /*********************/\n    uint statusSetting = LogParam::getDXCFilterDxccStatus();\n    ui->newEntitycheckbox->setChecked(statusSetting & DxccStatus::NewEntity);\n    ui->newBandcheckbox->setChecked(statusSetting & DxccStatus::NewBand);\n    ui->newModecheckbox->setChecked(statusSetting & DxccStatus::NewMode);\n    ui->newSlotcheckbox->setChecked(statusSetting & DxccStatus::NewSlot);\n    ui->workedcheckbox->setChecked(statusSetting & DxccStatus::Worked);\n    ui->confirmedcheckbox->setChecked(statusSetting & DxccStatus::Confirmed);\n\n    /*******************/\n    /* Mode Checkboxes */\n    /*******************/\n    const QString &moderegexp = LogParam::getDXCFilterModeRE();\n    ui->cwcheckbox->setChecked(moderegexp.contains(\"|\" + BandPlan::MODE_GROUP_STRING_CW));\n    ui->phonecheckbox->setChecked(moderegexp.contains(\"|\" + BandPlan::MODE_GROUP_STRING_PHONE));\n    ui->digitalcheckbox->setChecked(moderegexp.contains(\"|\" + BandPlan::MODE_GROUP_STRING_DIGITAL));\n    ui->ftxcheckbox->setChecked(moderegexp.contains(\"|\" + BandPlan::MODE_GROUP_STRING_FTx));\n\n    /************************/\n    /* Continent Checkboxes */\n    /************************/\n    const QString &contregexp = LogParam::getDXCFilterContRE();\n    ui->afcheckbox->setChecked(contregexp.contains(\"|AF\"));\n    ui->ancheckbox->setChecked(contregexp.contains(\"|AN\"));\n    ui->ascheckbox->setChecked(contregexp.contains(\"|AS\"));\n    ui->eucheckbox->setChecked(contregexp.contains(\"|EU\"));\n    ui->nacheckbox->setChecked(contregexp.contains(\"|NA\"));\n    ui->occheckbox->setChecked(contregexp.contains(\"|OC\"));\n    ui->sacheckbox->setChecked(contregexp.contains(\"|SA\"));\n\n    /********************************/\n    /* Spotter Continent Checkboxes */\n    /********************************/\n    const QString &contregexp_spotter = LogParam::getDXCFilterSpotterContRE();\n    ui->afcheckbox_spotter->setChecked(contregexp_spotter.contains(\"|AF\"));\n    ui->ancheckbox_spotter->setChecked(contregexp_spotter.contains(\"|AN\"));\n    ui->ascheckbox_spotter->setChecked(contregexp_spotter.contains(\"|AS\"));\n    ui->eucheckbox_spotter->setChecked(contregexp_spotter.contains(\"|EU\"));\n    ui->nacheckbox_spotter->setChecked(contregexp_spotter.contains(\"|NA\"));\n    ui->occheckbox_spotter->setChecked(contregexp_spotter.contains(\"|OC\"));\n    ui->sacheckbox_spotter->setChecked(contregexp_spotter.contains(\"|SA\"));\n\n    /*****************/\n    /* Deduplication */\n    /*****************/\n    ui->deduplicationGroupBox->setChecked(LogParam::getDXCFilterDedup());\n    ui->dedupTimeDiffSpinbox->setValue(LogParam::getDXCFilterDedupTime(DEDUPLICATION_TIME));\n    ui->dedupFreqDiffSpinbox->setValue(LogParam::getDXCFilterDedupFreq(DEDUPLICATION_FREQ_TOLERANCE));\n\n    /**********/\n    /* MEMBER */\n    /**********/\n\n    generateMembershipCheckboxes();\n}\n\nvoid DxFilterDialog::accept()\n{\n    FCT_IDENTIFICATION;\n\n    /********************/\n    /* Bands Checkboxes */\n    /********************/\n    QStringList excludedBands;\n    for ( int i = 0; i < ui->band_group->count(); i++)\n    {\n        QLayoutItem *item = ui->band_group->itemAt(i);\n        if ( !item || !item->widget() ) continue;\n\n        QCheckBox *bandcheckbox = qobject_cast<QCheckBox*>(item->widget());\n        if ( bandcheckbox &&  !bandcheckbox->isChecked())\n            excludedBands << bandcheckbox->property(\"bandName\").toString();\n    }\n    LogParam::setDXCExcludedBands(excludedBands);\n\n    /*********************/\n    /* Status Checkboxes */\n    /*********************/\n    uint status = 0;\n    if ( ui->newEntitycheckbox->isChecked() ) status |=  DxccStatus::NewEntity;\n    if ( ui->newBandcheckbox->isChecked() ) status |=  DxccStatus::NewBand;\n    if ( ui->newModecheckbox->isChecked() ) status |=  DxccStatus::NewMode;\n    if ( ui->newSlotcheckbox->isChecked() ) status |=  DxccStatus::NewSlot;\n    if ( ui->workedcheckbox->isChecked() ) status |=  DxccStatus::Worked;\n    if ( ui->confirmedcheckbox->isChecked() ) status |=  DxccStatus::Confirmed;\n    LogParam::setDXCFilterDxccStatus(status);\n\n    /*******************/\n    /* Mode Checkboxes */\n    /*******************/\n    QString moderegexp(\"NOTHING\");\n    if ( ui->cwcheckbox->isChecked() ) moderegexp.append(\"|\" + BandPlan::MODE_GROUP_STRING_CW);\n    if ( ui->phonecheckbox->isChecked() ) moderegexp.append(\"|\" + BandPlan::MODE_GROUP_STRING_PHONE);\n    if ( ui->digitalcheckbox->isChecked() ) moderegexp.append(\"|\" + BandPlan::MODE_GROUP_STRING_DIGITAL);\n    if ( ui->ftxcheckbox->isChecked() ) moderegexp.append(\"|\" + BandPlan::MODE_GROUP_STRING_FTx);\n    LogParam::setDXCFilterModeRE(moderegexp);\n\n    /************************/\n    /* Continent Checkboxes */\n    /************************/\n    QString contregexp = \"NOTHING\";\n    if ( ui->afcheckbox->isChecked() ) contregexp.append(\"|AF\");\n    if ( ui->ancheckbox->isChecked() ) contregexp.append(\"|AN\");\n    if ( ui->ascheckbox->isChecked() ) contregexp.append(\"|AS\");\n    if ( ui->eucheckbox->isChecked() ) contregexp.append(\"|EU\");\n    if ( ui->nacheckbox->isChecked() ) contregexp.append(\"|NA\");\n    if ( ui->occheckbox->isChecked() ) contregexp.append(\"|OC\");\n    if ( ui->sacheckbox->isChecked() ) contregexp.append(\"|SA\");\n    LogParam::setDXCFilterContRE(contregexp);\n\n    /********************************/\n    /* Spotter Continent Checkboxes */\n    /********************************/\n    QString contregexp_spotter = \"NOTHING\";\n    if ( ui->afcheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|AF\");\n    if ( ui->ancheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|AN\");\n    if ( ui->ascheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|AS\");\n    if ( ui->eucheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|EU\");\n    if ( ui->nacheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|NA\");\n    if ( ui->occheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|OC\");\n    if ( ui->sacheckbox_spotter->isChecked() ) contregexp_spotter.append(\"|SA\");\n    LogParam::setDXCFilterSpotterContRE(contregexp_spotter);\n\n    /*****************/\n    /* Deduplication */\n    /*****************/\n    LogParam::setDXCFilterDedup(ui->deduplicationGroupBox->isChecked());\n    LogParam::setDXCFilterDedupTime(ui->dedupTimeDiffSpinbox->value() );\n    LogParam::setDXCFilterDedupFreq(ui->dedupFreqDiffSpinbox->value());\n\n    /**********/\n    /* MEMBER */\n    /**********/\n\n    QStringList memberList;\n\n    if ( ui->memberGroupBox->isChecked() )\n    {\n        memberList.append(\"DUMMYCLUB\");\n\n        for ( QCheckBox* item : static_cast<const QList<QCheckBox*>&>(memberListCheckBoxes) )\n            if ( item->isChecked() ) memberList.append(item->text());\n    }\n    LogParam::setDXCFilterMemberlists(memberList);\n\n    done(QDialog::Accepted);\n}\n\nvoid DxFilterDialog::generateMembershipCheckboxes()\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &currentFilter = LogParam::getDXCFilterMemberlists();\n    const QStringList &enabledLists = MembershipQE::getEnabledClubLists();\n\n    for ( const QString &enabledClub : enabledLists )\n    {\n        QCheckBox *columnCheckbox = new QCheckBox(ui->memberGroupBox->parentWidget());\n        columnCheckbox->setText(enabledClub);\n        columnCheckbox->setChecked(currentFilter.contains(enabledClub));\n        memberListCheckBoxes.append(columnCheckbox);\n    }\n\n    if ( memberListCheckBoxes.size() == 0 )\n    {\n        ui->dxMemberGrid->addWidget(new QLabel(tr(\"No Club List is enabled\")));\n    }\n    else\n    {\n        int elementIndex = 0;\n\n        for ( QCheckBox* item : static_cast<const QList<QCheckBox*>&>(memberListCheckBoxes) )\n        {\n            ui->dxMemberGrid->addWidget(item, elementIndex / MAXCOLUMNS, elementIndex % MAXCOLUMNS);\n            elementIndex++;\n        }\n    }\n\n    ui->memberGroupBox->setChecked(!currentFilter.isEmpty());\n}\n\nDxFilterDialog::~DxFilterDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n"
  },
  {
    "path": "ui/DxFilterDialog.h",
    "content": "#ifndef QLOG_UI_DXFILTER_H\n#define QLOG_UI_DXFILTER_H\n\n#include <QDialog>\n#include <QCheckBox>\n\nnamespace Ui {\nclass DxFilterDialog;\n}\n\nclass DxFilterDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit DxFilterDialog(QWidget *parent = nullptr);\n    ~DxFilterDialog();\n    void accept() override;\n\nprivate:\n    Ui::DxFilterDialog *ui;\n    QList<QCheckBox*> memberListCheckBoxes;\n    const quint8 MAXCOLUMNS = 6;\n    void generateMembershipCheckboxes();\n\n};\n\n#endif // QLOG_UI_DXFILTER_H\n"
  },
  {
    "path": "ui/DxFilterDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DxFilterDialog</class>\n <widget class=\"QDialog\" name=\"DxFilterDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>511</width>\n    <height>465</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string>DX Cluster Filters</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"general_filters\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <attribute name=\"title\">\n       <string>General Filters</string>\n      </attribute>\n      <layout class=\"QGridLayout\" name=\"gridLayout\">\n       <item row=\"2\" column=\"0\">\n        <widget class=\"QGroupBox\" name=\"bands\">\n         <property name=\"title\">\n          <string>Bands</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"band_group\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item row=\"4\" column=\"0\">\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <widget class=\"QGroupBox\" name=\"modes\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Minimum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"maximumSize\">\n          <size>\n           <width>701</width>\n           <height>356</height>\n          </size>\n         </property>\n         <property name=\"title\">\n          <string>Modes</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"modes_group\">\n            <property name=\"horizontalSpacing\">\n             <number>7</number>\n            </property>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"phonecheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>Phone</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"cwcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>CW</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"digitalcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>Digital</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"ftxcheckbox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>FTx (FT8/FT4)</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item row=\"3\" column=\"0\">\n        <widget class=\"QGroupBox\" name=\"continent\">\n         <property name=\"title\">\n          <string>Continent</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"cont_group\">\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"nacheckbox\">\n              <property name=\"text\">\n               <string>North America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"sacheckbox\">\n              <property name=\"text\">\n               <string>South America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"occheckbox\">\n              <property name=\"text\">\n               <string>Oceania</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"ancheckbox\">\n              <property name=\"text\">\n               <string>Antarctica</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"eucheckbox\">\n              <property name=\"text\">\n               <string>Europe</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"afcheckbox\">\n              <property name=\"text\">\n               <string>Africa</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"ascheckbox\">\n              <property name=\"text\">\n               <string>Asia</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QGroupBox\" name=\"groupBox\">\n         <property name=\"title\">\n          <string>Log Status</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"status_group\">\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"newModecheckbox\">\n              <property name=\"text\">\n               <string>New Mode</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"newEntitycheckbox\">\n              <property name=\"text\">\n               <string>New Entity</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"newBandcheckbox\">\n              <property name=\"text\">\n               <string>New Band</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"newSlotcheckbox\">\n              <property name=\"text\">\n               <string>New Slot</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"workedcheckbox\">\n              <property name=\"text\">\n               <string>Worked</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"confirmedcheckbox\">\n              <property name=\"text\">\n               <string>Confirmed</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"extended_filters\">\n      <attribute name=\"title\">\n       <string>Extended Filters</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"cont_group_spotter_2\">\n         <property name=\"title\">\n          <string>Spotter Continent</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"cont_group_spotter\">\n            <item row=\"0\" column=\"3\">\n             <widget class=\"QCheckBox\" name=\"sacheckbox_spotter\">\n              <property name=\"text\">\n               <string>South America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"ancheckbox_spotter\">\n              <property name=\"text\">\n               <string>Antarctica</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"nacheckbox_spotter\">\n              <property name=\"text\">\n               <string>North America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"ascheckbox_spotter\">\n              <property name=\"text\">\n               <string>Asia</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"eucheckbox_spotter\">\n              <property name=\"text\">\n               <string>Europe</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"afcheckbox_spotter\">\n              <property name=\"text\">\n               <string>Africa</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"occheckbox_spotter\">\n              <property name=\"text\">\n               <string>Oceania</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"deduplicationGroupBox\">\n         <property name=\"toolTip\">\n          <string>Do not show the following spots when they have the same Callsign and their time difference is lower than Time Diff and their frequency difference is lower than Freq Diff</string>\n         </property>\n         <property name=\"title\">\n          <string>Spots Dedup</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout\">\n          <property name=\"horizontalSpacing\">\n           <number>4</number>\n          </property>\n          <property name=\"verticalSpacing\">\n           <number>4</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>6</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>6</number>\n          </property>\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"dedupTimeDiffLabel\">\n            <property name=\"text\">\n             <string>Time difference</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QSpinBox\" name=\"dedupTimeDiffSpinbox\">\n            <property name=\"suffix\">\n             <string>s</string>\n            </property>\n            <property name=\"minimum\">\n             <number>1</number>\n            </property>\n            <property name=\"maximum\">\n             <number>9999</number>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"dedupFreqDiffLabel\">\n            <property name=\"text\">\n             <string>Frequency difference</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QSpinBox\" name=\"dedupFreqDiffSpinbox\">\n            <property name=\"suffix\">\n             <string> kHz</string>\n            </property>\n            <property name=\"prefix\">\n             <string notr=\"true\">± </string>\n            </property>\n            <property name=\"minimum\">\n             <number>1</number>\n            </property>\n            <property name=\"maximum\">\n             <number>100</number>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"memberGroupBox\">\n         <property name=\"title\">\n          <string>Member</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"dxMemberGrid\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_3\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>newEntitycheckbox</tabstop>\n  <tabstop>newBandcheckbox</tabstop>\n  <tabstop>newModecheckbox</tabstop>\n  <tabstop>newSlotcheckbox</tabstop>\n  <tabstop>workedcheckbox</tabstop>\n  <tabstop>confirmedcheckbox</tabstop>\n  <tabstop>cwcheckbox</tabstop>\n  <tabstop>phonecheckbox</tabstop>\n  <tabstop>digitalcheckbox</tabstop>\n  <tabstop>ftxcheckbox</tabstop>\n  <tabstop>afcheckbox</tabstop>\n  <tabstop>ancheckbox</tabstop>\n  <tabstop>nacheckbox</tabstop>\n  <tabstop>sacheckbox</tabstop>\n  <tabstop>ascheckbox</tabstop>\n  <tabstop>eucheckbox</tabstop>\n  <tabstop>occheckbox</tabstop>\n  <tabstop>afcheckbox_spotter</tabstop>\n  <tabstop>ancheckbox_spotter</tabstop>\n  <tabstop>nacheckbox_spotter</tabstop>\n  <tabstop>sacheckbox_spotter</tabstop>\n  <tabstop>ascheckbox_spotter</tabstop>\n  <tabstop>eucheckbox_spotter</tabstop>\n  <tabstop>occheckbox_spotter</tabstop>\n  <tabstop>deduplicationGroupBox</tabstop>\n  <tabstop>dedupTimeDiffSpinbox</tabstop>\n  <tabstop>dedupFreqDiffSpinbox</tabstop>\n  <tabstop>memberGroupBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>DxFilterDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>DxFilterDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/DxWidget.cpp",
    "content": "﻿#include <QDebug>\n#include <QColor>\n#include <QMessageBox>\n#include <QFontMetrics>\n#include <QActionGroup>\n\n#ifdef Q_OS_WIN\n#include <Ws2tcpip.h>\n#include <winsock2.h>\n#include <Mstcpip.h>\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#endif\n#include <QMenu>\n#include <QMutex>\n#include <QMutexLocker>\n\n#include \"DxWidget.h\"\n#include \"ui_DxWidget.h\"\n#include \"data/Data.h\"\n#include \"DxFilterDialog.h\"\n#include \"core/debug.h\"\n#include \"data/StationProfile.h\"\n#include \"data/WCYSpot.h\"\n#include \"data/WWVSpot.h\"\n#include \"data/ToAllSpot.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"core/CredentialStore.h\"\n#include \"ui/InputPasswordDialog.h\"\n#include \"data/BandPlan.h\"\n#include \"rig/macros.h\"\n#include \"data/Callsign.h\"\n#include \"core/LogParam.h\"\n#include \"core/PotaQE.h\"\n\n#define CONSOLE_VIEW 4\n#define NUM_OF_RECONNECT_ATTEMPTS 3\n#define RECONNECT_TIMEOUT 10000\n\nMODULE_IDENTIFICATION(\"qlog.ui.dxwidget\");\n\nQString dxClusterDefaultUsername()\n{\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.callsign.toLower();\n}\n\nclass DxClusterCredentials : public SecureServiceBase<DxClusterCredentials>\n{\npublic:\n    DxClusterCredentials() = default;\n    ~DxClusterCredentials() override = default;\n\n    DECLARE_SECURE_SERVICE(DxClusterCredentials);\n\n    static QString loadPasswd(const DxServerString &server)\n    {\n        if (!server.isValid())\n            return QString();\n\n        return SecureServiceBase<DxClusterCredentials>::getPassword(server.getPasswordStorageKey(),\n                                                                    server.getUsername());\n    }\n\n    static void storePasswd(const DxServerString &server, const QString &password)\n    {\n        if (!server.isValid() || password.isEmpty())\n            return;\n\n        SecureServiceBase<DxClusterCredentials>::savePassword(server.getPasswordStorageKey(),\n                                                              server.getUsername(),\n                                                              password);\n    }\n\n    static void removePasswd(const DxServerString &server)\n    {\n        if (!server.isValid())\n            return;\n\n        SecureServiceBase<DxClusterCredentials>::deletePassword(server.getPasswordStorageKey(),\n                                                                server.getUsername());\n    }\n\n    static void refreshDescriptorCache(const QStringList &serverStrings,\n                                       const QString &defaultUsername);\n\nprivate:\n    static QMutex cacheMutex;\n    static QList<CredentialDescriptor> descriptorCache;\n};\n\nREGISTRATION_SECURE_SERVICE(DxClusterCredentials);\n\nQMutex DxClusterCredentials::cacheMutex;\nQList<CredentialDescriptor> DxClusterCredentials::descriptorCache;\n\nvoid DxClusterCredentials::registerCredentials()\n{\n    CredentialRegistry::instance().add(QStringLiteral(\"DXCluster\"), []() {\n        QMutexLocker locker(&cacheMutex);\n        return descriptorCache;\n    });\n}\n\nvoid DxClusterCredentials::refreshDescriptorCache(const QStringList &serverStrings,\n                                                  const QString &defaultUsername)\n{\n    QList<CredentialDescriptor> descriptors;\n    descriptors.reserve(serverStrings.size());\n\n    for (const QString &serverString : serverStrings)\n    {\n        DxServerString server(serverString, defaultUsername);\n\n        if (!server.isValid())\n            continue;\n\n        const QString storageKey = server.getPasswordStorageKey();\n        const QString username = server.getUsername();\n\n        if (storageKey.isEmpty() || username.isEmpty())\n            continue;\n\n        const QString usernameCopy = username;\n        descriptors.append({ storageKey, [usernameCopy]() { return usernameCopy; } });\n    }\n\n    QMutexLocker locker(&cacheMutex);\n    descriptorCache = descriptors;\n}\n\nint DxTableModel::rowCount(const QModelIndex&) const\n{\n    return dxData.count();\n}\n\nint DxTableModel::columnCount(const QModelIndex&) const\n{\n    return 11;\n}\n\nQVariant DxTableModel::data(const QModelIndex& index, int role) const\n{\n    const DxSpot &spot = dxData.at(index.row());\n    if ( role == Qt::DisplayRole )\n    {\n        switch ( index.column() )\n        {\n        case 0:\n            return locale.toString(spot.dateTime, locale.formatTimeLongWithoutTZ());\n        case 1:\n            return spot.callsign;\n        case 2:\n            return QString::number(spot.freq, 'f', 4);\n        case 3:\n            return spot.modeGroupString;\n        case 4:\n            return spot.spotter;\n        case 5:\n            return spot.comment;\n        case 6:\n            return spot.dxcc.cont;\n        case 7:\n            return spot.dxcc_spotter.cont;\n        case 8:\n            return spot.band;\n        case 9:\n            return spot.memberList2StringList().join(\", \");\n        case 10:\n            return QCoreApplication::translate(\"DBStrings\", spot.dxcc.country.toUtf8().constData());\n        default:\n            return QVariant();\n        }\n    }\n    else if (index.column() == 1 && role == Qt::BackgroundRole)\n    {\n        return Data::statusToColor(spot.status, spot.dupeCount, QColor(Qt::transparent));\n    }\n    else if (index.column() == 1 && role == Qt::ToolTipRole)\n    {\n        return QCoreApplication::translate(\"DBStrings\", spot.dxcc.country.toUtf8().constData()) + \" [\" + Data::statusToText(spot.status) + \"]\";\n    }\n    return QVariant();\n}\n\nQVariant DxTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch ( section )\n    {\n    case 0: return tr(\"Time\");\n    case 1: return tr(\"Callsign\");\n    case 2: return tr(\"Frequency\");\n    case 3: return tr(\"Mode\");\n    case 4: return tr(\"Spotter\");\n    case 5: return tr(\"Comment\");\n    case 6: return tr(\"Continent\");\n    case 7: return tr(\"Spotter Continent\");\n    case 8: return tr(\"Band\");\n    case 9: return tr(\"Member\");\n    case 10: return tr(\"Country\");\n\n    default: return QVariant();\n    }\n}\n\nbool DxTableModel::addEntry(const DxSpot &entry, bool deduplicate,\n                            qint16 dedup_interval, double dedup_freq_tolerance)\n{\n    bool shouldInsert = true;\n    if ( deduplicate )\n    {\n        for (const DxSpot &record : static_cast<const QList<DxSpot>&>(dxData))\n        {\n            if ( record.dateTime.secsTo(entry.dateTime) > dedup_interval )\n                break;\n\n            if ( record.callsign == entry.callsign\n                 && qAbs(MHz(record.freq) - MHz(entry.freq)) < kHz(dedup_freq_tolerance) )\n            {\n                qCDebug(runtime) << \"Duplicate spot\" << record.callsign << record.freq <<  entry.callsign << entry.freq;\n                shouldInsert = false;\n                break;\n            }\n        }\n    }\n\n    if ( shouldInsert )\n    {\n        beginInsertRows(QModelIndex(), 0, 0);\n        dxData.prepend(entry);\n        endInsertRows();\n    }\n\n    return shouldInsert;\n}\n\nvoid DxTableModel::clear()\n{\n    beginResetModel();\n    dxData.clear();\n    endResetModel();\n}\n\nint WCYTableModel::rowCount(const QModelIndex&) const\n{\n    return wcyData.count();\n}\n\nint WCYTableModel::columnCount(const QModelIndex&) const\n{\n    return 9;\n}\n\nQVariant WCYTableModel::data(const QModelIndex& index, int role) const\n{\n    if ( role == Qt::DisplayRole )\n    {\n        const WCYSpot &spot = wcyData.at(index.row());\n\n        switch ( index.column() )\n        {\n        case 0:\n            return locale.toString(spot.time, locale.formatTimeLongWithoutTZ());\n        case 1:\n            return spot.KIndex;\n        case 2:\n            return spot.expK;\n        case 3:\n            return spot.AIndex;\n        case 4:\n            return spot.RIndex;\n        case 5:\n            return spot.SFI;\n        case 6:\n            return spot.SA;\n        case 7:\n            return spot.GMF;\n        case 8:\n            return spot.Au;\n        default:\n            return QVariant();\n        }\n    }\n    return QVariant();\n}\n\nQVariant WCYTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch ( section )\n    {\n    case 0: return tr(\"Time\");\n    case 1: return tr(\"K\");\n    case 2: return tr(\"expK\");\n    case 3: return tr(\"A\");\n    case 4: return tr(\"R\");\n    case 5: return tr(\"SFI\");\n    case 6: return tr(\"SA\");\n    case 7: return tr(\"GMF\");\n    case 8: return tr(\"Au\");\n\n    default: return QVariant();\n    }\n}\n\nvoid WCYTableModel::addEntry(const WCYSpot &entry)\n{\n    beginInsertRows(QModelIndex(), 0, 0);\n    wcyData.prepend(entry);\n    endInsertRows();\n}\n\nvoid WCYTableModel::clear()\n{\n    beginResetModel();\n    wcyData.clear();\n    endResetModel();\n}\n\nint WWVTableModel::rowCount(const QModelIndex&) const\n{\n    return wwvData.count();\n}\n\nint WWVTableModel::columnCount(const QModelIndex&) const\n{\n    return 5;\n}\n\nQVariant WWVTableModel::data(const QModelIndex& index, int role) const\n{\n\n    if ( role == Qt::DisplayRole )\n    {\n        const WWVSpot &spot = wwvData.at(index.row());\n\n        switch ( index.column() )\n        {\n        case 0:\n            return locale.toString(spot.time, locale.formatTimeLongWithoutTZ());\n        case 1:\n            return spot.SFI;\n        case 2:\n            return spot.AIndex;\n        case 3:\n            return spot.KIndex;\n        case 4:\n            return spot.info1 + \" \" + QChar(0x2192) + \" \" + spot.info2;\n        default:\n            return QVariant();\n        }\n    }\n    return QVariant();\n}\n\nQVariant WWVTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch ( section )\n    {\n    case 0: return tr(\"Time\");\n    case 1: return tr(\"SFI\");\n    case 2: return tr(\"A\");\n    case 3: return tr(\"K\");\n    case 4: return tr(\"Info\");\n\n    default: return QVariant();\n    }\n}\n\nvoid WWVTableModel::addEntry(const WWVSpot &entry)\n{\n    beginInsertRows(QModelIndex(), 0, 0);\n    wwvData.prepend(entry);\n    endInsertRows();\n}\n\nvoid WWVTableModel::clear()\n{\n    beginResetModel();\n    wwvData.clear();\n    endResetModel();\n}\n\nint ToAllTableModel::rowCount(const QModelIndex&) const\n{\n    return toAllData.count();\n}\n\nint ToAllTableModel::columnCount(const QModelIndex&) const\n{\n    return 3;\n}\n\nQVariant ToAllTableModel::data(const QModelIndex& index, int role) const\n{\n\n    if ( role == Qt::DisplayRole )\n    {\n        const ToAllSpot &spot = toAllData.at(index.row());\n\n        switch (index.column()) {\n        case 0:\n            return locale.toString(spot.time, locale.formatTimeLongWithoutTZ());\n        case 1:\n            return spot.spotter;\n        case 2:\n            return spot.message;\n        default:\n            return QVariant();\n        }\n    }\n    return QVariant();\n}\n\nQVariant ToAllTableModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if (role != Qt::DisplayRole || orientation != Qt::Horizontal) return QVariant();\n\n    switch ( section )\n    {\n    case 0: return tr(\"Time\");\n    case 1: return tr(\"Spotter\");\n    case 2: return tr(\"Message\");\n\n    default: return QVariant();\n    }\n}\n\nvoid ToAllTableModel::addEntry(const ToAllSpot &entry)\n{\n    beginInsertRows(QModelIndex(), 0, 0);\n    toAllData.prepend(entry);\n    endInsertRows();\n}\n\nvoid ToAllTableModel::clear()\n{\n    beginResetModel();\n    toAllData.clear();\n    endResetModel();\n}\n\nbool DeleteHighlightedDXServerWhenDelPressedEventFilter::eventFilter(QObject *obj, QEvent *event)\n{\n    if ( event->type() == QEvent::KeyPress )\n    {\n        QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);\n        if (keyEvent->key() == Qt::Key::Key_Delete && keyEvent->modifiers() == Qt::ControlModifier)\n        {\n            if ( dynamic_cast<QComboBox *>(obj) )\n            {\n                emit deleteServerItem();\n                return true;\n            }\n        }\n    }\n\n    // standard event processing\n    return QObject::eventFilter(obj, event);\n}\n/****************************************************/\nDxWidget::DxWidget(QWidget *parent) :\n    QWidget(parent),\n    socket(nullptr),\n    ui(new Ui::DxWidget),\n    deduplicateSpots(false),\n    commandsMenu(new QMenu(this)),\n    reconnectAttempts(0),\n    connectionState(DISCONNECTED),\n    connectedServerString(nullptr),\n    trendBandList({\"6m\", \"10m\", \"12m\", \"15m\", \"17m\", \"20m\", \"30m\", \"40m\", \"60m\", \"80m\", \"160m\"}),\n    trendTableCornerLabel(nullptr),\n    newContactWidget(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    setSearchClosed();\n\n    ui->serverSelect->setStyleSheet(QStringLiteral(\"QComboBox {color: red}\"));\n\n    wcyTableModel = new WCYTableModel(this);\n    wwvTableModel = new WWVTableModel(this);\n    toAllTableModel = new ToAllTableModel(this);\n\n    dxTableProxyModel = new SearchFilterProxyModel(ui->dxTable);\n    dxTableModel = new DxTableModel(dxTableProxyModel);\n    dxTableProxyModel->setSourceModel(dxTableModel);\n\n    QAction *separator = new QAction(this);\n    separator->setSeparator(true);\n\n    ui->dxTable->setModel(dxTableProxyModel);\n    ui->dxTable->addAction(ui->actionFilter);\n    ui->dxTable->addAction(ui->actionSearch);\n    ui->dxTable->addAction(ui->actionDisplayedColumns);\n    ui->dxTable->addAction(ui->actionClear);\n    ui->dxTable->addAction(separator);\n    ui->dxTable->addAction(ui->actionKeepSpots);\n    ui->dxTable->hideColumn(6);  //continent\n    ui->dxTable->hideColumn(7);  //spotter continen\n    ui->dxTable->hideColumn(8);  //band\n    ui->dxTable->hideColumn(9);  //Memberships\n    ui->dxTable->hideColumn(10); //Country\n    ui->dxTable->horizontalHeader()->setSectionsMovable(true);\n\n    ui->wcyTable->setModel(wcyTableModel);\n    ui->wcyTable->addAction(ui->actionDisplayedColumns);\n    ui->wcyTable->addAction(ui->actionClear);\n    ui->wcyTable->horizontalHeader()->setSectionsMovable(true);\n\n    ui->wwvTable->setModel(wwvTableModel);\n    ui->wwvTable->addAction(ui->actionDisplayedColumns);\n    ui->wwvTable->addAction(ui->actionClear);\n    ui->wwvTable->horizontalHeader()->setSectionsMovable(true);\n\n    ui->toAllTable->setModel(toAllTableModel);\n    ui->toAllTable->addAction(ui->actionDisplayedColumns);\n    ui->toAllTable->addAction(ui->actionClear);\n    ui->toAllTable->horizontalHeader()->setSectionsMovable(true);\n\n    ui->trendTable->setRowCount(trendBandList.size());\n    ui->trendTable->setColumnCount(Data::getContinentList().size());\n    ui->trendTable->setHorizontalHeaderLabels(Data::getContinentList());\n    ui->trendTable->setVerticalHeaderLabels(trendBandList);\n    ui->trendTable->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);\n    ui->trendTable->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);\n\n    moderegexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    contregexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    spottercontregexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    bandregexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n\n    reloadSetting();\n    serverComboSetup();\n\n    commandsMenu->addAction(ui->actionSpotQSO);\n    commandsMenu->addSeparator();\n    commandsMenu->addAction(ui->actionShowWCY);\n    commandsMenu->addAction(ui->actionShowWWV);\n    ui->commandButton->setMenu(commandsMenu);\n    ui->commandButton->setDefaultAction(ui->actionSpotQSO);\n    ui->commandButton->setEnabled(false);\n\n    QMenu *mainWidgetMenu = new QMenu(this);\n    mainWidgetMenu->addAction(ui->actionDeleteServer);\n    mainWidgetMenu->addAction(ui->actionForgetPassword);\n    mainWidgetMenu->addSeparator();\n    mainWidgetMenu->addAction(ui->actionConnectOnStartup);\n    QMenu *trendContinentMenu = new QMenu(tr(\"My Continent\"), mainWidgetMenu);\n    QActionGroup *continentMenuGroup = new QActionGroup(trendContinentMenu);\n    continentMenuGroup->setExclusive(true);\n    const QString &myContinent = LogParam::getDXCTrendContinent(QString());\n\n    QAction *actionAuto = new QAction(tr(\"Auto\"), continentMenuGroup);\n    actionAuto->setCheckable(true);\n    actionAuto->setChecked(true);\n    connect(actionAuto, &QAction::triggered, this, [this]()\n    {\n        LogParam::removeDXCTrendContinent();\n        recalculateTrend();\n    });\n    trendContinentMenu->addAction(actionAuto);\n    trendContinentMenu->addSeparator();\n\n    for ( const QString &name : Data::getContinentList() )\n    {\n        QAction* action = new QAction(name, continentMenuGroup);\n        action->setCheckable(true);\n        action->setChecked((myContinent == name));\n        connect(action, &QAction::triggered, this, [this, name]()\n        {\n            LogParam::setDXCTrendContinent(name);\n            recalculateTrend();\n        });\n        trendContinentMenu->addAction(action);\n    }\n    mainWidgetMenu->addMenu(trendContinentMenu);\n    ui->menuButton->setMenu(mainWidgetMenu);\n\n    reconnectTimer.setInterval(RECONNECT_TIMEOUT);\n    reconnectTimer.setSingleShot(true);\n    connect(&reconnectTimer, &QTimer::timeout, this, &DxWidget::connectCluster);\n\n    restoreWidgetSetting();\n\n    ui->actionConnectOnStartup->setChecked(getAutoconnectServer());\n    ui->actionKeepSpots->setChecked(getKeepQSOs());\n    dxTableProxyModel->setSearchSkippedCols(dxcListHiddenCols());\n}\n\nvoid DxWidget::toggleConnect()\n{\n    FCT_IDENTIFICATION;\n\n    if ( (socket && socket->isOpen())\n         || reconnectAttempts )\n    {\n        disconnectCluster();\n    }\n    else\n    {\n        if ( !DxServerString::isValidServerString(ui->serverSelect->currentText()) )\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"DXC Server Name Error\"),\n                                          QMessageBox::tr(\"DXC Server address must be in format<p><b>[username@]hostname:port</b> (ex. hamqth.com:7300)</p>\"));\n            return;\n        }\n        connectCluster();\n    }\n}\n\nvoid DxWidget::connectCluster()\n{\n    FCT_IDENTIFICATION;\n\n    const Callsign connectCallsign(StationProfilesManager::instance()->getCurProfile1().callsign);\n    connectedServerString = new DxServerString(ui->serverSelect->currentText(),\n                                               connectCallsign.isValid() ? connectCallsign.getBase().toLower()\n                                                                         : QString());\n\n    if ( !connectedServerString )\n    {\n        qWarning() << \"Cannot allocate currServerString\";\n        return;\n    }\n\n    if ( !connectedServerString->isValid() )\n    {\n        qWarning() << \"DX Server address is not valid\";\n        return;\n    }\n\n    qCDebug(runtime) << \"username:\" << connectedServerString->getUsername()\n                     << \"host:\" << connectedServerString->getHostname()\n                     << \"port:\" << connectedServerString->getPort();\n\n    socket = new QTcpSocket(this);\n\n    connect(socket, &QTcpSocket::readyRead, this, &DxWidget::receive, Qt::QueuedConnection); // QueuedConnection is needed because error is send together with disconnect\n                                                                                             // which causes creash because error destroid object during processing received signal\n    connect(socket, &QTcpSocket::connected, this, &DxWidget::connected, Qt::QueuedConnection);\n#if (QT_VERSION < QT_VERSION_CHECK(5, 15, 0))\n    connect(socket, QOverload<QAbstractSocket::SocketError>::of(&QAbstractSocket::error),\n            this, &DxWidget::socketError, Qt::QueuedConnection);\n#else\n    connect(socket, &QTcpSocket::errorOccurred, this, &DxWidget::socketError, Qt::QueuedConnection);\n#endif\n    ui->connectButton->setEnabled(false);\n    ui->connectButton->setText(tr(\"Connecting...\"));\n\n    if ( reconnectAttempts == 0 )\n    {\n        ui->log->clear();\n        if ( ! getKeepQSOs() )\n        {\n            ui->dxTable->clearSelection();\n            dxTableModel->clear();\n            wcyTableModel->clear();\n            wwvTableModel->clear();\n            toAllTableModel->clear();\n        }\n        ui->dxTable->repaint();\n    }\n\n    socket->connectToHost(connectedServerString->getHostname(),\n                          connectedServerString->getPort());\n    connectionState = CONNECTING;\n}\n\nvoid DxWidget::disconnectCluster(bool tryReconnect)\n{\n    FCT_IDENTIFICATION;\n\n    reconnectTimer.stop();\n    ui->commandEdit->clear();\n    ui->commandEdit->setEnabled(false);\n    ui->commandButton->setEnabled(false);\n    ui->connectButton->setEnabled(true);\n\n    if ( socket )\n    {\n       socket->disconnect();\n       socket->close();\n\n       socket->deleteLater();\n       socket = nullptr;\n    }\n\n    if ( reconnectAttempts < NUM_OF_RECONNECT_ATTEMPTS\n         && tryReconnect )\n    {\n        reconnectAttempts++;\n        reconnectTimer.start();\n        ui->commandEdit->setPlaceholderText(tr(\"DX Cluster is temporarily unavailable\"));\n    }\n    else\n    {\n        reconnectAttempts = 0;\n        ui->commandEdit->setPlaceholderText(\"\");\n        ui->connectButton->setText(tr(\"Connect\"));\n        ui->serverSelect->setStyleSheet(QStringLiteral(\"QComboBox {color: red}\"));\n    }\n    connectionState = DISCONNECTED;\n    dxcType = UNKNOWN;\n    if ( connectedServerString )\n    {\n        delete connectedServerString;\n        connectedServerString = nullptr;\n    }\n\n    clearAllPasswordIcons();\n}\n\nvoid DxWidget::saveDXCServers()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList serversItems = getDXCServerList();\n    const QString &curr_server = ui->serverSelect->currentText();\n\n    if ( DxServerString::isValidServerString(ui->serverSelect->currentText())\n         && !serversItems.contains(curr_server)\n         && !curr_server.isEmpty() )\n    {\n        ui->serverSelect->insertItem(0, ui->serverSelect->currentText());\n        serversItems.prepend(ui->serverSelect->currentText()); // insert policy is InsertAtTop\n        ui->serverSelect->setCurrentIndex(0);\n    }\n\n    LogParam::setDXCServerlist(serversItems);\n    LogParam::setDXCLastServer(ui->serverSelect->currentText());\n\n    DxClusterCredentials::refreshDescriptorCache(serversItems,\n                                                 dxClusterDefaultUsername());\n}\n\nQString DxWidget::modeFilterRegExp()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterModeRE();\n}\n\nQString DxWidget::contFilterRegExp()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterContRE();\n}\n\nQString DxWidget::spotterContFilterRegExp()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterSpotterContRE();\n}\n\nQString DxWidget::bandFilterRegExp()\n{\n    FCT_IDENTIFICATION;\n\n    QString regexp(\"NOTHING\");\n\n    const QList<Band> &bands = BandPlan::bandsList(false, true);\n    const QStringList exludedBandFilter = LogParam::getDXCExcludedBands();\n\n    for ( const Band &band : bands )\n        if ( !exludedBandFilter.contains(band.name) )\n            regexp.append(\"|^\" + band.name);\n\n    return regexp;\n}\n\nuint DxWidget::dxccStatusFilterValue()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterDxccStatus();\n}\n\nint DxWidget::getDedupTimeValue()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterDedupTime(DEDUPLICATION_TIME);\n}\n\nint DxWidget::getDedupFreqValue()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterDedupFreq(DEDUPLICATION_FREQ_TOLERANCE);\n}\n\nbool DxWidget::spotDedupValue()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterDedup();\n}\n\nQStringList DxWidget::dxMemberList()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCFilterMemberlists();\n}\n\nbool DxWidget::getAutoconnectServer()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCAutoconnectServer();\n}\n\nvoid DxWidget::saveAutoconnectServer(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setDXCAutoconnectServer(state);\n}\n\nbool DxWidget::getKeepQSOs()\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getDXCKeepQSOs();\n}\n\nvoid DxWidget::saveKeepQSOs(bool state)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setDXCKeepQSOs(state);\n}\n\nvoid DxWidget::sendCommand(const QString & command,\n                           bool switchToConsole)\n{\n    FCT_IDENTIFICATION;\n\n    if ( socket && socket->isOpen() )\n        socket->write((command + QLatin1String(\"\\r\\n\")).toLatin1());\n\n    // switch to raw mode to see a response\n    if ( switchToConsole )\n    {\n        ui->viewModeCombo->setCurrentIndex(CONSOLE_VIEW);\n    }\n}\n\nvoid DxWidget::saveWidgetSetting()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setDXCDXTableState(ui->dxTable->horizontalHeader()->saveState());\n    LogParam::setDXCWCYTableState(ui->wcyTable->horizontalHeader()->saveState());\n    LogParam::setDXCWWVTableState(ui->wwvTable->horizontalHeader()->saveState());\n    LogParam::setDXCTOALLTableState(ui->toAllTable->horizontalHeader()->saveState());\n    LogParam::setDXCConsoleFontSize(ui->log->font().pointSize());\n}\n\nvoid DxWidget::restoreWidgetSetting()\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray state = LogParam::getDXCDXTableState();\n    if ( !state.isEmpty() ) ui->dxTable->horizontalHeader()->restoreState(state);\n\n    state = LogParam::getDXCWCYTableState();\n    if ( !state.isEmpty() ) ui->wcyTable->horizontalHeader()->restoreState(state);\n\n    state = LogParam::getDXCWWVTableState();\n    if ( !state.isEmpty() ) ui->wwvTable->horizontalHeader()->restoreState(state);\n\n    state = LogParam::getDXCTOALLTableState();\n    if ( !state.isEmpty() ) ui->toAllTable->horizontalHeader()->restoreState(state);\n\n    int fontsize = LogParam::getDXCConsoleFontSize();\n    QFont monospace(QFontDatabase::systemFont(QFontDatabase::FixedFont));\n    if ( fontsize > 0 ) monospace.setPointSize(fontsize);\n    ui->log->setFont(monospace);\n}\n\nvoid DxWidget::send()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(ui->commandEdit->text());\n    ui->commandEdit->clear();\n}\n\nvoid DxWidget::receive()\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression dxSpotRE(QStringLiteral(\"^DX de ([a-zA-Z0-9\\\\/]+).*:\\\\s+([0-9|.]+)\\\\s+([a-zA-Z0-9\\\\/]+)[^\\\\s]*\\\\s+(.*)\\\\s+(\\\\d{4}Z)\"),\n                                       QRegularExpression::CaseInsensitiveOption);\n\n    static QRegularExpression wcySpotRE(QStringLiteral(\"^(WCY de) +([A-Z0-9\\\\-#]*) +<(\\\\d{2})> *: +K=(\\\\d{1,3}) expK=(\\\\d{1,3}) A=(\\\\d{1,3}) R=(\\\\d{1,3}) SFI=(\\\\d{1,3}) SA=([a-zA-Z]{1,3}) GMF=([a-zA-Z]{1,3}) Au=([a-zA-Z]{2}) *$\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n\n    static QRegularExpression wwvSpotRE(QStringLiteral(\"^(WWV de) +([A-Z0-9\\\\-#]*) +<(\\\\d{2})Z?> *: *SFI=(\\\\d{1,3}), A=(\\\\d{1,3}), K=(\\\\d{1,3}), (.*\\\\b) *-> *(.*\\\\b) *$\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n\n    static QRegularExpression toAllSpotRE(QStringLiteral(\"^(To ALL de) +([A-Z0-9\\\\-#]*)\\\\s?(<(\\\\d{4})Z>)?[ :]+(.*)?$\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n\n    static QRegularExpression SHDXFormatRE(QStringLiteral(\"^\\\\s{0,8}([0-9|.]+)\\\\s+([a-zA-Z0-9\\\\/]+)[^\\\\s]*\\\\s+(.*)\\\\s+(\\\\d{4}Z) (.*)<([a-zA-Z0-9\\\\/]+)>$\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n\n    static QRegularExpression splitLineRE(QStringLiteral(\"(\\a|\\n|\\r)+\"));\n    static QRegularExpression loginRE(QStringLiteral(\"enter your call(sign)?:\"));\n\n    static const QString loginStr         = QStringLiteral(\"login\");\n    static const QString ccClusterStr     = QStringLiteral(\"Running CC Cluster software\");\n    static const QString invalidCallsign  = QStringLiteral(\"is an invalid callsign\");\n    static const QString passwordStr      = QStringLiteral(\"password\");\n    static const QString sorryStr         = QStringLiteral(\"sorry\");\n    static const QString dxSpiderStr      = QStringLiteral(\"dxspider\");\n    static const QString dxPrefix         = QStringLiteral(\"DX\");\n    static const QString wcyPrefix        = QStringLiteral(\"WCY de\");\n    static const QString wwvPrefix        = QStringLiteral(\"WWV de\");\n    static const QString toAllPrefix      = QStringLiteral(\"To ALL de\");\n\n    reconnectAttempts = 0;\n\n    if ( !socket || !connectedServerString )\n    {\n        qCDebug(runtime) << \"socket or connection string is null\";\n        return;\n    }\n\n    const QByteArray rawData = socket->readAll();\n\n    if ( rawData.isEmpty() ) return;\n\n    const QString data = QString::fromUtf8(rawData);\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n    const QStringList lines = data.split(splitLineRE, Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n    const QStringList lines = data.split(splitLineRE, QString::SkipEmptyParts);\n#endif\n\n    const auto sendLine = [this](const QString &s)\n    {\n        socket->write((s + QLatin1String(\"\\r\\n\")).toUtf8());\n    };\n\n    for ( const QString &line : lines )\n    {\n        qCDebug(runtime) << connectionState << line;\n\n        // Skip empty lines\n        if ( line.isEmpty() ) continue;\n\n        if ( connectionState == CONNECTED )\n        {\n            if ( line.startsWith(loginStr, Qt::CaseInsensitive) || line.contains(loginRE) )\n            {\n                // username requested\n                sendLine(connectedServerString->getUsername());\n                connectionState = LOGIN_SENT;\n                qCDebug(runtime) << \"Login sent\";\n                continue;\n            }\n\n            if ( line.contains(ccClusterStr, Qt::CaseInsensitive) )\n            {\n                dxcType = CCCluster;\n                qCDebug(runtime) << \"CC Cluster Detected\";\n                updateCommandsMenu();\n                continue;\n            }\n        }\n\n        if ( connectionState == LOGIN_SENT && line.contains(invalidCallsign) )\n        {\n            // invalid login\n            QMessageBox::warning(nullptr,\n                                 tr(\"DXC Server Error\"),\n                                 tr(\"An invalid callsign\"));\n            continue;\n        }\n\n        if ( connectionState == LOGIN_SENT && line.startsWith(passwordStr, Qt::CaseInsensitive) )\n        {\n            // password requested\n            QString password = DxClusterCredentials::loadPasswd(*connectedServerString);\n\n            if ( password.isEmpty() )\n            {\n                InputPasswordDialog passwordDialog(tr(\"DX Cluster Password\"),\n                                                   \"<b>\" + tr(\"Security Notice\") + \":</b> \" + tr(\"The password can be sent via an unsecured channel\") +\n                                                   \"<br/><br/>\" +\n                                                   \"<b>\" + tr(\"Server\") + \":</b> \" + socket->peerName() + \":\" + QString::number(socket->peerPort()) +\n                                                   \"<br/>\" +\n                                                   \"<b>\" + tr(\"Username\") + \"</b>: \" + connectedServerString->getUsername(), this);\n                if ( passwordDialog.exec() == QDialog::Accepted )\n                {\n                    password = passwordDialog.getPassword();\n                    if ( passwordDialog.getRememberPassword() && !password.isEmpty() )\n                    {\n                        DxClusterCredentials::storePasswd(*connectedServerString, password);\n                    }\n                }\n                else\n                {\n                    disconnectCluster(false);\n                    return;\n                }\n            }\n            activateCurrPasswordIcon();\n            sendLine(password);\n            connectionState = PASSWORD_SENT;\n            qCDebug(runtime) << \"Password sent\";\n            continue;\n        }\n\n        if ( connectionState == PASSWORD_SENT && line.startsWith(sorryStr, Qt::CaseInsensitive ) )\n        {\n            // invalid password\n            DxClusterCredentials::removePasswd(*connectedServerString);\n            QMessageBox::warning(nullptr,\n                                 QMessageBox::tr(\"DX Cluster Password\"),\n                                 QMessageBox::tr(\"Invalid Password\"));\n            continue;\n        }\n\n        if ( connectionState == LOGIN_SENT || connectionState == PASSWORD_SENT )\n        {\n\n            if ( line.contains(dxSpiderStr, Qt::CaseInsensitive) )\n            {\n                connectionState = OPERATION;\n                dxcType = DXSPIDER;\n                qCDebug(runtime) << \"dxspider Detected\";\n                updateCommandsMenu();\n                ui->commandButton->setEnabled(true);\n                continue;\n            }\n            // the difference compared to DXSpider is that CC Cluster type\n            // is detected before login, but DXSpider type is detected after login\n            if ( dxcType == CCCluster )\n            {\n                connectionState = OPERATION;\n                ui->commandButton->setEnabled(true);\n            }\n        }\n\n        /********************/\n        /* Received DX SPOT */\n        /********************/\n        if ( line.startsWith(dxPrefix) )\n        {\n            if ( connectionState == LOGIN_SENT || connectionState == PASSWORD_SENT )\n                connectionState = OPERATION;\n\n            const QRegularExpressionMatch dxSpotMatch = dxSpotRE.match(line);\n\n            if ( dxSpotMatch.hasMatch() )\n            {\n                //DX de N9EN/4:    18077.0  OS5Z         op. Marc; tnx QSO!             1359Z\n                processDxSpot(dxSpotMatch.captured(1),   //spotter\n                              dxSpotMatch.captured(2),   //freq\n                              dxSpotMatch.captured(3),   //call\n                              dxSpotMatch.captured(4));  //comment\n            }\n        }\n        /************************/\n        /* Received WCY Info */\n        /************************/\n        else if ( line.startsWith(wcyPrefix) )\n        {\n            const QRegularExpressionMatch wcySpotMatch = wcySpotRE.match(line);\n\n            if ( wcySpotMatch.hasMatch() )\n            {\n                WCYSpot spot;\n\n                spot.time = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n                spot.KIndex = wcySpotMatch.captured(4).toUInt();\n                spot.expK = wcySpotMatch.captured(5).toUInt();\n                spot.AIndex = wcySpotMatch.captured(6).toUInt();\n                spot.RIndex = wcySpotMatch.captured(7).toUInt();\n                spot.SFI = wcySpotMatch.captured(8).toUInt();\n                spot.SA = wcySpotMatch.captured(9);\n                spot.GMF = wcySpotMatch.captured(10);\n                spot.Au = wcySpotMatch.captured(11);\n\n                emit newWCYSpot(spot);\n                wcyTableModel->addEntry(spot);\n            }\n        }\n        /*********************/\n        /* Received WWV Info */\n        /*********************/\n        else if ( line.startsWith(wwvPrefix) )\n        {\n            const QRegularExpressionMatch wwvSpotMatch = wwvSpotRE.match(line);\n\n            if ( wwvSpotMatch.hasMatch() )\n            {\n                WWVSpot spot;\n\n                spot.time = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n                spot.SFI = wwvSpotMatch.captured(4).toUInt();\n                spot.AIndex = wwvSpotMatch.captured(5).toUInt();\n                spot.KIndex = wwvSpotMatch.captured(6).toUInt();\n                spot.info1 = wwvSpotMatch.captured(7);\n                spot.info2 = wwvSpotMatch.captured(8);\n\n                emit newWWVSpot(spot);\n                wwvTableModel->addEntry(spot);\n            }\n        }\n        /*************************/\n        /* Received Generic Info */\n        /*************************/\n        else if ( line.startsWith(toAllPrefix) )\n        {\n            const QRegularExpressionMatch toAllSpotMatch = toAllSpotRE.match(line);\n\n            if ( toAllSpotMatch.hasMatch() )\n            {\n                ToAllSpot spot;\n\n                spot.time = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n                spot.spotter = toAllSpotMatch.captured(2);\n                DxccEntity spotter_info = Data::instance()->lookupDxcc(spot.spotter);\n                spot.dxcc_spotter = spotter_info;\n                spot.message = toAllSpotMatch.captured(5);\n\n                emit newToAllSpot(spot);\n                toAllTableModel->addEntry(spot);\n            }\n        }\n        /****************/\n        /* SH/DX format  */\n        /****************/\n        else if ( line.contains(SHDXFormatRE) )\n        {\n            const QRegularExpressionMatch SHDXFormatMatch = SHDXFormatRE.match(line);\n\n            if ( SHDXFormatMatch.hasMatch() )\n            {\n                //14045.6 K5UV         6-Dec-2023 1359Z CWops CWT Contest             <VE4DL>\n                const QDateTime &dateTime = QDateTime::fromString(SHDXFormatMatch.captured(3) +\n                                                                  \" \" +\n                                                                  SHDXFormatMatch.captured(4), \"d-MMM-yyyy hhmmZ\");\n                processDxSpot(SHDXFormatMatch.captured(6),   //spotter\n                              SHDXFormatMatch.captured(1),   //freq\n                              SHDXFormatMatch.captured(2),   //call\n                              SHDXFormatMatch.captured(5),\n                              dateTime);  //comment\n            }\n        }\n        ui->log->appendPlainText(line);\n    }\n}\n\nvoid DxWidget::socketError(QAbstractSocket::SocketError socker_error)\n{\n    FCT_IDENTIFICATION;\n\n    bool reconectRequested = (reconnectAttempts > 0 ) ? true : false;\n\n    QString error_msg = QObject::tr(\"Cannot connect to DXC Server <p>Reason <b>: \");\n\n    qCDebug(runtime) << socker_error;\n\n    switch (socker_error)\n    {\n    case QAbstractSocket::ConnectionRefusedError:\n        error_msg.append(QObject::tr(\"Connection Refused\"));\n        break;\n    case QAbstractSocket::RemoteHostClosedError:\n        error_msg.append(QObject::tr(\"Host closed the connection\"));\n        reconectRequested = (connectionState != LOGIN_SENT\n                             && connectionState != PASSWORD_SENT);\n        break;\n    case QAbstractSocket::HostNotFoundError:\n        error_msg.append(QObject::tr(\"Host not found\"));\n        break;\n    case QAbstractSocket::SocketTimeoutError:\n        error_msg.append(QObject::tr(\"Timeout\"));\n        reconectRequested = true;\n        break;\n    case QAbstractSocket::NetworkError:\n        error_msg.append(QObject::tr(\"Network Error\"));\n        break;\n    default:\n        error_msg.append(QObject::tr(\"Internal Error\"));\n\n    }\n    error_msg.append(\"</b></p>\");\n\n    qInfo() << \"Detailed Error: \" << socker_error;\n\n    if ( connectionState != LOGIN_SENT\n         && connectionState != PASSWORD_SENT\n         && (! reconectRequested || reconnectAttempts == NUM_OF_RECONNECT_ATTEMPTS))\n    {\n        QMessageBox::warning(nullptr,\n                             QMessageBox::tr(\"DXC Server Connection Error\"),\n                             error_msg);\n    }\n    disconnectCluster(reconectRequested);\n}\n\nvoid DxWidget::connected()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !socket )\n    {\n        qWarning() << \"Socket is not opened\";\n        return;\n    }\n\n    int fd = socket->socketDescriptor();\n\n#ifdef Q_OS_WIN\n    DWORD  dwBytesRet = 0;\n\n    struct tcp_keepalive   alive;    // your options for \"keepalive\" mode\n    alive.onoff = TRUE;              // turn it on\n    alive.keepalivetime = 10000;     // delay (ms) between requests, here is 10s, default is 2h (7200000)\n    alive.keepaliveinterval = 5000;  // delay between \"emergency\" ping requests, their number (6) is not configurable\n      /* So with this config  socket will send keepalive requests every 30 seconds after last data transaction when everything is ok.\n          If there is no reply (wire plugged out) it'll send 6 requests with 5s delay  between them and then close.\n          As a result we will get disconnect after approximately 1 min timeout.\n       */\n    if (WSAIoctl(fd, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0, &dwBytesRet, NULL, NULL) == SOCKET_ERROR) {\n           qWarning() << \"WSAIotcl(SIO_KEEPALIVE_VALS) failed with err#\" <<  WSAGetLastError();\n    }\n#else\n    int enableKeepAlive = 1;\n    int maxIdle = 10;\n    int count = 3;\n    int interval = 10;\n\n    if ( setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive)) !=0 )\n    {\n         qWarning() << \"Cannot set keepalive for DXC\";\n    }\n    else\n    {\n#ifndef Q_OS_MACOS\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle)) != 0 )\n#else\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPALIVE, &maxIdle, sizeof(maxIdle)) != 0 )\n#endif /* Q_OS_MACOS */\n        {\n            qWarning() << \"Cannot set keepalive idle for DXC\";\n        }\n\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &count, sizeof(count)) != 0 )\n        {\n            qWarning() << \"Cannot set keepalive counter for DXC\";\n        }\n\n        if ( setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &interval, sizeof(interval)) != 0 )\n        {\n            qWarning() << \"Cannot set keepalive interval for DXC\";\n        }\n\n        // TODO: setup TCP_USER_TIMEOUT????\n    }\n#endif\n    ui->commandEdit->setEnabled(true);\n    ui->connectButton->setEnabled(true);\n    ui->connectButton->setText(tr(\"Disconnect\"));\n    ui->commandEdit->setPlaceholderText(tr(\"DX Cluster Command\"));\n    ui->serverSelect->setStyleSheet(\"QComboBox {color: green}\");\n    connectionState = CONNECTED;\n    saveDXCServers();\n}\n\nvoid DxWidget::viewModeChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    ui->stack->setCurrentIndex(index);\n}\n\nvoid DxWidget::entryDoubleClicked(QModelIndex index)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &source_index = dxTableProxyModel->mapToSource(index);\n    emit tuneDx(dxTableModel->getSpot(source_index));\n}\n\nvoid DxWidget::actionFilter()\n{\n    FCT_IDENTIFICATION;\n\n    DxFilterDialog dialog;\n\n    if (dialog.exec() == QDialog::Accepted)\n        reloadSetting();\n}\n\nvoid DxWidget::adjusteServerSelectSize(QString input)\n{\n    FCT_IDENTIFICATION;\n\n    qDebug(function_parameters)<< input << input.length();\n\n    QFont f;\n    QFontMetrics met(f);\n\n    ui->serverSelect->setMinimumWidth(met.boundingRect(input).width() + 35);\n    ui->serverSelect->update();\n    ui->serverSelect->repaint();\n}\n\nvoid DxWidget::serverSelectChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qDebug(function_parameters) << index;\n\n    if ( (socket && socket->isOpen())\n         || reconnectAttempts )\n    {\n        /* reconnect DXC Server */\n        if ( index >= 0 )\n        {\n            disconnectCluster();\n            connectCluster();\n        }\n    }\n}\n\nvoid DxWidget::setLastQSO(QSqlRecord qsoRecord)\n{\n    FCT_IDENTIFICATION;\n\n    lastQSO = qsoRecord;\n}\n\nvoid DxWidget::reloadSetting()\n{\n    FCT_IDENTIFICATION;\n\n    moderegexp.setPattern(modeFilterRegExp());\n    contregexp.setPattern(contFilterRegExp());\n    spottercontregexp.setPattern(spotterContFilterRegExp());\n    bandregexp.setPattern(bandFilterRegExp());\n    dxccStatusFilter = dxccStatusFilterValue();\n    deduplicateSpots = spotDedupValue();\n    deduplicatetime = getDedupTimeValue();\n    deduplicatefreq = getDedupFreqValue();\n    QStringList tmp = dxMemberList();\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n    dxMemberFilter = QSet<QString>(tmp.begin(), tmp.end());\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n    dxMemberFilter = QSet<QString>(QSet<QString>::fromList(tmp));\n#endif\n\n    ui->filteredLabel->setHidden(!isFilterEnabled());\n}\n\nvoid DxWidget::prepareQSOSpot(QSqlRecord qso)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"QSO\" << qso;\n\n    if ( !ui->commandEdit->isEnabled() )\n        return;\n\n    if ( qso.contains(QStringLiteral(\"start_time\")) )\n    {\n        //qso is valid record\n        if ( qso.contains(QStringLiteral(\"freq\"))\n             && qso.contains(QStringLiteral(\"callsign\")) )\n        {\n            double spotFreq = ( qso.contains(\"freq_rx\")\n                                && qso.value(\"freq_rx\").toDouble() != 0.0 ) ? qso.value(\"freq_rx\").toDouble()\n                                                                            : qso.value(\"freq\").toDouble();\n\n            // DX Spider allow to enter QSO freq in MHz but it is not reliable for SHF bands.\n            // a more reliable way is to send a spot with kHz value\n            ui->commandEdit->setText(QString(\"dx %1 %2 \").arg(QString::number(Hz2kHz(MHz(spotFreq)), 'f', 0),\n                                                              qso.value(\"callsign\").toString()));\n            ui->commandEdit->setFocus();\n        }\n    }\n}\n\nvoid DxWidget::setSearch(const QString &text)\n{\n    FCT_IDENTIFICATION;\n\n    dxTableProxyModel->setSearchString(text);\n}\n\nvoid DxWidget::setSearchStatus(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->searchEdit->setVisible(visible);\n    ui->searchEdit->setFocus();\n    ui->searchCloseButton->setVisible(visible);\n\n    ui->searchEdit->setText(visible && newContactWidget\n                            ? newContactWidget->getCallsign()\n                            : QString());\n}\n\nvoid DxWidget::setSearchVisible()\n{\n    FCT_IDENTIFICATION;\n    setSearchStatus(!ui->searchEdit->isVisible());\n}\n\nvoid DxWidget::setSearchClosed()\n{\n    FCT_IDENTIFICATION;\n    setSearchStatus(false);\n}\n\nvoid DxWidget::trendDoubleClicked(int row, int column)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << row << column;\n    emit tuneBand(trendBandList[row]);\n}\n\nvoid DxWidget::setTunedFrequency(VFOID vfoid, double vfoFreq, double ritFreq, double xitFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << vfoFreq << ritFreq << xitFreq;\n\n    // DX widget tracks the RX frequency only\n    if ( vfoid == VFO2 )\n        return;\n\n    const QString& newBand = BandPlan::freq2Band(xitFreq).name;\n    const QBrush &defaultBrush = ui->trendTable->horizontalHeaderItem(0)->background();\n\n    for ( int i = 0; i < ui->trendTable->rowCount(); i++ )\n    {\n        QTableWidgetItem *bandItem = ui->trendTable->verticalHeaderItem(i);\n        if (!bandItem) continue;\n        bandItem->setBackground(((bandItem->text() == newBand) ? QBrush(Qt::darkGray)\n                                                               : defaultBrush));\n    }\n}\n\nvoid DxWidget::registerContactWidget(const NewContactWidget *contactWidget)\n{\n    FCT_IDENTIFICATION;\n\n    newContactWidget = contactWidget;\n}\n\nvoid DxWidget::setDxTrend(QHash<QString, QHash<QString, QHash<QString, int>>> trend)\n{\n    FCT_IDENTIFICATION;\n\n    receivedTrendData = trend;\n    recalculateTrend();\n}\n\nQColor DxWidget::getHeatmapColor(int value, int maxValue)\n{\n    if (maxValue == 0)\n        return QColor(0,0,0,0);\n\n    //double normalized = static_cast<double>(value) / maxValue;\n    double normalized = log(1 + value) / log(1 + maxValue);\n\n    int g = 255;\n    int r =  static_cast<int>(255 * normalized);\n    int b = 0;\n    int a = ( value == 0 ? 0 : 255);\n\n    return QColor(r, g, b, a);\n}\n\nbool DxWidget::isFilterEnabled() const\n{\n    FCT_IDENTIFICATION;\n\n    return dxccStatusFilter != (DxccStatus::NewEntity | DxccStatus::NewBand |\n                                DxccStatus::NewMode   | DxccStatus::NewSlot |\n                                DxccStatus::Worked    | DxccStatus::Confirmed)\n        || contregexp.pattern().count(\"|\") != 7\n        || !dxMemberFilter.isEmpty()\n        // || deduplicateSpots  // deduplication does not mean filtring.\n        || spottercontregexp.pattern().count(\"|\") != 7\n        || moderegexp.pattern().count(\"|\") != 4\n        || BandPlan::bandsList(false, true).size() != bandregexp.pattern().count(\"|\");\n}\n\nvoid DxWidget::recalculateTrend()\n{\n    FCT_IDENTIFICATION;\n\n    const DxccEntity &myDxccEntity = Data::instance()->lookupDxcc(StationProfilesManager::instance()->getCurProfile1().callsign);\n    const QString &myContinent = LogParam::getDXCTrendContinent(myDxccEntity.cont);\n    bool myContinentChanged = false;\n\n    // Create Left Top Corner Label\n    if ( ! trendTableCornerLabel )\n    {\n        // this part must not be called in the class constructor. Geometry is not determined in QT\n        trendTableCornerLabel = new QLabel(myContinent + \" →\", ui->trendTable);\n        trendTableCornerLabel->setAlignment(Qt::AlignCenter);\n        trendTableCornerLabel->setGeometry(0, 0,\n                                           ui->trendTable->verticalHeader()->width(),\n                                           ui->trendTable->horizontalHeader()->height());\n        trendTableCornerLabel->show();\n    }\n    else\n    {\n        myContinentChanged = !trendTableCornerLabel->text().contains(myContinent);\n        trendTableCornerLabel->setText(myContinent + \" →\");\n    }\n\n    //Clear Table\n    for (int row = 0; row < ui->trendTable->rowCount(); ++row)\n    {\n        for (int col = 0; col < ui->trendTable->columnCount(); ++col)\n        {\n            QTableWidgetItem *item = ui->trendTable->takeItem(row, col);\n            if (item) delete item;\n        }\n    }\n    ui->trendTable->clearContents();\n\n    // get my continent data\n    trendDataForMyCont = receivedTrendData.value(myContinent);\n\n    // update bidirections EU->OC and OC->EU\n    for ( auto continentData = receivedTrendData.cbegin(); continentData != receivedTrendData.cend(); ++continentData )\n    {\n        if (continentData.key() == myContinent )\n            continue;\n\n        for ( auto band = continentData.value()[myContinent].cbegin(); band != continentData.value()[myContinent].cend(); ++band )\n            trendDataForMyCont[continentData.key()][band.key()] += band.value();\n    }\n\n    int maxValue = 0;\n\n    // find the max value for heatmap\n    for ( const auto &outer : static_cast<const QHash<QString, QHash<QString, int>>&>(trendDataForMyCont) )\n        for ( const auto &inner : outer )\n            if ( inner > maxValue )\n                maxValue = inner;\n\n    // fill the table\n    for ( int row = 0; row < trendBandList.size(); ++row )\n    {\n        const QString &band = trendBandList[row];\n\n        for ( int col = 0; col < Data::getContinentList().size(); ++col )\n        {\n            const QString &toContinent = Data::getContinentList()[col];\n            int currentSpots = trendDataForMyCont.value(toContinent).value(band);\n            int prevSpots = prevTrendDataForMyCont.value(toContinent).value(band);\n            int diff = currentSpots - prevSpots;\n\n            QString displayText = ( currentSpots == 0 ) ? \"\" : QString::number(currentSpots);\n\n            if ( !prevTrendDataForMyCont.isEmpty() && !myContinentChanged )\n            {\n                if (diff > 0)\n                    displayText += \" (\\u2197)\";\n                else if (diff < 0)\n                    displayText += \" (\\u2198)\";\n            }\n\n            QTableWidgetItem *item = new QTableWidgetItem(displayText);\n            item->setBackground(getHeatmapColor(currentSpots, maxValue));\n            item->setForeground(QColor(Qt::black));\n            item->setTextAlignment(Qt::AlignCenter);\n            ui->trendTable->setItem(row, col, item);\n        }\n    }\n\n    prevTrendDataForMyCont = trendDataForMyCont;\n}\n\nvoid DxWidget::actionCommandSpotQSO()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Last QSO\" << lastQSO;\n\n    prepareQSOSpot(lastQSO);\n    ui->commandButton->setDefaultAction(ui->actionSpotQSO);\n}\n\nvoid DxWidget::actionCommandShowHFStats()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(QStringLiteral(\"sh/hfstats\"), true);\n    ui->commandButton->setDefaultAction(ui->actionShowHFStats);\n}\n\nvoid DxWidget::actionCommandShowVHFStats()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(QStringLiteral(\"sh/vhfstats\"), true);\n    ui->commandButton->setDefaultAction(ui->actionShowVHFStats);\n}\n\nvoid DxWidget::actionCommandShowWCY()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(QStringLiteral(\"sh/wcy\"), true);\n    ui->commandButton->setDefaultAction(ui->actionShowWCY);\n}\n\nvoid DxWidget::actionCommandShowWWV()\n{\n    FCT_IDENTIFICATION;\n\n    sendCommand(QStringLiteral(\"sh/wwv\"), true);\n    ui->commandButton->setDefaultAction(ui->actionShowWWV);\n}\n\nvoid DxWidget::actionConnectOnStartup()\n{\n    FCT_IDENTIFICATION;\n\n    saveAutoconnectServer(ui->actionConnectOnStartup->isChecked());\n\n    if ( ui->actionConnectOnStartup->isChecked() && socket == nullptr)\n    {\n        // dxc is not connected, connnet it\n        toggleConnect();\n    }\n}\n\nvoid DxWidget::actionDeleteServer()\n{\n    FCT_IDENTIFICATION;\n\n    actionForgetPassword();\n    ui->serverSelect->removeItem(ui->serverSelect->currentIndex());\n    ui->serverSelect->setMinimumWidth(0);\n    saveDXCServers();\n}\n\nvoid DxWidget::actionForgetPassword()\n{\n    FCT_IDENTIFICATION;\n\n    DxServerString serverName(ui->serverSelect->currentText(),\n                              StationProfilesManager::instance()->getCurProfile1().callsign.toLower());\n\n    if ( serverName.isValid() )\n    {\n        DxClusterCredentials::removePasswd(serverName);\n    }\n    else\n    {\n        qCDebug(runtime) << \"Cannot remove record from Secure Store, server name is not valid\"\n                         << ui->serverSelect->currentText();\n    }\n    ui->serverSelect->setItemIcon(ui->serverSelect->currentIndex(), QIcon());\n}\n\nvoid DxWidget::actionKeepSpots()\n{\n    FCT_IDENTIFICATION;\n\n    saveKeepQSOs(ui->actionKeepSpots->isChecked());\n}\n\nvoid DxWidget::actionClear()\n{\n    FCT_IDENTIFICATION;\n\n    QTableView *view = nullptr;\n\n    switch ( ui->stack->currentIndex() )\n    {\n    case 0: dxTableModel->clear(); view = ui->dxTable; break;\n    case 1: wcyTableModel->clear(); view = ui->wcyTable; break;\n    case 2: wwvTableModel->clear(); view = ui->wwvTable; break;\n    case 3: toAllTableModel->clear(); view = ui->toAllTable; break;\n    default: view = nullptr;\n    }\n\n    if ( view )\n    {\n        view->repaint();\n    }\n}\n\nvoid DxWidget::displayedColumns()\n{\n    FCT_IDENTIFICATION;\n\n    QTableView *view = nullptr;\n\n    switch ( ui->stack->currentIndex() )\n    {\n    case 0: view = ui->dxTable; break;\n    case 1: view = ui->wcyTable; break;\n    case 2: view = ui->wwvTable; break;\n    case 3: view = ui->toAllTable; break;\n    default: view = nullptr;\n    }\n\n    if ( view )\n    {\n        ColumnSettingSimpleDialog dialog(view);\n        dialog.exec();\n        saveWidgetSetting();\n        if ( view == ui->dxTable )\n            dxTableProxyModel->setSearchSkippedCols(dxcListHiddenCols());\n    }\n}\n\nQStringList DxWidget::getDXCServerList()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    for ( int index = 0; index < ui->serverSelect->count(); index++ )\n    {\n        ret << ui->serverSelect->itemText(index);\n    }\n    return ret;\n}\n\nvoid DxWidget::serverComboSetup()\n{\n    FCT_IDENTIFICATION;\n\n    DeleteHighlightedDXServerWhenDelPressedEventFilter *deleteHandled = new DeleteHighlightedDXServerWhenDelPressedEventFilter(this);\n\n    ui->serverSelect->addItems(LogParam::getDXCServerlist());\n    ui->serverSelect->installEventFilter(deleteHandled);\n    connect(deleteHandled, &DeleteHighlightedDXServerWhenDelPressedEventFilter::deleteServerItem,\n            this, &DxWidget::actionDeleteServer);\n\n    int index = ui->serverSelect->findText(LogParam::getDXCLastServer());\n\n    // if last server still exists then set it otherwise use the first one\n    if ( index >= 0 )\n    {\n        ui->serverSelect->setCurrentIndex(index);\n    }\n\n    DxClusterCredentials::refreshDescriptorCache(getDXCServerList(),\n                                                 dxClusterDefaultUsername());\n}\n\nvoid DxWidget::clearAllPasswordIcons()\n{\n    FCT_IDENTIFICATION;\n\n    for (int i = 0; i < ui->serverSelect->count(); i++)\n    {\n        ui->serverSelect->setItemIcon(i, QIcon());\n    }\n}\n\nvoid DxWidget::activateCurrPasswordIcon()\n{\n    FCT_IDENTIFICATION;\n\n    ui->serverSelect->setItemIcon(ui->serverSelect->currentIndex(), QIcon(\":/icons/password.png\"));\n}\n\nvoid DxWidget::updateCommandsMenu()\n{\n    FCT_IDENTIFICATION;\n\n    switch (dxcType)\n    {\n    case CCCluster:\n        if ( ui->commandButton->defaultAction() == ui->actionShowHFStats\n             || ui->commandButton->defaultAction() == ui->actionShowVHFStats )\n            ui->commandButton->setDefaultAction(ui->actionSpotQSO);\n\n        commandsMenu->removeAction(ui->actionShowHFStats);\n        commandsMenu->removeAction(ui->actionShowVHFStats);\n        break;\n\n    case DXSPIDER:\n        commandsMenu->addAction(ui->actionShowHFStats);\n        commandsMenu->addAction(ui->actionShowVHFStats);\n        break;\n\n    default:\n        qCDebug(runtime) << \"no change\";\n    }\n}\n\nvoid DxWidget::processDxSpot(const QString &spotter,\n                             const QString &freq,\n                             const QString &call,\n                             const QString &comment,\n                             const QDateTime &dateTime)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << spotter << freq << call << comment << dateTime << dateTime.isNull();\n\n    DxSpot spot;\n\n    spot.dateTime = (!dateTime.isValid()) ? QDateTime::currentDateTime().toTimeZone(QTimeZone::utc())\n                                    : dateTime;\n    spot.callsign = call;\n    spot.freq = freq.toDouble() / 1000;\n    spot.band = BandPlan::freq2Band(spot.freq).name;\n    spot.spotter = spotter;\n    spot.comment = comment.trimmed();\n    spot.bandPlanMode = modeGroupFromComment(spot.comment);\n    if ( spot.bandPlanMode == BandPlan::BAND_MODE_UNKNOWN )\n    {\n        spot.bandPlanMode = BandPlan::freq2BandMode(spot.freq);\n    }\n    if ( spot.bandPlanMode == BandPlan::BAND_MODE_PHONE )\n    {\n        spot.bandPlanMode = (spot.freq < 10.0 ) ? BandPlan::BAND_MODE_LSB\n                                                : BandPlan::BAND_MODE_USB;\n    }\n    spot.modeGroupString = BandPlan::bandMode2BandModeGroupString(spot.bandPlanMode);\n    spot.dxcc = Data::instance()->lookupDxcc(call);\n    spot.dxcc_spotter = Data::instance()->lookupDxcc(spotter);\n    spot.status = Data::instance()->dxccStatus(spot.dxcc.dxcc, spot.band, spot.modeGroupString);\n    spot.callsign_member = MembershipQE::instance()->query(spot.callsign);\n    spot.dupeCount = Data::countDupe(spot.callsign, spot.band, spot.modeGroupString);\n    wwffRefFromComment(spot);\n    potaRefFromComment(spot);\n    sotaRefFromComment(spot);\n    iotaRefFromComment(spot);\n    splitFreqFromComment(spot);\n\n#if 0\n    if ( !spot.sotaRef.isEmpty() )\n        qInfo() << \"SOTA\" << spot.sotaRef << spot.comment;\n\n    if ( !spot.wwffRef.isEmpty() )\n        qInfo() << \"WWFF\" << spot.wwffRef << spot.comment;\n\n    if ( !spot.potaRef.isEmpty() )\n        qInfo() << \"POTA\" << spot.potaRef << spot.comment;\n\n    if ( !spot.iotaRef.isEmpty() )\n        qInfo() << \"IOTA\" << spot.iotaRef << spot.comment;\n#endif\n\n    emit newSpot(spot);\n\n    if ( spot.modeGroupString.contains(moderegexp)\n         && spot.dxcc.cont.contains(contregexp)\n         && spot.dxcc_spotter.cont.contains(spottercontregexp)\n         && spot.band.contains(bandregexp)\n         && ( spot.status & dxccStatusFilter)\n         && ( dxMemberFilter.size() == 0\n            || (dxMemberFilter.size() && spot.memberList2Set().intersects(dxMemberFilter)) )\n         && spot.dupeCount == 0\n        )\n    {\n        if ( dxTableModel->addEntry(spot, deduplicateSpots, deduplicatetime, deduplicatefreq) )\n            emit newFilteredSpot(spot);\n    }\n}\n\nQVector<int> DxWidget::dxcListHiddenCols() const\n{\n    QVector<int> ret;\n    ret.reserve(dxTableModel->columnCount());\n\n    for ( int i = 0; i < dxTableModel->columnCount(); ++i )\n    {\n        if (ui->dxTable->isColumnHidden(i))\n            ret.append(i);\n    }\n\n    return ret;\n}\n\nBandPlan::BandPlanMode DxWidget::modeGroupFromComment(const QString &comment) const\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << comment;\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n    const QStringList &tokenizedComment = comment.split(\" \", Qt::SkipEmptyParts);\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n    const QStringList &tokenizedComment = comment.split(\" \", QString::SkipEmptyParts);\n#endif\n\n    if ( tokenizedComment.contains(\"CW\", Qt::CaseInsensitive)\n         || tokenizedComment.contains(\"<CW>\", Qt::CaseInsensitive)\n        )\n        return BandPlan::BAND_MODE_CW;\n\n    if ( tokenizedComment.contains(\"FT8\", Qt::CaseInsensitive)\n         || tokenizedComment.contains(\"<FT8>\", Qt::CaseInsensitive)\n        )\n        return BandPlan::BAND_MODE_FT8;\n\n    if ( tokenizedComment.contains(\"FT4\", Qt::CaseInsensitive)\n         || tokenizedComment.contains(\"<FT4>\", Qt::CaseInsensitive)\n       )\n        return BandPlan::BAND_MODE_FT4;\n\n    if ( tokenizedComment.contains(\"FT2\", Qt::CaseInsensitive)\n        || tokenizedComment.contains(\"<FT2>\", Qt::CaseInsensitive )\n       )\n        return BandPlan::BAND_MODE_FT2;\n\n    if ( tokenizedComment.contains(\"MSK144\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_DIGITAL;\n\n    if ( tokenizedComment.contains(\"RTTY\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_DIGITAL;\n\n    if ( tokenizedComment.contains(\"SSTV\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_DIGITAL;\n\n    if ( tokenizedComment.contains(\"PACKET\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_DIGITAL;\n\n    if ( tokenizedComment.contains(\"SSB\", Qt::CaseInsensitive)\n         || tokenizedComment.contains(\"<SSB>\", Qt::CaseInsensitive)\n        )\n        return BandPlan::BAND_MODE_PHONE;\n\n    if ( tokenizedComment.contains(\"USB\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_USB;\n\n    if ( tokenizedComment.contains(\"LSB\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_LSB;\n\n    if ( tokenizedComment.contains(\"<FM>\", Qt::CaseInsensitive) )\n        return BandPlan::BAND_MODE_PHONE;\n\n    return BandPlan::BAND_MODE_UNKNOWN;\n}\n\nQString DxWidget::refFromComment(const QString &comment,\n                                 bool &flag,\n                                 const QRegularExpression &regEx,\n                                 const QString &refType,\n                                 int justified = 0) const\n{\n    FCT_IDENTIFICATION;\n\n    QRegularExpressionMatch stringMatch = regEx.match(comment);\n    QString ref;\n\n    if (stringMatch.hasMatch())\n    {\n        flag = true;\n        ref = stringMatch.captured(1).toUpper() + \"-\" + stringMatch.captured(2).rightJustified(justified, '0');\n        qCDebug(runtime) << refType << \":\" << ref << \"in comment:\" << comment;\n    }\n\n    return ref;\n}\n\nvoid DxWidget::wwffRefFromComment(DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression wwffRegEx(QStringLiteral(\"(?:^|\\\\s)([A-Za-z0-9]{1,3}[Ff]{2})[- ]?(\\\\d{1,4})(?:\\\\s|$)\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n\n    spot.containsWWFF = spot.comment.contains(\"WWFF\", Qt::CaseInsensitive);\n    spot.wwffRef = refFromComment(spot.comment, spot.containsWWFF,\n                                  wwffRegEx, QStringLiteral(\"WWFF\"), 4);\n}\n\nvoid DxWidget::potaRefFromComment(DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    spot.containsPOTA = spot.comment.contains(\"POTA\", Qt::CaseInsensitive);\n\n    if ( spot.dxcc.dxcc == 0 )\n        return;\n\n    QString flagA2Code = Data::instance()->dxccFlag(spot.dxcc.dxcc);\n\n    if ( flagA2Code == \"england\" || flagA2Code == \"scotland\"\n         || flagA2Code == \"wales\")\n        flagA2Code = \"GB\";\n\n    QRegularExpression potaCountryRE(QString(\"(?:^|\\\\s)(%0)-(\\\\d{1,5})(?:\\\\s|@|$)\").arg(flagA2Code),\n                                     QRegularExpression::CaseInsensitiveOption);\n\n    spot.potaRef = refFromComment(spot.comment, spot.containsPOTA,\n                                  potaCountryRE, QStringLiteral(\"POTA_alternative\"), 4);\n    if ( !spot.containsPOTA )\n    {\n        Callsign dxSpotCallsign(spot.callsign);\n        // If POTA Info is not present in the comment, try to find it using POTAQE\n        const QString &ref = PotaQE::instance()->findReferenceId(dxSpotCallsign, spot.freq).reference;\n        if ( !ref.isEmpty() )\n        {\n            spot.potaRef = ref;\n            spot.containsPOTA = true;\n            qCDebug(runtime) << \"Found POTA\" << spot.callsign << ref;\n            spot.comment.append(\" [+] POTA \" + ref);\n        }\n    }\n}\n\nvoid DxWidget::sotaRefFromComment(DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    static QRegularExpression sotaRefRegEx(QStringLiteral(\"(?:^|\\\\s)([A-Za-z0-9]{1,3}/[A-Za-z]{2})-?(\\\\d{1,3})(?:\\\\s|$)\"),\n                                           QRegularExpression::CaseInsensitiveOption);\n\n    spot.containsSOTA = spot.comment.contains(\"SOTA\", Qt::CaseInsensitive);\n\n    if ( spot.comment.contains(\"FT8\", Qt::CaseInsensitive)  // a false detection in case of TNX/FT8 comments\n        || spot.comment.contains(\"FT4\",Qt::CaseInsensitive) )\n        return;\n\n    spot.sotaRef = refFromComment(spot.comment, spot.containsSOTA,\n                                  sotaRefRegEx, QStringLiteral(\"SOTA\"), 3);\n}\n\nvoid DxWidget::iotaRefFromComment(DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    spot.containsIOTA = spot.comment.contains(\"IOTA\", Qt::CaseInsensitive);\n\n    if ( spot.dxcc.cont.isEmpty() )\n        return;\n\n    QRegularExpression iotaRegEx(QString(\"(?:^|\\\\s)(%0)[- ]?(\\\\d{1,3})(?:\\\\s|$)\").arg(spot.dxcc.cont),\n                                 QRegularExpression::CaseInsensitiveOption);\n    spot.iotaRef = refFromComment(spot.comment, spot.containsIOTA,\n                                  iotaRegEx, QStringLiteral(\"IOTA\"), 3);\n}\n\nvoid DxWidget::splitFreqFromComment(DxSpot &spot) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( spot.comment.isEmpty() || spot.freq <= 0.0 )\n        return;\n\n    // Absolute TX frequency: \"QSX 14250\", \"QSX 14.250\", \"LISTENING 28510\", \"LSN 28.510\"\n    static QRegularExpression absFreqRx(QStringLiteral(\"\\\\b(?:QSX|LISTENING|LSN)\\\\s+(\\\\d+\\\\.?\\\\d*)\\\\b\"),\n                                        QRegularExpression::CaseInsensitiveOption);\n    QRegularExpressionMatch match = absFreqRx.match(spot.comment);\n    if ( match.hasMatch() )\n    {\n        double freq = match.captured(1).toDouble();\n        if ( freq > 1000.0 )\n            freq = freq / 1000.0; // kHz → MHz\n        if ( freq > 0.0 )\n        {\n            spot.freqTX = freq;\n            qCDebug(runtime) << \"Split absolute TX:\" << spot.freqTX << \"from:\" << spot.comment;\n            return;\n        }\n    }\n\n    // Relative offset UP: \"UP 5\", \"UP 5-10\", \"UP5\" (kHz above spot freq)\n    static QRegularExpression upNRx(QStringLiteral(\"\\\\bUP\\\\s*(\\\\d+(?:\\\\.\\\\d+)?)(?:\\\\s*[-/]\\\\s*\\\\d+(?:\\\\.\\\\d+)?)?\\\\b\"),\n                                    QRegularExpression::CaseInsensitiveOption);\n    match = upNRx.match(spot.comment);\n    if ( match.hasMatch() )\n    {\n        double offsetKHz = match.captured(1).toDouble();\n        if ( offsetKHz > 0.0 )\n        {\n            spot.freqTX = spot.freq + offsetKHz / 1000.0;\n            qCDebug(runtime) << \"Split UP\" << offsetKHz << \"kHz, TX:\" << spot.freqTX;\n            return;\n        }\n    }\n\n    // Relative offset UP reversed: \"1 UP\", \"5 UP\", \"5UP\"\n    static QRegularExpression nUpRx(QStringLiteral(\"\\\\b(\\\\d+(?:\\\\.\\\\d+)?)\\\\s*UP\\\\b\"),\n                                    QRegularExpression::CaseInsensitiveOption);\n    match = nUpRx.match(spot.comment);\n    if ( match.hasMatch() )\n    {\n        double offsetKHz = match.captured(1).toDouble();\n        if ( offsetKHz > 0.0 )\n        {\n            spot.freqTX = spot.freq + offsetKHz / 1000.0;\n            qCDebug(runtime) << \"Split\" << offsetKHz << \"UP kHz, TX:\" << spot.freqTX;\n            return;\n        }\n    }\n\n    // Relative offset DOWN: \"DN 5\", \"DOWN 5\", \"DWN 5\"\n    static QRegularExpression dnNRx(QStringLiteral(\"\\\\b(?:DN|DOWN|DWN)\\\\s*(\\\\d+(?:\\\\.\\\\d+)?)\\\\b\"),\n                                    QRegularExpression::CaseInsensitiveOption);\n    match = dnNRx.match(spot.comment);\n    if ( match.hasMatch() )\n    {\n        double offsetKHz = match.captured(1).toDouble();\n        if ( offsetKHz > 0.0 )\n        {\n            spot.freqTX = spot.freq - offsetKHz / 1000.0;\n            qCDebug(runtime) << \"Split DOWN\" << offsetKHz << \"kHz, TX:\" << spot.freqTX;\n            return;\n        }\n    }\n\n    // Relative offset DOWN reversed: \"5 DN\", \"5 DOWN\"\n    static QRegularExpression nDnRx(QStringLiteral(\"\\\\b(\\\\d+(?:\\\\.\\\\d+)?)\\\\s*(?:DN|DOWN|DWN)\\\\b\"),\n                                    QRegularExpression::CaseInsensitiveOption);\n    match = nDnRx.match(spot.comment);\n    if ( match.hasMatch() )\n    {\n        double offsetKHz = match.captured(1).toDouble();\n        if ( offsetKHz > 0.0 )\n        {\n            spot.freqTX = spot.freq - offsetKHz / 1000.0;\n            qCDebug(runtime) << \"Split\" << offsetKHz << \"DOWN kHz, TX:\" << spot.freqTX;\n            return;\n        }\n    }\n\n    // Bare \"UP\" without number → 1 kHz default offset\n    static QRegularExpression bareUpRx(QStringLiteral(\"\\\\bUP\\\\b\"),\n                                       QRegularExpression::CaseInsensitiveOption);\n    if ( bareUpRx.match(spot.comment).hasMatch() )\n    {\n        spot.freqTX = spot.freq + 1.0 / 1000.0;\n        qCDebug(runtime) << \"Split bare UP, TX:\" << spot.freqTX;\n    }\n}\n\nDxWidget::~DxWidget()\n{\n    FCT_IDENTIFICATION;\n\n    disconnectCluster(false);\n    delete ui;\n}\n\nvoid DxWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    saveWidgetSetting();\n}\n"
  },
  {
    "path": "ui/DxWidget.h",
    "content": "#ifndef QLOG_UI_DXWIDGET_H\n#define QLOG_UI_DXWIDGET_H\n\n#include <QWidget>\n#include <QtNetwork>\n#include <QSortFilterProxyModel>\n#include <QRegularExpression>\n#include <QSqlRecord>\n#include <QLabel>\n\n#include \"data/DxSpot.h\"\n#include \"data/WCYSpot.h\"\n#include \"data/WWVSpot.h\"\n#include \"data/ToAllSpot.h\"\n#include \"core/LogLocale.h\"\n#include \"data/DxServerString.h\"\n#include \"models/SearchFilterProxyModel.h\"\n#include \"component/ShutdownAwareWidget.h\"\n#include \"NewContactWidget.h\"\n\n// in sec\n#define DEDUPLICATION_TIME 3\n\n// in kHz\n#define DEDUPLICATION_FREQ_TOLERANCE 5\n\nnamespace Ui {\nclass DxWidget;\n}\n\nclass DxTableModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    DxTableModel(QObject* parent = 0) : QAbstractTableModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    bool addEntry(const DxSpot &entry,\n                  bool deduplicate = false,\n                  qint16 dedup_interval = DEDUPLICATION_TIME,\n                  double dedup_freq_tolerance = DEDUPLICATION_FREQ_TOLERANCE);\n    const DxSpot getSpot(const QModelIndex& index) const {return dxData.at(index.row());};\n    void clear();\n\nprivate:\n    QList<DxSpot> dxData;\n    LogLocale locale;\n};\n\nclass WCYTableModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    WCYTableModel(QObject* parent = 0) : QAbstractTableModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    void addEntry(const WCYSpot &entry);\n    void clear();\n\nprivate:\n    QList<WCYSpot> wcyData;\n    LogLocale locale;\n};\n\nclass WWVTableModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    WWVTableModel(QObject* parent = 0) : QAbstractTableModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    void addEntry(const WWVSpot &entry);\n    void clear();\n\nprivate:\n    QList<WWVSpot> wwvData;\n    LogLocale locale;\n};\n\nclass ToAllTableModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    ToAllTableModel(QObject* parent = 0) : QAbstractTableModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;\n    void addEntry(const ToAllSpot &entry);\n    void clear();\n\nprivate:\n    QList<ToAllSpot> toAllData;\n    LogLocale locale;\n};\n\nclass DeleteHighlightedDXServerWhenDelPressedEventFilter : public QObject\n{\n     Q_OBJECT\nsignals:\n    void deleteServerItem();\n\npublic:\n    DeleteHighlightedDXServerWhenDelPressedEventFilter(QObject *parent) :\n        QObject(parent) {};\n\nprotected:\n    bool eventFilter(QObject *obj, QEvent *event);\n};\n\nclass DxWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit DxWidget(QWidget *parent = 0);\n    ~DxWidget();\n    virtual void finalizeBeforeAppExit() override;\n    void registerContactWidget(const NewContactWidget * contactWidget);\n\npublic slots:\n    void toggleConnect();\n    void receive();\n    void send();\n    void connected();\n    void socketError(QAbstractSocket::SocketError);\n    void viewModeChanged(int);\n    void entryDoubleClicked(QModelIndex);\n    void actionFilter();\n    void adjusteServerSelectSize(QString);\n    void serverSelectChanged(int);\n    void setLastQSO(QSqlRecord);\n    void reloadSetting();\n    void prepareQSOSpot(QSqlRecord);\n    void setSearch(const QString &);\n    void setSearchStatus(bool);\n    void setSearchVisible();\n    void setSearchClosed();\n    void setDxTrend(QHash<QString, QHash<QString, QHash<QString, int>>>);\n    void recalculateTrend();\n    void setTunedFrequency(VFOID vfoid, double vfoFreq, double ritFreq, double xitFreq);\n\nprivate slots:\n    void actionCommandSpotQSO();\n    void actionCommandShowHFStats();\n    void actionCommandShowVHFStats();\n    void actionCommandShowWCY();\n    void actionCommandShowWWV();\n    void actionConnectOnStartup();\n    void actionDeleteServer();\n    void actionForgetPassword();\n    void actionKeepSpots();\n    void actionClear();\n\n    void displayedColumns();\n    void trendDoubleClicked(int row, int column);\n\nsignals:\n    void tuneDx(DxSpot);\n    void tuneBand(QString);\n    void newSpot(DxSpot);\n    void newWCYSpot(WCYSpot);\n    void newWWVSpot(WWVSpot);\n    void newToAllSpot(ToAllSpot);\n    void newFilteredSpot(DxSpot);\n\nprivate:\n    enum DXCConnectionState\n    {\n        DISCONNECTED = 0,\n        CONNECTING = 1,\n        CONNECTED = 2,\n        LOGIN_SENT = 3,\n        PASSWORD_SENT = 4,\n        OPERATION = 5\n    };\n\n    enum DXCType\n    {\n        UNKNOWN = 0,\n        DXSPIDER = 1,\n        CCCluster = 2\n    };\n\n    DxTableModel* dxTableModel;\n    WCYTableModel* wcyTableModel;\n    WWVTableModel* wwvTableModel;\n    ToAllTableModel* toAllTableModel;\n    SearchFilterProxyModel* dxTableProxyModel;\n    QTcpSocket* socket;\n    Ui::DxWidget *ui;\n    QRegularExpression moderegexp;\n    QRegularExpression contregexp;\n    QRegularExpression spottercontregexp;\n    QRegularExpression bandregexp;\n    uint dxccStatusFilter;\n    bool deduplicateSpots;\n    int deduplicatetime;\n    int deduplicatefreq;\n    DXCType dxcType = UNKNOWN;\n    QMenu *commandsMenu;\n    QSet<QString> dxMemberFilter;\n    QSqlRecord lastQSO;\n    quint8 reconnectAttempts;\n    QTimer reconnectTimer;\n    DXCConnectionState connectionState;\n    DxServerString *connectedServerString;\n    QHash<QString, QHash<QString, QHash<QString, int>>> receivedTrendData;\n    QHash<QString, QHash<QString, int>> prevTrendDataForMyCont;\n    QHash<QString, QHash<QString, int>> trendDataForMyCont;\n    QStringList trendBandList;\n    QLabel *trendTableCornerLabel;\n    const NewContactWidget *newContactWidget;\n\n    void connectCluster();\n    void disconnectCluster(bool tryReconnect = false);\n    void saveDXCServers();\n    QString modeFilterRegExp();\n    QString contFilterRegExp();\n    QString spotterContFilterRegExp();\n    QString bandFilterRegExp();\n    uint dxccStatusFilterValue();\n    bool spotDedupValue();\n    int getDedupTimeValue();\n    int getDedupFreqValue();\n    QStringList dxMemberList();\n    bool getAutoconnectServer();\n    void saveAutoconnectServer(bool);\n    bool getKeepQSOs();\n    void saveKeepQSOs(bool);\n    void sendCommand(const QString&,\n                     bool switchToConsole = false);\n    void saveWidgetSetting();\n    void restoreWidgetSetting();\n\n    QStringList getDXCServerList(void);\n    void serverComboSetup();\n    void clearAllPasswordIcons();\n    void activateCurrPasswordIcon();\n    void updateCommandsMenu();\n\n    void processDxSpot(const QString &spotter,\n                       const QString &freq,\n                       const QString &call,\n                       const QString &comment,\n                       const QDateTime &dateTime = QDateTime());\n\n    QVector<int> dxcListHiddenCols() const;\n    BandPlan::BandPlanMode modeGroupFromComment(const QString &comment) const;\n    QString refFromComment(const QString &comment, bool &flag,\n                           const QRegularExpression &regEx,\n                           const QString &refType, int justified) const;\n    void wwffRefFromComment(DxSpot &spot) const;\n    void potaRefFromComment(DxSpot &spot) const;\n    void sotaRefFromComment(DxSpot &spot) const;\n    void iotaRefFromComment(DxSpot &spot) const;\n    void splitFreqFromComment(DxSpot &spot) const;\n\n    QColor getHeatmapColor(int value, int maxValue);\n\n    bool isFilterEnabled() const;\n};\n\n#endif // QLOG_UI_DXWIDGET_H\n"
  },
  {
    "path": "ui/DxWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>DxWidget</class>\n <widget class=\"QWidget\" name=\"DxWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>427</width>\n    <height>511</height>\n   </rect>\n  </property>\n  <property name=\"focusPolicy\">\n   <enum>Qt::NoFocus</enum>\n  </property>\n  <property name=\"windowTitle\">\n   <string notr=\"true\">Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QPushButton\" name=\"menuButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n         <property name=\"styleSheet\">\n          <string notr=\"true\">::menu-indicator{ image: none; }</string>\n         </property>\n         <property name=\"text\">\n          <string/>\n         </property>\n         <property name=\"icon\">\n          <iconset resource=\"../res/icons/icons.qrc\">\n           <normaloff>:/icons/menu.svg</normaloff>:/icons/menu.svg</iconset>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QComboBox\" name=\"serverSelect\">\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::DefaultContextMenu</enum>\n         </property>\n         <property name=\"toolTip\">\n          <string>Insert a &lt;b&gt;hostname:port&lt;/b&gt; of DXC Server.</string>\n         </property>\n         <property name=\"inputMethodHints\">\n          <set>Qt::ImhNone</set>\n         </property>\n         <property name=\"editable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"currentText\">\n          <string notr=\"true\"/>\n         </property>\n         <property name=\"insertPolicy\">\n          <enum>QComboBox::InsertAtTop</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QComboBox::AdjustToContents</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"connectButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>Connect</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"filteredLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"styleSheet\">\n        <string notr=\"true\">color:red</string>\n       </property>\n       <property name=\"text\">\n        <string>Filtered</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"viewModeCombo\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <item>\n        <property name=\"text\">\n         <string>Spots</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>WCY</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>WWV</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>To All</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>Console</string>\n        </property>\n       </item>\n       <item>\n        <property name=\"text\">\n         <string>15-min Trend</string>\n        </property>\n       </item>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QStackedWidget\" name=\"stack\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"spotPage\">\n      <layout class=\"QGridLayout\" name=\"gridLayout\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTableView\" name=\"dxTable\">\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::AnyKeyPressed|QAbstractItemView::DoubleClicked</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>false</bool>\n         </property>\n         <property name=\"showDropIndicator\" stdset=\"0\">\n          <bool>false</bool>\n         </property>\n         <property name=\"dragDropOverwriteMode\">\n          <bool>false</bool>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::SingleSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectRows</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>24</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>80</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderHighlightSections\">\n          <bool>false</bool>\n         </attribute>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderVisible\">\n          <bool>false</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>20</number>\n         </attribute>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <layout class=\"QHBoxLayout\" name=\"searchLayout\">\n         <property name=\"topMargin\">\n          <number>0</number>\n         </property>\n         <item>\n          <widget class=\"QLineEdit\" name=\"searchEdit\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"toolTip\">\n            <string>Full-text search</string>\n           </property>\n           <property name=\"placeholderText\">\n            <string>Search</string>\n           </property>\n           <property name=\"clearButtonEnabled\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"searchCloseButton\">\n           <property name=\"toolTip\">\n            <string>Close Search</string>\n           </property>\n           <property name=\"text\">\n            <string/>\n           </property>\n           <property name=\"icon\">\n            <iconset resource=\"../res/icons/icons.qrc\">\n             <normaloff>:/icons/cancel-24px.svg</normaloff>:/icons/cancel-24px.svg</iconset>\n           </property>\n           <property name=\"flat\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"wcyPage\">\n      <layout class=\"QGridLayout\" name=\"gridLayout_3\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTableView\" name=\"wcyTable\">\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>false</bool>\n         </property>\n         <property name=\"showDropIndicator\" stdset=\"0\">\n          <bool>false</bool>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::SingleSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectRows</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerItem</enum>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>40</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>70</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderHighlightSections\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderVisible\">\n          <bool>false</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>20</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"wwvPage\">\n      <layout class=\"QGridLayout\" name=\"gridLayout_4\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTableView\" name=\"wwvTable\">\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>false</bool>\n         </property>\n         <property name=\"showDropIndicator\" stdset=\"0\">\n          <bool>false</bool>\n         </property>\n         <property name=\"dragDropOverwriteMode\">\n          <bool>false</bool>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::SingleSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectRows</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>70</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderVisible\">\n          <bool>false</bool>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"toAllPage\">\n      <layout class=\"QGridLayout\" name=\"gridLayout_5\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTableView\" name=\"toAllTable\">\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::ActionsContextMenu</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>false</bool>\n         </property>\n         <property name=\"showDropIndicator\" stdset=\"0\">\n          <bool>false</bool>\n         </property>\n         <property name=\"dragDropOverwriteMode\">\n          <bool>false</bool>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::SingleSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectRows</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>70</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderVisible\">\n          <bool>false</bool>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"consolePage\">\n      <property name=\"contextMenuPolicy\">\n       <enum>Qt::ActionsContextMenu</enum>\n      </property>\n      <layout class=\"QGridLayout\" name=\"gridLayout_2\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QPlainTextEdit\" name=\"log\">\n         <property name=\"font\">\n          <font>\n           <pointsize>12</pointsize>\n           <kerning>true</kerning>\n          </font>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"readOnly\">\n          <bool>true</bool>\n         </property>\n         <property name=\"plainText\">\n          <string notr=\"true\"/>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"trendPage\">\n      <layout class=\"QGridLayout\" name=\"gridLayout_6\">\n       <property name=\"leftMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTableWidget\" name=\"trendTable\">\n         <property name=\"focusPolicy\">\n          <enum>Qt::NoFocus</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>false</bool>\n         </property>\n         <property name=\"showDropIndicator\" stdset=\"0\">\n          <bool>false</bool>\n         </property>\n         <property name=\"dragDropOverwriteMode\">\n          <bool>false</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::NoSelection</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLineEdit\" name=\"commandEdit\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Send DX Cluster Command</string>\n       </property>\n       <property name=\"clearButtonEnabled\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QToolButton\" name=\"commandButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::NoFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"popupMode\">\n        <enum>QToolButton::MenuButtonPopup</enum>\n       </property>\n       <property name=\"toolButtonStyle\">\n        <enum>Qt::ToolButtonTextOnly</enum>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionFilter\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/filter_list-24px.svg</normaloff>:/icons/filter_list-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Filter...</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Filter DXC</string>\n   </property>\n  </action>\n  <action name=\"actionSpotQSO\">\n   <property name=\"text\">\n    <string>Spot Last QSO</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Send last QSO spot</string>\n   </property>\n  </action>\n  <action name=\"actionShowHFStats\">\n   <property name=\"text\">\n    <string>Show HF Stats</string>\n   </property>\n  </action>\n  <action name=\"actionShowVHFStats\">\n   <property name=\"text\">\n    <string>Show VHF Stats</string>\n   </property>\n  </action>\n  <action name=\"actionShowWCY\">\n   <property name=\"text\">\n    <string>Show WCY</string>\n   </property>\n  </action>\n  <action name=\"actionShowWWV\">\n   <property name=\"text\">\n    <string>Show WWV</string>\n   </property>\n  </action>\n  <action name=\"actionDisplayedColumns\">\n   <property name=\"text\">\n    <string>Column Visibility...</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Which columns should be displayed</string>\n   </property>\n  </action>\n  <action name=\"actionConnectOnStartup\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Connect on startup</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Automatic connection after start</string>\n   </property>\n  </action>\n  <action name=\"actionDeleteServer\">\n   <property name=\"text\">\n    <string>Delete Server</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>DXC - Delete Server</string>\n   </property>\n  </action>\n  <action name=\"actionForgetPassword\">\n   <property name=\"text\">\n    <string>Clear Password</string>\n   </property>\n  </action>\n  <action name=\"actionKeepSpots\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Keep Spots</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Spots are not cleared when connecting to a new DX Cluster.</string>\n   </property>\n  </action>\n  <action name=\"actionClear\">\n   <property name=\"text\">\n    <string>Clear</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Clear all data</string>\n   </property>\n  </action>\n  <action name=\"actionSearch\">\n   <property name=\"text\">\n    <string>Search...</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>DXC - Search</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+D</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n </widget>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>connectButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>toggleConnect()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>172</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>367</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>commandEdit</sender>\n   <signal>returnPressed()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>send()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>249</x>\n     <y>509</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>367</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dxTable</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>entryDoubleClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>340</x>\n     <y>272</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionFilter</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>serverSelect</sender>\n   <signal>editTextChanged(QString)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>adjusteServerSelectSize(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>44</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>serverSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>serverSelectChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>44</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSpotQSO</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionCommandSpotQSO()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionShowHFStats</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionCommandShowHFStats()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionShowVHFStats</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionCommandShowVHFStats()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionShowWCY</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionCommandShowWCY()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionShowWWV</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionCommandShowWWV()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>viewModeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>viewModeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>339</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDisplayedColumns</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>displayedColumns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionConnectOnStartup</sender>\n   <signal>changed()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionConnectOnStartup()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDeleteServer</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionDeleteServer()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionForgetPassword</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionForgetPassword()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionKeepSpots</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionKeepSpots()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionClear</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>actionClear()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearch</sender>\n   <signal>triggered()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>setSearchVisible()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>searchCloseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>DxWidget</receiver>\n   <slot>setSearchClosed()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>325</x>\n     <y>462</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>searchEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>setSearch(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>170</x>\n     <y>463</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>trendTable</sender>\n   <signal>cellDoubleClicked(int,int)</signal>\n   <receiver>DxWidget</receiver>\n   <slot>trendDoubleClicked(int,int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>170</x>\n     <y>255</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>send()</slot>\n  <slot>toggleConnect()</slot>\n  <slot>viewModeChanged(int)</slot>\n  <slot>entryDoubleClicked(QModelIndex)</slot>\n  <slot>actionFilter()</slot>\n  <slot>actionPhoneFilter()</slot>\n  <slot>actionFT8Filter()</slot>\n  <slot>actionPhoneFilter(bool)</slot>\n  <slot>adjusteServerSelectSize(QString)</slot>\n  <slot>serverSelectChanged(int)</slot>\n  <slot>actionCommandSpotQSO()</slot>\n  <slot>actionCommandShowHFStats()</slot>\n  <slot>actionCommandShowVHFStats()</slot>\n  <slot>actionCommandShowWCY()</slot>\n  <slot>actionCommandShowWWV()</slot>\n  <slot>displayedColumns()</slot>\n  <slot>actionConnectOnStartup()</slot>\n  <slot>actionDeleteServer()</slot>\n  <slot>actionForgetPassword()</slot>\n  <slot>actionKeepSpots()</slot>\n  <slot>actionClear()</slot>\n  <slot>setSearch(QString)</slot>\n  <slot>setSearchVisible()</slot>\n  <slot>setSearchClosed()</slot>\n  <slot>trendDoubleClicked(int,int)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/DxccTableWidget.cpp",
    "content": "#include <QHeaderView>\n#include <QTableView>\n#include <QVBoxLayout>\n#include <QDate>\n#include <QSqlError>\n#include <QSqlQuery>\n#include \"models/DxccTableModel.h\"\n#include \"DxccTableWidget.h\"\n#include \"core/debug.h\"\n#include \"data/StationProfile.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.dxcctablewidget\");\n\nDxccTableWidget::DxccTableWidget(QWidget *parent) : QTableView(parent)\n{\n    FCT_IDENTIFICATION;\n\n    dxccTableModel = new DxccTableModel(parent);\n\n    this->setObjectName(\"dxccTableView\");\n    this->setModel(dxccTableModel);\n    this->verticalHeader()->setVisible(false);\n}\n\nvoid DxccTableWidget::clear()\n{\n    FCT_IDENTIFICATION;\n\n    dxccTableModel->clear();\n    dxccTableModel->setQuery(QString());\n    setHidden(true);\n}\n\nvoid DxccTableWidget::updateDxTable(const QString &condition,\n                                    const QVariant &conditionValue,\n                                    const Band &highlightedBand)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << condition << conditionValue;\n\n    const QList<Band>& dxccBands = BandPlan::bandsList(false, true);\n\n    if ( dxccBands.isEmpty() )\n        return;\n\n    QString filter(QLatin1String(\"1 = 1\"));\n    StationProfile profile = StationProfilesManager::instance()->getCurProfile1();\n    QStringList stmt_band_part1;\n    QStringList stmt_band_part2;\n\n    if ( profile != StationProfile() )\n        filter.append(QString(\" AND c.my_dxcc = %1\").arg(profile.dxcc));\n\n    for ( const Band &band : dxccBands )\n    {\n        stmt_band_part1 << QString(\" MAX(CASE WHEN band = '%0' THEN  CASE WHEN (eqsl_qsl_rcvd = 'Y') THEN 2 ELSE 1 END  ELSE 0 END) as '%0_eqsl',\"\n                                   \" MAX(CASE WHEN band = '%0' THEN  CASE WHEN (lotw_qsl_rcvd = 'Y') THEN 2 ELSE 1 END  ELSE 0 END) as '%0_lotw',\"\n                                   \" MAX(CASE WHEN band = '%0' THEN  CASE WHEN (qsl_rcvd = 'Y')      THEN 2 ELSE 1 END  ELSE 0 END) as '%0_paper' \")\n                                  .arg(band.name);\n        stmt_band_part2 << QString(\" c.'%0_eqsl' || c.'%0_lotw'|| c.'%0_paper' as '%0'\").arg(band.name);\n    }\n\n    QString stmt = QString(\"WITH dxcc_summary AS \"\n                           \"             (\"\n                           \"\t\t\t  SELECT  \"\n                           \"\t\t\t  m.dxcc , \"\n                           \"\t\t      %1 \"\n                           \"\t\t      FROM contacts c\"\n                           \"\t\t           LEFT OUTER JOIN modes m on c.mode = m.name\"\n                           \"\t\t      WHERE %2 AND %3 GROUP BY m.dxcc ) \"\n                           \" SELECT translate_to_locale(m.dxcc),\"\n                           \"\t   %4 \"\n                           \" FROM (SELECT DISTINCT dxcc\"\n                           \"\t   FROM modes) m\"\n                           \"        LEFT OUTER JOIN dxcc_summary c ON c.dxcc = m.dxcc \"\n                           \" ORDER BY m.dxcc\").arg(stmt_band_part1.join(\",\"),\n                                                   filter,\n                                                   condition.arg(conditionValue.toString()),\n                                                   stmt_band_part2.join(\",\"));\n\n    qCDebug(runtime) << stmt;\n\n    dxccTableModel->setQuery(stmt);\n\n    // get default Brush from Mode column - Mode Column has always the default color\n    const QVariant &defaultBrush = dxccTableModel->headerData(0, Qt::Horizontal, Qt::BackgroundRole);\n\n    dxccTableModel->setHeaderData(0, Qt::Horizontal, tr(\"Mode\"));\n\n    for ( int i = 0; i < dxccBands.size(); i++ )\n    {\n        dxccTableModel->setHeaderData(i+1, Qt::Horizontal, ( highlightedBand == dxccBands.at(i) ) ? QBrush(Qt::darkGray)\n                                                                                               : defaultBrush, Qt::BackgroundRole);\n        dxccTableModel->setHeaderData(i+1, Qt::Horizontal, dxccBands.at(i).name);\n    }\n\n    horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);\n    show();\n}\n\nvoid DxccTableWidget::setDxCallsign(const QString &dxCallsign, const Band &band)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxCallsign;\n\n    if (!dxCallsign.isEmpty())\n        updateDxTable(\"c.callsign = '%1'\", dxCallsign.toUpper(), band);\n    else\n        clear();\n\n}\n\nvoid DxccTableWidget::setDxcc(int dxcc, const Band &highlightedBand)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dxcc;\n\n    if ( dxcc )\n        updateDxTable(\"c.dxcc = %1\", dxcc, highlightedBand);\n    else\n        clear();\n}\n"
  },
  {
    "path": "ui/DxccTableWidget.h",
    "content": "#ifndef QLOG_UI_DXCCTABLEWIDGET_H\n#define QLOG_UI_DXCCTABLEWIDGET_H\n\n#include <QWidget>\n#include <QTableView>\n#include \"data/Band.h\"\n\nclass DxccTableModel;\n\nclass DxccTableWidget : public QTableView\n{\n    Q_OBJECT\npublic:\n    explicit DxccTableWidget(QWidget *parent = nullptr);\n\npublic slots:\n    void clear();\n    void setDxcc(int dxcc, const Band &highlightedBand);\n    void setDxCallsign(const QString &dxCallsign, const Band &band);\n\nprivate:\n    void updateDxTable(const QString &condition,\n                       const QVariant &conditionValue,\n                       const Band &highlightedBand);\n\n    DxccTableModel* dxccTableModel;\n};\n\n#endif // QLOG_UI_DXCCTABLEWIDGET_H\n"
  },
  {
    "path": "ui/EditActivitiesDialog.cpp",
    "content": "#include \"EditActivitiesDialog.h\"\n#include \"ui_EditActivitiesDialog.h\"\n#include \"core/debug.h\"\n#include \"ui/EditActivitiesDialog.h\"\n#include \"ui/ActivityEditor.h\"\n#include \"data/ActivityProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.EditLayoutDialog\");\n\nEditActivitiesDialog::EditActivitiesDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::EditActivitiesDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n    loadProfiles();\n}\n\nEditActivitiesDialog::~EditActivitiesDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid EditActivitiesDialog::loadProfiles()\n{\n    FCT_IDENTIFICATION;\n\n    ui->listView->setModel(new QStringListModel(ActivityProfilesManager::instance()->profileNameList(), this));\n}\n\nvoid EditActivitiesDialog::addButton()\n{\n    FCT_IDENTIFICATION;\n\n    ActivityEditor dialog(QString(), this);\n    dialog.exec();\n    loadProfiles();\n}\n\nvoid EditActivitiesDialog::removeButton()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &removeProfileName = ui->listView->currentIndex().data().toString();\n    ActivityProfilesManager::instance()->removeProfile(removeProfileName);\n    ActivityProfilesManager::instance()->save();\n    MainLayoutProfilesManager::instance()->removeProfile(removeProfileName);\n    MainLayoutProfilesManager::instance()->save();\n    loadProfiles();\n}\n\nvoid EditActivitiesDialog::editEvent(const QModelIndex &idx)\n{\n    FCT_IDENTIFICATION;\n\n    ActivityEditor dialog(ui->listView->model()->data(idx).toString(), this);\n    dialog.exec();\n}\n\nvoid EditActivitiesDialog::editButton()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList &selected = ui->listView->selectionModel()->selectedIndexes();\n    if (!selected.isEmpty())\n        editEvent(selected.first());\n}\n"
  },
  {
    "path": "ui/EditActivitiesDialog.h",
    "content": "#ifndef QLOG_UI_EDITACTIVITIESDIALOG_H\n#define QLOG_UI_EDITACTIVITIESDIALOG_H\n\n#include <QDialog>\n#include <QStringListModel>\n\nnamespace Ui {\nclass EditActivitiesDialog;\n}\n\nclass EditActivitiesDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit EditActivitiesDialog(QWidget *parent = nullptr);\n    ~EditActivitiesDialog();\n\nprivate:\n    Ui::EditActivitiesDialog *ui;\n\n    void loadProfiles();\n\npublic slots:\n    void addButton();\n    void removeButton();\n    void editEvent(const QModelIndex &);\n    void editButton();\n};\n\n#endif // QLOG_UI_EDITACTIVITIESDIALOG_H\n"
  },
  {
    "path": "ui/EditActivitiesDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>EditActivitiesDialog</class>\n <widget class=\"QDialog\" name=\"EditActivitiesDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>357</width>\n    <height>258</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Edit Activities</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox\">\n       <property name=\"title\">\n        <string>Activities</string>\n       </property>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n        <item>\n         <widget class=\"QListView\" name=\"listView\">\n          <property name=\"editTriggers\">\n           <set>QAbstractItemView::NoEditTriggers</set>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"addButton\">\n         <property name=\"text\">\n          <string>Add</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"editButton\">\n         <property name=\"text\">\n          <string>Edit</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"removeButton\">\n         <property name=\"text\">\n          <string>Remove</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addButton</sender>\n   <signal>clicked()</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>addButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>29</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>removeButton</sender>\n   <signal>clicked()</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>removeButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>70</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>listView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>editEvent(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>224</x>\n     <y>202</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>editButton</sender>\n   <signal>clicked()</signal>\n   <receiver>EditActivitiesDialog</receiver>\n   <slot>editButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>188</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>addButton()</slot>\n  <slot>removeButton()</slot>\n  <slot>editEvent(QModelIndex)</slot>\n  <slot>editButton()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/ExportDialog.cpp",
    "content": "#include \"ui/ExportDialog.h\"\n#include <QDebug>\n#include <QFileDialog>\n#include <QMessageBox>\n#include <QProgressDialog>\n#include <QSqlError>\n#include \"ui_ExportDialog.h\"\n#include <logformat/PotaAdiFormat.h>\n\n#include \"core/debug.h\"\n#include \"models/SqlListModel.h\"\n#include \"data/StationProfile.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"data/Data.h\"\n#include \"core/LogParam.h\"\n#include \"core/QSOFilterManager.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.exportdialog\");\n\nExportDialog::ExportDialog(QWidget *parent) :\n   ExportDialog(QList<QSqlRecord>(), parent)\n{\n    FCT_IDENTIFICATION;\n\n    this->setWindowTitle(tr(\"Export QSOs\"));\n\n    ui->myCallsignComboBox->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(station_callsign) FROM contacts ORDER BY station_callsign\", \"\", ui->myCallsignComboBox));\n    ui->myCallsignComboBox->setCurrentText(StationProfilesManager::instance()->getCurProfile1().callsign.toUpper());\n    ui->myGridComboBox->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(my_gridsquare) FROM contacts WHERE station_callsign ='\"\n                                                + QString(ui->myCallsignComboBox->currentText()).replace(\"'\", \"''\")\n                                                + \"' ORDER BY my_gridsquare\", \"\", ui->myGridComboBox));\n    ui->startDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->startDateEdit->setDate(QDate::currentDate());\n    ui->endDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->endDateEdit->setDate(QDate::currentDate().addDays(1));\n\n    ui->userFilterComboBox->setModel(QSOFilterManager::QSOFilterModel(\"\", ui->userFilterComboBox));\n    ui->userFilterCheckBox->setEnabled(ui->userFilterComboBox->count() > 0);\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    ui->myStationProfileComboBox->setModel(new SqlListModel(\"SELECT DISTINCT profile_name FROM station_profiles ORDER BY profile_name\", \"\", ui->myStationProfileComboBox));\n    int index = ui->myStationProfileComboBox->findText(profile.profileName);\n    ui->myStationProfileComboBox->setCurrentIndex( ( index >= 0 ) ? index : -1);\n}\n\nExportDialog::ExportDialog(const QList<QSqlRecord>& qsos, QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::ExportDialog),\n    qsos4export(qsos)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"&Export\"));\n\n    if ( qsos4export.size() > 0 )\n    {\n        ui->filterGroup->setVisible(false);\n        ui->addlSentStatusCheckbox->setVisible(false);\n        ui->addlSentStatusICheckBox->setVisible(false);\n        ui->addlSentStatusNCheckBox->setVisible(false);\n        ui->addlSentStatusAlreadySentCheckBox->setVisible(false);\n        adjustSize();\n    }\n\n    fillQSLSendViaCombo();\n    fillExportTypeCombo();\n    fillExportedColumnsCombo();\n    // not posibility to define Exported Columns here\n}\n\nvoid ExportDialog::browse()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n    const QString &lastPath = ( ui->fileEdit->text().isEmpty() ) ? settings.value(\"export/last_path\", QDir::homePath()).toString()\n                                                                 : ui->fileEdit->text();\n\n    QString filename = QFileDialog::getSaveFileName(this, nullptr, lastPath);\n    if ( !filename.isEmpty() )\n    {\n        settings.setValue(\"export/last_path\", QFileInfo(filename).path());\n        ui->fileEdit->setText(filename);\n    }\n}\n\nvoid ExportDialog::toggleDateRange()\n{\n    FCT_IDENTIFICATION;\n\n    ui->startDateEdit->setEnabled(ui->dateRangeCheckBox->isChecked());\n    ui->endDateEdit->setEnabled(ui->dateRangeCheckBox->isChecked());\n}\n\nvoid ExportDialog::toggleMyCallsign()\n{\n    FCT_IDENTIFICATION;\n    ui->myCallsignComboBox->setEnabled(ui->myCallsignCheckBox->isChecked());\n    if ( ui->myCallsignCheckBox->isChecked() )\n        ui->myStationProfileCheckbox->setChecked(false);\n}\n\nvoid ExportDialog::toggleMyGridsquare()\n{\n    FCT_IDENTIFICATION;\n    ui->myGridComboBox->setEnabled(ui->myGridCheckBox->isChecked());\n    if ( ui->myGridCheckBox->isChecked() )\n        ui->myStationProfileCheckbox->setChecked(false);\n}\n\nvoid ExportDialog::toggleQslSendVia()\n{\n    FCT_IDENTIFICATION;\n    ui->qslSendViaComboBox->setEnabled(ui->qslSendViaCheckbox->isChecked());\n}\n\nvoid ExportDialog::toggleSentStatus()\n{\n    FCT_IDENTIFICATION;\n    ui->addlSentStatusICheckBox->setEnabled(ui->addlSentStatusCheckbox->isChecked());\n    ui->addlSentStatusNCheckBox->setEnabled(ui->addlSentStatusCheckbox->isChecked());\n    ui->addlSentStatusAlreadySentCheckBox->setEnabled(ui->addlSentStatusCheckbox->isChecked());\n}\n\nvoid ExportDialog::toggleUserFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->userFilterComboBox->setEnabled(ui->userFilterCheckBox->isChecked());\n}\n\nvoid ExportDialog::toggleStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    bool isStationProfileActive = ui->myStationProfileCheckbox->isChecked();\n    ui->myStationProfileComboBox->setEnabled(isStationProfileActive);\n    if ( isStationProfileActive )\n    {\n        ui->myCallsignCheckBox->setChecked(false);\n        ui->myGridCheckBox->setChecked(false);\n    }\n\n    onStationProfileChange();\n}\n\nvoid ExportDialog::onStationProfileChange()\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &selectedStationProfile = StationProfilesManager::instance()->getProfile(ui->myStationProfileComboBox->currentText());\n\n    if ( ui->myStationProfileCheckbox->isChecked() )\n    {\n        QString toolTip = tr(\"Export only QSOs matching this station profile\") + \"<br/>\"\n                             + selectedStationProfile.toHTMLString();\n        ui->myStationProfileComboBox->setToolTip(toolTip);\n    }\n    else\n        ui->myStationProfileComboBox->setToolTip({});\n}\n\nvoid ExportDialog::runExport()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->fileEdit->text().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Filename is empty\"));\n        return;\n    }\n\n    QFile file(ui->fileEdit->text());\n\n    if ( ! file.open(QFile::WriteOnly | QFile::Text) )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                             QMessageBox::tr(\"Cannot write to the file\"));\n        return;\n    }\n\n    QTextStream out(&file);\n\n    LogFormat *format = LogFormat::open(ui->typeSelect->currentText(), out);\n\n    if ( !format )\n    {\n        qCritical() << \"unknown log format\";\n        return;\n    }\n\n    PotaAdiFormat *potaFormat = dynamic_cast<PotaAdiFormat *>(format);\n\n    if ( potaFormat )\n    {\n        potaFormat->setPotaOnly(true);\n        potaFormat->setExportDirectory(QFileInfo(file).canonicalPath());\n    }\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n        format->setFilterDateRange(ui->startDateEdit->date(), ui->endDateEdit->date());\n\n    if ( ui->myStationProfileCheckbox->isChecked() )\n    {\n        const StationProfile &profile = StationProfilesManager::instance()->getProfile(\n            ui->myStationProfileComboBox->currentText());\n        format->setFilterStationProfile(profile);\n    }\n\n    if ( ui->myCallsignCheckBox->isChecked() )\n        format->setFilterMyCallsign(ui->myCallsignComboBox->currentText());\n\n    if ( ui->myGridCheckBox->isChecked() )\n        format->setFilterMyGridsquare(ui->myGridComboBox->currentText());\n\n    if ( ui->userFilterCheckBox->isChecked() )\n        format->setUserFilter(ui->userFilterComboBox->currentText());\n\n    if ( ui->exportTypeCombo->currentData() == \"qsl\"\n         && ui->qslSendViaCheckbox->isChecked() )\n        format->setFilterSendVia(ui->qslSendViaComboBox->currentData().toString());\n\n    if ( ui->exportTypeCombo->currentData() == \"qsl\" )\n    {\n        format->setFilterSentPaperQSL((ui->addlSentStatusCheckbox->isChecked()) ? ui->addlSentStatusNCheckBox->isChecked() : false,\n                                      (ui->addlSentStatusCheckbox->isChecked()) ? ui->addlSentStatusICheckBox->isChecked() : false,\n                                      (ui->addlSentStatusCheckbox->isChecked()) ? ui->addlSentStatusAlreadySentCheckBox->isChecked() : false);\n    }\n\n    if ( exportedColumns.count() > 0 )\n    {\n        //translate column indexes to SQL column names\n        QSetIterator<int> i(exportedColumns);\n        QSqlRecord record = logbookmodel.record();\n        QStringList fields;\n        while ( i.hasNext() )\n        {\n            fields << record.fieldName(i.next());\n        }\n        format->setExportedFields(fields);\n    }\n\n    // Modal progress dialog\n    QProgressDialog progressDialog(tr(\"Exporting...\"), tr(\"Cancel\"), 0, 100, this);\n    progressDialog.setWindowModality(Qt::WindowModal);\n    progressDialog.setMinimumDuration(0);\n\n    connect(format, &LogFormat::exportProgress, &progressDialog, &QProgressDialog::setValue);\n\n    long count = 0L;\n\n    if ( qsos4export.size() > 0 )\n    {\n        count = format->runExport(qsos4export);\n    }\n    else\n    {\n        count = format->runExport();\n\n        if ( count > 0\n             && ui->exportTypeCombo->currentData() == \"qsl\"\n             && ui->markAsSentCheckbox->isChecked() )\n        {\n            if ( ! markQSOAsSent(format) )\n            {\n                QMessageBox::warning(this,\n                                    tr(\"QLog Error\"),\n                                    tr(\"Cannot mark exported QSOs as Sent\"));\n            }\n        }\n    }\n\n    progressDialog.close();\n\n    delete format;\n\n    if ( potaFormat && qsos4export.size() > 0 ) // TODO: correctly calculate\n                                                // the exported QSOs in case of POTA formatter and direct export dialog\n        QMessageBox::information(nullptr, QMessageBox::tr(\"QLog Information\"),\n                                 QMessageBox::tr(\"Exported.\"));\n    else\n        QMessageBox::information(nullptr, QMessageBox::tr(\"QLog Information\"),\n                                 QMessageBox::tr(\"Exported %n contact(s).\", \"\", count));\n\n    accept();\n}\n\nvoid ExportDialog::myCallsignChanged(const QString &myCallsign)\n{\n    FCT_IDENTIFICATION;\n\n    ui->myGridComboBox->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(my_gridsquare) FROM contacts WHERE station_callsign ='\"\n                                                  + QString(myCallsign).replace(\"'\", \"''\") + \"' ORDER BY my_gridsquare\", \"\", ui->myGridComboBox));\n}\n\nvoid ExportDialog::showColumnsSetting()\n{\n    FCT_IDENTIFICATION;\n\n    // don't want to export QSO ID because it is not a ADIF field\n    QList<LogbookModel::ColumnID> excludeFilter({LogbookModel::COLUMN_ID});\n\n    ColumnSettingDialog dialog(&logbookmodel,\n                               exportedColumns,\n                               this,\n                               excludeFilter);\n    connect(&dialog, &ColumnSettingDialog::columnChanged,\n            this, &ExportDialog::exportedColumnStateChanged);\n    dialog.exec();\n}\n\nvoid ExportDialog::exportedColumnStateChanged(int index, bool state)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index << state;\n\n    if ( state )\n        exportedColumns.insert(index);\n    else\n        exportedColumns.remove(index);\n\n    const QString &comboValue = ui->exportedColumnsCombo->itemData(ui->exportedColumnsCombo->currentIndex()).toString();\n    LogParam::setExportColumnSet(comboValue, exportedColumns);\n}\nvoid ExportDialog::fillExportTypeCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->exportTypeCombo->addItem(tr(\"Generic\"), \"generic\");\n\n    if ( qsos4export.size() == 0 )\n    {\n        ui->exportTypeCombo->addItem(tr(\"QSLs\"), \"qsl\");\n    }\n}\n\nvoid ExportDialog::exportTypeChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    QString comboValue = ui->exportTypeCombo->itemData(index).toString();\n\n    if ( comboValue != \"qsl\" )\n    {\n        ui->addlSentStatusCheckbox->setVisible(false);\n        ui->addlSentStatusICheckBox->setVisible(false);\n        ui->addlSentStatusNCheckBox->setVisible(false);\n        ui->addlSentStatusAlreadySentCheckBox->setVisible(false);\n        ui->qslSendViaCheckbox->setVisible(false);\n        ui->qslSendViaComboBox->setVisible(false);\n        ui->markAsSentCheckbox->setVisible(false);\n        ui->exportedColumnsCombo->setCurrentIndex(ui->exportedColumnsCombo->findData(\"all\"));\n\n    }\n    else\n    {\n        ui->addlSentStatusCheckbox->setVisible(true);\n        ui->addlSentStatusICheckBox->setVisible(true);\n        ui->addlSentStatusNCheckBox->setVisible(true);\n        ui->addlSentStatusAlreadySentCheckBox->setVisible(true);\n        ui->qslSendViaCheckbox->setVisible(true);\n        ui->qslSendViaComboBox->setVisible(true);\n        ui->markAsSentCheckbox->setVisible(true);\n        ui->exportedColumnsCombo->setCurrentIndex(ui->exportedColumnsCombo->findData(\"qsl\"));\n    }\n\n    adjustSize();\n}\n\nvoid ExportDialog::fillExportedColumnsCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->exportedColumnsCombo->addItem(tr(\"All\"), \"all\");\n    ui->exportedColumnsCombo->addItem(tr(\"Minimal\"), \"min\");\n    ui->exportedColumnsCombo->addItem(tr(\"POTA\"), \"pota\");\n    ui->exportedColumnsCombo->addItem(tr(\"QSL-specific\"), \"qsl\");\n    ui->exportedColumnsCombo->addItem(tr(\"Custom 1\"), \"c1\");\n    ui->exportedColumnsCombo->addItem(tr(\"Custom 2\"), \"c2\");\n    ui->exportedColumnsCombo->addItem(tr(\"Custom 3\"), \"c3\");\n}\n\nbool ExportDialog::markQSOAsSent(LogFormat *format)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !format )\n    {\n        return false;\n    }\n\n    QString updateQuery = \"UPDATE contacts \"\n                          \"SET qsl_sent='Y', qsl_sdate = strftime('%Y-%m-%d',DATETIME('now', 'utc')) WHERE \"\n                          + format->getWhereClause();\n\n    qCDebug(runtime) << updateQuery ;\n\n    QSqlQuery query_update;\n\n    if ( ! query_update.prepare(updateQuery) )\n    {\n        qWarning() << \"Cannot mark exported QSO as Sent - prepare error \" << query_update.lastError().text();\n        return false;\n    }\n\n    format->bindWhereClause(query_update);\n\n    if ( ! query_update.exec() )\n    {\n        qWarning() << \"Cannot mark exported QSO as Sent - execute error \" << query_update.lastError().text();\n        return false;\n    }\n\n    return true;\n}\n\nvoid ExportDialog::exportedColumnsComboChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &comboValue = ui->exportedColumnsCombo->itemData(index).toString();\n\n    //empty set means all values exported\n    exportedColumns = QSet<int>();\n\n    if ( comboValue == \"all\" )\n    {\n        ui->exportedColumnsButton->setEnabled(false);\n    }\n    else\n    {\n        ui->exportedColumnsButton->setEnabled(true);\n\n        if ( comboValue == \"min\"\n             || comboValue == \"c1\"\n             || comboValue == \"c2\"\n             || comboValue == \"c3\" )\n        {\n            exportedColumns = LogParam::getExportColumnSet(comboValue, minColumns);\n        }\n        else if ( comboValue == \"qsl\" )\n        {\n            exportedColumns = LogParam::getExportColumnSet(comboValue, qslColumns);\n        }\n        else if ( comboValue == \"pota\" )\n        {\n            exportedColumns = potaColumns;\n        }\n    }\n}\n\nvoid ExportDialog::fillQSLSendViaCombo()\n{\n    FCT_IDENTIFICATION;\n\n    QMapIterator<QString, QString> iter(Data::instance()->qslSentViaEnum);\n    while (iter.hasNext()) {\n        iter.next();\n        ui->qslSendViaComboBox->addItem(iter.value(), iter.key());\n    }\n}\n\nvoid ExportDialog::exportFormatChanged(const QString &format)\n{\n    FCT_IDENTIFICATION;\n\n    if ( format == \"POTA\" )\n    {\n        ui->exportedColumnsCombo->setCurrentIndex(ui->exportedColumnsCombo->findData(\"pota\"));\n        ui->exportTypeCombo->setEnabled(false);\n    }\n    else\n    {\n        ui->exportedColumnsCombo->setCurrentIndex(ui->exportedColumnsCombo->findData(\"all\"));\n        ui->exportTypeCombo->setEnabled(true);\n    }\n}\n\nExportDialog::~ExportDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n"
  },
  {
    "path": "ui/ExportDialog.h",
    "content": "#ifndef QLOG_UI_EXPORTDIALOG_H\n#define QLOG_UI_EXPORTDIALOG_H\n\n#include <QDialog>\n#include <QSqlRecord>\n#include <QList>\n#include <QSet>\n\n#include \"core/LogLocale.h\"\n#include \"models/LogbookModel.h\"\n#include \"logformat/LogFormat.h\"\n\nnamespace Ui {\nclass ExportDialog;\n}\n\nclass ExportDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ExportDialog(QWidget *parent = nullptr);\n    explicit ExportDialog(const QList<QSqlRecord>&, QWidget *parent = nullptr);\n    ~ExportDialog();\n\npublic slots:\n    void browse();\n    void toggleDateRange();\n    void toggleMyCallsign();\n    void toggleMyGridsquare();\n    void toggleQslSendVia();\n    void toggleSentStatus();\n    void toggleUserFilter();\n    void toggleStationProfile();\n    void onStationProfileChange();\n    void runExport();\n    void myCallsignChanged(const QString &myCallsign);\n    void showColumnsSetting();\n    void exportedColumnStateChanged(int index, bool state);\n    void exportTypeChanged(int index);\n    void exportedColumnsComboChanged(int);\n    void exportFormatChanged(const QString &format);\nprivate:\n    Ui::ExportDialog *ui;\n    LogLocale locale;\n    QSet<int> exportedColumns;\n    const QSet<int> minColumns{\n        LogbookModel::COLUMN_TIME_ON,\n        LogbookModel::COLUMN_CALL,\n        LogbookModel::COLUMN_FREQUENCY,\n        LogbookModel::COLUMN_MODE,\n        LogbookModel::COLUMN_SUBMODE\n    };\n    const QSet<int> qslColumns{\n        LogbookModel::COLUMN_TIME_ON,\n        LogbookModel::COLUMN_CALL,\n        LogbookModel::COLUMN_FREQUENCY,\n        LogbookModel::COLUMN_MODE,\n        LogbookModel::COLUMN_SUBMODE,\n        LogbookModel::COLUMN_RST_SENT,\n        LogbookModel::COLUMN_RST_RCVD\n    };\n    const QSet<int> potaColumns{\n        LogbookModel::COLUMN_TIME_ON,\n        LogbookModel::COLUMN_CALL,\n        LogbookModel::COLUMN_OPERATOR,\n        LogbookModel::COLUMN_STATION_CALLSIGN,\n        LogbookModel::COLUMN_FREQUENCY,\n        LogbookModel::COLUMN_MODE,\n        LogbookModel::COLUMN_SUBMODE,\n        LogbookModel::COLUMN_MY_STATE,\n        LogbookModel::COLUMN_MY_COUNTRY,\n        LogbookModel::COLUMN_MY_POTA_REF,\n        LogbookModel::COLUMN_POTA_REF,\n        LogbookModel::COLUMN_MY_SIG,\n        LogbookModel::COLUMN_MY_SIG_INFO,\n        LogbookModel::COLUMN_SIG,\n        LogbookModel::COLUMN_SIG_INFO\n    };\n    LogbookModel logbookmodel;\n    const QList<QSqlRecord> qsos4export;\n\n    void fillQSLSendViaCombo();\n    void fillExportTypeCombo();\n    void fillExportedColumnsCombo();\n    bool markQSOAsSent(LogFormat *format);\n};\n\n#endif // QLOG_UI_EXPORTDIALOG_H\n"
  },
  {
    "path": "ui/ExportDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ExportDialog</class>\n <widget class=\"QDialog\" name=\"ExportDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>465</width>\n    <height>606</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>465</width>\n    <height>0</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Export Selected QSOs</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>File</string>\n     </property>\n     <layout class=\"QGridLayout\" name=\"gridLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLineEdit\" name=\"fileEdit\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"readOnly\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QPushButton\" name=\"browseButton\">\n        <property name=\"text\">\n         <string>Browse</string>\n        </property>\n        <property name=\"icon\">\n         <iconset theme=\"folder-open\">\n          <normaloff>.</normaloff>.</iconset>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"2\">\n       <widget class=\"QComboBox\" name=\"typeSelect\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <item>\n         <property name=\"text\">\n          <string notr=\"true\">ADI</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>ADX</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>CSV</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>JSON</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>POTA</string>\n         </property>\n        </item>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"settingGroup\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"title\">\n      <string/>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_2\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"label\">\n        <property name=\"text\">\n         <string>Export Type</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"exportTypeCombo\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"exportedColumnsLabel\">\n        <property name=\"text\">\n         <string>Column set</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n        <property name=\"spacing\">\n         <number>6</number>\n        </property>\n        <item>\n         <widget class=\"QComboBox\" name=\"exportedColumnsCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"toolTip\">\n           <string>Select one of the pre-defined sets of columns or define your own set of columns</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"exportedColumnsButton\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"toolTip\">\n           <string>Edit current set of columns</string>\n          </property>\n          <property name=\"text\">\n           <string>Edit</string>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <widget class=\"QCheckBox\" name=\"markAsSentCheckbox\">\n        <property name=\"text\">\n         <string>Mark exported QSOs As Sent</string>\n        </property>\n        <property name=\"checked\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"filterGroup\">\n     <property name=\"enabled\">\n      <bool>true</bool>\n     </property>\n     <property name=\"toolTip\">\n      <string>Export only QSOs that match the active filters</string>\n     </property>\n     <property name=\"title\">\n      <string>Filters</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"dateRangeCheckBox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Maximum\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected date range</string>\n        </property>\n        <property name=\"text\">\n         <string>Date Range</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n        <item>\n         <widget class=\"QDateEdit\" name=\"startDateEdit\">\n          <property name=\"enabled\">\n           <bool>false</bool>\n          </property>\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"focusPolicy\">\n           <enum>Qt::ClickFocus</enum>\n          </property>\n          <property name=\"toolTip\">\n           <string>Export only QSOs that match the selected date range</string>\n          </property>\n          <property name=\"calendarPopup\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"endDateLabel\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string notr=\"true\">-</string>\n          </property>\n          <property name=\"alignment\">\n           <set>Qt::AlignCenter</set>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QDateEdit\" name=\"endDateEdit\">\n          <property name=\"enabled\">\n           <bool>false</bool>\n          </property>\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"focusPolicy\">\n           <enum>Qt::ClickFocus</enum>\n          </property>\n          <property name=\"toolTip\">\n           <string>Export only QSOs that match the selected date range</string>\n          </property>\n          <property name=\"calendarPopup\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_2\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"myCallsignCheckBox\">\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected My Callsign</string>\n        </property>\n        <property name=\"text\">\n         <string>My Callsign</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"myCallsignComboBox\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected My Callsign</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"myGridCheckBox\">\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected My Gridsquare</string>\n        </property>\n        <property name=\"text\">\n         <string>My Gridsquare</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"myGridComboBox\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected My Gridsquare</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"5\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"qslSendViaCheckbox\">\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected QSL Send Via value</string>\n        </property>\n        <property name=\"text\">\n         <string>QSL Send via</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"5\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"qslSendViaComboBox\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"toolTip\">\n         <string>Export only QSOs that match the selected QSL Send Via value</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"6\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"addlSentStatusCheckbox\">\n        <property name=\"toolTip\">\n         <string>Include unusual QSO Sent statuses</string>\n        </property>\n        <property name=\"text\">\n         <string>Include Sent Status</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"6\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"sentStatusLayout\">\n        <item>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n          <property name=\"spacing\">\n           <number>0</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>0</number>\n          </property>\n          <item>\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n            <property name=\"rightMargin\">\n             <number>10</number>\n            </property>\n            <item>\n             <widget class=\"QCheckBox\" name=\"addlSentStatusICheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</string>\n              </property>\n              <property name=\"text\">\n               <string>&quot;Ignore&quot;</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"addlSentStatusNCheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</string>\n              </property>\n              <property name=\"text\">\n               <string>&quot;No&quot;</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item>\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n            <property name=\"topMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"rightMargin\">\n             <number>0</number>\n            </property>\n            <item>\n             <widget class=\"QCheckBox\" name=\"addlSentStatusAlreadySentCheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Resend already sent QSOs</string>\n              </property>\n              <property name=\"text\">\n               <string>Already Sent</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </item>\n       </layout>\n      </item>\n      <item row=\"4\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"userFilterCheckBox\">\n        <property name=\"text\">\n         <string>User Filter</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"4\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"userFilterComboBox\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"toolTip\">\n         <string>Export QSOs that match the selected user QSO Filter</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"myStationProfileCheckbox\">\n        <property name=\"text\">\n         <string>Station Profile</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"myStationProfileComboBox\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>browseButton</tabstop>\n  <tabstop>typeSelect</tabstop>\n  <tabstop>exportTypeCombo</tabstop>\n  <tabstop>exportedColumnsCombo</tabstop>\n  <tabstop>exportedColumnsButton</tabstop>\n  <tabstop>markAsSentCheckbox</tabstop>\n  <tabstop>dateRangeCheckBox</tabstop>\n  <tabstop>myStationProfileCheckbox</tabstop>\n  <tabstop>myStationProfileComboBox</tabstop>\n  <tabstop>myCallsignCheckBox</tabstop>\n  <tabstop>myCallsignComboBox</tabstop>\n  <tabstop>myGridCheckBox</tabstop>\n  <tabstop>myGridComboBox</tabstop>\n  <tabstop>userFilterCheckBox</tabstop>\n  <tabstop>userFilterComboBox</tabstop>\n  <tabstop>qslSendViaCheckbox</tabstop>\n  <tabstop>qslSendViaComboBox</tabstop>\n  <tabstop>addlSentStatusCheckbox</tabstop>\n  <tabstop>addlSentStatusICheckBox</tabstop>\n  <tabstop>addlSentStatusNCheckBox</tabstop>\n  <tabstop>addlSentStatusAlreadySentCheckBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>runExport()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>266</x>\n     <y>536</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>334</x>\n     <y>536</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>browseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>browse()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>368</x>\n     <y>67</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>91</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateRangeCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleDateRange()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>124</x>\n     <y>258</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>91</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleMyCallsign()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>93</x>\n     <y>292</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>142</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myGridCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleMyGridsquare()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>103</x>\n     <y>323</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>142</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>myCallsignChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>443</x>\n     <y>302</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>142</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportedColumnsButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>showColumnsSetting()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>442</x>\n     <y>159</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>179</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qslSendViaCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleQslSendVia()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>119</x>\n     <y>396</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>212</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportTypeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>exportTypeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>443</x>\n     <y>126</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>212</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportedColumnsCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>exportedColumnsComboChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>356</x>\n     <y>159</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>229</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addlSentStatusCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleSentStatus()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>174</x>\n     <y>428</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>237</x>\n     <y>220</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleUserFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>70</x>\n     <y>352</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>272</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>typeSelect</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>exportFormatChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>397</x>\n     <y>46</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>290</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myStationProfileCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>toggleStationProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>85</x>\n     <y>300</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>302</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myStationProfileComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>ExportDialog</receiver>\n   <slot>onStationProfileChange()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>301</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>232</x>\n     <y>302</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>toggleDateRange()</slot>\n  <slot>browse()</slot>\n  <slot>runExport()</slot>\n  <slot>toggleMyCallsign()</slot>\n  <slot>toggleMyGridsquare()</slot>\n  <slot>myCallsignChanged(QString)</slot>\n  <slot>exportFormatChanged(QString)</slot>\n  <slot>showColumnsSetting()</slot>\n  <slot>toggleQslSendVia()</slot>\n  <slot>exportTypeChanged(int)</slot>\n  <slot>exportedColumnsComboChanged(int)</slot>\n  <slot>toggleSentStatus()</slot>\n  <slot>toggleUserFilter()</slot>\n  <slot>toggleStationProfile()</slot>\n  <slot>onStationProfileChange()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/ExportPasswordDialog.cpp",
    "content": "#include <QPushButton>\n#include <QRandomGenerator>\n#include \"ExportPasswordDialog.h\"\n#include \"ui_ExportPasswordDialog.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.exportpassworddialog\");\n\nExportPasswordDialog::ExportPasswordDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::ExportPasswordDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);\n}\n\nExportPasswordDialog::~ExportPasswordDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nQString ExportPasswordDialog::getPassword() const\n{\n    FCT_IDENTIFICATION;\n    return ui->passwordEdit->text();\n}\n\nbool ExportPasswordDialog::getDeletePasswords() const\n{\n    FCT_IDENTIFICATION;\n    return ui->deletePasswordsCheckBox->isChecked();\n}\n\nvoid ExportPasswordDialog::validatePasswords()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &pass = ui->passwordEdit->text();\n    const QString &confirm = ui->confirmEdit->text();\n    if ( pass.isEmpty() )\n    {\n        ui->confirmEdit->clear();\n        ui->passwordEdit->setEchoMode(QLineEdit::PasswordEchoOnEdit);\n        ui->confirmEdit->setEchoMode(QLineEdit::Password);\n    }\n\n    bool isEnabled = (!pass.isEmpty() && pass == confirm);\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(isEnabled);\n}\n\nvoid ExportPasswordDialog::generatePassword()\n{\n    FCT_IDENTIFICATION;\n\n    // removing similar chars 0 and Oo, 1 and lI\n    static const char charset[] = \"aBcDeFgHiJkLmNPqRsTuVwXyZ\"\n                                  \"AbCdEfGhjKMnOpQrStUvWxYz\"\n                                  \"@2$4&6!78#93%5*\";\n\n    const int charsetLen = static_cast<int>(sizeof(charset) - 1);\n    const int passwordLen = 12;\n\n    QRandomGenerator *rng = QRandomGenerator::system();\n    QString password;\n    password.reserve(passwordLen);\n\n    for ( int i = 0; i < passwordLen; ++i )\n        password.append(QChar(charset[rng->bounded(charsetLen)]));\n\n    ui->passwordEdit->setText(password);\n    ui->confirmEdit->setText(password);\n\n    ui->passwordEdit->setEchoMode(QLineEdit::Normal);\n    ui->confirmEdit->setEchoMode(QLineEdit::Normal);\n}\n"
  },
  {
    "path": "ui/ExportPasswordDialog.h",
    "content": "#ifndef QLOG_UI_EXPORTPASSWORDDIALOG_H\n#define QLOG_UI_EXPORTPASSWORDDIALOG_H\n\n#include <QDialog>\n\nnamespace Ui {\nclass ExportPasswordDialog;\n}\n\nclass ExportPasswordDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ExportPasswordDialog(QWidget *parent = nullptr);\n    ~ExportPasswordDialog();\n\n    QString getPassword() const;\n    bool getDeletePasswords() const;\n\nprivate slots:\n    void validatePasswords();\n    void generatePassword();\n\nprivate:\n    Ui::ExportPasswordDialog *ui;\n};\n\n#endif // QLOG_UI_EXPORTPASSWORDDIALOG_H\n"
  },
  {
    "path": "ui/ExportPasswordDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ExportPasswordDialog</class>\n <widget class=\"QDialog\" name=\"ExportPasswordDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>422</width>\n    <height>193</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Pack Data &amp; Settings</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"infoLabel\">\n     <property name=\"text\">\n      <string>Enter a password to encrypt stored credentials.\nThe password will be needed to restore them later.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLineEdit\" name=\"passwordEdit\">\n       <property name=\"echoMode\">\n        <enum>QLineEdit::PasswordEchoOnEdit</enum>\n       </property>\n       <property name=\"placeholderText\">\n        <string>Password</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"generateButton\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>Random</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QLineEdit\" name=\"confirmEdit\">\n     <property name=\"echoMode\">\n      <enum>QLineEdit::Password</enum>\n     </property>\n     <property name=\"placeholderText\">\n      <string>Confirm Password</string>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"deletePasswordsCheckBox\">\n     <property name=\"text\">\n      <string>Delete passwords from Credential Store after export</string>\n     </property>\n     <property name=\"checked\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>passwordEdit</tabstop>\n  <tabstop>confirmEdit</tabstop>\n  <tabstop>deletePasswordsCheckBox</tabstop>\n  <tabstop>generateButton</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ExportPasswordDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ExportPasswordDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>passwordEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>ExportPasswordDialog</receiver>\n   <slot>validatePasswords()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>167</x>\n     <y>69</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>210</x>\n     <y>96</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>confirmEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>ExportPasswordDialog</receiver>\n   <slot>validatePasswords()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>210</x>\n     <y>104</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>210</x>\n     <y>96</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>generateButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ExportPasswordDialog</receiver>\n   <slot>generatePassword()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>371</x>\n     <y>69</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>210</x>\n     <y>96</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>validatePasswords()</slot>\n  <slot>generatePassword()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/ImportDialog.cpp",
    "content": "#include <QFileDialog>\n#include <QMessageBox>\n#include \"ImportDialog.h\"\n#include \"ui_ImportDialog.h\"\n#include \"logformat/LogFormat.h\"\n#include \"core/debug.h\"\n#include \"data/StationProfile.h\"\n#include \"data/RigProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.importdialog\");\n\nImportDialog::ImportDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::ImportDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->allCheckBox->setChecked(true);\n    ui->startDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->startDateEdit->setDate(QDate::currentDate());\n    ui->endDateEdit->setDate(QDate::currentDate());\n    ui->endDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->progressBar->setValue(0);\n    ui->progressBar->setMinimum(0);\n    ui->progressBar->setMaximum(100);\n    //ui->progressBar->setDisabled(true);\n\n    QStringList rigs = RigProfilesManager::instance()->profileNameList();\n    QStringListModel* rigModel = new QStringListModel(rigs, this);\n    ui->rigSelect->setModel(rigModel);\n    if (!ui->rigSelect->currentText().isEmpty())\n    {\n        ui->rigCheckBox->setChecked(true);\n        ui->rigSelect->setCurrentText(RigProfilesManager::instance()->getCurProfile1().profileName);\n    }\n\n    QStringList profiles = StationProfilesManager::instance()->profileNameList();\n    QStringListModel* profileModel = new QStringListModel(profiles, this);\n    ui->profileSelect->setModel(profileModel);\n    if (!ui->profileSelect->currentText().isEmpty())\n    {\n        ui->profileSelect->setCurrentText(StationProfilesManager::instance()->getCurProfile1().profileName);\n        ui->profileCheckBox->setChecked(true);\n    }\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"&Import\"));\n\n    // TODO: disabled #983 - If everything is OK, then delete it over time.\n    ui->optionBox->setVisible(false);\n}\n\nvoid ImportDialog::browse()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n\n    const QString &lastPath = ( ui->fileEdit->text().isEmpty() ) ? settings.value(\"import/last_path\", QDir::homePath()).toString()\n                                                                 : ui->fileEdit->text();\n\n    QString filename = QFileDialog::getOpenFileName(this, tr(\"Select File\"),\n                                                    lastPath,\n                                                    ui->typeSelect->currentText().toUpper() + \"(*.\" + ui->typeSelect->currentText().toLower() + \")\",\n                                                    nullptr,\n#if defined(Q_OS_LINUX) && !(defined(QLOG_FLATPAK) && defined(Q_PROCESSOR_ARM_64))\n                                                    // Do not use the Native Dialog under Linux because the dialog is case-sensitive.\n                                                    // QT variant looks different but it is case-insensitive.\n                                                    // More information:\n                                                    // https://stackoverflow.com/questions/34858220/qt-how-to-set-a-case-insensitive-filter-on-qfiledialog\n                                                    // https://bugreports.qt.io/browse/QTBUG-51712\n\t\t\t\t\t\t    // But Raspberry pi crashes when DontUseNativeDialog is used therefore use the native for it.\n                                                    QFileDialog::DontUseNativeDialog\n#else\n                                                    QFileDialog::Options()\n#endif\n\n                                                    );\n    if ( !filename.isEmpty() )\n    {\n        settings.setValue(\"import/last_path\", QFileInfo(filename).path());\n        ui->fileEdit->setText(filename);\n    }\n}\n\nvoid ImportDialog::toggleAll() {\n    FCT_IDENTIFICATION;\n\n    ui->startDateEdit->setEnabled(!ui->allCheckBox->isChecked());\n    ui->endDateEdit->setEnabled(!ui->allCheckBox->isChecked());\n}\n\nvoid ImportDialog::toggleMyProfile()\n{\n    FCT_IDENTIFICATION;\n\n    ui->profileSelect->setEnabled(ui->profileCheckBox->isChecked());\n}\nvoid ImportDialog::toggleMyRig()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigSelect->setEnabled(ui->rigCheckBox->isChecked());\n}\n\nvoid ImportDialog::commentChanged(const QString &comment)\n{\n    QString toolTip = tr(\"The value is used when an input record does not contain the ADIF value\") + \"<br/>\"\n            + \"<b>\" + tr(\"Comment\") + \":</b> \" + comment + \"<br/>\";\n\n    ui->commentEdit->setToolTip(toolTip);\n    ui->commentCheckBox->setToolTip(toolTip);\n}\n\nvoid ImportDialog::toggleComment()\n{\n    FCT_IDENTIFICATION;\n\n    ui->commentEdit->setEnabled(ui->commentCheckBox->isChecked());\n    commentChanged(ui->commentEdit->text());\n}\n\nvoid ImportDialog::computeProgress(qint64 position)\n{\n    FCT_IDENTIFICATION;\n\n    int progress = (int)(position * 100 / size);\n    ui->progressBar->setValue(progress);\n    QCoreApplication::processEvents();\n}\n\nvoid ImportDialog::stationProfileTextChanged(const QString &newProfileName)\n{\n    FCT_IDENTIFICATION;\n\n    selectedStationProfile = StationProfilesManager::instance()->getProfile(newProfileName);\n    QString toolTip = tr(\"The values below will be used when an input record does not contain the ADIF values\") + \"<br/>\"\n                         + selectedStationProfile.toHTMLString();\n    ui->profileSelect->setToolTip(toolTip);\n    ui->profileCheckBox->setToolTip(toolTip);\n}\n\nvoid ImportDialog::rigProfileTextChanged(const QString &newProfileName)\n{\n    FCT_IDENTIFICATION;\n    QString toolTip = tr(\"The values below will be used when an input record does not contain the ADIF values\") + \"<br/>\"\n            + RigProfilesManager::instance()->getProfile(newProfileName).toHTMLString();\n    ui->rigSelect->setToolTip(toolTip);\n    ui->rigCheckBox->setToolTip(toolTip);\n}\n\nLogFormat::duplicateQSOBehaviour ImportDialog::showDuplicateDialog(QSqlRecord *imported, QSqlRecord *original)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << *imported << \" \" << *original;\n\n    LogFormat::duplicateQSOBehaviour ret = LogFormat::ACCEPT_ONE;\n\n    QMessageBox::StandardButton reply;\n\n    QString inLogQSO = tr(\"<p><b>In-Log QSO:</b></p><p>\")\n                       + original->value(\"start_time\").toString() + \" \"\n                       + original->value(\"callsign\").toString() + \"</p>\";\n\n    QString importedQSO = tr(\"<p><b>Importing:</b></p><p>\")\n                       + imported->value(\"start_time\").toString() + \" \"\n                       + imported->value(\"callsign\").toString() + \"<p> \";\n\n    reply = QMessageBox::question(nullptr,\n                                  tr(\"Duplicate QSO\"),\n                                  tr(\"<p>Do you want to import duplicate QSO?</p>%1 %2\").arg(inLogQSO,importedQSO),\n                                  QMessageBox::Yes|QMessageBox::No|QMessageBox::YesAll|QMessageBox::NoAll);\n    switch ( reply )\n    {\n    case QMessageBox::Yes:\n        ret = LogFormat::ACCEPT_ONE;\n        break;\n    case QMessageBox::YesAll:\n        ret = LogFormat::ACCEPT_ALL;\n        break;\n    case QMessageBox::No:\n        ret = LogFormat::SKIP_ONE;\n        break;\n    case QMessageBox::NoAll:\n        ret = LogFormat::SKIP_ALL;\n        break;\n    default:\n        ret = LogFormat::ASK_NEXT;\n    }\n\n    qCDebug(runtime) << \"ret: \" << ret;\n    return ret;\n}\n\nvoid ImportDialog::saveImportDetails(const QString &importDetail, const QString &filename,\n                                     const int count, const unsigned long warnings, const unsigned long errors)\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n\n    const QString &lastPath = settings.value(\"import/last_path_importdetails\", QDir::homePath()).toString();\n\n    QString filePath = QFileDialog::getSaveFileName(this, tr(\"Save to File\"),\n                                                    lastPath,\n                                                    \"TXT (*.txt)\");\n\n    if ( !filePath.isEmpty() )\n    {\n\n        QFile file(filePath);\n        if ( file.open(QIODevice::WriteOnly | QIODevice::Text) )\n        {\n            const QDateTime &currTime = QDateTime::currentDateTimeUtc();\n\n            QTextStream out(&file);\n            out << tr(\"QLog Import Summary\") << \"\\n\"\n                << \"\\n\"\n                << tr(\"Import date\") << \": \" << currTime.toString(locale.formatDateShortWithYYYY()) << \" \" << locale.toString(currTime, locale.formatTimeLongWithoutTZ()) << \" UTC\\n\"\n                << tr(\"Imported file\") << \": \" << filename\n                << \"\\n\\n\"\n                << tr(\"Imported: %n contact(s)\", \"\", count) << \"\\n\"\n                << tr(\"Warning(s): %n\", \"\", warnings) << \"\\n\"\n                << tr(\"Error(s): %n\", \"\", errors) << \"\\n\"\n                << \"\\n\"\n                << tr(\"Details\") << \":\\n\"\n                << importDetail;\n\n            file.close();\n            settings.setValue(\"import/last_path_importdetails\", QFileInfo(filePath).path());\n        }\n    }\n}\n\nvoid ImportDialog::runImport()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->fileEdit->text().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Filename is empty\"));\n        return;\n    }\n\n    QFile file(ui->fileEdit->text());\n    file.open(QFile::ReadOnly | QFile::Text);\n    QTextStream in(&file);\n\n    size = file.size();\n\n    QMap<QString, QString> defaults;\n\n    if (ui->rigCheckBox->isChecked())\n    {\n        defaults[\"my_rig_intl\"] = ui->rigSelect->currentText();\n    }\n\n    if (ui->commentCheckBox->isChecked())\n    {\n        defaults[\"comment_intl\"] = ui->commentEdit->text();\n    }\n\n    LogFormat* format = LogFormat::open(ui->typeSelect->currentText(), in);\n\n    if (!format) {\n        qCritical() << \"unknown log format\";\n        return;\n    }\n\n    format->setDefaults(defaults);\n    format->setFillMissingDxcc(ui->fillMissingDxccCheckBox->isChecked());\n\n    if (!ui->allCheckBox->isChecked()) {\n        format->setFilterDateRange(ui->startDateEdit->date(), ui->endDateEdit->date());\n    }\n\n    format->setDuplicateQSOCallback(showDuplicateDialog);\n\n    connect(format, &LogFormat::importPosition, this, &ImportDialog::computeProgress);\n\n    ui->buttonBox->setEnabled(false);\n    ui->fileEdit->setEnabled(false);\n    ui->typeSelect->setEnabled(false);\n    ui->browseButton->setEnabled(false);\n    ui->startDateEdit->setEnabled(false);\n    ui->endDateEdit->setEnabled(false);\n    ui->allCheckBox->setEnabled(false);\n    ui->profileCheckBox->setEnabled(false);\n    ui->profileSelect->setEnabled(false);\n    ui->rigCheckBox->setEnabled(false);\n    ui->rigSelect->setEnabled(false);\n    ui->commentCheckBox->setEnabled(false);\n    ui->commentEdit->setEnabled(false);\n    ui->fillMissingDxccCheckBox->setEnabled(false);\n\n    QString s;\n    QTextStream out(&s);\n    unsigned long errors = 0L;\n    unsigned long warnings = 0L;\n\n    int count = format->runImport(out,\n                                  ( ui->profileCheckBox->isChecked() && selectedStationProfile != StationProfile() ) ?&selectedStationProfile: nullptr,\n                                  &warnings,\n                                  &errors);\n\n    QString report = QObject::tr(\"<b>Imported</b>: %n contact(s)\", \"\", count) + \"<br/>\" +\n                     QObject::tr(\"<b>Warning(s)</b>: %n\", \"\", warnings) + \"<br/>\" +\n                     QObject::tr(\"<b>Error(s)</b>: %n\", \"\", errors);\n\n    QMessageBox msgBox;\n    QAbstractButton* pButtonYes = nullptr;\n\n    msgBox.setWindowTitle(tr(\"Import Result\"));\n    msgBox.setText(report);\n    msgBox.setDetailedText(s);\n    msgBox.setIcon(QMessageBox::Information);\n    msgBox.setStandardButtons(QMessageBox::Ok);\n    msgBox.setDefaultButton(QMessageBox::Ok);\n\n    if ( !s.isEmpty() )\n         pButtonYes = msgBox.addButton(tr(\"Save Details...\"), QMessageBox::ActionRole);\n\n    QSpacerItem* horizontalSpacer = new QSpacerItem(500, 0, QSizePolicy::Minimum, QSizePolicy::Expanding);\n    QGridLayout* layout = qobject_cast<QGridLayout*>(msgBox.layout());\n    if ( !layout )\n    {\n        qWarning() << \"Layout is null\";\n        delete horizontalSpacer;\n        return;\n    }\n    layout->addItem(horizontalSpacer, layout->rowCount(), 0, 1, layout->columnCount());\n\n    msgBox.exec();\n\n    if ( pButtonYes && msgBox.clickedButton() == pButtonYes )\n    {\n        saveImportDetails(s, ui->fileEdit->text(),\n                          count, warnings, errors);\n    }\n\n    delete format;\n\n    qCDebug(runtime).noquote() << s;\n\n    accept();\n}\n\nImportDialog::~ImportDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n"
  },
  {
    "path": "ui/ImportDialog.h",
    "content": "#ifndef QLOG_UI_IMPORTDIALOG_H\n#define QLOG_UI_IMPORTDIALOG_H\n\n#include <QDialog>\n#include <QSqlRecord>\n#include <logformat/LogFormat.h>\n#include \"data/StationProfile.h\"\n#include \"core/LogLocale.h\"\n\nnamespace Ui {\nclass ImportDialog;\n}\n\nclass ImportDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ImportDialog(QWidget *parent = 0);\n    ~ImportDialog();\n\nprivate slots:\n    void browse();\n    void toggleAll();\n    void toggleComment();\n    void runImport();\n    void computeProgress(qint64 position);\n    void stationProfileTextChanged(const QString&);\n    void rigProfileTextChanged(const QString&);\n    void toggleMyProfile();\n    void toggleMyRig();\n    void commentChanged(const QString&);\n\nprivate:\n    Ui::ImportDialog *ui;\n    qint64 size;\n    StationProfile selectedStationProfile;\n    LogLocale locale;\n\n    static LogFormat::duplicateQSOBehaviour showDuplicateDialog(QSqlRecord *, QSqlRecord *);\n    void saveImportDetails(const QString &importDetail,\n                           const QString &filename,\n                           const int count,\n                           const unsigned long warnings,\n                           const unsigned long errors);\n};\n\n#endif // QLOG_UI_IMPORTDIALOG_H\n"
  },
  {
    "path": "ui/ImportDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ImportDialog</class>\n <widget class=\"QDialog\" name=\"ImportDialog\">\n  <property name=\"windowTitle\">\n   <string>Import</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox_3\">\n     <property name=\"title\">\n      <string>File</string>\n     </property>\n     <layout class=\"QGridLayout\" name=\"gridLayout_4\">\n      <item row=\"0\" column=\"2\">\n       <widget class=\"QComboBox\" name=\"typeSelect\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <item>\n         <property name=\"text\">\n          <string notr=\"true\">ADI</string>\n         </property>\n        </item>\n        <item>\n         <property name=\"text\">\n          <string>ADX</string>\n         </property>\n        </item>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLineEdit\" name=\"fileEdit\">\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"readOnly\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QPushButton\" name=\"browseButton\">\n        <property name=\"text\">\n         <string>Browse</string>\n        </property>\n        <property name=\"icon\">\n         <iconset theme=\"folder-open\">\n          <normaloff>.</normaloff>.</iconset>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"toolTip\">\n      <string/>\n     </property>\n     <property name=\"title\">\n      <string>Date Range</string>\n     </property>\n     <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n      <item>\n       <widget class=\"QCheckBox\" name=\"allCheckBox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Expanding\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"toolTip\">\n         <string>Import all or only QSOs from the given period</string>\n        </property>\n        <property name=\"text\">\n         <string>All</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <spacer name=\"horizontalSpacer\">\n        <property name=\"orientation\">\n         <enum>Qt::Horizontal</enum>\n        </property>\n        <property name=\"sizeHint\" stdset=\"0\">\n         <size>\n          <width>40</width>\n          <height>20</height>\n         </size>\n        </property>\n       </spacer>\n      </item>\n      <item>\n       <widget class=\"QDateEdit\" name=\"startDateEdit\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"calendarPopup\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QLabel\" name=\"endDateLabel\">\n        <property name=\"text\">\n         <string notr=\"true\"> - </string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QDateEdit\" name=\"endDateEdit\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"focusPolicy\">\n         <enum>Qt::ClickFocus</enum>\n        </property>\n        <property name=\"calendarPopup\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox_2\">\n     <property name=\"toolTip\">\n      <string>The value is used when an input record does not contain the ADIF value</string>\n     </property>\n     <property name=\"title\">\n      <string>Defaults</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"profileCheckBox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Expanding\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"text\">\n         <string>My Profile</string>\n        </property>\n        <property name=\"checked\">\n         <bool>false</bool>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"rigCheckBox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Expanding\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"text\">\n         <string>My Rig</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"rigSelect\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"toolTip\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QCheckBox\" name=\"commentCheckBox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Expanding\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"text\">\n         <string>Comment</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <widget class=\"QLineEdit\" name=\"commentEdit\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"toolTip\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"profileSelect\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"optionBox\">\n     <property name=\"enabled\">\n      <bool>true</bool>\n     </property>\n     <property name=\"title\">\n      <string>Options</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n      <item>\n       <widget class=\"QLabel\" name=\"label\">\n        <property name=\"text\">\n         <string>If DXCC is missing in the imported record, it will be resolved from the callsign.</string>\n        </property>\n        <property name=\"wordWrap\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <widget class=\"QCheckBox\" name=\"fillMissingDxccCheckBox\">\n        <property name=\"text\">\n         <string>Fill missing DXCC Entity Information</string>\n        </property>\n        <property name=\"checked\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QProgressBar\" name=\"progressBar\">\n     <property name=\"value\">\n      <number>24</number>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>\n       </property>\n       <property name=\"centerButtons\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>browseButton</tabstop>\n  <tabstop>typeSelect</tabstop>\n  <tabstop>allCheckBox</tabstop>\n  <tabstop>profileCheckBox</tabstop>\n  <tabstop>profileSelect</tabstop>\n  <tabstop>rigCheckBox</tabstop>\n  <tabstop>rigSelect</tabstop>\n  <tabstop>commentCheckBox</tabstop>\n  <tabstop>commentEdit</tabstop>\n  <tabstop>fillMissingDxccCheckBox</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>runImport()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>allCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>toggleAll()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>106</x>\n     <y>125</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>155</x>\n     <y>102</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>browseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>browse()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>216</x>\n     <y>21</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>155</x>\n     <y>102</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>profileCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>toggleMyProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>59</x>\n     <y>303</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>239</x>\n     <y>279</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigSelect</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>rigProfileTextChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>235</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>206</x>\n     <y>218</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>toggleMyRig()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>56</x>\n     <y>341</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>239</x>\n     <y>279</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>profileSelect</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>stationProfileTextChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>204</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>206</x>\n     <y>218</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>commentCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>toggleComment()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>66</x>\n     <y>379</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>239</x>\n     <y>279</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>commentEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>ImportDialog</receiver>\n   <slot>commentChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>265</x>\n     <y>266</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>214</x>\n     <y>218</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>browse()</slot>\n  <slot>toggleAll()</slot>\n  <slot>runImport()</slot>\n  <slot>toggleMyProfile()</slot>\n  <slot>toggleMyRig()</slot>\n  <slot>toggleComment()</slot>\n  <slot>adjustLocatorTextColor()</slot>\n  <slot>stationProfileTextChanged(QString)</slot>\n  <slot>rigProfileTextChanged(QString)</slot>\n  <slot>commentChanged(QString)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/InputPasswordDialog.cpp",
    "content": "#include \"InputPasswordDialog.h\"\n#include \"ui_InputPasswordDialog.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.dxwidget\");\n\nInputPasswordDialog::InputPasswordDialog(QString dialogName,\n                                         QString comment,\n                                         QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::InputPasswordDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    setWindowTitle(dialogName);\n    ui->comment->setText(comment);\n}\n\nInputPasswordDialog::~InputPasswordDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nQString InputPasswordDialog::getPassword() const\n{\n    FCT_IDENTIFICATION;\n    return ui->passwordLineEdit->text();\n}\n\nbool InputPasswordDialog::getRememberPassword() const\n{\n    FCT_IDENTIFICATION;\n    return ui->rememberCheckBox->isChecked();\n}\n"
  },
  {
    "path": "ui/InputPasswordDialog.h",
    "content": "#ifndef QLOG_UI_INPUTPASSWORDDIALOG_H\n#define QLOG_UI_INPUTPASSWORDDIALOG_H\n\n#include <QDialog>\n\nnamespace Ui {\nclass InputPasswordDialog;\n}\n\nclass InputPasswordDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit InputPasswordDialog(QString dialogName,\n                                 QString comment,\n                                 QWidget *parent = nullptr);\n    ~InputPasswordDialog();\n\n    QString getPassword() const;\n    bool getRememberPassword() const;\n\nprivate:\n    Ui::InputPasswordDialog *ui;\n};\n\n#endif // QLOG_UI_INPUTPASSWORDDIALOG_H\n"
  },
  {
    "path": "ui/InputPasswordDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>InputPasswordDialog</class>\n <widget class=\"QDialog\" name=\"InputPasswordDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>126</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Dialog</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"comment\">\n     <property name=\"text\">\n      <string/>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QLineEdit\" name=\"passwordLineEdit\">\n     <property name=\"echoMode\">\n      <enum>QLineEdit::Password</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QCheckBox\" name=\"rememberCheckBox\">\n     <property name=\"toolTip\">\n      <string>The password will be stored in the Credential Store.</string>\n     </property>\n     <property name=\"text\">\n      <string>Remember Password</string>\n     </property>\n     <property name=\"checked\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>InputPasswordDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>InputPasswordDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/KSTChatWidget.cpp",
    "content": "#include <QMessageBox>\n#include <QScrollBar>\n#include <QCommonStyle>\n\n#include \"KSTChatWidget.h\"\n#include \"ui_KSTChatWidget.h\"\n\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"data/StationProfile.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"KSTHighlighterSettingDialog.h\"\n#include \"rotator/Rotator.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.kstchatwidget\");\n\nKSTChatWidget::KSTChatWidget(int chatRoomIndex,\n                             const QString &username,\n                             const QString &password,\n                             const NewContactWidget *contact,\n                             QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::KSTChatWidget),\n    messageModel(new ChatMessageModel(this)),\n    valuableMessageModel(new ChatMessageModel(this)),\n    chat(new KSTChat(chatRoomIndex, username, password, contact, this)),\n    userListModel(new UserListModel(this)),\n    highlightEvaluator(new chatHighlightEvaluator(chatRoomIndex, this)),\n    userName(username)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->splitterMsgMsg->setSizes(QList<int>({1, 0}));\n    ui->splitterMsgUsr->setSizes(QList<int>({3, 1}));\n\n    ui->toLabel->setVisible(false);\n    ui->resetButton->setVisible(false);\n    setBeamActionVisible(Rotator::instance()->isRotConnected());\n\n    QCommonStyle style;\n    ui->resetButton->setIcon(style.standardIcon(QStyle::SP_LineEditClearButton));\n\n    proxyModel = new QSortFilterProxyModel(this);\n    proxyModel->setSourceModel(userListModel);\n    proxyModel->setSortRole(Qt::UserRole);\n    ui->usersTableView->setModel(proxyModel);\n    ui->usersTableView->setSortingEnabled(true);\n    ui->usersTableView->sortByColumn(0, Qt::AscendingOrder);\n    ui->usersTableView->setItemDelegateForColumn(2, new DistanceFormatDelegate(1, 0.1, ui->usersTableView));\n    ui->usersTableView->setItemDelegateForColumn(3, new UnitFormatDelegate(\"°\", 0, 0.1, ui->usersTableView));\n    ui->usersTableView->setItemDelegateForColumn(4, new HTMLDelegate(ui->usersTableView));\n    ui->usersTableView->horizontalHeader()->setSectionsMovable(true);\n    ui->usersTableView->addAction(ui->actionPrefillQSO);\n    ui->usersTableView->addAction(ui->actionBeam);\n    ui->usersTableView->addAction(ui->actionDisplayedColumns);\n\n    QAction *separator = new QAction(this);\n    separator->setSeparator(true);\n    ui->messageListView->setItemDelegate(new MessageDelegate(this));\n    ui->messageListView->setModel(messageModel);\n    ui->messageListView->addAction(ui->actionShowAboutMeOnly);\n    ui->messageListView->addAction(ui->actionSuppressUser2User);\n    ui->messageListView->addAction(ui->actionHighlight);\n    ui->messageListView->addAction(separator);\n    ui->messageListView->addAction(ui->actionHighlightRules);\n\n    ui->valuableMessageListView->setItemDelegate(new MessageDelegate(this));\n    ui->valuableMessageListView->setModel(valuableMessageModel);\n    ui->valuableMessageListView->addAction(ui->actionClearValuableMessages);\n\n    connect(chat.data(), &KSTChat::chatMsg,\n            this, &KSTChatWidget::addChatMessage);\n\n    connect(chat.data(), &KSTChat::chatError,\n            this, &KSTChatWidget::showChatError);\n\n    connect(chat.data(), &KSTChat::usersListUpdated,\n            this, &KSTChatWidget::updateUserList);\n\n    connect(chat.data(), &KSTChat::chatDisconnected,\n            this, &KSTChatWidget::closeChat);\n\n    connect(Rotator::instance(), &Rotator::rotConnected,\n            this, [this]()\n    {\n        setBeamActionVisible(true);\n    });\n\n    connect(Rotator::instance(), &Rotator::rotDisconnected,\n            this, [this]()\n    {\n        setBeamActionVisible(false);\n    });\n\n    chat->connectChat();\n}\n\nKSTChatWidget::~KSTChatWidget()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nQList<KSTUsersInfo> KSTChatWidget::getUserList()\n{\n    FCT_IDENTIFICATION;\n\n    return (chat.data()) ? chat->getUsersList() : QList<KSTUsersInfo>();\n}\n\nvoid KSTChatWidget::addChatMessage(KSTChatMsg msg)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << msg.time << msg.sender << msg.message;\n\n    if ( msg.message.isEmpty() )\n        return;\n\n    bool isMyCallsignPresent = msg.message.contains(userName,Qt::CaseInsensitive);\n    bool isSenderSelectedCallsign = ui->toLabel->isVisible()\n                                    && !msg.sender.isEmpty()\n                                    && msg.sender.startsWith(ui->toLabel->text());\n    bool isUser2User = msg.message.startsWith(\" (\"); //hack - how to easy to recognize Private Message\n    bool shouldHighlight = ui->actionHighlight->isChecked() && isHighlightCandidate(msg);\n\n    qCDebug(runtime) << \"AboutMe\" << isMyCallsignPresent;\n    qCDebug(runtime) << \"isUser2User\" << isUser2User;\n    qCDebug(runtime) << \"shouldHighlight\" << shouldHighlight;\n    qCDebug(runtime) << \"isSenderSelectedCallsign\" << isSenderSelectedCallsign;\n\n    // Filter incoming messages\n    // Empty callsign means server response, do not suppress it\n    if ( !msg.sender.isEmpty() )\n    {\n        if ( ! shouldHighlight && ! isSenderSelectedCallsign )\n        {\n            if ( ui->actionShowAboutMeOnly->isChecked() && !isMyCallsignPresent )\n                return;\n\n            if ( ui->actionSuppressUser2User->isChecked() && isUser2User)\n                return;\n        }\n    }\n\n    ChatMessageModel::MessageDirection dir = ChatMessageModel::INCOMING;\n\n    if ( shouldHighlight )\n    {\n        dir = ChatMessageModel::INCOMING_HIGHLIGHT;\n    }\n    else if ( isMyCallsignPresent || isSenderSelectedCallsign )\n    {\n        dir = ChatMessageModel::INCOMING_TOYOU;\n\n    }\n\n    if ( shouldHighlight\n         || isMyCallsignPresent\n         || isSenderSelectedCallsign )\n    {\n        valuableMessageModel->addMessage(dir, msg);\n        if ( ui->valuableMessageListView->verticalScrollBar()->value() == ui->valuableMessageListView->verticalScrollBar()->maximum() )\n            ui->valuableMessageListView->scrollToBottom();\n        emit valuableMessageUpdated(this);\n    }\n\n    messageModel->addMessage(dir, msg);\n\n    if ( ui->messageListView->verticalScrollBar()->value() == ui->messageListView->verticalScrollBar()->maximum() )\n        ui->messageListView->scrollToBottom();\n\n    emit chatUpdated(this);\n}\n\nvoid KSTChatWidget::sendMessage()\n{\n    FCT_IDENTIFICATION;\n\n    KSTChatMsg chatMsg;\n    QString command;\n\n    chatMsg.sender = tr(\"You\");\n    chatMsg.time = QDateTime::currentDateTimeUtc().toString(\"hhmm\");\n\n    if ( ui->toLabel->text() != QString() )\n    {\n        chatMsg.message = \"(\" + ui->toLabel->text() + \") \" + ui->msgLineEdit->text();\n        command = \"/cq \"\n                  + ui->toLabel->text()\n                  + \" \" + ui->msgLineEdit->text();\n    }\n    else\n    {\n        chatMsg.message = ui->msgLineEdit->text();\n        command = ui->msgLineEdit->text();\n    }\n\n    messageModel->addMessage(ChatMessageModel::OUTGOING,\n                             chatMsg);\n    valuableMessageModel->addMessage(ChatMessageModel::OUTGOING,\n                                  chatMsg);\n    ui->messageListView->scrollToBottom();\n    ui->valuableMessageListView->scrollToBottom();\n    chat->sendMessage(command);\n    ui->msgLineEdit->blockSignals(true);\n    ui->msgLineEdit->clear();\n    ui->msgLineEdit->blockSignals(false);\n}\n\nvoid KSTChatWidget::updateUserList()\n{\n    FCT_IDENTIFICATION;\n\n    userListModel->clear();\n    QList<KSTUsersInfo> usersList = chat->getUsersList();\n\n    // refresh user List\n    userListModel->updateList(usersList);\n\n    setSelectedCallsignInUserList(ui->toLabel->text());\n\n    emit userListUpdated(this);\n}\n\nvoid KSTChatWidget::setPrivateChatCallsign(QString callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    if ( callsign.isEmpty() )\n    {\n        resetPressed();\n        return;\n    }\n\n    ui->toLabel->setVisible(true);\n    ui->resetButton->setVisible(true);\n    ui->toLabel->setText(callsign);\n    setSelectedCallsignInUserList(callsign);\n}\n\nvoid KSTChatWidget::reloadStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    chat->reloadStationProfile();\n}\n\nvoid KSTChatWidget::setBeamActionVisible(bool flag)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << flag;\n\n    ui->actionBeam->setVisible(flag);\n}\n\nvoid KSTChatWidget::resetDupe()\n{\n    FCT_IDENTIFICATION;\n\n    chat->resetDupe();\n}\n\nvoid KSTChatWidget::recalculateDupe()\n{\n    FCT_IDENTIFICATION;\n\n    chat->recalculateDupe();\n}\n\nvoid KSTChatWidget::recalculateDxccStatus()\n{\n    FCT_IDENTIFICATION;\n\n    chat->recalculateDxccStatus();\n}\n\nvoid KSTChatWidget::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    chat->updateSpotsStatusWhenQSOAdded(record);\n}\n\nvoid KSTChatWidget::updateSpotsStatusWhenQSODeleted(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    chat->updateSpotsStatusWhenQSODeleted(record);\n\n}\n\nvoid KSTChatWidget::updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities)\n{\n    FCT_IDENTIFICATION;\n\n    chat->updateSpotsDxccStatusWhenQSODeleted(entities);\n}\n\nvoid KSTChatWidget::showChatError(const QString &error)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Error\"),\n                         QMessageBox::tr(\"Chat Error: \") + \" \" + error);\n}\n\nvoid KSTChatWidget::closeChat()\n{\n    FCT_IDENTIFICATION;\n\n    emit chatClosed();\n}\n\nvoid KSTChatWidget::displayedColumns()\n{\n    FCT_IDENTIFICATION;\n\n    ColumnSettingSimpleDialog dialog(ui->usersTableView);\n    dialog.exec();\n}\n\nvoid KSTChatWidget::userDoubleClicked(QModelIndex index)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &sourceIindex = proxyModel->mapToSource(index);\n    setPrivateChatCallsign(userListModel->getUserInfo(sourceIindex).callsign);\n}\n\nvoid KSTChatWidget::messageDoubleClicked(QModelIndex index)\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList messageSenderElements = messageModel->getMessage(index).sender.split(\" \");\n    if ( messageSenderElements.size() > 0 )\n        setPrivateChatCallsign(messageSenderElements.at(0));\n}\n\nvoid KSTChatWidget::prefillQSOAction()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &sourceIndex = proxyModel->mapToSource(ui->usersTableView->currentIndex());\n    const KSTUsersInfo &info = userListModel->getUserInfo(sourceIndex);\n    emit prepareQSOInfo(info.callsign, info.grid.getGrid());\n}\n\nvoid KSTChatWidget::highlightPressed()\n{\n    FCT_IDENTIFICATION;\n\n}\n\nbool KSTChatWidget::isHighlightCandidate(KSTChatMsg &msg)\n{\n    FCT_IDENTIFICATION;\n\n    return highlightEvaluator->shouldHighlight(msg, msg.matchedHighlightRules);\n}\n\nvoid KSTChatWidget::editHighlightRules()\n{\n    FCT_IDENTIFICATION;\n\n    KSTHighlighterSettingDialog dialog(this);\n    dialog.exec();\n    highlightEvaluator->loadRules();\n}\n\nvoid KSTChatWidget::resetPressed()\n{\n    FCT_IDENTIFICATION;\n\n    ui->msgLineEdit->clear();\n    ui->toLabel->clear();\n    ui->usersTableView->clearSelection();\n    ui->toLabel->setVisible(false);\n    ui->resetButton->setVisible(false);\n}\n\nvoid KSTChatWidget::beamingRequest()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &sourceIndex = proxyModel->mapToSource(ui->usersTableView->currentIndex());\n    const KSTUsersInfo &info = userListModel->getUserInfo(sourceIndex);\n\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    if ( !profile.locator.isEmpty() )\n    {\n        Gridsquare myGrid(profile.locator);\n\n        double bearing;\n        if ( myGrid.bearingTo(info.grid, bearing) )\n        {\n            emit beamingRequested(bearing);\n        }\n    }\n}\n\nvoid KSTChatWidget::clearValuableMessages()\n{\n    FCT_IDENTIFICATION;\n\n    valuableMessageModel->clear();\n}\n\nvoid KSTChatWidget::setSelectedCallsignInUserList(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    if ( callsign.isEmpty() )\n        return;\n\n    const QModelIndexList &nextMatches = proxyModel->match(proxyModel->index(0,0), Qt::DisplayRole, callsign, 1, Qt::MatchExactly);\n\n    if ( nextMatches.size() >= 1 )\n    {\n        ui->usersTableView->setCurrentIndex(nextMatches.at(0));\n    }\n}\n\nint ChatMessageModel::rowCount(const QModelIndex &) const\n{\n    return messages.size();\n}\n\nQVariant ChatMessageModel::data(const QModelIndex &index, int role) const\n{\n    if ( role == Qt::UserRole )\n    {\n        return messages.at(index.row()).first;\n    }\n    if ( role == Qt::DisplayRole )\n    {\n        const KSTChatMsg &msg = messages.at(index.row()).second;\n        QString text(msg.message);\n        text.replace(\"\\n\", \"<br/>\");\n\n        QString htmlText;\n        if ( !text.isEmpty() )\n        {\n            // <font size=\\\"2\\\">%1<b style=\\\"color: magenta\\\"> %2</b></font><br/>%3\n            htmlText = QString(\"<font size=\\\"2\\\">%1 %2 %3</b></font><br/>%4\").arg(msg.time,\n                                                                                  msg.sender.isEmpty() ? \"Server\" : msg.sender,\n                                                                                  !msg.matchedHighlightRules.isEmpty() ? \"(\" + msg.matchedHighlightRules.join(\", \") + \")\" : \"\",\n                                                                                  text);\n\n        }\n        return htmlText;\n    }\n    return QVariant();\n}\n\nvoid ChatMessageModel::addMessage(MessageDirection direction,\n                                  const KSTChatMsg &msg)\n{\n    beginInsertRows(QModelIndex(), messages.size(), messages.size()+1);\n    messages.append(QPair<int, KSTChatMsg>(direction, msg));\n    endInsertRows();\n}\n\nvoid ChatMessageModel::clear()\n{\n    FCT_IDENTIFICATION;\n    beginResetModel();\n    messages.clear();\n    endResetModel();\n}\n\nKSTChatMsg ChatMessageModel::getMessage(const QModelIndex &index) const\n{\n    FCT_IDENTIFICATION;\n    return messages.at(index.row()).second;\n}\n\nvoid MessageDelegate::paint(QPainter *painter,\n                            const QStyleOptionViewItem &option,\n                            const QModelIndex &index) const\n{\n    //https://forum.qt.io/topic/91480/implementing-chat-type-listview-with-text-bubbles/6\n\n    QTextDocument bodydoc;\n    QTextOption textOption(bodydoc.defaultTextOption());\n    QString bodytext(index.data(Qt::DisplayRole).toString());\n\n    bool outgoing = (index.data(Qt::UserRole).toInt() == ChatMessageModel::MessageDirection::OUTGOING);\n\n    qreal contentswidth = option.rect.width() * d_widthfraction\n                          - d_horizontalmargin - d_pointerwidth\n                          - d_leftpadding - d_rightpadding;\n\n    textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);\n    bodydoc.setDefaultTextOption(textOption);\n    bodydoc.setHtml(bodytext);\n    bodydoc.setTextWidth(contentswidth);\n\n    qreal bodyheight = bodydoc.size().height();\n\n    painter->save();\n    painter->setRenderHint(QPainter::Antialiasing);\n\n    // uncomment to see the area provided to paint this item\n    //painter->drawRect(option.rect);\n\n    painter->translate(option.rect.left() + d_horizontalmargin,\n                       option.rect.top() + ((index.row() == 0) ? d_verticalmargin : 0));\n\n    // background color for chat bubble\n    QColor bgcolor;\n\n    switch ( index.data(Qt::UserRole).toInt() )\n    {\n    case ChatMessageModel::MessageDirection::OUTGOING:\n        bgcolor =\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                  QColorConstants::LightGray;\n#else\n        QColor(Qt::lightGray);\n#endif\n        break;\n    case ChatMessageModel::MessageDirection::INCOMING_TOYOU:\n        bgcolor =\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                  QColorConstants::Green;\n#else\n                  QColor(Qt::green);\n#endif\n        break;\n    case ChatMessageModel::MessageDirection::INCOMING_HIGHLIGHT:\n        bgcolor =\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                  QColorConstants::Red;\n#else\n                  QColor(Qt::red);\n#endif\n        break;\n    default:\n        bgcolor =\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n                  QColorConstants::Cyan;\n#else\n                  QColor(Qt::cyan);\n#endif\n    }\n\n    // create chat bubble\n    QPainterPath pointie;\n\n    // left bottom\n    pointie.moveTo(0, bodyheight + d_toppadding + d_bottompadding);\n\n    // right bottom\n    pointie.lineTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - d_radius,\n                   bodyheight + d_toppadding + d_bottompadding);\n    pointie.arcTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - 2 * d_radius,\n                  bodyheight + d_toppadding + d_bottompadding - 2 * d_radius,\n                  2 * d_radius, 2 * d_radius, 270, 90);\n\n    // right top\n    pointie.lineTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding, 0 + d_radius);\n    pointie.arcTo(0 + contentswidth + d_pointerwidth + d_leftpadding + d_rightpadding - 2 * d_radius, 0,\n                  2 * d_radius, 2 * d_radius, 0, 90);\n\n    // left top\n    pointie.lineTo(0 + d_pointerwidth + d_radius, 0);\n    pointie.arcTo(0 + d_pointerwidth, 0, 2 * d_radius, 2 * d_radius, 90, 90);\n\n    // left bottom almost (here is the pointie)\n    pointie.lineTo(0 + d_pointerwidth, bodyheight + d_toppadding + d_bottompadding - d_pointerheight);\n    pointie.closeSubpath();\n\n    // rotate bubble for outgoing messages\n    if (!outgoing)\n    {\n        painter->translate(option.rect.width() - pointie.boundingRect().width() - d_horizontalmargin - d_pointerwidth, 0);\n        painter->translate(pointie.boundingRect().center());\n        painter->rotate(180);\n        painter->translate(-pointie.boundingRect().center());\n    }\n\n    painter->setPen(QPen(bgcolor));\n    painter->drawPath(pointie);\n    painter->fillPath(pointie, QBrush(bgcolor));\n\n    // rotate back or painter is going to paint the text rotated\n    if (!outgoing)\n    {\n        painter->translate(pointie.boundingRect().center());\n        painter->rotate(-180);\n        painter->translate(-pointie.boundingRect().center());\n    }\n\n    QAbstractTextDocumentLayout::PaintContext ctx;\n    //if (outgoing)\n    ctx.palette.setColor(QPalette::Text, QColor(\"black\"));\n    //else\n    //ctx.palette.setColor(QPalette::Text, QColor(\"white\"));\n\n    painter->translate((!outgoing ? 0 : d_pointerwidth) + d_leftpadding, 0);\n    bodydoc.documentLayout()->draw(painter, ctx);\n    painter->restore();\n}\n\nQSize MessageDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const\n{\n    QTextDocument bodydoc;\n    QTextOption textOption(bodydoc.defaultTextOption());\n    QString bodytext(index.data(Qt::DisplayRole).toString());\n\n    textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);\n    bodydoc.setDefaultTextOption(textOption);\n    bodydoc.setHtml(bodytext);\n\n    // the width of the contents are the (a fraction of the window width) minus (margins + padding + width of the bubble's tail)\n    qreal contentswidth = option.rect.width() * d_widthfraction\n                          - d_horizontalmargin - d_pointerwidth\n                          - d_leftpadding - d_rightpadding;\n\n    // set this available width on the text document\n    bodydoc.setTextWidth(contentswidth);\n\n    QSize size(bodydoc.idealWidth() + d_horizontalmargin + d_pointerwidth + d_leftpadding + d_rightpadding,\n               bodydoc.size().height() + d_bottompadding + d_toppadding + d_verticalmargin + 1);\n\n    if (index.row() == 0) // have extra margin at top of first item\n        size += QSize(0, d_verticalmargin);\n\n    return size;\n}\n\nint UserListModel::rowCount(const QModelIndex &) const\n{\n    return userData.count();\n}\n\nint UserListModel::columnCount(const QModelIndex &) const\n{\n    return 5;\n}\n\nQVariant UserListModel::data(const QModelIndex &index, int role) const\n{\n    const KSTUsersInfo &userInfo = userData.at(index.row());\n\n    if ( role == Qt::DisplayRole )\n    {\n        switch ( index.column() )\n        {\n        case 0:\n            return userInfo.callsign;\n            break;\n        case 1:\n            if ( userInfo.grid.isValid() )\n                return userInfo.grid.getGrid();\n            else\n                return QString();\n            break;\n        case 2:\n        case 3:\n        {\n            const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n            if ( !profile.locator.isEmpty() )\n            {\n                Gridsquare myGrid(profile.locator);\n\n                if ( index.column() == 2 )\n                {\n                    double distance;\n                    if (  myGrid.distanceTo(userInfo.grid, distance) )\n                    {\n                        return QString::number(distance, 'f', 1);\n                    }\n                }\n\n                if ( index.column() == 3 )\n                {\n                    double bearing;\n                    if ( myGrid.bearingTo(userInfo.grid, bearing) )\n                    {\n                        return QString::number(bearing, 'f', 0);\n                    }\n                }\n            }\n            return QString();\n        }\n            break;\n        case 4:\n            return userInfo.stationComment;\n            break;\n        default:\n            return QVariant();\n        }\n    }\n    else if ( index.column() == 0 && role == Qt::BackgroundRole)\n    {\n        return Data::statusToColor(userInfo.status, userInfo.dupeCount, QColor(Qt::transparent));\n    }\n    else if (index.column() == 0 && role == Qt::ToolTipRole)\n    {\n        return QCoreApplication::translate(\"DBStrings\", userInfo.dxcc.country.toUtf8().constData()) + \" [\" + Data::statusToText(userInfo.status) + \"]\";\n    }\n    else if ( role == Qt::UserRole )\n    {\n        switch ( index.column() )\n        {\n        case 2:\n            return data(index,Qt::DisplayRole).toFloat();\n            break;\n        case 3:\n            return data(index,Qt::DisplayRole).toInt();\n            break;\n        default:\n            return data(index, Qt::DisplayRole);\n        }\n    }\n\n    return QVariant();\n}\n\nQVariant UserListModel::headerData(int section, Qt::Orientation orientation, int role) const\n{\n    if ( role != Qt::DisplayRole || orientation != Qt::Horizontal )\n        return QVariant();\n\n    switch (section)\n    {\n    case 0: return tr(\"Callsign\");\n    case 1: return tr(\"Gridsquare\");\n    case 2: return tr(\"Distance\");\n    case 3: return tr(\"Azimuth\");\n    case 4: return tr(\"Comment\");\n    default: return QVariant();\n    }\n}\n\nvoid UserListModel::updateList(const QList<KSTUsersInfo> &userList)\n{\n    beginResetModel();\n    userData = userList;\n    endResetModel();\n}\n\nvoid UserListModel::clear()\n{\n    beginResetModel();\n    userData.clear();\n    endResetModel();\n}\n\nKSTUsersInfo UserListModel::getUserInfo(const QModelIndex &index) const\n{\n    return userData.at(index.row());\n}\n\nvoid HTMLDelegate::paint(QPainter* painter, const QStyleOptionViewItem & inOption, const QModelIndex &index) const\n{\n    QStyleOptionViewItem option = inOption;\n    initStyleOption(&option, index);\n\n    QStyle *style = option.widget? option.widget->style() : QApplication::style();\n    QTextDocument doc;\n\n    doc.setHtml(option.text);\n    option.text = QString();\n    style->drawControl(QStyle::CE_ItemViewItem, &option, painter);\n\n    QAbstractTextDocumentLayout::PaintContext ctx;\n\n    // Highlighting text if item is selected\n    if (option.state & QStyle::State_Selected)\n        ctx.palette.setColor(QPalette::Text,\n                             option.palette.color(QPalette::Active, QPalette::HighlightedText));\n\n    QRect textRect = style->subElementRect(QStyle::SE_ItemViewItemText, &option);\n    painter->save();\n    painter->translate(textRect.topLeft());\n    painter->setClipRect(textRect.translated(-textRect.topLeft()));\n    doc.documentLayout()->draw(painter, ctx);\n    painter->restore();\n}\n\nQSize HTMLDelegate::sizeHint ( const QStyleOptionViewItem & inOption, const QModelIndex & index ) const\n{\n    QStyleOptionViewItem option = inOption;\n    initStyleOption(&option, index);\n\n    QTextDocument doc;\n    doc.setHtml(option.text);\n    doc.setTextWidth(option.rect.width());\n    return QSize(doc.idealWidth(), doc.size().height());\n}\n"
  },
  {
    "path": "ui/KSTChatWidget.h",
    "content": "﻿#ifndef QLOG_UI_KSTCHATWIDGET_H\n#define QLOG_UI_KSTCHATWIDGET_H\n\n#include <QWidget>\n#include <QPointer>\n\n#include <QPainterPath>\n#include <QAbstractTextDocumentLayout>\n\n#include <QListView>\n#include <QMainWindow>\n#include <QPushButton>\n#include <QStyledItemDelegate>\n#include <QTextDocument>\n#include <QTextOption>\n#include <QVBoxLayout>\n#include <QWidget>\n#include <QMargins>\n#include <QPainter>\n\n#include \"service/kstchat/KSTChat.h\"\n#include \"ui/NewContactWidget.h\"\n\nnamespace Ui {\nclass KSTChatWidget;\n}\n\nclass ChatMessageModel : public QAbstractListModel\n{\npublic:\n    enum MessageDirection\n    {\n        OUTGOING = 0,\n        INCOMING = 1,\n        INCOMING_TOYOU = 2,\n        INCOMING_HIGHLIGHT = 3\n    };\n\npublic:\n\n    explicit ChatMessageModel(QObject* parent = nullptr) :\n        QAbstractListModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const override;\n    QVariant data(const QModelIndex& index,\n                  int role = Qt::DisplayRole) const override;\n    void addMessage(MessageDirection direction,\n                    const KSTChatMsg &msg);\n    void clear();\n    KSTChatMsg getMessage(const QModelIndex &index) const;\n\nprivate:\n    QList<QPair<int, KSTChatMsg>> messages;\n};\n\nclass HTMLDelegate : public QStyledItemDelegate\n{\npublic:\n    explicit HTMLDelegate(QObject* parent = nullptr) :\n        QStyledItemDelegate(parent){};\n\nprotected:\n    void paint ( QPainter * painter, const QStyleOptionViewItem & inOption, const QModelIndex & index ) const;\n    QSize sizeHint ( const QStyleOptionViewItem & inOption, const QModelIndex & index ) const;\n};\n\nclass MessageDelegate : public QStyledItemDelegate\n{\n\npublic:\n\n    explicit MessageDelegate(QObject* parent = nullptr) :\n        QStyledItemDelegate(parent),\n        d_radius(10),\n        d_toppadding(0),\n        d_bottompadding(0),\n        d_leftpadding(2),\n        d_rightpadding(2),\n        d_verticalmargin(2),\n        d_horizontalmargin(2),\n        d_pointerwidth(5),\n        d_pointerheight(5),\n        d_widthfraction(0.95) {}\n\n    void paint(QPainter* painter,\n               const QStyleOptionViewItem& option,\n               const QModelIndex& index) const override;\n    QSize sizeHint(const QStyleOptionViewItem& option,\n                   const QModelIndex& index) const override;\n\nprivate:\n    int d_radius;\n    int d_toppadding;\n    int d_bottompadding;\n    int d_leftpadding;\n    int d_rightpadding;\n    int d_verticalmargin;\n    int d_horizontalmargin;\n    int d_pointerwidth;\n    int d_pointerheight;\n    float d_widthfraction;\n};\n\nclass UserListModel : public QAbstractTableModel {\n    Q_OBJECT\n\npublic:\n    UserListModel(QObject* parent = 0) : QAbstractTableModel(parent) {}\n\n    int rowCount(const QModelIndex& parent = QModelIndex()) const;\n    int columnCount(const QModelIndex& parent = QModelIndex()) const;\n    QVariant data(const QModelIndex& index, int role) const;\n    QVariant headerData(int section, Qt::Orientation orientation,\n                        int role = Qt::DisplayRole) const;\n    void updateList(const QList<KSTUsersInfo> &userList);\n    void clear();\n\n    KSTUsersInfo getUserInfo(const QModelIndex &index) const;\n\nprivate:\n    QList<KSTUsersInfo> userData;\n};\n\nclass KSTChatWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit KSTChatWidget(int chatRoomIndex,\n                           const QString& username,\n                           const QString& password,\n                           const NewContactWidget *,\n                           QWidget *parent = nullptr);\n    ~KSTChatWidget();\n\n    QList<KSTUsersInfo> getUserList();\n\nsignals:\n    void chatClosed();\n    void chatUpdated(QWidget *);\n    void valuableMessageUpdated(QWidget *);\n    void prepareQSOInfo(QString, QString);\n    void userListUpdated(QWidget *);\n    void beamingRequested(double);\n\npublic slots:\n    void addChatMessage(KSTChatMsg);\n    void sendMessage();\n    void updateUserList();\n    void setPrivateChatCallsign(QString);\n    void reloadStationProfile();\n    void setBeamActionVisible(bool);\n    void resetDupe();\n    void recalculateDupe();\n    void recalculateDxccStatus();\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n    void updateSpotsStatusWhenQSODeleted(const QSqlRecord &record);\n    void updateSpotsDxccStatusWhenQSODeleted(const QSet<uint> &entities);\n\nprivate slots:\n    void showChatError(const QString &);\n    void closeChat();\n    void displayedColumns();\n    void userDoubleClicked(QModelIndex);\n    void messageDoubleClicked(QModelIndex);\n    void prefillQSOAction();\n    void highlightPressed();\n    bool isHighlightCandidate(KSTChatMsg &);\n    void editHighlightRules();\n    void resetPressed();\n    void beamingRequest();\n    void clearValuableMessages();\nprivate:\n    Ui::KSTChatWidget *ui;\n    QPointer<ChatMessageModel> messageModel;\n    QPointer<ChatMessageModel> valuableMessageModel;\n    QPointer<KSTChat> chat;\n    UserListModel* userListModel;\n    QSortFilterProxyModel * proxyModel;\n    QPointer<chatHighlightEvaluator> highlightEvaluator;\n    QString userName;\n\n    void setSelectedCallsignInUserList(const QString &);\n};\n\n#endif // QLOG_UI_KSTCHATWIDGET_H\n"
  },
  {
    "path": "ui/KSTChatWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>KSTChatWidget</class>\n <widget class=\"QWidget\" name=\"KSTChatWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>374</width>\n    <height>197</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string notr=\"true\">Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <widget class=\"QSplitter\" name=\"splitterMsgUsr\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"handleWidth\">\n      <number>4</number>\n     </property>\n     <widget class=\"QWidget\" name=\"verticalLayoutWidget\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QSplitter\" name=\"splitterMsgMsg\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <widget class=\"QListView\" name=\"messageListView\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"minimumSize\">\n           <size>\n            <width>250</width>\n            <height>0</height>\n           </size>\n          </property>\n          <property name=\"focusPolicy\">\n           <enum>Qt::ClickFocus</enum>\n          </property>\n          <property name=\"contextMenuPolicy\">\n           <enum>Qt::ActionsContextMenu</enum>\n          </property>\n          <property name=\"toolTip\">\n           <string>Chat messages</string>\n          </property>\n          <property name=\"sizeAdjustPolicy\">\n           <enum>QAbstractScrollArea::AdjustToContents</enum>\n          </property>\n          <property name=\"editTriggers\">\n           <set>QAbstractItemView::NoEditTriggers</set>\n          </property>\n          <property name=\"showDropIndicator\" stdset=\"0\">\n           <bool>false</bool>\n          </property>\n          <property name=\"defaultDropAction\">\n           <enum>Qt::IgnoreAction</enum>\n          </property>\n          <property name=\"selectionMode\">\n           <enum>QAbstractItemView::NoSelection</enum>\n          </property>\n          <property name=\"verticalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"horizontalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"movement\">\n           <enum>QListView::Static</enum>\n          </property>\n          <property name=\"isWrapping\" stdset=\"0\">\n           <bool>false</bool>\n          </property>\n          <property name=\"resizeMode\">\n           <enum>QListView::Adjust</enum>\n          </property>\n          <property name=\"wordWrap\">\n           <bool>true</bool>\n          </property>\n         </widget>\n         <widget class=\"QListView\" name=\"valuableMessageListView\">\n          <property name=\"focusPolicy\">\n           <enum>Qt::ClickFocus</enum>\n          </property>\n          <property name=\"contextMenuPolicy\">\n           <enum>Qt::ActionsContextMenu</enum>\n          </property>\n          <property name=\"toolTip\">\n           <string>Valuable messages</string>\n          </property>\n          <property name=\"verticalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"horizontalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n         </widget>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QTableView\" name=\"usersTableView\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Expanding\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <property name=\"minimumSize\">\n       <size>\n        <width>100</width>\n        <height>0</height>\n       </size>\n      </property>\n      <property name=\"focusPolicy\">\n       <enum>Qt::ClickFocus</enum>\n      </property>\n      <property name=\"contextMenuPolicy\">\n       <enum>Qt::ActionsContextMenu</enum>\n      </property>\n      <property name=\"editTriggers\">\n       <set>QAbstractItemView::NoEditTriggers</set>\n      </property>\n      <property name=\"alternatingRowColors\">\n       <bool>true</bool>\n      </property>\n      <property name=\"selectionMode\">\n       <enum>QAbstractItemView::ExtendedSelection</enum>\n      </property>\n      <property name=\"selectionBehavior\">\n       <enum>QAbstractItemView::SelectRows</enum>\n      </property>\n      <property name=\"verticalScrollMode\">\n       <enum>QAbstractItemView::ScrollPerPixel</enum>\n      </property>\n      <property name=\"horizontalScrollMode\">\n       <enum>QAbstractItemView::ScrollPerPixel</enum>\n      </property>\n      <attribute name=\"horizontalHeaderStretchLastSection\">\n       <bool>true</bool>\n      </attribute>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"toLabel\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"resetButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"toolTip\">\n        <string>Clear selected Callsign and Chat message entry.</string>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"iconSize\">\n        <size>\n         <width>16</width>\n         <height>16</height>\n        </size>\n       </property>\n       <property name=\"flat\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLineEdit\" name=\"msgLineEdit\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Send chat message</string>\n       </property>\n       <property name=\"clearButtonEnabled\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionDisplayedColumns\">\n   <property name=\"text\">\n    <string>Column Visibility</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Which columns should be displayed</string>\n   </property>\n  </action>\n  <action name=\"actionPrefillQSO\">\n   <property name=\"text\">\n    <string>Prepare QSO</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Transfer Callsign and Gridsquare Information to the New QSO dialog</string>\n   </property>\n  </action>\n  <action name=\"actionShowAboutMeOnly\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Show About Me Only</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Show only messages where my callsign is present</string>\n   </property>\n  </action>\n  <action name=\"actionSuppressUser2User\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Suppress User To User</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Suppress private messages between two callsigns</string>\n   </property>\n  </action>\n  <action name=\"actionHighlight\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Highlight</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Highlight messages based on the setting</string>\n   </property>\n  </action>\n  <action name=\"actionHighlightRules\">\n   <property name=\"text\">\n    <string>Highlight Rules</string>\n   </property>\n  </action>\n  <action name=\"actionBeam\">\n   <property name=\"text\">\n    <string>Beam</string>\n   </property>\n  </action>\n  <action name=\"actionClearValuableMessages\">\n   <property name=\"text\">\n    <string>Clear Messages</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Clear all messages in the window</string>\n   </property>\n  </action>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>msgLineEdit</sender>\n   <signal>returnPressed()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>sendMessage()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>245</x>\n     <y>248</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDisplayedColumns</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>displayedColumns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>usersTableView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>userDoubleClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>327</x>\n     <y>104</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionPrefillQSO</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>prefillQSOAction()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionHighlight</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>highlightPressed()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionHighlightRules</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>editHighlightRules()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>resetButton</sender>\n   <signal>clicked()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>resetPressed()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>109</x>\n     <y>218</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>messageListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>messageDoubleClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>133</x>\n     <y>104</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionBeam</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>beamingRequest()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>200</x>\n     <y>120</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionClearValuableMessages</sender>\n   <signal>triggered()</signal>\n   <receiver>KSTChatWidget</receiver>\n   <slot>clearValuableMessages()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>186</x>\n     <y>98</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>sendMessage()</slot>\n  <slot>displayedColumns()</slot>\n  <slot>userDoubleClicked(QModelIndex)</slot>\n  <slot>prefillQSOAction()</slot>\n  <slot>applyMessageFilter()</slot>\n  <slot>toComboChanged(int)</slot>\n  <slot>highlightPressed()</slot>\n  <slot>editHighlightRules()</slot>\n  <slot>resetPressed()</slot>\n  <slot>messageDoubleClicked(QModelIndex)</slot>\n  <slot>beamingRequest()</slot>\n  <slot>clearValuableMessages()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/KSTHighlightRuleDetail.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlRecord>\n#include <QSqlError>\n#include <QMessageBox>\n\n#include \"KSTHighlightRuleDetail.h\"\n#include \"ui_KSTHighlightRuleDetail.h\"\n#include \"core/debug.h\"\n#include \"service/kstchat/KSTChat.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.ksthightlightruledetail\");\n\nKSTHighlightRuleDetail::KSTHighlightRuleDetail(const QString &ruleName,\n                                               QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::KSTHighlightRuleDetail),\n    condCount(0)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->roomCombo->addItem(tr(\"All\"));\n    ui->roomCombo->addItems(KSTChat::chatRooms);\n\n    if ( ! ruleName.isEmpty() )\n    {\n        loadRule(ruleName);\n    }\n    else\n    {\n        /* get Rules name from DB to checking whether a new rule name\n         * will be unique */\n        ruleNamesList = chatHighlightEvaluator::getAllRuleNames();\n    }\n}\n\nKSTHighlightRuleDetail::~KSTHighlightRuleDetail()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nvoid KSTHighlightRuleDetail::addCondition(int fieldIdx, int operatorId, QString value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"FieldIDX: \" << fieldIdx << \" Operator: \" << operatorId << \" Value: \" << value;\n\n    QHBoxLayout* conditionLayout = new QHBoxLayout();\n    conditionLayout->setObjectName(QString::fromUtf8(\"conditionLayout%1\").arg(condCount));\n\n    /***************/\n    /* Field Combo */\n    /***************/\n    QComboBox* fieldNameCombo = new QComboBox();\n    fieldNameCombo->setObjectName(QString::fromUtf8(\"fieldNameCombo%1\").arg(condCount));\n    QSizePolicy sizePolicy1(QSizePolicy::Maximum, QSizePolicy::Fixed);\n    sizePolicy1.setHorizontalStretch(0);\n    sizePolicy1.setVerticalStretch(0);\n    sizePolicy1.setHeightForWidth(fieldNameCombo->sizePolicy().hasHeightForWidth());\n    fieldNameCombo->setSizePolicy(sizePolicy1);\n    fieldNameCombo->addItem(tr(\"Sender\"));\n    fieldNameCombo->addItem(tr(\"Message\"));\n    fieldNameCombo->addItem(tr(\"Gridsquare\"));\n\n    if ( fieldIdx >= 0 )\n    {\n        fieldNameCombo->setCurrentIndex(fieldIdx);\n    }\n\n    conditionLayout->addWidget(fieldNameCombo);\n\n    /*******************/\n    /* Condition Combo */\n    /*******************/\n    QComboBox* conditionCombo = new QComboBox();\n    conditionCombo->addItem(QString(tr(\"Contains\")));\n    conditionCombo->addItem(QString(tr(\"Starts with\")));\n    conditionCombo->setObjectName(QString::fromUtf8(\"conditionCombo%1\").arg(condCount));\n\n    if ( operatorId >= 0 )\n    {\n        conditionCombo->setCurrentIndex(operatorId);\n    }\n\n    conditionLayout->addWidget(conditionCombo);\n\n    /**************/\n    /* Value Edit */\n    /**************/\n    QLineEdit* valueEdit = new QLineEdit();\n    valueEdit->setObjectName(QString::fromUtf8(\"valueLineEdit%1\").arg(condCount));\n    QSizePolicy sizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);\n    sizePolicy.setHorizontalStretch(0);\n    sizePolicy.setVerticalStretch(0);\n    valueEdit->setSizePolicy(sizePolicy);\n    valueEdit->setText(value);\n    conditionLayout->addWidget(valueEdit);\n\n    /*****************/\n    /* Remove Button */\n    /*****************/\n    QPushButton* removeButton = new QPushButton(tr(\"Remove\"));\n    removeButton->setObjectName(QString::fromUtf8(\"removeButton%1\").arg(condCount));\n    QSizePolicy sizePolicy3(QSizePolicy::Maximum, QSizePolicy::Fixed);\n    removeButton->setSizePolicy(sizePolicy3);\n\n    conditionLayout->addWidget(removeButton);\n\n    connect(removeButton, &QPushButton::clicked, this, [conditionLayout]()\n    {\n        QLayoutItem *item = NULL;\n        while ((item = conditionLayout->takeAt(0)) != 0)\n        {\n            delete item->widget();\n            delete item;\n        }\n        conditionLayout->deleteLater();\n    });\n\n    /**************************/\n    /* Add to the main layout */\n    /**************************/\n    ui->conditionsLayout->addLayout(conditionLayout);\n\n    condCount++;\n}\n\nvoid KSTHighlightRuleDetail::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->ruleLineEdit->text().isEmpty() )\n    {\n        ui->ruleLineEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ruleExists(ui->ruleLineEdit->text()) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Filter name is already exists.\"));\n        return;\n    }\n\n    chatHighlightRule rule;\n\n    rule.ruleName = ui->ruleLineEdit->text();\n    rule.ruleRoomIndex = ui->roomCombo->currentIndex();\n    rule.enabled = ui->enabledCheckbox->isChecked();\n    rule.interConditionOperand = static_cast<chatHighlightRule::InterConditionOperand>(ui->matchCombo->currentIndex());\n\n    const QList<QHBoxLayout *> &conditionLayouts = ui->conditionsLayout->findChildren<QHBoxLayout *>();\n    for (auto &conditionLine: conditionLayouts )\n    {\n        chatHighlightRule::Condition condition;\n        for ( int i = 0; i < 3; i++ )\n        {\n            QString objectName = conditionLine->itemAt(i)->widget()->objectName();\n            if ( objectName.contains(\"fieldNameCom\") )\n            {\n               condition.source = static_cast<chatHighlightRule::InfoSource>(dynamic_cast<QComboBox*>(conditionLine->itemAt(i)->widget())->currentIndex());\n            }\n\n            if ( objectName.contains(\"conditionCombo\") )\n            {\n                condition.operatorID = static_cast<chatHighlightRule::Operator>(dynamic_cast<QComboBox*>(conditionLine->itemAt(i)->widget())->currentIndex());\n            }\n            if ( objectName.contains(\"valueLineEdit\") )\n            {\n                 condition.value = dynamic_cast<QLineEdit*>(conditionLine->itemAt(i)->widget())->text();\n            }\n        }\n        qCDebug(runtime)<< \"Condition Values: \" << ui->ruleLineEdit->text() << \" \" << condition.source\n                        << \" \" << condition.operatorID << \" \" << condition.value;\n\n        rule.conditions << condition;\n    }\n    rule.save();\n    accept();\n}\n\nvoid KSTHighlightRuleDetail::ruleNameChanged(const QString &newRuleName)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n\n    if ( ruleExists(newRuleName) )\n    {\n        p.setColor(QPalette::Text,Qt::red);\n    }\n    else\n    {\n        p.setColor(QPalette::Text,qApp->palette().text().color());\n    }\n\n    ui->ruleLineEdit->setPalette(p);\n}\n\nvoid KSTHighlightRuleDetail::loadRule(const QString &ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    chatHighlightRule rule;\n\n    if ( !rule.load(ruleName) )\n    {\n        qWarning() << \"Cannot load rule \" << ruleName;\n    }\n    ui->ruleLineEdit->setText(ruleName);\n    ui->ruleLineEdit->setEnabled(false);\n\n    ui->roomCombo->setCurrentIndex(rule.ruleRoomIndex);\n    ui->enabledCheckbox->setChecked(rule.enabled);\n    ui->matchCombo->setCurrentIndex(rule.interConditionOperand);\n\n    for ( const chatHighlightRule::Condition &condition : static_cast<const QList<chatHighlightRule::Condition>&>(rule.conditions))\n    {\n        addCondition(condition.source,\n                     condition.operatorID,\n                     condition.value);\n    }\n}\n\nbool KSTHighlightRuleDetail::ruleExists(const QString &ruleName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << ruleName;\n\n    return ruleNamesList.contains(ruleName);\n}\n"
  },
  {
    "path": "ui/KSTHighlightRuleDetail.h",
    "content": "#ifndef QLOG_UI_KSTHIGHLIGHTRULEDETAIL_H\n#define QLOG_UI_KSTHIGHLIGHTRULEDETAIL_H\n\n#include <QDialog>\n\nnamespace Ui {\nclass KSTHighlightRuleDetail;\n}\n\nclass KSTHighlightRuleDetail : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit KSTHighlightRuleDetail(const QString &ruleName = QString(),\n                                    QWidget *parent = nullptr);\n    ~KSTHighlightRuleDetail();\n\n\npublic slots:\n    void addCondition(int fieldIdx = -1, int operatorId = -1, QString value = QString());\n    void save();\n    void ruleNameChanged(const QString&);\n\nprivate:\n    Ui::KSTHighlightRuleDetail *ui;\n    QStringList ruleNamesList;\n    int condCount;\n\n    void loadRule(const QString &ruleName);\n    bool ruleExists(const QString &);\n};\n\n#endif // QLOG_UI_KSTHIGHLIGHTRULEDETAIL_H\n"
  },
  {
    "path": "ui/KSTHighlightRuleDetail.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>KSTHighlightRuleDetail</class>\n <widget class=\"QDialog\" name=\"KSTHighlightRuleDetail\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>563</width>\n    <height>265</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Edit Rule</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <item>\n      <layout class=\"QFormLayout\" name=\"titleLayout_3\">\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QLabel\" name=\"ruleNameLabel\">\n         <property name=\"text\">\n          <string>Rule Name</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"1\">\n        <widget class=\"QLineEdit\" name=\"ruleLineEdit\">\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <widget class=\"QLabel\" name=\"roomLabel\">\n         <property name=\"text\">\n          <string>Chat Room</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"1\">\n        <widget class=\"QComboBox\" name=\"roomCombo\"/>\n       </item>\n       <item row=\"2\" column=\"0\">\n        <widget class=\"QLabel\" name=\"enabledLabel\">\n         <property name=\"text\">\n          <string>Enabled</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"2\" column=\"1\">\n        <widget class=\"QCheckBox\" name=\"enabledCheckbox\">\n         <property name=\"layoutDirection\">\n          <enum>Qt::LeftToRight</enum>\n         </property>\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n       <item row=\"3\" column=\"0\">\n        <widget class=\"QLabel\" name=\"matchLabel\">\n         <property name=\"text\">\n          <string>Highlight message which match</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"3\" column=\"1\">\n        <widget class=\"QComboBox\" name=\"matchCombo\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <item>\n          <property name=\"text\">\n           <string>All the following conditions</string>\n          </property>\n         </item>\n         <item>\n          <property name=\"text\">\n           <string>Any of the following conditions</string>\n          </property>\n         </item>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer_2\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeType\">\n      <enum>QSizePolicy::Preferred</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>10</width>\n       <height>20</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"conditionsLayout\"/>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n     <item>\n      <widget class=\"QPushButton\" name=\"addConditionButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Add Condition</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_6\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>KSTHighlightRuleDetail</receiver>\n   <slot>save()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>KSTHighlightRuleDetail</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>ruleLineEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>KSTHighlightRuleDetail</receiver>\n   <slot>ruleNameChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>368</x>\n     <y>23</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>281</x>\n     <y>132</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addConditionButton</sender>\n   <signal>clicked()</signal>\n   <receiver>KSTHighlightRuleDetail</receiver>\n   <slot>addCondition()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>62</x>\n     <y>125</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>281</x>\n     <y>132</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>ruleNameChanged(QString)</slot>\n  <slot>addCondition()</slot>\n  <slot>save()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/KSTHighlighterSettingDialog.cpp",
    "content": "#include \"KSTHighlighterSettingDialog.h\"\n#include \"ui_KSTHighlighterSettingDialog.h\"\n#include \"core/debug.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"ui/KSTHighlightRuleDetail.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.ksthighlightersettingdialog\");\n\nKSTHighlighterSettingDialog::KSTHighlighterSettingDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::KSTHighlighterSettingDialog)\n{\n    ui->setupUi(this);\n\n    rulesModel = new QSqlTableModel();\n    rulesModel->setTable(\"chat_highlight_rules\");\n    rulesModel->setHeaderData(rulesModel->fieldIndex(\"rule_name\"), Qt::Horizontal, tr(\"Name\"));\n    rulesModel->setHeaderData(rulesModel->fieldIndex(\"enabled\"), Qt::Horizontal, tr(\"State\"));\n\n    ui->rulesView->setModel(rulesModel);\n\n    for ( int i = 0 ; i < rulesModel->columnCount(); i++ )\n    {\n        ui->rulesView->hideColumn(i);\n    }\n\n    ui->rulesView->showColumn(rulesModel->fieldIndex(\"rule_name\"));\n    ui->rulesView->showColumn(rulesModel->fieldIndex(\"enabled\"));\n\n    ui->rulesView->setColumnWidth(0, 300);\n\n    ui->rulesView->setItemDelegateForColumn(rulesModel->fieldIndex(\"enabled\"), new CheckBoxDelegate(ui->rulesView));\n\n    rulesModel->select();\n}\n\nKSTHighlighterSettingDialog::~KSTHighlighterSettingDialog()\n{\n    delete ui;\n}\n\nvoid KSTHighlighterSettingDialog::addRule()\n{\n    FCT_IDENTIFICATION;\n    KSTHighlightRuleDetail dialog(QString(), this);\n    dialog.exec();\n    rulesModel->select();\n}\n\nvoid KSTHighlighterSettingDialog::removeRule()\n{\n    FCT_IDENTIFICATION;\n\n    rulesModel->removeRow(ui->rulesView->currentIndex().row());\n    ui->rulesView->clearSelection();\n    rulesModel->select();\n\n}\n\nvoid KSTHighlighterSettingDialog::editRule(QModelIndex idx)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &nameIdx = ui->rulesView->model()->index(idx.row(),0);\n    const QString &ruleName = ui->rulesView->model()->data(nameIdx).toString();\n\n    KSTHighlightRuleDetail dialog(ruleName, this);\n    dialog.exec();\n    rulesModel->select();\n}\n\nvoid KSTHighlighterSettingDialog::editRuleButton()\n{\n    FCT_IDENTIFICATION;\n\n    foreach (QModelIndex index, ui->rulesView->selectionModel()->selectedRows())\n    {\n       editRule(index);\n    }\n}\n"
  },
  {
    "path": "ui/KSTHighlighterSettingDialog.h",
    "content": "#ifndef QLOG_UI_KSTHIGHLIGHTERSETTINGDIALOG_H\n#define QLOG_UI_KSTHIGHLIGHTERSETTINGDIALOG_H\n\n#include <QDialog>\n#include <QSqlTableModel>\n\nnamespace Ui {\nclass KSTHighlighterSettingDialog;\n}\n\nclass KSTHighlighterSettingDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit KSTHighlighterSettingDialog(QWidget *parent = nullptr);\n    ~KSTHighlighterSettingDialog();\n\n    QSqlTableModel* rulesModel;\n\npublic slots:\n    void addRule();\n    void removeRule();\n    void editRule(QModelIndex);\n    void editRuleButton();\n\nprivate:\n    Ui::KSTHighlighterSettingDialog *ui;\n};\n\n#endif // QLOG_UI_KSTHIGHLIGHTERSETTINGDIALOG_H\n"
  },
  {
    "path": "ui/KSTHighlighterSettingDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>KSTHighlighterSettingDialog</class>\n <widget class=\"QDialog\" name=\"KSTHighlighterSettingDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>542</width>\n    <height>415</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Highlight Rules</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox\">\n       <property name=\"title\">\n        <string>Rules</string>\n       </property>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n        <item>\n         <widget class=\"QTableView\" name=\"rulesView\">\n          <property name=\"editTriggers\">\n           <set>QAbstractItemView::NoEditTriggers</set>\n          </property>\n          <property name=\"alternatingRowColors\">\n           <bool>true</bool>\n          </property>\n          <property name=\"selectionMode\">\n           <enum>QAbstractItemView::SingleSelection</enum>\n          </property>\n          <property name=\"selectionBehavior\">\n           <enum>QAbstractItemView::SelectRows</enum>\n          </property>\n          <property name=\"verticalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"horizontalScrollMode\">\n           <enum>QAbstractItemView::ScrollPerPixel</enum>\n          </property>\n          <property name=\"showGrid\">\n           <bool>true</bool>\n          </property>\n          <attribute name=\"horizontalHeaderMinimumSectionSize\">\n           <number>50</number>\n          </attribute>\n          <attribute name=\"horizontalHeaderDefaultSectionSize\">\n           <number>100</number>\n          </attribute>\n          <attribute name=\"horizontalHeaderStretchLastSection\">\n           <bool>true</bool>\n          </attribute>\n          <attribute name=\"verticalHeaderVisible\">\n           <bool>false</bool>\n          </attribute>\n          <attribute name=\"verticalHeaderStretchLastSection\">\n           <bool>false</bool>\n          </attribute>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"addRuleButton\">\n         <property name=\"text\">\n          <string>Add</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"editRuleButton\">\n         <property name=\"text\">\n          <string>Edit</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"removeRuleButton\">\n         <property name=\"text\">\n          <string>Remove</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>rulesView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>editRule(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>220</x>\n     <y>201</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>removeRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>removeRule()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>477</x>\n     <y>223</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>editRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>editRuleButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>477</x>\n     <y>192</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addRuleButton</sender>\n   <signal>clicked()</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>addRule()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>477</x>\n     <y>161</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>264</x>\n     <y>393</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>KSTHighlighterSettingDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>264</x>\n     <y>393</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>207</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>editRule(QModelIndex)</slot>\n  <slot>removeRule()</slot>\n  <slot>editRuleButton()</slot>\n  <slot>addRule()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/KSTWidget.cpp",
    "content": ""
  },
  {
    "path": "ui/KSTWidget.h",
    "content": ""
  },
  {
    "path": "ui/KSTWidget.ui",
    "content": ""
  },
  {
    "path": "ui/LoadDatabaseDialog.cpp",
    "content": "#include <QFileDialog>\n#include <QStandardPaths>\n#include <QSqlQuery>\n#include <QSqlError>\n#include <QMessageBox>\n#include <QJsonDocument>\n#include <QJsonObject>\n#include <QJsonArray>\n#include <QTemporaryFile>\n#include \"LoadDatabaseDialog.h\"\n#include \"ui_LoadDatabaseDialog.h\"\n#include \"core/PasswordCipher.h\"\n#include \"core/FileCompressor.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.loaddatabasedialog\");\n\nconst QString LoadDatabaseDialog::importConnectionName = QStringLiteral(\"LoadDatabaseDialogImport\");\n\nLoadDatabaseDialog::LoadDatabaseDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::LoadDatabaseDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    // Add custom Load & Restart button\n    loadButton = ui->buttonBox->addButton(tr(\"Load && Restart\"), QDialogButtonBox::AcceptRole);\n    loadButton->setEnabled(false);\n\n    // Connect buttonBox accepted signal to our accept() override\n    connect(ui->buttonBox, &QDialogButtonBox::accepted, this, &LoadDatabaseDialog::accept);\n\n    // Initial state\n    ui->decryptGroup->setEnabled(false);\n}\n\nLoadDatabaseDialog::~LoadDatabaseDialog()\n{\n    closeImportDatabase();\n    delete ui;\n}\n\nQString LoadDatabaseDialog::getSelectedFile() const\n{\n    return selectedFile;\n}\n\nQString LoadDatabaseDialog::getDecompressedFile() const\n{\n    return tempDecompressedFile;\n}\n\nQString LoadDatabaseDialog::takeDecompressedFile()\n{\n    // Close SQL connection first to release file lock\n    if ( QSqlDatabase::contains(importConnectionName) )\n    {\n        {\n            QSqlDatabase db = QSqlDatabase::database(importConnectionName);\n            db.close();\n        }\n        QSqlDatabase::removeDatabase(importConnectionName);\n    }\n\n    QString path = tempDecompressedFile;\n    tempDecompressedFile.clear();  // Transfer ownership - destructor won't delete\n    return path;\n}\n\nQString LoadDatabaseDialog::getPassword() const\n{\n    return ui->passwordEdit->text();\n}\n\nbool LoadDatabaseDialog::isCrossPlatform() const\n{\n    if ( !dbInfo.valid )\n        return false;\n\n    return dbInfo.sourcePlatform != LogDatabase::currentPlatformId();\n}\n\nbool LoadDatabaseDialog::requiresPassword() const\n{\n    return !encryptedPasswordsBlob.isEmpty();\n}\n\nvoid LoadDatabaseDialog::accept()\n{\n    FCT_IDENTIFICATION;\n\n    // Verify password before accepting\n    if ( !verifyPassword() ) return;\n\n    QDialog::accept();\n}\n\nbool LoadDatabaseDialog::verifyPassword()\n{\n    FCT_IDENTIFICATION;\n\n    // No password needed\n    if ( encryptedPasswordsBlob.isEmpty() )\n        return true;\n\n    const QString password = ui->passwordEdit->text();\n\n    // Try to decrypt\n    QByteArray json;\n    if ( !PasswordCipher::decrypt(password, encryptedPasswordsBlob, json) )\n    {\n        ui->passwordStatusLabel->setText(\n            QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\").arg(tr(\"Invalid password\")));\n        ui->passwordEdit->clear();\n        ui->passwordEdit->setFocus();\n        return false;\n    }\n\n    // Verify JSON structure\n    QJsonParseError parseError;\n    QJsonDocument doc = QJsonDocument::fromJson(json, &parseError);\n    if ( parseError.error != QJsonParseError::NoError )\n    {\n        ui->passwordStatusLabel->setText(\n            QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\").arg(tr(\"Invalid password\")));\n        ui->passwordEdit->clear();\n        ui->passwordEdit->setFocus();\n        return false;\n    }\n\n    return true;\n}\n\nvoid LoadDatabaseDialog::browseFile()\n{\n    FCT_IDENTIFICATION;\n\n    const QString documentsPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);\n\n    QString filename = QFileDialog::getOpenFileName(\n        this,\n        tr(\"Select Database File\"),\n        documentsPath,\n        tr(\"QLog Database Export (*.dbe);;All Files (*)\")\n    );\n\n    if ( filename.isEmpty() )\n        return;\n\n    // Close previous import DB if any\n    closeImportDatabase();\n\n    selectedFile = filename;\n    ui->fileEdit->setText(filename);\n\n    // Open and validate the database\n    openImportDatabase();\n}\n\nvoid LoadDatabaseDialog::openImportDatabase()\n{\n    FCT_IDENTIFICATION;\n\n    // Create temporary file for decompressed database\n    QTemporaryFile tempFile;\n    tempFile.setAutoRemove(false);  // We manage deletion ourselves\n    if ( !tempFile.open() )\n    {\n        dbInfo.valid = false;\n        dbInfo.errorMessage = tr(\"Cannot create temporary file\");\n        ui->statusLabel->setText(QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\")\n                                     .arg(dbInfo.errorMessage));\n        ui->decryptGroup->setEnabled(false);\n        ui->passwordEdit->clear();\n        encryptedPasswordsBlob.clear();\n        updateLoadButtonState();\n        return;\n    }\n    tempDecompressedFile = tempFile.fileName();\n    tempFile.close();\n\n    // Decompress the .dbe file (with progress dialog)\n    if ( !FileCompressor::gunzipFileWithProgress(selectedFile, tempDecompressedFile,\n                                                  this, tr(\"Decompressing database...\")) )\n    {\n        dbInfo.valid = false;\n        dbInfo.errorMessage = tr(\"Cannot decompress database file\");\n        ui->statusLabel->setText(QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\")\n                                     .arg(dbInfo.errorMessage));\n        ui->decryptGroup->setEnabled(false);\n        ui->passwordEdit->clear();\n        encryptedPasswordsBlob.clear();\n        QFile::remove(tempDecompressedFile);\n        tempDecompressedFile.clear();\n        updateLoadButtonState();\n        return;\n    }\n\n    // Get basic info using LogDatabase::inspectDatabase on decompressed file\n    dbInfo = LogDatabase::inspectDatabase(tempDecompressedFile);\n\n    if ( !dbInfo.valid )\n    {\n        ui->statusLabel->setText(QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\")\n                                     .arg(dbInfo.errorMessage));\n        ui->decryptGroup->setEnabled(false);\n        ui->passwordEdit->clear();\n        encryptedPasswordsBlob.clear();\n        updateLoadButtonState();\n        return;\n    }\n\n    // Open the decompressed database and cache encrypted passwords blob\n    {\n        QSqlDatabase importDb = QSqlDatabase::addDatabase(\"QSQLITE\", importConnectionName);\n        importDb.setDatabaseName(tempDecompressedFile);\n\n        if ( !importDb.open() )\n        {\n            qWarning() << \"Cannot open import database:\" << importDb.lastError().text();\n            dbInfo.valid = false;\n            dbInfo.errorMessage = tr(\"Cannot open database\");\n            ui->statusLabel->setText(QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\")\n                                         .arg(dbInfo.errorMessage));\n            ui->decryptGroup->setEnabled(false);\n            encryptedPasswordsBlob.clear();\n            updateLoadButtonState();\n            return;\n        }\n\n        // Read encrypted passwords blob\n        QSqlQuery query(importDb);\n        if ( query.exec(\"SELECT value FROM log_param WHERE name = 'security/encryptedpasswords'\") )\n        {\n            if ( query.first() && !query.value(0).toString().isEmpty() )\n                encryptedPasswordsBlob = QByteArray::fromBase64(query.value(0).toByteArray());\n        }\n\n        importDb.close();\n    }\n    QSqlDatabase::removeDatabase(importConnectionName);\n\n    // Build status message\n    QString status = QString(\"<span style=\\\"color: green;\\\">✓ %1</span>\")\n                         .arg(tr(\"Valid database\"));\n\n    if ( isCrossPlatform() )\n    {\n        status += QString(\"<br><span style=\\\"color: orange;\\\">⚠ %1 (%2)</span>\")\n                      .arg(tr(\"Different platform\"), dbInfo.sourcePlatform);\n    }\n\n    ui->statusLabel->setText(status);\n\n    // Enable password group if database has encrypted passwords\n    if ( !encryptedPasswordsBlob.isEmpty() )\n    {\n        ui->decryptGroup->setEnabled(true);\n        ui->passwordStatusLabel->setText(tr(\"Password required to import credentials\"));\n    }\n    else\n    {\n        ui->decryptGroup->setEnabled(false);\n        ui->passwordStatusLabel->setText(tr(\"No encrypted credentials in database\"));\n    }\n\n    ui->passwordEdit->clear();\n    updateLoadButtonState();\n}\n\nvoid LoadDatabaseDialog::closeImportDatabase()\n{\n    FCT_IDENTIFICATION;\n\n    if ( QSqlDatabase::contains(importConnectionName) )\n    {\n        {\n            QSqlDatabase db = QSqlDatabase::database(importConnectionName);\n            db.close();\n        }\n        QSqlDatabase::removeDatabase(importConnectionName);\n    }\n\n    // Remove temporary decompressed file\n    if ( !tempDecompressedFile.isEmpty() )\n    {\n        QFile::remove(tempDecompressedFile);\n        tempDecompressedFile.clear();\n    }\n\n    encryptedPasswordsBlob.clear();\n}\n\nvoid LoadDatabaseDialog::updateLoadButtonState()\n{\n    FCT_IDENTIFICATION;\n\n    // Reset password status label to default text when user starts typing\n    // (but not when password is cleared programmatically after invalid attempt)\n    if ( !encryptedPasswordsBlob.isEmpty() && !ui->passwordEdit->text().isEmpty() )\n        ui->passwordStatusLabel->setText(tr(\"Password required to import credentials\"));\n\n    // Load & Restart is enabled when:\n    // 1. Database is valid\n    // 2. Either no password is needed OR password field is not empty\n    bool passwordOk = encryptedPasswordsBlob.isEmpty() || !ui->passwordEdit->text().isEmpty();\n    loadButton->setEnabled(dbInfo.valid && passwordOk);\n}\n\n"
  },
  {
    "path": "ui/LoadDatabaseDialog.h",
    "content": "#ifndef QLOG_UI_LOADDATABASEDIALOG_H\n#define QLOG_UI_LOADDATABASEDIALOG_H\n\n#include <QDialog>\n#include <QPushButton>\n#include <QSqlDatabase>\n#include \"core/LogDatabase.h\"\n\nnamespace Ui {\nclass LoadDatabaseDialog;\n}\n\nclass LoadDatabaseDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit LoadDatabaseDialog(QWidget *parent = nullptr);\n    ~LoadDatabaseDialog();\n\n    QString getSelectedFile() const;\n    QString getDecompressedFile() const;\n    QString takeDecompressedFile();  // Returns path and transfers ownership (caller must delete)\n    QString getPassword() const;\n    bool isCrossPlatform() const;\n    bool requiresPassword() const;\n\npublic slots:\n    void accept() override;\n\nprivate slots:\n    void browseFile();\n    void updateLoadButtonState();\n\nprivate:\n    void openImportDatabase();\n    void closeImportDatabase();\n    bool verifyPassword();\n\n    Ui::LoadDatabaseDialog *ui;\n    QPushButton *loadButton;\n\n    QString selectedFile;\n    DatabaseInfo dbInfo;\n\n    // Cached encrypted passwords blob from import DB\n    QByteArray encryptedPasswordsBlob;\n\n    // Temporary decompressed file path\n    QString tempDecompressedFile;\n\n    static const QString importConnectionName;\n};\n\n#endif // QLOG_UI_LOADDATABASEDIALOG_H\n"
  },
  {
    "path": "ui/LoadDatabaseDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LoadDatabaseDialog</class>\n <widget class=\"QDialog\" name=\"LoadDatabaseDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>500</width>\n    <height>411</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Unpack Data &amp; Settings</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"warningGroup\">\n     <property name=\"title\">\n      <string>Warning</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n      <item>\n       <widget class=\"QLabel\" name=\"warningLabel\">\n        <property name=\"text\">\n         <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;Current database will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;All stored passwords will be DELETED!&lt;/span&gt;&lt;br/&gt;⚠ &lt;span style=&quot; font-weight:700;&quot;&gt;The application will restart after loading&lt;/span&gt;.&lt;/p&gt;&lt;p&gt;To preserve data, use Pack Data &amp;amp; Settings or Export QSOs first.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"selectDatabaseGroup\">\n     <property name=\"title\">\n      <string>Select Database</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"fileLayout\">\n        <item>\n         <widget class=\"QLabel\" name=\"fileLabel\">\n          <property name=\"text\">\n           <string>File:</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"fileEdit\">\n          <property name=\"readOnly\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QPushButton\" name=\"browseButton\">\n          <property name=\"text\">\n           <string>Browse</string>\n          </property>\n          <property name=\"icon\">\n           <iconset theme=\"folder-open\"/>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n      <item>\n       <widget class=\"QLabel\" name=\"statusLabel\">\n        <property name=\"text\">\n         <string>Status: No file selected</string>\n        </property>\n        <property name=\"wordWrap\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"decryptGroup\">\n     <property name=\"title\">\n      <string>Decrypt Credentials</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n      <item>\n       <widget class=\"QLabel\" name=\"passwordStatusLabel\">\n        <property name=\"text\">\n         <string>Enter password to decrypt credentials</string>\n        </property>\n       </widget>\n      </item>\n      <item>\n       <layout class=\"QHBoxLayout\" name=\"passwordLayout\">\n        <item>\n         <widget class=\"QLabel\" name=\"passwordLabel\">\n          <property name=\"text\">\n           <string>Password:</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLineEdit\" name=\"passwordEdit\">\n          <property name=\"echoMode\">\n           <enum>QLineEdit::Password</enum>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>LoadDatabaseDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>browseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>LoadDatabaseDialog</receiver>\n   <slot>browseFile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>437</x>\n     <y>201</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>249</x>\n     <y>205</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>passwordEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>LoadDatabaseDialog</receiver>\n   <slot>updateLoadButtonState()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>289</x>\n     <y>335</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>249</x>\n     <y>205</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>browseFile()</slot>\n  <slot>updateLoadButtonState()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/LogbookWidget.cpp",
    "content": "#include <QtSql>\n#include <QDate>\n#include <QMessageBox>\n#include <QDesktopServices>\n#include <QMenu>\n#include <QProgressDialog>\n#include <QNetworkReply>\n#include <QProgressDialog>\n#include <QShortcut>\n#include <QEvent>\n#include <QKeyEvent>\n#include <QProgressDialog>\n#include <QActionGroup>\n\n#include \"logformat/AdiFormat.h\"\n#include \"models/LogbookModel.h\"\n#include \"models/SqlListModel.h\"\n#include \"service/clublog/ClubLog.h\"\n#include \"LogbookWidget.h\"\n#include \"ui_LogbookWidget.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"core/debug.h\"\n#include \"models/SqlListModel.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"data/Data.h\"\n#include \"ui/ExportDialog.h\"\n#include \"service/eqsl/Eqsl.h\"\n#include \"ui/PaperQSLDialog.h\"\n#include \"ui/QSODetailDialog.h\"\n#include \"core/MembershipQE.h\"\n#include \"service/GenericCallbook.h\"\n#include \"core/QSOFilterManager.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.logbookwidget\");\n\nLogbookWidget::LogbookWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::LogbookWidget),\n    blockClublogSignals(false),\n    lookupDialog(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    searchTypeList.insert(CALLSIGN_SEARCH,\n                          SearchDefinition(CALLSIGN_SEARCH,\n                                           ui->actionSearchCallsign,\n                                           \"callsign\"));\n    searchTypeList.insert(GRIDSQUARE_SEARCH,\n                          SearchDefinition(GRIDSQUARE_SEARCH,\n                                           ui->actionSearchGrid,\n                                           \"gridsquare\"));\n\n    searchTypeList.insert(POTA_SEARCH,\n                          SearchDefinition(POTA_SEARCH,\n                                           ui->actionSearchPOTA,\n                                           \"pota_ref\"));\n\n    searchTypeList.insert(SOTA_SEARCH,\n                          SearchDefinition(SOTA_SEARCH,\n                                           ui->actionSearchSOTA,\n                                           \"sota_ref\"));\n\n    searchTypeList.insert(WWFF_SEARCH,\n                          SearchDefinition(WWFF_SEARCH,\n                                           ui->actionSearchWWFF,\n                                           \"wwff_ref\"));\n\n    searchTypeList.insert(SIG_SEARCH,\n                          SearchDefinition(SIG_SEARCH,\n                                           ui->actionSearchSIG,\n                                           \"sig_intl\"));\n\n    searchTypeList.insert(IOTA_SEARCH,\n                          SearchDefinition(IOTA_SEARCH,\n                                           ui->actionSearchIOTA,\n                                           \"iota\"));\n\n    setupSearchMenu();\n\n    connect(ui->countrySelectFilter, &SmartSearchBox::currentTextChanged,\n            this, &LogbookWidget::countryFilterChanged);\n\n    connect(ui->bandSelectFilter, &SmartSearchBox::currentTextChanged,\n            this, &LogbookWidget::bandFilterChanged);\n\n    connect(ui->modeSelectFilter, &SmartSearchBox::currentTextChanged,\n            this, &LogbookWidget::modeFilterChanged);\n\n    connect(ui->userSelectFilter, &SmartSearchBox::currentTextChanged,\n            this, &LogbookWidget::userFilterChanged);\n\n    connect(ui->clubSelectFilter, &SmartSearchBox::currentTextChanged,\n            this, &LogbookWidget::clubFilterChanged);\n\n    model = new LogbookModel(this);\n    connect(model, &LogbookModel::beforeUpdate, this, &LogbookWidget::handleBeforeUpdate);\n    connect(model, &LogbookModel::beforeDelete, this, &LogbookWidget::handleBeforeDelete);\n    connect(ui->contactTable, &QTableQSOView::dataCommitted, this, [this](){emit logbookUpdated();});\n\n    /* Callbook Signals registration */\n    connect(&callbookManager, &CallbookManager::callsignResult,\n            this, &LogbookWidget::callsignFound);\n\n    connect(&callbookManager, &CallbookManager::callsignNotFound,\n            this, &LogbookWidget::callsignNotFound);\n\n    connect(&callbookManager, &CallbookManager::loginFailed,\n            this, &LogbookWidget::callbookLoginFailed);\n\n    connect(&callbookManager, &CallbookManager::lookupError,\n            this, &LogbookWidget::callbookError);\n\n    ui->contactTable->setModel(model);\n\n    QAction *separator = new QAction(ui->contactTable);\n    separator->setSeparator(true);\n\n    QAction *separator1 = new QAction(ui->contactTable);\n    separator1->setSeparator(true);\n\n    QAction *separator2 = new QAction(ui->contactTable);\n    separator2->setSeparator(true);\n\n    QAction *separator3 = new QAction(ui->contactTable);\n    separator3->setSeparator(true);\n\n    ui->contactTable->addAction(ui->actionEditContact);\n    ui->contactTable->addAction(ui->actionFilter);\n    ui->contactTable->addAction(ui->actionLookup);\n    ui->contactTable->addAction(ui->actionSendDXCSpot);\n    ui->contactTable->addAction(separator);\n    ui->contactTable->addAction(ui->actionExportAs);\n    ui->contactTable->addAction(ui->actionCallbookLookup);\n    ui->contactTable->addAction(separator1);\n    ui->contactTable->addAction(ui->actionDisplayedColumns);\n    ui->contactTable->addAction(separator2);\n    ui->contactTable->addAction(ui->actionQSLRcvd);\n    ui->contactTable->addAction(ui->actionQSLRequested);\n    ui->contactTable->addAction(separator3);\n    ui->contactTable->addAction(ui->actionDeleteContact);\n\n    connect(ui->actionQSLRcvd, &QAction::triggered, this, &LogbookWidget::markQslReceived);\n    connect(ui->actionQSLRequested, &QAction::triggered, this, &LogbookWidget::markQslRequested);\n\n    ui->contactTable->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu);\n    connect(ui->contactTable->horizontalHeader(), &QHeaderView::customContextMenuRequested,\n            this, &LogbookWidget::showTableHeaderContextMenu);\n\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TIME_ON, new TimestampFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TIME_OFF, new TimestampFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_CALL, new CallsignDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_FREQUENCY, new UnitFormatDelegate(\"\", 6, 0.001, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_BAND, new ComboFormatDelegate(new SqlListModel(\"SELECT name FROM bands ORDER BY start_freq\", \" \", ui->contactTable), ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MODE, new ComboFormatDelegate(new SqlListModel(\"SELECT name FROM modes\", \" \", ui->contactTable), ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_CONTINENT, new ComboFormatDelegate(QStringList() << \" \" << Data::getContinentList(), ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_SENT, new ComboFormatDelegate(Data::instance()->qslSentEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_SENT_VIA, new ComboFormatDelegate(Data::instance()->qslSentViaEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_RCVD, new ComboFormatDelegate(Data::instance()->qslRcvdEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_RCVD_VIA, new ComboFormatDelegate(Data::instance()->qslSentViaEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_SENT_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSL_RCVD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_LOTW_SENT, new ComboFormatDelegate(Data::instance()->qslSentEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_LOTW_RCVD, new ComboFormatDelegate(Data::instance()->qslRcvdEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_LOTW_RCVD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_LOTW_SENT_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TX_POWER, new UnitFormatDelegate(\"W\", 3, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_AGE, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_ALTITUDE, new UnitFormatDelegate(\"m\", 2, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_A_INDEX, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_ANT_AZ, new UnitFormatDelegate(\"\", 1, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_ANT_EL, new UnitFormatDelegate(\"\", 1, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_ANT_PATH, new ComboFormatDelegate(Data::instance()->antPathEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_STATUS, new ComboFormatDelegate(Data::instance()->uploadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_DCL_QSLRDATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_DCL_QSLSDATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_DCL_QSL_RCVD, new ComboFormatDelegate(Data::instance()->qslRcvdEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_DCL_QSL_SENT, new ComboFormatDelegate(Data::instance()->qslSentEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_DISTANCE, new DistanceFormatDelegate(1, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_EQSL_AG, new ComboFormatDelegate(Data::instance()->eqslAgEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_EQSL_QSLRDATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_EQSL_QSLSDATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_EQSL_QSL_RCVD, new ComboFormatDelegate(Data::instance()->qslRcvdEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_EQSL_QSL_SENT, new ComboFormatDelegate(Data::instance()->qslSentEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_FISTS, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_FISTS_CC, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_FORCE_INIT, new ComboFormatDelegate(Data::instance()->boolEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_FREQ_RX, new UnitFormatDelegate(\"\", 6, 0.001, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_BAND_RX, new ComboFormatDelegate(new SqlListModel(\"SELECT name FROM bands ORDER BY start_freq\", \" \", ui->contactTable), ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_STATUS, new ComboFormatDelegate(Data::instance()->uploadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_STATUS, new ComboFormatDelegate(Data::instance()->uploadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_STATUS, new ComboFormatDelegate(Data::instance()->uploadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_IOTA_ISLAND_ID, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_K_INDEX, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MORSE_KEY_TYPE, new ComboFormatDelegate(Data::instance()->morseKeyTypeEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MAX_BURSTS, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_ALTITUDE, new UnitFormatDelegate(\"m\", 2, 0.1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_CQ_ZONE, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_DXCC, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_FISTS, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_IOTA_ISLAND_ID, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_ITU_ZONE, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_MY_MORSE_KEY_TYPE, new ComboFormatDelegate(Data::instance()->morseKeyTypeEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_NR_BURSTS, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_NR_PINGS, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_NOTES_INTL, new TextBoxDelegate(this));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_NOTES, new TextBoxDelegate(this));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_PROP_MODE, new ComboFormatDelegate(Data::instance()->propagationModesIDList(), ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QRZCOM_QSO_UPLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QRZCOM_QSO_UPLOAD_STATUS, new ComboFormatDelegate(Data::instance()->uploadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_DATE, new DateFormatDelegate(ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_STATUS, new ComboFormatDelegate(Data::instance()->downloadStatusEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSO_COMPLETE, new ComboFormatDelegate(Data::instance()->qsoCompleteEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_QSO_RANDOM, new ComboFormatDelegate(Data::instance()->boolEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_RX_PWR, new UnitFormatDelegate(\"W\", 3, 0.1, ui->contactTable));\n    /*https://www.pe0sat.vgnet.nl/satellite/sat-information/modes/ */\n    /* use all possible values, do not use only modern modes in sat_modes.json */\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_SAT_MODE, new ComboFormatDelegate(QStringList()<<\" \"<<\"VU\"<<\"VV\"<<\"UV\"<<\"UU\"<<\"US\"<<\"LU\"<<\"LS\"<<\"LX\"<<\"VS\"<<\"SX\"<<\"K\"<<\"T\"<<\"A\"<<\"J\"<<\"B\"<<\"S\"<<\"L\", ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_SFI, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_SILENT_KEY, new ComboFormatDelegate(Data::instance()->boolEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_SRX, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_STX, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_SWL, new ComboFormatDelegate(Data::instance()->boolEnum, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_TEN_TEN, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n    ui->contactTable->setItemDelegateForColumn(LogbookModel::COLUMN_UKSMG, new UnitFormatDelegate(\"\", 0, 1, ui->contactTable));\n\n    const QByteArray &logbookState = LogParam::getLogbookState();\n    if ( !logbookState.isEmpty() )\n        ui->contactTable->horizontalHeader()->restoreState(logbookState);\n    else\n    {\n        /* Hide all */\n        for ( int i = 0; i < LogbookModel::COLUMN_LAST_ELEMENT; i++ )\n        {\n            ui->contactTable->hideColumn(i);\n        }\n        /* Set a basic set of columns */\n        ui->contactTable->showColumn(LogbookModel::COLUMN_TIME_ON);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_CALL);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_RST_RCVD);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_RST_SENT);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_FREQUENCY);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_MODE);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_NAME_INTL);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_QTH_INTL);\n        ui->contactTable->showColumn(LogbookModel::COLUMN_COMMENT_INTL);\n    }\n    ui->contactTable->setSortingEnabled(true);\n    ui->contactTable->horizontalHeader()->setSectionsMovable(true);\n    ui->contactTable->setStyle(new ProxyStyle(ui->contactTable->style()));\n    ui->contactTable->installEventFilter(this);\n    setDefaultSort();\n\n    ui->bandSelectFilter->blockSignals(true);\n    ui->bandSelectFilter->setModel(new SqlListModel(\"SELECT name FROM bands ORDER BY start_freq\",\n                                                    tr(\"All Bands\"),\n                                                    ui->bandSelectFilter));\n    ui->bandSelectFilter->adjustMaxSize();\n    ui->bandSelectFilter->setHighlightWhenEnable(true);\n    ui->bandSelectFilter->blockSignals(false);\n\n    ui->modeSelectFilter->blockSignals(true);\n    ui->modeSelectFilter->setModel(new SqlListModel(\"SELECT name FROM modes\",\n                                                    tr(\"All Modes\"),\n                                                    ui->modeSelectFilter));\n    ui->modeSelectFilter->adjustMaxSize();\n    ui->modeSelectFilter->setHighlightWhenEnable(true);\n    ui->modeSelectFilter->blockSignals(false);\n\n    ui->countrySelectFilter->blockSignals(true);\n    ui->countrySelectFilter->setModel(new SqlListModel(\"SELECT id, translate_to_locale(name) \"\n                                                       \"FROM dxcc_entities_clublog WHERE id IN (SELECT DISTINCT dxcc FROM contacts) \"\n                                                       \"ORDER BY 2 COLLATE LOCALEAWARE ASC;\",\n                                                       tr(\"All Countries\"),\n                                                       ui->countrySelectFilter));\n    ui->countrySelectFilter->setModelColumn(1);\n    ui->countrySelectFilter->adjustMaxSize();\n    ui->countrySelectFilter->setHighlightWhenEnable(true);\n    ui->countrySelectFilter->blockSignals(false);\n\n    ui->clubSelectFilter->setHighlightWhenEnable(true);\n    refreshClubFilter();\n\n    ui->userSelectFilter->blockSignals(true);\n    ui->userSelectFilter->setModel(QSOFilterManager::QSOFilterModel(tr(\"No User Filter\"),\n                                                                    ui->userSelectFilter));\n    ui->userSelectFilter->adjustMaxSize();\n    ui->userSelectFilter->setHighlightWhenEnable(true);\n    ui->userSelectFilter->blockSignals(false);\n\n    clublog = new ClubLogUploader(this);\n\n    restoreFilters();\n}\n\nvoid LogbookWidget::filterSelectedCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList &modeList = ui->contactTable->selectionModel()->selectedRows();\n    if ( modeList.count() > 0 )\n    {\n        const QSqlRecord &record = model->record(modeList.first().row());\n        filterCallsign(record.value(\"callsign\").toString());\n    }\n}\n\nvoid LogbookWidget::filterCountryBand(const QString &countryName,\n                                      const QString &band,\n                                      const QString &addlFilter)\n{\n    FCT_IDENTIFICATION;\n\n    ui->countrySelectFilter->blockSignals(true);\n    ui->bandSelectFilter->blockSignals(true);\n    ui->userSelectFilter->blockSignals(true);\n    ui->modeSelectFilter->blockSignals(true);\n    ui->clubSelectFilter->blockSignals(true);\n\n    ui->countrySelectFilter->setCurrentText(countryName);\n\n    ui->bandSelectFilter->setCurrentText(band);\n\n    //user wants to see only selected band and country\n    ui->userSelectFilter->setCurrentText(\"\"); //suppress user-defined filter\n    ui->modeSelectFilter->setCurrentText(\"\"); //suppress mode filter\n    ui->clubSelectFilter->setCurrentText(\"\"); //suppress club filter\n\n    // set additional filter\n    externalFilter = addlFilter;\n\n    ui->clubSelectFilter->blockSignals(false);\n    ui->userSelectFilter->blockSignals(false);\n    ui->modeSelectFilter->blockSignals(false);\n    ui->countrySelectFilter->blockSignals(false);\n    ui->bandSelectFilter->blockSignals(false);\n\n    filterTable();\n}\n\nvoid LogbookWidget::lookupSelectedCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList &modeList = ui->contactTable->selectionModel()->selectedRows();\n    if ( modeList.count() > 0)\n    {\n        const QSqlRecord &record = model->record(modeList.first().row());\n        QDesktopServices::openUrl(GenericCallbook::getWebLookupURL(record.value(\"callsign\").toString()));\n    }\n}\n\nvoid LogbookWidget::actionCallbookLookup()\n{\n    FCT_IDENTIFICATION;\n\n    callbookLookupBatch = ui->contactTable->selectionModel()->selectedRows();\n    ui->contactTable->clearSelection();\n\n    if ( callbookLookupBatch.count() > 100 )\n    {\n        callbookLookupBatch.clear();\n        QMessageBox::warning(this, tr(\"QLog Warning\"), tr(\"Each batch supports up to 100 QSOs.\"));\n        return;\n    }\n\n    lookupDialog = new QProgressDialog(tr(\"QSOs Update Progress\"),\n                                       tr(\"Cancel\"),\n                                       0, callbookLookupBatch.count(),\n                                       this);\n\n    connect(lookupDialog, &QProgressDialog::canceled, this, [this]()\n    {\n        qCDebug(runtime)<< \"Operation canceled\";\n        callbookManager.abortQuery();\n        finishQSOLookupBatch();\n    });\n\n    lookupDialog->setValue(0);\n    lookupDialog->setWindowModality(Qt::WindowModal);\n    lookupDialog->show();\n\n    queryNextQSOLookupBatch();\n}\n\nvoid LogbookWidget::queryNextQSOLookupBatch()\n{\n    FCT_IDENTIFICATION;\n\n    if ( callbookLookupBatch.isEmpty() )\n    {\n        finishQSOLookupBatch();\n        return;\n    }\n\n    currLookupIndex = callbookLookupBatch.takeFirst();\n    callbookManager.queryCallsign(model->data(model->index(currLookupIndex.row(), LogbookModel::COLUMN_CALL), Qt::DisplayRole).toString());\n}\n\nvoid LogbookWidget::finishQSOLookupBatch()\n{\n    FCT_IDENTIFICATION;\n\n    callbookLookupBatch.clear();\n    currLookupIndex = QModelIndex();\n    if ( lookupDialog )\n    {\n        lookupDialog->done(QDialog::Accepted);\n        lookupDialog->deleteLater();\n        lookupDialog = nullptr;\n    }\n}\n\nvoid LogbookWidget::updateQSORecordFromCallbook(const CallbookResponseData& data)\n{\n    FCT_IDENTIFICATION;\n\n    auto getCurrIndexColumnValue = [&](const LogbookModel::ColumnID id)\n    {\n        return model->data(model->index(currLookupIndex.row(), id), Qt::EditRole).toString();\n    };\n\n    auto setModelData = [&](const LogbookModel::ColumnID id, const QVariant &value)\n    {\n        return model->setData(model->index(currLookupIndex.row(), id), value, Qt::EditRole);\n    };\n\n    if ( getCurrIndexColumnValue(LogbookModel::COLUMN_CALL) != data.call)\n    {\n        qWarning() << \"Callsigns don't match - skipping. QSO \" << model->data(model->index(currLookupIndex.row(), LogbookModel::COLUMN_CALL), Qt::DisplayRole).toString()\n                   << \"data \" << data.call;\n        return;\n    }\n\n    const QString fnamelname = QString(\"%1 %2\").arg(data.fname, data.lname);\n    const QString &nameValue = getCurrIndexColumnValue(LogbookModel::COLUMN_NAME_INTL);\n\n    const LogbookModel::EditStrategy originEditStrategy = model->editStrategy();\n\n    model->setEditStrategy(QSqlTableModel::OnManualSubmit);\n\n    if ( nameValue.isEmpty()\n         || data.name_fmt.contains(nameValue)\n         || fnamelname.contains(nameValue)\n         || data.nick.contains(nameValue) )\n    {\n        QString name = data.name_fmt;\n        if ( name.isEmpty() )\n            name = ( data.fname.isEmpty() && data.lname.isEmpty() ) ? data.nick\n                                                                    : fnamelname;\n        setModelData(LogbookModel::COLUMN_NAME_INTL, name);\n    }\n\n    auto setIfEmpty = [&](const LogbookModel::ColumnID id,\n                          const QString &callbookValue,\n                          bool containsEnabled = false,\n                          bool forceReplace = false)\n    {\n        if ( callbookValue.isEmpty() ) return;\n\n        const QString &columnValue = getCurrIndexColumnValue(id);\n\n        if ( columnValue.isEmpty()\n             || (forceReplace && callbookValue != columnValue)\n             || (containsEnabled\n                  && callbookValue.contains(columnValue)\n                  && callbookValue != columnValue) )\n        {\n            bool ret = setModelData(id, callbookValue);\n\n            qCDebug(runtime) << \"Changing\"\n                             << LogbookModel::getFieldNameTranslation(id) << callbookValue\n                             << ret;\n        }\n    };\n\n    setIfEmpty(LogbookModel::COLUMN_GRID, data.gridsquare, true);\n    setIfEmpty(LogbookModel::COLUMN_QTH_INTL, data.qth);\n    setIfEmpty(LogbookModel::COLUMN_DARC_DOK, data.dok);\n    setIfEmpty(LogbookModel::COLUMN_IOTA, data.iota);\n    setIfEmpty(LogbookModel::COLUMN_EMAIL, data.email);\n    setIfEmpty(LogbookModel::COLUMN_COUNTY, data.county);\n    setIfEmpty(LogbookModel::COLUMN_QSL_VIA, data.qsl_via);\n    setIfEmpty(LogbookModel::COLUMN_WEB, data.url);\n    setIfEmpty(LogbookModel::COLUMN_STATE, data.us_state);\n    setIfEmpty(LogbookModel::COLUMN_ITUZ, data.ituz, false, true); // always replace if different\n    setIfEmpty(LogbookModel::COLUMN_CQZ, data.cqz, false, true);   // always replace if different\n    model->submitAll();\n\n    model->setEditStrategy(originEditStrategy);\n}\n\nvoid LogbookWidget::callsignFound(const CallbookResponseData &data)\n{\n    FCT_IDENTIFICATION;\n\n    updateQSORecordFromCallbook(data);\n    currLookupIndex = QModelIndex();\n    if ( lookupDialog )\n        lookupDialog->setValue(lookupDialog->value() + 1);\n\n    queryNextQSOLookupBatch();\n}\n\nvoid LogbookWidget::callsignNotFound(const QString &call)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << call << \"not found\";\n    if ( lookupDialog )\n        lookupDialog->setValue(lookupDialog->value() + 1);\n\n    queryNextQSOLookupBatch();\n}\n\nvoid LogbookWidget::callbookLoginFailed(const QString&callbookString)\n{\n    FCT_IDENTIFICATION;\n\n    finishQSOLookupBatch();\n    QMessageBox::critical(this, tr(\"QLog Error\"), callbookString + \" \" + tr(\"Callbook login failed\"));\n}\n\nvoid LogbookWidget::callbookError(const QString &error)\n{\n    FCT_IDENTIFICATION;\n\n    finishQSOLookupBatch();\n    QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Callbook error: \") + error);\n}\n\nvoid LogbookWidget::setCallsignSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"Callsign\"));\n\n    if ( !callsignSearchValue.isEmpty() )\n        ui->searchTextFilter->setText(callsignSearchValue);\n}\n\nvoid LogbookWidget::setGridsquareSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"Gridsquare\"));\n}\n\nvoid LogbookWidget::setPotaSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"POTA\"));\n}\n\nvoid LogbookWidget::setSotaSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"SOTA\"));\n}\n\nvoid LogbookWidget::setWwffSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"WWFF\"));\n}\n\nvoid LogbookWidget::setSigSearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"SIG\"));\n}\n\nvoid LogbookWidget::setIOTASearch()\n{\n    FCT_IDENTIFICATION;\n\n    clearSearchText();\n    ui->searchTextFilter->setPlaceholderText(tr(\"IOTA\"));\n}\n\nvoid LogbookWidget::filterCallsign(const QString &call)\n{\n    FCT_IDENTIFICATION;\n\n    if ( call == callsignSearchValue )\n        return;\n\n    callsignSearchValue = call;\n\n    if ( ui->actionSearchCallsign->isChecked() )\n    {\n        ui->searchTextFilter->blockSignals(true);\n        ui->searchTextFilter->setText(call);\n        ui->searchTextFilter->blockSignals(false);\n        // clearbutton is shown only when signals are enabled. therefore\n        // it is needed to force clear-button update\n        ui->searchTextFilter->setClearButtonEnabled(false);\n        ui->searchTextFilter->setClearButtonEnabled(true);\n    }\n\n    filterTable();\n}\n\nvoid LogbookWidget::clearSearchText()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->searchTextFilter->text().isEmpty() )\n        return;\n\n    ui->searchTextFilter->clear();\n}\n\nvoid LogbookWidget::setupSearchMenu()\n{\n    FCT_IDENTIFICATION;\n\n    QMenu *searchTypeMenu = new QMenu(ui->searchTypeButton);\n\n    searchTypeGroup = new QActionGroup(this);\n    searchTypeGroup->setExclusive(true);\n\n    for ( auto it = searchTypeList.cbegin(); it != searchTypeList.cend(); ++it)\n    {\n        QAction *action = it.value().action;\n        if ( action )\n        {\n            action->setActionGroup(searchTypeGroup);\n            searchTypeMenu->addAction(action);\n        }\n    }\n\n    connect(searchTypeGroup, &QActionGroup::triggered, this, [this](QAction *action)\n    {\n        saveSearchTextFilter(action);\n    });\n\n    ui->searchTypeButton->setMenu(searchTypeMenu);\n}\nvoid LogbookWidget::onSearchTextChanged()\n{\n    FCT_IDENTIFICATION;\n\n    filterTable();\n}\n\nvoid LogbookWidget::bandFilterChanged()\n{\n    FCT_IDENTIFICATION;\n\n    saveBandFilter();\n    filterTable();;\n}\n\nvoid LogbookWidget::saveBandFilter()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterBand(ui->bandSelectFilter->currentText());\n}\n\nvoid LogbookWidget::restoreBandFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->bandSelectFilter->blockSignals(true);\n    ui->bandSelectFilter->setCurrentText(LogParam::getLogbookFilterBand());\n    ui->bandSelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::modeFilterChanged()\n{\n    FCT_IDENTIFICATION;\n\n    saveModeFilter();\n    filterTable();\n}\n\nvoid LogbookWidget::saveModeFilter()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterMode(ui->modeSelectFilter->currentText());\n}\n\nvoid LogbookWidget::restoreModeFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->modeSelectFilter->blockSignals(true);\n    ui->modeSelectFilter->setCurrentText(LogParam::getLogbookFilterMode());\n    ui->modeSelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::countryFilterChanged()\n{\n    FCT_IDENTIFICATION;\n\n    saveCountryFilter();\n    filterTable();\n}\n\nvoid LogbookWidget::saveCountryFilter()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterCountry(ui->countrySelectFilter->currentText());\n}\n\nvoid LogbookWidget::restoreCountryFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->countrySelectFilter->blockSignals(true);\n    ui->countrySelectFilter->setCurrentText(LogParam::getLogbookFilterCountry());\n    ui->countrySelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::userFilterChanged()\n{\n    FCT_IDENTIFICATION;\n\n    saveUserFilter();\n    filterTable();\n}\n\nvoid LogbookWidget::setUserFilter(const QString &filterName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName;\n\n    ui->userSelectFilter->setCurrentText(filterName);\n}\n\nvoid LogbookWidget::saveUserFilter()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterUserFilter(ui->userSelectFilter->currentText());\n}\n\nvoid LogbookWidget::restoreUserFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->userSelectFilter->blockSignals(true);\n    ui->userSelectFilter->setCurrentText(LogParam::getLogbookFilterUserFilter());\n    ui->userSelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::clubFilterChanged()\n{\n    FCT_IDENTIFICATION;\n\n    saveClubFilter();\n    filterTable();\n}\n\nvoid LogbookWidget::refreshClubFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->clubSelectFilter->blockSignals(true);\n    const QString &member = ui->clubSelectFilter->currentText();\n    ui->clubSelectFilter->setModel(new QStringListModel(QStringList(tr(\"All Clubs\"))\n                                                        << MembershipQE::instance()->getEnabledClubLists(),ui->clubSelectFilter));\n    ui->clubSelectFilter->adjustMaxSize();\n    ui->clubSelectFilter->setCurrentText(member);\n    ui->clubSelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::refreshUserFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->userSelectFilter->refreshModel();\n\n    filterTable();  // TODO ??? is it needed\n}\n\nvoid LogbookWidget::saveClubFilter()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterClub(ui->clubSelectFilter->currentText());\n}\n\nvoid LogbookWidget::restoreClubFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->clubSelectFilter->blockSignals(true);\n    ui->clubSelectFilter->setCurrentText(LogParam::getLogbookFilterClub());\n    ui->clubSelectFilter->blockSignals(false);\n}\n\nvoid LogbookWidget::saveSearchTextFilter(QAction *action)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookFilterSearchType(action->data().toInt());\n}\n\nvoid LogbookWidget::restoreSearchTextFilter()\n{\n    FCT_IDENTIFICATION;\n\n    int searchType = LogParam::getLogbookFilterSearchType(SearchType::CALLSIGN_SEARCH);\n\n    const SearchDefinition &def = searchTypeList.value(static_cast<SearchType>(searchType));\n\n    if ( def.action )\n    {\n        searchTypeGroup->blockSignals(true);\n        def.action->setChecked(true);\n        def.action->trigger();\n        searchTypeGroup->blockSignals(false);\n    }\n}\n\nvoid LogbookWidget::restoreFilters()\n{\n    FCT_IDENTIFICATION;\n\n    restoreSearchTextFilter();\n    restoreModeFilter();\n    restoreBandFilter();\n    restoreCountryFilter();\n    restoreClubFilter();\n    restoreUserFilter();\n    externalFilter = QString();\n    clearSearchText();\n    filterTable();\n}\n\nvoid LogbookWidget::uploadClublog()\n{\n    FCT_IDENTIFICATION;\n\n    QByteArray data;\n    QTextStream stream(&data, QIODevice::ReadWrite);\n\n    AdiFormat adi(stream);\n\n    foreach (QModelIndex index, ui->contactTable->selectionModel()->selectedRows()) {\n        QSqlRecord record = model->record(index.row());\n        adi.exportContact(record);\n    }\n\n    stream.flush();\n\n    //clublog->uploadAdif(data);\n}\n\nvoid LogbookWidget::deleteContact()\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::StandardButton reply;\n    reply = QMessageBox::question(this, tr(\"Delete\"), tr(\"Delete the selected contacts?\"),\n                                  QMessageBox::Yes|QMessageBox::No);\n\n    if ( reply != QMessageBox::Yes ) return;\n\n    QModelIndexList deletedRowIndexes = ui->contactTable->selectionModel()->selectedRows();\n\n    // Since deletedRowIndexes contains indexes for columns that might be invisible,\n    // and scrollToIndex needs an index with a visible column,\n    // we obtain the column index from the first record in the table.\"\n\n    int firstVisibleColumnIndex = ui->contactTable->indexAt(QPoint(0, 0)).column();\n    QModelIndex previousIndex = model->index(deletedRowIndexes.first().row()-1, firstVisibleColumnIndex);\n\n    // Clublog does not accept batch DELETE operation\n    // ask if an operator wants to continue\n    if ( ClubLogBase::isUploadImmediatelyEnabled()\n         && deletedRowIndexes.count() > 5 )\n    {\n        reply = QMessageBox::question(this,\n                                      tr(\"Delete\"),\n                                      tr(\"Clublog's <b>Immediately Send</b> supports only one-by-one deletion<br><br>\"\n                                         \"Do you want to continue despite the fact<br>\"\n                                         \"that the DELETE operation will not be sent to Clublog?\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n        if ( reply != QMessageBox::Yes )\n            return;\n        else\n            blockClublogSignals = true;\n    }\n\n    //It must be sorted in descending order to delete the correct rows.\n    std::sort(deletedRowIndexes.begin(),\n              deletedRowIndexes.end(),\n              [](const QModelIndex &a, const QModelIndex &b)\n    {\n        return a.row() > b.row();\n    });\n\n    QProgressDialog *progress = new QProgressDialog(tr(\"Deleting QSOs\"),\n                                                    tr(\"Cancel\"),\n                                                    0,\n                                                    deletedRowIndexes.size(),\n                                                    this);\n    progress->setWindowModality(Qt::WindowModal);\n    progress->setValue(0);\n    progress->setAttribute(Qt::WA_DeleteOnClose, true);\n    progress->setAutoClose(true);\n    progress->show();\n\n    // disable Updates and current connection between model and QTableView\n    // to improve performance\n    // when reconnected model, the column are reordered. That's why we remember them\n    // and restore them again after deletion.\n    QByteArray state = ui->contactTable->horizontalHeader()->saveState();\n    ui->contactTable->setUpdatesEnabled(false);\n    ui->contactTable->setModel(nullptr);\n    QCoreApplication::processEvents();\n\n    quint32 cnt = 0;\n\n    QSet<uint> removedEntities;\n    removedEntities.reserve(deletedRowIndexes.size());\n\n    QSqlDatabase db = QSqlDatabase::database();\n    db.transaction();\n\n    for ( const QModelIndex &index : static_cast<const QModelIndexList&>(deletedRowIndexes) )\n    {\n        cnt++;\n        removedEntities << model->data(model->index(index.row(), LogbookModel::COLUMN_DXCC), Qt::DisplayRole).toUInt();\n        model->removeRow(index.row());\n\n        if ( progress->wasCanceled() )\n            break;\n\n        if ( cnt % 50 == 0 )\n            progress->setValue(cnt);\n    }\n\n    db.commit();\n\n    progress->setValue(deletedRowIndexes.size());\n    progress->done(QDialog::Accepted);\n\n    // enable connection between model and QTableView\n    ui->contactTable->setModel(model);\n    ui->contactTable->setUpdatesEnabled(true);\n    ui->contactTable->horizontalHeader()->restoreState(state);\n    updateTable();\n    scrollToIndex(previousIndex);\n    blockClublogSignals = false;\n    emit deletedEntities(removedEntities);\n}\n\nvoid LogbookWidget::exportContact()\n{\n    FCT_IDENTIFICATION;\n\n    QList<QSqlRecord>QSOs;\n    const QModelIndexList &selectedIndexes = ui->contactTable->selectionModel()->selectedRows();\n\n    if ( selectedIndexes.count() < 1 )\n        return;\n\n    for ( const QModelIndex &index : selectedIndexes )\n        QSOs << model->record(index.row());\n\n    ExportDialog dialog(QSOs);\n    dialog.exec();\n}\n\nvoid LogbookWidget::editContact()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->contactTable->selectionModel()->selectedRows().size() > 1 )\n    {\n        QMessageBox::StandardButton reply;\n        reply = QMessageBox::question(this,\n                                      tr(\"Update\"),\n                                      tr(\"By updating, all selected rows will be affected.<br>The value currently edited in the column will be applied to all selected rows.<br><br>Do you want to edit them?\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if (reply != QMessageBox::Yes) return;\n    }\n\n    ui->contactTable->edit(ui->contactTable->selectionModel()->currentIndex());\n}\n\nvoid LogbookWidget::displayedColumns()\n{\n    FCT_IDENTIFICATION;\n\n    ColumnSettingDialog dialog(ui->contactTable);\n\n    dialog.exec();\n\n    saveTableHeaderState();\n}\n\nvoid LogbookWidget::reselectModel()\n{\n    FCT_IDENTIFICATION;\n\n    model->select();\n\n    // under normal conditions, only 256 records are loaded.\n    // This will increase the value of the loaded records.\n    while ( model->canFetchMore() && model->rowCount() < 5000 )\n        model->fetchMore();\n\n    // it is not possible to use mode->rowCount here because model contains only\n    // the first 5000 records (or more) and rowCount has a value 5000 here. Therefore, it is needed\n    // to run a QSL stateme with Count. Run it only in case when QTableview does not contain all\n    // records from model\n    int qsoCount = 0;\n    if ( model->canFetchMore() )\n    {\n        QString countRecordsStmt(QLatin1String(\"SELECT COUNT(1) FROM contacts\"));\n\n        if ( !model->filter().isEmpty() )\n            countRecordsStmt.append(QString(\" WHERE %1\").arg(model->filter()));\n\n        QSqlQuery query(countRecordsStmt);\n\n        qsoCount = query.first() ? query.value(0).toInt() : 0;\n    }\n    else\n        qsoCount = model->rowCount();\n\n    ui->filteredQSOsLabel->setText(tr(\"Count: %n\", \"\", qsoCount));\n}\n\nvoid LogbookWidget::updateTable()\n{\n    FCT_IDENTIFICATION;\n\n    reselectModel();\n\n    // it is called when QSO is inserted/updated/deleted\n    // therefore it is needed to refresh country select box\n    ui->countrySelectFilter->refreshModel();\n    emit logbookUpdated();\n}\n\nvoid LogbookWidget::saveTableHeaderState()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setLogbookState(ui->contactTable->horizontalHeader()->saveState());\n}\n\nvoid LogbookWidget::showTableHeaderContextMenu(const QPoint& point)\n{\n    FCT_IDENTIFICATION;\n\n    QMenu* contextMenu = new QMenu(this);\n    for (int i = 0; i < model->columnCount(); i++)\n    {\n        const QString &name = model->headerData(i, Qt::Horizontal).toString();\n        QAction* action = new QAction(name, contextMenu);\n        action->setCheckable(true);\n        action->setChecked(!ui->contactTable->isColumnHidden(i));\n\n        connect(action, &QAction::triggered, this, [this, i]()\n        {\n            ui->contactTable->setColumnHidden(i, !ui->contactTable->isColumnHidden(i));\n            saveTableHeaderState();\n        });\n\n        contextMenu->addAction(action);\n    }\n\n    contextMenu->exec(point);\n}\n\nvoid LogbookWidget::updateSelectedRows(std::function<void(int row)> updater)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList selectedRows = ui->contactTable->selectionModel()->selectedRows();\n    if (selectedRows.isEmpty()) return;\n\n    const LogbookModel::EditStrategy originEditStrategy = model->editStrategy();\n    model->setEditStrategy(QSqlTableModel::OnManualSubmit);\n\n    for ( const QModelIndex &index : selectedRows )\n        updater(index.row());\n\n    model->submitAll();\n    model->setEditStrategy(originEditStrategy);\n    updateTable();\n}\n\nvoid LogbookWidget::markQslReceived()\n{\n    FCT_IDENTIFICATION;\n\n    updateSelectedRows([this](int row)\n    {\n        model->setData(model->index(row, LogbookModel::COLUMN_QSL_RCVD), \"Y\", Qt::EditRole);\n        model->setData(model->index(row, LogbookModel::COLUMN_QSL_RCVD_DATE), QDate::currentDate(), Qt::EditRole);\n    });\n}\n\nvoid LogbookWidget::markQslRequested()\n{\n    FCT_IDENTIFICATION;\n\n    updateSelectedRows([this](int row)\n    {\n        model->setData(model->index(row, LogbookModel::COLUMN_QSL_SENT), \"R\", Qt::EditRole);\n    });\n}\n\nvoid LogbookWidget::doubleClickColumn(QModelIndex modelIndex)\n{\n    FCT_IDENTIFICATION;\n\n\n    /***********************/\n    /* show EQSL QSL Image */\n    /***********************/\n    if ( modelIndex.column() == LogbookModel::COLUMN_EQSL_QSL_RCVD\n         && modelIndex.data().toString() == 'Y')\n    {\n        QProgressDialog* dialog = new QProgressDialog(tr(\"Downloading eQSL Image\"), tr(\"Cancel\"), 0, 0, this);\n        dialog->setWindowModality(Qt::WindowModal);\n        dialog->setRange(0, 0);\n        dialog->setAutoClose(true);\n        dialog->show();\n\n        EQSLQSLDownloader *eQSL = new EQSLQSLDownloader(dialog);\n\n        connect(eQSL, &EQSLQSLDownloader::QSLImageFound, this, [dialog, eQSL](QString imgFile)\n        {\n            dialog->done(0);\n            QDesktopServices::openUrl(QUrl::fromLocalFile(imgFile));\n            eQSL->deleteLater();\n        });\n\n        connect(eQSL, &EQSLQSLDownloader::QSLImageError, this, [this, dialog, eQSL](const QString &error)\n        {\n            dialog->done(1);\n            QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"eQSL Download Image failed: \") + error);\n            eQSL->deleteLater();\n        });\n\n        connect(dialog, &QProgressDialog::canceled, this, [eQSL]()\n        {\n            qCDebug(runtime)<< \"Operation canceled\";\n            eQSL->abortDownload();\n            eQSL->deleteLater();\n        });\n\n        eQSL->getQSLImage(model->record(modelIndex.row()));\n    }\n    /**************************/\n    /* show Paper QSL Manager */\n    /**************************/\n    else if ( modelIndex.column() == LogbookModel::COLUMN_QSL_RCVD\n         && modelIndex.data().toString() == 'Y' )\n    {\n        PaperQSLDialog dialog(model->record(modelIndex.row()));\n        dialog.exec();\n    }\n    /**************************************/\n    /* show generic QSO Show/Edit Dialog  */\n    /**************************************/\n    else\n    {\n        QSODetailDialog dialog(model->record(modelIndex.row()));\n        connect(&dialog, &QSODetailDialog::contactUpdated, this, [this](QSqlRecord& record)\n        {\n            emit contactUpdated(record);\n            emit clublogContactUpdated(record);\n        });\n        dialog.exec();\n        updateTable();\n        scrollToIndex(modelIndex);\n    }\n}\n\nvoid LogbookWidget::handleBeforeUpdate(int row, QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    Q_UNUSED(row);\n    emit contactUpdated(record);\n}\n\nvoid LogbookWidget::handleBeforeDelete(int row)\n{\n    FCT_IDENTIFICATION;\n\n    const QSqlRecord &oldRecord = model->record(row);\n    emit contactDeleted(oldRecord);\n    if ( !blockClublogSignals )\n        emit clublogContactDeleted(oldRecord);\n}\n\nvoid LogbookWidget::focusSearchCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    ui->searchTextFilter->setFocus();\n}\n\nvoid LogbookWidget::reloadSetting()\n{\n    FCT_IDENTIFICATION;\n    /* Refresh dynamic Club selection combobox */\n    refreshClubFilter();\n    callbookManager.initCallbooks();\n    updateTable();\n}\n\nvoid LogbookWidget::sendDXCSpot()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList &selectedIndexes = ui->contactTable->selectionModel()->selectedRows();\n\n    if ( selectedIndexes.count() < 1 )\n        return;\n\n    emit sendDXSpotContactReq(model->record(selectedIndexes.at(0).row()));\n}\n\nvoid LogbookWidget::setDefaultSort()\n{\n    FCT_IDENTIFICATION;\n\n    ui->contactTable->sortByColumn(LogbookModel::COLUMN_TIME_ON, Qt::DescendingOrder);\n}\n\nvoid LogbookWidget::scrollToIndex(const QModelIndex &index, bool selectItem)\n{\n    FCT_IDENTIFICATION;\n\n    if ( index == QModelIndex() )\n        return;\n\n    // is index visible ?\n    if ( ui->contactTable->visualRect(index).isEmpty() )\n    {\n        while ( model->canFetchMore() && ui->contactTable->visualRect(index).isEmpty() )\n            model->fetchMore();\n\n        if ( model->canFetchMore() )\n            model->fetchMore(); // one more fetch\n    }\n\n    ui->contactTable->scrollTo(index, QAbstractItemView::PositionAtCenter);\n    if ( selectItem )\n        ui->contactTable->selectRow(index.row());\n}\n\nvoid LogbookWidget::adjusteComboMinSize(QComboBox *combo)\n{\n    FCT_IDENTIFICATION;\n\n    if (combo->count() <= 0 )\n        return;\n\n    QFontMetrics fontMetrics(combo->font());\n    combo->setMinimumWidth(fontMetrics.horizontalAdvance(combo->itemText(0)) + 35);\n}\n\nbool LogbookWidget::eventFilter(QObject *obj, QEvent *event)\n{\n    //FCT_IDENTIFICATION;\n\n    if ( event->type() == QEvent::KeyPress && obj == ui->contactTable )\n    {\n        QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);\n        // Block SelectAll\n        if ( QKeySequence(keyEvent->modifiers() | keyEvent->key()) == QKeySequence::SelectAll )\n            return true;\n    }\n\n    return QObject::eventFilter(obj, event);\n}\n\nvoid LogbookWidget::colorsFilterWidget(QComboBox *widget)\n{\n    FCT_IDENTIFICATION;\n\n    widget->setStyleSheet( (widget->currentIndex() > 0) ? \"QComboBox {border: 2px solid red; border-radius: 4px; padding: 2px;}\"\n                                                        : \"\");\n}\n\nvoid LogbookWidget::filterTable()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList filterString;\n    QString searchText = ui->searchTextFilter->text();\n\n    // an external request from Callsign search is always used (the request is sent by the NewContact Widget)\n    if ( !ui->actionSearchCallsign->isChecked() && !callsignSearchValue.isEmpty() )\n        filterString.append(QString(\"callsign LIKE '%%1%'\").arg(callsignSearchValue.toUpper()));\n\n    for ( auto it = searchTypeList.cbegin(); it != searchTypeList.cend(); it++)\n    {\n        const SearchDefinition &def = it.value();\n        if ( !def.action ) continue;\n        if ( def.action->isChecked() && !searchText.isEmpty() )\n            filterString.append(QString(\"%1 LIKE '%%2%'\").arg(def.dbColumn, searchText.toUpper()));\n    }\n\n    const QString &bandFilterValue = ui->bandSelectFilter->currentText();\n\n    if ( ui->bandSelectFilter->currentIndex() != 0 && !bandFilterValue.isEmpty())\n        filterString.append(QString(\"band = '%1'\").arg(bandFilterValue));\n\n    const QString &modeFilterValue = ui->modeSelectFilter->currentText();\n\n    if ( ui->modeSelectFilter->currentIndex() != 0 && !modeFilterValue.isEmpty() )\n        filterString.append(QString(\"mode = '%1'\").arg(modeFilterValue));\n\n    bool OK = false;\n    int countryCode = ui->countrySelectFilter->currentValue(1).toInt(&OK);\n\n    if ( OK && countryCode > 0 )\n        filterString.append(QString(\"dxcc = '%1'\").arg(countryCode));\n\n    if ( ui->clubSelectFilter->currentIndex() != 0 )\n        filterString.append(QString(\"id in (SELECT contactid FROM contact_clubs_view WHERE clubid = '%1')\").arg(ui->clubSelectFilter->currentText()));\n\n    if ( ui->userSelectFilter->currentIndex() != 0 )\n        filterString.append(QSOFilterManager::instance()->getWhereClause(ui->userSelectFilter->currentText()));\n\n    if ( !externalFilter.isEmpty() )\n        filterString.append(QString(\"( \") + externalFilter + \")\");\n\n    model->setFilter(filterString.join(\" AND \"));\n    qCDebug(runtime) << model->query().lastQuery();\n\n    reselectModel();\n}\n\nLogbookWidget::~LogbookWidget()\n{\n    FCT_IDENTIFICATION;\n\n\n    if ( lookupDialog )\n    {\n        callbookManager.abortQuery();\n        finishQSOLookupBatch();\n    }\n    delete ui;\n}\n\nvoid LogbookWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    saveTableHeaderState();\n}\n"
  },
  {
    "path": "ui/LogbookWidget.h",
    "content": "#ifndef QLOG_UI_LOOKBOOKWIDGET_H\n#define QLOG_UI_LOOKBOOKWIDGET_H\n\n#include <QWidget>\n#include <QProxyStyle>\n#include <QComboBox>\n#include <QSqlRecord>\n#include <QActionGroup>\n\n#include \"core/CallbookManager.h\"\n#include \"component/ShutdownAwareWidget.h\"\n\nnamespace Ui {\nclass LogbookWidget;\n}\n\nclass ClubLogUploader;\nclass LogbookModel;\nclass QProgressDialog;\n\nclass LogbookWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit LogbookWidget(QWidget *parent = nullptr);\n    ~LogbookWidget();\n\n    virtual void finalizeBeforeAppExit();\n\n    enum SearchType\n    {\n        UNKNOWN_SEARCH = 0,\n        CALLSIGN_SEARCH = 1,\n        GRIDSQUARE_SEARCH = 2,\n        POTA_SEARCH = 3,\n        SOTA_SEARCH = 4,\n        WWFF_SEARCH = 5,\n        IOTA_SEARCH = 6,\n        SIG_SEARCH = 7\n    };\n\nsignals:\n    void logbookUpdated();\n    void contactUpdated(QSqlRecord&);\n    void contactDeleted(const QSqlRecord&);\n    void deletedEntities(const QSet<uint> &entities);\n    void sendDXSpotContactReq(const QSqlRecord&);\n\n    // Clublog special signals\n    // unfortunately, special rules are applied for uploading to Clublog.\n    // The Clublog's RT Interface only accepts low-rate QSO uploading.\n    // Therefore, it is necessary to send only selected QSO manipulations.\n    // That is why these 2 special signals are emitted.\n    // contactUpdated, contactDeleted signals are also emitted in these cases\n    void clublogContactUpdated(QSqlRecord&);\n    void clublogContactDeleted(const QSqlRecord&);\n\npublic slots:\n    void filterCallsign(const QString &call);\n    void filterSelectedCallsign();\n    void filterCountryBand(const QString&, const QString&, const QString&);\n    void lookupSelectedCallsign();\n    void onSearchTextChanged();\n    void bandFilterChanged();\n    void modeFilterChanged();\n    void countryFilterChanged();\n    void userFilterChanged();\n    void setUserFilter(const QString &filterName);\n    void clubFilterChanged();\n    void refreshClubFilter();\n    void refreshUserFilter();\n    void restoreFilters();\n    void updateTable();\n    void uploadClublog();\n    void deleteContact();\n    void exportContact();\n    void editContact();\n    void displayedColumns();\n    void saveTableHeaderState();\n    void showTableHeaderContextMenu(const QPoint& point);\n    void markQslReceived();\n    void markQslRequested();\n    void doubleClickColumn(QModelIndex);\n    void handleBeforeUpdate(int, QSqlRecord&);\n    void handleBeforeDelete(int);\n    void focusSearchCallsign();\n    void reloadSetting();\n    void sendDXCSpot();\n    void setDefaultSort();\n    void actionCallbookLookup();\n    void callsignFound(const CallbookResponseData &data);\n    void callsignNotFound(const QString&);\n    void callbookLoginFailed(const QString&);\n    void callbookError(const QString&);\n    void setCallsignSearch();\n    void setGridsquareSearch();\n    void setPotaSearch();\n    void setSotaSearch();\n    void setWwffSearch();\n    void setSigSearch();\n    void setIOTASearch();\n\nprivate:\n    ClubLogUploader* clublog;\n    LogbookModel* model;\n    Ui::LogbookWidget *ui;\n    QString externalFilter;\n    bool blockClublogSignals;\n    bool eventFilter(QObject *obj, QEvent *event);\n\n    void colorsFilterWidget(QComboBox *widget);\n    void filterTable();\n    void saveBandFilter();\n    void restoreBandFilter();\n    void saveModeFilter();\n    void restoreModeFilter();\n    void saveCountryFilter();\n    void restoreCountryFilter();\n    void saveUserFilter();\n    void restoreUserFilter();\n    void saveClubFilter();\n    void restoreClubFilter();\n    void saveSearchTextFilter(QAction *action);\n    void restoreSearchTextFilter();\n    void reselectModel();\n    void scrollToIndex(const QModelIndex& index, bool selectItem = true);\n    void adjusteComboMinSize(QComboBox * combo);\n    void updateQSORecordFromCallbook(const CallbookResponseData &data);\n    void queryNextQSOLookupBatch();\n    void finishQSOLookupBatch();\n    void clearSearchText();\n    void setupSearchMenu();\n    void updateSelectedRows(std::function<void(int row)> updater);\n    QModelIndexList callbookLookupBatch;\n    QModelIndex currLookupIndex;\n    CallbookManager callbookManager;\n    QProgressDialog *lookupDialog;\n    QString callsignSearchValue;\n    QActionGroup *searchTypeGroup;\n\n    class SearchDefinition\n    {\n    public:\n        SearchDefinition(const SearchType searchType, QAction *action, const QString dbColumn) :\n            searchType(searchType), action(action), dbColumn(dbColumn) {action->setData(searchType);};\n        SearchDefinition(): searchType(UNKNOWN_SEARCH), action(nullptr) {};\n\n        SearchType searchType;\n        QAction *action;\n        QString dbColumn;\n    };\n\n    QMap<SearchType, SearchDefinition> searchTypeList;\n};\n\n/* https://forum.qt.io/topic/90403/show-tooltip-immediatly/7/ */\nclass ProxyStyle : public QProxyStyle\n{\npublic:\n    using QProxyStyle::QProxyStyle;\n    int styleHint(StyleHint hint, const QStyleOption* option = nullptr,\n                  const QWidget* widget = nullptr, QStyleHintReturn* returnData = nullptr) const override\n    {\n        if (hint == QStyle::SH_ToolTip_WakeUpDelay)\n            return 0;  // show tooltip immediately\n        return QProxyStyle::styleHint(hint, option, widget, returnData);\n    }\n};\n\n#endif // QLOG_UI_LOGBOOKWIDGET_H\n"
  },
  {
    "path": "ui/LogbookWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>LogbookWidget</class>\n <widget class=\"QWidget\" name=\"LogbookWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>809</width>\n    <height>337</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string notr=\"true\">Form</string>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item row=\"0\" column=\"0\">\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n         <property name=\"spacing\">\n          <number>0</number>\n         </property>\n         <property name=\"rightMargin\">\n          <number>0</number>\n         </property>\n         <item>\n          <widget class=\"QPushButton\" name=\"searchTypeButton\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>24</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"contextMenuPolicy\">\n            <enum>Qt::NoContextMenu</enum>\n           </property>\n           <property name=\"styleSheet\">\n            <string notr=\"true\">::menu-indicator{ image: none; width: 0px;}</string>\n           </property>\n           <property name=\"text\">\n            <string notr=\"true\"/>\n           </property>\n           <property name=\"icon\">\n            <iconset resource=\"../res/icons/icons.qrc\">\n             <normaloff>:/icons/baseline-search-24px.svg</normaloff>:/icons/baseline-search-24px.svg</iconset>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLineEdit\" name=\"searchTextFilter\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>140</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"maxLength\">\n            <number>20</number>\n           </property>\n           <property name=\"clearButtonEnabled\">\n            <bool>true</bool>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"SmartSearchBox\" name=\"bandSelectFilter\" native=\"true\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"SmartSearchBox\" name=\"modeSelectFilter\" native=\"true\">\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"SmartSearchBox\" name=\"countrySelectFilter\" native=\"true\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"SmartSearchBox\" name=\"clubSelectFilter\" native=\"true\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"SmartSearchBox\" name=\"userSelectFilter\" native=\"true\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>40</width>\n           <height>20</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"filteredQSOsLabel\">\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QTableQSOView\" name=\"contactTable\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"contextMenuPolicy\">\n        <enum>Qt::ActionsContextMenu</enum>\n       </property>\n       <property name=\"editTriggers\">\n        <set>QAbstractItemView::EditKeyPressed</set>\n       </property>\n       <property name=\"tabKeyNavigation\">\n        <bool>false</bool>\n       </property>\n       <property name=\"alternatingRowColors\">\n        <bool>true</bool>\n       </property>\n       <property name=\"selectionBehavior\">\n        <enum>QAbstractItemView::SelectRows</enum>\n       </property>\n       <property name=\"verticalScrollMode\">\n        <enum>QAbstractItemView::ScrollPerPixel</enum>\n       </property>\n       <property name=\"horizontalScrollMode\">\n        <enum>QAbstractItemView::ScrollPerPixel</enum>\n       </property>\n       <property name=\"sortingEnabled\">\n        <bool>false</bool>\n       </property>\n       <attribute name=\"verticalHeaderVisible\">\n        <bool>false</bool>\n       </attribute>\n       <attribute name=\"verticalHeaderMinimumSectionSize\">\n        <number>25</number>\n       </attribute>\n       <attribute name=\"verticalHeaderDefaultSectionSize\">\n        <number>25</number>\n       </attribute>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionDeleteContact\">\n   <property name=\"icon\">\n    <iconset theme=\"edit-delete\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Delete</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Logbook - Delete QSO</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Del</string>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionUploadClublog\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/cloud_upload-24px.svg</normaloff>:/icons/cloud_upload-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Upload to Clublog</string>\n   </property>\n  </action>\n  <action name=\"actionLookup\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/baseline-search-24px.svg</normaloff>:/icons/baseline-search-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Lookup on Web</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Lookup on Web</string>\n   </property>\n  </action>\n  <action name=\"actionCallbookLookup\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/cloud_download-24px.svg</normaloff>:/icons/cloud_download-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Update from Callbook</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Add Missing Info</string>\n   </property>\n  </action>\n  <action name=\"actionQSLRcvd\">\n   <property name=\"text\">\n    <string>Mark QSL RCVD</string>\n   </property>\n  </action>\n  <action name=\"actionQSLRequested\">\n   <property name=\"text\">\n    <string>Mark QSL Requested</string>\n   </property>\n  </action>\n  <action name=\"actionFilter\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/filter_list-24px.svg</normaloff>:/icons/filter_list-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Filter Callsign</string>\n   </property>\n  </action>\n  <action name=\"actionEditContact\">\n   <property name=\"text\">\n    <string>Edit Value</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Logbook - Edit Value</string>\n   </property>\n  </action>\n  <action name=\"actionDisplayedColumns\">\n   <property name=\"text\">\n    <string>Column Visibility </string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Which columns should be displayed</string>\n   </property>\n  </action>\n  <action name=\"actionExportAs\">\n   <property name=\"icon\">\n    <iconset theme=\"document-export\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Export Selected</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Export selected QSOs</string>\n   </property>\n  </action>\n  <action name=\"actionSendDXCSpot\">\n   <property name=\"text\">\n    <string>Send DX Spot</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Logbook - Send DX Spot</string>\n   </property>\n  </action>\n  <action name=\"actionSearchCallsign\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Callsign</string>\n   </property>\n  </action>\n  <action name=\"actionSearchGrid\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Gridsquare</string>\n   </property>\n  </action>\n  <action name=\"actionSearchPOTA\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>POTA</string>\n   </property>\n  </action>\n  <action name=\"actionSearchSOTA\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>SOTA</string>\n   </property>\n  </action>\n  <action name=\"actionSearchWWFF\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>WWFF</string>\n   </property>\n  </action>\n  <action name=\"actionSearchSIG\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>SIG</string>\n   </property>\n  </action>\n  <action name=\"actionSearchIOTA\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>IOTA</string>\n   </property>\n  </action>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>QTableQSOView</class>\n   <extends>QTableView</extends>\n   <header>ui/QTableQSOView.h</header>\n  </customwidget>\n  <customwidget>\n   <class>SmartSearchBox</class>\n   <extends>QWidget</extends>\n   <header>ui/component/SmartSearchBox.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>actionDeleteContact</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>deleteContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>247</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>searchTextFilter</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>onSearchTextChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>129</x>\n     <y>16</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionUploadClublog</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>uploadClublog()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionFilter</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>filterSelectedCallsign()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionLookup</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>lookupSelectedCallsign()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionCallbookLookup</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>actionCallbookLookup()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionEditContact</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>editContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDisplayedColumns</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>displayedColumns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>contactTable</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>doubleClickColumn(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>404</x>\n     <y>189</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionExportAs</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>exportContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSendDXCSpot</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>sendDXCSpot()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchCallsign</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setCallsignSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchGrid</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setGridsquareSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchPOTA</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setPotaSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchSOTA</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setSotaSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchWWFF</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setWwffSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchSIG</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setSigSearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSearchIOTA</sender>\n   <signal>triggered()</signal>\n   <receiver>LogbookWidget</receiver>\n   <slot>setIOTASearch()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>deleteContact()</slot>\n  <slot>onSearchTextChanged()</slot>\n  <slot>bandFilterChanged()</slot>\n  <slot>uploadClublog()</slot>\n  <slot>filterSelectedCallsign()</slot>\n  <slot>lookupSelectedCallsign()</slot>\n  <slot>actionCallbookLookup()</slot>\n  <slot>actionQSLRcvd()</slot>\n  <slot>actionQSLRequested()</slot>\n  <slot>modeFilterChanged()</slot>\n  <slot>countryFilterChanged()</slot>\n  <slot>editContact()</slot>\n  <slot>displayedColumns()</slot>\n  <slot>userFilterChanged()</slot>\n  <slot>doubleClickColumn(QModelIndex)</slot>\n  <slot>exportContact()</slot>\n  <slot>clubFilterChanged()</slot>\n  <slot>sendDXCSpot()</slot>\n  <slot>setCallsignSearch()</slot>\n  <slot>setGridsquareSearch()</slot>\n  <slot>setPotaSearch()</slot>\n  <slot>setSotaSearch()</slot>\n  <slot>setWwffSearch()</slot>\n  <slot>setSigSearch()</slot>\n  <slot>setIOTASearch()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/MainWindow.cpp",
    "content": "#include <QMessageBox>\n#include <QLabel>\n#include <QColor>\n#include <QSpacerItem>\n#include <QShortcut>\n#include <QDesktopServices>\n#include <QStyleHints>\n\n#include \"MainWindow.h\"\n#include \"ui_MainWindow.h\"\n#include \"ui/SettingsDialog.h\"\n#include \"ui/ImportDialog.h\"\n#include \"ui/ExportDialog.h\"\n#include \"ui/DevToolsDialog.h\"\n#include \"ui/CabrilloExportDialog.h\"\n#include \"core/FldigiTCPServer.h\"\n#include \"rig/Rig.h\"\n#include \"rotator/Rotator.h\"\n#include \"cwkey/CWKeyer.h\"\n#include \"core/WsjtxUDPReceiver.h\"\n#include \"core/debug.h\"\n#include \"ui/NewContactWidget.h\"\n#include \"ui/QSOFilterDialog.h\"\n#include \"ui/AwardsDialog.h\"\n#include \"ui/DXCCSubmissionDialog.h\"\n#include \"core/PropConditions.h\"\n#include \"data/MainLayoutProfile.h\"\n#include \"ui/EditActivitiesDialog.h\"\n#include \"ui/ProfileImageWidget.h\"\n#include \"core/LogParam.h\"\n#include \"core/QSOFilterManager.h\"\n#include \"data/Data.h\"\n#include \"data/ActivityProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/RotProfile.h\"\n#include \"ui/DownloadQSLDialog.h\"\n#include \"ui/UploadQSODialog.h\"\n#include \"core/LogParam.h\"\n#include \"core/PotaQE.h\"\n#include \"data/WsjtxEntry.h\"\n#include \"core/LogDatabase.h\"\n#include \"core/CredentialStore.h\"\n#include \"core/PlatformParameterManager.h\"\n#include \"core/FileCompressor.h\"\n#include \"ui/ExportPasswordDialog.h\"\n#include \"ui/LoadDatabaseDialog.h\"\n#include \"ui/PlatformSettingsDialog.h\"\n#include \"ui/QSLGalleryDialog.h\"\n#include \"ui/QSLPrintLabelDialog.h\"\n#include <QFileDialog>\n#include <QProcess>\n#include <QThread>\n#include <QTemporaryFile>\n\nMODULE_IDENTIFICATION(\"qlog.ui.mainwindow\");\n\nMainWindow::MainWindow(QWidget* parent) :\n    QMainWindow(parent),\n    ui(new Ui::MainWindow),\n    stats(new StatisticsWidget),\n    clublogRT(new ClubLogUploader(this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    restoreContestMenuSeqnoType();\n    restoreContestMenuDupeType();\n    restoreContestMenuLinkExchange();\n\n    PotaQE::instance();\n\n    themeButton = new QPushButton(this);\n    themeButton->setToolTip(tr(\"Color Theme\"));\n    themeButton->setObjectName(\"themeButton\");\n    themeButton->setFocusPolicy(Qt::ClickFocus);\n    themeButton->setIcon(QIcon(QPixmap(\":/icons/color-palette-dark.svg\")));\n    themeButton->setFlat(true);\n\n    QMenu *themeMenu = new QMenu(this);\n    themeMenu->addAction(ui->actionThemeNative);\n    themeMenu->addAction(ui->actionThemeLight);\n    themeMenu->addAction(ui->actionThemeDark);\n    QActionGroup *themeGroup = new QActionGroup(this);\n    themeGroup->addAction(ui->actionThemeNative);\n    themeGroup->addAction(ui->actionThemeLight);\n    themeGroup->addAction(ui->actionThemeDark);\n\n    themeButton->setMenu(themeMenu);\n\n    /* Dark Mode is supported only in case of Fusion Style */\n    if ( QApplication::style()->objectName().compare(\"fusion\",\n                                                     Qt::CaseSensitivity::CaseInsensitive) != 0)\n    {\n        isFusionStyle = false;\n        themeButton->setEnabled(false);\n        themeButton->setToolTip(tr(\"Not enabled for non-Fusion style\"));\n    }\n    else\n    {\n        isFusionStyle = true;\n    }\n\n    /* the block below is present because the main window\n     * becomes large after the instalation\n     */\n    ui->wsjtxDockWidget->hide();\n    ui->rotatorDockWidget->hide();\n    ui->bandmapDockWidget->hide();\n    ui->mapDockWidget->hide();\n    ui->dxDockWidget->hide();\n    ui->rigDockWidget->hide();\n    ui->cwConsoleDockWidget->hide();\n    ui->chatDockWidget->hide();\n    ui->profileImageDockWidget->hide();\n    ui->alertDockWidget->hide();\n\n    ui->cwconsoleWidget->registerContactWidget(ui->newContactWidget);\n    ui->rotatorWidget->registerContactWidget(ui->newContactWidget);\n    ui->onlineMapWidget->registerContactWidget(ui->newContactWidget);\n    ui->chatWidget->registerContactWidget(ui->newContactWidget);\n\n    const QList<QDockWidget *> dockWidgets = findChildren<QDockWidget *>();\n    for (QDockWidget *dockWidget : dockWidgets) {\n        if (!dockWidget)\n            continue;\n\n        if (dockWidget)\n            dockWidget->setAttribute(Qt::WA_MacAlwaysShowToolWindow, true);\n\n        if (auto tabs = dockWidget->findChild<QTabWidget*>()) {\n            if (tabs->tabBar())\n                tabs->tabBar()->show();\n        }\n    }\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    activityButton = new QPushButton(\"\", ui->statusBar);\n    activityButton->setFlat(true);\n    activityButton->setFocusPolicy(Qt::NoFocus);\n    activityButton->setObjectName(\"activityButton\");\n    QMenu *activityMenu = new QMenu(activityButton);\n    activityButton->setMenu(activityMenu);\n\n    conditionsLabel = new QLabel(\"\", ui->statusBar);\n    conditionsLabel->setIndent(20);\n    conditionsLabel->setToolTip(QString(\"<img src='%1'>\").arg(PropConditions::solarSummaryFile()));\n    profileLabel = new QLabel(\"<b>\" + profile.profileName + \":</b>\", ui->statusBar);\n    profileLabel->setIndent(10);\n    callsignLabel = new QLabel(stationCallsignStatus(profile), ui->statusBar);\n    locatorLabel = new QLabel(profile.locator.toLower(), ui->statusBar);\n    contestLabel = new QLabel(ui->statusBar);\n    contestLabel->setIndent(20);\n    alertButton = new QPushButton(\"0\", ui->statusBar);\n    alertButton->setIcon(QIcon(\":/icons/alert.svg\"));\n    alertButton->setFlat(true);\n    alertButton->setFocusPolicy(Qt::NoFocus);\n    QMenu *menuAlert = new QMenu(this);\n    menuAlert->addAction(ui->actionShowAlerts);\n    menuAlert->addAction(ui->actionClearAlerts);\n    menuAlert->addSeparator();\n    menuAlert->addAction(ui->actionEditAlertRules);\n    menuAlert->addAction(ui->actionBeepSettingAlert);\n    ui->actionBeepSettingAlert->setChecked(LogParam::getMainWindowAlertBeep());\n    alertButton->setMenu(menuAlert);\n\n    alertTextButton = new QPushButton(\" \", ui->statusBar);\n    alertTextButton->setObjectName(\"alertTextButton\");\n    alertTextButton->setFlat(true);\n    alertTextButton->setFocusPolicy(Qt::NoFocus);\n    alertTextButton->setToolTip(tr(\"Press to tune the alert\"));\n\n    ui->toolBar->hide();\n    ui->statusBar->addWidget(activityButton);\n    ui->statusBar->addWidget(profileLabel);\n    ui->statusBar->addWidget(callsignLabel);\n    ui->statusBar->addWidget(locatorLabel);\n    ui->statusBar->addWidget(contestLabel);\n    ui->statusBar->addWidget(conditionsLabel);\n\n    ui->statusBar->addPermanentWidget(alertTextButton);\n    ui->statusBar->addPermanentWidget(alertButton);\n    ui->statusBar->addPermanentWidget(themeButton);\n\n    setContestMode(LogParam::getContestID());\n\n    connect(seqGroup, &QActionGroup::triggered, this, &MainWindow::saveContestMenuSeqnoType);\n    connect(dupeGroup, &QActionGroup::triggered, this, &MainWindow::saveContestMenuDupeType);\n    connect(linkExchangeGroup, &QActionGroup::triggered, this, &MainWindow::saveContestMenuLinkExchangeType);\n    \n    connect(ActivityProfilesManager::instance(), &ActivityProfilesManager::changeFinished,\n            this, &MainWindow::handleActivityChange);\n    connect(ActivityProfilesManager::instance(), &ActivityProfilesManager::changeFinished,\n            ui->newContactWidget, &NewContactWidget::setValuesFromActivity);\n\n    connect(AntProfilesManager::instance(), &AntProfilesManager::profileChanged,\n            ui->newContactWidget, &NewContactWidget::refreshAntProfileCombo);\n    connect(AntProfilesManager::instance(), &AntProfilesManager::profileChanged,\n            ui->onlineMapWidget, &OnlineMapWidget::flyToMyQTH);\n\n    connect(RotProfilesManager::instance(), &RotProfilesManager::profileChanged,\n            ui->rotatorWidget, &RotatorWidget::refreshRotProfileCombo);\n\n    connect(RigProfilesManager::instance(), &RigProfilesManager::profileChanged,\n            ui->newContactWidget, &NewContactWidget::refreshRigProfileCombo);\n    connect(RigProfilesManager::instance(), &RigProfilesManager::profileChanged,\n            ui->rigWidget, &RigWidget::refreshRigProfileCombo);\n\n    connect(MainLayoutProfilesManager::instance(), &MainLayoutProfilesManager::profileChanged,\n            ui->newContactWidget, &NewContactWidget::setupCustomUi);\n\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            this, &MainWindow::stationProfileChanged);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->newContactWidget, &NewContactWidget::refreshStationProfileCombo);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->rotatorWidget, &RotatorWidget::redrawMap);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->onlineMapWidget, &OnlineMapWidget::flyToMyQTH);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->chatWidget, &ChatWidget::reloadStationProfile);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->clockWidget, &ClockWidget::updateSun);\n    connect(StationProfilesManager::instance(), &StationProfilesManager::profileChanged,\n            ui->dxWidget, &DxWidget::recalculateTrend);\n\n    connect(this, &MainWindow::themeChanged, ui->bandmapWidget, &BandmapWidget::update);\n    connect(this, &MainWindow::themeChanged, ui->clockWidget, &ClockWidget::updateClock);\n    connect(this, &MainWindow::themeChanged, ui->onlineMapWidget, &OnlineMapWidget::changeTheme);\n    connect(this, &MainWindow::themeChanged, ui->rotatorWidget, &RotatorWidget::redrawMap);\n    connect(this, &MainWindow::themeChanged, stats, &StatisticsWidget::changeTheme);\n\n    connect(ui->actionThemeNative, &QAction::triggered, this, [this]() {\n        this->themeInit(0);\n    });\n    connect(ui->actionThemeDark, &QAction::triggered, this, [this]() {\n        this->themeInit(1);\n    });\n    connect(ui->actionThemeLight, &QAction::triggered, this, [this]() {\n        this->themeInit(2);\n    });\n\n    connect(Rig::instance(), &Rig::rigErrorPresent, this, &MainWindow::rigErrorHandler);\n    connect(Rig::instance(), &Rig::rigCWKeyOpenRequest, this, &MainWindow::cwKeyerConnectProfile);\n    connect(Rig::instance(), &Rig::rigCWKeyCloseRequest, this, &MainWindow::cwKeyerDisconnectProfile);\n    connect(Rig::instance(), &Rig::frequencyChanged, ui->onlineMapWidget, &OnlineMapWidget::setIBPBand);\n    connect(Rig::instance(), &Rig::frequencyChanged, ui->bandmapWidget , &BandmapWidget::updateTunedFrequency);\n    connect(Rig::instance(), &Rig::frequencyChanged, ui->newContactWidget, &NewContactWidget::changeFrequency);\n    connect(Rig::instance(), &Rig::frequencyChanged, ui->rigWidget, &RigWidget::updateFrequency);\n    connect(Rig::instance(), &Rig::frequencyChanged, ui->dxWidget , &DxWidget::setTunedFrequency);\n    connect(Rig::instance(), &Rig::modeChanged, ui->bandmapWidget, &BandmapWidget::updateMode);\n    connect(Rig::instance(), &Rig::modeChanged, ui->newContactWidget, &NewContactWidget::changeModefromRig);\n    connect(Rig::instance(), &Rig::modeChanged, ui->rigWidget, &RigWidget::updateMode);\n    connect(Rig::instance(), &Rig::powerChanged, ui->newContactWidget, &NewContactWidget::changePower);\n    connect(Rig::instance(), &Rig::powerChanged, ui->rigWidget, &RigWidget::updatePWR);\n    connect(Rig::instance(), &Rig::rigConnected, ui->newContactWidget, &NewContactWidget::rigConnected);\n    connect(Rig::instance(), &Rig::rigConnected, ui->rigWidget, &RigWidget::rigConnected);\n    connect(Rig::instance(), &Rig::rigConnected, ui->cwconsoleWidget, &CWConsoleWidget::rigConnectHandler);\n    connect(Rig::instance(), &Rig::rigDisconnected, ui->cwconsoleWidget, &CWConsoleWidget::rigDisconnectHandler);\n    connect(Rig::instance(), &Rig::rigDisconnected, ui->newContactWidget, &NewContactWidget::rigDisconnected);\n    connect(Rig::instance(), &Rig::rigDisconnected, ui->rigWidget, &RigWidget::rigDisconnected);\n    connect(Rig::instance(), &Rig::vfoChanged, ui->rigWidget, &RigWidget::updateVFO);\n    connect(Rig::instance(), &Rig::xitChanged, ui->rigWidget, &RigWidget::updateXIT);\n    connect(Rig::instance(), &Rig::ritChanged, ui->rigWidget, &RigWidget::updateRIT);\n    connect(Rig::instance(), &Rig::pttChanged, ui->rigWidget, &RigWidget::updatePTT);\n    connect(Rig::instance(), &Rig::splitChanged, ui->rigWidget, &RigWidget::updateSplit);\n    connect(Rig::instance(), &Rig::splitChanged, ui->newContactWidget, &NewContactWidget::changeSplit);\n    connect(Rig::instance(), &Rig::rigStatusChanged, &networknotification, &NetworkNotification::rigStatus);\n    connect(Rig::instance(), &Rig::rigStatusHeartBeat, &networknotification, &NetworkNotification::rigStatus);\n\n    connect(Rotator::instance(), &Rotator::rotErrorPresent, this, &MainWindow::rotErrorHandler);\n    connect(Rotator::instance(), &Rotator::positionChanged, ui->onlineMapWidget, &OnlineMapWidget::antPositionChanged);\n    connect(Rotator::instance(), &Rotator::rotConnected, ui->onlineMapWidget, &OnlineMapWidget::rotConnected);\n    connect(Rotator::instance(), &Rotator::rotDisconnected, ui->onlineMapWidget, &OnlineMapWidget::rotDisconnected);\n    connect(Rotator::instance(), &Rotator::positionChanged, ui->rotatorWidget, &RotatorWidget::positionChanged);\n    connect(Rotator::instance(), &Rotator::rotConnected, ui->rotatorWidget, &RotatorWidget::rotConnected);\n    connect(Rotator::instance(), &Rotator::rotDisconnected, ui->rotatorWidget, &RotatorWidget::rotDisconnected);\n\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyerError, this, &MainWindow::cwKeyerErrorHandler);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyWPMChanged, ui->cwconsoleWidget, &CWConsoleWidget::setWPM);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyEchoText, ui->cwconsoleWidget, &CWConsoleWidget::appendCWEchoText);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyConnected, ui->cwconsoleWidget, &CWConsoleWidget::cwKeyConnected);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyDisconnected, ui->cwconsoleWidget, &CWConsoleWidget::cwKeyDisconnected);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyHWButton, ui->cwconsoleWidget, &CWConsoleWidget::pressMacroButton);\n    connect(CWKeyer::instance(), &CWKeyer::cwKeyHWHaltPressed, ui->cwconsoleWidget, &CWConsoleWidget::haltButtonPressed);\n\n    FldigiTCPServer* fldigi = new FldigiTCPServer(this);\n    connect(fldigi, &FldigiTCPServer::addContact, ui->newContactWidget, &NewContactWidget::saveExternalContact);\n\n    wsjtx = new WsjtxUDPReceiver(this);\n    connect(wsjtx, &WsjtxUDPReceiver::statusReceived, ui->wsjtxWidget, &WsjtxWidget::statusReceived);\n    connect(wsjtx, &WsjtxUDPReceiver::decodeReceived, ui->wsjtxWidget, &WsjtxWidget::decodeReceived);\n    connect(wsjtx, &WsjtxUDPReceiver::addContact, ui->newContactWidget, &NewContactWidget::saveExternalContact);\n    connect(ui->wsjtxWidget, &WsjtxWidget::CQSpot, &networknotification, &NetworkNotification::WSJTXCQSpot);\n    connect(ui->wsjtxWidget, &WsjtxWidget::CQSpot, &alertEvaluator, &AlertEvaluator::WSJTXCQSpot);\n    connect(ui->wsjtxWidget, &WsjtxWidget::filteredCQSpot, wsjtx, &WsjtxUDPReceiver::sendHighlightCallsign);\n    connect(ui->wsjtxWidget, &WsjtxWidget::filteredCQSpot, ui->onlineMapWidget, &OnlineMapWidget::drawWSJTXSpot);\n    connect(ui->wsjtxWidget, &WsjtxWidget::updatedCQSpot, wsjtx, &WsjtxUDPReceiver::sendClearHighlightCallsign);\n    connect(ui->wsjtxWidget, &WsjtxWidget::spotsCleared, wsjtx, &WsjtxUDPReceiver::sendClearAllHighlightCallsign);\n    connect(ui->wsjtxWidget, &WsjtxWidget::spotsCleared, ui->onlineMapWidget, &OnlineMapWidget::clearWSJTXSpots);\n    connect(ui->wsjtxWidget, &WsjtxWidget::reply, wsjtx, &WsjtxUDPReceiver::sendReply);\n    connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->newContactWidget, &NewContactWidget::changeFrequency);\n    connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->onlineMapWidget, &OnlineMapWidget::setIBPBand);\n    connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->bandmapWidget , &BandmapWidget::updateTunedFrequency);\n    connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, ui->dxWidget , &DxWidget::setTunedFrequency);\n    connect(ui->wsjtxWidget, &WsjtxWidget::modeChanged, ui->newContactWidget, &NewContactWidget::changeModefromRig);\n\n    connect(this, &MainWindow::settingsChanged, wsjtx, &WsjtxUDPReceiver::reloadSetting);\n    connect(this, &MainWindow::settingsChanged, ui->rotatorWidget, &RotatorWidget::reloadSettings);\n    connect(this, &MainWindow::settingsChanged, ui->rigWidget, &RigWidget::reloadSettings);\n    connect(this, &MainWindow::settingsChanged, ui->cwconsoleWidget, &CWConsoleWidget::reloadSettings);\n    connect(this, &MainWindow::settingsChanged, ui->rotatorWidget, &RotatorWidget::redrawMap);\n    connect(this, &MainWindow::settingsChanged, ui->onlineMapWidget, &OnlineMapWidget::flyToMyQTH);\n    connect(this, &MainWindow::settingsChanged, ui->logbookWidget, &LogbookWidget::reloadSetting);\n    connect(this, &MainWindow::settingsChanged, ui->dxWidget, &DxWidget::reloadSetting);\n    connect(this, &MainWindow::settingsChanged, ui->bandmapWidget, &BandmapWidget::recalculateDxccStatus);\n    connect(this, &MainWindow::settingsChanged, ui->alertsWidget, &AlertWidget::recalculateDxccStatus);\n    connect(this, &MainWindow::settingsChanged, ui->chatWidget, &ChatWidget::recalculateDxccStatus);\n    connect(this, &MainWindow::settingsChanged, ui->newContactWidget, &NewContactWidget::readGlobalSettings);\n    connect(this, &MainWindow::altBackslash, Rig::instance(), &Rig::setPTT);\n    connect(this, &MainWindow::manualMode, ui->newContactWidget, &NewContactWidget::setManualMode);\n    connect(this, &MainWindow::contestStopped, ui->newContactWidget, &NewContactWidget::stopContest);\n    connect(this, &MainWindow::contestStopped, ui->bandmapWidget, &BandmapWidget::resetDupe);\n    connect(this, &MainWindow::contestStopped, ui->alertsWidget, &AlertWidget::resetDupe);\n    connect(this, &MainWindow::contestStopped, ui->chatWidget, &ChatWidget::resetDupe);\n\n    connect(this, &MainWindow::dupeTypeChanged, ui->bandmapWidget, &BandmapWidget::recalculateDupe);\n    connect(this, &MainWindow::dupeTypeChanged, ui->alertsWidget, &AlertWidget::recalculateDupe);\n    connect(this, &MainWindow::dupeTypeChanged, ui->chatWidget, &ChatWidget::recalculateDupe);\n    connect(this, &MainWindow::dupeTypeChanged, ui->newContactWidget, &NewContactWidget::refreshCallsignsColors);\n\n    connect(ui->rigWidget, &RigWidget::rigProfileChanged, this, &MainWindow::rigConnect);\n\n    connect(ui->rotatorWidget, &RotatorWidget::rotProfileChanged, this, &MainWindow::rotConnect);\n\n    connect(ui->logbookWidget, &LogbookWidget::deletedEntities, Data::instance(), &Data::invalidateSetOfDXCCStatusCache); // must be the first delete signal\n    connect(ui->logbookWidget, &LogbookWidget::logbookUpdated, stats, &StatisticsWidget::refreshWidget);\n    connect(ui->logbookWidget, &LogbookWidget::contactUpdated, &networknotification, &NetworkNotification::QSOUpdated);\n    connect(ui->logbookWidget, &LogbookWidget::clublogContactUpdated, clublogRT, &ClubLogUploader::updateQSOImmediately);\n    connect(ui->logbookWidget, &LogbookWidget::contactDeleted, &networknotification, &NetworkNotification::QSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::contactDeleted, ui->bandmapWidget, &BandmapWidget::updateSpotsDupeWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::deletedEntities, ui->bandmapWidget, &BandmapWidget::updateSpotsDxccStatusWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::contactDeleted, ui->alertsWidget, &AlertWidget::updateSpotsDupeWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::deletedEntities, ui->alertsWidget, &AlertWidget::updateSpotsDxccStatusWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::contactDeleted, ui->chatWidget, &ChatWidget::updateSpotsDupeWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::deletedEntities, ui->chatWidget, &ChatWidget::updateSpotsDxccStatusWhenQSODeleted);\n    connect(ui->logbookWidget, &LogbookWidget::deletedEntities, ui->newContactWidget, &NewContactWidget::refreshCallsignsColors);\n    connect(ui->logbookWidget, &LogbookWidget::clublogContactDeleted, clublogRT, &ClubLogUploader::deleteQSOImmediately);\n    connect(ui->logbookWidget, &LogbookWidget::sendDXSpotContactReq, ui->dxWidget, &DxWidget::prepareQSOSpot);\n\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, Data::instance(), &Data::invalidateDXCCStatusCache); // must be the first delete signal\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->logbookWidget, &LogbookWidget::updateTable);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->logbookWidget, &LogbookWidget::setDefaultSort);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, &networknotification, &NetworkNotification::QSOInserted);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->bandmapWidget, &BandmapWidget::updateSpotsStatusWhenQSOAdded);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->alertsWidget, &AlertWidget::updateSpotsStatusWhenQSOAdded);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->chatWidget, &ChatWidget::updateSpotsStatusWhenQSOAdded);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->wsjtxWidget, &WsjtxWidget::updateSpotsStatusWhenQSOAdded);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, ui->dxWidget, &DxWidget::setLastQSO);\n    connect(ui->newContactWidget, &NewContactWidget::contactAdded, clublogRT, &ClubLogUploader::insertQSOImmediately);\n    connect(ui->newContactWidget, &NewContactWidget::contestStarted, this, &MainWindow::startContest);\n    connect(ui->newContactWidget, &NewContactWidget::newTarget, ui->mapWidget, &MapWidget::setTarget);\n    connect(ui->newContactWidget, &NewContactWidget::newTarget, ui->onlineMapWidget, &OnlineMapWidget::setTarget);\n    connect(ui->newContactWidget, &NewContactWidget::newTarget, ui->rotatorWidget, &RotatorWidget::setQSOBearing);\n    connect(ui->newContactWidget, &NewContactWidget::filterCallsign, ui->logbookWidget, &LogbookWidget::filterCallsign);\n    connect(ui->newContactWidget, &NewContactWidget::userFrequencyChanged, ui->bandmapWidget, &BandmapWidget::updateTunedFrequency);\n    connect(ui->newContactWidget, &NewContactWidget::userFrequencyChanged, ui->onlineMapWidget, &OnlineMapWidget::setIBPBand);\n    connect(ui->newContactWidget, &NewContactWidget::userFrequencyChanged, ui->dxWidget , &DxWidget::setTunedFrequency);\n    connect(ui->newContactWidget, &NewContactWidget::userModeChanged, ui->bandmapWidget, &BandmapWidget::updateMode);\n    connect(ui->newContactWidget, &NewContactWidget::markQSO, ui->bandmapWidget, &BandmapWidget::addSpot);\n    connect(ui->newContactWidget, &NewContactWidget::callboolImageUrl, ui->profileImageWidget, &ProfileImageWidget::loadImageFromUrl);\n    connect(ui->newContactWidget, &NewContactWidget::rigProfileChanged, this, &MainWindow::rigConnect);\n    connect(ui->newContactWidget, &NewContactWidget::callsignChanged, ui->cwconsoleWidget, &CWConsoleWidget::stopRepeateButtons);\n    connect(ui->newContactWidget, &NewContactWidget::contactReset, ui->cwconsoleWidget, &CWConsoleWidget::stopRepeateButtons);\n\n    connect(ui->dxWidget, &DxWidget::newFilteredSpot, ui->bandmapWidget, &BandmapWidget::addSpot);\n    connect(ui->dxWidget, &DxWidget::newFilteredSpot, Rig::instance(), &Rig::sendDXSpot);\n    connect(ui->dxWidget, &DxWidget::newSpot, &networknotification, &NetworkNotification::dxSpot);\n    connect(ui->dxWidget, &DxWidget::newSpot, &alertEvaluator, &AlertEvaluator::dxSpot);\n    connect(ui->dxWidget, &DxWidget::newWCYSpot, &networknotification, &NetworkNotification::wcySpot);\n    connect(ui->dxWidget, &DxWidget::newWWVSpot, &networknotification, &NetworkNotification::wwvSpot);\n    connect(ui->dxWidget, &DxWidget::newToAllSpot, &networknotification, &NetworkNotification::toAllSpot);\n    connect(ui->dxWidget, &DxWidget::tuneDx, ui->newContactWidget, &NewContactWidget::tuneDx);\n    connect(ui->dxWidget, &DxWidget::tuneBand, ui->rigWidget, &RigWidget::setBand);\n    ui->dxWidget->registerContactWidget(ui->newContactWidget);\n\n    connect(&alertEvaluator, &AlertEvaluator::spotAlert, this, &MainWindow::processSpotAlert);\n    connect(&alertEvaluator, &AlertEvaluator::spotAlert, &networknotification, &NetworkNotification::spotAlert);\n\n    connect(ui->bandmapWidget, &BandmapWidget::tuneDx, ui->newContactWidget, &NewContactWidget::tuneDx);\n    connect(ui->bandmapWidget, &BandmapWidget::nearestSpotFound, ui->newContactWidget, &NewContactWidget::setNearestSpot);\n    connect(ui->bandmapWidget, &BandmapWidget::requestNewNonVfoBandmapWindow, this, &MainWindow::openNonVfoBandmap);\n\n    connect(ui->wsjtxWidget, &WsjtxWidget::callsignSelected, ui->newContactWidget, &NewContactWidget::prepareWSJTXQSO);\n\n    connect(ui->chatWidget, &ChatWidget::prepareQSOInfo, ui->newContactWidget, &NewContactWidget::fillCallsignGrid);\n    connect(ui->chatWidget, &ChatWidget::userListUpdated, ui->onlineMapWidget, &OnlineMapWidget::drawChatUsers);\n    connect(ui->chatWidget, &ChatWidget::beamingRequested, ui->rotatorWidget, &RotatorWidget::setBearing);\n\n    connect(ui->onlineMapWidget, &OnlineMapWidget::chatCallsignPressed, ui->chatWidget, &ChatWidget::setChatCallsign);\n    connect(ui->onlineMapWidget, &OnlineMapWidget::wsjtxCallsignPressed, ui->wsjtxWidget, &WsjtxWidget::callsignClicked);\n\n    connect(ui->alertsWidget, &AlertWidget::rulesChanged, &alertEvaluator, &AlertEvaluator::loadRules);\n    connect(ui->alertsWidget, &AlertWidget::alertsCleared, this, &MainWindow::clearAlertEvent);\n    connect(ui->alertsWidget, &AlertWidget::tuneDx, ui->newContactWidget, &NewContactWidget::tuneDx);\n    connect(ui->alertsWidget, &AlertWidget::tuneWsjtx, wsjtx, &WsjtxUDPReceiver::sendReply);\n\n    conditions = new PropConditions();\n\n    connect(conditions, &PropConditions::conditionsUpdated, this, &MainWindow::conditionsUpdated);\n    connect(conditions, &PropConditions::auroraMapUpdated, ui->onlineMapWidget, &OnlineMapWidget::auroraDataUpdate);\n    connect(conditions, &PropConditions::mufMapUpdated, ui->onlineMapWidget, &OnlineMapWidget::mufDataUpdate);\n    connect(conditions, &PropConditions::dxTrendFinalized, ui->dxWidget, &DxWidget::setDxTrend);\n\n    ui->onlineMapWidget->assignPropConditions(conditions);\n    ui->newContactWidget->assignPropConditions(conditions);\n\n    connect(clublogRT, &ClubLogUploader::uploadError, this, [this](const QString &msg)\n    {\n        qCInfo(runtime) << \"Clublog RT Upload Error: \" << msg;\n        QMessageBox::warning(this, tr(\"Clublog Immediately Upload Error\"), msg);\n    });\n\n    connect(clublogRT, &ClubLogUploader::uploadedQSO, ui->logbookWidget, &LogbookWidget::updateTable);\n\n    if ( StationProfilesManager::instance()->profileNameList().isEmpty() )\n        firstRun = true;\n    else\n        MembershipQE::instance()->updateLists();\n\n    /********************/\n    /* GLOBAL SHORTCUTs */\n    /********************/\n    // Menu actions are defined in the MainWindow.ui file\n    // The rest of global shortcuts are defined below\n    connect(ui->actionSearchCallsign, &QAction::triggered, ui->logbookWidget, &LogbookWidget::focusSearchCallsign);\n    connect(ui->actionAddBandmapMark, &QAction::triggered, ui->newContactWidget, &NewContactWidget::markContact);\n    connect(ui->actionUseNearestCallsign, &QAction::triggered, ui->newContactWidget, &NewContactWidget::useNearestCallsign);\n    connect(ui->actionBandSwitchUp, &QAction::triggered, ui->rigWidget, &RigWidget::bandUp);\n    connect(ui->actionBandSwitchDown, &QAction::triggered, ui->rigWidget, &RigWidget::bandDown);\n    connect(ui->actionCWSpeedUp, &QAction::triggered, ui->cwconsoleWidget, &CWConsoleWidget::cwKeySpeedIncrease);\n    connect(ui->actionCWSpeedDown, &QAction::triggered, ui->cwconsoleWidget, &CWConsoleWidget::cwKeySpeedDecrease);\n    connect(ui->actionCWProfileUp, &QAction::triggered, ui->cwconsoleWidget, &CWConsoleWidget::cwShortcutProfileIncrease);\n    connect(ui->actionCWProfileDown, &QAction::triggered, ui->cwconsoleWidget, &CWConsoleWidget::cwShortcutProfileDecrease);\n\n    // PTT Off is solved in the Event Handler because it is not possible to handle the Push/Release event for the shortcut.\n    connect(ui->actionPTTOn, &QAction::triggered, this, &MainWindow::shortcutALTBackslash);\n\n    // Register aditional action (global shortcuts)\n    addAction(ui->actionSearchCallsign);\n    addAction(ui->actionAddBandmapMark);\n    addAction(ui->actionBandSwitchUp);\n    addAction(ui->actionBandSwitchDown);\n    addAction(ui->actionUseNearestCallsign);\n    addAction(ui->actionCWSpeedUp);\n    addAction(ui->actionCWSpeedDown);\n    addAction(ui->actionCWProfileUp);\n    addAction(ui->actionCWProfileDown);\n    addAction(ui->actionPTTOn);\n    addAction(ui->actionNewContact);\n    addAction(ui->actionSaveContact);\n\n    restoreUserDefinedShortcuts();\n\n    //restoreEquipmentConnOptions();\n    //restoreConnectionStates();\n\n    setupActivitiesMenu();\n}\n\nvoid MainWindow::closeEvent(QCloseEvent* event)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &currActivityProfile = ActivityProfilesManager::instance()->getCurProfile1().profileName;\n\n    if ( currActivityProfile == QString() )\n    {\n        // save dynamic Bandmap Widgets\n        const QList<QPair<QString, QString>> &bandmapList = getNonVfoBandmapsParams();\n\n        if ( bandmapList.isEmpty() )\n            LogParam::removeMainWindowBandmapWidgets();\n        else\n            LogParam::setMainWindowBandmapWidgets(MainLayoutProfilesManager::toDBStringList(bandmapList));\n    }\n    else\n        LogParam::removeMainWindowBandmapWidgets();\n\n    // cleanup Bandmap config\n    const QStringList configBandmapList = LogParam::bandmapsWidgets();\n\n    QSet<QString> configBandmapSet;\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n    configBandmapSet = QSet<QString>(configBandmapList.begin(), configBandmapList.end());\n#else\n    configBandmapSet = QSet<QString>::fromList(configBandmapList);\n#endif\n\n    MainLayoutProfilesManager *layoutManager = MainLayoutProfilesManager::instance();\n    QSet<QString> layoutBandmapSet;\n    const QStringList &profiles = layoutManager->profileNameList();\n\n    for (const auto &addBandmapClassic : MainLayoutProfilesManager::toPairStringList(LogParam::getMainWindowBandmapWidgets()))\n        layoutBandmapSet.insert(addBandmapClassic.first);\n\n    for ( const QString &profile: profiles )\n        for ( const auto &addlProfileBandmap : layoutManager->getProfile(profile).addlBandmaps )\n            layoutBandmapSet.insert(addlProfileBandmap.first);\n\n    QSet<QString> orphanConfigurations = configBandmapSet.subtract(layoutBandmapSet);\n    orphanConfigurations.remove(ui->bandmapWidget->objectName()); // removed the main window name\n\n    for ( const QString &orphanConfig : static_cast<const QSet<QString>&>(orphanConfigurations) )\n    {\n        qCDebug(runtime) << \"Removing orphan configuration\" << orphanConfig;\n        LogParam::removeBandmapWidgetGroup(orphanConfig);\n    }\n\n    // Save unsaved widget states\n    const auto allWidgets = findChildren<QWidget *>();\n    for ( QWidget *w : allWidgets )\n    {\n        ShutdownAwareWidget *widget = dynamic_cast<ShutdownAwareWidget *>(w);\n        if ( widget ) widget->finalizeBeforeAppExit();\n    }\n\n    // save the window geometry\n    LogParam::setMainWindowGeometry(saveGeometry());\n    LogParam::setMainWindowState(saveState());\n\n    if ( stats )\n    {\n        stats->close();\n        stats->deleteLater();\n        stats = nullptr;\n    }\n\n     const QList<QDockWidget*> docks = findChildren<QDockWidget*>();\n     for (QDockWidget* dock : docks)\n         dock->close();  // Ensure they are closed\n\n    QMainWindow::closeEvent(event);\n}\n\n/* It has to be controlled via global scope because keyReleaseEvent handles\n * only events from focused widget */\nvoid MainWindow::keyReleaseEvent(QKeyEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    // shortcut has no Release signal therefore, it is necessary to handle it here.\n    const QKeySequence &pttShortcut = ui->actionPTTOn->shortcut();\n\n    // QKeySequence can contain many combinations. check them\n    for ( int pttShortcutIndex = 0; pttShortcutIndex < pttShortcut.count(); pttShortcutIndex++ )\n    {\n        int key = pttShortcut[pttShortcutIndex] & ~Qt::KeyboardModifierMask;\n        Qt::KeyboardModifiers modifiers = Qt::KeyboardModifiers(pttShortcut[pttShortcutIndex] & Qt::KeyboardModifierMask);\n\n        if ( event->key() == key\n             && event->modifiers() == modifiers\n             && !event->isAutoRepeat() )\n        {\n            emit altBackslash(false);\n        }\n    }\n\n    QMainWindow::keyReleaseEvent(event);\n}\n\nQList<QAction *> MainWindow::getUserDefinedShortcutActionList()\n{\n    QList<QAction *> ret;\n    const QList<QAction*> &actions = findChildren<QAction*>();\n\n    for ( QAction* action : actions)\n    {\n        if ( !action->shortcut().toString(QKeySequence::NativeText).isEmpty() )\n            qCDebug(runtime) << action->text() << action->shortcut().toString(QKeySequence::NativeText);\n\n        if ( action->property(\"changeableshortcut\").toBool() )\n        {\n            qCDebug(runtime) << \"User-Defined shortcut\" << action->shortcut().toString(QKeySequence::NativeText);\n            ret << action;\n        }\n    }\n    return ret;\n}\n\nQStringList MainWindow::getBuiltInStaticShortcutList() const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n\n    const QList<QShortcut*> allShortcuts = findChildren<QShortcut*>();\n    for ( QShortcut* shortcut : allShortcuts)\n    {\n        if (!shortcut->key().toString().isEmpty())\n\n        {\n            qCDebug(runtime) << \"Built-In nonchangeble shortcut\"\n                             << shortcut->key().toString(QKeySequence::NativeText);\n            ret << shortcut->key().toString(QKeySequence::NativeText);\n        }\n    }\n\n    const QList<QPushButton*> allButtons = findChildren<QPushButton*>();\n    for ( QPushButton* button : allButtons)\n    {\n        if ( !button->shortcut().toString().isEmpty())\n        {\n            qCDebug(runtime) << \"Built-In nonchangable shortcut - buttons\"\n                    << button->shortcut().toString(QKeySequence::NativeText);\n            ret << button->shortcut().toString(QKeySequence::NativeText);\n        }\n    }\n\n    return ret;\n}\n\nvoid MainWindow::rigConnect()\n{\n    FCT_IDENTIFICATION;\n\n    //saveEquipmentConnOptions();\n\n    if ( ui->actionConnectRig->isChecked() )\n        Rig::instance()->open();\n    else\n        Rig::instance()->close();\n}\n\nvoid MainWindow::rigErrorHandler(const QString &error, const QString &errorDetail)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                         QMessageBox::tr(\"<b>Rig Error:</b> \") + error\n                                         + \"<p>\" + tr(\"<b>Error Detail:</b> \") + errorDetail + \"</p>\");\n    ui->actionConnectRig->setChecked(false);\n}\n\nvoid MainWindow::rotErrorHandler(const QString &error, const QString &errorDetail)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                         QMessageBox::tr(\"<b>Rotator Error:</b> \") + error\n                                         + \"<p>\" + tr(\"<b>Error Detail:</b> \") + errorDetail + \"</p>\");\n    ui->actionConnectRotator->setChecked(false);\n}\n\nvoid MainWindow::cwKeyerErrorHandler(const QString &error, const QString &errorDetail)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                         QMessageBox::tr(\"<b>CW Keyer Error:</b> \") + error\n                                         + \"<p>\" + tr(\"<b>Error Detail:</b> \") + errorDetail + \"</p>\");\n    ui->actionConnectCWKeyer->setChecked(false);\n}\n\nvoid MainWindow::stationProfileChanged()\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    qCDebug(runtime) << profile.callsign << \" \" << profile.locator << \" \" << profile.operatorName;\n\n    profileLabel->setText(\"<b>\" + profile.profileName + \":</b>\");\n    callsignLabel->setText(stationCallsignStatus(profile));\n    locatorLabel->setText(profile.locator.toLower());\n}\n\nQString MainWindow::stationCallsignStatus(const StationProfile &profile) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( profile.operatorCallsign.isEmpty() || profile.callsign == profile.operatorCallsign )\n        return profile.callsign.toLower();\n\n    return profile.callsign.toLower() + \" [\" + tr(\"op: \") + profile.operatorCallsign.toLower() + \"]\";\n}\n\nvoid MainWindow::openNonVfoBandmap(const QString &widgetID, const QString &bandName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << widgetID << bandName;\n\n    const Band &band = BandPlan::bandName2Band(bandName);\n    QDockWidget *dock = nullptr;\n\n    // bandmap docks stay open. Therefore it is necessary to decide whether\n    // to reuse the dock or create a new one.\n    dock = findChild<QDockWidget*>(widgetID + \"-dock\");\n\n    if ( dock == nullptr )\n    {\n        qCDebug(runtime) << \"Creating a new Bandmap dock\";\n        dock = new QDockWidget(this);\n        dock->setAttribute(Qt::WA_MacAlwaysShowToolWindow, true);\n        dock->setObjectName(widgetID + \"-dock\");\n        addDockWidget(Qt::RightDockWidgetArea, dock);\n        dock->setFloating(true);\n        const QRect &mainGeometry = geometry();\n        const QSize &dockSize = dock->sizeHint();\n\n        // middle\n        int x = mainGeometry.x() + (mainGeometry.width() - dockSize.width()) / 2;\n        int y = mainGeometry.y() + (mainGeometry.height() - dockSize.height()) / 2;\n        dock->move(x, y);\n        dock->resize(ui->bandmapDockWidget->size());\n    }\n\n    BandmapWidget *bandmap = new BandmapWidget(widgetID, band, dock);\n    dock->setWidget(bandmap);\n\n    if ( !dock->isVisible() ) // show reused docks\n        dock->show();\n\n    // the vfo bandmap takes care of managing the spot map, which is shared with the non vfo bandmaps. spotsUpdated\n    // is triggered when spot map is dirty and the bandmaps should re-render.\n    connect(ui->bandmapWidget, &BandmapWidget::spotsUpdated, bandmap, &BandmapWidget::updateStations);\n\n    // connect selected signals as a common Bandmap widget\n    connect(this, &MainWindow::themeChanged, bandmap, &BandmapWidget::update);\n    connect(Rig::instance(), &Rig::frequencyChanged, bandmap, &BandmapWidget::updateTunedFrequency);\n    connect(Rig::instance(), &Rig::modeChanged, bandmap, &BandmapWidget::updateMode);\n    connect(ui->wsjtxWidget, &WsjtxWidget::frequencyChanged, bandmap, &BandmapWidget::updateTunedFrequency);\n    connect(ui->newContactWidget, &NewContactWidget::userFrequencyChanged, bandmap, &BandmapWidget::updateTunedFrequency);\n    connect(ui->newContactWidget, &NewContactWidget::userModeChanged, bandmap, &BandmapWidget::updateMode);\n    connect(bandmap, &BandmapWidget::tuneDx, ui->newContactWidget, &NewContactWidget::tuneDx);\n}\n\nvoid MainWindow::openNonVfoBandmaps(const QList<QPair<QString, QString> > &list)\n{\n    FCT_IDENTIFICATION;\n\n    // create additional bandmap widgets\n    for ( const QPair<QString, QString> &widget : list )\n        openNonVfoBandmap(widget.first, widget.second);\n}\n\nvoid MainWindow::clearNonVfoBandmaps()\n{\n    FCT_IDENTIFICATION;\n\n    const QList<BandmapWidget *> bandmapWidgets = ui->bandmapWidget->getNonVfoWidgetList();\n    BandmapWidget *widget = nullptr;\n    QDockWidget *widgetDock = nullptr;\n    for (auto it = bandmapWidgets.begin(); it != bandmapWidgets.end(); ++it)\n    {\n        widget = *it;\n        if ( widget )\n        {\n            widgetDock = findChild<QDockWidget*>(widget->objectName() + \"-dock\");\n            widget->finalizeBeforeAppExit();\n            widget->setParent(nullptr);\n            widget->close();\n            widget->deleteLater();\n\n            if ( widgetDock )\n            {\n                widgetDock->close();\n                addDockWidget(Qt::RightDockWidgetArea, widgetDock); // without this, sometime is does not close the dock if it is floating\n                //widgetDock->deleteLater(); // Do not delete the dock – Qlog will reuse it. This is a more reliable method when switching layouts.\n            }\n        }\n    }\n}\n\nQList<QPair<QString, QString>> MainWindow::getNonVfoBandmapsParams() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<QPair<QString, QString>> bandmapList;\n    const QList<BandmapWidget *> bandmapWidgets = ui->bandmapWidget->getNonVfoWidgetList();\n\n    for ( BandmapWidget *widget : bandmapWidgets )\n        if ( widget && widget->isVisible() )\n            bandmapList << QPair<QString, QString>(widget->objectName(), widget->getBand().name);\n\n    qCDebug(runtime) << bandmapList;\n    return  bandmapList;\n}\n\n/*\n * This method is called only at startup and only on macOS and Windows.\n * For Linux, it makes no sense to call this, as the platform has its own update mechanisms.\n * And if it doesn’t, we still shouldn’t bother Linux users because\n * we are unable to distinguish whether the DEB/RPM package was installed directly from GitHub or through a distribution.\n * And if it’s from a distribution, the update dialog is unwanted.\n*/\nvoid MainWindow::checkNewVersion()\n{\n    FCT_IDENTIFICATION;\n\n    QNetworkAccessManager *manager = new QNetworkAccessManager(this);\n\n    const QString repoName =\n#ifdef Q_OS_MAC\n                \"aa5sh/QLog\";\n#else\n                \"foldynl/QLog\";\n#endif\n\n    const QUrl url(\"https://api.github.com/repos/\" + repoName + \"/releases/latest\");\n\n    QNetworkRequest request(url);\n    QNetworkReply *reply = manager->get(request);\n\n    connect(reply, &QNetworkReply::finished, this, [this, reply, manager, repoName]()\n    {\n        if (reply->error())\n        {\n            // do not show an error to user - It's not something the user should see.\n            qWarning() << \"Checking Version Error:\" << reply->errorString();\n        }\n        else\n        {\n            const QByteArray &response = reply->readAll();\n            const QJsonDocument &jsonDoc = QJsonDocument::fromJson(response);\n\n            if ( jsonDoc.isObject() )\n            {\n                QSettings settings;\n                const QString &curVersion = QString(\"v%1\").arg(VERSION);\n                const QJsonObject &obj = jsonDoc.object();\n                const QString &newVersion = obj[\"tag_name\"].toString();\n                const QString &seenVersion = settings.value(\"seenversion\").toString();\n\n                qCDebug(runtime) << \"Repo version\" << newVersion\n                                 << \"currVersion\" << curVersion\n                                 << \"setting string\" << seenVersion;\n\n                if( !newVersion.isEmpty() && curVersion != newVersion && seenVersion != newVersion)\n                    showUpdateDialog(newVersion, repoName);\n            }\n            else\n            {\n                // do not show an error to user - It's not something the user should see.\n                qWarning() << \"Checking Version Error: Invalid JSON: \" << response;\n            }\n        }\n\n        reply->deleteLater();\n        manager->deleteLater();\n    });\n}\n\nvoid MainWindow::showUpdateDialog(const QString &newVersion, const QString &repoName)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox msgBox;\n    QSettings settings;\n\n    msgBox.setWindowTitle(tr(\"A New Version\"));\n    msgBox.setText(tr(\"A new version %1 is available.\").arg(newVersion));\n    msgBox.setIcon(QMessageBox::Information);\n    msgBox.setStandardButtons(QMessageBox::Ok);\n    msgBox.setDefaultButton(QMessageBox::Ok);\n    msgBox.addButton(tr(\"Remind Me Later\"), QMessageBox::ActionRole);\n    QAbstractButton* pButtonDwn = msgBox.addButton(tr(\"Download\"), QMessageBox::ActionRole);\n\n    msgBox.exec();\n\n    QAbstractButton *clicked = msgBox.clickedButton();\n\n    if ( clicked == pButtonDwn )\n        QDesktopServices::openUrl(QUrl(\"https://www.github.com/\" + repoName + \"/releases/latest\"));\n    else if ( msgBox.standardButton(clicked) == QMessageBox::Ok)\n        settings.setValue(\"seenversion\", newVersion); // platform-depend parameter\n}\n\nvoid MainWindow::setDarkTheme()\n{\n    FCT_IDENTIFICATION;\n\n    QPalette darkPalette;\n    QColor darkColor = QColor(45, 45, 45);\n    QColor disabledColor = QColor(127, 127, 127);\n    darkPalette.setColor(QPalette::Window, darkColor);\n    darkPalette.setColor(QPalette::WindowText, Qt::white);\n    darkPalette.setColor(QPalette::Base, QColor(18, 18, 18));\n    darkPalette.setColor(QPalette::Disabled, QPalette::Base, darkColor);\n    darkPalette.setColor(QPalette::AlternateBase, darkColor);\n    darkPalette.setColor(QPalette::Text, Qt::white);\n    darkPalette.setColor(QPalette::Disabled, QPalette::Text, disabledColor);\n    darkPalette.setColor(QPalette::Button, darkColor);\n    darkPalette.setColor(QPalette::ButtonText, Qt::white);\n    darkPalette.setColor(QPalette::Disabled, QPalette::ButtonText, disabledColor);\n    darkPalette.setColor(QPalette::BrightText, Qt::red);\n    darkPalette.setColor(QPalette::Link, QColor(42, 130, 218));\n    darkPalette.setColor(QPalette::Highlight, QColor(42, 130, 218));\n    darkPalette.setColor(QPalette::HighlightedText, Qt::black);\n    darkPalette.setColor(QPalette::Disabled, QPalette::HighlightedText, disabledColor);\n\n    qApp->setPalette(darkPalette);\n}\n\nvoid MainWindow::showEvent(QShowEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    QMainWindow::showEvent(event);\n\n    if ( firstRun )\n    {\n        firstRun = false;\n        showSettings();\n    }\n}\n\nvoid MainWindow::setLightTheme()\n{\n    FCT_IDENTIFICATION;\n\n    QPalette lightPalette;\n    QColor lightColor = QColor(239, 239, 239);\n    QColor disabledColor = QColor(190, 190, 190);\n    lightPalette.setColor(QPalette::Window, lightColor);\n    lightPalette.setColor(QPalette::WindowText, Qt::black);\n    lightPalette.setColor(QPalette::Base, Qt::white);\n    lightPalette.setColor(QPalette::Disabled, QPalette::Base, lightColor);\n    lightPalette.setColor(QPalette::AlternateBase, lightColor);\n    lightPalette.setColor(QPalette::Text, Qt::black);\n    lightPalette.setColor(QPalette::Disabled, QPalette::Text, disabledColor);\n    lightPalette.setColor(QPalette::Button, lightColor);\n    lightPalette.setColor(QPalette::ButtonText, Qt::black);\n    lightPalette.setColor(QPalette::Disabled, QPalette::ButtonText, disabledColor);\n    lightPalette.setColor(QPalette::BrightText, Qt::white);\n    lightPalette.setColor(QPalette::Link, QColor(0, 0, 255));\n    lightPalette.setColor(QPalette::Highlight, QColor(48, 140, 198));\n    lightPalette.setColor(QPalette::HighlightedText, Qt::white);\n    lightPalette.setColor(QPalette::Disabled, QPalette::HighlightedText, Qt::white);\n\n    qApp->setPalette(lightPalette);\n\n}\n\nbool MainWindow::setNativeTheme()\n{\n    FCT_IDENTIFICATION;\n\n    qApp->setPalette(this->style()->standardPalette());\n    bool isDark = false;\n\n#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0)\n    const auto scheme = QGuiApplication::styleHints()->colorScheme();\n    isDark = scheme == Qt::ColorScheme::Dark;\n#else\n    const QPalette defaultPalette = this->style()->standardPalette();\n    const auto text = defaultPalette.color(QPalette::WindowText);\n    const auto window = defaultPalette.color(QPalette::Window);\n    isDark = text.lightness() > window.lightness();\n#endif // QT_VERSION\n\n    return isDark;\n}\n\nvoid MainWindow::themeInit(int mode)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setMainWindowDarkMode(mode);\n\n    bool isDark = false;\n    switch (mode) {\n    case 0:\n        ui->actionThemeNative->setChecked(true);\n        isDark = this->setNativeTheme();\n        break;\n    case 1:\n        ui->actionThemeDark->setChecked(true);\n        this->setDarkTheme();\n        isDark = true;\n        break;\n    case 2:\n        ui->actionThemeLight->setChecked(true);\n        this->setLightTheme();\n        break;\n    default:\n        qWarning() << \"Unsupported theme ID\" << mode;\n    }\n\n    QFile style(\":/res/stylesheet.css\");\n    style.open(QFile::ReadOnly | QIODevice::Text);\n    qApp->setStyleSheet(style.readAll());\n    style.close();\n\n    if (isDark) {\n        themeButton->setIcon(QIcon(QPixmap(\":/icons/color-palette-dark.svg\")));\n    } else {\n        themeButton->setIcon(QIcon(QPixmap(\":/icons/color-palette-light.svg\")));\n    }\n\n    emit themeChanged(mode, isDark);\n}\n\nvoid MainWindow::changeEvent(QEvent *event)\n{\n    if (event->type() == QEvent::ThemeChange) {\n        if (ui->actionThemeNative->isChecked()) {\n            this->themeInit(0);\n        }\n    }\n    QMainWindow::changeEvent(event);\n}\n\nvoid MainWindow::processSpotAlert(SpotAlert alert)\n{\n    FCT_IDENTIFICATION;\n\n    ui->alertsWidget->addAlert(alert);\n    alertButton->setText(QString::number(ui->alertsWidget->alertCount()));\n    alertTextButton->setText(alert.ruleNameList.join(\", \") + \": \" + alert.spot.callsign + \", \" + alert.spot.band + \", \" + alert.spot.modeGroupString);\n    if (alertTextButtonConn) QObject::disconnect(alertTextButtonConn);\n\n    alertTextButtonConn = connect(alertTextButton, &QPushButton::clicked, this, [this, alert]()\n    {\n        if ( alert.source == SpotAlert::WSJTXCQSPOT )\n            wsjtx->sendReply(alert.spot);\n        else\n            ui->newContactWidget->tuneDx(alert.getDxSpot());\n    });\n\n    if ( ui->actionBeepSettingAlert->isChecked() ) QApplication::beep();\n}\n\nvoid MainWindow::clearAlertEvent()\n{\n    FCT_IDENTIFICATION;\n\n    int newCount = ui->alertsWidget->alertCount();\n\n    alertButton->setText(QString::number(newCount));\n\n    if ( newCount == 0 )\n    {\n        alertTextButton->setText(\" \");\n        if (alertTextButtonConn) QObject::disconnect(alertTextButtonConn);\n    }\n}\n\nvoid MainWindow::beepSettingAlerts()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setMainWindowAlertBeep(ui->actionBeepSettingAlert->isChecked());\n\n    if ( ui->actionBeepSettingAlert->isChecked() ) QApplication::beep();\n}\n\nvoid MainWindow::shortcutALTBackslash()\n{\n    FCT_IDENTIFICATION;\n\n    emit altBackslash(true);\n}\n\nvoid MainWindow::setManualContact(bool isChecked)\n{\n    FCT_IDENTIFICATION;\n\n    emit manualMode(isChecked);\n}\n\nvoid MainWindow::showEditLayout()\n{\n    FCT_IDENTIFICATION;\n\n    EditActivitiesDialog dialog(this);\n    dialog.exec();\n    setupActivitiesMenu();\n}\n\nvoid MainWindow::showServiceUpload()\n{\n    FCT_IDENTIFICATION;\n\n    UploadQSODialog dialog(this);\n    dialog.exec();\n    ui->logbookWidget->updateTable();\n}\n\nvoid MainWindow::showServiceDownloadQSL()\n{\n    FCT_IDENTIFICATION;\n\n    DownloadQSLDialog dialog(this);\n    dialog.exec();\n    ui->logbookWidget->updateTable();\n}\n\nvoid MainWindow::showQSLGallery()\n{\n    FCT_IDENTIFICATION;\n\n    QSLGalleryDialog dialog(this);\n    dialog.exec();\n}\n\nvoid MainWindow::showDevTools()\n{\n    FCT_IDENTIFICATION;\n\n    DevToolsDialog dialog(this);\n    dialog.exec();\n}\n\nvoid MainWindow::printQslLabels()\n{\n    FCT_IDENTIFICATION;\n\n    QSLPrintLabelDialog dialog(this);\n    dialog.exec();\n}\n\nvoid MainWindow::showDumpDB()\n{\n    FCT_IDENTIFICATION;\n\n    ExportPasswordDialog passDialog(this);\n    if ( passDialog.exec() != QDialog::Accepted )\n        return;\n\n    const QString password = passDialog.getPassword();\n    const bool deletePasswords = passDialog.getDeletePasswords();\n\n    if ( !CredentialStore::instance()->exportPasswords(password) )\n    {\n        QMessageBox::warning(this, tr(\"Pack Data && Settings\"),\n                             tr(\"Failed to encrypt credentials.\"));\n        return;\n    }\n\n    const QString documentsPath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);\n\n    QString filename = QFileDialog::getSaveFileName(this,\n                                                    tr(\"Pack Data && Settings\"),\n                                                    documentsPath,\n                                                    tr(\"Database files (*.dbe);;All files (*)\"));\n\n    if ( filename.isEmpty() )\n    {\n        LogParam::removeEncryptedPasswords();\n        LogParam::removeSourcePlatform();\n        return;\n    }\n\n    // Add .dbe suffix if not present\n    if ( !filename.endsWith(\".dbe\", Qt::CaseInsensitive) )\n        filename.append(\".dbe\");\n\n    // Create temporary file for uncompressed database\n    QTemporaryFile tempFile;\n    if ( !tempFile.open() )\n    {\n        LogParam::removeEncryptedPasswords();\n        LogParam::removeSourcePlatform();\n        QMessageBox::warning(this, tr(\"Pack Data && Settings\"),\n                             tr(\"Failed to create temporary file.\"));\n        return;\n    }\n    QString tempPath = tempFile.fileName();\n    tempFile.close();\n\n    // Copy database to temporary file\n    bool ok = LogDatabase::instance()->atomicCopy(tempPath);\n\n    LogParam::removeEncryptedPasswords();\n    LogParam::removeSourcePlatform();\n\n    if ( !ok )\n    {\n        QFile::remove(tempPath);\n        QMessageBox::warning(this, tr(\"Pack Data && Settings\"),\n                             tr(\"Failed to dump the database.\"));\n        return;\n    }\n\n    // Compress temporary file to destination (with progress dialog)\n    ok = FileCompressor::gzipFileWithProgress(tempPath, filename, this, tr(\"Compressing database...\"));\n    QFile::remove(tempPath);\n\n    if ( ok )\n    {\n        if ( deletePasswords )\n            CredentialStore::instance()->deleteAllPasswords();\n\n        QMessageBox::information(this, tr(\"Pack Data && Settings\"),\n                                 tr(\"Database successfully dumped to\\n%1\").arg(filename));\n    }\n    else\n    {\n        QFile::remove(filename);\n        QMessageBox::warning(this, tr(\"Pack Data && Settings\"),\n                             tr(\"Failed to compress the database.\"));\n    }\n}\n\nvoid MainWindow::showLoadDB()\n{\n    FCT_IDENTIFICATION;\n\n    LoadDatabaseDialog loadDialog(this);\n    if ( loadDialog.exec() != QDialog::Accepted )\n        return;\n\n    const QString password = loadDialog.getPassword();\n    const bool crossPlatform = loadDialog.isCrossPlatform();\n\n    // Take ownership of decompressed file (we must delete it)\n    const QString decompressedFile = loadDialog.takeDecompressedFile();\n\n    // Handle cross-platform settings if needed\n    if ( crossPlatform )\n    {\n        DatabaseInfo dbInfo = LogDatabase::inspectDatabase(decompressedFile);\n        QList<PlatformParameter> params = PlatformParameterManager::getParameters(decompressedFile, dbInfo.sourcePlatform);\n        QList<ProfileParameter> profileParams = PlatformParameterManager::getProfileParameters(decompressedFile, dbInfo.sourcePlatform);\n\n        if ( !params.isEmpty() || !profileParams.isEmpty() )\n        {\n            PlatformSettingsDialog settingsDialog(this);\n            settingsDialog.setParameters(params, profileParams);\n\n            if ( settingsDialog.exec() != QDialog::Accepted )\n            {\n                QFile::remove(decompressedFile);\n                return;\n            }\n\n            // Save modified parameters to a JSON file for later application\n            QList<PlatformParameter> modifiedParams = settingsDialog.getParameters();\n            QList<ProfileParameter> modifiedProfileParams = settingsDialog.getProfilePortParameters();\n            PlatformParameterManager::saveParametersToFile(modifiedParams, modifiedProfileParams,\n                PlatformParameterManager::pendingParametersPath());\n        }\n    }\n\n    // Save import passphrase to SecureStore\n    if ( !password.isEmpty() )\n        CredentialStore::instance()->saveImportPassphrase(password);\n\n    // Move decompressed file to pending import location\n    const QString pendingPath = LogDatabase::pendingImportPath();\n\n    qCDebug(runtime) << \"Decompressed file:\" << decompressedFile << \"exists:\" << QFile::exists(decompressedFile);\n    qCDebug(runtime) << \"Pending path:\" << pendingPath;\n\n    // Remove existing pending file if any\n    if ( QFile::exists(pendingPath) )\n        QFile::remove(pendingPath);\n\n    if ( !QFile::rename(decompressedFile, pendingPath) )\n    {\n        qCDebug(runtime) << \"Rename failed, trying copy\";\n        // rename failed, try copy + remove\n        if ( !QFile::copy(decompressedFile, pendingPath) )\n        {\n            qWarning() << \"Copy also failed from\" << decompressedFile << \"to\" << pendingPath;\n            QFile::remove(PlatformParameterManager::pendingParametersPath());\n            QMessageBox::warning(this, tr(\"Unpack Data && Settings\"),\n                                 tr(\"Failed to prepare database for import.\"));\n            CredentialStore::instance()->deleteImportPassphrase();\n            QFile::remove(decompressedFile);\n            return;\n        }\n        QFile::remove(decompressedFile);\n    }\n\n    // Restart the application\n    restartApplication();\n}\n\nvoid MainWindow::restartApplication()\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"Restarting application for database import\";\n\n    // Wait a bit before starting new instance to ensure clean shutdown\n    QThread::msleep(500);\n\n    // Get original arguments (first one is app path)\n    QStringList args = QCoreApplication::arguments();\n    args.removeFirst();  // Remove app path\n\n    // Remove --import-pending if already present (avoid duplicates)\n    args.removeAll(\"--import-pending\");\n\n    // Add import-pending argument\n    args << \"--import-pending\";\n\n    QProcess::startDetached(QCoreApplication::applicationFilePath(), args);\n\n    // Quit current instance\n    qApp->quit();\n}\n\nvoid MainWindow::setLayoutGeometry()\n{\n    FCT_IDENTIFICATION;\n\n    // restore the window geometry and state\n    const MainLayoutProfile &layoutProfile = MainLayoutProfilesManager::instance()->getCurProfile1();\n\n    QByteArray newGeometry;\n    QByteArray newState;\n    int darkMode = 0;\n    const QList<QPair<QString, QString>> bandmapWidgets\n        = (layoutProfile.profileName.isEmpty())\n              ? MainLayoutProfilesManager::toPairStringList(LogParam::getMainWindowBandmapWidgets())\n              : layoutProfile.addlBandmaps;\n\n    if ( layoutProfile.mainGeometry != QByteArray()\n        || layoutProfile.mainState != QByteArray() )\n    {\n        // layout from config\n        newGeometry = layoutProfile.mainGeometry;\n        newState = layoutProfile.mainState;\n        darkMode = layoutProfile.darkMode;\n    }\n    else\n    {\n        // Classic Layout\n        newGeometry = LogParam::getMainWindowGeometry();\n        newState = LogParam::getMainWindowState();\n        darkMode = LogParam::getMainWindowDarkMode();\n    }\n\n    openNonVfoBandmaps(bandmapWidgets);\n\n#ifdef Q_OS_LINUX\n    // workaround for QTBUG-46620\n    showNormal();\n    QApplication::processEvents();\n#endif\n    restoreGeometry(newGeometry);\n\n    // workaround for QTBUG-46620\n    QTimer* nt = new QTimer(this);\n    nt->setSingleShot(true);\n    nt->setInterval(500);\n    connect(nt, &QTimer::timeout, this, [this, darkMode, newState]()\n    {\n        restoreState(newState);\n        this->themeInit(isFusionStyle ? darkMode : 0);\n        connect(MainLayoutProfilesManager::instance(), &MainLayoutProfilesManager::profileChanged,\n                this, &MainWindow::setSimplyLayoutGeometry);\n    });\n    nt->connect(nt, &QTimer::timeout, nt, &QTimer::deleteLater);\n    nt->start();\n}\n\nvoid MainWindow::setSimplyLayoutGeometry()\n{\n    //this method is a nextstep of the workaround for QTBUG-46620.\n    // In the repeated setLayout, it is necessary to call only this.\n\n    FCT_IDENTIFICATION;\n\n    const MainLayoutProfile &layoutProfile = MainLayoutProfilesManager::instance()->getCurProfile1();\n\n    if ( !layoutProfile.profileName.isEmpty() )\n        clearNonVfoBandmaps();\n\n    openNonVfoBandmaps(layoutProfile.addlBandmaps);\n\n    if ( layoutProfile.mainGeometry != QByteArray()\n        || layoutProfile.mainState != QByteArray() )\n    {\n\n#ifdef Q_OS_LINUX\n        // workaround for QTBUG-46620\n        showNormal();\n        QApplication::processEvents();\n#endif\n        restoreGeometry(layoutProfile.mainGeometry);\n        QApplication::processEvents();\n\n        // workaround for QTBUG-46620\n        QTimer* nt = new QTimer(this);\n        nt->setSingleShot(true);\n        nt->setInterval(500);\n        connect(nt, &QTimer::timeout, this, [this, layoutProfile]()\n        {\n            restoreState(layoutProfile.mainState);\n            this->themeInit(isFusionStyle ? layoutProfile.darkMode : 0);            \n        });\n        nt->connect(nt, &QTimer::timeout, nt, &QTimer::deleteLater);\n        nt->start();\n    }\n}\n\nvoid MainWindow::saveProfileLayoutGeometry()\n{\n    FCT_IDENTIFICATION;\n\n    MainLayoutProfile layoutProfile = MainLayoutProfilesManager::instance()->getCurProfile1();\n\n    if ( layoutProfile != MainLayoutProfile() )\n    {\n        layoutProfile.addlBandmaps = getNonVfoBandmapsParams();\n        layoutProfile.mainGeometry = saveGeometry();\n        layoutProfile.mainState = saveState();\n        layoutProfile.darkMode = 0;\n        if (ui->actionThemeDark->isChecked()) {\n            layoutProfile.darkMode = 1;\n        } else if (ui->actionThemeLight->isChecked()) {\n            layoutProfile.darkMode = 2;\n        }\n        layoutProfile.tabsexpanded = ui->newContactWidget->getTabCollapseState();\n        MainLayoutProfilesManager::instance()->addProfile(layoutProfile.profileName, layoutProfile);\n        MainLayoutProfilesManager::instance()->blockSignals(true); // prevent screen flashing\n        MainLayoutProfilesManager::instance()->save();\n        MainLayoutProfilesManager::instance()->blockSignals(false);\n    }\n}\n\nvoid MainWindow::setEquipmentKeepOptions(bool)\n{\n    FCT_IDENTIFICATION;\n\n    // this is obsolete, use activities instead.\n    // Left only because of possible problems and for quick activation of the function.\n    //saveEquipmentConnOptions();\n}\n\nvoid MainWindow::setupActivitiesMenu()\n{\n    FCT_IDENTIFICATION;\n\n    QMenu *actionMenu = activityButton->menu();\n\n    actionMenu->clear();\n\n    const QString &currActivityProfile = ActivityProfilesManager::instance()->getCurProfile1().profileName;\n\n    // The first position will be always the Classic Profile\n    QAction *classicLayoutAction = new QAction(tr(\"Classic\"), actionMenu);\n    classicLayoutAction->setCheckable(true);\n    if ( currActivityProfile == QString() )\n    {\n        classicLayoutAction->setChecked(true);\n        ui->actionSaveGeometry->setEnabled(false);\n        setSimplyLayoutGeometry();\n        activityButton->setText(classicLayoutAction->text());\n    }\n    connect(classicLayoutAction, &QAction::triggered, this, [this, classicLayoutAction]()\n    {\n        //save empty profile\n        // Classic Action is only about Layout\n        MainLayoutProfilesManager::instance()->setCurProfile1(\"\");\n        ActivityProfilesManager::instance()->setCurProfile1(\"\");\n        ui->actionSaveGeometry->setEnabled(false);\n        activityButton->setText(classicLayoutAction->text());\n    } );\n\n    actionMenu->addAction(classicLayoutAction);\n\n    QActionGroup *activitiMenuGroup = new QActionGroup(classicLayoutAction);\n    activitiMenuGroup->addAction(classicLayoutAction);\n\n    actionMenu->addSeparator();\n\n    // The rest of positions will be the Custom Activity Profiles\n    const QStringList &activityProfileNames = ActivityProfilesManager::instance()->profileNameList();\n\n    for ( const QString &profileName : activityProfileNames )\n    {\n        QAction *activityAction = new QAction(profileName, actionMenu);\n        activityAction->setCheckable(true);\n\n        if ( currActivityProfile == profileName )\n        {\n            activityAction->setChecked(true);\n            ui->actionSaveGeometry->setEnabled(true);\n            ActivityProfilesManager::instance()->setAllProfiles();\n            activityButton->setText(activityAction->text());\n        }\n\n        connect(activityAction, &QAction::triggered, this, [this, profileName, activityAction]()\n        {\n            ActivityProfilesManager::instance()->setCurProfile1(profileName);\n            ui->actionSaveGeometry->setEnabled(true);\n            activityButton->setText(activityAction->text());\n        } );\n        actionMenu->addAction(activityAction);\n        activitiMenuGroup->addAction(activityAction);\n    }\n\n    actionMenu->addSeparator();\n    actionMenu->addAction(ui->actionSaveGeometry);\n    actionMenu->addSeparator();\n    actionMenu->addAction(ui->actionActivitiesEdit);\n}\n\nvoid MainWindow::restoreUserDefinedShortcuts()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n    const QHash<QString, QVariant> &state = settings.value(\"shortcuts\").toHash();\n\n    if ( state.count() > 0)\n    {\n        const QList<QAction*> actions = getUserDefinedShortcutActionList();\n        for ( QAction *action : actions )\n        {\n            const QVariant &value = state.value(action->objectName());\n            const QString &current = action->shortcut().toString(QKeySequence::NativeText);\n            qCDebug(runtime) << \"Object \"<< action->objectName()\n                             << \"current shortcut\" << current\n                             << \"requested\" << value.toString();\n\n            if ( value != QVariant() &&  current != value.toString())\n            {\n                action->setShortcut(value.toString());\n                qCDebug(runtime) << \"Changed\";\n            }\n        }\n    }\n}\n\nvoid MainWindow::saveUserDefinedShortcuts()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n\n    QHash<QString, QVariant> state;\n    const QList<QAction*> actions = getUserDefinedShortcutActionList();\n    for ( const QAction *action : actions )\n    {\n        const QString & newShortcut = action->shortcut().toString(QKeySequence::NativeText);\n\n        qCDebug(runtime) << \"Object\" << action->objectName()\n                         << \"has a shortcut\" << newShortcut;\n        state[action->objectName()] = newShortcut;\n    }\n    settings.setValue(\"shortcuts\", state);\n}\n\nvoid MainWindow::saveContestMenuSeqnoType(QAction *action)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setContestSeqnoType(action->data());\n    // this function is called only if contest is not active\n    // therefore it is not needed to somehow recalculate seq\n}\n\nvoid MainWindow::restoreContestMenuSeqnoType()\n{\n    FCT_IDENTIFICATION;\n\n    ui->actionSeqSingle->setData(Data::SeqType::SINGLE);\n    ui->actionSeqPerBand->setData(Data::SeqType::PER_BAND);\n    seqGroup = new QActionGroup(ui->menuSequence);\n    seqGroup->addAction(ui->actionSeqSingle);\n    seqGroup->addAction(ui->actionSeqPerBand);\n\n    int seqnoType = LogParam::getContestSeqnoType();\n\n    const QList<QAction *> seqActions = seqGroup->actions();\n    for ( QAction *action : seqActions)\n    {\n        if ( action->data().toInt() == seqnoType )\n        {\n            action->setChecked(true);\n            break;\n        }\n    }\n}\n\nvoid MainWindow::saveContestMenuDupeType(QAction *action)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setContestManuDupeType(action->data());\n    emit dupeTypeChanged();\n}\n\nvoid MainWindow::saveContestMenuLinkExchangeType(QAction *action)\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setContestLinkExchange(action->data());\n    ui->newContactWidget->changeSRXStringLink(action->data().toInt());\n}\n\nvoid MainWindow::restoreContestMenuDupeType()\n{\n    FCT_IDENTIFICATION;\n\n    dupeGroup = new QActionGroup(ui->menuDupeCheck);\n    ui->actionDupeAllBands->setData(Data::DupeType::ALL_BANDS);\n    ui->actionDupeEachBand->setData(Data::DupeType::EACH_BAND);\n    ui->actionDupeEachBandMode->setData(Data::DupeType::EACH_BAND_MODE);\n    ui->actionDupeNoCheck->setData(Data::DupeType::NO_CHECK);\n    dupeGroup->addAction(ui->actionDupeAllBands);\n    dupeGroup->addAction(ui->actionDupeEachBand);\n    dupeGroup->addAction(ui->actionDupeEachBandMode);\n    dupeGroup->addAction(ui->actionDupeNoCheck);\n\n    int dupeType = LogParam::getContestDupeType();\n\n    const QList<QAction *> seqActions = dupeGroup->actions();\n    for ( QAction *action : seqActions)\n    {\n        if ( action->data().toInt() == dupeType )\n        {\n            action->setChecked(true);\n            break;\n        }\n    }\n}\n\nvoid MainWindow::restoreContestMenuLinkExchange()\n{\n    FCT_IDENTIFICATION;\n\n    linkExchangeGroup = new QActionGroup(ui->menuLinkExchange);\n\n    int linkExchangeType = LogParam::getContestLinkExchange();\n\n    ui->actionLinkExchangeNone->setData(LogbookModel::COLUMN_INVALID);\n    linkExchangeGroup->addAction(ui->actionLinkExchangeNone);\n    ui->actionLinkExchangeNone->setChecked(linkExchangeType == LogbookModel::COLUMN_INVALID);\n\n    QList<QAction*> actions;\n\n    auto addActionToMenu = [&] (const LogbookModel::ColumnID columnID)\n    {\n        QAction *newAction = new QAction(ui->menuLinkExchange);\n        newAction->setCheckable(true);\n        newAction->setText(LogbookModel::getFieldNameTranslation(columnID));\n        newAction->setData(columnID);\n        actions.append(newAction);\n    };\n\n    addActionToMenu(LogbookModel::COLUMN_AGE);\n    addActionToMenu(LogbookModel::COLUMN_CQZ);\n    addActionToMenu(LogbookModel::COLUMN_ITUZ);\n    addActionToMenu(LogbookModel::COLUMN_GRID);\n    addActionToMenu(LogbookModel::COLUMN_NAME_INTL);\n    addActionToMenu(LogbookModel::COLUMN_QTH_INTL);\n    addActionToMenu(LogbookModel::COLUMN_RX_PWR);\n    addActionToMenu(LogbookModel::COLUMN_STATE);\n\n    std::sort(actions.begin(), actions.end(), [](const QAction *a, const QAction *b)\n    {\n        return a->text().localeAwareCompare(b->text()) < 0;\n    });\n\n    for (QAction *action : actions)\n    {\n        ui->menuLinkExchange->addAction(action);\n        linkExchangeGroup->addAction(action);\n\n        if ( action->data().toInt() == linkExchangeType )\n            action->setChecked(true);\n    }\n\n    ui->newContactWidget->changeSRXStringLink(linkExchangeType);\n}\n\nvoid MainWindow::startContest(const QString contestID, const QDateTime dateTime)\n{\n    FCT_IDENTIFICATION;\n\n    // Contest's start signal is sent from NewContact\n    const QSOFilter &contestFilter = QSOFilter::createFromDateContestFilter(contestID, dateTime);\n    QSOFilterManager::instance()->save(contestFilter);\n    ui->logbookWidget->refreshUserFilter();\n    ui->logbookWidget->setUserFilter(contestFilter.filterName);\n    LogParam::setContestFilter(contestFilter.filterName);\n    setContestMode(contestID);\n}\n\nvoid MainWindow::stopContest()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &contestFilterName = LogParam::getContestFilter();\n\n    if ( !contestFilterName.isEmpty() )\n    {\n        QMessageBox::StandardButton reply;\n\n        reply = QMessageBox::question(this, tr(\"Contest\"),\n                                      tr(\"Do you want to remove the Contest filter %1?\").arg(contestFilterName),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if ( reply == QMessageBox::Yes )\n        {\n            QSOFilterManager::instance()->remove(contestFilterName);\n            ui->logbookWidget->refreshUserFilter();\n        }\n        else\n        {\n            QSOFilter contestFilter = QSOFilterManager::instance()->getFilter(contestFilterName);\n            contestFilter.addRule(QSOFilter::createToDateRule(QDateTime::currentDateTimeUtc()));\n            QSOFilterManager::instance()->save(contestFilter);\n        }\n    }\n    LogParam::setContestFilter(QString());\n    setContestMode(QString());\n\n    emit contestStopped();\n}\n\nvoid MainWindow::setContestMode(const QString &contestID)\n{\n    FCT_IDENTIFICATION;\n\n    bool isActive = !contestID.isEmpty();\n    ui->actionContestStop->setEnabled(isActive);\n    if ( seqGroup )\n        seqGroup->setEnabled(!isActive);\n\n    contestLabel->setVisible(isActive);\n    contestLabel->setText((isActive) ? \"<b>\" + tr(\"Contest: \") + \"</b>\" + contestID : QString());\n}\n\nvoid MainWindow::handleActivityChange(const QString name)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << name;\n\n    const ActivityProfile &profile = ActivityProfilesManager::instance()->getProfile(name);\n\n    const QVariant &valueRig = profile.getProfileParam(ActivityProfile::ProfileType::RIG_PROFILE,\n                                                       ActivityProfile::ProfileParamType::CONNECT);\n\n    if ( !valueRig.isNull()\n        && RigProfilesManager::instance()->getCurProfile1().profileName == profile.profiles[ActivityProfile::ProfileType::RIG_PROFILE].name )\n    {\n        if ( ui->actionConnectRig->isChecked() && valueRig.toBool() )\n            rigConnect();\n        else\n            ui->actionConnectRig->setChecked(valueRig.toBool()); // rigConnect is called when the signal is processed\n    }\n\n    const QVariant &valueRot = profile.getProfileParam(ActivityProfile::ProfileType::ROT_PROFILE,\n                                                       ActivityProfile::ProfileParamType::CONNECT);\n\n    if ( !valueRig.isNull()\n          && RotProfilesManager::instance()->getCurProfile1().profileName == profile.profiles[ActivityProfile::ProfileType::ROT_PROFILE].name )\n    {\n        if ( ui->actionConnectRotator->isChecked() && valueRig.toBool() )\n            rotConnect();\n        else\n            ui->actionConnectRotator->setChecked(valueRot.toBool()); // rotConnect is called when the signal is processed\n    }\n}\n\nvoid MainWindow::rotConnect()\n{\n    FCT_IDENTIFICATION;\n\n    //saveEquipmentConnOptions();\n\n    if ( ui->actionConnectRotator->isChecked() )\n        Rotator::instance()->open();\n    else\n        Rotator::instance()->close();\n}\n\nvoid MainWindow::cwKeyerConnect()\n{\n    FCT_IDENTIFICATION;\n\n    //saveEquipmentConnOptions();;\n\n    if ( ui->actionConnectCWKeyer->isChecked() )\n    {\n        CWKeyer::instance()->open();\n    }\n    else\n    {\n        CWKeyer::instance()->close();\n    }\n}\n\nvoid MainWindow::cwKeyerConnectProfile(QString requestedProfile)\n{\n    FCT_IDENTIFICATION;\n\n    // it is a hack, maybe it will be improved in the future\n    if ( requestedProfile == EMPTY_PROFILE_NAME || requestedProfile.isEmpty() )\n    {\n        return;\n    }\n\n    CWKeyProfile testingProfile = CWKeyProfilesManager::instance()->getProfile(requestedProfile);\n\n    if ( testingProfile == CWKeyProfile() ) //if requested profile does not exists then no change\n    {\n        qWarning() << \"Rig request unknown CW Key Profile\";\n        return;\n    }\n    ui->actionConnectCWKeyer->setChecked(true);\n    CWKeyProfilesManager::instance()->setCurProfile1(requestedProfile);\n\n    cwKeyerConnect();\n}\n\nvoid MainWindow::cwKeyerDisconnectProfile(QString requestedProfile)\n{\n    FCT_IDENTIFICATION;\n\n    // it is a hack, maybe it will be improved in the future\n    if ( requestedProfile == EMPTY_PROFILE_NAME || requestedProfile.isEmpty() )\n    {\n        return;\n    }\n\n    CWKeyProfile testingProfile = CWKeyProfilesManager::instance()->getProfile(requestedProfile);\n\n    if ( testingProfile == CWKeyProfile() ) //if requested profile does not exists then no change\n    {\n        qWarning() << \"Rig requests an unknown CW Key Profile\";\n        return;\n    }\n\n    /* checking whether the user has changed the assigned key during the work. If so, leave it connected. */\n    if ( testingProfile !=  CWKeyProfilesManager::instance()->getCurProfile1() )\n    {\n        return;\n    }\n    ui->actionConnectCWKeyer->setChecked(false);\n\n    cwKeyerConnect();\n}\n\nvoid MainWindow::showSettings()\n{\n    FCT_IDENTIFICATION;\n\n    SettingsDialog sw(this);\n\n    if ( sw.exec() == QDialog::Accepted )\n    {\n        Data::instance()->clearDXCCStatusCache();\n        rigConnect();\n        rotConnect();\n        stationProfileChanged();\n\n        MembershipQE::instance()->updateLists();\n        saveUserDefinedShortcuts();\n        emit settingsChanged();\n    }\n    else\n        restoreUserDefinedShortcuts();\n}\n\nvoid MainWindow::showStatistics()\n{\n    FCT_IDENTIFICATION;\n\n    if ( stats )\n    {\n       stats->show();\n    }\n}\n\nvoid MainWindow::importLog() {\n    FCT_IDENTIFICATION;\n\n    ImportDialog dialog(this);\n    dialog.exec();\n    ui->logbookWidget->updateTable();\n}\n\nvoid MainWindow::exportLog() {\n    FCT_IDENTIFICATION;\n\n    ExportDialog dialog(this);\n    dialog.exec();\n    ui->logbookWidget->updateTable();\n}\n\nvoid MainWindow::exportCabrillo()\n{\n    FCT_IDENTIFICATION;\n\n    CabrilloExportDialog dialog(this);\n    dialog.exec();\n}\n\nvoid MainWindow::showAwards()\n{\n    FCT_IDENTIFICATION;\n\n    AwardsDialog* dialog = new AwardsDialog (this);\n    connect(dialog, &AwardsDialog::awardConditionSelected,\n            ui->logbookWidget, &LogbookWidget::filterCountryBand);\n    connect(dialog, &AwardsDialog::finished,\n            ui->logbookWidget, &LogbookWidget::restoreFilters);\n    dialog->setAttribute(Qt::WA_DeleteOnClose);\n    dialog->show();\n}\n\nvoid MainWindow::showDXCCSubmission()\n{\n    FCT_IDENTIFICATION;\n\n    DXCCSubmissionDialog dialog(this);\n    dialog.exec();\n}\n\nvoid MainWindow::showAbout()\n{\n    FCT_IDENTIFICATION;\n\n    QString aboutText = tr(\"<h1>QLog %1</h1>\"\n                           \"<p>&copy; 2019 Thomas Gatzweiler DL2IC<br/>\"\n                           \"&copy; 2021-2026 Ladislav Foldyna OK1MLG<br/>\"\n                           \"&copy; 2025-2026 Michael Morgan AA5SH<br/>\"\n                           \"&copy; 2025-2026 Kyle Boyle VE9KZ</p>\"\n                           \"<p>Based on Qt %2<br/>\"\n                           \"%3<br/>\"\n                           \"%4<br/>\"\n                           \"%5</p>\"\n                           \"<p>Icon by <a href='http://www.iconshock.com'>Icon Shock</a><br />\"\n                           \"Satellite images by <a href='http://www.nasa.gov'>NASA</a><br />\"\n                           \"ZoneDetect by <a href='https://github.com/BertoldVdb/ZoneDetect'>Bertold Van den Bergh</a><br />\"\n                           \"TimeZone Database by <a href='https://github.com/evansiroky/timezone-boundary-builder'>Evan Siroky</a>\");\n\n\n    QString version = QCoreApplication::applicationVersion();\n    QString hamlibVersion =\n#if defined(Q_OS_WIN)\n            QString(rig_version());\n#else\n            QString(hamlib_version);\n#endif\n\n    QString OSName = QString(\"%1 %2 (%3)\").arg(QSysInfo::prettyProductName(), QSysInfo::currentCpuArchitecture(), QGuiApplication::platformName() );\n\n#ifdef QLOG_FLATPAK\n    OSName.append(\" Flatpak\");\n#endif\n\n    aboutText = aboutText.arg(version, qVersion(), hamlibVersion, QSslSocket::sslLibraryVersionString(), OSName);\n\n    QMessageBox::about(this, tr(\"About\"), aboutText);\n}\n\nvoid MainWindow::showWhatsNew()\n{\n    FCT_IDENTIFICATION;\n\n    QDesktopServices::openUrl(QString(\"https://github.com/foldynl/QLog/releases/tag/v%0\").arg(VERSION));\n}\n\nvoid MainWindow::showWikiHelp()\n{\n    FCT_IDENTIFICATION;\n\n    QDesktopServices::openUrl(QString(\"https://github.com/foldynl/QLog/wiki\"));\n}\n\nvoid MainWindow::showMailingList()\n{\n    FCT_IDENTIFICATION;\n\n    QDesktopServices::openUrl(QString(\"https://groups.io/g/qlog\"));\n}\n\nvoid MainWindow::showReportBug()\n{\n    FCT_IDENTIFICATION;\n    QDesktopServices::openUrl(QString(\"https://github.com/foldynl/QLog/blob/master/CONTRIBUTING.md#reporting-bugs\"));\n}\n\nvoid MainWindow::showAlerts()\n{\n    FCT_IDENTIFICATION;\n\n    ui->alertDockWidget->show();\n}\n\nvoid MainWindow::clearAlerts()\n{\n    FCT_IDENTIFICATION;\n\n    ui->alertsWidget->clearAllAlerts();\n}\n\nvoid MainWindow::conditionsUpdated() {\n    FCT_IDENTIFICATION;\n\n    QString kcolor, fluxcolor, acolor;\n\n    QString k_index_string, flux_string, a_index_string;\n\n    k_index_string = flux_string = a_index_string = tr(\"N/A\");\n\n    /* https://3fs.net.au/making-sense-of-solar-indices/ */\n    if ( conditions->isKIndexValid() )\n    {\n        double k_index = conditions->getKIndex();\n\n        if (k_index < 3.5) {\n            kcolor = \"green\";\n        }\n        else if (k_index < 4.5) {\n            kcolor = \"orange\";\n        }\n        else {\n            kcolor = \"red\";\n        }\n\n        k_index_string = QString::number(k_index, 'g', 2);\n    }\n\n    if ( conditions->isFluxValid() )\n    {\n        if ( conditions->getFlux() < 100 )\n        {\n            fluxcolor = \"red\";\n        }\n        else if ( conditions->getFlux() < 200 )\n        {\n            fluxcolor = \"orange\";\n        }\n        else\n        {\n            fluxcolor = \"green\";\n        }\n\n        flux_string = QString::number(conditions->getFlux());\n\n    }\n\n    if ( conditions->isAIndexValid() )\n    {\n        if ( conditions->getAIndex() < 27 )\n        {\n            acolor = \"green\";\n        }\n        else if ( conditions->getAIndex() < 48 )\n        {\n            acolor = \"orange\";\n        }\n        else\n        {\n            acolor = \"red\";\n        }\n\n        a_index_string = QString::number(conditions->getAIndex());\n    }\n\n    conditionsLabel->setTextFormat(Qt::RichText);\n    conditionsLabel->setText(QString(\"SFI <b style='color: %1'>%2</b> A <b style='color: %3'>%4</b> K <b style='color: %5'>%6</b>\").arg(\n                                 fluxcolor, flux_string, acolor, a_index_string, kcolor, k_index_string ));\n}\n\nvoid MainWindow::QSOFilterSetting()\n{\n    FCT_IDENTIFICATION;\n\n    QSOFilterDialog dialog(this);\n    dialog.exec();\n    ui->logbookWidget->refreshUserFilter();\n    stats->refreshWidget();\n}\n\nvoid MainWindow::alertRuleSetting()\n{\n    FCT_IDENTIFICATION;\n    ui->alertsWidget->showEditRules();\n}\n\nMainWindow::~MainWindow()\n{\n    FCT_IDENTIFICATION;\n\n    //saveEquipmentConnOptions();\n\n    Rig::instance()->close();\n    Rotator::instance()->close();\n    CWKeyer::instance()->close();\n    QThread::msleep(500);\n\n    Rig::instance()->stopTimer();\n    Rotator::instance()->stopTimer();\n    CWKeyer::instance()->stopTimer();\n\n    conditions->deleteLater();\n    conditionsLabel->deleteLater();\n    profileLabel->deleteLater();\n    callsignLabel->deleteLater();\n    locatorLabel->deleteLater();\n    QSqlDatabase::database().close();\n    clublogRT->deleteLater();\n    if ( wsjtx )\n        wsjtx->deleteLater();\n\n    seqGroup->deleteLater();\n    dupeGroup->deleteLater();\n    delete ui;\n}\n"
  },
  {
    "path": "ui/MainWindow.h",
    "content": "#ifndef QLOG_UI_MAINWINDOW_H\n#define QLOG_UI_MAINWINDOW_H\n\n#include <QMainWindow>\n#include <QPushButton>\n#include <QActionGroup>\n#include \"ui/StatisticsWidget.h\"\n#include \"core/NetworkNotification.h\"\n#include \"core/AlertEvaluator.h\"\n#include \"core/PropConditions.h\"\n#include \"service/clublog/ClubLog.h\"\n\nnamespace Ui {\nclass MainWindow;\n}\n\nclass QLabel;\nclass WsjtxUDPReceiver;\n\nclass MainWindow : public QMainWindow {\n    Q_OBJECT\n\npublic:\n    explicit MainWindow(QWidget* parent = 0);\n    ~MainWindow();\n\n    void closeEvent(QCloseEvent* event) override;\n    void keyReleaseEvent(QKeyEvent *event) override;\n    void changeEvent(QEvent *event) override;\n\n    QList<QAction *> getUserDefinedShortcutActionList();\n    QStringList getBuiltInStaticShortcutList() const;\n\nsignals:\n    void settingsChanged();\n    void themeChanged(int themeMode, bool isDark);\n    void altBackslash(bool active);\n    void manualMode(bool);\n    void contestStopped();\n    void dupeTypeChanged();\n\npublic slots:\n    void rigErrorHandler(const QString &error, const QString &errorDetail);\n    void rotErrorHandler(const QString &error, const QString &errorDetail);\n    void cwKeyerErrorHandler(const QString &error, const QString &errorDetail);\n    void stationProfileChanged();\n    void setLayoutGeometry();\n    void setSimplyLayoutGeometry();\n    void checkNewVersion();\n\nprivate slots:\n    void rigConnect();\n    void rotConnect();\n    void cwKeyerConnect();\n    void cwKeyerConnectProfile(QString);\n    void cwKeyerDisconnectProfile(QString);\n    void showSettings();\n    void showStatistics();\n    void importLog();\n    void exportLog();\n    void showAwards();\n    void showDXCCSubmission();\n    void showAbout();\n    void showWhatsNew();\n    void showWikiHelp();\n    void showMailingList();\n    void showReportBug();\n    void showAlerts();\n    void clearAlerts();\n    void conditionsUpdated();\n    void QSOFilterSetting();\n    void alertRuleSetting();\n    void processSpotAlert(SpotAlert alert);\n    void clearAlertEvent();\n    void beepSettingAlerts();\n    void shortcutALTBackslash();\n    void setManualContact(bool);\n    void showEditLayout();\n    void showServiceUpload();\n    void showServiceDownloadQSL();\n    void showDumpDB();\n    void showLoadDB();\n    void showQSLGallery();\n    void showDevTools();\n    void printQslLabels();\n\n    void saveProfileLayoutGeometry();\n    void setEquipmentKeepOptions(bool);\n\n    void saveContestMenuSeqnoType(QAction *action);\n    void saveContestMenuDupeType(QAction *action);\n    void saveContestMenuLinkExchangeType(QAction *action);\n    void startContest(const QString contestID, const QDateTime);\n    void stopContest();\n    void exportCabrillo();\n    void setContestMode(const QString &contestID);\n\n    void handleActivityChange(const QString name);\n\n    void openNonVfoBandmap(const QString &widgetID, const QString& bandName);\n\n    void showUpdateDialog(const QString &newVersion, const QString &repoName);\n\nprivate:\n    Ui::MainWindow* ui;\n    QLabel* conditionsLabel;\n    QLabel* profileLabel;\n    QLabel* callsignLabel;\n    QLabel* locatorLabel;\n    QLabel* contestLabel;\n    QPushButton* alertButton;\n    QPushButton* alertTextButton;\n    QPushButton *themeButton;\n    StatisticsWidget* stats;\n    NetworkNotification networknotification;\n    AlertEvaluator alertEvaluator;\n    PropConditions *conditions;\n    bool isFusionStyle;\n    ClubLogUploader* clublogRT;\n    WsjtxUDPReceiver* wsjtx;\n    QActionGroup *seqGroup;\n    QActionGroup *dupeGroup;\n    QActionGroup *linkExchangeGroup;\n    QPushButton *activityButton;\n    QMetaObject::Connection alertTextButtonConn;\n    bool firstRun = false;\n    void setupActivitiesMenu();\n\n\n    void restoreUserDefinedShortcuts();\n    void saveUserDefinedShortcuts();\n\n    void restoreContestMenuSeqnoType();\n    void restoreContestMenuDupeType();\n    void restoreContestMenuLinkExchange();\n\n    QString stationCallsignStatus(const StationProfile &profile) const;\n\n    void openNonVfoBandmaps(const QList<QPair<QString, QString>> &list);\n    void clearNonVfoBandmaps();\n    QList<QPair<QString, QString>> getNonVfoBandmapsParams() const;\n    void themeInit(int mode);\n    bool setNativeTheme();\n    void setLightTheme();\n    void setDarkTheme();\n\n    void showEvent(QShowEvent *event) override;\n\n    void restartApplication();\n};\n\n#endif // QLOG_UI_MAINWINDOW_H\n"
  },
  {
    "path": "ui/MainWindow.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>MainWindow</class>\n <widget class=\"QMainWindow\" name=\"MainWindow\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>913</width>\n    <height>625</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string/>\n  </property>\n  <property name=\"dockOptions\">\n   <set>QMainWindow::AllowNestedDocks|QMainWindow::AllowTabbedDocks|QMainWindow::AnimatedDocks|QMainWindow::GroupedDragging</set>\n  </property>\n  <widget class=\"QWidget\" name=\"centralWidget\">\n   <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n    <property name=\"bottomMargin\">\n     <number>0</number>\n    </property>\n    <item>\n     <widget class=\"LogbookWidget\" name=\"logbookWidget\" native=\"true\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n     </widget>\n    </item>\n    <item>\n     <widget class=\"NewContactWidget\" name=\"newContactWidget\" native=\"true\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <property name=\"focusPolicy\">\n       <enum>Qt::ClickFocus</enum>\n      </property>\n     </widget>\n    </item>\n   </layout>\n  </widget>\n  <widget class=\"QMenuBar\" name=\"menuBar\">\n   <property name=\"geometry\">\n    <rect>\n     <x>0</x>\n     <y>0</y>\n     <width>913</width>\n     <height>25</height>\n    </rect>\n   </property>\n   <widget class=\"QMenu\" name=\"menuFile\">\n    <property name=\"title\">\n     <string>&amp;File</string>\n    </property>\n    <addaction name=\"actionSettings\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionDumpDB\"/>\n    <addaction name=\"actionLoadDB\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionQuit\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuLogbook\">\n    <property name=\"title\">\n     <string>&amp;Logbook</string>\n    </property>\n    <addaction name=\"actionQSOFilters\"/>\n    <addaction name=\"actionManualContact\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionImport\"/>\n    <addaction name=\"actionExport\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionAwards\"/>\n    <addaction name=\"actionDXCCSubmission\"/>\n    <addaction name=\"actionStatistics\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionQSLGallery\"/>\n    <addaction name=\"actionPrintQslLabels\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuEquipment\">\n    <property name=\"title\">\n     <string>&amp;Equipment</string>\n    </property>\n    <addaction name=\"actionConnectRig\"/>\n    <addaction name=\"actionConnectCWKeyer\"/>\n    <addaction name=\"actionConnectRotator\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuHelp\">\n    <property name=\"title\">\n     <string>&amp;Help</string>\n    </property>\n    <addaction name=\"actionWikiHelp\"/>\n    <addaction name=\"actionReportBug\"/>\n    <addaction name=\"actionMailingList\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionWhatsNew\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionDeveloperTools\"/>\n    <addaction name=\"actionAbout\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuWindow\">\n    <property name=\"title\">\n     <string>&amp;Window</string>\n    </property>\n    <addaction name=\"actionAlerts\"/>\n    <addaction name=\"actionBandmap\"/>\n    <addaction name=\"actionClock\"/>\n    <addaction name=\"actionChat\"/>\n    <addaction name=\"actionCWConsole\"/>\n    <addaction name=\"actionDXClusterWindow\"/>\n    <addaction name=\"actionMapWindow\"/>\n    <addaction name=\"actionProfileImage\"/>\n    <addaction name=\"actionOnlineMap\"/>\n    <addaction name=\"actionRig\"/>\n    <addaction name=\"actionRotator\"/>\n    <addaction name=\"actionWsjtx\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuServices\">\n    <property name=\"title\">\n     <string>Se&amp;rvice</string>\n    </property>\n    <addaction name=\"actionServiceUpload\"/>\n    <addaction name=\"actionServiceDownload\"/>\n   </widget>\n   <widget class=\"QMenu\" name=\"menuContest\">\n    <property name=\"title\">\n     <string>Contest</string>\n    </property>\n    <widget class=\"QMenu\" name=\"menuDupeCheck\">\n     <property name=\"title\">\n      <string>Dupe Check</string>\n     </property>\n     <addaction name=\"actionDupeAllBands\"/>\n     <addaction name=\"actionDupeEachBand\"/>\n     <addaction name=\"actionDupeEachBandMode\"/>\n     <addaction name=\"actionDupeNoCheck\"/>\n    </widget>\n    <widget class=\"QMenu\" name=\"menuSequence\">\n     <property name=\"title\">\n      <string>Sequence</string>\n     </property>\n     <addaction name=\"actionSeqSingle\"/>\n     <addaction name=\"actionSeqPerBand\"/>\n     <addaction name=\"separator\"/>\n     <addaction name=\"actionSeqReset\"/>\n    </widget>\n    <widget class=\"QMenu\" name=\"menuLinkExchange\">\n     <property name=\"title\">\n      <string>Linking Exchange With</string>\n     </property>\n     <addaction name=\"actionLinkExchangeNone\"/>\n     <addaction name=\"separator\"/>\n    </widget>\n    <addaction name=\"menuDupeCheck\"/>\n    <addaction name=\"menuSequence\"/>\n    <addaction name=\"menuLinkExchange\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionContestStop\"/>\n    <addaction name=\"separator\"/>\n    <addaction name=\"actionExportCabrillo\"/>\n   </widget>\n   <addaction name=\"menuFile\"/>\n   <addaction name=\"menuLogbook\"/>\n   <addaction name=\"menuContest\"/>\n   <addaction name=\"menuServices\"/>\n   <addaction name=\"menuEquipment\"/>\n   <addaction name=\"menuWindow\"/>\n   <addaction name=\"menuHelp\"/>\n  </widget>\n  <widget class=\"QStatusBar\" name=\"statusBar\"/>\n  <widget class=\"QToolBar\" name=\"toolBar\">\n   <property name=\"enabled\">\n    <bool>true</bool>\n   </property>\n   <property name=\"windowTitle\">\n    <string>Toolbar</string>\n   </property>\n   <property name=\"movable\">\n    <bool>false</bool>\n   </property>\n   <property name=\"toolButtonStyle\">\n    <enum>Qt::ToolButtonIconOnly</enum>\n   </property>\n   <property name=\"floatable\">\n    <bool>false</bool>\n   </property>\n   <attribute name=\"toolBarArea\">\n    <enum>TopToolBarArea</enum>\n   </attribute>\n   <attribute name=\"toolBarBreak\">\n    <bool>false</bool>\n   </attribute>\n   <addaction name=\"actionNewContact\"/>\n   <addaction name=\"actionSaveContact\"/>\n   <addaction name=\"separator\"/>\n   <addaction name=\"actionImport\"/>\n   <addaction name=\"actionExport\"/>\n   <addaction name=\"separator\"/>\n   <addaction name=\"actionDXClusterWindow\"/>\n   <addaction name=\"actionMapWindow\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"clockDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Clock</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"ClockWidget\" name=\"clockWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"mapDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Map</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"MapWidget\" name=\"mapWidget\">\n    <property name=\"focusPolicy\">\n     <enum>Qt::ClickFocus</enum>\n    </property>\n   </widget>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"dxDockWidget\">\n   <property name=\"windowTitle\">\n    <string>DX Cluster</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"DxWidget\" name=\"dxWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"wsjtxDockWidget\">\n   <property name=\"windowTitle\">\n    <string>WSJTX</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"WsjtxWidget\" name=\"wsjtxWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"rotatorDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Rotator</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"RotatorWidget\" name=\"rotatorWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"bandmapDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Bandmap</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"BandmapWidget\" name=\"bandmapWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"rigDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Rig</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"RigWidget\" name=\"rigWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"onlineMapDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Online Map</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"OnlineMapWidget\" name=\"onlineMapWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"cwConsoleDockWidget\">\n   <property name=\"windowTitle\">\n    <string>CW Console</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"CWConsoleWidget\" name=\"cwconsoleWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"chatDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Chat</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"ChatWidget\" name=\"chatWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"profileImageDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Profile Image</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"ProfileImageWidget\" name=\"profileImageWidget\"/>\n  </widget>\n  <widget class=\"QDockWidget\" name=\"alertDockWidget\">\n   <property name=\"windowTitle\">\n    <string>Alerts</string>\n   </property>\n   <attribute name=\"dockWidgetArea\">\n    <number>2</number>\n   </attribute>\n   <widget class=\"AlertWidget\" name=\"alertsWidget\"/>\n  </widget>\n  <action name=\"actionQuit\">\n   <property name=\"icon\">\n    <iconset theme=\"application-exit\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Quit</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Application - Quit</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+Q</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::QuitRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionSettings\">\n   <property name=\"icon\">\n    <iconset theme=\"document-properties\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Settings</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::PreferencesRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDumpDB\">\n   <property name=\"text\">\n    <string>Pack Data &amp;&amp; Settings</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionLoadDB\">\n   <property name=\"text\">\n    <string>Unpack Data &amp;&amp; Settings</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionNewContact\">\n   <property name=\"icon\">\n    <iconset theme=\"document-new\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>New QSO - Clear</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>New QSO - Clear</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+N</string>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionImport\">\n   <property name=\"icon\">\n    <iconset theme=\"document-import\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Import</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionExport\">\n   <property name=\"icon\">\n    <iconset theme=\"document-export\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Export</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionConnectRig\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Connect R&amp;ig</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\"/>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionAbout\">\n   <property name=\"icon\">\n    <iconset theme=\"help-about\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;About</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::AboutRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSaveContact\">\n   <property name=\"icon\">\n    <iconset theme=\"document-save\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>New QSO - Save</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>New QSO - Save</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+S</string>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionDXClusterWindow\">\n   <property name=\"icon\">\n    <iconset theme=\"object-rows\">\n     <normaloff>:/res/icons/network-wireless.png</normaloff>:/res/icons/network-wireless.png</iconset>\n   </property>\n   <property name=\"text\">\n    <string>DX Cluster</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionMapWindow\">\n   <property name=\"icon\">\n    <iconset theme=\"globe\">\n     <normaloff>:/res/icons/emblem-web.png</normaloff>:/res/icons/emblem-web.png</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Map</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionStatistics\">\n   <property name=\"icon\">\n    <iconset theme=\"x-office-spreadsheet\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>S&amp;tatistics</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionQSLGallery\">\n   <property name=\"text\">\n    <string>QSL &amp;Gallery</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDeveloperTools\">\n   <property name=\"icon\">\n    <iconset theme=\"applications-science\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Developer Tools</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Run custom read-only SQL queries against the logbook database</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionPrintQslLabels\">\n   <property name=\"text\">\n    <string>Print QSL &amp;Labels</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionWsjtx\">\n   <property name=\"text\">\n    <string>Wsjtx</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionConnectRotator\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Connect R&amp;otator</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionRotator\">\n   <property name=\"text\">\n    <string>Rotator</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionBandmap\">\n   <property name=\"text\">\n    <string>Bandmap</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionRig\">\n   <property name=\"text\">\n    <string>Rig</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionClock\">\n   <property name=\"text\">\n    <string>Clock</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionQSOFilters\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/filter_list-24px.svg</normaloff>:/icons/filter_list-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>QSO &amp;Filters</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionOnlineMap\">\n   <property name=\"text\">\n    <string>Online Map</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionAwards\">\n   <property name=\"icon\">\n    <iconset theme=\"application-certificate\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Awards</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDXCCSubmission\">\n   <property name=\"icon\">\n    <iconset theme=\"application-certificate\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>DXCC &amp;Submission List</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Generate a list of contacts to submit for ARRL DXCC award credit</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionEditAlertRules\">\n   <property name=\"text\">\n    <string>Edit Rules</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionBeepSettingAlert\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Beep</string>\n   </property>\n  </action>\n  <action name=\"actionConnectCWKeyer\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Connect &amp;CW Keyer</string>\n   </property>\n  </action>\n  <action name=\"actionCWConsole\">\n   <property name=\"text\">\n    <string>CW Console</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionWikiHelp\">\n   <property name=\"icon\">\n    <iconset theme=\"help\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Wiki</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionReportBug\">\n   <property name=\"text\">\n    <string>Report &amp;Bug...</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionManualContact\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>&amp;Manual Entry</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Switch New Contact dialog to the manually entry mode&lt;br/&gt;(time, freq, profiles etc. are not taken from their common sources)</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionMailingList\">\n   <property name=\"text\">\n    <string>Mailing List...</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionActivitiesEdit\">\n   <property name=\"text\">\n    <string>Edit</string>\n   </property>\n  </action>\n  <action name=\"actionChat\">\n   <property name=\"text\">\n    <string>Chat</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSaveGeometry\">\n   <property name=\"text\">\n    <string>Save Arrangement</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Save Arrangement</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionEquipmentKeepOptions\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Keep Options</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Restore connection options after application restart</string>\n   </property>\n  </action>\n  <action name=\"actionProfileImage\">\n   <property name=\"text\">\n    <string>Profile Image</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSearchCallsign\">\n   <property name=\"enabled\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Logbook - Search Callsign</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+F</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionAddBandmapMark\">\n   <property name=\"text\">\n    <string>New QSO - Add text from Callsign field to Bandmap</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>New QSO - Add text from Callsign field to Bandmap</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+M</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionBandSwitchDown\">\n   <property name=\"text\">\n    <string>Rig - Band Down</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+PgDown</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionBandSwitchUp\">\n   <property name=\"text\">\n    <string>Rig - Band Up</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+PgUp</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionUseNearestCallsign\">\n   <property name=\"text\">\n    <string>New QSO - Use Callsign from the Whisperer</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+Return</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionCWSpeedUp\">\n   <property name=\"text\">\n    <string>CW Console - Key Speed Up</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+Up</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionCWSpeedDown\">\n   <property name=\"text\">\n    <string>CW Console - Key Speed Down</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+Down</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionCWProfileUp\">\n   <property name=\"text\">\n    <string>CW Console - Profile Up</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+Right</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionCWProfileDown\">\n   <property name=\"text\">\n    <string>CW Console - Profile Down</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+Left</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionPTTOn\">\n   <property name=\"text\">\n    <string>Rig - PTT On/Off</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Alt+\\</string>\n   </property>\n   <property name=\"shortcutContext\">\n    <enum>Qt::ApplicationShortcut</enum>\n   </property>\n   <property name=\"autoRepeat\">\n    <bool>false</bool>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionAlerts\">\n   <property name=\"text\">\n    <string>Alerts</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionClearAlerts\">\n   <property name=\"text\">\n    <string>Clear</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionShowAlerts\">\n   <property name=\"text\">\n    <string>Show Alerts</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDupeAllBands\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>All Bands</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDupeEachBand\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Each Band</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDupeEachBandMode\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Each Band &amp;&amp; Mode</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionDupeNoCheck\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>No Check</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSeqSingle\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Single</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSeqPerBand\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Per Band</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionContestStop\">\n   <property name=\"enabled\">\n    <bool>false</bool>\n   </property>\n   <property name=\"text\">\n    <string>Stop</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionSeqReset\">\n   <property name=\"text\">\n    <string>Reset</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionLinkExchangeNone\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>None</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionServiceUpload\">\n   <property name=\"icon\">\n    <iconset theme=\"mail-send\">\n     <normaloff>.</normaloff>.</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Upload</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Service - Upload QSOs</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+Shift+I</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionServiceDownload\">\n   <property name=\"text\">\n    <string>Download QSLs</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Service - Download QSLs</string>\n   </property>\n   <property name=\"shortcut\">\n    <string notr=\"true\">Ctrl+Shift+D</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n   <property name=\"changeableshortcut\" stdset=\"0\">\n    <bool>true</bool>\n   </property>\n  </action>\n  <action name=\"actionThemeNative\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Theme: Native</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionThemeLight\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Theme: QLog Light</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionThemeDark\">\n   <property name=\"checkable\">\n    <bool>true</bool>\n   </property>\n   <property name=\"text\">\n    <string>Theme: QLog Dark</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionWhatsNew\">\n   <property name=\"text\">\n    <string>What's New</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n  <action name=\"actionExportCabrillo\">\n   <property name=\"text\">\n    <string>Export Cabrillo</string>\n   </property>\n   <property name=\"menuRole\">\n    <enum>QAction::NoRole</enum>\n   </property>\n  </action>\n </widget>\n <layoutdefault spacing=\"6\" margin=\"11\"/>\n <customwidgets>\n  <customwidget>\n   <class>NewContactWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/NewContactWidget.h</header>\n   <container>1</container>\n   <slots>\n    <signal>contactAdded()</signal>\n    <signal>newTarget(double,double)</signal>\n    <slot>resetContact()</slot>\n    <slot>saveContact()</slot>\n    <slot>tuneDx(QString,double)</slot>\n    <slot>readGlobalSettings()</slot>\n    <slot>resetSTXSeq()</slot>\n   </slots>\n  </customwidget>\n  <customwidget>\n   <class>LogbookWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/LogbookWidget.h</header>\n   <container>1</container>\n   <slots>\n    <slot>updateTable()</slot>\n   </slots>\n  </customwidget>\n  <customwidget>\n   <class>DxWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/DxWidget.h</header>\n   <container>1</container>\n   <slots>\n    <signal>tuneDx(QString,double)</signal>\n   </slots>\n  </customwidget>\n  <customwidget>\n   <class>WsjtxWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/WsjtxWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>ClockWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/ClockWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>MapWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/MapWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>RotatorWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/RotatorWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>BandmapWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/BandmapWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>RigWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/RigWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>OnlineMapWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/OnlineMapWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>CWConsoleWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/CWConsoleWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>ChatWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/ChatWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>ProfileImageWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/ProfileImageWidget.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>AlertWidget</class>\n   <extends>QWidget</extends>\n   <header>ui/AlertWidget.h</header>\n   <container>1</container>\n  </customwidget>\n </customwidgets>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>actionQuit</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>close()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>284</x>\n     <y>195</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSettings</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showSettings()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>317</x>\n     <y>231</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDumpDB</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showDumpDB()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>317</x>\n     <y>231</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionLoadDB</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showLoadDB()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>317</x>\n     <y>231</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionExport</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>exportLog()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>399</x>\n     <y>325</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionImport</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>importLog()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>399</x>\n     <y>325</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionNewContact</sender>\n   <signal>triggered()</signal>\n   <receiver>newContactWidget</receiver>\n   <slot>resetContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>408</x>\n     <y>622</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSaveContact</sender>\n   <signal>triggered()</signal>\n   <receiver>newContactWidget</receiver>\n   <slot>saveContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>408</x>\n     <y>622</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionAbout</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showAbout()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>404</x>\n     <y>264</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionConnectRig</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>MainWindow</receiver>\n   <slot>rigConnect()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>446</x>\n     <y>264</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionStatistics</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showStatistics()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>446</x>\n     <y>264</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDXClusterWindow</sender>\n   <signal>triggered()</signal>\n   <receiver>dxDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>340</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionMapWindow</sender>\n   <signal>triggered()</signal>\n   <receiver>mapDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>227</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionWsjtx</sender>\n   <signal>triggered()</signal>\n   <receiver>wsjtxDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>452</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionConnectRotator</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>MainWindow</receiver>\n   <slot>rotConnect()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>446</x>\n     <y>264</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionRotator</sender>\n   <signal>triggered()</signal>\n   <receiver>rotatorDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>407</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionBandmap</sender>\n   <signal>triggered()</signal>\n   <receiver>bandmapDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>482</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionRig</sender>\n   <signal>triggered()</signal>\n   <receiver>rigDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>480</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionClock</sender>\n   <signal>triggered()</signal>\n   <receiver>clockDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>845</x>\n     <y>93</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionQSOFilters</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>QSOFilterSetting()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>446</x>\n     <y>264</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionOnlineMap</sender>\n   <signal>triggered()</signal>\n   <receiver>onlineMapDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>879</x>\n     <y>545</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDXCCSubmission</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showDXCCSubmission()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionAwards</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showAwards()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionEditAlertRules</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>alertRuleSetting()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionBeepSettingAlert</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>beepSettingAlerts()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionConnectCWKeyer</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>MainWindow</receiver>\n   <slot>cwKeyerConnect()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionCWConsole</sender>\n   <signal>triggered()</signal>\n   <receiver>cwConsoleDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>835</x>\n     <y>585</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionWikiHelp</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showWikiHelp()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionReportBug</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showReportBug()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionManualContact</sender>\n   <signal>triggered(bool)</signal>\n   <receiver>MainWindow</receiver>\n   <slot>setManualContact(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionMailingList</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showMailingList()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionActivitiesEdit</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showEditLayout()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionChat</sender>\n   <signal>triggered()</signal>\n   <receiver>chatDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>771</x>\n     <y>585</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSaveGeometry</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>saveProfileLayoutGeometry()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>256</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionProfileImage</sender>\n   <signal>triggered()</signal>\n   <receiver>profileImageDockWidget</receiver>\n   <slot>show()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>883</x>\n     <y>518</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionAlerts</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showAlerts()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionClearAlerts</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>clearAlerts()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionShowAlerts</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showAlerts()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionContestStop</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>stopContest()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionSeqReset</sender>\n   <signal>triggered()</signal>\n   <receiver>newContactWidget</receiver>\n   <slot>resetSTXSeq()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>426</x>\n     <y>529</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionServiceUpload</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showServiceUpload()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionServiceDownload</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showServiceDownloadQSL()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionWhatsNew</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showWhatsNew()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionQSLGallery</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showQSLGallery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDeveloperTools</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>showDevTools()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>298</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionPrintQslLabels</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>printQslLabels()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>278</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionExportCabrillo</sender>\n   <signal>triggered()</signal>\n   <receiver>MainWindow</receiver>\n   <slot>exportCabrillo()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>456</x>\n     <y>312</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <signal>settingsChanged()</signal>\n  <slot>saveContact()</slot>\n  <slot>resetContact()</slot>\n  <slot>showSettings()</slot>\n  <slot>importLog()</slot>\n  <slot>exportLog()</slot>\n  <slot>showAbout()</slot>\n  <slot>rigConnect()</slot>\n  <slot>showStatistics()</slot>\n  <slot>rotConnect()</slot>\n  <slot>QSOFilterSetting()</slot>\n  <slot>showAwards()</slot>\n  <slot>showDXCCSubmission()</slot>\n  <slot>alertRuleSetting()</slot>\n  <slot>showAlerts()</slot>\n  <slot>clearAlerts()</slot>\n  <slot>beepSettingAlerts()</slot>\n  <slot>cwKeyerConnect()</slot>\n  <slot>showWikiHelp()</slot>\n  <slot>showReportBug()</slot>\n  <slot>setManualContact(bool)</slot>\n  <slot>showMailingList()</slot>\n  <slot>showEditLayout()</slot>\n  <slot>saveProfileLayoutGeometry()</slot>\n  <slot>setEquipmentKeepOptions(bool)</slot>\n  <slot>stopContest()</slot>\n  <slot>showServiceDownloadQSL()</slot>\n  <slot>showServiceUpload()</slot>\n  <slot>showWhatsNew()</slot>\n  <slot>showDumpDB()</slot>\n  <slot>showLoadDB()</slot>\n  <slot>showQSLGallery()</slot>\n  <slot>showDevTools()</slot>\n  <slot>printQslLabels()</slot>\n  <slot>exportCabrillo()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/MapWebChannelHandler.cpp",
    "content": "#include <QFile>\n\n#include \"MapWebChannelHandler.h\"\n#include \"core/debug.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.maplayercontrolhandler\");\n\nMapWebChannelHandler::MapWebChannelHandler(const QString &configID,\n                                           QObject *parent)\n    : QObject(parent), configID(configID)\n{\n}\n\nvoid MapWebChannelHandler::connectWebChannel(QWebEnginePage *page)\n{\n    FCT_IDENTIFICATION;\n\n    QFile file(\":/qtwebchannel/qwebchannel.js\");\n\n    if (!file.open(QIODevice::ReadOnly))\n    {\n        qCInfo(runtime) << \"Cannot read qwebchannel.js\";\n        return;\n    }\n\n    QTextStream stream(&file);\n    QString js;\n\n    js.append(stream.readAll());\n    js += \" var webChannel = new QWebChannel(qt.webChannelTransport, function(channel) \"\n          \"{ window.foo = channel.objects.layerControlHandler; });\"\n          \" map.on('overlayadd', function(e){ \"\n          \"  switch (e.name) \"\n          \"  { \"\n          \"     case '\" + tr(\"Grid\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('maidenheadConfWorked', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Gray-Line\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('grayline', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Beam\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('antPathLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Aurora\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('auroraLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"MUF\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('mufLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"IBP\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('IBPLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Chat\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('chatStationsLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"WSJTX - CQ\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('wsjtxStationsLayer', 'on'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Path\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('pathLayer', 'on'); \"\n          \"        break; \"\n          \"  } \"\n          \"});\"\n          \"map.on('overlayremove', function(e){ \"\n          \"   switch (e.name) \"\n          \"   { \"\n          \"      case '\" + tr(\"Grid\") + \"': \"\n          \"         foo.handleLayerSelectionChanged('maidenheadConfWorked', 'off'); \"\n          \"         break; \"\n          \"      case '\" + tr(\"Gray-Line\") + \"': \"\n          \"         foo.handleLayerSelectionChanged('grayline', 'off'); \"\n          \"         break; \"\n          \"     case '\" + tr(\"Beam\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('antPathLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Aurora\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('auroraLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"MUF\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('mufLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"IBP\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('IBPLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Chat\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('chatStationsLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"WSJTX - CQ\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('wsjtxStationsLayer', 'off'); \"\n          \"        break; \"\n          \"     case '\" + tr(\"Path\") + \"': \"\n          \"        foo.handleLayerSelectionChanged('pathLayer', 'off'); \"\n          \"        break; \"\n          \"   } \"\n          \"});\";\n    page->runJavaScript(js);\n}\n\nvoid MapWebChannelHandler::restoreLayerControlStates(QWebEnginePage *page)\n{\n    FCT_IDENTIFICATION;\n\n    QString js;\n\n    const QStringList &keys = LogParam::getMapLayerStates(configID);\n\n    for ( const QString &key : keys)\n    {\n        qCDebug(runtime) << \"key:\" << key << \"value:\" << LogParam::getMapLayerState(configID, key);\n\n        js += ( LogParam::getMapLayerState(configID, key) ) ? QString(\"map.addLayer(%1);\").arg(key)\n                                                            : QString(\"map.removeLayer(%1);\").arg(key);\n    }\n    qCDebug(runtime) << js;\n\n    page->runJavaScript(js);\n\n    connectWebChannel(page);\n}\n\nQString MapWebChannelHandler::generateMapMenuJS(bool gridLayer,\n                                                bool grayline,\n                                                bool aurora,\n                                                bool muf,\n                                                bool ibp,\n                                                bool antpath,\n                                                bool chatStations,\n                                                bool wsjtxStations,\n                                                bool paths)\n{\n    FCT_IDENTIFICATION;\n    QStringList options;\n\n    if ( aurora )\n        options << \"\\\"\" + tr(\"Aurora\") + \"\\\": auroraLayer\";\n\n    if ( antpath )\n        options << \"\\\"\" + tr(\"Beam\") + \"\\\": antPathLayer\";\n\n    if ( chatStations )\n        options << \"\\\"\" + tr(\"Chat\") + \"\\\": chatStationsLayer\";\n\n    if ( gridLayer )\n        options << \"\\\"\" + tr(\"Grid\") + \"\\\": maidenheadConfWorked\";\n\n    if ( grayline )\n        options << \"\\\"\" + tr(\"Gray-Line\") + \"\\\": grayline\";\n\n    if ( ibp )\n        options << \"\\\"\" + tr(\"IBP\") + \"\\\": IBPLayer\";\n\n    if ( muf )\n        options << \"\\\"\" + tr(\"MUF\") + \"\\\": mufLayer\";\n\n    if ( wsjtxStations )\n        options << \"\\\"\" + tr(\"WSJTX - CQ\") + \"\\\": wsjtxStationsLayer\";\n\n    if ( paths )\n        options << \"\\\"\" + tr(\"Path\") + \"\\\": pathLayer\";\n\n    QString ret = QString(\"var layerControl = new L.Control.Layers(null,\"\n                          \"{ %1 },{}).addTo(map);\").arg(options.join(\",\"));\n\n    qCDebug(runtime) << ret;\n\n    return ret;\n}\n\nvoid MapWebChannelHandler::handleLayerSelectionChanged(const QVariant &data, const QVariant &state)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << data << state;\n\n    LogParam::setMapLayerState(configID, data.toString(),\n                               (state.toString().toLower() == \"on\") ? true : false);\n}\n\nvoid MapWebChannelHandler::chatCallsignClicked(const QVariant &data)\n{\n    FCT_IDENTIFICATION;\n\n    emit chatCallsignPressed(data.toString());\n}\n\nvoid MapWebChannelHandler::wsjtxCallsignClicked(const QVariant &data)\n{\n    FCT_IDENTIFICATION;\n\n    emit wsjtxCallsignPressed(data.toString());\n}\n\nvoid MapWebChannelHandler::IBPCallsignClicked(const QVariant &callsign, const QVariant &freq)\n{\n    FCT_IDENTIFICATION;\n\n    emit IBPPressed(callsign.toString(), freq.toDouble());\n}\n"
  },
  {
    "path": "ui/MapWebChannelHandler.h",
    "content": "#ifndef QLOG_UI_MAPWEBCHANNELHANDLER_H\n#define QLOG_UI_MAPWEBCHANNELHANDLER_H\n\n#include <QObject>\n#include <QWebEnginePage>\n\nclass MapWebChannelHandler : public QObject\n{\n    Q_OBJECT\npublic:\n    explicit MapWebChannelHandler(const QString &configID,\n                                  QObject *parent = nullptr);\n    void restoreLayerControlStates(QWebEnginePage *page);\n    QString generateMapMenuJS(bool gridLayer = true,\n                              bool grayline = false,\n                              bool aurora = false,\n                              bool muf = false,\n                              bool ibp = false,\n                              bool antpath = false,\n                              bool chatStations = false,\n                              bool wsjtxStations = false,\n                              bool paths = false);\n\nsignals:\n    void chatCallsignPressed(QString);\n    void wsjtxCallsignPressed(QString);\n    void IBPPressed(QString, double);\n\npublic slots:\n    void handleLayerSelectionChanged(const QVariant &data,\n                                     const QVariant &state);\n    void chatCallsignClicked(const QVariant &data);\n    void wsjtxCallsignClicked(const QVariant &data);\n    void IBPCallsignClicked(const QVariant &callsign,\n                            const QVariant &freq);\nprivate:\n    QString configID;\n\n    void connectWebChannel(QWebEnginePage *page);\n};\n\n#endif // QLOG_UI_MAPWEBCHANNELHANDLER_H\n"
  },
  {
    "path": "ui/MapWidget.cpp",
    "content": "#include <QGraphicsTextItem>\n#include <QTime>\n#include <QTimer>\n#include <QDebug>\n#include <QPainter>\n#include <QVector3D>\n#include <QtMath>\n#include \"MapWidget.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/StationProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.mapwidget\");\n\nMapWidget::MapWidget(QWidget *parent) :\n    QGraphicsView(parent)\n{\n    FCT_IDENTIFICATION;\n\n    scene = new QGraphicsScene(this);\n    this->setScene(scene);\n    this->setStyleSheet(\"background-color: transparent;\");\n\n    QPixmap pix(\":/res/map/nasabluemarble.jpg\");\n    scene->addPixmap(pix);\n    scene->setSceneRect(pix.rect());\n\n    nightOverlay = new QGraphicsPixmapItem();\n    scene->addItem(nightOverlay);\n\n    /*sunItem = scene->addEllipse(0, 0, sunSize, sunSize,\n                                QPen(QColor(235, 219, 52)),\n                                QBrush(QColor(235, 219, 52),\n                                        Qt::SolidPattern));\n*/\n    terminatorItem = scene->addPath(QPainterPath(), QPen(QColor(100, 100, 100), 2),\n                                    QBrush(QColor(0, 0, 0),\n                                    Qt::SolidPattern));\n\n    this->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);\n\n    redrawNightOverlay();\n    clear();\n\n    QTimer* timer = new QTimer(this);\n    connect(timer, &QTimer::timeout, this, &MapWidget::redraw);\n    timer->start(60000);\n}\n\nvoid MapWidget::clear()\n{\n    FCT_IDENTIFICATION;\n\n    QMutableListIterator<QGraphicsItem*> i(items);\n\n    while ( i.hasNext() )\n    {\n        QGraphicsItem *item = i.next();\n        scene->removeItem(item);\n        delete item;\n        i.remove();\n    }\n\n    Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n    if ( myGrid.isValid() )\n    {\n        double lat=0;\n        double lon=0;\n\n        lat = myGrid.getLatitude();\n        lon = myGrid.getLongitude();\n        drawPoint(coordToPoint(lat, lon));\n    }\n}\n\nvoid MapWidget::redraw()\n{\n    FCT_IDENTIFICATION;\n\n    redrawNightOverlay();\n}\n\nvoid MapWidget::drawPoint(const QPoint &point)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << point;\n\n    items << scene->addEllipse(point.x()-2, point.y()-2, 4, 4,\n                               QPen(QColor(255, 0, 0)),\n                               QBrush(QColor(255, 0, 0),\n                               Qt::SolidPattern));\n}\n\nvoid MapWidget::drawLine(const QPoint &pointA, const QPoint &pointB)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << pointA << pointB;\n\n    QPainterPath path;\n    double latA, lonA, latB, lonB;\n    double f = 0;\n    double steps = 200.0;\n\n    path.moveTo(pointA);\n    pointToRad(pointA, latA, lonA);\n    pointToRad(pointB, latB, lonB);\n    double prevLon = lonA;\n\n    double d = 2.0*asin(sqrt(pow(sin(latA-latB)/2, 2) + cos(latA)* cos(latB) * pow(sin((lonA-lonB)/2), 2)));\n\n    for ( int i = 0; i < steps; i++ )\n    {\n        double A = sin((1.0-f)*d)/sin(d);\n        double B = sin(f*d)/sin(d);\n        double x = A*cos(latA)*cos(lonA) + B*cos(latB)*cos(lonB);\n        double y = A*cos(latA)*sin(lonA) + B*cos(latB)*sin(lonB);\n        double z = A*sin(latA)           + B*sin(latB);\n        double lat = atan2(z, sqrt(x*x + y*y));\n        double lon = atan2(y, x);\n\n        if ( qIsNaN(lat) || qIsNaN(lon))\n            continue;\n\n        if ( qAbs(prevLon - lon) > M_PI )\n        {\n            double endpoint = (prevLon > 0 ) ? M_PI : -M_PI;\n            path.lineTo(radToPoint(lat,endpoint));\n            path.closeSubpath();\n\n            items << scene->addPath(QPainterPath(path), QPen(QColor(255, 0, 0)),\n                                    QBrush(QColor(255, 0, 0), Qt::SolidPattern));\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 13, 0))\n            path.clear();\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n            path = QPainterPath();\n#endif\n            path.moveTo(radToPoint(lat, -1 * endpoint));\n        }\n        const QPoint &p = radToPoint(lat, lon);\n        path.lineTo(p);\n        path.moveTo(p);\n        prevLon = lon;\n\n        f += 1.0 / steps;\n    }\n\n    path.lineTo(pointB);\n    path.closeSubpath();\n\n    items << scene->addPath(path, QPen(QColor(255, 0, 0)),\n                            QBrush(QColor(255, 0, 0), Qt::SolidPattern));\n}\n\nvoid MapWidget::redrawNightOverlay()\n{\n    FCT_IDENTIFICATION;\n\n    QDateTime current = QDateTime::currentDateTimeUtc();\n    int secondOfDay = (QTime(0, 0, 0).secsTo(current.time()) + 43200) % 86400;\n    int dayOfYear = current.date().dayOfYear();\n    int daysInYear = QDate::isLeapYear(current.date().year()) ? 366 : 365;\n    int longestDay = QDate(current.date().year(), 6, 21).dayOfYear();\n\n    double yearProgress = static_cast<double>(dayOfYear-longestDay) / static_cast<double>(daysInYear);\n    double tilt = 23.5 * cos(2.0 * M_PI * yearProgress);\n\n    double sunX = cos(2.0 * M_PI * (secondOfDay / 86400.0));\n    double sunY = -sin(2.0 * M_PI * (secondOfDay / 86400.0));\n    double sunZ = tan(2.0 * M_PI * (tilt / 360.0));\n\n    QVector3D sun(static_cast<float>(sunX), static_cast<float>(sunY), static_cast<float>(sunZ));\n    sun.normalize();\n\n    // <plot sun position>\n    //double theta = acos(sunZ);\n    //double phi = atan(sunY/sunX);\n    //double sunLon = phi/M_PI * 180.0;\n    //double sunLat = 90 - theta / M_PI * 180.0;\n    //sunItem->setPos(coordToPoint(sunLat, sunLon) - QPoint(sunSize / 2, sunSize / 2));\n    // </plot sun position>\n\n    int maxX = static_cast<int>(scene->width());\n    int maxY = static_cast<int>(scene->height());\n\n    QImage overlay(maxX, maxY, QImage::Format_ARGB32);\n    uchar* buffer = overlay.bits();\n\n    for ( int y = 0; y < maxY; y++ )\n    {\n        double theta = M_PI * (static_cast<double>(y) / (static_cast<double>(maxY) - 1.0));\n        double posZ = cos(theta);\n        double sinTheta = sin(theta);\n\n        for ( int x = 0; x < maxX; x++ )\n        {\n            double phi = 2.0 * M_PI * (static_cast<double>(x) / (static_cast<double>(maxX) - 1.0)) - M_PI;\n\n            double posX = sinTheta * cos(phi);\n            double posY = sinTheta * sin(phi);\n\n            QVector3D pos(static_cast<float>(posX), static_cast<float>(posY), static_cast<float>(posZ));\n            pos.normalize();\n\n            buffer[0] = 0;\n            buffer[1] = 0;\n            buffer[2] = 0;\n\n            float ill = QVector3D::dotProduct(sun, pos);\n            if ( ill <= -0.1f )\n            {\n                buffer[3] = 255;\n            }\n            else if ( ill < 0.1f )\n            {\n                double illd = 1.0 - (static_cast<double>(ill) + 0.1) * 5.0;\n                illd = pow(illd, 8);\n                buffer[3] = static_cast<uchar>(255.0 * illd);\n            }\n            else\n            {\n                buffer[3] = 0;\n            }\n            buffer += 4;\n        }\n    }\n\n    QImage night(\":/res/map/nasaearthlights.jpg\");\n\n    QPainter painter;\n    painter.begin(&overlay);\n    painter.setCompositionMode(QPainter::CompositionMode_SourceAtop);\n    painter.drawImage(0, 0, night);\n    painter.end();\n\n    nightOverlay->setPixmap(QPixmap::fromImage(overlay));\n}\n\nvoid MapWidget::pointToRad(const QPoint &point, double& lat, double& lon)\n{\n    FCT_IDENTIFICATION;\n\n    lat = M_PI / 2.0 - static_cast<double>(point.y()) / (scene->height() - 1.0) * M_PI;\n    lon = 2.0 * M_PI *(static_cast<double>(point.x()) / (scene->width() - 1.0)) - M_PI;\n\n    qCDebug(runtime) << point << lat << lon;\n}\n\nvoid MapWidget::pointToCoord(const QPoint &point, double& lat, double& lon)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << lat << lon;\n\n    lat = 90.0 - (point.y() / scene->height()) * 180.0;\n    lon = 360.0 * (point.x() / scene->width()) - 180.0;\n\n    qCDebug(runtime) << point << lat << lon;\n}\n\nQPoint MapWidget::radToPoint(const double lat, const double lon)\n{\n    FCT_IDENTIFICATION;\n\n    if ( qIsNaN(lat) || qIsNaN(lon) )\n        return QPoint();\n\n    int x = static_cast<int>((lon + M_PI) / (2.0 * M_PI) * scene->width());\n    int y = static_cast<int>(scene->height() / 2.0 - (2.0 * lat / M_PI) * (scene->height() / 2.0));\n\n    qCDebug(runtime) << x << y << lat << lon;\n\n    return QPoint(x, y);\n}\n\nQPoint MapWidget::coordToPoint(const double lat, const double lon)\n{\n    FCT_IDENTIFICATION;\n\n    int x = static_cast<int>((lon + 180.0) / 360.0 * scene->width());\n    int y = static_cast<int>(scene->height() / 2.0 - (lat / 90.0) * (scene->height() / 2.0));\n\n    qCDebug(runtime) << lat << lon << x << y;\n\n    return QPoint(x, y);\n}\n\nvoid MapWidget::setTarget(double lat, double lon)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << lat << lon;\n\n    clear();\n\n    if ( qIsNaN(lat) || qIsNaN(lon) ) return;\n\n    Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n    QPoint point = coordToPoint(lat, lon);\n    drawPoint(point);\n\n    if ( myGrid.isValid() )\n    {\n        double qthLat = myGrid.getLatitude();\n        double qthLon = myGrid.getLongitude();\n\n        qCDebug(runtime) << \"My QTH\" << qthLat << qthLon;\n\n        QPoint qth = coordToPoint(qthLat, qthLon);\n        drawPoint(qth);\n        drawLine(qth, point);\n    }\n}\n\nvoid MapWidget::showEvent(QShowEvent* event)\n{\n    FCT_IDENTIFICATION;\n\n    this->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);\n    QWidget::showEvent(event);\n}\n\nvoid MapWidget::resizeEvent(QResizeEvent* event)\n{\n    FCT_IDENTIFICATION;\n\n    this->fitInView(scene->sceneRect(), Qt::KeepAspectRatio);\n    QWidget::resizeEvent(event);\n}\n\nMapWidget::~MapWidget()\n{\n}\n"
  },
  {
    "path": "ui/MapWidget.h",
    "content": "#ifndef QLOG_UI_MAPWIDGET_H\n#define QLOG_UI_MAPWIDGET_H\n\n#include <QWidget>\n#include <QGraphicsView>\n#include <QGraphicsScene>\n\nnamespace Ui {\nclass MapWidget;\n}\n\nclass MapWidget : public QGraphicsView\n{\n    Q_OBJECT\n\npublic:\n    explicit MapWidget(QWidget* parent = nullptr);\n    ~MapWidget();\n\npublic slots:\n    void setTarget(double lat, double lon);\n    void clear();\n    void redraw();\n\nprotected:\n    void showEvent(QShowEvent* event);\n    void resizeEvent(QResizeEvent* event);\n\nprivate:\n    void redrawNightOverlay();\n    void drawPoint(const QPoint &point);\n    void drawLine(const QPoint &pointA, const QPoint &pointB);\n\n    void pointToRad(const QPoint &point, double& lat, double& lon);\n    void pointToCoord(const QPoint &point, double& lat, double& lon);\n    QPoint radToPoint(const double lat, const double lon);\n    QPoint coordToPoint(const double lat, const double lon);\n\n    int sunSize = 20;\n\n    QGraphicsPixmapItem* nightOverlay;\n    QList<QGraphicsItem*> items;\n    QGraphicsEllipseItem* sunItem;\n    QGraphicsPathItem* terminatorItem;\n    QGraphicsScene* scene;\n};\n\n#endif // QLOG_UI_MAPWIDGET_H\n"
  },
  {
    "path": "ui/ModeSelectionController.cpp",
    "content": "#include <QJsonDocument>\n#include <QSignalBlocker>\n#include \"ModeSelectionController.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.modeselectioncontroller\");\n\nModeSelectionController::ModeSelectionController(QComboBox *modeCombo,\n                                                 QComboBox *submodeCombo,\n                                                 bool enabledOnly,\n                                                 bool selectFirstSubmode,\n                                                 bool hideSubmodeWhenEmpty,\n                                                 bool fallbackToFirstMode,\n                                                 QObject *parent) :\n    QObject(parent),\n    modeCombo(modeCombo),\n    submodeCombo(submodeCombo),\n    modeModel(nullptr),\n    submodeModel(nullptr),\n    enabledOnly(enabledOnly),\n    selectFirstSubmode(selectFirstSubmode),\n    hideSubmodeWhenEmpty(hideSubmodeWhenEmpty),\n    fallbackToFirstMode(fallbackToFirstMode),\n    nameColumn(-1)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !modeCombo || !submodeCombo )\n        return;\n\n    QSignalBlocker modeBlocker(modeCombo);\n    QSignalBlocker submodeBlocker(submodeCombo);\n\n    modeModel = new QSqlTableModel(this);\n    modeModel->setTable(\"modes\");\n    if ( enabledOnly ) modeModel->setFilter(\"enabled = true\");\n    nameColumn = modeModel->fieldIndex(\"name\");\n    modeModel->setSort(nameColumn, Qt::AscendingOrder);\n    modeModel->select();\n\n    modeCombo->setModel(modeModel);\n    modeCombo->setModelColumn(nameColumn);\n\n    submodeModel = new QStringListModel(this);\n    submodeCombo->setModel(submodeModel);\n}\n\nvoid ModeSelectionController::applyCurrentMode()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !modeModel || !submodeModel || !modeCombo || !submodeCombo ) return;\n\n    if ( modeCombo->currentIndex() < 0 )\n    {\n        applySubmodes(QStringList());\n        emit defaultReportChanged(QString());\n        return;\n    }\n\n    const QSqlRecord record = currentRecord();\n    if ( record.isEmpty() )\n    {\n        applySubmodes(QStringList());\n        emit defaultReportChanged(QString());\n        return;\n    }\n\n    const QString submodes = record.value(\"submodes\").toString();\n    const QStringList submodeList = QJsonDocument::fromJson(submodes.toUtf8()).toVariant().toStringList();\n\n    applySubmodes(submodeList);\n    emit defaultReportChanged(record.value(\"rprt\").toString());\n}\n\nvoid ModeSelectionController::reloadModel()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !modeModel || !modeCombo || !submodeCombo )\n        return;\n\n    const QString prevMode = modeCombo->currentText();\n    const QString prevSubmode = submodeCombo->currentText();\n\n    QSignalBlocker modeBlocker(modeCombo);\n    QSignalBlocker submodeBlocker(submodeCombo);\n\n    modeModel->select();\n\n    int modeIndex = modeCombo->findText(prevMode);\n    if ( modeIndex >= 0 )\n        modeCombo->setCurrentIndex(modeIndex);\n    else if ( fallbackToFirstMode && modeCombo->count() > 0 )\n        modeCombo->setCurrentIndex(0);\n    else\n        modeCombo->setCurrentIndex(-1);\n\n    applyCurrentMode();\n\n    if ( !prevSubmode.isEmpty() )\n    {\n        int submodeIndex = submodeCombo->findText(prevSubmode);\n        if ( submodeIndex >= 0 )\n            submodeCombo->setCurrentIndex(submodeIndex);\n    }\n}\n\nvoid ModeSelectionController::applySubmodes(const QStringList &submodeList)\n{\n    FCT_IDENTIFICATION;\n\n    QSignalBlocker blocker(submodeCombo);\n\n    if ( submodeList.isEmpty() )\n    {\n        submodeModel->setStringList(QStringList());\n\n        if ( hideSubmodeWhenEmpty )\n            submodeCombo->setVisible(false);\n        else\n            submodeCombo->setEnabled(false);\n\n        if ( selectFirstSubmode ) submodeCombo->setCurrentIndex(-1);\n\n        return;\n    }\n\n    QStringList list = submodeList;\n    list.prepend(\"\");\n    submodeModel->setStringList(list);\n\n    if ( hideSubmodeWhenEmpty )\n        submodeCombo->setVisible(true);\n    else\n        submodeCombo->setEnabled(true);\n\n    if ( selectFirstSubmode ) submodeCombo->setCurrentIndex(1);\n}\n\nQSqlRecord ModeSelectionController::currentRecord() const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !modeModel ) return QSqlRecord();\n\n    return modeModel->record(modeCombo->currentIndex());\n}\n"
  },
  {
    "path": "ui/ModeSelectionController.h",
    "content": "#ifndef QLOG_UI_MODESELECTIONCONTROLLER_H\n#define QLOG_UI_MODESELECTIONCONTROLLER_H\n\n#include <QObject>\n#include <QComboBox>\n#include <QSqlRecord>\n#include <QSqlTableModel>\n#include <QStringListModel>\n\nclass ModeSelectionController : public QObject\n{\n    Q_OBJECT\n\npublic:\n    ModeSelectionController(QComboBox *modeCombo,\n                            QComboBox *submodeCombo,\n                            bool enabledOnly,\n                            bool selectFirstSubmode,\n                            bool hideSubmodeWhenEmpty,\n                            bool fallbackToFirstMode,\n                            QObject *parent = nullptr);\n\n    void applyCurrentMode();\n    void reloadModel();\n\nsignals:\n    void defaultReportChanged(const QString &report);\n\nprivate:\n    void applySubmodes(const QStringList &submodeList);\n    QSqlRecord currentRecord() const;\n\n    QComboBox *modeCombo;\n    QComboBox *submodeCombo;\n    QSqlTableModel *modeModel;\n    QStringListModel *submodeModel;\n    bool enabledOnly;\n    bool selectFirstSubmode;\n    bool hideSubmodeWhenEmpty;\n    bool fallbackToFirstMode;\n    int nameColumn;\n};\n\n#endif // QLOG_UI_MODESELECTIONCONTROLLER_H\n"
  },
  {
    "path": "ui/NewContactWidget.cpp",
    "content": "#include <QtSql/QtSql>\n#include <QShortcut>\n#include <QDesktopServices>\n#include <QDebug>\n#include <QCompleter>\n#include <QMessageBox>\n#include <QSqlField>\n#include <QTimeZone>\n#include <QKeyEvent>\n#include <QToolButton>\n#include <QStackedWidget>\n#include <QRandomGenerator>\n\n#include \"rig/Rig.h\"\n#include \"rig/macros.h\"\n#include \"rotator/Rotator.h\"\n#include \"NewContactWidget.h\"\n#include \"ui_NewContactWidget.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/StationProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"data/CWKeyProfile.h\"\n#include \"data/Data.h\"\n#include \"data/Callsign.h\"\n#include \"core/PropConditions.h\"\n#include \"core/MembershipQE.h\"\n#include \"logformat/AdiFormat.h\"\n#include \"data/MainLayoutProfile.h\"\n#include \"models/LogbookModel.h\"\n#include \"data/BandPlan.h\"\n#include \"ui/ModeSelectionController.h\"\n#include \"core/LogParam.h\"\n#include \"data/ActivityProfile.h\"\n#include \"core/LogParam.h\"\n#include \"core/PotaQE.h\"\n#include \"core/WsjtxUDPReceiver.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.newcontactwidget\");\n\nNewContactWidget::NewContactWidget(QWidget *parent) :\n    QWidget(parent),\n    rig(Rig::instance()),\n    dxDistance(qQNaN()),\n    contactTimer(new QTimer(this)),\n    ui(new Ui::NewContactWidget),\n    uiDynamic(new NewContactDynamicWidgets(true, this)),\n    prop_cond(nullptr),\n    countyCompleter(nullptr),\n    QSOFreq(0.0),\n    QSOTxFreq(0.0),\n    prevQSOTxFreq(0.0),\n    bandwidthFilter(BANDWIDTH_UNKNOWN),\n    rigOnline(false),\n    isManualEnterMode(false),\n    rigSplitEnabled(false),\n    callbookSearchPaused(false),\n    modeController(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n    // tab pane with QSO fields - expand & collapse\n    tabCollapseBtn = new QToolButton(this);\n    QIcon toggleIcon;\n    toggleIcon.addPixmap(QPixmap(\":/icons/baseline-play_down-24px.svg\"), QIcon::Normal, QIcon::On);\n    toggleIcon.addPixmap(QPixmap(\":/icons/baseline-play_arrow-24px.svg\"), QIcon::Normal, QIcon::Off);\n    tabCollapseBtn->setIcon(toggleIcon);\n    tabCollapseBtn->setCheckable(true);\n    tabCollapseBtn->setToolTip(tr(\"Expand/Collapse\"));\n    tabCollapseBtn->setFocusPolicy(Qt::NoFocus);\n    ui->qsoTabs->setCornerWidget(tabCollapseBtn, Qt::TopLeftCorner);\n    connect(tabCollapseBtn, &QAbstractButton::toggled, this, &NewContactWidget::tabsExpandCollapse);\n    connect(ui->qsoTabs, &QTabWidget::tabBarClicked, this, [this](const int)\n            {\n                // force expand if a tab is activated\n                tabCollapseBtn->setChecked(true);\n            });\n\n    ui->rstRcvdEdit->spaceForbidden(true);\n    ui->rstSentEdit->spaceForbidden(true);\n    ui->dupeLabel->setVisible(false);\n\n    setupCustomUi();\n    uiDynamic->contestIDEdit->setText(LogParam::getContestID());\n\n    CWKeyProfilesManager::instance(); //TODO remove, make it better - workaround\n\n    ui->dateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->timeOnEdit->setDisplayFormat(locale.formatTimeLongWithoutTZ());\n\n    /**************************/\n    /* QSL Send Combo Content */\n    /**************************/\n    /* do no use Data::qslSentBox for it because\n     * Data::qslSentBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslSentBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->qslSentBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->qslSentBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->qslSentBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->qslSentBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    /**************************/\n    /* QSL Send LoTW Combo Content */\n    /**************************/\n    /* do no use Data::eQSLSentBox for it because\n     * Data::eQSLSentBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->eQSLSentBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->eQSLSentBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->eQSLSentBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->eQSLSentBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->eQSLSentBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    /**************************/\n    /* QSL Send eQSL Combo Content */\n    /**************************/\n    /* do no use Data::lotwQslSentBox for it because\n     * Data::lotwQslSentBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->lotwQslSentBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->lotwQslSentBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->lotwQslSentBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->lotwQslSentBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->lotwQslSentBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    /*****************************/\n    /* QSL SendVia Combo Content */\n    /*****************************/\n    /* do no use Data::qslSentViaBox for it because\n     * Data::qslSentViaBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslSentViaBox->addItem(\"\", QVariant(\"\"));\n    ui->qslSentViaBox->addItem(tr(\"Bureau\"), QVariant(\"B\"));\n    ui->qslSentViaBox->addItem(tr(\"Direct\"), QVariant(\"D\"));\n    ui->qslSentViaBox->addItem(tr(\"Electronic\"), QVariant(\"E\"));\n\n    /****************/\n    /* Rig Profile  */\n    /****************/\n    QStringListModel* rigModel = new QStringListModel(this);\n    ui->rigEdit->setModel(rigModel);\n    refreshRigProfileCombo();\n\n    /****************/\n    /* Ant Profile  */\n    /****************/\n    QStringListModel* antModel = new QStringListModel(this);\n    ui->antennaEdit->setModel(antModel);\n    refreshAntProfileCombo();\n\n    /*******************/\n    /* Station Profile */\n    /*******************/\n    QStringListModel* stationProfilesModel = new QStringListModel(this);\n    ui->stationProfileCombo->setModel(stationProfilesModel);\n    refreshStationProfileCombo();\n\n    /******************/\n    /* Submodes Combo */\n    /******************/\n    modeController = new ModeSelectionController(ui->modeEdit, ui->submodeEdit,\n                                                 true, true, true, true, this);\n    connect(modeController, &ModeSelectionController::defaultReportChanged,\n            this, [this](const QString &report)\n            {\n                defaultReport = report;\n                setDefaultReport();\n            });\n    modeController->applyCurrentMode();\n\n    /**********************/\n    /* Propagation Combo  */\n    /**********************/\n    QStringListModel* propagationModeModel = new QStringListModel(Data::instance()->propagationModesList(), this);\n    ui->propagationModeEdit->setModel(propagationModeModel);\n\n    /***************/\n    /* Completers  */\n    /***************/\n    wwffCompleter = new QCompleter(Data::instance()->wwffIDList(), this);\n    wwffCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    wwffCompleter->setFilterMode(Qt::MatchStartsWith);\n    wwffCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    uiDynamic->wwffEdit->setCompleter(nullptr);\n\n    potaCompleter = new MultiselectCompleter(Data::instance()->potaIDList(), this);\n    potaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    potaCompleter->setFilterMode(Qt::MatchStartsWith);\n    potaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    uiDynamic->potaEdit->setCompleter(nullptr);\n\n    sotaCompleter = new QCompleter(Data::instance()->sotaIDList(), this);\n    sotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sotaCompleter->setFilterMode(Qt::MatchStartsWith);\n    sotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    uiDynamic->sotaEdit->setCompleter(nullptr);\n\n    uiDynamic->countyEdit->setCompleter(nullptr);\n\n    sigCompleter = new QCompleter(uiDynamic->sigEdit);\n    sigCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sigCompleter->setFilterMode(Qt::MatchStartsWith);\n    sigCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    uiDynamic->sigEdit->setCompleter(sigCompleter);\n\n    contestCompleter = new QCompleter(uiDynamic->contestIDEdit);\n    contestCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    contestCompleter->setFilterMode(Qt::MatchStartsWith);\n    uiDynamic->contestIDEdit->setCompleter(contestCompleter);\n\n    /**************/\n    /* CONNECTs   */\n    /**************/\n    connect(&callbookManager, &CallbookManager::callsignResult,\n            this, &NewContactWidget::setCallbookFields);\n\n    connect(&callbookManager, &CallbookManager::loginFailed, this, [this](const QString &callbookString)\n    {\n        QMessageBox::critical(this, tr(\"QLog Error\"), callbookString + \" \" + tr(\"Callbook login failed\"));\n        setCallbookStatusEnabled(callbookManager.isActive());\n    });\n\n    connect(contactTimer, &QTimer::timeout, this, &NewContactWidget::updateTimeOff);\n\n    connect(MembershipQE::instance(), &MembershipQE::clubStatusResult, this, &NewContactWidget::setMembershipList);\n\n    /******************************/\n    /* CONNECTs  DYNAMIC WIDGETS  */\n    /******************************/\n    connect(uiDynamic->gridEdit, &QLineEdit::textChanged, this, &NewContactWidget::gridChanged);\n    connect(uiDynamic->potaEdit, &QLineEdit::editingFinished, this, &NewContactWidget::potaEditFinished);\n    connect(uiDynamic->potaEdit, &QLineEdit::textChanged, this, &NewContactWidget::potaChanged);\n    connect(uiDynamic->sotaEdit, &QLineEdit::editingFinished, this, &NewContactWidget::sotaEditFinished);\n    connect(uiDynamic->sotaEdit, &QLineEdit::textChanged, this, &NewContactWidget::sotaChanged);\n    connect(uiDynamic->wwffEdit, &QLineEdit::editingFinished, this, &NewContactWidget::wwffEditFinished);\n    connect(uiDynamic->wwffEdit, &QLineEdit::textChanged, this, &NewContactWidget::wwffChanged);\n    connect(uiDynamic->satNameEdit, &QLineEdit::textChanged, this, &NewContactWidget::satNameChanged);\n    connect(uiDynamic->sigEdit, &NewContactEditLine::focusIn, this, &NewContactWidget::refreshSIGCompleter);\n    connect(uiDynamic->contestIDEdit, &NewContactEditLine::focusIn, this, &NewContactWidget::refreshContestCompleter);\n    connect(uiDynamic->contestIDEdit, &NewContactEditLine::textEdited, this, &NewContactWidget::setContestFieldsState);\n\n    ui->rstSentEdit->installEventFilter(this);\n    ui->rstRcvdEdit->installEventFilter(this);\n\n    /********************/\n    /* Local SHORTCUTs  */\n    /********************/\n    new QShortcut(QKeySequence(Qt::Key_Escape), this, SLOT(resetContact()), nullptr, Qt::ApplicationShortcut);\n    new QShortcut(QKeySequence(Qt::Key_F10), this, SLOT(saveContact()), nullptr, Qt::ApplicationShortcut);\n    new QShortcut(QKeySequence(Qt::Key_F9), this, SLOT(stopContactTimer()), nullptr, Qt::ApplicationShortcut);\n    new QShortcut(QKeySequence(Qt::Key_F8), this, SLOT(startContactTimer()), nullptr, Qt::ApplicationShortcut);\n\n    /****************************/\n    /* Set Visiable for widgets */\n    /****************************/\n    ui->freqTXEdit->setVisible(false);\n    ui->bandTXLabel->setVisible(false);\n    ui->freqRXLabel->setVisible(false);\n    ui->freqTXLabel->setVisible(false);\n\n    /***********************/\n    /* Read Widget Setting */\n    /***********************/\n    readWidgetSettings();\n\n    /*************************/\n    /* Reload Global Setting */\n    /*************************/\n    readGlobalSettings();\n\n    /**********************/\n    /* Clear Contact Form */\n    /**********************/\n    resetContact();\n\n    /************************/\n    /* Connect Field Change */\n    /* signals to determine */\n    /* whether form changed */\n    /************************/\n    connectFieldChanged();\n\n    // SQL query returns two QSOs. The first one is the last QSO with Base Callsign\n    // and the second one is the last QSO for the Callsign from a portable QTH.\n    isPrevQSOExactMatchQuery = prevQSOExactMatchQuery.prepare(QLatin1String(\"SELECT \"\n                                                                            \"    callsign, \"\n                                                                            \"    name_intl, \"\n                                                                            \"    qth_intl, \"\n                                                                            \"    gridsquare, \"\n                                                                            \"    notes_intl, \"\n                                                                            \"    email, \"\n                                                                            \"    web , \"\n                                                                            \"    darc_dok \"\n                                                                            \"FROM contacts \"\n                                                                            \"WHERE callsign = :exactCallsign \"\n                                                                            \"      AND gridsquare LIKE :grid \"\n                                                                            \"ORDER BY start_time DESC \"\n                                                                            \"LIMIT 1 \"));\n\n    if ( !isPrevQSOExactMatchQuery)\n        qWarning() << \"Cannot prepare prevQSOExactMatchQuery statement\";\n\n    isPrevQSOBaseCallMatchQuery = prevQSOBaseCallMatchQuery.prepare(QLatin1String(\"SELECT \"\n                                                                                  \"     callsign, \"\n                                                                                  \"     name_intl, \"\n                                                                                  \"     qth_intl, \"\n                                                                                  \"     gridsquare, \"\n                                                                                  \"     notes_intl, \"\n                                                                                  \"     email, \"\n                                                                                  \"     web , \"\n                                                                                  \"     darc_dok \"\n                                                                                  \"FROM contacts c \"\n                                                                                  \"  INNER JOIN contacts_autovalue a ON c.id = a.contactid \"\n                                                                                  \"WHERE a.base_callsign = :partialCallsign \"\n                                                                                  \"ORDER BY start_time DESC \"\n                                                                                  \"LIMIT 1\"));\n\n    if ( !isPrevQSOBaseCallMatchQuery)\n        qWarning() << \"Cannot prepare prevQSOBaseCallMatchQuery statement\";\n\n    setContestFieldsState();\n}\n\nvoid NewContactWidget::setComboBaseData(QComboBox *combo, const QString &data)\n{\n    FCT_IDENTIFICATION;\n\n    int index =  combo->findData(data);\n    if ( index != -1 )\n    {\n       combo->setCurrentIndex(index);\n    }\n}\n\nvoid NewContactWidget::queryMemberList()\n{\n    FCT_IDENTIFICATION;\n\n    if ( callsign.size() >= 3 )\n    {\n        MembershipQE::instance()->asyncQueryDetails(callsign, ui->bandRXLabel->text(), ui->modeEdit->currentText());\n    }\n}\n\nvoid NewContactWidget::readWidgetSettings()\n{\n    FCT_IDENTIFICATION;\n\n    realRigFreq = LogParam::getNewContactFreq();\n    ui->modeEdit->setCurrentText(LogParam::getNewContactMode());\n    ui->submodeEdit->setCurrentText(LogParam::getNewContactSubMode());\n    uiDynamic->powerEdit->setValue(LogParam::getNewContactPower());\n    ui->qsoTabs->setCurrentIndex(LogParam::getNewContactTabIndex());\n    setComboBaseData(ui->qslSentBox, LogParam::getNewContactQSLSent());\n    setComboBaseData(ui->lotwQslSentBox, LogParam::getNewContactLoTWQSLSent());\n    setComboBaseData(ui->eQSLSentBox, LogParam::getNewContactEQSLWQSLSent());\n    setComboBaseData(ui->qslSentViaBox, LogParam::getNewContactQSLVia());\n    ui->propagationModeEdit->setCurrentText(Data::instance()->propagationModeIDToText(LogParam::getNewContactPropMode()));\n    tabCollapseBtn->setChecked(LogParam::getNewContactTabsExpanded());\n    tabsExpandCollapse();\n}\n\nvoid NewContactWidget::writeWidgetSetting()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setNewContactFreq(realRigFreq);\n    LogParam::setNewContactMode(ui->modeEdit->currentText());\n    LogParam::setNewContactSubMode(ui->submodeEdit->currentText());\n    LogParam::setNewContactPower(uiDynamic->powerEdit->value());\n    LogParam::setNewContactTabIndex(ui->qsoTabs->currentIndex());\n    LogParam::setNewContactQSLSent(ui->qslSentBox->itemData(ui->qslSentBox->currentIndex()).toString());\n    LogParam::setNewContactLoTWQSLSent(ui->lotwQslSentBox->itemData(ui->lotwQslSentBox->currentIndex()).toString());\n    LogParam::setNewContactEQSLQSLSent(ui->eQSLSentBox->itemData(ui->eQSLSentBox->currentIndex()).toString());\n    LogParam::setNewContactQSLVia(ui->qslSentViaBox->itemData(ui->qslSentViaBox->currentIndex()).toString());\n    LogParam::setNewContactPropMode(Data::instance()->propagationModeTextToID(ui->propagationModeEdit->currentText()));\n    LogParam::setNewContactTabsExpanded(tabCollapseBtn->isChecked());\n}\n\n/* function read global setting, called when starting or when Setting is reloaded */\nvoid NewContactWidget::readGlobalSettings()\n{\n    FCT_IDENTIFICATION;\n\n    /*************************/\n    /* Refresh mode combobox */\n    /*************************/\n    modeController->reloadModel();\n\n    /********************/\n    /* Reload Callbooks */\n    /********************/\n    callbookManager.initCallbooks();\n    setCallbookStatusEnabled(callbookManager.isActive());\n\n    /***********************************/\n    /* Refresh all Profiles Comboboxes */\n    /***********************************/\n    refreshStationProfileCombo();\n    refreshRigProfileCombo();\n    refreshAntProfileCombo();\n\n    // recalculate all stats\n    setDxccInfo(ui->callsignEdit->text());\n\n    ui->freqRXEdit->loadBands();\n    ui->freqTXEdit->loadBands();\n\n    updatePartnerLocTime();\n    ui->dateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->timeOnEdit->setDisplayFormat(locale.formatTimeLongWithoutTZ());\n}\n\n/* function is called when an operator change Callsign Edit */\nvoid NewContactWidget::handleCallsignFromUser()\n{\n    FCT_IDENTIFICATION;\n\n    QString newCallsign = ui->callsignEdit->text().toUpper();\n\n    qCDebug(runtime) << \"newcallsign \" << newCallsign << \" old callsign \" << callsign;\n\n    // if operator presses a spacebar at the end of callsign then begins QSO and skips RST Fields\n    if ( newCallsign.endsWith(\" \"))\n    {\n        newCallsign.chop(1);\n        ui->callsignEdit->blockSignals(true);\n        ui->callsignEdit->setText(newCallsign);\n        ui->callsignEdit->blockSignals(false);\n        if ( newCallsign.isEmpty() )\n            return;\n\n        QLineEdit *nextLineEdit = qobject_cast<QLineEdit*>(ui->rstRcvdEdit->nextInFocusChain());\n        if ( nextLineEdit )\n        {\n            nextLineEdit->setFocus();\n            startContactTimer();\n        }\n    }\n\n    if ( newCallsign == callsign )\n        return;\n\n    callsign = newCallsign;\n\n    clearCallbookQueryFields();\n    clearMemberQueryFields();\n\n    if ( callsign.isEmpty() )\n    {\n        setDxccInfo(DxccEntity());\n        updateTime();\n        stopContactTimer();\n    }\n    else\n    {\n        checkDupe();\n        useNearestSpotInfo(callsign);\n        setDxccInfo(callsign);\n        if ( callsign.length() >= 3 )\n        {\n            queryPota();\n            useFieldsFromPrevQSO(callsign);\n        }\n    }\n    emit callsignChanged(callsign);\n}\n\n/* function is called when Callsign Edit is finished - example pressed enter */\n/* if callsign is entered then QLog call callbook query */\nvoid NewContactWidget::finalizeCallsignEdit()\n{\n    FCT_IDENTIFICATION;\n\n    if ( callsign.size() >= 3 )\n    {\n        queryMemberList();\n        if ( !callbookSearchPaused )\n                callbookManager.queryCallsign(callsign);\n    }\n}\n\nvoid NewContactWidget::setDxccInfo(const DxccEntity &curr)\n{\n    FCT_IDENTIFICATION;\n\n    dxccEntity = curr;\n\n    if ( dxccEntity.dxcc )\n    {\n        ui->dxccInfo->setText(QCoreApplication::translate(\"DBStrings\", dxccEntity.country.toUtf8().constData()));\n        uiDynamic->cqzEdit->setText(QString::number(dxccEntity.cqz));\n        uiDynamic->ituEdit->setText(QString::number(dxccEntity.ituz));\n        updateCoordinates(dxccEntity.latlon[0], dxccEntity.latlon[1], COORD_DXCC);\n        ui->dxccTableWidget->setDxcc(dxccEntity.dxcc, BandPlan::freq2Band(ui->freqTXEdit->value()));\n        ui->stationTableWidget->setDxCallsign(ui->callsignEdit->text(), BandPlan::freq2Band(ui->freqTXEdit->value()));\n        uiDynamic->contEdit->setCurrentText(dxccEntity.cont);\n        ui->flagView->setPixmap((!dxccEntity.flag.isEmpty() ) ? QPixmap(QString(\":/flags/64/%1.png\").arg(dxccEntity.flag))\n                                                              : QPixmap() );\n        updateDxccStatus();\n        updateCountyCompleter(dxccEntity.dxcc);\n    }\n    else\n    {\n        ui->dxccInfo->setText(\" \");\n        uiDynamic->cqzEdit->clear();\n        uiDynamic->ituEdit->clear();\n        clearCoordinates();\n        ui->dxccTableWidget->clear();\n        ui->stationTableWidget->clear();\n        uiDynamic->contEdit->setCurrentText(\"\");\n        ui->flagView->setPixmap(QPixmap());\n        ui->dxccStatus->clear();\n\n        emit newTarget(qQNaN(), qQNaN());\n        updateCountyCompleter(0);\n    }\n}\n\nvoid NewContactWidget::setDxccInfo(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    DxccEntity entity;\n    if ( isManualEnterMode )\n    {\n        const QDateTime &qsoDt = QDateTime(ui->dateEdit->date(), ui->timeOnEdit->time(), QTimeZone::utc());\n        entity = Data::instance()->lookupDxccClublog(callsign, qsoDt);\n    }\n    else\n        entity = Data::instance()->lookupDxcc(callsign.toUpper());\n\n    setDxccInfo(entity);\n}\n\nvoid NewContactWidget::updateCountyCompleter(int dxcc)\n{\n    FCT_IDENTIFICATION;\n\n    uiDynamic->countyEdit->setCompleter(nullptr);\n    delete countyCompleter;\n    countyCompleter = ( dxcc != 0 ) ? Data::createCountyCompleter(dxcc, this) : nullptr;\n    uiDynamic->countyEdit->setCompleter(countyCompleter);\n}\n\nvoid NewContactWidget::useFieldsFromPrevQSO(const QString &callsign, const QString &grid)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    if ( !isPrevQSOExactMatchQuery || !isPrevQSOBaseCallMatchQuery)\n        return;\n\n    const Callsign enteredCallsign(callsign);\n\n    if ( !enteredCallsign.isValid() )\n    {\n        emit filterCallsign(QString());\n        return;\n    }\n\n    const QString &baseCallsign = enteredCallsign.getBase();\n    // search the base_callsign\n    prevQSOExactMatchQuery.bindValue(\":exactCallsign\", baseCallsign);\n    prevQSOExactMatchQuery.bindValue(\":grid\", grid + \"%\");\n\n    if ( !prevQSOExactMatchQuery.exec() )\n    {\n        qWarning() << \"Cannot execute statement\" << prevQSOExactMatchQuery.lastError();\n        emit filterCallsign(QString());\n        return;\n    }\n\n    if ( prevQSOExactMatchQuery.next() )\n    {\n        // callsign match the base callsign - full info available\n        if ( enteredCallsign.getHostPrefix().isEmpty()\n             && enteredCallsign.getSuffix().isEmpty() )\n        {\n            // entered callsign is base callsign - no portable QTH. Get all fields from\n            // previous QSO\n            uiDynamic->qthEdit->setText(prevQSOExactMatchQuery.value(\"qth_intl\").toString());\n            uiDynamic->gridEdit->setText(prevQSOExactMatchQuery.value(\"gridsquare\").toString());\n            uiDynamic->dokEdit->setText(prevQSOExactMatchQuery.value(\"darc_dok\").toString());\n        }\n        uiDynamic->nameEdit->setText(prevQSOExactMatchQuery.value(\"name_intl\").toString());\n        ui->noteEdit->insertPlainText(prevQSOExactMatchQuery.value(\"notes_intl\").toString());\n        uiDynamic->emailEdit->setText(prevQSOExactMatchQuery.value(\"email\").toString());\n        uiDynamic->urlEdit->setText(prevQSOExactMatchQuery.value(\"web\").toString());\n\n        emit filterCallsign(baseCallsign);\n    }\n    else\n    {\n        //exact match not found\n        prevQSOBaseCallMatchQuery.bindValue(\":partialCallsign\", baseCallsign);\n\n        if ( !prevQSOBaseCallMatchQuery.exec() )\n        {\n            qWarning() << \"Cannot execute statement2\" << prevQSOBaseCallMatchQuery.lastError();\n            emit filterCallsign(QString());\n            return;\n        }\n\n        if ( prevQSOBaseCallMatchQuery.next() )\n        {\n            // partial informaion available\n            uiDynamic->nameEdit->setText(prevQSOBaseCallMatchQuery.value(\"name_intl\").toString());\n            ui->noteEdit->insertPlainText(prevQSOBaseCallMatchQuery.value(\"notes_intl\").toString());\n            uiDynamic->emailEdit->setText(prevQSOBaseCallMatchQuery.value(\"email\").toString());\n            uiDynamic->urlEdit->setText(prevQSOBaseCallMatchQuery.value(\"web\").toString());\n\n            emit filterCallsign(baseCallsign);\n        }\n        else\n        {\n            //callsign not found\n            qCDebug(runtime) << \"Callsign not match in the Logbook\";\n            emit filterCallsign(QString());\n        }\n    }\n}\n\n/* function handles a response from Callbook classes */\nvoid NewContactWidget::setCallbookFields(const CallbookResponseData& data)\n{\n    FCT_IDENTIFICATION;\n\n    if ( data.call != callsign )\n        return;\n\n    /* not filled or not fully filled then update it */\n    const QString fnamelname = QString(\"%1 %2\").arg(data.fname, data.lname);\n\n    if ( uiDynamic->nameEdit->text().isEmpty()\n         || data.name_fmt.contains(uiDynamic->nameEdit->text())\n         || fnamelname.contains(uiDynamic->nameEdit->text())\n         || data.nick.contains(uiDynamic->nameEdit->text()) )\n    {\n        QString name = data.name_fmt;\n\n        if ( name.isEmpty() )\n            name = ( data.fname.isEmpty() && data.lname.isEmpty() ) ? data.nick\n                                                                    : fnamelname;\n        uiDynamic->nameEdit->setText(name);\n    }\n\n    if ( uiDynamic->gridEdit->text().isEmpty()\n         || data.gridsquare.contains(uiDynamic->gridEdit->text()) )\n        uiDynamic->gridEdit->setText(data.gridsquare);\n\n    if ( uiDynamic->qthEdit->text().isEmpty()\n         || data.qth.contains(uiDynamic->qthEdit->text()))\n        uiDynamic->qthEdit->setText(data.qth);\n\n    if ( uiDynamic->dokEdit->text().isEmpty() )    uiDynamic->dokEdit->setText(data.dok);\n    if ( uiDynamic->iotaEdit->text().isEmpty() )   uiDynamic->iotaEdit->setText(data.iota);\n    if ( uiDynamic->emailEdit->text().isEmpty() )  uiDynamic->emailEdit->setText(data.email);\n    if ( uiDynamic->countyEdit->text().isEmpty() ) uiDynamic->countyEdit->setText(data.county);\n    if ( ui->qslViaEdit->text().isEmpty() )        ui->qslViaEdit->setText(data.qsl_via);\n    if ( uiDynamic->urlEdit->text().isEmpty() )    uiDynamic->urlEdit->setText(data.url);\n    if ( uiDynamic->stateEdit->text().isEmpty() )  uiDynamic->stateEdit->setText(data.us_state);\n    if ( data.eqsl == \"Y\" )                        ui->eqslLabel->setText(\"eQSL\");\n    if ( data.lotw == \"Y\" )                        ui->lotwLabel->setText(\"LoTW\");\n    if ( !data.dxcc.isEmpty() )\n    {\n        int callbookDXCC = data.dxcc.toInt();\n\n        if ( callbookDXCC != 0 && callbookDXCC != dxccEntity.dxcc )\n        {\n            qCDebug(runtime) << \"Received different DXCC Info\" << data.dxcc\n                             << dxccEntity.dxcc;\n            setDxccInfo(Data::instance()->lookupDxccID(callbookDXCC));\n        }\n    }\n\n    // always replace cqz/itu\n    if ( !data.ituz.isEmpty() ) uiDynamic->ituEdit->setText(data.ituz);\n    if ( !data.cqz.isEmpty() )  uiDynamic->cqzEdit->setText(data.cqz);\n\n    emit callboolImageUrl(data.image_url);\n    lastCallbookQueryData = data;\n}\n\nvoid NewContactWidget::setMembershipList(const QString &in_callsign,\n                                         QMap<QString, ClubStatusQuery::ClubInfo> data)\n{\n    FCT_IDENTIFICATION;\n\n    if ( in_callsign != callsign )\n        return;\n\n    QString memberText;\n    QMapIterator<QString, ClubStatusQuery::ClubInfo> clubs(data);\n    QPalette palette;\n\n    while ( clubs.hasNext() )\n    {\n        clubs.next();\n        const QColor &color = Data::statusToColor(static_cast<DxccStatus>(clubs.value().status), false, palette.color(QPalette::Text));\n        //\"<font color='red'>Hello</font> <font color='green'>World</font>\"\n        memberText.append(QString(\"<font color='%1'>%2</font>&nbsp;&nbsp;&nbsp;\").arg(Data::colorToHTMLColor(color), clubs.key()));\n\n        if ( clubs.key().toUpper() == \"SKCC\"\n             && uiDynamic->skccEdit->text().isEmpty()\n             && !clubs.value().membershipID.isEmpty() )\n        {\n            uiDynamic->skccEdit->setText(clubs.value().membershipID);\n        }\n\n        // Currently UKSMG does not provide Member# - I leave it - maybe UKSMG will start providing MemberIDs.\n        if ( clubs.key().toUpper() == \"UKSMG\"\n            && uiDynamic->uksmgEdit->text().isEmpty()\n            && !clubs.value().membershipID.isEmpty() )\n        {\n            uiDynamic->uksmgEdit->setText(clubs.value().membershipID);\n        }\n\n        if ( clubs.key().toUpper() == \"FISTS\"\n            && uiDynamic->fistsEdit->text().isEmpty()\n            && !clubs.value().membershipID.isEmpty() )\n        {\n            uiDynamic->fistsEdit->setText(clubs.value().membershipID);\n        }\n    }\n    ui->memberListLabel->setText(memberText);\n}\n\n\n/* function just refresh Station Profile Combo */\nvoid NewContactWidget::refreshStationProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationProfileCombo->blockSignals(true);\n\n    QStringList currProfiles = StationProfilesManager::instance()->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->stationProfileCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( StationProfilesManager::instance()->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->stationProfileCombo->setCurrentText(currProfiles.first());\n        stationProfileComboChanged(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->stationProfileCombo->setCurrentText(StationProfilesManager::instance()->getCurProfile1().profileName);\n    }\n\n    setDxccInfo(ui->callsignEdit->text());\n    updateDxccStatus();\n    ui->stationProfileCombo->blockSignals(false);\n}\n\n/* function just refresh Rig Profile Combo */\nvoid NewContactWidget::refreshRigProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigEdit->blockSignals(true);\n\n    QStringList currProfiles = RigProfilesManager::instance()->profileNameList();\n    QString currentText = ui->rigEdit->currentText();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->rigEdit->model());\n\n    model->setStringList(currProfiles);\n    if ( RigProfilesManager::instance()->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        currentText = currProfiles.first();\n        ui->rigEdit->setCurrentText(currentText);\n        rigProfileComboChanged(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        currentText = (isManualEnterMode ) ? currentText\n                                           : RigProfilesManager::instance()->getCurProfile1().profileName;\n        ui->rigEdit->setCurrentText(currentText);\n        //do not call rigProfileComboChanged because it did not change\n    }\n\n    ui->rigEdit->blockSignals(false);\n\n    if ( isManualEnterMode )\n        return;\n\n    __changeFrequency(VFO1, realRigFreq,\n                      realRigFreq + RigProfilesManager::instance()->getProfile(currentText).ritOffset,\n                      realRigFreq + RigProfilesManager::instance()->getProfile(currentText).xitOffset);\n\n    uiDynamic->powerEdit->setValue(RigProfilesManager::instance()->getProfile(currentText).defaultPWR);\n}\n\nvoid NewContactWidget::refreshAntProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->antennaEdit->blockSignals(true);\n\n    QStringList currProfiles = AntProfilesManager::instance()->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->antennaEdit->model());\n\n    model->setStringList(currProfiles);\n\n    if ( AntProfilesManager::instance()->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->antennaEdit->setCurrentText(currProfiles.first());\n        antProfileComboChanged(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->antennaEdit->setCurrentText(AntProfilesManager::instance()->getCurProfile1().profileName);\n    }\n\n    ui->antennaEdit->blockSignals(false);\n}\n\nvoid NewContactWidget::__modeChanged()\n{\n    FCT_IDENTIFICATION;\n\n    modeController->applyCurrentMode();\n\n    // Adjuste Combos Size\n    int maxWidth = qMax(ui->modeEdit->sizeHint().width(),\n                        ui->submodeEdit->sizeHint().width());\n    ui->modeEdit->setFixedWidth(maxWidth);\n    ui->submodeEdit->setFixedWidth(maxWidth);\n    queryMemberList();\n    refreshCallsignsColors();\n}\n\n/* Mode is changed from GUI */\nvoid NewContactWidget::changeMode()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !modeController )\n        return;\n\n    __modeChanged();\n\n    // if manual mode is not enabled then change the mode\n    if ( !isManualEnterMode )\n    {\n        rig->setMode(ui->modeEdit->currentText(), ui->submodeEdit->currentText());\n        emit userModeChanged(VFO1, QString(),\n                             ui->modeEdit->currentText(), ui->submodeEdit->currentText(),\n                             bandwidthFilter);\n    }\n}\n\n/* mode is changed from RIG */\n/* Receveived from RIG */\nvoid NewContactWidget::changeModefromRig(VFOID, const QString &, const QString &mode,\n                                         const QString &subMode, qint32 width)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode << width;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    bandwidthFilter = width;\n\n    changeModeWithoutSignals(mode, subMode);\n}\n\nvoid NewContactWidget::subModeChanged()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    rig->setMode(ui->modeEdit->currentText(), ui->submodeEdit->currentText());\n    emit userModeChanged(VFO1, QString(),\n                         ui->modeEdit->currentText(), ui->submodeEdit->currentText(),\n                         bandwidthFilter);\n}\n\nvoid NewContactWidget::updateTXBand(double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<freq;\n\n    bandTX = BandPlan::freq2Band(freq);\n\n    if (bandTX.name.isEmpty())\n    {\n        ui->bandTXLabel->setText(\"OOB!\");\n    }\n    else if (bandTX.name != ui->bandTXLabel->text())\n    {\n        ui->bandTXLabel->setText(bandTX.name);\n    }\n\n    updateSatMode();\n    updateDxccStatus();\n    queryPota(); // It is not possible to call the potaquert everywhere when the freq changes,\n                 // call it when band is changed\n    ui->dxccTableWidget->setDxcc(dxccEntity.dxcc, BandPlan::freq2Band(ui->freqTXEdit->value()));\n    ui->stationTableWidget->setDxCallsign(ui->callsignEdit->text(), BandPlan::freq2Band(ui->freqTXEdit->value()));\n}\n\nvoid NewContactWidget::updateRXBand(double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<freq;\n\n    bandRX = BandPlan::freq2Band(freq);\n\n    if (bandRX.name.isEmpty())\n    {\n        setBandLabel(\"OOB!\");\n    }\n    else if (bandRX.name != ui->bandRXLabel->text())\n    {\n        setBandLabel(bandRX.name);\n    }\n    updateSatMode();\n    setSTXSeq();\n    refreshCallsignsColors();\n}\n\nvoid NewContactWidget::gridChanged()\n{\n    FCT_IDENTIFICATION;\n\n    Gridsquare newGrid(uiDynamic->gridEdit->text());\n\n    if (!newGrid.isValid())\n    {\n        coordPrec = COORD_NONE;\n        setDxccInfo(ui->callsignEdit->text());\n        return;\n    }\n\n    updateCoordinates(newGrid.getLatitude(), newGrid.getLongitude(), COORD_GRID);\n}\n\nvoid NewContactWidget::clearCallbookQueryFields()\n{\n    FCT_IDENTIFICATION;\n\n    uiDynamic->nameEdit->clear();\n    uiDynamic->gridEdit->clear();\n    uiDynamic->qthEdit->clear();\n    uiDynamic->dokEdit->clear();\n    uiDynamic->iotaEdit->clear();\n    uiDynamic->emailEdit->clear();\n    uiDynamic->countyEdit->clear();\n    uiDynamic->urlEdit->clear();\n    uiDynamic->stateEdit->clear();\n\n    ui->qslViaEdit->clear();\n    ui->eqslLabel->setText(QString());\n    ui->lotwLabel->setText(QString());\n    emit callboolImageUrl(\"\");\n}\n\nvoid NewContactWidget::clearMemberQueryFields()\n{\n    FCT_IDENTIFICATION;\n\n    ui->memberListLabel->clear();\n}\n\nvoid NewContactWidget::resetContact()\n{\n    FCT_IDENTIFICATION;\n\n    ui->callsignEdit->clear();\n    uiDynamic->commentEdit->clear();\n    ui->noteEdit->clear();\n    ui->dxccInfo->setText(\" \");\n    ui->distanceInfo->clear();\n    dxDistance = qQNaN();\n    ui->bearingInfo->clear();\n    ui->partnerLocTimeInfo->clear();\n    uiDynamic->cqzEdit->clear();\n    uiDynamic->ituEdit->clear();\n    uiDynamic->contEdit->setCurrentText(\"\");\n    uiDynamic->sotaEdit->clear();\n    uiDynamic->potaEdit->clear();\n    uiDynamic->sigEdit->clear();\n    uiDynamic->sigInfoEdit->clear();\n    uiDynamic->vuccEdit->clear();\n    uiDynamic->wwffEdit->clear();\n    ui->dxccTableWidget->clear();\n    ui->stationTableWidget->clear();\n    ui->dxccStatus->clear();\n    ui->flagView->setPixmap(QPixmap());\n    uiDynamic->ageEdit->clear();\n    uiDynamic->srxStringEdit->clear();\n    uiDynamic->srxEdit->clear();\n    uiDynamic->rxPWREdit->clear();\n    uiDynamic->rigEdit->clear();\n    uiDynamic->qslMsgSEdit->clear();\n    uiDynamic->skccEdit->clear();\n    uiDynamic->uksmgEdit->clear();\n    uiDynamic->fistsEdit->clear();\n    uiDynamic->fistsCCEdit->clear();\n    ui->dupeLabel->setVisible(false);\n    clearCallbookQueryFields();\n    clearMemberQueryFields();\n\n    ui->callsignEdit->setPalette(QPalette());\n    ui->callsignEdit->setFocus();\n\n    partnerTimeZone = QTimeZone();\n\n    updateTime();\n    stopContactTimer();\n\n    setDefaultReport();\n\n    callsign = QString();\n    dxccEntity = DxccEntity();\n    coordPrec = COORD_NONE;\n    QSOFreq = 0.0;\n    QSOTxFreq = 0.0;\n    prevQSOTxFreq = 0.0;\n\n    emit filterCallsign(QString());\n    emit newTarget(qQNaN(), qQNaN());\n    emit contactReset();\n}\n\nvoid NewContactWidget::addAddlFields(QSqlRecord &record, const StationProfile &profile)\n{\n    FCT_IDENTIFICATION;\n\n    if ( record.value(\"pfx\").toString().isEmpty() )\n    {\n        const QString &pfxRef = Callsign(record.value(\"callsign\").toString()).getWPXPrefix();\n\n        if ( !pfxRef.isEmpty() )\n        {\n            record.setValue(\"pfx\", pfxRef);\n        }\n    }\n\n    if ( record.value(\"qsl_sent\").toString().isEmpty() )\n    {\n        QVariant sentState = ui->qslSentBox->itemData(ui->qslSentBox->currentIndex());\n        record.setValue(\"qsl_sent\", sentState);\n        if ( sentState == QVariant(\"Y\") )\n        {\n            record.setValue(\"qsl_sdate\", QDate::currentDate());\n        }\n    }\n\n    if ( record.value(\"lotw_qsl_sent\").toString().isEmpty() )\n    {\n        QVariant sentState = ui->lotwQslSentBox->itemData(ui->lotwQslSentBox->currentIndex());\n        record.setValue(\"lotw_qsl_sent\", sentState);\n        if ( sentState == QVariant(\"Y\") )\n        {\n            record.setValue(\"lotw_qslsdate\", QDate::currentDate());\n        }\n    }\n\n    if ( record.value(\"eqsl_qsl_sent\").toString().isEmpty() )\n    {\n        QVariant sentState = ui->eQSLSentBox->itemData(ui->eQSLSentBox->currentIndex());\n        record.setValue(\"eqsl_qsl_sent\", sentState);\n        if ( sentState == QVariant(\"Y\") )\n        {\n            record.setValue(\"eqsl_qslsdate\", QDate::currentDate());\n        }\n    }\n\n    record.setValue(\"qsl_rcvd\", \"N\");\n    record.setValue(\"lotw_qsl_rcvd\", \"N\");\n    record.setValue(\"eqsl_qsl_rcvd\", \"N\");\n    record.setValue(\"dcl_qsl_rcvd\", \"N\");\n    record.setValue(\"dcl_qsl_sent\", \"N\");\n\n    /* isNull is not necessary to use because NULL Text fields are empty */\n    if ( record.value(\"my_gridsquare\").toString().isEmpty()\n         && !profile.locator.isEmpty())\n    {\n        record.setValue(\"my_gridsquare\", profile.locator.toUpper());\n    }\n\n    if ( ! record.value(\"gridsquare\").toString().isEmpty()\n         && ! record.value(\"my_gridsquare\").toString().isEmpty() )\n    {\n        Gridsquare myGrid(record.value(\"my_gridsquare\").toString());\n        double distance;\n        if ( myGrid.distanceTo(Gridsquare(record.value(\"gridsquare\").toString()), distance) )\n        {\n            record.setValue(\"distance\", distance);\n        }\n    }\n\n    if ( Rotator::instance()->isRotConnected() )\n    {\n        record.setValue(\"ant_az\", Rotator::instance()->getAzimuth());\n        record.setValue(\"ant_el\", Rotator::instance()->getElevation());\n    }\n\n    if ( prop_cond )\n    {\n        if ( record.value(\"sfi\").toString().isEmpty()\n             && prop_cond->isFluxValid() )\n        {\n            record.setValue(\"sfi\", prop_cond->getFlux());\n        }\n\n        if ( record.value(\"k_index\").toString().isEmpty()\n             && prop_cond->isKIndexValid() )\n        {\n            record.setValue(\"k_index\", prop_cond->getKIndex());\n        }\n\n        if ( record.value(\"a_index\").toString().isEmpty()\n             && prop_cond->isAIndexValid() )\n        {\n            record.setValue(\"a_index\", prop_cond->getAIndex());\n        }\n    }\n\n    if ( (record.value(\"tx_pwr\").toString().isEmpty() || record.value(\"tx_pwr\") == 0.0 )\n         && uiDynamic->powerEdit->value() != 0.0)\n    {\n        record.setValue(\"tx_pwr\", uiDynamic->powerEdit->value());\n    }\n\n    if ( record.value(\"band\").toString().isEmpty()\n         && ! record.value(\"freq\").toString().isEmpty() )\n    {\n        record.setValue(\"band\", BandPlan::freq2Band(record.value(\"freq\").toDouble()).name);\n    }\n\n    if ( record.value(\"prop_mode\").toString().isEmpty()\n         && !ui->propagationModeEdit->currentText().isEmpty())\n    {\n        record.setValue(\"prop_mode\", Data::instance()->propagationModeTextToID(ui->propagationModeEdit->currentText()));\n    }\n\n    if ( record.value(\"prop_mode\").toString() == \"SAT\" )\n    {\n        // we only allow SAT_MODE information to be taken from the GUI\n        // if the Log record TX Band/Freq matches the GUI's Band/Freq. Unfortunately, RX Freq will not be used,\n        // because it might be missing from the log record.\n        if ( record.value(\"sat_mode\").toString().isEmpty()\n             && !uiDynamic->satModeEdit->currentText().isEmpty()\n             && record.value(\"band\").toString() == ui->bandTXLabel->text())\n        {\n            record.setValue(\"sat_mode\", Data::instance()->satModeTextToID(uiDynamic->satModeEdit->currentText()));\n        }\n\n        if ( record.value(\"sat_name\").toString().isEmpty()\n             && !uiDynamic->satNameEdit->text().isEmpty() )\n        {\n            record.setValue(\"sat_name\", Data::removeAccents(uiDynamic->satNameEdit->text().toUpper()));\n        }\n    }\n\n    if ( record.value(\"my_rig_intl\").toString().isEmpty()\n         && !ui->rigEdit->currentText().isEmpty() )\n    {\n       record.setValue(\"my_rig_intl\", ui->rigEdit->currentText());\n    }\n\n    if ( record.value(\"my_antenna_intl\").toString().isEmpty()\n         && !ui->antennaEdit->currentText().isEmpty())\n    {\n       record.setValue(\"my_antenna_intl\", ui->antennaEdit->currentText());\n    }\n\n    if ( record.value(\"my_city_intl\").toString().isEmpty()\n         && !profile.qthName.isEmpty())\n    {\n       record.setValue(\"my_city_intl\", profile.qthName);\n    }\n\n    if ( record.value(\"station_callsign\").toString().isEmpty()\n         && !profile.callsign.isEmpty() )\n    {\n       record.setValue(\"station_callsign\", profile.callsign.toUpper());\n    }\n\n    if ( record.value(\"my_dxcc\").toString().isEmpty()\n         && profile.dxcc != 0 )\n    {\n        record.setValue(\"my_dxcc\", profile.dxcc);\n        record.setValue(\"my_country_intl\", profile.country);\n    }\n\n    if ( record.value(\"my_cnty\").toString().isEmpty()\n        && !profile.county.isEmpty() )\n    {\n        record.setValue(\"my_cnty\", profile.county);\n    }\n\n    if ( record.value(\"operator\").toString().isEmpty()\n        && !profile.operatorCallsign.isEmpty() )\n    {\n        record.setValue(\"operator\", profile.operatorCallsign.toUpper());\n    }\n    else if ( record.value(\"operator\").toString().isEmpty()\n               && !profile.callsign.isEmpty() )\n    {\n        record.setValue(\"operator\", profile.callsign.toUpper());\n    }\n\n    if ( record.value(\"my_itu_zone\").toString().isEmpty()\n         && profile.ituz != 0 )\n    {\n        record.setValue(\"my_itu_zone\", profile.ituz);\n    }\n\n    if ( record.value(\"my_cq_zone\").toString().isEmpty()\n         && profile.cqz != 0 )\n    {\n        record.setValue(\"my_cq_zone\", profile.cqz);\n    }\n\n    if ( record.value(\"my_darc_dok\").toString().isEmpty()\n        && !profile.darcDOK.isEmpty() )\n    {\n        record.setValue(\"my_darc_dok\", profile.darcDOK);\n    }\n\n    if ( record.value(\"my_name_intl\").toString().isEmpty()\n         && !profile.operatorName.isEmpty() )\n    {\n       record.setValue(\"my_name_intl\", profile.operatorName);\n    }\n\n    if ( record.value(\"my_iota\").toString().isEmpty()\n         && !profile.iota.isEmpty())\n    {\n       record.setValue(\"my_iota\", Data::removeAccents(profile.iota.toUpper()));\n    }\n\n    if ( record.value(\"my_sota_ref\").toString().isEmpty()\n         && !profile.sota.isEmpty())\n    {\n       record.setValue(\"my_sota_ref\", Data::removeAccents(profile.sota.toUpper()));\n    }\n\n    if ( ! record.value(\"my_sota_ref\").toString().isEmpty() )\n    {\n        SOTAEntity sotaInfo = Data::instance()->lookupSOTA(record.value(\"my_sota_ref\").toString());\n        if ( sotaInfo.summitCode.toUpper() == record.value(\"my_sota_ref\").toString().toUpper()\n             && !sotaInfo.summitName.isEmpty() )\n        {\n            record.setValue(\"my_altitude\", sotaInfo.altm);\n        }\n    }\n\n    if ( record.value(\"my_pota_ref\").toString().isEmpty()\n         && !profile.pota.isEmpty())\n    {\n       record.setValue(\"my_pota_ref\", Data::removeAccents(profile.pota.toUpper()));\n    }\n\n    if ( record.value(\"my_sig_intl\").toString().isEmpty()\n         && !profile.sig.isEmpty())\n    {\n       record.setValue(\"my_sig_intl\", profile.sig);\n    }\n\n    if ( record.value(\"my_sig_info_intl\").toString().isEmpty()\n         && !profile.sigInfo.isEmpty())\n    {\n       record.setValue(\"my_sig_info_intl\", profile.sigInfo);\n    }\n\n    if ( record.value(\"my_vucc_grids\").toString().isEmpty()\n         && !profile.vucc.isEmpty())\n    {\n       record.setValue(\"my_vucc_grids\", profile.vucc.toUpper());\n    }\n\n    if ( record.value(\"my_wwff_ref\").toString().isEmpty()\n         && !profile.wwff.isEmpty())\n    {\n       record.setValue(\"my_wwff_ref\", profile.wwff.toUpper());\n    }\n\n    // all contest fields are used only in case when\n    // contestID field is visible - with this, the operator shows\n    // that he/she wants to run a contest\n    if ( uiDynamic->contestIDEdit->isVisible()\n         && !uiDynamic->contestIDEdit->text().isEmpty() )\n    {\n        uiDynamic->contestIDEdit->setText(Data::removeAccents(uiDynamic->contestIDEdit->text()));\n\n        if ( shouldStartContest() )\n            startContest(record.value(\"start_time\").toDateTime());\n\n        if ( record.value(\"contest_id\").toString().isEmpty() )\n        {\n            record.setValue(\"contest_id\", uiDynamic->contestIDEdit->text());\n        }\n\n        if ( record.value(\"srx_string\").toString().isEmpty()\n            && uiDynamic->srxStringEdit->isVisible() )\n        {\n            record.setValue(\"srx_string\",\n                            uiDynamic->srxStringEdit->styleSheet().contains(QLatin1String(\"uppercase\")) ? uiDynamic->srxStringEdit->text().toUpper()\n                                                                                                        :uiDynamic->srxStringEdit->text());\n        }\n\n        if ( record.value(\"stx_string\").toString().isEmpty()\n            && uiDynamic->stxStringEdit->isVisible() )\n        {\n            record.setValue(\"stx_string\", uiDynamic->stxStringEdit->text());\n        }\n\n        if ( record.value(\"srx\").toString().isEmpty()\n            && uiDynamic->srxEdit->isVisible() )\n        {\n            record.setValue(\"srx\", uiDynamic->srxEdit->text());\n        }\n\n        if ( record.value(\"stx\").toString().isEmpty()\n            && uiDynamic->stxEdit->isVisible() )\n        {\n            record.setValue(\"stx\", uiDynamic->stxEdit->text());\n            // the field always contains a number - validator is enable for it\n            // therefore it is possible to do this\n            setSTXSeq(uiDynamic->stxEdit->text().toInt() + 1);\n        }\n    }\n    else if ( (uiDynamic->srxStringEdit->isVisible() && !uiDynamic->srxStringEdit->text().isEmpty() )\n               || (uiDynamic->stxStringEdit->isVisible() && !uiDynamic->stxStringEdit->text().isEmpty() )\n               || uiDynamic->stxEdit->isVisible()\n               || (uiDynamic->srxEdit->isVisible() && !uiDynamic->srxEdit->text().isEmpty() ) )\n    {\n        QStringList fieldsTranslation\n        ({\n            LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_SRX_STRING),\n            LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_STX_STRING),\n            LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_SRX),\n            LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_STX),\n        });\n\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"The fields <b>%0</b> will not be saved because the <b>%1</b> is not filled.\")\n                                             .arg(fieldsTranslation.join(\", \"),\n                                                  LogbookModel::getFieldNameTranslation(LogbookModel::COLUMN_CONTEST_ID)));\n\n    }\n\n    if ( record.value(\"rx_pwr\").toString().isEmpty()\n         && uiDynamic->rxPWREdit->isVisible()\n         && !uiDynamic->rxPWREdit->text().isEmpty() )\n    {\n        record.setValue(\"rx_pwr\", uiDynamic->rxPWREdit->text());\n    }\n}\n\nbool NewContactWidget::eventFilter(QObject *object, QEvent *event)\n{\n    //FCT_IDENTIFICATION;\n\n    if ( event->type() == QEvent::FocusIn\n         && object == ui->rstSentEdit )\n    {\n\n        if ( ui->callsignEdit->text().isEmpty()\n             && ! ui->nearStationLabel->text().isEmpty() )\n        {\n            changeCallsignManually(ui->nearStationLabel->text());\n        }\n\n        if ( callsign.size() >= 3\n             && !contactTimer->isActive() )\n        {\n            startContactTimer();\n        }\n    }\n\n    // Event handle to handle Enter press event for the Custom UI row.\n    // The basic idea is:\n    //   - if enter is pressed on the Row A or Row B or RSTr(s) and QSO Timer is active then QSO is saved\n    //   - hadnler is registere automaticaly when fields are added to Row.\n    //   - But Callsign, POTA, SOTA, WWFF fields enter means \"search\" the value in callbook or xOTA directories\n    //     Therefore Enter event is blocked for these fields with one exception:\n    //       if Callbook is not active then Callsign enter causes \"save QSO\" event too.\n    //       The callsign exception was added to make it possible to quickly insert QSOs during pile-up.\n    //       Therefore there is no condition for an active QSO timer.\n    if ( event->type() == QEvent::KeyPress\n         && static_cast<QKeyEvent *>(event)\n         && ( static_cast<QKeyEvent *>(event)->key() == Qt::Key_Return\n              || static_cast<QKeyEvent *>(event)->key() == Qt::Key_Enter )\n         && ( ( object == ui->callsignEdit && (!callbookManager.isActive() || callbookSearchPaused) )\n              || ( object != ui->callsignEdit\n                   && object != uiDynamic->potaEdit\n                   && object != uiDynamic->sotaEdit\n                   && object != uiDynamic->wwffEdit\n                   && contactTimer->isActive() ) ) )\n    {\n        saveContact();\n    }\n\n    return false;\n}\n\nbool NewContactWidget::isQSOTimeStarted()\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = ( contactTimer ) ? contactTimer->isActive() : false;\n\n    qCDebug(runtime) << ret;\n    return ret;\n}\n\nvoid NewContactWidget::QSYContactWiping(double newFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newFreq;\n\n    qint32 QSYWipingWidth = bandwidthFilter;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    if ( QSYWipingWidth <= BANDWIDTH_UNKNOWN )\n    {\n        QSYWipingWidth = Rig::getNormalBandwidth(ui->modeEdit->currentText(),\n                                                ui->submodeEdit->currentText());\n        qCDebug(runtime) << \"Passband is not defined - derived value \" << QSYWipingWidth;\n    }\n\n    qCDebug(runtime) << \"Rig online: \" << rigOnline << \" \"\n                     << \"QSO Freq: \" << QSOFreq << \" \"\n                     << \"QSO TX Freq: \" << QSOTxFreq << \" \"\n                     << \"QSO prev TX Freq: \" << prevQSOTxFreq << \" \"\n                     << \"QSO Time: \" << isQSOTimeStarted() << \" \"\n                     << \"Mode/submode: \" << ui->modeEdit->currentText() << ui->submodeEdit->currentText()\n                     << \"RIG Filter width: \" << bandwidthFilter\n                     << \"QSYWipingWidth: \" << QSYWipingWidth << QSTRING_FREQ(Hz2MHz(QSYWipingWidth))\n                     << \"Diff RX: \" << qAbs(QSOFreq - newFreq)\n                     << \"Diff TX: \" << qAbs(QSOTxFreq - newFreq)\n                     << \"Diff prevTX: \" << qAbs(prevQSOTxFreq - newFreq)\n                     << \"Rig Profile QSO Wiping: \" << RigProfilesManager::instance()->getCurProfile1().QSYWiping;\n\n    double threshold = Hz2MHz(QSYWipingWidth) / 1.5; //1.5 is a magic constant - determined experimentally\n\n    // Wipe only if the new freq is far from ALL known frequencies (RX, TX, and previous TX).\n    // During VFO swap, VFO1/VFO2 updates arrive asynchronously in any order:\n    //   - VFO1 first: QSOTxFreq still holds the old TX freq -> matches new VFO1 → no wipe\n    //   - VFO2 first: QSOTxFreq is overwritten, but prevQSOTxFreq holds the old TX freq -> matches -> no wipe\n    if ( RigProfilesManager::instance()->getCurProfile1().QSYWiping\n         && rigOnline            // only if Rig is connected\n         && QSOFreq > 0.0        // it means that Form is \"dirty\" and contain freq when it got dirty\n         && !isQSOTimeStarted()  // operator is not in QSO\n         && QSYWipingWidth != BANDWIDTH_UNKNOWN\n         && qAbs(QSOFreq - newFreq) > threshold\n         && ( QSOTxFreq <= 0.0 || qAbs(QSOTxFreq - newFreq) > threshold )\n         && ( prevQSOTxFreq <= 0.0 || qAbs(prevQSOTxFreq - newFreq) > threshold ) )\n    {\n        resetContact();\n    }\n}\n\nvoid NewContactWidget::connectFieldChanged()\n{\n    FCT_IDENTIFICATION;\n\n    connect(ui->callsignEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->rstSentEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->rstRcvdEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->nameEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->qthEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->commentEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->noteEdit, &QTextEdit::textChanged,\n            this, &NewContactWidget::formFieldChanged);\n\n    connect(uiDynamic->contEdit, &QComboBox::currentTextChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->ituEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->cqzEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->stateEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->countyEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->ageEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->iotaEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->sotaEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->potaEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->sigEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->sigInfoEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->dokEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->vuccEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->wwffEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->qslSentBox, &QComboBox::currentTextChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->lotwQslSentBox, &QComboBox::currentTextChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->eQSLSentBox, &QComboBox::currentTextChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->qslSentViaBox, &QComboBox::currentTextChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(ui->qslViaEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->emailEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->urlEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->gridEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->contestIDEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->srxStringEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->stxStringEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->srxEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->rxPWREdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->rigEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->qslMsgSEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->skccEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->uksmgEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->fistsEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    connect(uiDynamic->fistsCCEdit, &QLineEdit::textChanged,\n            this, &NewContactWidget::formFieldChangedString);\n\n    /* no other fields are currently considered\n     * as an attempt to fill out the form */\n}\n\nvoid NewContactWidget::saveContact()\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getProfile(ui->stationProfileCombo->currentText());\n\n    if ( profile.callsign.isEmpty() )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"Your callsign is empty. Please, set your Station Profile\"));\n        return;\n    }\n\n    if ( callsign.isEmpty() )\n        return;\n\n    // if operator wants to save a QSO and QSO's Timer is not running,\n    // then it is needed to update the QSO start time before saving\n    if ( !isQSOTimeStarted() )\n        updateTime();\n\n    QDateTime start = QDateTime(ui->dateEdit->date(), ui->timeOnEdit->time(), QTimeZone::utc());\n    QDateTime end = ( isManualEnterMode ) ? start.addSecs(QTime(0,0).secsTo(ui->qsoDurationEdit->time()))\n                                          : timeOff;\n\n    QSqlTableModel model;\n    model.setTable(\"contacts\");\n    QSqlField idField = model.record().field(model.fieldIndex(\"id\"));\n    model.removeColumn(model.fieldIndex(\"id\"));\n\n    QSqlRecord record = model.record(0);\n\n    record.setValue(\"start_time\", start);\n    record.setValue(\"end_time\", end);\n    record.setValue(\"callsign\", callsign);\n\n    if ( ! ui->rstSentEdit->text().isEmpty() )\n    {\n        record.setValue(\"rst_sent\", ui->rstSentEdit->text());\n    }\n\n    if ( ! ui->rstRcvdEdit->text().isEmpty() )\n    {\n        record.setValue(\"rst_rcvd\", ui->rstRcvdEdit->text());\n    }\n\n    if ( ! uiDynamic->nameEdit->text().isEmpty() )\n    {\n        record.setValue(\"name_intl\", uiDynamic->nameEdit->text());\n    }\n\n    if ( ! uiDynamic->qthEdit->text().isEmpty() )\n    {\n        record.setValue(\"qth_intl\", uiDynamic->qthEdit->text());\n    }\n\n    if ( ! uiDynamic->gridEdit->text().isEmpty() )\n    {\n        record.setValue(\"gridsquare\", uiDynamic->gridEdit->text().toUpper());\n    }\n\n    record.setValue(\"freq\", ui->freqTXEdit->value());\n    record.setValue(\"band\", ui->bandTXLabel->text());\n\n    // Based on ADIF 3.1.x FREQ_RX is defined as \"in a split frequency QSO\"\n    // Also here https://groups.io/g/adifdev/message/228 is mentioned:\n    //    \"BAND_RX & FREQ_RX (Same than BAND and FREQ but for split/crossband/satellite QSOs)\"\n    if ( ui->freqRXEdit->value() != ui->freqTXEdit->value() )\n    {\n        record.setValue(\"freq_rx\", ui->freqRXEdit->value());\n        record.setValue(\"band_rx\", ui->bandRXLabel->text());\n    }\n\n    if ( ! ui->modeEdit->currentText().isEmpty() )\n    {\n        record.setValue(\"mode\", ui->modeEdit->currentText());\n    }\n\n    if ( ! ui->submodeEdit->currentText().isEmpty() )\n    {\n        record.setValue(\"submode\", ui->submodeEdit->currentText());\n    }\n\n    record.setValue(\"cqz\", uiDynamic->cqzEdit->text().toInt());\n    record.setValue(\"ituz\", uiDynamic->ituEdit->text().toInt());\n\n    if ( !dxccEntity.country.isEmpty() )\n    {\n        record.setValue(\"dxcc\", dxccEntity.dxcc);\n        record.setValue(\"country\", Data::removeAccents(dxccEntity.country));\n        record.setValue(\"country_intl\", dxccEntity.country);\n    }\n\n    if ( ! uiDynamic->contEdit->currentText().isEmpty() )\n    {\n        record.setValue(\"cont\", uiDynamic->contEdit->currentText());\n    }\n\n    if ( ! uiDynamic->countyEdit->text().isEmpty() )\n    {\n        record.setValue(\"cnty\", Data::removeAccents(uiDynamic->countyEdit->text()));\n    }\n\n    if ( ! uiDynamic->stateEdit->text().isEmpty() )\n    {\n        record.setValue(\"state\", Data::removeAccents(uiDynamic->stateEdit->text()));\n    }\n\n    if ( ! uiDynamic->iotaEdit->text().isEmpty() )\n    {\n        record.setValue(\"iota\", Data::removeAccents(uiDynamic->iotaEdit->text().toUpper()));\n    }\n\n    if ( ! uiDynamic->sigEdit->text().isEmpty() )\n    {\n        record.setValue(\"sig_intl\", uiDynamic->sigEdit->text());\n    }\n\n    if ( ! uiDynamic->sigInfoEdit->text().isEmpty() )\n    {\n        record.setValue(\"sig_info_intl\", uiDynamic->sigInfoEdit->text());\n    }\n\n    if ( ! ui->qslSentViaBox->currentText().isEmpty() )\n    {\n        record.setValue(\"qsl_sent_via\", Data::removeAccents(ui->qslSentViaBox->itemData(ui->qslSentViaBox->currentIndex()).toString()));\n    }\n\n    if ( coordPrec >= COORD_GRID && !qIsNaN(dxDistance))\n    {\n        record.setValue(\"distance\", dxDistance);\n    }\n\n    if ( !ui->AMLSInfo->text().isEmpty() )\n    {\n        record.setValue(\"altitude\", ui->AMLSInfo->text().split(\" \")[0]);\n    }\n\n    if ( !uiDynamic->sotaEdit->text().isEmpty() )\n    {\n        record.setValue(\"sota_ref\", Data::removeAccents(uiDynamic->sotaEdit->text().toUpper()));\n    }\n\n    if ( !uiDynamic->potaEdit->text().isEmpty() )\n    {\n        record.setValue(\"pota_ref\", Data::removeAccents(uiDynamic->potaEdit->text().toUpper()));\n    }\n\n    if ( !uiDynamic->dokEdit->text().isEmpty() )\n    {\n        record.setValue(\"darc_dok\", Data::removeAccents(uiDynamic->dokEdit->text().toUpper()));\n    }\n\n    if ( !uiDynamic->vuccEdit->text().isEmpty() )\n    {\n        record.setValue(\"vucc_grids\", uiDynamic->vuccEdit->text().toUpper());\n    }\n\n    if ( !uiDynamic->wwffEdit->text().isEmpty() )\n    {\n        record.setValue(\"wwff_ref\", uiDynamic->wwffEdit->text().toUpper());\n    }\n\n    if (!uiDynamic->commentEdit->text().isEmpty())\n    {\n        record.setValue(\"comment_intl\", uiDynamic->commentEdit->text());\n    }\n\n    if (!ui->noteEdit->toPlainText().isEmpty())\n    {\n        record.setValue(\"notes_intl\", ui->noteEdit->toPlainText());\n    }\n\n    if (!ui->qslViaEdit->text().isEmpty())\n    {\n        record.setValue(\"qsl_via\", Data::removeAccents(ui->qslViaEdit->text().toUpper()));\n    }\n\n    if (!uiDynamic->ageEdit->text().isEmpty()\n        && uiDynamic->ageEdit->text().toInt() > 0 )\n    {\n        record.setValue(\"age\", uiDynamic->ageEdit->text().toInt());\n    }\n\n    if (!uiDynamic->emailEdit->text().isEmpty()) {\n        record.setValue(\"email\", Data::removeAccents(uiDynamic->emailEdit->text()));\n    }\n\n    if (!uiDynamic->urlEdit->text().isEmpty()) {\n        record.setValue(\"web\", Data::removeAccents(uiDynamic->urlEdit->text()));\n    }\n\n    if ( ! uiDynamic->rigEdit->text().isEmpty() )\n    {\n        record.setValue(\"rig_intl\", uiDynamic->rigEdit->text());\n    }\n\n    if ( ! uiDynamic->qslMsgSEdit->text().isEmpty() )\n    {\n        record.setValue(\"qslmsg_intl\", uiDynamic->qslMsgSEdit->text());\n    }\n\n    if ( ! uiDynamic->skccEdit->text().isEmpty() )\n    {\n        record.setValue(\"skcc\", uiDynamic->skccEdit->text());\n    }\n\n    if ( ! uiDynamic->uksmgEdit->text().isEmpty() )\n    {\n        record.setValue(\"uksmg\", uiDynamic->uksmgEdit->text());\n    }\n\n    if ( ! uiDynamic->fistsEdit->text().isEmpty() )\n    {\n        record.setValue(\"fists\", uiDynamic->fistsEdit->text());\n    }\n\n    if ( ! uiDynamic->fistsCCEdit->text().isEmpty() )\n    {\n        record.setValue(\"fists_cc\", uiDynamic->fistsCCEdit->text());\n    }\n\n    AdiFormat::preprocessINTLFields<QSqlRecord>(record);\n\n    addAddlFields(record, profile);\n\n    AdiFormat::preprocessINTLFields<QSqlRecord>(record);\n\n    qCDebug(runtime) << record;\n\n    if ( !model.insertRecord(-1, record) )\n    {\n        qWarning() << \"Cannot insert a record to Contact Table - \" << model.lastError();\n        qCDebug(runtime) << record;\n        return;\n    }\n\n    if ( !model.submitAll() )\n    {\n        qWarning() << \"Cannot commit changes to Contact Table - \" << model.lastError();\n        return;\n    }\n\n    /* at this moment, there is no reliable way to get the last ID\n     * therefore running SQL with MAX(id) does a good job */\n    QSqlQuery tmpQuery;\n    if (tmpQuery.exec(\"SELECT MAX(id) FROM contacts\"))\n    {\n        tmpQuery.next();\n        record.insert(0,idField);\n        record.setValue(\"id\", tmpQuery.value(0));\n        qDebug(runtime)<<\"Last Inserted ID: \" << tmpQuery.value(0);\n    }\n\n    updateNearestSpotDupe();\n    setNearestSpotColor();\n    resetContact();\n    emit contactAdded(record);\n}\n\nvoid NewContactWidget::saveExternalContact(QSqlRecord record)\n{\n    FCT_IDENTIFICATION;\n\n    const QString &savedCallsign = record.value(\"callsign\").toString();\n\n    if ( savedCallsign.isEmpty() ) return;\n\n    // Workaround - Issue #722 Repeated log recording - check dupe before insert\n    // start_time, callsign, freq or band, mode\n    // This workaround is primarily due to JTDX. In general, with WSJTX, QLog receives\n    // two messages for a single QSO. One is in the QByteArray format and the other in ADIF.\n    // Both of these messages are received by QLog, and if they arrive within 0.5 seconds of each other,\n    // they are merged and sent as a single QSO. If this does not happen, unfortunately, two QSOs are sent.\n    // Under some mysterious circumstances, JTDX sometimes generates the second message after several seconds,\n    // sometimes even up to 3 minutes (see #722). This workaround is intended to prevent duplicate entries\n    // from being stored in the log.\n    //\n    // In the future, however, this should be handled by merging the records.\n\n    QSqlQuery checkQuery;\n    if ( !checkQuery.prepare(QLatin1String(\"SELECT id FROM contacts \"\n                                     \"WHERE strftime('%Y-%m-%d %H:%M:%S', start_time) = strftime('%Y-%m-%d %H:%M:%S', :starttime) \"\n                                     \"      AND callsign = :callsign \"\n                                     \"      AND (freq = :freq OR band = :band) \"\n                                     \"      AND mode = :mode \"\n                                     \"LIMIT 1\")) )\n    {\n        qWarning() << \"Cannot prepared select statement for the External Dupe Check\";\n        return;\n    }\n\n    checkQuery.bindValue(\":callsign\", savedCallsign.toUpper());\n    checkQuery.bindValue(\":freq\", record.value(\"freq\"));\n    checkQuery.bindValue(\":mode\", record.value(\"mode\"));\n    checkQuery.bindValue(\":band\", record.value(\"band\"));\n    checkQuery.bindValue(\":starttime\", record.value(\"start_time\"));\n\n    if (!checkQuery.exec())\n    {\n        qWarning() << \"Duplicate check failed:\" << checkQuery.lastError();\n        return;\n    }\n\n    if ( checkQuery.next() )\n    {\n        qWarning() << \"Contact with callsign\"\n                   << savedCallsign << record.value(\"freq\")\n                   << record.value(\"band\") << record.value(\"mode\")\n                   << record.value(\"start_time\")\n                   << \"already exists, skipping insert.\";\n        return;\n    }\n\n    // End of workaround #722\n\n    QSqlTableModel model;\n\n    model.setTable(\"contacts\");\n    QSqlField idField = model.record().field(model.fieldIndex(\"id\"));\n    model.removeColumn(model.fieldIndex(\"id\"));\n\n    // the Band value is mandatory for LoTW QSL matching algorithm\n    if ( record.value(\"band\").toString().isEmpty()\n         && !record.value(\"freq\").toString().isEmpty() )\n    {\n        double freq = record.value(\"freq\").toDouble();\n        record.setValue(\"band\", BandPlan::freq2Band(freq).name);\n    }\n\n    // if DXCC field is present then it must be used as DXCC Entity\n    int recordDXCCId = record.value(\"dxcc\").toInt(); // 0 = NAN or not present\n                                                     // otherwise = DXCC ID\n    const DxccEntity &dxcc = ( recordDXCCId ) ? Data::instance()->lookupDxccID(recordDXCCId)\n                                              : Data::instance()->lookupDxcc(savedCallsign);\n\n    if ( dxcc.dxcc != 0 )\n    {\n        // force overwrite\n        record.setValue(\"dxcc\", dxcc.dxcc);\n        record.setValue(\"country_intl\", dxcc.country);\n\n        if ( record.value(\"cqz\").toString().isEmpty() )\n            record.setValue(\"cqz\", dxcc.cqz);\n\n        if ( record.value(\"ituz\").toString().isEmpty() )\n            record.setValue(\"ituz\", dxcc.ituz);\n\n        if ( record.value(\"cont\").toString().isEmpty() )\n            record.setValue(\"cont\", dxcc.cont);\n    }\n\n    // add information from callbook if it is a known callsign\n    // based on the poll #420, QLog adds more information from callbook\n    if ( savedCallsign == ui->callsignEdit->text() )\n    {\n        stopContactTimer();\n        updateTime();\n        // information independent of QTH\n        if ( record.value(\"name_intl\").toString().isEmpty()\n             && record.value(\"name\").toString().isEmpty()\n             && !uiDynamic->nameEdit->text().isEmpty() )\n            record.setValue(\"name_intl\", uiDynamic->nameEdit->text());\n\n        if ( record.value(\"email\").toString().isEmpty()\n             && !uiDynamic->emailEdit->text().isEmpty() )\n            record.setValue(\"email\", uiDynamic->emailEdit->text());\n\n        if ( record.value(\"qsl_via\").toString().isEmpty()\n             && !ui->qslViaEdit->text().isEmpty() )\n            record.setValue(\"qsl_via\", ui->qslViaEdit->text());\n\n        if ( record.value(\"web\").toString().isEmpty()\n             && !uiDynamic->urlEdit->text().isEmpty() )\n            record.setValue(\"web\", uiDynamic->urlEdit->text());\n\n        if ( record.value(\"darc_dok\").toString().isEmpty()\n             && !uiDynamic->dokEdit->text().isEmpty() )\n            record.setValue(\"darc_dok\", uiDynamic->dokEdit->text());\n\n        // information depending on QTH (Grid)\n        const QString &savedGrid = record.value(\"gridsquare\").toString();\n        if ( savedGrid.startsWith(uiDynamic->gridEdit->text(), Qt::CaseSensitivity::CaseInsensitive)\n             || uiDynamic->gridEdit->text().startsWith(savedGrid, Qt::CaseSensitivity::CaseInsensitive ) )\n        {\n            if ( uiDynamic->gridEdit->text().size() > savedGrid.size() )\n                record.setValue(\"gridsquare\", uiDynamic->gridEdit->text());\n\n            if ( record.value(\"qth_intl\").toString().isEmpty()\n                 && record.value(\"qth\").toString().isEmpty()\n                 && !uiDynamic->qthEdit->text().isEmpty() )\n                record.setValue(\"qth_intl\", uiDynamic->qthEdit->text());\n\n            if ( record.value(\"iota\").toString().isEmpty()\n                 && !uiDynamic->iotaEdit->text().isEmpty() )\n                record.setValue(\"iota\", uiDynamic->iotaEdit->text());\n\n            if ( record.value(\"cnty\").toString().isEmpty()\n                 && !uiDynamic->countyEdit->text().isEmpty() )\n                record.setValue(\"cnty\", uiDynamic->countyEdit->text());\n\n            if ( record.value(\"state\").toString().isEmpty()\n                 && !uiDynamic->stateEdit->text().isEmpty() )\n                record.setValue(\"state\", uiDynamic->stateEdit->text());\n\n            if ( record.value(\"pota_ref\").toString().isEmpty()\n                 && !uiDynamic->potaEdit->text().isEmpty())\n                record.setValue(\"pota_ref\", uiDynamic->potaEdit->text());\n\n            if ( record.value(\"sota_ref\").toString().isEmpty()\n                && !uiDynamic->sotaEdit->text().isEmpty())\n                record.setValue(\"sota_ref\", uiDynamic->sotaEdit->text());\n\n            if ( record.value(\"sig_intl\").toString().isEmpty()\n                && !uiDynamic->sigEdit->text().isEmpty())\n                record.setValue(\"sig_intl\", uiDynamic->sigEdit->text());\n\n            if ( record.value(\"sig_info_intl\").toString().isEmpty()\n                && !uiDynamic->sigInfoEdit->text().isEmpty())\n                record.setValue(\"sig_info_intl\", uiDynamic->sigInfoEdit->text());\n\n            if ( record.value(\"wwff_ref\").toString().isEmpty()\n                && !uiDynamic->wwffEdit->text().isEmpty())\n                record.setValue(\"wwff_ref\", uiDynamic->wwffEdit->text());\n\n            // fix ITUz and CQz from callbook, if necessary\n            if ( record.value(\"ituz\").toString() != uiDynamic->ituEdit->text() )\n                record.setValue(\"ituz\", uiDynamic->ituEdit->text());\n\n            if ( record.value(\"cqz\").toString() != uiDynamic->cqzEdit->text() )\n                record.setValue(\"cqz\", uiDynamic->cqzEdit->text());\n        }\n    }\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    AdiFormat::preprocessINTLFields<QSqlRecord>(record);\n\n    addAddlFields(record, profile);\n\n    AdiFormat::preprocessINTLFields<QSqlRecord>(record);\n\n    qCDebug(runtime) << record;\n\n    if ( !model.insertRecord(-1, record) )\n    {\n        qWarning() << \"Cannot insert a record to Contact Table - \" << model.lastError();\n        qCDebug(runtime) << record;\n        return;\n    }\n\n    if ( !model.submitAll() )\n    {\n        qWarning() << \"Cannot commit changes to Contact Table - \" << model.lastError();\n        return;\n    }\n\n\n    /* at this moment, there is no reliable way to get the last ID\n     * therefore running SQL with MAX(id) does a good job */\n    QSqlQuery tmpQuery;\n    if (tmpQuery.exec(\"SELECT MAX(id) FROM contacts\"))\n    {\n        tmpQuery.next();\n        record.insert(0,idField);\n        record.setValue(\"id\", tmpQuery.value(0));\n        qDebug(runtime)<<\"Last Inserted ID: \" << tmpQuery.value(0);\n    }\n\n    updateNearestSpotDupe();\n    setNearestSpotColor();\n\n    emit contactAdded(record);\n}\n\nvoid NewContactWidget::startContactTimer()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    updateTime();\n\n    if ( !isQSOTimeStarted() )\n        contactTimer->start(500);\n}\n\nvoid NewContactWidget::stopContactTimer()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    if ( isQSOTimeStarted() )\n        contactTimer->stop();\n\n    updateTimeOff();\n}\n\nvoid NewContactWidget::markContact()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !ui->callsignEdit->text().isEmpty() )\n    {\n        DxSpot spot;\n\n        spot.dateTime = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n        spot.freq = ui->freqRXEdit->value();\n        spot.band = BandPlan::freq2Band(spot.freq).name;\n        spot.callsign = ui->callsignEdit->text().toUpper();\n        emit markQSO(spot);\n    }\n}\n\nvoid NewContactWidget::updateTime()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    timeOff = QDateTime::currentDateTimeUtc();\n    ui->dateEdit->setDate(timeOff.date());\n    ui->timeOnEdit->setTime(timeOff.time());\n    ui->qsoDurationEdit->setTime(QTime(0,0,0));\n}\n\nvoid NewContactWidget::updateTimeOff()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    static bool shouldHighlighted = true;\n\n    timeOff = QDateTime::currentDateTimeUtc();\n    qint64 seconds = ui->timeOnEdit->dateTime().secsTo(timeOff);\n    QTime t = QTime(0,0).addSecs(seconds % 86400);\n    ui->qsoDurationEdit->setTime(t);\n\n    //QColor(76, 200, 80)\n    ui->qsoDurationEdit->setStyleSheet( ( shouldHighlighted && isQSOTimeStarted() ) ? \"background-color: #4CC850 ;\"\n                                                                                    : \"\");\n\n    shouldHighlighted = ( isQSOTimeStarted() ) ? !shouldHighlighted\n                                               : false;\n\n    updatePartnerLocTime();\n}\n\nvoid NewContactWidget::updateCoordinates(double lat, double lon, CoordPrecision prec)\n{\n    FCT_IDENTIFICATION;\n\n    if (prec < coordPrec) return;\n\n    Gridsquare myGrid(StationProfilesManager::instance()->getProfile(ui->stationProfileCombo->currentText()).locator);\n    double distance;\n    double bearing;\n\n    if ( myGrid.distanceTo(lat, lon, distance)\n         && myGrid.bearingTo(lat, lon, bearing) )\n    {\n        dxDistance = distance;\n        QString unit;\n        double showDistance = Gridsquare::distance2localeUnitDistance(dxDistance, unit, locale);\n        double LPBearing = bearing - 180;\n\n        if ( LPBearing < 0 )\n            LPBearing += 360;\n\n        ui->distanceInfo->setText(QString::number(showDistance, '.', 1) + QString(\" %1\").arg(unit));\n        ui->bearingInfo->setText(QString(\"%1° (%2: %3°)\").arg(QString::number(bearing, '.', 1),\n                                                              tr(\"LP\"),\n                                                              QString::number(LPBearing, '.', 1)));\n\n        QString partnerTimeZoneString = Data::instance()->getIANATimeZone(lat, lon);\n\n        if ( !partnerTimeZoneString.isEmpty() )\n        {\n            partnerTimeZone = QTimeZone(partnerTimeZoneString.toUtf8());\n        }\n        else\n        {\n            partnerTimeZone = QTimeZone();\n        }\n\n        coordPrec = prec;\n\n        updatePartnerLocTime();\n\n        emit newTarget(lat, lon);\n    }\n}\n\nvoid NewContactWidget::clearCoordinates()\n{\n    FCT_IDENTIFICATION;\n\n    ui->distanceInfo->clear();\n    dxDistance = qQNaN();\n    ui->bearingInfo->clear();\n    partnerTimeZone = QTimeZone();\n    ui->partnerLocTimeInfo->clear();\n}\n\nvoid NewContactWidget::updateDxccStatus()\n{\n    FCT_IDENTIFICATION;\n\n    setNearestSpotColor();\n\n\n    if ( callsign.isEmpty() )\n    {\n        ui->dxccStatus->clear();\n        ui->callsignEdit->setPalette(QPalette());\n        return;\n    }\n\n    DxccStatus status = Data::instance()->dxccStatus(dxccEntity.dxcc, ui->bandRXLabel->text(), ui->modeEdit->currentText());\n\n    switch (status)\n    {\n    case DxccStatus::NewEntity:\n        ui->dxccStatus->setText(tr(\"New Entity!\"));\n        break;\n    case DxccStatus::NewBand:\n        ui->dxccStatus->setText(tr(\"New Band!\"));\n        break;\n    case DxccStatus::NewMode:\n        ui->dxccStatus->setText(tr(\"New Mode!\"));\n        break;\n    case DxccStatus::NewBandMode:\n        ui->dxccStatus->setText(tr(\"New Band & Mode!\"));\n        break;\n    case DxccStatus::NewSlot:\n        ui->dxccStatus->setText(tr(\"New Slot!\"));\n        break;\n    case DxccStatus::Worked:\n        ui->dxccStatus->setText(tr(\"Worked\"));\n        break;\n    case DxccStatus::Confirmed:\n        ui->dxccStatus->setText(tr(\"Confirmed\"));\n        break;\n    default:\n        ui->dxccStatus->clear();\n    }\n\n    QPalette palette;\n    palette.setColor(QPalette::Text, Data::statusToColor(status,\n                                                         ui->dupeLabel->isVisible(),\n                                                         palette.color(QPalette::Text)));\n    ui->callsignEdit->setPalette(palette);\n\n}\n\nvoid NewContactWidget::updatePartnerLocTime()\n{\n    FCT_IDENTIFICATION;\n\n    if ( partnerTimeZone.isValid() )\n    {\n        ui->partnerLocTimeInfo->setText(locale.toString(QDateTime::currentDateTime().toTimeZone(partnerTimeZone), locale.formatTimeLong())\n                                        + \" (\" + getGreeting() +\")\");\n    }\n}\n\n/* the function is called when a newcontact frequency spinbox is changed */\nvoid NewContactWidget::frequencyTXChanged()\n{\n    FCT_IDENTIFICATION;\n\n    double xitFreq = ui->freqTXEdit->value();\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore freq change\";\n        updateTXBand(xitFreq);\n        /* Do not change RX */\n        return;\n    }\n\n    if ( rigSplitEnabled )\n    {\n        // In split mode, TX frequency change goes to VFO2\n        updateTXBand(xitFreq);\n        qCDebug(runtime) << \"split TX freq: \" << xitFreq;\n        rig->setFrequency(VFO2, MHz(xitFreq));\n        return;\n    }\n\n    realRigFreq = xitFreq - RigProfilesManager::instance()->getCurProfile1().xitOffset;\n    double ritFreq = (isManualEnterMode) ? ui->freqRXEdit->value()\n                                     : realRigFreq + RigProfilesManager::instance()->getCurProfile1().ritOffset;\n\n    __changeFrequency(VFO1, realRigFreq, ritFreq, xitFreq);\n\n    // TODO: qlog should call queryMemberList but for saving time we will omit it. and callsign is usually\n    // cleared\n    // queryMemberList();\n\n    qCDebug(runtime) << \"rig real freq: \" << realRigFreq;\n    rig->setFrequency(MHz(realRigFreq));  // set rig frequency\n    emit userFrequencyChanged(VFO1, realRigFreq, ritFreq, xitFreq);\n}\n\n/* the function is called when a newcontact RX frequecy spinbox is changed */\nvoid NewContactWidget::frequencyRXChanged()\n{\n    FCT_IDENTIFICATION;\n\n    double ritFreq = ui->freqRXEdit->value();\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore freq change\";\n        updateRXBand(ritFreq);\n\n        /* Change also TX freq\n           on the oposite site, TX change does not change RX */\n        ui->freqTXEdit->setValue(ritFreq);\n        return;\n    }\n\n    realRigFreq = ritFreq - RigProfilesManager::instance()->getCurProfile1().ritOffset;\n    double xitFreq = realRigFreq + RigProfilesManager::instance()->getCurProfile1().xitOffset;\n\n    __changeFrequency(VFO1, realRigFreq, ritFreq, xitFreq);\n\n    qCDebug(runtime) << \"rig real freq: \" << realRigFreq;\n    rig->setFrequency(MHz(realRigFreq));  // set rig frequency\n    emit userFrequencyChanged(VFO1, realRigFreq, ritFreq, xitFreq);\n}\n\n/* the function is called when rig freq is changed */\n/* Received from RIG */\nvoid NewContactWidget::changeFrequency(VFOID vfoid, double vfoFreq, double ritFreq, double xitFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << vfoFreq << ritFreq << xitFreq;\n\n    if ( vfoid == VFO2 )\n    {\n        // TX VFO frequency update (split mode)\n        // Keep previous TX freq — during VFO swap, VFO1/VFO2 updates\n        // arrive asynchronously; prevQSOTxFreq prevents false QSY Wipe\n        prevQSOTxFreq = QSOTxFreq;\n        QSOTxFreq = vfoFreq;\n\n        if ( isManualEnterMode )\n            return;\n\n        ui->freqTXEdit->blockSignals(true);\n        ui->freqTXEdit->setValue(vfoFreq);\n        updateTXBand(vfoFreq);\n        ui->freqTXEdit->blockSignals(false);\n        return;\n    }\n\n    // VFO1 — RX frequency\n    realFreqForManualExit = vfoFreq;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n    __changeFrequency(vfoid, vfoFreq, ritFreq, xitFreq);\n}\n\nvoid NewContactWidget::changeSplit(VFOID, bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    rigSplitEnabled = enabled;\n\n    if ( !enabled )\n    {\n        // Split turned off — sync TX freq back to VFO1 + XIT\n        double xitFreq = realRigFreq + RigProfilesManager::instance()->getCurProfile1().xitOffset;\n        ui->freqTXEdit->blockSignals(true);\n        ui->freqTXEdit->setValue(xitFreq);\n        updateTXBand(xitFreq);\n        ui->freqTXEdit->blockSignals(false);\n    }\n\n    ui->freqTXEdit->setEnabled(!enabled);\n\n    showRXTXFreqs(enabled\n                  || RigProfilesManager::instance()->getCurProfile1().ritOffset != 0.0\n                  || RigProfilesManager::instance()->getCurProfile1().xitOffset != 0.0\n                  || isManualEnterMode);\n}\n\nvoid NewContactWidget::changeModeWithoutSignals(const QString &mode, const QString &subMode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << mode << subMode;\n\n    if ( ui->modeEdit->currentText() == mode)\n    {\n        qCDebug(runtime) << \"Mode did not change, changing submode\";\n\n        ui->submodeEdit->blockSignals(true);\n        ui->submodeEdit->setCurrentText(subMode);\n        ui->submodeEdit->blockSignals(false);\n        return;\n    }\n\n    qCDebug(runtime) << \"Mode changed - updating submode list\";\n\n    ui->modeEdit->blockSignals(true);\n    ui->submodeEdit->blockSignals(true);\n    ui->modeEdit->setCurrentText(mode);\n    __modeChanged();\n    ui->submodeEdit->setCurrentText(subMode);\n    ui->submodeEdit->blockSignals(false);\n    ui->modeEdit->blockSignals(false);\n}\n\nvoid NewContactWidget::showRXTXFreqs(bool enable)\n{\n    FCT_IDENTIFICATION;\n\n    ui->freqTXEdit->setVisible(enable);\n    ui->bandTXLabel->setVisible(enable);\n    ui->freqRXLabel->setVisible(enable);\n    ui->freqTXLabel->setVisible(enable);\n}\n\n/* Generic function to change freq */\nvoid NewContactWidget::__changeFrequency(VFOID, double vfoFreq, double ritFreq, double xitFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoFreq << \" \" << ritFreq << \" \" << xitFreq;\n\n    QSYContactWiping(ritFreq);\n\n    realRigFreq = vfoFreq;\n\n    // When split is active, TX freq comes via VFO2 — don't overwrite it here\n    if ( !rigSplitEnabled )\n    {\n        ui->freqTXEdit->blockSignals(true);\n        ui->freqTXEdit->setValue(xitFreq);\n        updateTXBand(xitFreq);\n        ui->freqTXEdit->blockSignals(false);\n    }\n\n    ui->freqRXEdit->blockSignals(true);\n    ui->freqRXEdit->setValue(ritFreq);\n    updateRXBand(ritFreq);\n    ui->freqRXEdit->blockSignals(false);\n\n    showRXTXFreqs(( rigSplitEnabled\n                    || ritFreq != xitFreq\n                    || RigProfilesManager::instance()->getCurProfile1().ritOffset != 0.0\n                    || RigProfilesManager::instance()->getCurProfile1().xitOffset != 0.0\n                    || isManualEnterMode ));\n}\n\n/* Power is changed from RIG */\n/* Received from RIG */\nvoid NewContactWidget::changePower(VFOID, double power)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << power;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    uiDynamic->powerEdit->blockSignals(true);\n    uiDynamic->powerEdit->setValue(power);\n    uiDynamic->powerEdit->blockSignals(false);\n}\n\n/* connection slot */\n/* received from RIG */\nvoid NewContactWidget::rigConnected()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    RigProfile currProfile = RigProfilesManager::instance()->getCurProfile1();\n\n    /* allow modify PWR only in case when Rig is not connected or user\n     * does not want to get PWR from RIG */\n    if ( currProfile.getPWRInfo )\n    {\n        uiDynamic->powerEdit->setEnabled(false);\n        uiDynamic->powerEdit->setValue(0.0);\n    }\n    else\n    {\n        uiDynamic->powerEdit->setEnabled(true);\n        uiDynamic->powerEdit->setValue(currProfile.defaultPWR);\n    }\n\n    rigOnline = true;\n}\n\n/* disconnection slot */\n/* received from RIG */\nvoid NewContactWidget::rigDisconnected()\n{\n    FCT_IDENTIFICATION;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    changeSplit(VFO1, false);\n    uiDynamic->powerEdit->setEnabled(true);\n    uiDynamic->powerEdit->setValue(RigProfilesManager::instance()->getCurProfile1().defaultPWR);\n\n    rigOnline = false;\n}\n\nvoid NewContactWidget::setNearestSpot(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    nearestSpot = spot;\n    setNearestSpotColor();\n}\n\nvoid NewContactWidget::setNearestSpotColor()\n{\n    FCT_IDENTIFICATION;\n\n    if ( nearestSpot.callsign.isEmpty() )\n    {\n        ui->nearStationLabel->clear();\n        return;\n    }\n\n    QPalette palette;\n\n    const DxccEntity &spotEntity = Data::instance()->lookupDxcc(nearestSpot.callsign);\n    const DxccStatus &status = Data::instance()->dxccStatus(spotEntity.dxcc,\n                                                ui->bandRXLabel->text(),\n                                                ui->modeEdit->currentText());\n    palette.setColor(QPalette::WindowText,\n                     Data::statusToColor(status,\n                                         nearestSpot.dupeCount,\n                                         palette.color(QPalette::Text)));\n    ui->nearStationLabel->setPalette(palette);\n    ui->nearStationLabel->setText(nearestSpot.callsign);\n}\n\nvoid NewContactWidget::setManualMode(bool isEnabled)\n{\n    FCT_IDENTIFICATION;\n\n    bool isExitManualMode = ! isEnabled && isManualEnterMode;\n\n    if ( isEnabled && rigOnline )\n    {\n        rigDisconnected();\n    }\n\n    isManualEnterMode = isEnabled;\n\n    if ( isExitManualMode )\n    {\n        realRigFreq = realFreqForManualExit;\n        exitManualMode();\n        showRXTXFreqs((RigProfilesManager::instance()->getCurProfile1().ritOffset != 0.0\n                       || RigProfilesManager::instance()->getCurProfile1().xitOffset != 0.0));\n    }\n    else\n    {\n        realFreqForManualExit = realRigFreq;\n        resetContact();\n        showRXTXFreqs(true);\n        ui->dateEdit->setReadOnly(false);\n        ui->timeOnEdit->setReadOnly(false);\n        ui->qsoDurationEdit->setReadOnly(false);\n        ui->timeOnEdit->setFocusPolicy(Qt::StrongFocus);\n        ui->dateEdit->setFocusPolicy(Qt::StrongFocus);\n        ui->qsoDurationEdit->setFocusPolicy(Qt::StrongFocus);\n        ui->qsoDurationEdit->setCurrentSection(QDateTimeEdit::MinuteSection);\n        ui->thirdLineWidget->setTabOrder(ui->dateEdit, ui->timeOnEdit);\n        ui->thirdLineWidget->setTabOrder(ui->timeOnEdit, ui->qsoDurationEdit);\n    }\n\n    QString styleString = (isManualEnterMode) ? \"background-color: orange;\"\n                                              : \"\";\n\n    ui->modeLabel->setStyleSheet(styleString);\n    ui->frequencyLabel->setStyleSheet(styleString);\n    ui->dateLabel->setStyleSheet(styleString);\n    ui->timeOnLabel->setStyleSheet(styleString);\n    ui->qsoDurationLabel->setStyleSheet(styleString);\n    ui->stationProfileLabel->setStyleSheet(styleString);\n    ui->rigLabel->setStyleSheet(styleString);\n    ui->antennaLabel->setStyleSheet(styleString);\n    uiDynamic->powerLabel->setStyleSheet(styleString);\n}\n\nvoid NewContactWidget::exitManualMode()\n{\n    FCT_IDENTIFICATION;\n\n    // set date/time\n    // clear form\n    resetContact();\n\n    ui->dateEdit->setReadOnly(true);\n    ui->timeOnEdit->setReadOnly(true);\n    ui->qsoDurationEdit->setReadOnly(true);\n    ui->timeOnEdit->setFocusPolicy(Qt::ClickFocus);\n    ui->dateEdit->setFocusPolicy(Qt::ClickFocus);\n    ui->qsoDurationEdit->setFocusPolicy(Qt::ClickFocus);\n\n    //rig connected/disconnected\n    if ( rig->isRigConnected() )\n    {\n        rigConnected();\n        // set mode/submode\n        // set frequency\n        rig->sendState(); //resend rig state via signals\n    }\n    else\n    {\n        rigDisconnected();\n    }\n\n    // reset my profiles\n    refreshRigProfileCombo();\n    refreshAntProfileCombo();\n    refreshStationProfileCombo();\n}\n\nvoid NewContactWidget::setupCustomUi()\n{\n    FCT_IDENTIFICATION;\n\n    // Clear Custom Lines\n    const QList<QHBoxLayout *> &customUiRows = ui->customLayout->findChildren<QHBoxLayout *>();\n    for ( auto &rowLayout : customUiRows )\n    {        \n        qCDebug(runtime) << \"Removing objects from \" << rowLayout->objectName();\n\n        QLayoutItem *rowItem;\n        while ( (rowItem = rowLayout->takeAt(0)) != nullptr )\n        {\n            if ( rowItem->widget() != nullptr)\n            {\n                qCDebug(runtime) << \"Removing widget\" << rowItem->widget()->objectName();\n                rowItem->widget()->removeEventFilter(this); // only row fields has Special Event Filter  (enter handling)\n                rowItem->widget()->setHidden(true);\n            }\n        }\n    }\n\n    // Clear Detail Columns\n    QList<QFormLayout *> detailColumns;\n    detailColumns << ui->detailColA << ui->detailColB << ui->detailColC;\n\n    for ( QFormLayout * layout : static_cast<const QList<QFormLayout*>&>(detailColumns) )\n    {\n        qCDebug(runtime) << \"Removing\" << layout->rowCount() <<\"object(s) from\" << layout->objectName();\n\n        int rows = layout->rowCount();\n\n        for ( int i = 0 ; i < rows; i++ )\n        {\n            if ( layout == ui->detailColC && i < 4 )\n            {\n                qCDebug(runtime) << \"Skipping row\" << i << \"because static content\";\n                continue;\n            }\n\n            qCDebug(runtime) << \"Deleting row\" << i;\n            QFormLayout::TakeRowResult result = layout->takeRow((layout == ui->detailColC) ? 4 : 0);\n\n            if ( result.labelItem && result.fieldItem )\n            {\n                qCDebug(runtime) << \"Removing Widgets\" << result.labelItem->widget()->objectName()\n                                 << result.fieldItem->widget()->objectName();\n                result.labelItem->widget()->setHidden(true);\n                result.fieldItem->widget()->setHidden(true);\n            }\n            else\n            {\n                qCDebug(runtime) << \"Row is empty\";\n            }\n        }\n    }\n\n    MainLayoutProfile layoutProfile = MainLayoutProfilesManager::instance()->getCurProfile1();\n    QList<QWidget *> addedWidgets;\n\n    // Empty Profile means Classic Layout\n    if ( layoutProfile == MainLayoutProfile() )\n        layoutProfile = MainLayoutProfile::getClassicLayout();\n\n    addedWidgets << setupCustomUiRow(ui->customRowALayout, layoutProfile.rowA);\n    addedWidgets << setupCustomUiRow(ui->customRowBLayout, layoutProfile.rowB);\n\n    setupCustomUiRowsTabOrder(addedWidgets);\n\n    setupCustomDetailColumn(ui->detailColA, layoutProfile.detailColA);\n    setupCustomDetailColumn(ui->detailColB, layoutProfile.detailColB);\n    setupCustomDetailColumn(ui->detailColC, layoutProfile.detailColC);\n\n    tabCollapseBtn->setChecked(layoutProfile.tabsexpanded);\n\n    ui->qsoTabs->adjustSize();\n    update();\n}\n\nQList<QWidget *> NewContactWidget::setupCustomUiRow(QHBoxLayout *row, const QList<int>& widgetsList)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << row->objectName() << widgetsList;\n\n    QWidget *currCustomWidget = nullptr;\n    QList<QWidget *> ret;\n\n    for ( int widgetID : widgetsList )\n    {\n        currCustomWidget = uiDynamic->getRowWidget(widgetID);\n        if ( !currCustomWidget )\n        {\n            qWarning() << \"Missing fieldIndex2WidgetMapping for index\" << widgetID;\n            continue;\n        }\n\n        currCustomWidget->installEventFilter(this); // only row fields have a special event filter (enter handling)\n        qCDebug(runtime) << \"Adding widget\" << currCustomWidget->objectName();\n        row->addWidget(currCustomWidget);\n        ret << currCustomWidget;\n    }\n    return ret;\n}\n\nQList<QWidget *> NewContactWidget::setupCustomDetailColumn(QFormLayout *column, const QList<int> &widgetsList)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << column->objectName() << widgetsList;\n\n    QWidget *currCustomLabel = nullptr;\n    QWidget *currCustomEditor = nullptr;\n    QList<QWidget *> ret;\n\n    for ( int widgetID : widgetsList )\n    {\n        currCustomLabel = uiDynamic->getLabel(widgetID);\n        currCustomEditor = uiDynamic->getEditor(widgetID);\n\n        if ( !currCustomLabel || !currCustomEditor )\n        {\n            qWarning() << \"Missing fieldIndex2WidgetMapping for index\" << widgetID;\n            continue;\n        }\n\n        qCDebug(runtime) << \"Adding widget\" << currCustomEditor->objectName();\n        column->addRow(currCustomLabel, currCustomEditor);\n        ret << currCustomEditor;\n    }\n    return ret;\n}\n\nvoid NewContactWidget::setupCustomUiRowsTabOrder(const QList<QWidget *> &customWidgets)\n{\n    FCT_IDENTIFICATION;\n\n    QWidget *prevCustomWidget = nullptr;\n\n    for ( QWidget *currentWidget : customWidgets )\n    {\n        if ( prevCustomWidget )\n        {\n            QWidget *fromWidget = prevCustomWidget->findChild<NewContactEditLine*>();\n            if ( !fromWidget )\n                fromWidget = prevCustomWidget->findChild<QComboBox*>();\n\n            QWidget *toWidget = currentWidget->findChild<NewContactEditLine*>();\n            if ( !toWidget )\n                toWidget = currentWidget->findChild<QComboBox*>();\n\n            if ( fromWidget && toWidget )\n            {\n                //ui->customLayoutWidget->setTabOrder(fromWidget, toWidget);\n                setTabOrder(fromWidget, toWidget);\n            }\n        }\n        else\n        {\n            QWidget *toWidget = currentWidget->findChild<NewContactEditLine*>();\n            if ( !toWidget )\n                toWidget = currentWidget->findChild<QComboBox*>();\n\n            if ( toWidget )\n            {\n                setTabOrder(ui->rstRcvdEdit, toWidget);\n            }\n        }\n        prevCustomWidget = currentWidget;\n    }\n    setTabOrder(prevCustomWidget, ui->callsignEdit);\n}\n\nvoid NewContactWidget::setBandLabel(const QString &band)\n{\n    FCT_IDENTIFICATION;\n\n    ui->bandRXLabel->setText(band);\n}\n\nvoid NewContactWidget::updateSatMode()\n{\n    FCT_IDENTIFICATION;\n\n    if ( Data::instance()->propagationModeTextToID(ui->propagationModeEdit->currentText()) != \"SAT\")\n        return;\n\n    const QString satModeText = Data::instance()->satModeIDToText(( bandTX.satDesignator.isEmpty()\n                                                                    || bandRX.satDesignator.isEmpty() ) ? \"\"\n                                                                                                        : bandTX.satDesignator + bandRX.satDesignator);\n    // Only update if a valid SAT mode was resolved.\n    // When the rig reports only one VFO frequency, bandTX == bandRX which produces\n    // an invalid designator combination (e.g. \"SS\") and satModeIDToText returns \"\".\n    // In that case we preserve whatever SAT mode is currently set.\n    if ( !satModeText.isEmpty() )\n        uiDynamic->satModeEdit->setCurrentText(satModeText);\n}\n\nvoid NewContactWidget::tuneDx(const DxSpot &spot)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << spot.callsign<< spot.freq << spot.bandPlanMode;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    const double frequency = (spot.freq > 0.0) ? spot.freq : ui->freqRXEdit->value();\n\n#if 0 // DX SPLIT MODE\n    // Enable split BEFORE setting RX frequency — setSplit(true) forces\n    // VFO A as primary, so the subsequent RX freq goes to the correct VFO.\n    // All rig commands are queued, so order of calls here = execution order.\n    double txFreq = 0.0;\n\n\n    // DX SPLIT MODE : Removed due to the inability of rig drivers to consistently manage split mode.\n    // Example: the IC-7300 has an incorrectly implemented frequency setting when\n    // enabling split on VFO B in Hamlib. It appears to be fixed in version 4.7,\n    // but previous versions are broken. The same issue applies to Omnirig.\n    // Because this would require a significant number of exceptions in the code and\n    // would result in unreliable behavior, split configuration for DX is postponed\n    // indefinitely for now.\n\n    if ( spot.freqTX > 0.0 && rigOnline )\n    {\n        txFreq = spot.freqTX;\n\n        // For relative offsets (UP/DOWN), add random jitter within +- mode bandwidth\n        // so that all QLog users don't call on the exact same frequency.\n        // Absolute QSX frequencies (where freqTX differs significantly from freq)\n        // are left unchanged — the spotter gave a precise frequency.\n        if ( spot.freq > 0.0 && qAbs(spot.freqTX - spot.freq) < 0.1 )\n        {\n            qint32 bw = Rig::getNormalBandwidth(ui->modeEdit->currentText(),\n                                                ui->submodeEdit->currentText());\n            double jitterMHz = Hz2MHz(QRandomGenerator::global()->bounded(bw) - bw / 2);\n            txFreq += jitterMHz;\n        }\n\n        qCDebug(runtime) << \"Setting split from DX spot: TX\" << txFreq;\n        rig->setSplit(true);\n    }\n#endif\n\n    // Fix #453\n    // it is necessary to have the sequence of Set Freq and Set Mode.\n    // Otherwise  it may happen that the mode is not set correctly on the Rig\n    ui->freqRXEdit->setValue(frequency);\n\n    if ( frequency > 0.0 )\n    {\n#if 0 // SPLIT MODE\n        // Set TX frequency after RX frequency — split is already enabled above\n        if ( txFreq > 0.0 )\n            rig->setFrequency(VFO2, MHz(txFreq));\n#endif\n\n        QString subMode;\n        QString mode = BandPlan::bandPlanMode2ExpectedMode(spot.bandPlanMode,\n                                                           subMode);\n        if ( mode.isEmpty() )\n        {\n            qCDebug(runtime) << \"mode not found\" << spot.bandPlanMode;\n            mode = BandPlan::freq2ExpectedMode(frequency,\n                                               subMode);\n        }\n\n        if ( !mode.isEmpty() )\n        {\n            // in case of SSB, do not sent 2 mode changes to rig\n            // therefore change Mode without signals and then set the\n            // final mode\n            changeModeWithoutSignals(mode, subMode);\n            if (BandPlan::isFTxBandMode(spot.bandPlanMode)\n                || spot.bandPlanMode ==  BandPlan::BAND_MODE_DIGITAL )\n            {\n                // if rig is connected then FT8 mode is overwrotten by rig\n                // but if the rig is not connected then mode contains a correct\n                // mode\n                rig->setMode(\"SSB\", \"USB\", true);\n            }\n            else\n            {\n                rig->setMode(ui->modeEdit->currentText(), ui->submodeEdit->currentText());\n            }\n            emit userModeChanged(VFO1, QString(), mode, subMode, bandwidthFilter);\n        }\n    }\n\n    resetContact();\n    changeCallsignManually(spot.callsign, frequency);\n\n    auto fillRef = [&](QLineEdit* edit, const QString& value, std::function<void()> finishSlot = nullptr)\n    {\n        if ( edit->text().isEmpty() && !value.isEmpty() )\n        {\n            edit->setText(value);\n            if (finishSlot) finishSlot();\n        }\n    };\n\n    fillRef(uiDynamic->potaEdit, spot.potaRef, [this] { potaEditFinished(); });\n    fillRef(uiDynamic->sotaEdit, spot.sotaRef, [this] { sotaEditFinished(); });\n    fillRef(uiDynamic->wwffEdit, spot.wwffRef, [this] { wwffEditFinished(); });\n    fillRef(uiDynamic->iotaEdit, spot.iotaRef);\n}\n\nvoid NewContactWidget::fillCallsignGrid(const QString &callsign, const QString &grid)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << callsign<< grid;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    resetContact();\n    changeCallsignManually(callsign, ui->freqRXEdit->value());\n    uiDynamic->gridEdit->setText(grid);\n}\n\nvoid NewContactWidget::prepareWSJTXQSO(const QString &receivedCallsign,\n                                       const QString &grid,\n                                       const QString &id)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << receivedCallsign << grid << id;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    resetContact();\n    if ( receivedCallsign.isEmpty() )\n        return;\n\n    QSOFreq = ui->freqRXEdit->value(); // Important !!! - to prevent QSY Contact Reset when the frequency is set\n    // QSY Wipe disabling - It is possible to have a RIG connected and run WSJTX.\n    // To prevent the QSY Wipe when WSJTX's Fake Split Mode is enabled, QLog starts the QSO Timer.\n    if ( rigOnline )\n        startContactTimer();\n\n    callsign = receivedCallsign;\n    ui->callsignEdit->setText(receivedCallsign);\n\n    if ( !grid.isEmpty() )\n    {\n        uiDynamic->gridEdit->setText(grid);\n    }\n\n    checkDupe();\n    setDxccInfo(receivedCallsign);\n    queryPota();\n\n    // at the moment WSJTX sends several statuses about changing one callsign.\n    // In order to avoid multiple searches, we will search only when we have a grid - it was usually the last\n    // status message\n    // the current status message sequence is\n    // 1) prev Callsign empty grid\n    // 2) new Callsign empty grid\n    // 3) new Calllsign, new gris\n    // WRITELOG workaround: Similar to JTDX, check application ID\n    // If ID contains \"WRITELOG\", always trigger callbook lookup\n    if ( !grid.isEmpty() || WsjtxUDPReceiver::isWriteLogId(id) )\n    {\n        useFieldsFromPrevQSO(callsign, grid);\n        finalizeCallsignEdit();\n    }\n}\n\nvoid NewContactWidget::setDefaultReport()\n{\n    FCT_IDENTIFICATION;\n\n    QString innerRpt(defaultReport);\n\n    /* The > character indicates the position\n     * where the focus should be.\n     * If this is missing, it means the position of the first character.\n     */\n    int position = innerRpt.indexOf(\">\");\n\n    if ( position >= 0 )\n        innerRpt.remove(position, 1);\n    else\n        position = 0;\n\n    ui->rstRcvdEdit->setText(innerRpt);\n    ui->rstRcvdEdit->setSelectionOffset(position);\n\n    ui->rstSentEdit->setText(innerRpt);\n    ui->rstSentEdit->setSelectionOffset(position);\n}\n\nvoid NewContactWidget::webLookup()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !callsign.isEmpty() )\n        QDesktopServices::openUrl(GenericCallbook::getWebLookupURL(callsign));\n}\n\nvoid NewContactWidget::refreshSIGCompleter()\n{\n    FCT_IDENTIFICATION;\n\n    QStringListModel *model = static_cast<QStringListModel*>(sigCompleter->model());\n\n    if( !model )\n        model = new QStringListModel();\n\n    model->setStringList(Data::instance()->sigIDList());\n    sigCompleter->setModel(model);\n}\n\nvoid NewContactWidget::refreshContestCompleter()\n{\n    FCT_IDENTIFICATION;\n\n    QStringListModel *model = static_cast<QStringListModel*>(contestCompleter->model());\n\n    if( !model )\n        model = new QStringListModel();\n\n    model->setStringList(Data::instance()->contestList());\n    contestCompleter->setModel(model);\n}\n\nQString NewContactWidget::getCallsign() const\n{\n    FCT_IDENTIFICATION;\n\n    return ui->callsignEdit->text().toUpper();\n}\n\nQString NewContactWidget::getName() const\n{\n    FCT_IDENTIFICATION;\n\n    return uiDynamic->nameEdit->text();\n}\n\nQString NewContactWidget::getRST() const\n{\n    FCT_IDENTIFICATION;\n\n    return ui->rstSentEdit->text();\n}\n\nQString NewContactWidget::getQTH() const\n{\n    FCT_IDENTIFICATION;\n\n    return uiDynamic->qthEdit->text();\n}\n\n\nQString NewContactWidget::getGreeting() const\n{\n    FCT_IDENTIFICATION;\n\n    QString greeting(tr(\"GE\"));\n\n    if ( partnerTimeZone.isValid() )\n    {\n\n        QDateTime currPartnerTime = QDateTime::currentDateTime().toTimeZone(partnerTimeZone);\n\n        if ( currPartnerTime.time().hour() >= 5\n             && currPartnerTime.time().hour() < 12 )\n        {\n            greeting = tr(\"GM\");\n\n        }\n        else if ( currPartnerTime.time().hour() >=12\n                  && currPartnerTime.time().hour() < 18 )\n        {\n            greeting = tr(\"GA\");\n\n        }\n    }\n    return greeting;\n}\n\nQString NewContactWidget::getMyCallsign() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.callsign;\n}\n\nQString NewContactWidget::getMyName() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.operatorName;\n}\n\nQString NewContactWidget::getMyQTH() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.qthName;\n}\n\nQString NewContactWidget::getMyLocator() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.locator;\n}\n\nQString NewContactWidget::getMySIG() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.sig;\n}\n\nQString NewContactWidget::getMySIGInfo() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.sigInfo;\n}\n\nQString NewContactWidget::getMyIOTA() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.iota;\n}\n\nQString NewContactWidget::getMySOTA() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.sota;\n}\n\nQString NewContactWidget::getMyPOTA() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.pota;\n}\n\nQString NewContactWidget::getMyWWFT() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.wwff;\n}\n\nQString NewContactWidget::getMyVUCC() const\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    return profile.vucc;\n}\n\nQString NewContactWidget::getMyPWR() const\n{\n    FCT_IDENTIFICATION;\n\n    return QString::number(uiDynamic->powerEdit->value(), 'f', ( uiDynamic->powerEdit->value() != 0.0\n                                                          && uiDynamic->powerEdit->value() < 1 ) ? 1 : 0);\n}\n\nQString NewContactWidget::getBand() const\n{\n    FCT_IDENTIFICATION;\n\n    return ui->bandRXLabel->text();\n}\n\nQString NewContactWidget::getMode() const\n{\n    FCT_IDENTIFICATION;\n\n    return ui->modeEdit->currentText();\n}\n\nQString NewContactWidget::getSentNr() const\n{\n    FCT_IDENTIFICATION;\n\n    return (uiDynamic->stxEdit->isVisible()) ? uiDynamic->stxEdit->text()\n                                             : QString();\n}\n\nQString NewContactWidget::getSentExch() const\n{\n    FCT_IDENTIFICATION;\n\n    return (uiDynamic->stxStringEdit->isVisible()) ? uiDynamic->stxStringEdit->text()\n                                                   : QString();\n}\n\ndouble NewContactWidget::getQSOBearing() const\n{\n    FCT_IDENTIFICATION;\n\n\n    const QString &bearingString = ui->bearingInfo->text();\n    return ( !bearingString.isEmpty() ? bearingString.mid(0,bearingString.indexOf(\"°\")).toDouble()\n                                      : qQNaN());\n}\n\ndouble NewContactWidget::getQSODistance() const\n{\n    FCT_IDENTIFICATION;\n\n    return dxDistance;\n}\n\nbool NewContactWidget::getTabCollapseState() const\n{\n    FCT_IDENTIFICATION;\n\n    return tabCollapseBtn->isChecked();\n}\n\nvoid NewContactWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    writeWidgetSetting();\n}\n\nvoid NewContactWidget::propModeChanged(const QString &propModeText)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"propModeText: \" << propModeText << \" mode: \"<< Data::instance()->propagationModeIDToText(\"SAT\");\n    if ( propModeText == Data::instance()->propagationModeIDToText(\"SAT\") )\n    {\n        uiDynamic->satNameEdit->setText(LogParam::getNewContactSatName());\n        updateSatMode();\n        uiDynamic->satModeEdit->setEnabled(true);\n        uiDynamic->satNameEdit->setEnabled(true);\n    }\n    else\n    {\n        uiDynamic->satModeEdit->setCurrentIndex(-1);\n        uiDynamic->satNameEdit->clear();\n        uiDynamic->satModeEdit->setEnabled(false);\n        uiDynamic->satNameEdit->setEnabled(false);\n    }\n}\n\nvoid NewContactWidget::stationProfileComboChanged(const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << profileName;\n\n    // My Grid change\n    gridChanged();\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    StationProfilesManager::instance()->setCurProfile1(profileName);\n\n    // recalculate all stats\n    setDxccInfo(ui->callsignEdit->text());\n}\n\nvoid NewContactWidget::setValuesFromActivity(const QString &name)\n{\n    FCT_IDENTIFICATION;\n\n    const auto &variableHash = ActivityProfilesManager::instance()->getProfile(name).fieldValues;\n\n    auto setFieldValue = [&](LogbookModel::ColumnID columnID, QLineEdit *edit)\n    {\n        const QVariant &value = variableHash.value(columnID);\n\n        if ( !value.isNull() )\n            edit->setText(value.toString());\n    };\n\n    auto setFieldValueCombo = [&](LogbookModel::ColumnID columnID, QComboBox *combo)\n    {\n        const QVariant &value = variableHash.value(columnID);\n\n        if ( !value.isNull() )\n            combo->setCurrentText(value.toString());\n    };\n\n    setFieldValue(LogbookModel::COLUMN_CONTEST_ID, uiDynamic->contestIDEdit);\n    setFieldValue(LogbookModel::COLUMN_STX_STRING, uiDynamic->stxStringEdit);\n\n    // propagation mode has to be changed before SAT MODE because SAT MODE combo is disabled\n    // and it is not possible to set a value.\n    setFieldValueCombo(LogbookModel::LogbookModel::COLUMN_PROP_MODE, ui->propagationModeEdit);\n    setFieldValueCombo(LogbookModel::LogbookModel::COLUMN_SAT_MODE, uiDynamic->satModeEdit);\n    setFieldValue(LogbookModel::COLUMN_SAT_NAME, uiDynamic->satNameEdit);\n\n    setContestFieldsState();\n}\n\nvoid NewContactWidget::rigProfileComboChanged(const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << profileName;\n\n    // set just power from the new profile\n    uiDynamic->powerEdit->setValue(RigProfilesManager::instance()->getProfile(profileName).defaultPWR);\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    RigProfilesManager::instance()->setCurProfile1(profileName);\n\n    ui->freqRXEdit->setValue(realRigFreq + RigProfilesManager::instance()->getCurProfile1().ritOffset);\n    ui->freqTXEdit->setValue(realRigFreq + RigProfilesManager::instance()->getCurProfile1().xitOffset);\n\n    emit rigProfileChanged();\n\n}\n\nvoid NewContactWidget::antProfileComboChanged(const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << profileName;\n\n    if ( isManualEnterMode )\n    {\n        qCDebug(runtime) << \"Manual mode enabled - ignore event\";\n        return;\n    }\n\n    AntProfilesManager::instance()->setCurProfile1(profileName);\n}\n\nvoid NewContactWidget::sotaChanged(const QString &newSOTA)\n{\n    FCT_IDENTIFICATION;\n\n    uiDynamic->sotaEdit->setCompleter(( newSOTA.length() >= 3 ) ? sotaCompleter\n                                                                : nullptr);\n\n    if ( uiDynamic->qthEdit->text() == lastSOTA.summitName )\n        uiDynamic->qthEdit->clear();\n\n    const Gridsquare SOTAGrid(lastSOTA.latitude, lastSOTA.longitude);\n    if ( uiDynamic->gridEdit->text() == SOTAGrid.getGrid() )\n        uiDynamic->gridEdit->clear();\n\n    ui->AMLSInfo->clear();\n}\n\nbool NewContactWidget::isSOTAValid(SOTAEntity *entity)\n{\n    FCT_IDENTIFICATION;\n\n    if ( uiDynamic->sotaEdit->text().isEmpty() )\n        return false;\n\n    const SOTAEntity &sotaInfo = Data::instance()->lookupSOTA(uiDynamic->sotaEdit->text());\n    if ( entity ) *entity = sotaInfo;\n    return ( sotaInfo.summitCode.toUpper() == uiDynamic->sotaEdit->text().toUpper()\n             && !sotaInfo.summitName.isEmpty());\n}\n\nvoid NewContactWidget::sotaEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    SOTAEntity sotaInfo;\n\n    if ( isSOTAValid(&sotaInfo) )\n    {\n        uiDynamic->qthEdit->setText(sotaInfo.summitName);\n        const Gridsquare SOTAGrid(sotaInfo.latitude, sotaInfo.longitude);\n        if ( SOTAGrid.isValid() )\n            uiDynamic->gridEdit->setText(SOTAGrid.getGrid());\n        ui->AMLSInfo->setText(QString::number(sotaInfo.altm) + tr(\" m\"));\n        lastSOTA = sotaInfo;\n    }\n    else if ( isPOTAValid(nullptr) )\n        potaEditFinished();\n    else if ( isWWFFValid(nullptr) )\n        wwffEditFinished();\n}\n\nvoid NewContactWidget::potaChanged(const QString &newPOTA)\n{\n    FCT_IDENTIFICATION;\n\n    uiDynamic->potaEdit->setCompleter( ( newPOTA.length() >= 3 ) ? potaCompleter\n                                                                 : nullptr);\n\n    if ( uiDynamic->qthEdit->text() == lastPOTA.name )\n        uiDynamic->qthEdit->clear();\n\n    const Gridsquare POTAGrid(lastPOTA.grid);\n\n    if ( uiDynamic->gridEdit->text() == POTAGrid.getGrid() )\n        uiDynamic->gridEdit->clear();\n}\n\nbool NewContactWidget::isPOTAValid(POTAEntity *entity)\n{\n    FCT_IDENTIFICATION;\n\n    if ( uiDynamic->potaEdit->text().isEmpty() )\n        return false;\n\n    const QStringList &potaList = uiDynamic->potaEdit->text().split(\"@\");\n\n    QString potaString;\n\n    potaString = ( potaList.size() > 0 ) ? potaList[0]\n                                         : uiDynamic->potaEdit->text();\n\n    const POTAEntity &potaInfo = Data::instance()->lookupPOTA(potaString);\n\n    if ( entity ) *entity = potaInfo;\n    return (potaInfo.reference.toUpper() == potaString.toUpper()\n            && !potaInfo.name.isEmpty());\n}\n\nvoid NewContactWidget::potaEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    POTAEntity potaInfo;\n\n    if ( isPOTAValid(&potaInfo) )\n    {\n        uiDynamic->qthEdit->setText(potaInfo.name);\n        Gridsquare POTAGrid(potaInfo.grid);\n        if ( POTAGrid.isValid() )\n            uiDynamic->gridEdit->setText(POTAGrid.getGrid());\n        lastPOTA = potaInfo;\n    }\n    else if ( isSOTAValid(nullptr) )\n        sotaEditFinished();\n    else if ( isWWFFValid(nullptr) )\n        wwffEditFinished();\n}\n\nbool NewContactWidget::isWWFFValid(WWFFEntity *entity)\n{\n    FCT_IDENTIFICATION;\n\n\n    if ( uiDynamic->wwffEdit->text().isEmpty() )\n        return false;\n\n    const WWFFEntity &wwffInfo = Data::instance()->lookupWWFF(uiDynamic->wwffEdit->text());\n\n    if ( entity ) *entity = wwffInfo;\n\n    return (wwffInfo.reference.toUpper() == uiDynamic->wwffEdit->text().toUpper()\n            && !wwffInfo.name.isEmpty());\n}\n\nvoid NewContactWidget::useNearestSpotInfo(const QString &in_callsign)\n{\n    FCT_IDENTIFICATION;\n\n    if ( in_callsign.isEmpty()\n         || nearestSpot.callsign.isEmpty()\n         || in_callsign != ui->nearStationLabel->text() ) return;\n\n    if ( nearestSpot.containsPOTA )\n    {\n        uiDynamic->potaEdit->setText(nearestSpot.potaRef);\n        potaEditFinished();\n    }\n\n    if ( nearestSpot.containsSOTA )\n    {\n        uiDynamic->sotaEdit->setText(nearestSpot.sotaRef);\n        sotaEditFinished();\n    }\n\n    if ( nearestSpot.containsIOTA )\n    {\n        uiDynamic->iotaEdit->setText(nearestSpot.iotaRef);\n    }\n\n    if ( nearestSpot.containsWWFF )\n    {\n        uiDynamic->wwffEdit->setText(nearestSpot.wwffRef);\n        wwffEditFinished();\n    }\n}\n\nbool NewContactWidget::shouldStartContest()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &prevContestID = LogParam::getContestID();\n\n    qCDebug(runtime) << \"Prev Contest\" << prevContestID\n                     << \"Current\" << uiDynamic->contestIDEdit->text();\n    return (uiDynamic->contestIDEdit->text() != prevContestID);\n}\n\nvoid NewContactWidget::startContest(const QDateTime &date)\n{\n    FCT_IDENTIFICATION;\n\n    resetSTXSeq();\n    LogParam::setContestID(uiDynamic->contestIDEdit->text());\n    LogParam::setContestDupeDate(date);\n    emit contestStarted(uiDynamic->contestIDEdit->text(), date);\n}\n\nvoid NewContactWidget::setSTXSeq()\n{\n    FCT_IDENTIFICATION;\n\n    int seqnoType = LogParam::getContestSeqnoType();\n    int seq = LogParam::getContestSeqno(( seqnoType == Data::SeqType::SINGLE ) ? QString()\n                                                                               : ui->bandTXLabel->text());\n    uiDynamic->stxEdit->setText(QString::number(seq).rightJustified(3, '0'));\n}\n\nvoid NewContactWidget::setSTXSeq(int newValue)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << newValue;\n\n    int seqnoType = LogParam::getContestSeqnoType();\n\n    LogParam::setContestSeqno(newValue, (seqnoType == Data::SeqType::SINGLE) ? QString()\n                                                                             : ui->bandTXLabel->text());\n    uiDynamic->stxEdit->setText(QString::number(newValue).rightJustified(3, '0'));\n}\n\nvoid NewContactWidget::updateNearestSpotDupe()\n{\n    FCT_IDENTIFICATION;\n\n    nearestSpot.dupeCount = Data::countDupe(nearestSpot.callsign,\n                                            bandRX.name,\n                                            ui->modeEdit->currentText());\n}\n\nvoid NewContactWidget::resetSTXSeq()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::removeContestSeqno();\n    setSTXSeq();\n}\n\nvoid NewContactWidget::stopContest()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setContestID(QString());\n    LogParam::removeConetstDupeDate();\n    resetSTXSeq();\n    resetContact();\n    nearestSpot.dupeCount = false;\n    setNearestSpotColor();\n}\n\nvoid NewContactWidget::refreshCallsignsColors()\n{\n    FCT_IDENTIFICATION;\n\n    checkDupe();\n    updateNearestSpotDupe();\n    updateDxccStatus();\n}\n\nvoid NewContactWidget::changeSRXStringLink(int linkType)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << linkType;\n\n    static QMetaObject::Connection linkWidget2SRX;\n    static QMetaObject::Connection linkSRX2Widget;\n\n    if ( linkWidget2SRX )\n        disconnect(linkWidget2SRX);\n\n    if ( linkSRX2Widget)\n        disconnect(linkSRX2Widget);\n\n    LogbookModel::ColumnID type = static_cast<LogbookModel::ColumnID>(linkType);\n\n    const QValidator *newValidator = nullptr;\n    NewContactEditLine *sourceWidget = nullptr;\n    QString style;\n\n    switch (type)\n    {\n    case LogbookModel::COLUMN_AGE:\n        newValidator = uiDynamic->ageEdit->validator();\n        sourceWidget = uiDynamic->ageEdit;\n        break;\n    case LogbookModel::COLUMN_CQZ:\n        newValidator = uiDynamic->cqzEdit->validator();\n        sourceWidget = uiDynamic->cqzEdit;\n        break;\n    case LogbookModel::COLUMN_ITUZ:\n        newValidator = uiDynamic->ituEdit->validator();\n        sourceWidget = uiDynamic->ituEdit;\n        break;\n    case LogbookModel::COLUMN_GRID:\n        newValidator = uiDynamic->gridEdit->validator();\n        sourceWidget = uiDynamic->gridEdit;\n        style = \"QLineEdit {text-transform: uppercase;}\";\n        break;\n    case LogbookModel::COLUMN_RX_PWR:\n        newValidator = uiDynamic->rxPWREdit->validator();\n        sourceWidget = uiDynamic->rxPWREdit;\n        break;\n    case LogbookModel::COLUMN_NAME_INTL:\n        sourceWidget = uiDynamic->nameEdit;\n        break;\n    case LogbookModel::COLUMN_QTH_INTL:\n        sourceWidget = uiDynamic->qthEdit;\n        break;\n    case LogbookModel::COLUMN_STATE:\n        sourceWidget = uiDynamic->stateEdit;\n        break;\n    default:\n        newValidator = nullptr;\n        sourceWidget = nullptr;\n    }\n\n    uiDynamic->srxStringEdit->setValidator(newValidator);\n    uiDynamic->srxStringEdit->setStyleSheet(style);\n    uiDynamic->srxStringEdit->setText((sourceWidget) ? sourceWidget->text() : QString());\n\n    if ( sourceWidget )\n    {\n        linkWidget2SRX = connect(sourceWidget, &QLineEdit::textChanged,\n                                 this, [this](const QString &text)\n        {\n            uiDynamic->srxStringEdit->blockSignals(true);\n            uiDynamic->srxStringEdit->setText(text);\n            uiDynamic->srxStringEdit->blockSignals(false);\n        });\n\n        linkSRX2Widget = connect(uiDynamic->srxStringEdit, &QLineEdit::textChanged,\n                                 this, [sourceWidget](const QString &text)\n        {\n            sourceWidget->blockSignals(true);\n            sourceWidget->setText(text);\n            sourceWidget->blockSignals(false);\n        });\n    }\n}\n\nvoid NewContactWidget::checkDupe()\n{\n    FCT_IDENTIFICATION;\n\n    if ( callsign.isEmpty() )\n        return;\n\n    ui->dupeLabel->setVisible(Data::countDupe(callsign,\n                                           bandRX.name,\n                                           ui->modeEdit->currentText()));\n}\n\nvoid NewContactWidget::wwffEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    WWFFEntity wwffInfo;\n\n    if ( isWWFFValid(&wwffInfo) )\n    {\n        uiDynamic->qthEdit->setText(wwffInfo.name);\n        if ( ! wwffInfo.iota.isEmpty()\n             && wwffInfo.iota != \"-\" )\n        {\n            uiDynamic->iotaEdit->setText(wwffInfo.iota.toUpper());\n        }\n        uiDynamic->gridEdit->setText(QString()); // WWFF's Grid is unrealiable information\n        lastWWFF = wwffInfo;\n    }\n    else if ( isSOTAValid(nullptr) )\n        sotaEditFinished();\n    else if ( isPOTAValid(nullptr) )\n        potaEditFinished();\n}\n\nvoid NewContactWidget::wwffChanged(const QString &newWWFF)\n{\n    FCT_IDENTIFICATION;\n\n    uiDynamic->wwffEdit->setCompleter( ( newWWFF.length() >= 3 ) ? wwffCompleter\n                                                                 : nullptr);\n\n    if ( uiDynamic->qthEdit->text() == lastWWFF.name )\n    {\n        uiDynamic->qthEdit->clear();\n        uiDynamic->gridEdit->clear();\n    }\n}\n\nvoid NewContactWidget::formFieldChangedString(const QString &)\n{\n    FCT_IDENTIFICATION;\n\n    QSOFreq = ui->freqRXEdit->value();\n\n    // Initialize QSOTxFreq from display when form becomes dirty.\n    // Rig drivers only emit VFO2 signals when TX freq CHANGES —\n    // after resetContact() zeroes QSOTxFreq, the driver won't re-emit\n    // an unchanged TX freq, leaving QSOTxFreq at 0. This causes false\n    // QSY Wipe on the first VFO swap. Reading from the display provides\n    // the correct TX freq even before the next VFO2 signal arrives.\n    if ( QSOTxFreq <= 0.0 && rigSplitEnabled )\n        QSOTxFreq = ui->freqTXEdit->value();\n}\n\nvoid NewContactWidget::formFieldChanged()\n{\n    FCT_IDENTIFICATION;\n\n    formFieldChangedString(QString());\n}\n\nvoid NewContactWidget::useNearestCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    updateTime();\n    changeCallsignManually(ui->nearStationLabel->text());\n    ui->callsignEdit->setFocus();\n}\n\nvoid NewContactWidget::setCallbookStatusEnabled(bool callbookEnabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callbookEnabled;\n\n    if ( callbookEnabled )\n    {\n        ui->callbookStatusButton->setIcon((callbookSearchPaused) ? QIcon(\":/icons/search-globe_orange.svg\")\n                                                                 : QIcon(\":/icons/search-globe_green.svg\"));\n    }\n    else\n    {\n        callbookSearchPaused = false;\n        ui->callbookStatusButton->setIcon(QIcon(\":/icons/search-globe_red.svg\"));\n    }\n\n    if ( !callbookEnabled || callbookSearchPaused )\n    {\n        ui->callbookStatusButton->setToolTip(tr(\"Callbook search is inactive\"));\n        ui->callsignEdit->installEventFilter(this);\n    }\n    else\n    {\n        ui->callbookStatusButton->setToolTip(tr(\"Callbook search is active\"));\n        ui->callsignEdit->removeEventFilter(this);\n    }\n}\n\nvoid NewContactWidget::changeCallbookSearchStatus()\n{\n    FCT_IDENTIFICATION;\n\n    callbookSearchPaused = !callbookSearchPaused;\n    setCallbookStatusEnabled(callbookManager.isActive());\n}\n\nvoid NewContactWidget::satNameChanged()\n{\n    FCT_IDENTIFICATION;\n\n    if ( Data::instance()->propagationModeTextToID(ui->propagationModeEdit->currentText()) == \"SAT\")\n        LogParam::setNewContactSatName(uiDynamic->satNameEdit->text());\n}\n\nNewContactWidget::~NewContactWidget()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n    delete uiDynamic;\n}\n\nvoid NewContactWidget::assignPropConditions(PropConditions *cond)\n{\n    FCT_IDENTIFICATION;\n    prop_cond = cond;\n}\n\nvoid NewContactWidget::changeCallsignManually(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    changeCallsignManually(callsign, ui->freqRXEdit->value());\n}\n\n\nvoid NewContactWidget::changeCallsignManually(const QString &callsign, double freq)\n{\n    FCT_IDENTIFICATION;\n\n    QSOFreq = freq; // Important !!! - to prevent QSY Contact Reset when the frequency is set\n\n    // Initialize TX freq for QSY Wipe protection — see formFieldChangedString comment\n    if ( QSOTxFreq <= 0.0 && rigSplitEnabled )\n        QSOTxFreq = ui->freqTXEdit->value();\n    ui->callsignEdit->setText(callsign);\n    ui->callsignEdit->end(false);\n    handleCallsignFromUser();\n    finalizeCallsignEdit();\n    stopContactTimer();\n}\n\nvoid NewContactWidget::tabsExpandCollapse()\n{\n    FCT_IDENTIFICATION;\n\n    QStackedWidget* stackedWidget = ui->qsoTabs->findChild<QStackedWidget*>();\n    stackedWidget->setVisible(tabCollapseBtn->isChecked());\n    int maxSize = 16777215; // default expand fully\n    if(!tabCollapseBtn->isChecked()) {\n        maxSize = ui->qsoTabs->tabBar()->sizeHint().height();\n    }\n    ui->qsoTabs->setMaximumHeight(maxSize);\n}\n\nvoid NewContactWidget::setContestFieldsState()\n{\n    FCT_IDENTIFICATION;\n\n    bool enabled = !uiDynamic->contestIDEdit->text().isEmpty();\n    const QString &toolTip = (enabled) ? QString()\n                                       : tr(\"Contest ID must be filled in to activate\");\n\n    uiDynamic->srxEdit->setEnabled(enabled);\n    uiDynamic->srxEdit->setToolTip(toolTip);\n    uiDynamic->srxStringEdit->setEnabled(enabled);\n    uiDynamic->srxStringEdit->setToolTip(toolTip);\n    uiDynamic->stxEdit->setEnabled(enabled);\n    uiDynamic->stxEdit->setToolTip(toolTip);\n    uiDynamic->stxStringEdit->setEnabled(enabled);\n    uiDynamic->stxStringEdit->setToolTip(toolTip);\n}\n\nvoid NewContactWidget::queryPota()\n{\n    FCT_IDENTIFICATION;\n\n    if ( callsign.size() >= 3 )\n    {\n        // use copy constructor - POTA is updated from another thread and reference can be problem\n        const QString ref = PotaQE::instance()->findReferenceId(Callsign(callsign), ui->freqRXEdit->value()).reference;\n        uiDynamic->potaEdit->setText(ref);\n        potaEditFinished();\n    }\n}\n\nvoid NewContactWidget::handleDateTimeChangeFromUser()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isManualEnterMode ) return;\n\n    if ( callsign.isEmpty() )\n        setDxccInfo(DxccEntity());\n    else\n        setDxccInfo(callsign);\n}\n\nNewContactDynamicWidgets::NewContactDynamicWidgets(bool allocateWidgets,\n                                                   QWidget *parent) :\n    parent(parent),\n    widgetsAllocated(allocateWidgets)\n{\n\n    initializeWidgets(LogbookModel::COLUMN_NAME_INTL, \"name\", nameLabel, nameEdit);\n    initializeWidgets(LogbookModel::COLUMN_QTH_INTL, \"qth\", qthLabel, qthEdit);\n    initializeWidgets(LogbookModel::COLUMN_GRID, \"grid\", gridLabel, gridEdit);\n    initializeWidgets(LogbookModel::COLUMN_COMMENT_INTL, \"comment\", commentLabel, commentEdit);\n    initializeWidgets(LogbookModel::COLUMN_CONTINENT, \"cont\", contLabel, contEdit);\n    initializeWidgets(LogbookModel::COLUMN_ITUZ, \"itu\", ituLabel, ituEdit);\n    initializeWidgets(LogbookModel::COLUMN_CQZ, \"cqz\", cqzLabel, cqzEdit);\n    initializeWidgets(LogbookModel::COLUMN_STATE, \"state\", stateLabel, stateEdit);\n    initializeWidgets(LogbookModel::COLUMN_COUNTY, \"county\", countyLabel, countyEdit);\n    initializeWidgets(LogbookModel::COLUMN_AGE, \"age\", ageLabel, ageEdit);\n    initializeWidgets(LogbookModel::COLUMN_VUCC_GRIDS, \"vucc\", vuccLabel, vuccEdit);\n    initializeWidgets(LogbookModel::COLUMN_DARC_DOK, \"dok\", dokLabel, dokEdit);\n    initializeWidgets(LogbookModel::COLUMN_IOTA, \"iota\", iotaLabel, iotaEdit);\n    initializeWidgets(LogbookModel::COLUMN_POTA_REF, \"pota\", potaLabel, potaEdit);\n    initializeWidgets(LogbookModel::COLUMN_SOTA_REF, \"sota\", sotaLabel, sotaEdit);\n    initializeWidgets(LogbookModel::COLUMN_WWFF_REF, \"wwff\", wwffLabel, wwffEdit);\n    initializeWidgets(LogbookModel::COLUMN_SIG_INTL, \"sig\", sigLabel, sigEdit);\n    initializeWidgets(LogbookModel::COLUMN_SIG_INFO_INTL, \"sigInfo\", sigInfoLabel, sigInfoEdit);\n    initializeWidgets(LogbookModel::COLUMN_EMAIL, \"email\", emailLabel, emailEdit);\n    initializeWidgets(LogbookModel::COLUMN_WEB, \"url\", urlLabel, urlEdit);\n    initializeWidgets(LogbookModel::COLUMN_SAT_NAME, \"satName\", satNameLabel, satNameEdit);\n    initializeWidgets(LogbookModel::COLUMN_SAT_MODE, \"satMode\", satModeLabel, satModeEdit);\n    initializeWidgets(LogbookModel::COLUMN_CONTEST_ID, \"contestID\", contestIDLabel, contestIDEdit);\n    initializeWidgets(LogbookModel::COLUMN_SRX_STRING, \"srx_string\", srxStringLabel, srxStringEdit);\n    initializeWidgets(LogbookModel::COLUMN_STX_STRING, \"stx_string\", stxStringLabel, stxStringEdit);\n    initializeWidgets(LogbookModel::COLUMN_SRX, \"srx\", srxLabel, srxEdit);\n    initializeWidgets(LogbookModel::COLUMN_STX, \"stx\", stxLabel, stxEdit);\n    initializeWidgets(LogbookModel::COLUMN_RX_PWR, \"rx_pwr\", rxPWRLabel, rxPWREdit);\n    initializeWidgets(LogbookModel::COLUMN_TX_POWER, \"power\", powerLabel, powerEdit);\n    initializeWidgets(LogbookModel::COLUMN_RIG_INTL, \"rigDX\", rigLabel, rigEdit);\n    initializeWidgets(LogbookModel::COLUMN_QSLMSG_INTL, \"qslMsgS\", qslMsgSLabel, qslMsgSEdit);\n    initializeWidgets(LogbookModel::COLUMN_SKCC, \"skcc\", skccLabel, skccEdit);\n    initializeWidgets(LogbookModel::COLUMN_UKSMG, \"uksmg\", uksmgLabel, uksmgEdit);\n    initializeWidgets(LogbookModel::COLUMN_FISTS, \"fists\", fistsLabel, fistsEdit);\n    initializeWidgets(LogbookModel::COLUMN_FISTS_CC, \"fistscc\", fistsCCLabel, fistsCCEdit);\n\n    if ( allocateWidgets )\n    {\n        nameEdit->setMaxLength(50);\n\n        qthEdit->setMaxLength(75);\n\n        gridEdit->setMaximumSize(QSize(100, 16777215));\n        gridEdit->setMaxLength(10);\n        gridEdit->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Maximum);\n        gridEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridRegEx(), gridEdit));\n        gridEdit->spaceForbidden(true);\n\n        contEdit->setMaximumSize(QSize(50, 16777215));\n        contEdit->setSizeAdjustPolicy(QComboBox::AdjustToContents);\n        contEdit->addItem(QString());\n\n        for ( const QString &cont : Data::getContinentList() )\n            contEdit->addItem(cont);\n\n        ituEdit->setMaximumSize(QSize(40, 16777215));\n        ituEdit->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Maximum);\n        ituEdit->setMaxLength(2);\n        ituEdit->setValidator(new QIntValidator(Data::getITUZMin(), Data::getITUZMax(), ituEdit));\n        ituEdit->spaceForbidden(true);\n\n        cqzEdit->setMaximumSize(QSize(40, 16777215));\n        cqzEdit->setMaxLength(2);\n        cqzEdit->setSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Maximum);\n        cqzEdit->setValidator(new QIntValidator(Data::getCQZMin(), Data::getCQZMax(), cqzEdit));\n        cqzEdit->spaceForbidden(true);\n\n        //stateEdit->setMaximumSize(QSize(200, 16777215));\n\n        //countyEdit->setMaximumSize(QSize(200, 16777215));\n\n        //ageEdit->setMaximumSize(QSize(50, 16777215));\n        ageEdit->setMaximumSize(QSize(40, 16777215));\n        ageEdit->setMaxLength(3);\n        ageEdit->setValidator(new QIntValidator(0, 999, ageEdit));\n        ageEdit->spaceForbidden(true);\n\n        //vuccEdit->setMaximumSize(QSize(200, 16777215));\n        vuccEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridVUCCRegEx(), vuccEdit));\n        vuccEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"two or four adjacent Maidenhead grid locators, each four characters long, (ex. EN98,FM08,EM97,FM07)\", nullptr));\n\n        //dokEdit->setMaximumSize(QSize(200, 16777215));\n        dokEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"the contacted station's DARC DOK (District Location Code) (ex. A01)\", nullptr));\n\n        //iotaEdit->setMaximumSize(QSize(200, 16777215));\n        QCompleter *iotaCompleter = new QCompleter(Data::instance()->iotaIDList(), iotaEdit);\n        iotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n        iotaCompleter->setFilterMode(Qt::MatchContains);\n        iotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n        iotaEdit->setCompleter(iotaCompleter);\n        iotaEdit->spaceForbidden(true);\n\n        //potaEdit->setMaximumSize(QSize(200, 16777215));\n        //potaEdit->setFocusPolicy(Qt::ClickFocus);\n        //it has an external completer\n\n        //sotaEdit->setMaximumSize(QSize(200, 16777215));\n        //sotaEdit->setFocusPolicy(Qt::ClickFocus);\n        //it has an external completer\n\n        //wwffEdit->setMaximumSize(QSize(200, 16777215));\n        //wwffEdit->setFocusPolicy(Qt::ClickFocus);\n        wwffEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"World Wide Flora & Fauna\", nullptr));\n\n        //sigEdit->setMaximumSize(QSize(200, 16777215));\n        //sigEdit->setFocusPolicy(Qt::ClickFocus);\n        sigEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"Special Activity Group\", nullptr));\n\n        //sigInfoEdit->setMaximumSize(QSize(200, 16777215));\n        //sigInfoEdit->setFocusPolicy(Qt::ClickFocus);\n        sigInfoEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"Special Activity Group Information\", nullptr));\n\n        //emailEdit->setMaximumSize(QSize(200, 16777215));\n        //emailEdit->setFocusPolicy(Qt::ClickFocus);\n\n        //urlEdit->setMaximumSize(QSize(200, 16777215));\n        //urlEdit->setFocusPolicy(Qt::ClickFocus);\n\n        //satNameEdit->setMaximumSize(QSize(200, 16777215));\n        satNameEdit->setFocusPolicy(Qt::ClickFocus);\n        satNameEdit->setEnabled(false);\n        QSqlTableModel* satModel = new QSqlTableModel(satNameEdit);\n        satModel->setTable(\"sat_info\");\n        QCompleter *satCompleter = new QCompleter(satNameEdit);\n        satCompleter->setModel(satModel);\n        satCompleter->setCompletionColumn(satModel->fieldIndex(\"name\"));\n        satCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n        satNameEdit->setCompleter(satCompleter);\n        satModel->select();\n\n        satModeEdit->setSizeAdjustPolicy(QComboBox::AdjustToContents);\n        satModeEdit->setFocusPolicy(Qt::ClickFocus);\n        satModeEdit->setEnabled(false);\n        QStringList satModesList = Data::instance()->satModeList();\n        satModesList.prepend(\"\");\n        QStringListModel* satModesModel = new QStringListModel(satModesList, satModeEdit);\n        satModeEdit->setModel(satModesModel);\n\n        contestIDEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"It is not the name of the contest but it is an assigned<br>Contest ID (ex. CQ-WW-CW for CQ WW DX Contest (CW)) \", nullptr));\n\n        srxEdit->setValidator(new QIntValidator(0,INT_MAX, srxEdit));\n\n        stxEdit->setValidator(new QIntValidator(0,INT_MAX, stxEdit));\n        stxEdit->setText(\"001\");\n\n        rxPWREdit->setValidator(new QDoubleValidator(0, 100000.0, 9, rxPWREdit));\n\n        powerEdit->setMaximum(1000000.0);\n        powerEdit->setValue(0.0);\n        powerEdit->setDecimals(3);\n        powerEdit->setSpecialValueText(QCoreApplication::translate(\"NewContactWidget\", \"Blank\"));\n        powerEdit->setSuffix(QCoreApplication::translate(\"NewContactWidget\", \" W\"));\n\n        rigEdit->setToolTip(QCoreApplication::translate(\"NewContactWidget\", \"Description of the contacted station's equipment\", nullptr));\n\n        uksmgEdit->setValidator(new QIntValidator(0, INT_MAX, uksmgEdit));\n\n        fistsEdit->setValidator(new QIntValidator(0, INT_MAX, fistsEdit));\n\n        fistsCCEdit->setValidator(new QIntValidator(0, INT_MAX, fistsCCEdit));\n    }\n}\n\nQWidget *NewContactDynamicWidgets::getRowWidget(int index)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !widgetMapping.contains(index) )\n        return nullptr;\n\n    widgetMapping.value(index).rowWidget->setHidden(false);\n    widgetMapping.value(index).label->setHidden(false);\n    widgetMapping.value(index).label->setFocusPolicy(Qt::NoFocus);\n    widgetMapping.value(index).editor->setHidden(false);\n    widgetMapping.value(index).editor->setFocusPolicy(Qt::StrongFocus);\n    // recreate layout because getLabel destroy parent\n    widgetMapping.value(index).rowWidget->layout()->addWidget(widgetMapping.value(index).label);\n    widgetMapping.value(index).rowWidget->layout()->addWidget(widgetMapping.value(index).editor);\n    return widgetMapping.value(index).rowWidget;\n}\n\nQWidget *NewContactDynamicWidgets::getLabel(int index)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !widgetMapping.contains(index) )\n        return nullptr;\n\n    widgetMapping.value(index).label->setHidden(false);\n    widgetMapping.value(index).label->setFocusPolicy(Qt::NoFocus);\n    return widgetMapping.value(index).label;\n}\n\nQWidget *NewContactDynamicWidgets::getEditor(int index)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !widgetMapping.contains(index) )\n        return nullptr;\n\n    widgetMapping.value(index).editor->setHidden(false);\n    widgetMapping.value(index).editor->setFocusPolicy(Qt::ClickFocus);\n    return widgetMapping.value(index).editor;\n}\n\nQStringList NewContactDynamicWidgets::getAllFieldLabelNames() const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList ret;\n    const QList<DynamicWidget> &dynWidget = widgetMapping.values();\n\n    for (const DynamicWidget &widget : dynWidget)\n    {\n        ret << widget.fieldLabelName;\n    }\n    return ret;\n}\n\nint NewContactDynamicWidgets::getIndex4FieldLabelName(const QString &value) const\n{\n    FCT_IDENTIFICATION;\n\n    QHashIterator<int, DynamicWidget> i(widgetMapping);\n    while ( i.hasNext() )\n    {\n        i.next();\n        if ( i.value().fieldLabelName == value )\n            return i.key();\n    }\n    return -1;\n}\n\nQString NewContactDynamicWidgets::getFieldLabelName4Index(int i) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( !widgetMapping.contains(i) )\n        return QString();\n\n    return widgetMapping.value(i).fieldLabelName;\n}\n\ntemplate<typename WidgetType>\nvoid NewContactDynamicWidgets::initializeWidgets(LogbookModel::ColumnID DBIndexMapping,\n                                                 const QString &objectName,\n                                                 QLabel *&retLabel,\n                                                 WidgetType *&retWidget)\n{\n    FCT_IDENTIFICATION;\n\n    DynamicWidget widget;\n\n    widget.fieldLabelName = LogbookModel::getFieldNameTranslation(DBIndexMapping);\n    widget.baseObjectName = objectName;\n    widget.label = retLabel = nullptr;\n    widget.editor = retLabel = nullptr;\n    widget.rowWidget = retLabel = nullptr;\n\n    if ( widgetsAllocated )\n    {\n        QWidget *rowWidget = new QWidget(parent);\n        rowWidget->setObjectName(objectName + \"Widget\");\n\n        QVBoxLayout *rowWidgetLayout = new QVBoxLayout(rowWidget);\n        rowWidgetLayout->setSpacing(0);\n        rowWidgetLayout->setObjectName(objectName + \"Layout\");\n        rowWidgetLayout->setContentsMargins(0,0,0,0);\n\n        widget.label = retLabel = new QLabel(widget.fieldLabelName, rowWidget);\n        retLabel->setObjectName(objectName + \"Label\");\n\n        widget.editor = retWidget = new WidgetType(rowWidget);\n        retWidget->setObjectName(objectName + \"Edit\");\n\n        rowWidgetLayout->addWidget(retLabel);\n        rowWidgetLayout->addWidget(retWidget);\n\n        rowWidget->hide();\n        widget.rowWidget = rowWidget;\n    }\n    widgetMapping[DBIndexMapping] = widget;\n}\n"
  },
  {
    "path": "ui/NewContactWidget.h",
    "content": "#ifndef QLOG_UI_NEWCONTACTWIDGET_H\n#define QLOG_UI_NEWCONTACTWIDGET_H\n\n#include <QWidget>\n#include <QSqlRecord>\n#include <QCompleter>\n#include <QComboBox>\n#include <QHBoxLayout>\n#include <QLabel>\n#include <QLineEdit>\n#include <QHash>\n#include <QFormLayout>\n#include <QToolButton>\n\n#include \"data/DxSpot.h\"\n#include \"rig/Rig.h\"\n#include \"core/CallbookManager.h\"\n#include \"data/StationProfile.h\"\n#include \"core/PropConditions.h\"\n#include \"core/LogLocale.h\"\n#include \"models/LogbookModel.h\"\n#include \"ui/component/EditLine.h\"\n#include \"data/DxSpot.h\"\n#include \"ui/component/MultiselectCompleter.h\"\n#include \"data/POTAEntity.h\"\n#include \"data/SOTAEntity.h\"\n#include \"data/WWFFEntity.h\"\n#include \"component/ShutdownAwareWidget.h\"\n#include \"ui/component/BaseDoubleSpinBox.h\"\n\nnamespace Ui {\nclass NewContactWidget;\n}\n\nclass ModeSelectionController;\n\nenum CoordPrecision {\n    COORD_NONE = 0,\n    COORD_DXCC = 1,\n    COORD_GRID = 2,\n    COORD_FULL = 3\n};\n\nclass NewContactDynamicWidgets\n{\npublic:\n    QLabel *nameLabel;\n    NewContactEditLine *nameEdit;\n\n    QLabel *qthLabel;\n    NewContactEditLine *qthEdit;\n\n    QLabel *gridLabel;\n    NewContactEditLine *gridEdit;\n\n    QLabel *commentLabel;\n    NewContactEditLine *commentEdit;\n\n    QLabel *contLabel;\n    QComboBox *contEdit;\n\n    QLabel *ituLabel;\n    NewContactEditLine *ituEdit;\n\n    QLabel *cqzLabel;\n    NewContactEditLine *cqzEdit;\n\n    QLabel *stateLabel;\n    NewContactEditLine *stateEdit;\n\n    QLabel *countyLabel;\n    NewContactEditLine *countyEdit;\n\n    QLabel *ageLabel;\n    NewContactEditLine *ageEdit;\n\n    QLabel *vuccLabel;\n    NewContactEditLine *vuccEdit;\n\n    QLabel *dokLabel;\n    NewContactEditLine *dokEdit;\n\n    QLabel *iotaLabel;\n    NewContactEditLine *iotaEdit;\n\n    QLabel *potaLabel;\n    NewContactEditLine *potaEdit;\n\n    QLabel *sotaLabel;\n    NewContactEditLine *sotaEdit;\n\n    QLabel *wwffLabel;\n    NewContactEditLine *wwffEdit;\n\n    QLabel *sigLabel;\n    NewContactEditLine *sigEdit;\n\n    QLabel *sigInfoLabel;\n    NewContactEditLine *sigInfoEdit;\n\n    QLabel *emailLabel;\n    NewContactEditLine *emailEdit;\n\n    QLabel *urlLabel;\n    NewContactEditLine *urlEdit;\n\n    QLabel *satNameLabel;\n    NewContactEditLine *satNameEdit;\n\n    QLabel *satModeLabel;\n    QComboBox *satModeEdit;\n\n    QLabel *contestIDLabel;\n    NewContactEditLine *contestIDEdit;\n\n    QLabel *srxStringLabel;\n    NewContactEditLine *srxStringEdit;\n\n    QLabel *stxStringLabel;\n    NewContactEditLine *stxStringEdit;\n\n    QLabel *srxLabel;\n    NewContactEditLine *srxEdit;\n\n    QLabel *stxLabel;\n    NewContactEditLine *stxEdit;\n\n    QLabel *rxPWRLabel;\n    NewContactEditLine *rxPWREdit;\n\n    QLabel *powerLabel;\n    BaseDoubleSpinBox *powerEdit;\n\n    QLabel *rigLabel;\n    NewContactEditLine *rigEdit;\n\n    QLabel *qslMsgSLabel;\n    NewContactEditLine *qslMsgSEdit;\n\n    QLabel *skccLabel;\n    NewContactEditLine *skccEdit;\n\n    QLabel *uksmgLabel;\n    NewContactEditLine *uksmgEdit;\n\n    QLabel *fistsLabel;\n    NewContactEditLine *fistsEdit;\n\n    QLabel *fistsCCLabel;\n    NewContactEditLine *fistsCCEdit;\n\n    explicit NewContactDynamicWidgets(bool allocateWidgets,\n                                      QWidget *parent);\n    QWidget* getRowWidget(int index);\n    QWidget* getLabel(int index);\n    QWidget* getEditor(int index);\n    QStringList getAllFieldLabelNames() const;\n    int getIndex4FieldLabelName(const QString&) const;\n    QString getFieldLabelName4Index(int) const;\n\nprivate:\n    struct DynamicWidget\n    {\n       QWidget* label;\n       QWidget* editor;\n       QWidget* rowWidget;\n       QString baseObjectName;\n       QString fieldLabelName;\n    };\n\n    template<typename WidgetType>\n    void initializeWidgets(LogbookModel::ColumnID DBIndexMapping,\n                               const QString &objectName,\n                               QLabel *&retLabel,\n                               WidgetType *&retWidget);\n\n    // Mapping from DB Index to <Label, Editor>\n    QHash<int, DynamicWidget> widgetMapping;\n    QWidget *parent;\n    bool widgetsAllocated;\n};\n\nclass NewContactWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit NewContactWidget(QWidget *parent = nullptr);\n    ~NewContactWidget();\n\n    void assignPropConditions(PropConditions *);\n    QString getCallsign() const;\n    QString getName() const;\n    QString getRST() const;\n    QString getGreeting() const;\n    QString getQTH() const;\n    QString getMyCallsign() const;\n    QString getMyName() const;\n    QString getMyQTH() const;\n    QString getMyLocator() const;\n    QString getMySIG() const;\n    QString getMySIGInfo() const;\n    QString getMyIOTA() const;\n    QString getMySOTA() const;\n    QString getMyPOTA() const;\n    QString getMyWWFT() const;\n    QString getMyVUCC() const;\n    QString getMyPWR() const;\n    QString getBand() const;\n    QString getMode() const;\n    QString getSentNr() const;\n    QString getSentExch() const;\n    double getQSOBearing() const;\n    double getQSODistance() const;\n    bool getTabCollapseState() const;\n    virtual void finalizeBeforeAppExit() override;\n\nsignals:\n    void contactAdded(QSqlRecord record);\n    void newTarget(double lat, double lon);\n    void filterCallsign(QString call);\n    void userFrequencyChanged(VFOID, double, double, double);\n    void userModeChanged(VFOID, const QString &, const QString &mode,\n                         const QString &subMode, qint32 width);\n    void markQSO(DxSpot spot);\n\n    void callboolImageUrl(const QString&);\n\n    void contestStarted(const QString contestID,\n                        const QDateTime date);\n    void rigProfileChanged();\n    void callsignChanged(const QString& callsign);\n    void contactReset();\n\npublic slots:\n    void refreshRigProfileCombo();\n    void saveExternalContact(QSqlRecord record);\n    void readGlobalSettings();\n    void tuneDx(const DxSpot &spot);\n    void fillCallsignGrid(const QString &callsign, const QString& grid);\n    void prepareWSJTXQSO(const QString &receivedCallsign, const QString &grid, const QString &id);\n    void resetContact();\n    void saveContact();\n\n    // to receive RIG instructions\n    void changeFrequency(VFOID, double, double, double);\n    void changeSplit(VFOID, bool);\n    void changeModeWithoutSignals(const QString &mode, const QString &subMode);\n    void changeModefromRig(VFOID, const QString &rawMode, const QString &mode,\n                    const QString &subMode, qint32 width);\n    void changePower(VFOID, double power);\n    void rigConnected();\n    void rigDisconnected();\n    void setNearestSpot(const DxSpot &);\n    void setNearestSpotColor();\n    void setManualMode(bool);\n    void exitManualMode();\n    void refreshStationProfileCombo();\n    void refreshAntProfileCombo();\n    void stationProfileComboChanged(const QString&);\n    void setValuesFromActivity(const QString &);\n\n    void markContact();\n    void useNearestCallsign();\n\n    void setupCustomUi();\n\n    void resetSTXSeq();\n    void stopContest();\n    void refreshCallsignsColors();\n\n    void changeSRXStringLink(int);\n\nprivate slots:\n    void handleCallsignFromUser();\n    void frequencyTXChanged();\n    void frequencyRXChanged();\n    void changeMode();\n    void subModeChanged();\n    void gridChanged();\n    void updateTime();\n    void updateTimeOff();\n    void startContactTimer();\n    void stopContactTimer();\n    void finalizeCallsignEdit();\n    void setMembershipList(const QString&, QMap<QString, ClubStatusQuery::ClubInfo>);\n    void setCallbookFields(const CallbookResponseData &data);\n    void propModeChanged(const QString&);\n    void sotaChanged(const QString&);\n    void sotaEditFinished();\n    void potaChanged(const QString&);\n    void potaEditFinished();\n    void wwffEditFinished();\n    void wwffChanged(const QString&);\n    void formFieldChangedString(const QString&);\n    void formFieldChanged();\n    void setCallbookStatusEnabled(bool);\n    void changeCallbookSearchStatus();\n    void satNameChanged();\n    void rigProfileComboChanged(const QString&);\n    void antProfileComboChanged(const QString&);\n    void webLookup();\n    void refreshSIGCompleter();\n    void refreshContestCompleter();\n    void tabsExpandCollapse();\n    void setContestFieldsState();\n    void queryPota();\n    void handleDateTimeChangeFromUser();\n\nprivate:\n    void useFieldsFromPrevQSO(const QString &callsign,\n                              const QString &grid = QString());\n    void setDxccInfo(const DxccEntity &curr);\n    void setDxccInfo(const QString &callsign);\n    void clearCallbookQueryFields();\n    void clearMemberQueryFields();\n    void readWidgetSettings();\n    void writeWidgetSetting();\n    void __modeChanged();\n    void updateTXBand(double freq);\n    void updateRXBand(double freq);\n    void updateCoordinates(double lat, double lon, CoordPrecision prec);\n    void clearCoordinates();\n    void updateDxccStatus();\n    void updatePartnerLocTime();\n    void setDefaultReport();\n    void addAddlFields(QSqlRecord &record, const StationProfile &profile);\n    bool eventFilter(QObject *object, QEvent *event) override;\n    bool isQSOTimeStarted();\n    void QSYContactWiping(double);\n    void connectFieldChanged();\n    void changeCallsignManually(const QString &);\n    void changeCallsignManually(const QString &, double);\n    void __changeFrequency(VFOID, double vfoFreq, double ritFreq, double xitFreq);\n    void showRXTXFreqs(bool);\n    void setComboBaseData(QComboBox *, const QString &);\n    void queryMemberList();\n    QList<QWidget*> setupCustomUiRow(QHBoxLayout *row, const QList<int>& widgetsList);\n    QList<QWidget*> setupCustomDetailColumn(QFormLayout *column, const QList<int>& widgetsList);\n\n    void setupCustomUiRowsTabOrder(const QList<QWidget *> &customWidgets);\n    void setBandLabel(const QString &);\n    void updateSatMode();\n\n    bool isPOTAValid(POTAEntity *entity);\n    bool isSOTAValid(SOTAEntity *entity);\n    bool isWWFFValid(WWFFEntity *entity);\n\n    void useNearestSpotInfo(const QString &in_callsign);\n    void updateCountyCompleter(int dxcc);\n\n    bool shouldStartContest();\n    void startContest(const QDateTime &date);\n    void setSTXSeq();\n    void setSTXSeq(int newValue);\n    void updateNearestSpotDupe();\n    void checkDupe();\n\nprivate:\n    Rig* rig;\n    double realRigFreq;\n    double realFreqForManualExit;\n    QString callsign;\n    double dxDistance; // QSO distance in km - used for ADIF and internal usage\n    DxccEntity dxccEntity;\n    QString defaultReport;\n    CallbookManager callbookManager;\n    QTimer* contactTimer;\n    Ui::NewContactWidget *ui;\n    NewContactDynamicWidgets *uiDynamic;\n    CoordPrecision coordPrec;\n    PropConditions *prop_cond;\n    QCompleter *satCompleter;\n    QCompleter *sotaCompleter;\n    QCompleter *countyCompleter;\n    MultiselectCompleter *potaCompleter;\n    QCompleter *wwffCompleter;\n    QCompleter *sigCompleter;\n    QCompleter *contestCompleter;\n    QTimeZone partnerTimeZone;\n    double QSOFreq;\n    double QSOTxFreq;\n    double prevQSOTxFreq;\n    qint32 bandwidthFilter;\n    bool rigOnline;\n    CallbookResponseData lastCallbookQueryData;\n    SOTAEntity lastSOTA;\n    POTAEntity lastPOTA;\n    WWFFEntity lastWWFF;\n    bool isManualEnterMode;\n    bool rigSplitEnabled;\n    LogLocale locale;\n    QDateTime timeOff;\n    bool callbookSearchPaused;\n    Band bandTX;\n    Band bandRX;\n    QSqlQuery prevQSOExactMatchQuery;\n    QSqlQuery prevQSOBaseCallMatchQuery;\n    bool isPrevQSOExactMatchQuery;\n    bool isPrevQSOBaseCallMatchQuery;\n    DxSpot nearestSpot;\n    QToolButton *tabCollapseBtn;\n    ModeSelectionController *modeController;\n};\n\n#endif // QLOG_UI_NEWCONTACTWIDGET_H\n"
  },
  {
    "path": "ui/NewContactWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>NewContactWidget</class>\n <widget class=\"QWidget\" name=\"NewContactWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>971</width>\n    <height>425</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Maximum\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"focusPolicy\">\n   <enum>Qt::TabFocus</enum>\n  </property>\n  <property name=\"windowTitle\">\n   <string notr=\"true\">Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n   <property name=\"spacing\">\n    <number>4</number>\n   </property>\n   <property name=\"leftMargin\">\n    <number>4</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>4</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>4</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\n     <property name=\"rightMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"sizeConstraint\">\n        <enum>QLayout::SetMinimumSize</enum>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>6</number>\n       </property>\n       <item>\n        <layout class=\"QGridLayout\" name=\"firstLineLayout\">\n         <property name=\"horizontalSpacing\">\n          <number>6</number>\n         </property>\n         <property name=\"verticalSpacing\">\n          <number>0</number>\n         </property>\n         <item row=\"1\" column=\"2\">\n          <widget class=\"NewContactRSTEditLine\" name=\"rstRcvdEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>65</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"font\">\n            <font>\n             <pointsize>20</pointsize>\n            </font>\n           </property>\n           <property name=\"text\">\n            <string notr=\"true\">59</string>\n           </property>\n           <property name=\"maxLength\">\n            <number>6</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"5\">\n          <widget class=\"QLabel\" name=\"frequencyLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Frequency</string>\n           </property>\n           <property name=\"alignment\">\n            <set>Qt::AlignCenter</set>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"0\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n           <property name=\"spacing\">\n            <number>4</number>\n           </property>\n           <item>\n            <widget class=\"QLabel\" name=\"callsignLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>Callsign</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QPushButton\" name=\"callbookStatusButton\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"maximumSize\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"text\">\n              <string/>\n             </property>\n             <property name=\"flat\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"nearStationLabel\">\n             <property name=\"text\">\n              <string/>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignCenter</set>\n             </property>\n             <property name=\"textInteractionFlags\">\n              <set>Qt::NoTextInteraction</set>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"dupeLabel\">\n             <property name=\"styleSheet\">\n              <string notr=\"true\">QLabel { color : red; }</string>\n             </property>\n             <property name=\"text\">\n              <string>&lt;b&gt;DUPE !!!&lt;/b&gt;</string>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignCenter</set>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"5\">\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n           <property name=\"spacing\">\n            <number>1</number>\n           </property>\n           <item>\n            <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n             <property name=\"spacing\">\n              <number>2</number>\n             </property>\n             <item>\n              <widget class=\"QLabel\" name=\"freqRXLabel\">\n               <property name=\"sizePolicy\">\n                <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n                 <horstretch>0</horstretch>\n                 <verstretch>0</verstretch>\n                </sizepolicy>\n               </property>\n               <property name=\"text\">\n                <string>RX: </string>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"FreqQSpinBox\" name=\"freqRXEdit\">\n               <property name=\"sizePolicy\">\n                <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n                 <horstretch>0</horstretch>\n                 <verstretch>0</verstretch>\n                </sizepolicy>\n               </property>\n               <property name=\"focusPolicy\">\n                <enum>Qt::ClickFocus</enum>\n               </property>\n               <property name=\"keyboardTracking\">\n                <bool>false</bool>\n               </property>\n               <property name=\"suffix\">\n                <string notr=\"true\"> MHz</string>\n               </property>\n               <property name=\"decimals\">\n                <number>5</number>\n               </property>\n               <property name=\"maximum\">\n                <double>7500000.000000000000000</double>\n               </property>\n               <property name=\"singleStep\">\n                <double>0.001000000000000</double>\n               </property>\n               <property name=\"value\">\n                <double>3.500000000000000</double>\n               </property>\n              </widget>\n             </item>\n            </layout>\n           </item>\n           <item>\n            <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n             <item>\n              <widget class=\"QLabel\" name=\"freqTXLabel\">\n               <property name=\"sizePolicy\">\n                <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n                 <horstretch>0</horstretch>\n                 <verstretch>0</verstretch>\n                </sizepolicy>\n               </property>\n               <property name=\"text\">\n                <string>TX: </string>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"FreqQSpinBox\" name=\"freqTXEdit\">\n               <property name=\"enabled\">\n                <bool>true</bool>\n               </property>\n               <property name=\"sizePolicy\">\n                <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n                 <horstretch>0</horstretch>\n                 <verstretch>0</verstretch>\n                </sizepolicy>\n               </property>\n               <property name=\"focusPolicy\">\n                <enum>Qt::ClickFocus</enum>\n               </property>\n               <property name=\"keyboardTracking\">\n                <bool>false</bool>\n               </property>\n               <property name=\"suffix\">\n                <string> MHz</string>\n               </property>\n               <property name=\"decimals\">\n                <number>5</number>\n               </property>\n               <property name=\"maximum\">\n                <double>7500000.000000000000000</double>\n               </property>\n               <property name=\"singleStep\">\n                <double>0.001000000000000</double>\n               </property>\n               <property name=\"value\">\n                <double>3.500000000000000</double>\n               </property>\n              </widget>\n             </item>\n            </layout>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"6\">\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n           <property name=\"spacing\">\n            <number>1</number>\n           </property>\n           <item>\n            <widget class=\"QLabel\" name=\"bandRXLabel\">\n             <property name=\"font\">\n              <font>\n               <bold>true</bold>\n              </font>\n             </property>\n             <property name=\"text\">\n              <string notr=\"true\">80m</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"bandTXLabel\">\n             <property name=\"font\">\n              <font>\n               <bold>true</bold>\n              </font>\n             </property>\n             <property name=\"text\">\n              <string>80m</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"QLabel\" name=\"rstSentLabel\">\n           <property name=\"text\">\n            <string>RSTs</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"2\">\n          <widget class=\"QLabel\" name=\"rstRcvdLabel\">\n           <property name=\"text\">\n            <string>RSTr</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"NewContactEditLine\" name=\"callsignEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>150</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>300</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"font\">\n            <font>\n             <pointsize>20</pointsize>\n             <bold>true</bold>\n            </font>\n           </property>\n           <property name=\"maxLength\">\n            <number>25</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactRSTEditLine\" name=\"rstSentEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>65</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"font\">\n            <font>\n             <pointsize>20</pointsize>\n            </font>\n           </property>\n           <property name=\"text\">\n            <string>59</string>\n           </property>\n           <property name=\"maxLength\">\n            <number>6</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"3\">\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_14\">\n           <property name=\"spacing\">\n            <number>1</number>\n           </property>\n           <item>\n            <widget class=\"QComboBox\" name=\"modeEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"submodeEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"0\" column=\"3\">\n          <widget class=\"QLabel\" name=\"modeLabel\">\n           <property name=\"text\">\n            <string>Mode</string>\n           </property>\n           <property name=\"alignment\">\n            <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QWidget\" name=\"customLayoutWidget\" native=\"true\">\n         <layout class=\"QVBoxLayout\" name=\"customLayout\">\n          <property name=\"spacing\">\n           <number>6</number>\n          </property>\n          <property name=\"leftMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>0</number>\n          </property>\n          <item>\n           <layout class=\"QHBoxLayout\" name=\"customRowALayout\">\n            <property name=\"spacing\">\n             <number>6</number>\n            </property>\n            <property name=\"topMargin\">\n             <number>3</number>\n            </property>\n           </layout>\n          </item>\n          <item>\n           <layout class=\"QHBoxLayout\" name=\"customRowBLayout\">\n            <property name=\"bottomMargin\">\n             <number>3</number>\n            </property>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QWidget\" name=\"thirdLineWidget\" native=\"true\">\n         <layout class=\"QGridLayout\" name=\"thirdLineLayout\">\n          <property name=\"leftMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"verticalSpacing\">\n           <number>0</number>\n          </property>\n          <item row=\"1\" column=\"4\">\n           <widget class=\"QPushButton\" name=\"stopTimerButton\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n            <property name=\"icon\">\n             <iconset resource=\"../res/icons/icons.qrc\">\n              <normaloff>:/icons/baseline-stop-24px.svg</normaloff>:/icons/baseline-stop-24px.svg</iconset>\n            </property>\n            <property name=\"iconSize\">\n             <size>\n              <width>12</width>\n              <height>16</height>\n             </size>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"6\">\n           <widget class=\"QPushButton\" name=\"saveButton\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"text\">\n             <string>Save</string>\n            </property>\n            <property name=\"icon\">\n             <iconset theme=\"document-save\">\n              <normaloff>.</normaloff>.</iconset>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"11\">\n           <spacer name=\"horizontalSpacer_7\">\n            <property name=\"orientation\">\n             <enum>Qt::Horizontal</enum>\n            </property>\n            <property name=\"sizeHint\" stdset=\"0\">\n             <size>\n              <width>40</width>\n              <height>20</height>\n             </size>\n            </property>\n           </spacer>\n          </item>\n          <item row=\"1\" column=\"5\">\n           <spacer name=\"horizontalSpacer_4\">\n            <property name=\"orientation\">\n             <enum>Qt::Horizontal</enum>\n            </property>\n            <property name=\"sizeType\">\n             <enum>QSizePolicy::Maximum</enum>\n            </property>\n            <property name=\"sizeHint\" stdset=\"0\">\n             <size>\n              <width>20</width>\n              <height>20</height>\n             </size>\n            </property>\n           </spacer>\n          </item>\n          <item row=\"1\" column=\"10\">\n           <widget class=\"QPushButton\" name=\"webLookupButton\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"toolTip\">\n             <string>Lookup the call on the web. The query URL can be changed in Settings -&gt; Callbook</string>\n            </property>\n            <property name=\"text\">\n             <string>Web</string>\n            </property>\n            <property name=\"icon\">\n             <iconset resource=\"../res/icons/icons.qrc\">\n              <normaloff>:/icons/baseline-search-24px.svg</normaloff>:/icons/baseline-search-24px.svg</iconset>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"9\">\n           <spacer name=\"horizontalSpacer\">\n            <property name=\"orientation\">\n             <enum>Qt::Horizontal</enum>\n            </property>\n            <property name=\"sizeType\">\n             <enum>QSizePolicy::Maximum</enum>\n            </property>\n            <property name=\"sizeHint\" stdset=\"0\">\n             <size>\n              <width>20</width>\n              <height>20</height>\n             </size>\n            </property>\n           </spacer>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QDateEdit\" name=\"dateEdit\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::ClickFocus</enum>\n            </property>\n            <property name=\"readOnly\">\n             <bool>true</bool>\n            </property>\n            <property name=\"calendarPopup\">\n             <bool>true</bool>\n            </property>\n            <property name=\"timeSpec\">\n             <enum>Qt::UTC</enum>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QTimeEdit\" name=\"timeOnEdit\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::ClickFocus</enum>\n            </property>\n            <property name=\"readOnly\">\n             <bool>true</bool>\n            </property>\n            <property name=\"displayFormat\">\n             <string notr=\"true\">hh:mm:ss</string>\n            </property>\n            <property name=\"calendarPopup\">\n             <bool>true</bool>\n            </property>\n            <property name=\"timeSpec\">\n             <enum>Qt::UTC</enum>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLabel\" name=\"timeOnLabel\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"text\">\n             <string>Time On</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"8\">\n           <widget class=\"QPushButton\" name=\"resetButton\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"text\">\n             <string>Reset</string>\n            </property>\n            <property name=\"icon\">\n             <iconset theme=\"document-revert\">\n              <normaloff>.</normaloff>.</iconset>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"2\">\n           <widget class=\"QPushButton\" name=\"startTimerButton\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n            <property name=\"icon\">\n             <iconset resource=\"../res/icons/icons.qrc\">\n              <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n            </property>\n            <property name=\"iconSize\">\n             <size>\n              <width>12</width>\n              <height>16</height>\n             </size>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"dateLabel\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"text\">\n             <string>Date</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"3\">\n           <widget class=\"QLabel\" name=\"qsoDurationLabel\">\n            <property name=\"text\">\n             <string>Duration</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"3\">\n           <widget class=\"QTimeEdit\" name=\"qsoDurationEdit\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"focusPolicy\">\n             <enum>Qt::ClickFocus</enum>\n            </property>\n            <property name=\"readOnly\">\n             <bool>true</bool>\n            </property>\n            <property name=\"date\">\n             <date>\n              <year>1999</year>\n              <month>12</month>\n              <day>31</day>\n             </date>\n            </property>\n            <property name=\"maximumDate\">\n             <date>\n              <year>1999</year>\n              <month>12</month>\n              <day>31</day>\n             </date>\n            </property>\n            <property name=\"currentSection\">\n             <enum>QDateTimeEdit::HourSection</enum>\n            </property>\n            <property name=\"displayFormat\">\n             <string notr=\"true\">HH:mm:ss</string>\n            </property>\n            <property name=\"timeSpec\">\n             <enum>Qt::UTC</enum>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"minimumSize\">\n        <size>\n         <width>200</width>\n         <height>0</height>\n        </size>\n       </property>\n       <property name=\"title\">\n        <string>Info</string>\n       </property>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n        <property name=\"spacing\">\n         <number>0</number>\n        </property>\n        <property name=\"leftMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"topMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"rightMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"bottomMargin\">\n         <number>0</number>\n        </property>\n        <item>\n         <widget class=\"QLabel\" name=\"dxccInfo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"minimumSize\">\n           <size>\n            <width>0</width>\n            <height>0</height>\n           </size>\n          </property>\n          <property name=\"font\">\n           <font>\n            <pointsize>13</pointsize>\n            <bold>true</bold>\n           </font>\n          </property>\n          <property name=\"text\">\n           <string notr=\"true\"/>\n          </property>\n          <property name=\"alignment\">\n           <set>Qt::AlignCenter</set>\n          </property>\n          <property name=\"wordWrap\">\n           <bool>true</bool>\n          </property>\n          <property name=\"indent\">\n           <number>-1</number>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n          <item>\n           <widget class=\"QLabel\" name=\"flagView\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"minimumSize\">\n             <size>\n              <width>64</width>\n              <height>64</height>\n             </size>\n            </property>\n            <property name=\"maximumSize\">\n             <size>\n              <width>100000</width>\n              <height>64</height>\n             </size>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n            <property name=\"alignment\">\n             <set>Qt::AlignCenter</set>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n            <property name=\"spacing\">\n             <number>0</number>\n            </property>\n            <item>\n             <widget class=\"QLabel\" name=\"distanceInfo\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"minimumSize\">\n               <size>\n                <width>50</width>\n                <height>0</height>\n               </size>\n              </property>\n              <property name=\"font\">\n               <font>\n                <pointsize>9</pointsize>\n                <bold>false</bold>\n               </font>\n              </property>\n              <property name=\"text\">\n               <string notr=\"true\"/>\n              </property>\n              <property name=\"alignment\">\n               <set>Qt::AlignCenter</set>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"bearingInfo\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"minimumSize\">\n               <size>\n                <width>0</width>\n                <height>0</height>\n               </size>\n              </property>\n              <property name=\"font\">\n               <font>\n                <pointsize>9</pointsize>\n                <bold>false</bold>\n               </font>\n              </property>\n              <property name=\"text\">\n               <string notr=\"true\"/>\n              </property>\n              <property name=\"alignment\">\n               <set>Qt::AlignCenter</set>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"AMLSInfo\">\n              <property name=\"font\">\n               <font>\n                <pointsize>9</pointsize>\n               </font>\n              </property>\n              <property name=\"text\">\n               <string/>\n              </property>\n              <property name=\"alignment\">\n               <set>Qt::AlignCenter</set>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"partnerLocTimeInfo\">\n              <property name=\"font\">\n               <font>\n                <pointsize>9</pointsize>\n               </font>\n              </property>\n              <property name=\"text\">\n               <string/>\n              </property>\n              <property name=\"alignment\">\n               <set>Qt::AlignCenter</set>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"dxccStatus\">\n          <property name=\"font\">\n           <font>\n            <pointsize>10</pointsize>\n           </font>\n          </property>\n          <property name=\"text\">\n           <string/>\n          </property>\n          <property name=\"alignment\">\n           <set>Qt::AlignCenter</set>\n          </property>\n          <property name=\"wordWrap\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer_3\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeType\">\n      <enum>QSizePolicy::Fixed</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>10</width>\n       <height>10</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"qsoTabs\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Maximum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"focusPolicy\">\n      <enum>Qt::NoFocus</enum>\n     </property>\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"detailTab\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <attribute name=\"title\">\n       <string>&amp;Details</string>\n      </attribute>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"detailColA\">\n         <property name=\"formAlignment\">\n          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n         </property>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"detailColB\">\n         <property name=\"formAlignment\">\n          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n         </property>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"detailColC\">\n         <property name=\"formAlignment\">\n          <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslSentLabel\">\n           <property name=\"text\">\n            <string>QSL Send Status</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n           <item>\n            <widget class=\"QLabel\" name=\"paperQslSentLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>Paper</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslSentBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>50</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"lotwQslSentLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>LoTW</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"lotwQslSentBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>50</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"eQSLSentLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>eQSL</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"eQSLSentBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>50</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_9\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>0</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslSentViaLabel\">\n           <property name=\"text\">\n            <string>QSL Send via</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n           <item>\n            <widget class=\"QLabel\" name=\"qslSentViaPaperLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>Paper</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslSentViaBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>50</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"sizeAdjustPolicy\">\n              <enum>QComboBox::AdjustToContents</enum>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_10\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslViaLabel\">\n           <property name=\"text\">\n            <string>QSL via</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n           <property name=\"spacing\">\n            <number>0</number>\n           </property>\n           <item>\n            <widget class=\"NewContactEditLine\" name=\"qslViaEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>200</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::ClickFocus</enum>\n             </property>\n             <property name=\"maxLength\">\n              <number>25</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_8\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Minimum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>10</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"lotwLabel\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n             <property name=\"font\">\n              <font>\n               <pointsize>9</pointsize>\n              </font>\n             </property>\n             <property name=\"text\">\n              <string/>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n             </property>\n             <property name=\"margin\">\n              <number>0</number>\n             </property>\n             <property name=\"indent\">\n              <number>6</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"eqslLabel\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n             <property name=\"font\">\n              <font>\n               <pointsize>9</pointsize>\n              </font>\n             </property>\n             <property name=\"text\">\n              <string/>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n             </property>\n             <property name=\"margin\">\n              <number>5</number>\n             </property>\n             <property name=\"indent\">\n              <number>5</number>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_6\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"propagationModeLabel\">\n           <property name=\"text\">\n            <string>Propagation Mode</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"propagationModeEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>300</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"dxStatTab\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <attribute name=\"title\">\n       <string>D&amp;X Stats</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QLabel\" name=\"dxccTableLabel\">\n         <property name=\"text\">\n          <string>&lt;b&gt;DXCC Statistics&lt;/b&gt;</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"DxccTableWidget\" name=\"dxccTableWidget\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::NoFocus</enum>\n         </property>\n         <property name=\"styleSheet\">\n          <string notr=\"true\"/>\n         </property>\n         <property name=\"verticalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"horizontalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustToContents</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"tabKeyNavigation\">\n          <bool>true</bool>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::NoSelection</enum>\n         </property>\n         <property name=\"selectionBehavior\">\n          <enum>QAbstractItemView::SelectItems</enum>\n         </property>\n         <property name=\"gridStyle\">\n          <enum>Qt::SolidLine</enum>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>45</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>false</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>23</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>23</number>\n         </attribute>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"stationTableLabel\">\n         <property name=\"text\">\n          <string>&lt;b&gt;Station Statistics&lt;/b&gt;</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"DxccTableWidget\" name=\"stationTableWidget\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::NoFocus</enum>\n         </property>\n         <property name=\"verticalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"horizontalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustToContents</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::NoSelection</enum>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>45</number>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>23</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>23</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"myStationTab\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <attribute name=\"title\">\n       <string>M&amp;y Station</string>\n      </attribute>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout\">\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"stationProfileLabel\">\n           <property name=\"text\">\n            <string>Station</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"stationProfileCombo\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"sizeAdjustPolicy\">\n            <enum>QComboBox::AdjustToContents</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"rigLabel\">\n           <property name=\"text\">\n            <string>Rig</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"rigEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"sizeAdjustPolicy\">\n            <enum>QComboBox::AdjustToContents</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"antennaLabel\">\n           <property name=\"text\">\n            <string>Antenna</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"antennaEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"sizeAdjustPolicy\">\n            <enum>QComboBox::AdjustToContents</enum>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>40</width>\n           <height>20</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"myNoteTab\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <attribute name=\"title\">\n       <string>My &amp;Notes</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n       <item>\n        <widget class=\"QTextEdit\" name=\"noteEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Expanding\" vsizetype=\"MinimumExpanding\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::ClickFocus</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustToContents</enum>\n         </property>\n         <property name=\"acceptRichText\">\n          <bool>false</bool>\n         </property>\n         <property name=\"textInteractionFlags\">\n          <set>Qt::TextEditorInteraction</set>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n     <property name=\"spacing\">\n      <number>6</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"memberLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Member:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"memberListLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\"/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_11\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>NewContactEditLine</class>\n   <extends>QLineEdit</extends>\n   <header>ui/component/EditLine.h</header>\n  </customwidget>\n  <customwidget>\n   <class>DxccTableWidget</class>\n   <extends>QTableView</extends>\n   <header>ui/DxccTableWidget.h</header>\n  </customwidget>\n  <customwidget>\n   <class>FreqQSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/FreqQSpinBox.h</header>\n  </customwidget>\n  <customwidget>\n   <class>NewContactRSTEditLine</class>\n   <extends>QLineEdit</extends>\n   <header>ui/component/EditLine.h</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>callsignEdit</tabstop>\n  <tabstop>rstSentEdit</tabstop>\n  <tabstop>rstRcvdEdit</tabstop>\n  <tabstop>noteEdit</tabstop>\n </tabstops>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>callsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>handleCallsignFromUser()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>177</x>\n     <y>54</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>389</x>\n     <y>176</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>freqRXEdit</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>frequencyRXChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>727</x>\n     <y>53</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>516</x>\n     <y>217</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>modeEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>changeMode()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>427</x>\n     <y>69</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>516</x>\n     <y>263</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignEdit</sender>\n   <signal>returnPressed()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>handleCallsignFromUser()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>115</x>\n     <y>77</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>352</x>\n     <y>281</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>submodeEdit</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>subModeChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>519</x>\n     <y>69</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>453</x>\n     <y>253</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignEdit</sender>\n   <signal>editingFinished()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>finalizeCallsignEdit()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>67</x>\n     <y>63</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>453</x>\n     <y>253</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>propagationModeEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>propModeChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>863</x>\n     <y>392</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>562</x>\n     <y>290</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>stationProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>231</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>669</x>\n     <y>310</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>freqTXEdit</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>frequencyTXChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>727</x>\n     <y>87</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>669</x>\n     <y>310</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>rigProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>262</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>736</x>\n     <y>398</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>antennaEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>antProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>293</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>736</x>\n     <y>398</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>webLookupButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>webLookup()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>726</x>\n     <y>146</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>489</x>\n     <y>262</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stopTimerButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>stopContactTimer()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>380</x>\n     <y>146</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>489</x>\n     <y>262</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>saveButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>saveContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>512</x>\n     <y>146</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>489</x>\n     <y>262</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>startTimerButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>startContactTimer()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>246</x>\n     <y>146</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>489</x>\n     <y>262</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>resetButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>resetContact()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>598</x>\n     <y>146</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>489</x>\n     <y>262</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callbookStatusButton</sender>\n   <signal>clicked()</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>changeCallbookSearchStatus()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>75</x>\n     <y>17</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>485</x>\n     <y>185</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>handleDateTimeChangeFromUser()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>61</x>\n     <y>136</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>485</x>\n     <y>202</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>timeOnEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>NewContactWidget</receiver>\n   <slot>handleDateTimeChangeFromUser()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>168</x>\n     <y>136</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>485</x>\n     <y>202</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>saveContact()</slot>\n  <slot>resetContact()</slot>\n  <slot>handleCallsignFromUser()</slot>\n  <slot>gridChanged()</slot>\n  <slot>stopContactTimer()</slot>\n  <slot>frequencyTXChanged()</slot>\n  <slot>changeMode()</slot>\n  <slot>updateTime()</slot>\n  <slot>webLookup()</slot>\n  <slot>startContactTimer()</slot>\n  <slot>updateTimeStop()</slot>\n  <slot>subModeChanged()</slot>\n  <slot>propModeChanged(QString)</slot>\n  <slot>finalizeCallsignEdit()</slot>\n  <slot>freqTXOffsetChanged(double)</slot>\n  <slot>stationProfileComboChanged(QString)</slot>\n  <slot>sotaChanged(QString)</slot>\n  <slot>freqRXOffsetChanged(double)</slot>\n  <slot>frequencyRXChanged()</slot>\n  <slot>rigProfileComboChanged(QString)</slot>\n  <slot>antProfileComboChanged(QString)</slot>\n  <slot>sotaEditFinished()</slot>\n  <slot>wwffEditFinished()</slot>\n  <slot>wwffChanged(QString)</slot>\n  <slot>timeOnChanged()</slot>\n  <slot>potaEditFinished()</slot>\n  <slot>potaChanged(QString)</slot>\n  <slot>changeCallbookSearchStatus()</slot>\n  <slot>resetSTXCounters()</slot>\n  <slot>handleDateTimeChangeFromUser()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/OnlineMapWidget.cpp",
    "content": "#include <QGraphicsTextItem>\n#include <QTime>\n#include <QTimer>\n#include <QDebug>\n#include <QPainter>\n#include <QVector3D>\n#include <QtMath>\n#include <QFile>\n#include \"OnlineMapWidget.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/StationProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"core/debug.h\"\n#include \"core/PropConditions.h\"\n#include \"data/Band.h\"\n#include \"data/Data.h\"\n#include \"rotator/Rotator.h\"\n#include \"rig/Rig.h\"\n#include \"data/BandPlan.h\"\n#include \"rig/macros.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.onlinemapwidget\");\n\nOnlineMapWidget::OnlineMapWidget(QWidget *parent):\n  QWebEngineView(parent),\n  main_page(new WebEnginePage(this)),\n  isMainPageLoaded(false),\n  webChannelHandler(\"onlinemap\",parent),\n  prop_cond(nullptr),\n  contact(nullptr),\n  lastSeenAzimuth(0.0),\n  lastSeenElevation(0.0),\n  isRotConnected(false)\n{\n    FCT_IDENTIFICATION;\n\n    main_page->setWebChannel(&channel);\n\n    setPage(main_page);\n    main_page->load(QUrl(QLatin1String(\"qrc:/res/map/onlinemap.html\")));\n    connect(this, &OnlineMapWidget::loadFinished, this, &OnlineMapWidget::finishLoading);\n\n    setFocusPolicy(Qt::ClickFocus);\n    setContextMenuPolicy(Qt::NoContextMenu);\n    channel.registerObject(\"layerControlHandler\", &webChannelHandler);\n\n    double freq = LogParam::getNewContactFreq();\n    freq += RigProfilesManager::instance()->getCurProfile1().ritOffset;\n\n    setIBPBand(VFO1, 0.0, freq, 0.0);\n\n    connect(&webChannelHandler, &MapWebChannelHandler::chatCallsignPressed, this, &OnlineMapWidget::chatCallsignTrigger);\n    connect(&webChannelHandler, &MapWebChannelHandler::wsjtxCallsignPressed, this, &OnlineMapWidget::wsjtxCallsignTrigger);\n    connect(&webChannelHandler, &MapWebChannelHandler::IBPPressed, this, &OnlineMapWidget::IBPCallsignTrigger);\n}\n\nvoid OnlineMapWidget::setTarget(double lat, double lon)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << lat << \" \" << lon;\n\n    QString targetJavaScript;\n\n    if ( ! qIsNaN(lat) && ! qIsNaN(lon) )\n    {\n        /* Draw a new path */\n        Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n        if ( myGrid.isValid() )\n        {\n            targetJavaScript += QString(\"drawPath([{lat: %1, lng: %2}, {lat: %3, lng: %4}]);\").arg(myGrid.getLatitude())\n                                                                                              .arg(myGrid.getLongitude())\n                                                                                              .arg(lat)\n                                                                                              .arg(lon);\n        }\n    }\n    else\n        targetJavaScript = QLatin1String(\"drawPath([]);\");\n\n    runJavaScript(targetJavaScript);\n\n    // redraw ant path because QSO distance can change\n    antPositionChanged(lastSeenAzimuth, lastSeenElevation);\n}\n\nvoid OnlineMapWidget::changeTheme(int theme, bool isDark)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << theme << isDark;\n\n    QString themeJavaScript;\n\n    //theme == 1 dart\n    themeJavaScript\n        = (isDark == 1)\n              ? QLatin1String(\n                    \"map.getPanes().tilePane.style.webkitFilter=\\\"brightness(0.6) invert(1) \"\n                    \"contrast(3) hue-rotate(200deg) saturate(0.3) brightness(0.9)\\\";\")\n              : QLatin1String(\"map.getPanes().tilePane.style.webkitFilter=\\\"\\\";\");\n\n    runJavaScript(themeJavaScript);\n}\n\nvoid OnlineMapWidget::auroraDataUpdate()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList mapPoints;\n\n    if ( !prop_cond ) return;\n\n    if ( prop_cond->isAuroraMapValid() )\n    {\n        const QList<GenericValueMap<double>::MapPoint> &points = prop_cond->getAuroraPoints();\n\n        for ( const GenericValueMap<double>::MapPoint &point : points )\n        {\n            if ( point.value > 10 )\n            {\n                mapPoints << QString(\"{lat: %1, lng: %2, count: %3}\").arg(point.latitude)\n                                                                     .arg(point.longitude)\n                                                                     .arg(point.value)\n                          << QString(\"{lat: %1, lng: %2, count: %3}\").arg(point.latitude)\n                                                                     .arg(point.longitude - 360)\n                                                                     .arg(point.value);\n            }\n        }\n    }\n\n    runJavaScript(QString(\" auroraLayer.setData({max: 100, data:[%1]});\").arg(mapPoints.join(\",\")));\n}\n\nvoid OnlineMapWidget::mufDataUpdate()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList mapPoints;\n\n    if ( !prop_cond ) return;\n\n    if ( prop_cond->isMufMapValid() )\n    {\n        const QList<GenericValueMap<double>::MapPoint> &points = prop_cond->getMUFPoints();\n\n        for ( const GenericValueMap<double>::MapPoint &point : points )\n        {\n            mapPoints << QString(\"['%1', %2, %3]\").arg(QString::number(point.value,'f',0))\n                                                .arg(point.latitude)\n                                                .arg(point.longitude)\n                      << QString(\"['%1', %2, %3]\").arg(QString::number(point.value,'f',0))\n                                                .arg(point.latitude)\n                                                .arg(point.longitude - 360);\n        }\n    }\n\n    runJavaScript(QString(\" drawMuf([%1]);\").arg(mapPoints.join(\",\")));\n}\n\nvoid OnlineMapWidget::setIBPBand(VFOID vfoid, double, double ritFreq, double)\n{\n    FCT_IDENTIFICATION;\n\n    // Online map tracks the RX frequency only\n    if ( vfoid == VFO2 )\n        return;\n\n    runJavaScript(QString(\"currentBand=\\\"%1\\\";\").arg(BandPlan::freq2Band(ritFreq).name));\n}\n\nvoid OnlineMapWidget::antPositionChanged(double in_azimuth, double in_elevation)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_azimuth << \" \" << in_elevation;\n\n    if ( ! isRotConnected )\n        return;\n\n    QString targetJavaScript;\n    lastSeenAzimuth = in_azimuth;\n    lastSeenElevation = in_elevation;\n\n    /* Draw a new path */\n    Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n    if ( myGrid.isValid() )\n    {\n        double beamLen = 3000; // in km\n        double azimuthBeamWidth = AntProfilesManager::instance()->getCurProfile1().azimuthBeamWidth;\n\n        if ( contact )\n        {\n            double newBeamLen = contact->getQSODistance();\n            if ( !qIsNaN(newBeamLen) )\n            {\n                beamLen = newBeamLen;\n            }\n        }\n        targetJavaScript += QString(\"drawAntPath({lat: %1, lng: %2}, %3, %4, %5);\").arg(myGrid.getLatitude())\n                                                                                   .arg(myGrid.getLongitude())\n                                                                                   .arg(beamLen)\n                                                                                   .arg(in_azimuth)\n                                                                                   .arg(azimuthBeamWidth);\n    }\n    else\n    {\n        // clean paths\n        targetJavaScript = QLatin1String(\"drawAntPath({}, 0, 0, 0);\");\n    }\n\n    runJavaScript(targetJavaScript);\n}\n\nvoid OnlineMapWidget::rotConnected()\n{\n    FCT_IDENTIFICATION;\n\n    isRotConnected = true;\n    Rotator::instance()->sendState();\n}\n\nvoid OnlineMapWidget::rotDisconnected()\n{\n    FCT_IDENTIFICATION;\n\n    isRotConnected = false;\n\n    // clear the Ant Path\n    runJavaScript(QLatin1String(\"drawAntPath({}, 0, 0, 0);\"));\n}\n\nvoid OnlineMapWidget::finishLoading(bool)\n{\n    FCT_IDENTIFICATION;\n\n    if ( isMainPageLoaded )\n        return;\n\n    isMainPageLoaded = true;\n\n    /* which layers will be active */\n    postponedScripts += webChannelHandler.generateMapMenuJS(true, true, true, true, true, true, true, true);\n    main_page->runJavaScript(postponedScripts);\n    postponedScripts = QString();\n\n    webChannelHandler.restoreLayerControlStates(main_page);\n\n    flyToMyQTH();\n    auroraDataUpdate();\n}\n\nvoid OnlineMapWidget::chatCallsignTrigger(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    emit chatCallsignPressed(callsign);\n}\n\nvoid OnlineMapWidget::wsjtxCallsignTrigger(const QString &callsign)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign;\n\n    emit wsjtxCallsignPressed(callsign);\n}\n\nvoid OnlineMapWidget::IBPCallsignTrigger(const QString &callsign, double freq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << callsign << freq;\n\n    Rig::instance()->setFrequency(MHz(freq));\n    Rig::instance()->setMode(\"CW\", QString());\n}\n\nvoid OnlineMapWidget::runJavaScript(const QString &js)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << js;\n\n    if ( !isMainPageLoaded )\n        postponedScripts.append(js);\n    else\n        main_page->runJavaScript(js);\n}\n\nvoid OnlineMapWidget::flyToMyQTH()\n{\n    FCT_IDENTIFICATION;\n\n    /* focus current location */\n    Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n    if ( myGrid.isValid() )\n    {\n        QString currentProfilePosition(QString(\"[\\\"\\\", %1, %2, yellowIcon]\").arg(myGrid.getLatitude())\n                                                                            .arg(myGrid.getLongitude()));\n        runJavaScript(QString(\"flyToPoint(%1, 4);\").arg(currentProfilePosition));\n    }\n    // redraw ant path because QSO distance can change\n    antPositionChanged(lastSeenAzimuth, lastSeenElevation);\n}\n\nvoid OnlineMapWidget::drawChatUsers(const QList<KSTUsersInfo> &list)\n{\n    FCT_IDENTIFICATION;\n\n    QList<QString> chatUsers;\n\n    for ( const KSTUsersInfo &user : list )\n    {\n        if ( user.grid.isValid() )\n        {\n            chatUsers.append(QString(\"[\\\"%1\\\", %2, %3, %4]\").arg(user.callsign)\n                                                            .arg(user.grid.getLatitude())\n                                                            .arg(user.grid.getLongitude())\n                                                            .arg(\"yellowIcon\"));\n        }\n    }\n\n    runJavaScript(QString(\"drawPointsGroup3([%1]);\").arg(chatUsers.join(\",\")));\n}\n\nvoid OnlineMapWidget::drawWSJTXSpot(const WsjtxEntry &spot)\n{\n    FCT_IDENTIFICATION;\n\n    Gridsquare spotGrid(spot.grid);\n\n    if ( spotGrid.isValid() )\n    {\n        runJavaScript(QString(\"addWSJTXSpot(%1, %2, \\\"%3\\\", \\\"%4\\\");\").arg(spotGrid.getLatitude())\n                                                                      .arg(spotGrid.getLongitude())\n                                                                      .arg(spot.callsign, Data::colorToHTMLColor(Data::statusToColor(spot.status, spot.dupeCount, QColor(Qt::white)))));\n    }\n}\n\nvoid OnlineMapWidget::clearWSJTXSpots()\n{\n    FCT_IDENTIFICATION;\n\n    runJavaScript(QLatin1String(\"clearWSJTXSpots();\"));\n}\n\nOnlineMapWidget::~OnlineMapWidget()\n{\n    FCT_IDENTIFICATION;\n\n    main_page->deleteLater();\n}\n\nvoid OnlineMapWidget::assignPropConditions(PropConditions *conditions)\n{\n    FCT_IDENTIFICATION;\n\n    prop_cond = conditions;\n}\n\nvoid OnlineMapWidget::registerContactWidget(const NewContactWidget *contactWidget)\n{\n    FCT_IDENTIFICATION;\n    contact = contactWidget;\n}\n"
  },
  {
    "path": "ui/OnlineMapWidget.h",
    "content": "#ifndef QLOG_UI_ONLINEMAPWIDGET_H\n#define QLOG_UI_ONLINEMAPWIDGET_H\n\n#include <QWidget>\n#include <QWebEngineView>\n#include <QWebChannel>\n#include \"ui/MapWebChannelHandler.h\"\n#include \"core/PropConditions.h\"\n#include \"ui/WebEnginePage.h\"\n#include \"rig/Rig.h\"\n#include \"ui/NewContactWidget.h\"\n#include \"service/kstchat/KSTChat.h\"\n#include \"data/WsjtxEntry.h\"\n\nnamespace Ui {\nclass OnlineMapWidget;\n}\n\nclass OnlineMapWidget : public QWebEngineView\n{\n    Q_OBJECT\n\npublic:\n    explicit OnlineMapWidget(QWidget* parent = nullptr);\n    ~OnlineMapWidget();\n\n    void assignPropConditions(PropConditions *);\n    void registerContactWidget(const NewContactWidget*);\n\nsignals:\n    void chatCallsignPressed(QString);\n    void wsjtxCallsignPressed(QString);\n\npublic slots:\n    void setTarget(double lat, double lon);\n    void changeTheme(int, bool isDark);\n    void auroraDataUpdate();\n    void mufDataUpdate();\n    void setIBPBand(VFOID, double, double, double);\n    void antPositionChanged(double in_azimuth, double in_elevation);\n    void rotConnected();\n    void rotDisconnected();\n    void flyToMyQTH();\n    void drawChatUsers(const QList<KSTUsersInfo> &list);\n    void drawWSJTXSpot(const WsjtxEntry &spot);\n    void clearWSJTXSpots();\n\nprotected slots:\n    void finishLoading(bool);\n    void chatCallsignTrigger(const QString&);\n    void wsjtxCallsignTrigger(const QString&);\n    void IBPCallsignTrigger(const QString&, double);\n\nprivate:\n\n    WebEnginePage *main_page;\n    bool isMainPageLoaded;\n    QString postponedScripts;\n    QWebChannel channel;\n    MapWebChannelHandler webChannelHandler;\n    PropConditions *prop_cond;\n    const NewContactWidget *contact;\n    double lastSeenAzimuth, lastSeenElevation;\n    bool isRotConnected;\n\n    void runJavaScript(const QString &);\n};\n\n#endif // QLOG_UI_ONLINEMAPWIDGET_H\n"
  },
  {
    "path": "ui/PaperQSLDialog.cpp",
    "content": "#include <QLabel>\n#include <QDesktopServices>\n#include <QMessageBox>\n#include <QFileDialog>\n#include <QMimeDatabase>\n#include <QMimeType>\n#include <QSettings>\n#include <QTemporaryDir>\n#include \"PaperQSLDialog.h\"\n#include \"ui_PaperQSLDialog.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.paperqsldialog\");\n\nextern QTemporaryDir tempDir;\n\nPaperQSLDialog::PaperQSLDialog(const QSqlRecord &qso, QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::PaperQSLDialog),\n    qsl(new QSLStorage(this)),\n    dialogQSORecord(qso),\n    fileCount(0)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    showAvailableFiles();\n}\n\nPaperQSLDialog::~PaperQSLDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete qsl;\n    delete ui;\n}\n\nvoid PaperQSLDialog::addFileClick()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings; //platform-dependent, must be present\n\n    const QString &lastPath = settings.value(\"paperqslimport/last_path\", QDir::homePath()).toString();\n\n    QString filename = QFileDialog::getOpenFileName(this,\n                                                    tr(\"Add File\"),\n                                                    lastPath,\n#if defined(Q_OS_WIN)\n                                                    \"\",\n#elif defined(Q_OS_MACOS)\n                                                    \"\",\n#else\n                                                    \"\",\n#endif\n                                                    nullptr,\n#if defined(Q_OS_LINUX)\n                                                    // Do not use the Native Dialog under Linux because the dialog is case-sensitive.\n                                                    // QT variant looks different but it is case-insensitive.\n                                                    // More information:\n                                                    // https://stackoverflow.com/questions/34858220/qt-how-to-set-a-case-insensitive-filter-on-qfiledialog\n                                                    // https://bugreports.qt.io/browse/QTBUG-51712\n                                                    QFileDialog::DontUseNativeDialog\n#else\n                                                    QFileDialog::Options()\n#endif\n                                                   );\n    if ( !filename.isEmpty() )\n    {\n        qCDebug(runtime) << \"selected file \" << filename;\n\n        QFile file(filename);\n\n        if ( !file.open(QIODevice::ReadOnly) )\n            return;\n\n        settings.setValue(\"paperqslimport/last_path\", QFileInfo(filename).path());\n\n        if ( qsl->add(QSLObject(dialogQSORecord, QSLObject::QSLFILE,\n                                QFileInfo(file).fileName(), file.readAll(),\n                                QSLObject::RAWBYTES)) )\n        {\n           addFileToDialog(filename);\n        }\n    }\n}\n\nvoid PaperQSLDialog::showAvailableFiles()\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &files = qsl->getAvailableQSLNames(dialogQSORecord, QSLObject::QSLFILE);\n\n    for ( const QString &file : files )\n        addFileToDialog(file);\n}\n\nvoid PaperQSLDialog::addFileToDialog(const QString &inFile)\n{\n    FCT_IDENTIFICATION;\n\n    QFileInfo file(inFile);\n\n    qCDebug(function_parameters) << file.fileName();\n\n    // if file already exists, do not add it to dialog.\n    if ( filenameList.contains(file.fileName() ) )\n         return;\n\n    filenameList << file.fileName();\n\n    QHBoxLayout* fileLayout = new QHBoxLayout();\n    fileLayout->setObjectName(QString::fromUtf8(\"fileLayout%1\").arg(fileCount));\n\n    /*****************/\n    /* Remove Button */\n    /*****************/\n    QPushButton* removeButton = new QPushButton(tr(\"Remove\"), this);\n    removeButton->setObjectName(QString::fromUtf8(\"removeButton%1\").arg(fileCount));\n\n    fileLayout->addWidget(removeButton);\n\n    connect(removeButton, &QPushButton::clicked, this, [this, fileLayout, file]()\n    {\n        QMessageBox::StandardButton reply;\n        reply = QMessageBox::question(this, tr(\"Delete\"), tr(\"Delete QSL?\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if (reply != QMessageBox::Yes) return;\n\n        if ( qsl->remove(dialogQSORecord, QSLObject::QSLFILE, file.fileName()) )\n        {\n            QLayoutItem *item = NULL;\n            while ((item = fileLayout->takeAt(0)) != 0)\n            {\n                delete item->widget();\n                delete item;\n            }\n            fileLayout->deleteLater();\n        }\n    });\n\n    /*****************/\n    /* Open Button */\n    /*****************/\n    QPushButton* openButton = new QPushButton(tr(\"Open\"), this);\n    openButton->setObjectName(QString::fromUtf8(\"openButton%1\").arg(fileCount));\n\n    fileLayout->addWidget(openButton);\n\n    /*******************/\n    /* Favorite Button */\n    /*******************/\n    const qulonglong contactId = dialogQSORecord.value(\"id\").toULongLong();\n    const bool isFav = qsl->isFavorite(contactId, QSLObject::QSLFILE, file.fileName());\n\n    QPushButton *favButton = new QPushButton(isFav ? QStringLiteral(\"\\u2605\") : QStringLiteral(\"\\u2606\"), this);\n    favButton->setObjectName(QString::fromUtf8(\"favButton%1\").arg(fileCount));\n    favButton->setFixedWidth(30);\n    favButton->setToolTip(tr(\"Toggle Favorite\"));\n\n    fileLayout->addWidget(favButton);\n\n    connect(favButton, &QPushButton::clicked, this, [this, favButton, file]()\n    {\n        const qulonglong cId = dialogQSORecord.value(\"id\").toULongLong();\n        const bool currentFav = (favButton->text() == QStringLiteral(\"\\u2605\"));\n\n        if ( qsl->setFavorite(cId, QSLObject::QSLFILE, file.fileName(), !currentFav) )\n            favButton->setText(!currentFav ? QStringLiteral(\"\\u2605\") : QStringLiteral(\"\\u2606\"));\n    });\n\n    connect(openButton, &QPushButton::clicked, this, [this, file]()\n    {\n        if ( !tempDir.isValid() )\n        {\n            qCDebug(runtime) << \"Temp directory\" << tempDir.path()<< \"for QSL is not valid\";\n            return;\n        }\n\n        QFile f(tempDir.path() + QDir::separator() + file.fileName());\n        qCDebug(runtime) << \"Using temp file\" << f.fileName();\n\n        if ( f.open(QFile::WriteOnly) )\n        {\n            f.write(qsl->getQSL(dialogQSORecord,\n                                QSLObject::QSLFILE,\n                                file.fileName()).getBLOB());\n            f.flush();\n            f.close();\n        }\n        else\n        {\n            qWarning() << \"Cannot open file for QSL\";\n        }\n\n        QDesktopServices::openUrl(QUrl::fromLocalFile(f.fileName()));\n    });\n\n    /***************/\n    /* File label  */\n    /***************/\n\n    QLabel *fileLabel = new QLabel(file.fileName().left(80), this);\n    fileLabel->setObjectName(QString::fromUtf8(\"fileLabel%1\").arg(fileCount));\n    fileLabel->setMaximumWidth(200);\n    fileLabel->setMinimumWidth(200);\n    QSizePolicy sizePolicy1(QSizePolicy::Fixed, QSizePolicy::Fixed);\n    sizePolicy1.setHorizontalStretch(0);\n    sizePolicy1.setVerticalStretch(0);\n    sizePolicy1.setHeightForWidth(fileLabel->sizePolicy().hasHeightForWidth());\n    fileLabel->setSizePolicy(sizePolicy1);\n\n    QMimeDatabase mimeDatabase;\n    QMimeType mimeType;\n\n    mimeType = mimeDatabase.mimeTypeForFile(file);\n\n    if ( mimeType.name().contains(\"image\", Qt::CaseInsensitive))\n    {\n       // QByteArray->QString in arg is due to QT5.12\n       fileLabel->setToolTip(QString(\"<img src='data:%0;base64, %1'>\").arg(mimeType.name(), QString(qsl->getQSL(dialogQSORecord,\n                                                                                                                QSLObject::QSLFILE,\n                                                                                                                file.fileName()).getBLOB(QSLObject::BASE64FORM))));\n    }\n\n    fileLayout->addWidget(fileLabel);\n\n    ui->filesListLayout->addLayout(fileLayout);\n\n    fileCount++;\n}\n"
  },
  {
    "path": "ui/PaperQSLDialog.h",
    "content": "#ifndef QLOG_UI_PAPERQSLDIALOG_H\n#define QLOG_UI_PAPERQSLDIALOG_H\n\n#include <QDialog>\n#include <QSqlRecord>\n\n#include \"core/QSLStorage.h\"\n\nnamespace Ui {\nclass PaperQSLDialog;\n}\n\nclass PaperQSLDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit PaperQSLDialog(const QSqlRecord &qso, QWidget *parent = nullptr);\n    ~PaperQSLDialog();\n\npublic slots:\n    void addFileClick();\n\nprivate:\n\n    void showAvailableFiles();\n    void addFileToDialog(const QString &);\n    void addNewFile(const QString &);\n\n    Ui::PaperQSLDialog *ui;\n\n    QSLStorage *qsl;\n    QSqlRecord dialogQSORecord;\n    unsigned int fileCount;\n    QStringList filenameList;\n};\n\n#endif // QLOG_UI_PAPERQSLDIALOG_H\n"
  },
  {
    "path": "ui/PaperQSLDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>PaperQSLDialog</class>\n <widget class=\"QDialog\" name=\"PaperQSLDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>366</width>\n    <height>134</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Manage QSL Card</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Available QSLs</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n      <item>\n       <layout class=\"QVBoxLayout\" name=\"filesListLayout\"/>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QPushButton\" name=\"addFileButton\">\n       <property name=\"toolTip\">\n        <string>Copy the input file from the source folder to the QLog Internal QSL Storage folder.&lt;br/&gt;The original file remains unchanged in the source folder</string>\n       </property>\n       <property name=\"text\">\n        <string>Import QSL</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"folder-open\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>PaperQSLDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>PaperQSLDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addFileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>PaperQSLDialog</receiver>\n   <slot>addFileClick()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>49</x>\n     <y>74</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>264</x>\n     <y>168</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>addFileClick()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/PlatformSettingsDialog.cpp",
    "content": "#include <QFileDialog>\n#include <QLineEdit>\n#include <QPushButton>\n#include <QHBoxLayout>\n#include <QHeaderView>\n#include <QWidget>\n#include \"PlatformSettingsDialog.h\"\n#include \"ui_PlatformSettingsDialog.h\"\n#include \"core/debug.h\"\n#include \"ui/component/EditLine.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.platformsettingsdialog\");\n\nPlatformSettingsDialog::PlatformSettingsDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::PlatformSettingsDialog),\n    parameterCount(0)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    // Set column resize modes\n    ui->settingsTable->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents);\n    ui->settingsTable->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);\n\n    // Add Continue button\n    continueButton = ui->buttonBox->addButton(tr(\"Continue\"), QDialogButtonBox::AcceptRole);\n    connect(continueButton, &QPushButton::clicked, this, &QDialog::accept);\n}\n\nPlatformSettingsDialog::~PlatformSettingsDialog()\n{\n    delete ui;\n}\n\nvoid PlatformSettingsDialog::setParameters(const QList<PlatformParameter> &params,\n                                           const QList<ProfileParameter> &profileParams)\n{\n    FCT_IDENTIFICATION;\n\n    parameters = params;\n    profilePortParameters = profileParams;\n    parameterCount = params.size();\n\n    int totalRows = params.size() + profileParams.size();\n    ui->settingsTable->setRowCount(totalRows);\n\n    int row = 0;\n\n    // Add PlatformParameter entries\n    for ( const PlatformParameter &p : params )\n    {\n        // Setting name\n        QTableWidgetItem *nameItem = new QTableWidgetItem(p.displayName);\n        ui->settingsTable->setItem(row, 0, nameItem);\n\n        // Value - editable with browse button, imported value as placeholder\n        QWidget *editWidget = new QWidget(this);\n        QHBoxLayout *layout = new QHBoxLayout(editWidget);\n        layout->setContentsMargins(2, 2, 2, 2);\n        layout->setSpacing(2);\n\n        QLineEdit *lineEdit = new QLineEdit(this);\n        lineEdit->setObjectName(QString(\"lineEdit_%1\").arg(row));\n        lineEdit->setPlaceholderText(p.currentValue);\n        layout->addWidget(lineEdit);\n\n        QPushButton *browseBtn = new QPushButton(\"...\", this);\n        browseBtn->setFixedWidth(30);\n        connect(browseBtn, &QPushButton::clicked, this, [this, row]() {\n            browseForPath(row);\n        });\n        layout->addWidget(browseBtn);\n\n        ui->settingsTable->setCellWidget(row, 1, editWidget);\n        ++row;\n    }\n\n    // Add ProfilePortParameter entries\n    for ( const ProfileParameter &p : profileParams )\n    {\n        // Setting name (includes profile name)\n        QTableWidgetItem *nameItem = new QTableWidgetItem(p.displayName);\n        ui->settingsTable->setItem(row, 0, nameItem);\n\n        // Value - editable with browse button, imported value as placeholder\n        QWidget *editWidget = new QWidget();\n        QHBoxLayout *layout = new QHBoxLayout(editWidget);\n        layout->setContentsMargins(2, 2, 2, 2);\n        layout->setSpacing(2);\n\n        if ( p.isExecutablePath )\n        {\n            QLineEdit *lineEdit = new QLineEdit(this);\n            lineEdit->setObjectName(QString(\"lineEdit_%1\").arg(row));\n            lineEdit->setPlaceholderText(p.currentValue);\n            layout->addWidget(lineEdit);\n\n            QPushButton *browseBtn = new QPushButton(\"...\",this);\n            browseBtn->setFixedWidth(30);\n            connect(browseBtn, &QPushButton::clicked, this, [this, row]() {\n                browseForPath(row);\n            });\n            layout->addWidget(browseBtn);\n        }\n        else\n        {\n            SerialPortEditLine *lineEdit = new SerialPortEditLine(this);\n            lineEdit->setObjectName(QString(\"lineEdit_%1\").arg(row));\n            lineEdit->setPlaceholderText(p.currentValue);\n            layout->addWidget(lineEdit);\n        }\n\n        ui->settingsTable->setCellWidget(row, 1, editWidget);\n        ++row;\n    }\n}\n\nQList<PlatformParameter> PlatformSettingsDialog::getParameters() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<PlatformParameter> result = parameters;\n\n    for ( int row = 0; row < result.size(); ++row )\n    {\n        QWidget *cellWidget = ui->settingsTable->cellWidget(row, 1);\n        if ( cellWidget )\n        {\n            QLineEdit *lineEdit = cellWidget->findChild<QLineEdit*>(QString(\"lineEdit_%1\").arg(row));\n            if ( lineEdit )\n            {\n                qCDebug(runtime) << \"new value\" << lineEdit->text();\n                result[row].newValue = lineEdit->text();\n            }\n        }\n    }\n\n    return result;\n}\n\nQList<ProfileParameter> PlatformSettingsDialog::getProfilePortParameters() const\n{\n    FCT_IDENTIFICATION;\n\n    QList<ProfileParameter> result = profilePortParameters;\n\n    for ( int i = 0; i < result.size(); ++i )\n    {\n        int row = parameterCount + i;\n        QWidget *cellWidget = ui->settingsTable->cellWidget(row, 1);\n        if ( cellWidget )\n        {\n            QLineEdit *lineEdit = cellWidget->findChild<QLineEdit*>(QString(\"lineEdit_%1\").arg(row));\n            if ( lineEdit )\n            {\n                qCDebug(runtime) << \"new value\" << lineEdit->text();\n                result[i].newValue = lineEdit->text();\n            }\n        }\n    }\n\n    return result;\n}\n\nvoid PlatformSettingsDialog::browseForPath(int row)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << row;\n\n    int totalRows = parameterCount + profilePortParameters.size();\n    if ( row < 0 || row >= totalRows ) return;\n\n    QString filename = QFileDialog::getOpenFileName(\n        this,\n        tr(\"Select File\"),\n        QString(),\n        tr(\"All Files (*)\")\n    );\n\n    if ( filename.isEmpty() ) return;\n\n    QWidget *cellWidget = ui->settingsTable->cellWidget(row, 1);\n    if ( cellWidget )\n    {\n        QLineEdit *lineEdit = cellWidget->findChild<QLineEdit*>(QString(\"lineEdit_%1\").arg(row));\n        if ( lineEdit )\n            lineEdit->setText(filename);\n    }\n}\n"
  },
  {
    "path": "ui/PlatformSettingsDialog.h",
    "content": "#ifndef QLOG_UI_PLATFORMSETTINGSDIALOG_H\n#define QLOG_UI_PLATFORMSETTINGSDIALOG_H\n\n#include <QDialog>\n#include <QPushButton>\n#include \"core/PlatformParameterManager.h\"\n\nnamespace Ui {\nclass PlatformSettingsDialog;\n}\n\nclass PlatformSettingsDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit PlatformSettingsDialog(QWidget *parent = nullptr);\n    ~PlatformSettingsDialog();\n\n    void setParameters(const QList<PlatformParameter> &params,\n                       const QList<ProfileParameter> &profileParams);\n    QList<PlatformParameter> getParameters() const;\n    QList<ProfileParameter> getProfilePortParameters() const;\n\nprivate slots:\n    void browseForPath(int row);\n\nprivate:\n    Ui::PlatformSettingsDialog *ui;\n    QPushButton *continueButton;\n    QList<PlatformParameter> parameters;\n    QList<ProfileParameter> profilePortParameters;\n    int parameterCount;  // Number of PlatformParameter rows\n};\n\n#endif // QLOG_UI_PLATFORMSETTINGSDIALOG_H\n"
  },
  {
    "path": "ui/PlatformSettingsDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>PlatformSettingsDialog</class>\n <widget class=\"QDialog\" name=\"PlatformSettingsDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>675</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Platform-specific Settings</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QLabel\" name=\"infoLabel\">\n     <property name=\"text\">\n      <string>The database was exported from a different platform.\nPlease verify or update the following settings.\nYou can leave fields empty and configure them later in Settings.</string>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>true</bool>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTableWidget\" name=\"settingsTable\">\n     <property name=\"editTriggers\">\n      <set>QAbstractItemView::NoEditTriggers</set>\n     </property>\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::NoSelection</enum>\n     </property>\n     <property name=\"columnCount\">\n      <number>2</number>\n     </property>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderVisible\">\n      <bool>false</bool>\n     </attribute>\n     <column>\n      <property name=\"text\">\n       <string>Setting</string>\n      </property>\n     </column>\n     <column>\n      <property name=\"text\">\n       <string>Value</string>\n      </property>\n     </column>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>PlatformSettingsDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/ProfileImageWidget.cpp",
    "content": "#include <QVBoxLayout>\n#include \"ProfileImageWidget.h\"\n#include \"ui_ProfileImageWidget.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.profileimagewidget\");\n\nProfileImageWidget::ProfileImageWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::ProfileImageWidget),\n    imageLabel(new AspectRatioLabel(this)),\n    nam(new QNetworkAccessManager(this)),\n    currentReply(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    QVBoxLayout *layout = new QVBoxLayout(this);\n    imageLabel->setAlignment(Qt::AlignCenter);\n    imageLabel->setMinimumSize(sizeHint());\n    layout->addWidget(imageLabel);\n\n    connect(nam, &QNetworkAccessManager::finished,\n            this, &ProfileImageWidget::processReply);\n}\n\nProfileImageWidget::~ProfileImageWidget()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentReply )\n        currentReply->abort();\n\n    nam->deleteLater();\n    imageLabel->deleteLater();\n\n    delete ui;\n}\n\nvoid ProfileImageWidget::loadImageFromUrl(const QString &urlAddress)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << urlAddress;\n\n    if ( urlAddress.isEmpty() )\n    {\n        imageLabel->clear();\n        imageLabel->setToolTip(\"\");\n        return;\n    }\n\n    if ( currentReply )\n    {\n        qCDebug(runtime) << \"Previous request is still running\";\n        currentReply->abort();\n    }\n\n    QUrl url(urlAddress);\n\n    currentReply = nam->get(QNetworkRequest(url));\n}\n\nvoid ProfileImageWidget::processReply(QNetworkReply *reply)\n{\n    FCT_IDENTIFICATION;\n\n    /* always process one requests per class */\n    currentReply = nullptr;\n\n    int replyStatusCode = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();\n\n    if ( reply->error() != QNetworkReply::NoError\n         || replyStatusCode < 200\n         || replyStatusCode >= 300)\n    {\n        qCDebug(runtime) << \"Download Image error: URL \" << reply->request().url().toString();\n        qCDebug(runtime) << \"Download Image error:\" << reply->errorString();\n        qCDebug(runtime) << \"HTTP Status Code\" << replyStatusCode;\n\n        if ( reply->error() != QNetworkReply::OperationCanceledError )\n        {\n            reply->deleteLater();\n        }\n        return;\n    }\n\n    QByteArray imageData = reply->readAll();\n    QPixmap pixmap;\n\n    pixmap.loadFromData(imageData);\n    imageLabel->setPixmap(pixmap);\n    imageLabel->setScaledContents(true);\n    mimeType = mimeDatabase.mimeTypeForData(imageData);\n\n    if ( mimeType.name().contains(\"image\", Qt::CaseInsensitive))\n    {\n        // QByteArray->QString in arg is due to QT5.12\n        imageLabel->setToolTip(QString(\"<img src='data:%0;base64, %1'>\").arg(mimeType.name(), QString(imageData.toBase64())));\n    }\n\n    reply->deleteLater();\n}\n\nAspectRatioLabel::AspectRatioLabel(QWidget* parent, Qt::WindowFlags f) :\n    QLabel(parent, f)\n{\n}\n\nAspectRatioLabel::~AspectRatioLabel()\n{\n}\n\nvoid AspectRatioLabel::setPixmap(const QPixmap& pm)\n{\n    pixmapWidth = pm.width();\n    pixmapHeight = pm.height();\n\n    updateMargins();\n    QLabel::setPixmap(pm);\n}\n\nvoid AspectRatioLabel::resizeEvent(QResizeEvent* event)\n{\n    updateMargins();\n    QLabel::resizeEvent(event);\n}\n\nvoid AspectRatioLabel::updateMargins()\n{\n    if ( pixmapWidth <= 0 || pixmapHeight <= 0 )\n        return;\n\n    int w = width();\n    int h = height();\n\n    if ( w <= 0 || h <= 0 )\n        return;\n\n    if ( w * pixmapHeight > h * pixmapWidth )\n    {\n        int m = (w - (pixmapWidth * h / pixmapHeight)) / 2;\n        setContentsMargins(m, 0, m, 0);\n    }\n    else\n    {\n        int m = (h - (pixmapHeight * w / pixmapWidth)) / 2;\n        setContentsMargins(0, m, 0, m);\n    }\n}\n"
  },
  {
    "path": "ui/ProfileImageWidget.h",
    "content": "#ifndef QLOG_UI_PROFILEIMAGEWIDGET_H\n#define QLOG_UI_PROFILEIMAGEWIDGET_H\n\n#include <QWidget>\n#include <QLabel>\n#include <QtNetwork>\n#include <QPainter>\n#include <QPaintEvent>\n\nnamespace Ui {\nclass ProfileImageWidget;\n}\n\nclass AspectRatioLabel : public QLabel\n{\n    Q_OBJECT\n\npublic:\n    explicit AspectRatioLabel(QWidget* parent = nullptr,\n                              Qt::WindowFlags f = Qt::WindowFlags());\n    ~AspectRatioLabel();\n\npublic slots:\n    void setPixmap(const QPixmap& pm);\n\nprotected:\n    void resizeEvent(QResizeEvent* event) override;\n\nprivate:\n    void updateMargins();\n\n    int pixmapWidth = 0;\n    int pixmapHeight = 0;\n};\n\nclass ProfileImageWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit ProfileImageWidget(QWidget *parent = nullptr);\n    ~ProfileImageWidget();\n\npublic slots:\n    void loadImageFromUrl(const QString &urlAddress);\n\nprivate slots:\n    void processReply(QNetworkReply* reply);\n\nprivate:\n    Ui::ProfileImageWidget *ui;\n    AspectRatioLabel *imageLabel;\n    QNetworkAccessManager *nam;\n    QNetworkReply *currentReply;\n    QMimeDatabase mimeDatabase;\n    QMimeType mimeType;\n};\n\n#endif // QLOG_UI_PROFILEIMAGEWIDGET_H\n"
  },
  {
    "path": "ui/ProfileImageWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ProfileImageWidget</class>\n <widget class=\"QWidget\" name=\"ProfileImageWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Profile Image</string>\n  </property>\n </widget>\n <resources/>\n <connections/>\n</ui>\n"
  },
  {
    "path": "ui/QSLGalleryDialog.cpp",
    "content": "#include <algorithm>\n#include <QScrollBar>\n#include <QDesktopServices>\n#include <QUrl>\n#include <QFile>\n#include <QApplication>\n#include <QStyle>\n#include <QTimeZone>\n#include <QPainter>\n#include <QStyledItemDelegate>\n#include <QMenu>\n#include <QFileDialog>\n\n#include \"QSLGalleryDialog.h\"\n#include \"ui_QSLGalleryDialog.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.qslgallerydialog\");\n\nclass QSLCardDelegate : public QStyledItemDelegate\n{\npublic:\n    using QStyledItemDelegate::QStyledItemDelegate;\n\n    void paint(QPainter *painter, const QStyleOptionViewItem &option,\n               const QModelIndex &index) const override\n    {\n        painter->save();\n\n        QStyleOptionViewItem opt = option;\n        initStyleOption(&opt, index);\n        opt.text.clear();\n        opt.icon = QIcon();\n        opt.decorationSize = QSize();\n        QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter, opt.widget);\n\n        const QRect rect = option.rect;\n        const int iconW = option.decorationSize.width();\n        const int iconH = option.decorationSize.height();\n        const int textMargin = 4;\n\n        // Draw icon centered horizontally\n        const QIcon icon = index.data(Qt::DecorationRole).value<QIcon>();\n        const int iconX = rect.x() + (rect.width() - iconW) / 2;\n        const int iconY = rect.y() + textMargin;\n        icon.paint(painter, iconX, iconY, iconW, iconH);\n\n        // Text area below icon\n        const int textY = iconY + iconH + textMargin;\n        const QRect textRect(rect.x() + textMargin, textY,\n                             rect.width() - 2 * textMargin, rect.bottom() - textY);\n\n        // Bold callsign\n        const QString callsign = index.data(QSLGalleryDialog::CallsignRole).toString();\n        QFont boldFont = option.font;\n        boldFont.setBold(true);\n        painter->setFont(boldFont);\n        painter->setPen(option.palette.color(QPalette::Text));\n\n        const QFontMetrics boldFm(boldFont);\n        const QString elidedCallsign = boldFm.elidedText(callsign, Qt::ElideRight, textRect.width());\n        painter->drawText(textRect, Qt::AlignHCenter | Qt::AlignTop, elidedCallsign);\n\n        // Normal date below callsign\n        const QString dateStr = index.data(QSLGalleryDialog::DateStringRole).toString();\n        QFont normalFont = option.font;\n        painter->setFont(normalFont);\n\n        const QRect dateRect(textRect.x(), textY + boldFm.height() + 1,\n                             textRect.width(), textRect.height() - boldFm.height());\n        const QFontMetrics normalFm(normalFont);\n        const QString elidedDate = normalFm.elidedText(dateStr, Qt::ElideRight, dateRect.width());\n        painter->drawText(dateRect, Qt::AlignHCenter | Qt::AlignTop, elidedDate);\n\n        // Draw favorite star in the top-right corner of the icon\n        if ( index.data(QSLGalleryDialog::FavoriteRole).toBool() )\n        {\n            QFont starFont = option.font;\n            starFont.setPixelSize(14);\n            painter->setFont(starFont);\n\n            const QString star = QStringLiteral(\"\\u2605\");\n            const int starX = iconX + iconW - 14;\n            const int starY = iconY + 14;\n\n            // Black outline\n            painter->setPen(Qt::black);\n            painter->drawText(starX - 1, starY, star);\n            painter->drawText(starX + 1, starY, star);\n            painter->drawText(starX, starY - 1, star);\n            painter->drawText(starX, starY + 1, star);\n\n            // Yellow star\n            painter->setPen(QColor(0xFF, 0xD7, 0x00));\n            painter->drawText(starX, starY, star);\n        }\n\n        painter->restore();\n    }\n\n    QSize sizeHint(const QStyleOptionViewItem &option,\n                   const QModelIndex &) const override\n    {\n        const int w = option.decorationSize.width() + 20;\n        const int h = option.decorationSize.height() + QFontMetrics(option.font).height() * 2 + 16;\n        return QSize(w, h);\n    }\n};\n\nQSLGalleryDialog::QSLGalleryDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSLGalleryDialog),\n    scrollTimer(new QTimer(this)),\n    tempDir(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    // tree 20%, gallery 80%\n    ui->splitter->setStretchFactor(0, 2);\n    ui->splitter->setStretchFactor(1, 8);\n\n    ui->cardListWidget->setItemDelegate(new QSLCardDelegate(ui->cardListWidget));\n\n    connect(ui->filterTree, &QTreeWidget::currentItemChanged, this, [this]() { filterTreeSelectionChanged(); });\n    connect(ui->cardListWidget, &QListWidget::itemDoubleClicked, this, &QSLGalleryDialog::cardDoubleClicked);\n\n    ui->cardListWidget->setContextMenuPolicy(Qt::CustomContextMenu);\n    connect(ui->cardListWidget, &QWidget::customContextMenuRequested, this, &QSLGalleryDialog::showContextMenu);\n\n    // Lazy loading\n    scrollTimer->setSingleShot(true);\n    scrollTimer->setInterval(150);\n    connect(scrollTimer, &QTimer::timeout, this, &QSLGalleryDialog::loadVisibleThumbnails);\n    connect(ui->cardListWidget->verticalScrollBar(), &QScrollBar::valueChanged, this, [this]() { scrollTimer->start(); });\n    connect(ui->exportFilteredButton, &QPushButton::clicked, this, &QSLGalleryDialog::exportFiltered);\n\n    ui->sortCombo->addItem(tr(\"Date (Newest)\"), SORT_DATE_DESC);\n    ui->sortCombo->addItem(tr(\"Date (Oldest)\"), SORT_DATE_ASC);\n    ui->sortCombo->addItem(tr(\"Callsign (A-Z)\"), SORT_CALLSIGN_ASC);\n    ui->sortCombo->addItem(tr(\"Callsign (Z-A)\"), SORT_CALLSIGN_DESC);\n\n    connect(ui->sortCombo, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [this]() { loadGallery(); });\n\n    searchTimer = new QTimer(this);\n    searchTimer->setSingleShot(true);\n    searchTimer->setInterval(300);\n\n    connect(searchTimer, &QTimer::timeout, this, [this]()\n    {\n        const QString text = ui->searchEdit->text().trimmed().toUpper();\n        int visibleCount = 0;\n\n        for ( int i = 0; i < ui->cardListWidget->count(); ++i )\n        {\n            QListWidgetItem *item = ui->cardListWidget->item(i);\n            const bool match = text.isEmpty() || item->data(CallsignRole).toString().toUpper().contains(text);\n            item->setHidden(!match);\n\n            if ( match )\n                ++visibleCount;\n        }\n\n        ui->statusLabel->setText(tr(\"%n QSL card(s)\", \"\", visibleCount));\n        ui->exportFilteredButton->setEnabled(visibleCount > 0);\n    });\n\n    connect(ui->searchEdit, &QLineEdit::textChanged, this, [this]() { searchTimer->start(); });\n\n    buildFilterTree();\n}\n\nQSLGalleryDialog::~QSLGalleryDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete tempDir;\n    delete ui;\n}\n\nvoid QSLGalleryDialog::buildFilterTree()\n{\n    FCT_IDENTIFICATION;\n\n    ui->filterTree->clear();\n\n    // \"All\" root item\n    QTreeWidgetItem *allItem = new QTreeWidgetItem(ui->filterTree);\n    allItem->setText(0, tr(\"All QSL Cards\"));\n    allItem->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    allItem->setData(0, Qt::UserRole, FILTER_ALL);\n\n    // \"Favorites\" item\n    QTreeWidgetItem *favItem = new QTreeWidgetItem(ui->filterTree);\n    favItem->setText(0, tr(\"Favorites\"));\n    favItem->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    favItem->setData(0, Qt::UserRole, FILTER_FAVORITE);\n\n    const QSLStorage::FilterValues filters = qslStorage.getDistinctFilterValues();\n\n    // \"By Country\" branch\n    QTreeWidgetItem *countryRoot = new QTreeWidgetItem(ui->filterTree);\n    countryRoot->setText(0, tr(\"By Country\"));\n    countryRoot->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    countryRoot->setFlags(countryRoot->flags() & ~Qt::ItemIsSelectable);\n\n    QList<QString> sortedCountries = filters.countries.keys();\n    std::sort(sortedCountries.begin(), sortedCountries.end(), [](const QString &a, const QString &b)\n    {\n        return a.localeAwareCompare(b) < 0;\n    });\n\n    for ( const QString &country : static_cast<const QList<QString>&>(sortedCountries) )\n    {\n        QTreeWidgetItem *item = new QTreeWidgetItem(countryRoot);\n        item->setText(0, country);\n        item->setData(0, Qt::UserRole, FILTER_COUNTRY);\n        item->setData(0, Qt::UserRole + 1, filters.countries.value(country));\n    }\n\n    // \"By Date\" branch (year -> months)\n    QTreeWidgetItem *dateRoot = new QTreeWidgetItem(ui->filterTree);\n    dateRoot->setText(0, tr(\"By Date\"));\n    dateRoot->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    dateRoot->setFlags(dateRoot->flags() & ~Qt::ItemIsSelectable);\n\n    // Iterate years in descending order\n    QStringList years = filters.yearMonths.keys();\n    std::sort(years.begin(), years.end(), std::greater<QString>());\n\n    for ( const QString &year : static_cast<const QStringList&>(years) )\n    {\n        QTreeWidgetItem *yearItem = new QTreeWidgetItem(dateRoot);\n        yearItem->setText(0, year);\n        yearItem->setData(0, Qt::UserRole, FILTER_YEAR);\n        yearItem->setData(0, Qt::UserRole + 1, year);\n\n        const QStringList &months = filters.yearMonths.value(year);\n\n        for ( const QString &month : months )\n        {\n            QTreeWidgetItem *monthItem = new QTreeWidgetItem(yearItem);\n            monthItem->setText(0, month);\n            monthItem->setData(0, Qt::UserRole, FILTER_MONTH);\n            monthItem->setData(0, Qt::UserRole + 1, year);\n            monthItem->setData(0, Qt::UserRole + 2, month);\n        }\n    }\n\n    // \"By Band\" branch\n    QTreeWidgetItem *bandRoot = new QTreeWidgetItem(ui->filterTree);\n    bandRoot->setText(0, tr(\"By Band\"));\n    bandRoot->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    bandRoot->setFlags(bandRoot->flags() & ~Qt::ItemIsSelectable);\n\n    for ( const QString &band : filters.bands )\n    {\n        QTreeWidgetItem *item = new QTreeWidgetItem(bandRoot);\n        item->setText(0, band);\n        item->setData(0, Qt::UserRole, FILTER_BAND);\n        item->setData(0, Qt::UserRole + 1, band);\n    }\n\n    // \"By Mode\" branch\n    QTreeWidgetItem *modeRoot = new QTreeWidgetItem(ui->filterTree);\n    modeRoot->setText(0, tr(\"By Mode\"));\n    modeRoot->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    modeRoot->setFlags(modeRoot->flags() & ~Qt::ItemIsSelectable);\n\n    for ( const QString &mode : filters.modes )\n    {\n        QTreeWidgetItem *item = new QTreeWidgetItem(modeRoot);\n        item->setText(0, mode);\n        item->setData(0, Qt::UserRole, FILTER_MODE);\n        item->setData(0, Qt::UserRole + 1, mode);\n    }\n\n    // \"By Continent\" branch\n    QTreeWidgetItem *contRoot = new QTreeWidgetItem(ui->filterTree);\n    contRoot->setText(0, tr(\"By Continent\"));\n    contRoot->setIcon(0, QApplication::style()->standardIcon(QStyle::SP_DirIcon));\n    contRoot->setFlags(contRoot->flags() & ~Qt::ItemIsSelectable);\n\n    for ( const QString &cont : filters.continents )\n    {\n        QTreeWidgetItem *item = new QTreeWidgetItem(contRoot);\n        item->setText(0, cont);\n        item->setData(0, Qt::UserRole, FILTER_CONTINENT);\n        item->setData(0, Qt::UserRole + 1, cont);\n    }\n\n    // Select \"All\" by default\n    ui->filterTree->setCurrentItem(allItem);\n}\n\nvoid QSLGalleryDialog::filterTreeSelectionChanged()\n{\n    FCT_IDENTIFICATION;\n\n    ui->searchEdit->blockSignals(true);\n    ui->searchEdit->clear();\n    ui->searchEdit->blockSignals(false);\n\n    loadGallery();\n}\n\nvoid QSLGalleryDialog::loadGallery()\n{\n    FCT_IDENTIFICATION;\n\n    const QTreeWidgetItem *current = ui->filterTree->currentItem();\n\n    if ( !current )\n        return;\n\n    const FilterType filter = static_cast<FilterType>(current->data(0, Qt::UserRole).toInt());\n    QList<QSLGalleryItem> items;\n\n    switch ( filter )\n    {\n    case FILTER_ALL:\n        items = qslStorage.getGalleryItems();\n        break;\n\n    case FILTER_FAVORITE:\n        items = qslStorage.getGalleryItemsFavorite();\n        break;\n\n    case FILTER_COUNTRY:\n    {\n        const int dxcc = current->data(0, Qt::UserRole + 1).toInt();\n        items = qslStorage.getGalleryItemsByDxcc(dxcc);\n        break;\n    }\n\n    case FILTER_YEAR:\n    {\n        const QString year = current->data(0, Qt::UserRole + 1).toString();\n        items = qslStorage.getGalleryItemsByYear(year);\n        break;\n    }\n\n    case FILTER_MONTH:\n    {\n        const QString year = current->data(0, Qt::UserRole + 1).toString();\n        const QString month = current->data(0, Qt::UserRole + 2).toString();\n        items = qslStorage.getGalleryItemsByYearMonth(year, month);\n        break;\n    }\n\n    case FILTER_BAND:\n    {\n        const QString band = current->data(0, Qt::UserRole + 1).toString();\n        items = qslStorage.getGalleryItemsByBand(band);\n        break;\n    }\n\n    case FILTER_MODE:\n    {\n        const QString mode = current->data(0, Qt::UserRole + 1).toString();\n        items = qslStorage.getGalleryItemsByMode(mode);\n        break;\n    }\n\n    case FILTER_CONTINENT:\n    {\n        const QString continent = current->data(0, Qt::UserRole + 1).toString();\n        items = qslStorage.getGalleryItemsByContinent(continent);\n        break;\n    }\n    }\n\n    populateItems(items);\n}\n\nvoid QSLGalleryDialog::populateItems(const QList<QSLGalleryItem> &items)\n{\n    FCT_IDENTIFICATION;\n\n    ui->cardListWidget->clear();\n\n    QList<QSLGalleryItem> sorted = items;\n    const SortOrder order = static_cast<SortOrder>(ui->sortCombo->currentData().toInt());\n\n    std::sort(sorted.begin(), sorted.end(), [order](const QSLGalleryItem &a, const QSLGalleryItem &b)\n    {\n        switch ( order )\n        {\n        case SORT_DATE_ASC:\n            return a.startTime < b.startTime;\n        case SORT_CALLSIGN_ASC:\n            return a.callsign.compare(b.callsign, Qt::CaseInsensitive) < 0;\n        case SORT_CALLSIGN_DESC:\n            return a.callsign.compare(b.callsign, Qt::CaseInsensitive) > 0;\n        case SORT_DATE_DESC:\n        default:\n            return a.startTime > b.startTime;\n        }\n    });\n\n    // Create a placeholder pixmap\n    QPixmap placeholder(150, 112);\n    placeholder.fill(QColor(220, 220, 220));\n\n    for ( const QSLGalleryItem &item : sorted )\n    {\n        const QString dateStr = item.startTime.toTimeZone(QTimeZone::utc())\n                                              .toString(locale.formatDateTimeShortWithYYYY());\n\n        QListWidgetItem *listItem = new QListWidgetItem(QIcon(placeholder), QString());\n        listItem->setData(ContactIdRole, static_cast<quint64>(item.contactId));\n        listItem->setData(SourceRole, static_cast<int>(item.source));\n        listItem->setData(NameRole, item.name);\n        listItem->setData(ThumbnailLoadedRole, false);\n        listItem->setData(CallsignRole, item.callsign);\n        listItem->setData(DateStringRole, dateStr);\n        listItem->setData(FavoriteRole, item.favorite);\n\n        ui->cardListWidget->addItem(listItem);\n    }\n\n    ui->statusLabel->setText(tr(\"%n QSL card(s)\", \"\", items.count()));\n    ui->exportFilteredButton->setEnabled(!items.isEmpty());\n\n    // initial thumbnail load\n    QTimer::singleShot(0, this, &QSLGalleryDialog::loadVisibleThumbnails);\n}\n\nvoid QSLGalleryDialog::loadVisibleThumbnails()\n{\n    FCT_IDENTIFICATION;\n\n    const QListWidget *lw = ui->cardListWidget;\n    const int totalCount = lw->count();\n\n    if ( totalCount == 0 )\n        return;\n\n    // Find visible range using viewport geometry\n    const QRect viewportRect = lw->viewport()->rect();\n    const QModelIndex topLeft = lw->indexAt(viewportRect.topLeft());\n    const QModelIndex bottomRight = lw->indexAt(viewportRect.bottomRight());\n\n    int firstVisible = topLeft.isValid() ? topLeft.row() : 0;\n    int lastVisible = bottomRight.isValid() ? bottomRight.row() : totalCount - 1;\n\n    // If bottomRight is invalid, scan forward to find last visible item\n    if ( !bottomRight.isValid() && topLeft.isValid() )\n    {\n        for ( int i = firstVisible; i < totalCount; ++i )\n        {\n            const QRect itemRect = lw->visualItemRect(lw->item(i));\n            if ( !itemRect.intersects(viewportRect) && i > firstVisible )\n            {\n                lastVisible = i - 1;\n                break;\n            }\n            lastVisible = i;\n        }\n    }\n\n    // Add margin for smooth scrolling\n    const int margin = 10;\n    firstVisible = qMax(0, firstVisible - margin);\n    lastVisible = qMin(totalCount - 1, lastVisible + margin);\n\n    qCDebug(runtime) << \"Loading thumbnails\" << firstVisible << \"-\" << lastVisible\n                     << \"of\" << totalCount;\n\n    for ( int i = firstVisible; i <= lastVisible; ++i )\n    {\n        QListWidgetItem *item = lw->item(i);\n\n        if ( item->data(ThumbnailLoadedRole).toBool() )\n            continue;\n\n        const qulonglong contactId = item->data(ContactIdRole).toULongLong();\n        const int source = item->data(SourceRole).toInt();\n        const QString name = item->data(NameRole).toString();\n        const QByteArray data = qslStorage.getQSLData(contactId, source, name);\n\n        if ( !data.isEmpty() )\n        {\n            item->setIcon(QIcon(createThumbnail(data, name)));\n\n            const QMimeType mimeType = mimeDb.mimeTypeForData(data);\n\n            if ( mimeType.name().startsWith(\"image/\") )\n                item->setToolTip(QString(\"<img src='data:%1;base64, %2' width='600'>\")\n                                     .arg(mimeType.name(), QString(data.toBase64())));\n            else\n                item->setToolTip(QString(\"%1 (%2)\").arg(name, mimeType.comment()));\n        }\n\n        item->setData(ThumbnailLoadedRole, true);\n    }\n}\n\nQPixmap QSLGalleryDialog::createThumbnail(const QByteArray &data, const QString &name) const\n{\n    FCT_IDENTIFICATION;\n\n    const QMimeType mimeType = mimeDb.mimeTypeForData(data);\n\n    if ( mimeType.name().startsWith(\"image/\") )\n    {\n        QPixmap pixmap;\n        if ( pixmap.loadFromData(data) )\n            return pixmap.scaled(150, 112, Qt::KeepAspectRatio, Qt::SmoothTransformation);\n    }\n\n    // Non-image file: draw file type label over generic icon\n    QPixmap pixmap(150, 112);\n    pixmap.fill(Qt::transparent);\n\n    QPainter p(&pixmap);\n    const QIcon fileIcon = QApplication::style()->standardIcon(QStyle::SP_FileIcon);\n    fileIcon.paint(&p, 0, 0, 150, 112);\n\n    const QString suffix = QFileInfo(name).suffix().toUpper();\n\n    if ( !suffix.isEmpty() )\n    {\n        QFont font = p.font();\n        font.setPixelSize(18);\n        font.setBold(true);\n        p.setFont(font);\n\n        const QRect textRect(0, 70, 150, 30);\n        p.setPen(Qt::white);\n        p.setBrush(QColor(0, 0, 0, 160));\n        const QFontMetrics fm(font);\n        const int textWidth = fm.horizontalAdvance(suffix) + 10;\n        const int bgX = (150 - textWidth) / 2;\n        p.drawRoundedRect(bgX, 72, textWidth, fm.height() + 4, 3, 3);\n\n        p.setPen(Qt::white);\n        p.drawText(textRect, Qt::AlignCenter, suffix);\n    }\n\n    p.end();\n    return pixmap;\n}\n\nvoid QSLGalleryDialog::cardDoubleClicked(QListWidgetItem *item)\n{\n    FCT_IDENTIFICATION;\n\n    openItem(item);\n}\n\nvoid QSLGalleryDialog::showContextMenu(const QPoint &pos)\n{\n    FCT_IDENTIFICATION;\n\n    QListWidgetItem *item = ui->cardListWidget->itemAt(pos);\n\n    if ( !item )\n        return;\n\n    QMenu menu(this);\n\n    const bool isFav = item->data(FavoriteRole).toBool();\n\n    menu.addAction(isFav ? tr(\"Remove from Favorites\") : tr(\"Add to Favorites\"),\n                   this, [this, item] { toggleFavorite(item); });\n    menu.addSeparator();\n    menu.addAction(tr(\"Open\"),    this, [this, item] { openItem(item); });\n    menu.addAction(tr(\"Save...\"), this, [this, item] { saveItem(item); });\n\n    menu.exec(ui->cardListWidget->viewport()->mapToGlobal(pos));\n}\n\nvoid QSLGalleryDialog::openItem(const QListWidgetItem *item)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !item )\n        return;\n\n    const qulonglong contactId = item->data(ContactIdRole).toULongLong();\n    const int source = item->data(SourceRole).toInt();\n    const QString name = item->data(NameRole).toString();\n    const QByteArray data = qslStorage.getQSLData(contactId, source, name);\n\n    if ( data.isEmpty() )\n    {\n        qCWarning(runtime) << \"No QSL data for\" << contactId << source << name;\n        return;\n    }\n\n    // Create temp dir if needed\n    if ( !tempDir )\n    {\n        tempDir = new QTemporaryDir();\n        if ( !tempDir->isValid() )\n        {\n            qCWarning(runtime) << \"Cannot create temporary directory\";\n            return;\n        }\n    }\n\n    const QString filePath = tempDir->path() + \"/\" + name;\n    QFile file(filePath);\n\n    if ( !file.open(QIODevice::WriteOnly) )\n    {\n        qCWarning(runtime) << \"Cannot write temporary file\" << filePath;\n        return;\n    }\n\n    file.write(data);\n    file.close();\n\n    QDesktopServices::openUrl(QUrl::fromLocalFile(filePath));\n}\n\nvoid QSLGalleryDialog::saveItem(const QListWidgetItem *item)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !item )\n        return;\n\n    const qulonglong contactId = item->data(ContactIdRole).toULongLong();\n    const int source = item->data(SourceRole).toInt();\n    const QString name = item->data(NameRole).toString();\n    const QByteArray data = qslStorage.getQSLData(contactId, source, name);\n\n    if ( data.isEmpty() )\n    {\n        qCDebug(runtime) << \"No QSL data for\" << contactId << source << name;\n        return;\n    }\n\n    const QString savePath = QFileDialog::getSaveFileName(this,\n                                                          tr(\"Save QSL Card\"),\n                                                          QDir::homePath() + \"/\" + name);\n    if ( savePath.isEmpty() )\n        return;\n\n    QFile file(savePath);\n\n    if ( !file.open(QIODevice::WriteOnly) )\n    {\n        qCDebug(runtime) << \"Cannot write file\" << savePath;\n        return;\n    }\n\n    file.write(data);\n    file.close();\n\n    qCDebug(runtime) << \"QSL card saved to\" << savePath;\n}\n\nvoid QSLGalleryDialog::toggleFavorite(QListWidgetItem *item)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !item )\n        return;\n\n    const qulonglong contactId = item->data(ContactIdRole).toULongLong();\n    const QSLObject::SourceType source = static_cast<QSLObject::SourceType>(item->data(SourceRole).toInt());\n    const QString name = item->data(NameRole).toString();\n    const bool currentFav = item->data(FavoriteRole).toBool();\n\n    if ( qslStorage.setFavorite(contactId, source, name, !currentFav) )\n    {\n        item->setData(FavoriteRole, !currentFav);\n        ui->cardListWidget->update();\n    }\n}\n\nvoid QSLGalleryDialog::exportFiltered()\n{\n    FCT_IDENTIFICATION;\n\n    const int count = ui->cardListWidget->count();\n\n    if ( count == 0 )\n        return;\n\n    const QString dir = QFileDialog::getExistingDirectory(this,\n                                                           tr(\"Export QSL Cards\"),\n                                                           QDir::homePath());\n    if ( dir.isEmpty() )\n        return;\n\n    int saved = 0;\n    int visible = 0;\n\n    for ( int i = 0; i < count; ++i )\n    {\n        const QListWidgetItem *item = ui->cardListWidget->item(i);\n\n        if ( item->isHidden() )\n            continue;\n\n        ++visible;\n\n        const qulonglong contactId = item->data(ContactIdRole).toULongLong();\n        const int source = item->data(SourceRole).toInt();\n        const QString name = item->data(NameRole).toString();\n        const QByteArray data = qslStorage.getQSLData(contactId, source, name);\n\n        if ( data.isEmpty() )\n        {\n            qCDebug(runtime) << \"No QSL data for\" << contactId << source << name;\n            continue;\n        }\n\n        const QString filePath = QDir(dir).filePath(name);\n        QFile file(filePath);\n\n        if ( !file.open(QIODevice::WriteOnly) )\n        {\n            qCDebug(runtime) << \"Cannot write file\" << filePath;\n            continue;\n        }\n\n        file.write(data);\n        ++saved;\n    }\n\n    ui->statusLabel->setText(tr(\"Exported %1 of %2 cards\").arg(saved).arg(visible));\n    qCDebug(runtime) << \"Exported\" << saved << \"of\" << visible << \"QSL cards to\" << dir;\n}\n"
  },
  {
    "path": "ui/QSLGalleryDialog.h",
    "content": "#ifndef QLOG_UI_QSLGALLERYDIALOG_H\n#define QLOG_UI_QSLGALLERYDIALOG_H\n\n#include <QDialog>\n#include <QTimer>\n#include <QTemporaryDir>\n#include <QListWidget>\n#include <QMimeDatabase>\n#include \"core/QSLStorage.h\"\n#include \"core/LogLocale.h\"\n\nnamespace Ui {\nclass QSLGalleryDialog;\n}\n\nclass QSLGalleryDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSLGalleryDialog(QWidget *parent = nullptr);\n    ~QSLGalleryDialog();\n\n    // Exposed for delegate access\n    enum ItemDataRole\n    {\n        ContactIdRole = Qt::UserRole,\n        SourceRole = Qt::UserRole + 1,\n        NameRole = Qt::UserRole + 2,\n        ThumbnailLoadedRole = Qt::UserRole + 3,\n        CallsignRole = Qt::UserRole + 4,\n        DateStringRole = Qt::UserRole + 5,\n        FavoriteRole = Qt::UserRole + 6\n    };\n\nprivate slots:\n    void filterTreeSelectionChanged();\n    void cardDoubleClicked(QListWidgetItem *item);\n    void showContextMenu(const QPoint &pos);\n    void loadVisibleThumbnails();\n\nprivate:\n    enum FilterType\n    {\n        FILTER_ALL = 0,\n        FILTER_FAVORITE,\n        FILTER_COUNTRY,\n        FILTER_YEAR,\n        FILTER_MONTH,\n        FILTER_BAND,\n        FILTER_MODE,\n        FILTER_CONTINENT\n    };\n\n    enum SortOrder\n    {\n        SORT_DATE_DESC = 0,\n        SORT_DATE_ASC,\n        SORT_CALLSIGN_ASC,\n        SORT_CALLSIGN_DESC\n    };\n\n    void buildFilterTree();\n    void loadGallery();\n    void populateItems(const QList<QSLGalleryItem> &items);\n    QPixmap createThumbnail(const QByteArray &data, const QString &name) const;\n    void openItem(const QListWidgetItem *item);\n    void saveItem(const QListWidgetItem *item);\n    void toggleFavorite(QListWidgetItem *item);\n    void exportFiltered();\n\n    Ui::QSLGalleryDialog *ui;\n    QSLStorage qslStorage;\n    QTimer *scrollTimer;\n    QTimer *searchTimer;\n    QTemporaryDir *tempDir;\n    LogLocale locale;\n    QMimeDatabase mimeDb;\n};\n\n#endif // QLOG_UI_QSLGALLERYDIALOG_H\n"
  },
  {
    "path": "ui/QSLGalleryDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSLGalleryDialog</class>\n <widget class=\"QDialog\" name=\"QSLGalleryDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>900</width>\n    <height>600</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>QSL Card Gallery</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"topLayout\">\n     <item>\n      <widget class=\"QLineEdit\" name=\"searchEdit\">\n       <property name=\"placeholderText\">\n        <string>Search by callsign...</string>\n       </property>\n       <property name=\"clearButtonEnabled\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"sortLabel\">\n       <property name=\"text\">\n        <string>Sort by:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"sortCombo\"/>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QSplitter\" name=\"splitter\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <widget class=\"QTreeWidget\" name=\"filterTree\">\n      <property name=\"sizePolicy\">\n       <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n        <horstretch>0</horstretch>\n        <verstretch>0</verstretch>\n       </sizepolicy>\n      </property>\n      <property name=\"indentation\">\n       <number>16</number>\n      </property>\n      <property name=\"headerHidden\">\n       <bool>true</bool>\n      </property>\n      <column>\n       <property name=\"text\">\n        <string notr=\"true\">1</string>\n       </property>\n      </column>\n     </widget>\n     <widget class=\"QListWidget\" name=\"cardListWidget\">\n      <property name=\"iconSize\">\n       <size>\n        <width>150</width>\n        <height>112</height>\n       </size>\n      </property>\n      <property name=\"verticalScrollMode\">\n       <enum>QAbstractItemView::ScrollPerPixel</enum>\n      </property>\n      <property name=\"horizontalScrollMode\">\n       <enum>QAbstractItemView::ScrollPerPixel</enum>\n      </property>\n      <property name=\"movement\">\n       <enum>QListView::Static</enum>\n      </property>\n      <property name=\"flow\">\n       <enum>QListView::LeftToRight</enum>\n      </property>\n      <property name=\"resizeMode\">\n       <enum>QListView::Adjust</enum>\n      </property>\n      <property name=\"spacing\">\n       <number>10</number>\n      </property>\n      <property name=\"viewMode\">\n       <enum>QListView::IconMode</enum>\n      </property>\n      <property name=\"uniformItemSizes\">\n       <bool>true</bool>\n      </property>\n      <property name=\"wrapping\" stdset=\"0\">\n       <bool>true</bool>\n      </property>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"bottomLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"statusLabel\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"bottomSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"exportFilteredButton\">\n       <property name=\"text\">\n        <string>Export Filtered</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"document-save-as\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Close</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSLGalleryDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>400</x>\n     <y>580</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>400</x>\n     <y>300</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/QSLImportStatDialog.cpp",
    "content": "#include \"QSLImportStatDialog.h\"\n#include \"ui_QSLImportStatDialog.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.QSLImportStatDialog\");\n\nQSLImportStatDialog::QSLImportStatDialog(const QSLMergeStat &stats,\n                                         QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSLImportStatDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    showStat(stats.updatedQSOs.size() + stats.newQSLs.size(),\n             stats.qsosDownloaded,\n             stats.unmatchedQSLs.size(),\n             stats.errorQSLs.size(),\n             stats.newQSLs.join(\"\\n\"),\n             stats.updatedQSOs.join(\"\\n\"),\n             stats.unmatchedQSLs.join(\"\\n\"));\n}\n\nQSLImportStatDialog::QSLImportStatDialog(const QHash<QString, QSLMergeStat> &stats,\n                                         QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSLImportStatDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    quint64 updated = 0;\n    quint64 downloaded = 0;\n    quint64 unmatched = 0;\n    quint64 errors = 0;\n    QString newQSLText;\n    QString updatedQSLText;\n    QString unmatchedQSLText;\n\n    for (auto i = stats.begin(), end = stats.end(); i != end; ++i)\n    {\n        updated    += (i->updatedQSOs.size() + i->newQSLs.size());\n        downloaded += i->qsosDownloaded;\n        unmatched  += i->unmatchedQSLs.size();\n        errors     += i->errorQSLs.size();\n        if ( !i.value().newQSLs.isEmpty() )\n            newQSLText.append(\"* \" + i.key() + \"\\n\" + i.value().newQSLs.join(\"\\n\") + \"\\n\\n\");\n        if ( !i.value().updatedQSOs.empty() )\n            updatedQSLText.append(\"* \" + i.key() + \"\\n\" + i.value().updatedQSOs.join(\"\\n\") + \"\\n\\n\");\n        if ( !i.value().unmatchedQSLs.isEmpty() )\n            unmatchedQSLText.append(\"* \" + i.key() + \"\\n\" + i.value().unmatchedQSLs.join(\"\\n\") + \"\\n\\n\");\n    }\n\n    showStat(updated, downloaded, unmatched, errors,\n             newQSLText, updatedQSLText, unmatchedQSLText);\n}\n\nvoid QSLImportStatDialog::showStat(const quint64 updated,\n                                   const quint64 downloaded,\n                                   const quint64 unmatched,\n                                   const quint64 errors,\n                                   const QString  &newQSLText,\n                                   const QString  &updatedQSLText,\n                                   const QString  &unmatchedQSLText)\n{\n    FCT_IDENTIFICATION;\n\n    ui->updatedNumber->setText(QString::number(updated));\n    ui->downloadedNumber->setText(QString::number(downloaded));\n    ui->unmatchedNumber->setText(QString::number(unmatched));\n    ui->errorsNumber->setText(QString::number(errors));\n\n    if ( !newQSLText.isEmpty() )\n    {\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->insertPlainText(\"*** \" + tr(\"New QSLs: \") + \"\\n\");\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->insertPlainText(newQSLText);\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->moveCursor(QTextCursor::End);\n    }\n\n    if ( !updatedQSLText.isEmpty() )\n    {\n        ui->detailsText->insertPlainText(\"*** \" + tr(\"Updated QSOs: \") + \"\\n\");\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->insertPlainText(updatedQSLText);\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->moveCursor(QTextCursor::End);\n    }\n\n    if ( !unmatchedQSLText.isEmpty() )\n    {\n        ui->detailsText->insertPlainText(\"*** \" + tr(\"Unmatched QSLs: \") + \"\\n\");\n        ui->detailsText->moveCursor(QTextCursor::End);\n        ui->detailsText->insertPlainText (unmatchedQSLText);\n        ui->detailsText->moveCursor(QTextCursor::End);\n    }\n}\n\nQSLImportStatDialog::~QSLImportStatDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n"
  },
  {
    "path": "ui/QSLImportStatDialog.h",
    "content": "#ifndef QLOG_UI_QSLIMPORTSTATDIALOG_H\n#define QLOG_UI_QSLIMPORTSTATDIALOG_H\n\n#include <QDialog>\n#include <logformat/LogFormat.h>\n\nnamespace Ui {\nclass QSLImportStatDialog;\n}\n\nclass QSLImportStatDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSLImportStatDialog(const QSLMergeStat &stats,\n                                 QWidget *parent = nullptr);\n    explicit QSLImportStatDialog(const QHash<QString, QSLMergeStat> &stats,\n                                 QWidget *parent = nullptr);\n    ~QSLImportStatDialog();\n\nprivate:\n    Ui::QSLImportStatDialog *ui;\n    void showStat(const quint64 updated,\n                  const quint64 downloaded,\n                  const quint64 unmatched,\n                  const quint64 errors,\n                  const QString  &newQSLText,\n                  const QString  &updatedQSLText,\n                  const QString  &unmatchedQSLText);\n};\n\n#endif // QLOG_UI_QSLIMPORTSTATDIALOG_H\n"
  },
  {
    "path": "ui/QSLImportStatDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSLImportStatDialog</class>\n <widget class=\"QDialog\" name=\"QSLImportStatDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>481</width>\n    <height>562</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>QSL Import Summary</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"summaryBox\">\n     <property name=\"title\">\n      <string>Summary</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"downloadedLabel\">\n        <property name=\"text\">\n         <string>Downloaded:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QLabel\" name=\"downloadedNumber\">\n        <property name=\"text\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"updatedLabel\">\n        <property name=\"text\">\n         <string>Updated:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QLabel\" name=\"updatedNumber\">\n        <property name=\"text\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QLabel\" name=\"unmatchedLabel\">\n        <property name=\"text\">\n         <string>Unmatched:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <widget class=\"QLabel\" name=\"unmatchedNumber\">\n        <property name=\"text\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"0\">\n       <widget class=\"QLabel\" name=\"errorsLabel\">\n        <property name=\"text\">\n         <string>Errors:</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"3\" column=\"1\">\n       <widget class=\"QLabel\" name=\"errorsNumber\">\n        <property name=\"text\">\n         <string/>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Details</string>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <widget class=\"QPlainTextEdit\" name=\"detailsText\">\n        <property name=\"readOnly\">\n         <bool>true</bool>\n        </property>\n        <property name=\"textInteractionFlags\">\n         <set>Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Close</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>QSLImportStatDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSLImportStatDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/QSLPrintLabelDialog.cpp",
    "content": "#include \"ui/QSLPrintLabelDialog.h\"\n#include \"ui_QSLPrintLabelDialog.h\"\n\n#include <QDir>\n#include <QFileDialog>\n#include <QFileInfo>\n#include <QFontComboBox>\n#include <QMessageBox>\n#include <QPixmap>\n#include <QPrintDialog>\n#include <QPrinter>\n#include <QSettings>\n#include <QSqlError>\n#include <QSqlQuery>\n#include <QScroller>\n#include <QWheelEvent>\n\n#include \"core/debug.h\"\n#include \"core/LogParam.h\"\n#include \"core/QSOFilterManager.h\"\n#include \"data/StationProfile.h\"\n#include \"models/SqlListModel.h\"\n#include \"data/Data.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.qslprintlabeldialog\");\n\nQSLPrintLabelDialog::QSLPrintLabelDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSLPrintLabelDialog)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    const QList<QWidget*> widgets = findChildren<QWidget*>();\n\n    for ( QWidget *w : widgets )\n        w->blockSignals(true);\n\n    /* Sections start collapsed via maxHeight=0 instead of setVisible(false)\n     * so that their width still contributes to the scroll area's sizeHint */\n    ui->templateSectionContent->setMaximumHeight(0);\n    ui->printOptionsSectionContent->setMaximumHeight(0);\n\n    /* Populate template combo: predefined + Custom */\n    const QList<LabelTemplate> templates = QSLPrintLabelRenderer::predefinedTemplates();\n    for ( const LabelTemplate &tmpl : templates )\n        ui->templateComboBox->addItem(tmpl.name);\n    ui->templateComboBox->addItem(tr(\"Custom\"));\n\n    /* Populate page size combo */\n    ui->pageSizeComboBox->addItem(\"A4\", static_cast<int>(QPageSize::A4));\n    ui->pageSizeComboBox->addItem(\"Letter\", static_cast<int>(QPageSize::Letter));\n\n    /* Populate callsign combo */\n    ui->myCallsignComboBox->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(station_callsign) FROM contacts ORDER BY station_callsign\",\n                                                       \"\",\n                                                       ui->myCallsignComboBox));\n    ui->myCallsignComboBox->setCurrentText(StationProfilesManager::instance()->getCurProfile1().callsign.toUpper());\n\n    /* Populate station profile combo */\n    ui->stationProfileComboBox->addItems(StationProfilesManager::instance()->profileNameList());\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n    int profileIndex = ui->stationProfileComboBox->findText(profile.profileName);\n    ui->stationProfileComboBox->setCurrentIndex( ( profileIndex >= 0 ) ? profileIndex : -1 );\n\n    /* Populate QSL sent combo */\n    populateQSLSentCombo();\n\n    /* Populate user filter combo */\n    ui->userFilterComboBox->setModel(QSOFilterManager::QSOFilterModel(\"\", ui->userFilterComboBox));\n    ui->userFilterCheckBox->setEnabled(ui->userFilterComboBox->count() > 0);\n\n    /* Mono font combo: show only monospaced fonts */\n    ui->monoFontComboBox->setFontFilters(QFontComboBox::MonospacedFonts);\n\n    /* Populate extra column combobox from contacts table columns */\n    populateExtraColumnCombo();\n\n    /* Date edits */\n    ui->startDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->startDateEdit->setDate(QDate::currentDate().addYears(-1));\n    ui->endDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->endDateEdit->setDate(QDate::currentDate());\n\n    /* Section collapse/expand -- toggle maxHeight and arrow direction.\n     * Using maxHeight instead of setVisible keeps the widget in layout\n     * calculations so the scroll area's width is always correct. */\n    connect(ui->filterSectionButton, &QToolButton::toggled, this, [this](bool checked)\n    {\n        ui->filterSectionButton->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow);\n        ui->filterSectionContent->setMaximumHeight(checked ? QWIDGETSIZE_MAX : 0);\n    });\n    connect(ui->templateSectionButton, &QToolButton::toggled, this, [this](bool checked)\n    {\n        ui->templateSectionButton->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow);\n        ui->templateSectionContent->setMaximumHeight(checked ? QWIDGETSIZE_MAX : 0);\n    });\n    connect(ui->printOptionsSectionButton, &QToolButton::toggled, this, [this](bool checked)\n    {\n        ui->printOptionsSectionButton->setArrowType(checked ? Qt::DownArrow : Qt::RightArrow);\n        ui->printOptionsSectionContent->setMaximumHeight(checked ? QWIDGETSIZE_MAX : 0);\n    });\n\n    /* Load persisted settings and refresh data BEFORE connecting signals\n     * to avoid triggering a refresh storm during initialization */\n    loadSettings();\n\n    for ( QWidget *w : widgets )\n        w->blockSignals(false);\n\n    QTimer::singleShot(0, this, &QSLPrintLabelDialog::refreshData);\n\n    QScroller::grabGesture(ui->previewScrollArea->viewport(), QScroller::LeftMouseButtonGesture);\n    ui->previewScrollArea->viewport()->installEventFilter(this);\n}\n\nQSLPrintLabelDialog::~QSLPrintLabelDialog()\n{\n    FCT_IDENTIFICATION;\n\n    saveSettings();\n    delete ui;\n}\n\nvoid QSLPrintLabelDialog::loadSettings()\n{\n    FCT_IDENTIFICATION;\n\n    int templateIndex = LogParam::getQslLabelTemplate();\n\n    if ( templateIndex >= 0 && templateIndex < ui->templateComboBox->count() )\n        ui->templateComboBox->setCurrentIndex(templateIndex);\n\n    ui->footerLeftEdit->setText(LogParam::getQslLabelFooterLeft());\n    ui->footerRightEdit->setText(LogParam::getQslLabelFooterRight());\n    ui->skipSpinBox->setValue(LogParam::getQslLabelSkip());\n\n    zoomPercent = LogParam::getQslLabelZoom();\n    ui->zoomSlider->setValue(zoomPercent);\n    ui->zoomSpinBox->setValue(zoomPercent);\n\n    ui->printBordersCheckBox->setChecked(LogParam::getQslLabelPrintBorders());\n\n    ui->dateFormatEdit->setText(LogParam::getQslLabelDateFormat());\n\n    const QString savedSansFont = LogParam::getQslLabelSansFont();\n    if ( !savedSansFont.isEmpty() )\n        ui->sansFontComboBox->setCurrentFont(QFont(savedSansFont));\n\n    const QString savedMonoFont = LogParam::getQslLabelMonoFont();\n    if ( !savedMonoFont.isEmpty() )\n        ui->monoFontComboBox->setCurrentFont(QFont(savedMonoFont));\n\n    /* extraColumnComboBox is populated in constructor before loadSettings() is called */\n    const QString savedExtraCol = LogParam::getQslLabelExtraColumn();\n    int extraIdx = ui->extraColumnComboBox->findData(savedExtraCol);\n    ui->extraColumnComboBox->setCurrentIndex(extraIdx >= 0 ? extraIdx : 0);\n    ui->columnHeaderEdit->setText(LogParam::getQslLabelExtraColumnHeader());\n    ui->toRadioTextEdit->setText(LogParam::getQslLabelToRadioText());\n    ui->hdrDateEdit->setText(LogParam::getQslLabelHdrDate());\n    ui->hdrTimeEdit->setText(LogParam::getQslLabelHdrTime());\n    ui->hdrBandEdit->setText(LogParam::getQslLabelHdrBand());\n    ui->hdrModeEdit->setText(LogParam::getQslLabelHdrMode());\n    ui->hdrQslEdit->setText(LogParam::getQslLabelHdrQsl());\n    ui->maxRowsSpinBox->setValue(LogParam::getQslLabelMaxRows());\n\n    ui->toRadioSizeSpinBox->setValue(LogParam::getQslLabelFontSizeToRadio());\n    ui->callsignSizeSpinBox->setValue(LogParam::getQslLabelFontSizeCallsign());\n    ui->headerSizeSpinBox->setValue(LogParam::getQslLabelFontSizeHeader());\n    ui->dataSizeSpinBox->setValue(LogParam::getQslLabelFontSizeData());\n\n    /* Load custom template fields from LogParam */\n    int pageSizeIdx = LogParam::getQslLabelCustomPageSize();\n    if ( pageSizeIdx >= 0 && pageSizeIdx < ui->pageSizeComboBox->count() )\n        ui->pageSizeComboBox->setCurrentIndex(pageSizeIdx);\n    ui->colsSpinBox->setValue(LogParam::getQslLabelCustomCols());\n    ui->rowsSpinBox->setValue(LogParam::getQslLabelCustomRows());\n    ui->labelWidthSpinBox->setValue(LogParam::getQslLabelCustomLabelWidth());\n    ui->labelHeightSpinBox->setValue(LogParam::getQslLabelCustomLabelHeight());\n    ui->leftMarginSpinBox->setValue(LogParam::getQslLabelCustomLeftMargin());\n    ui->topMarginSpinBox->setValue(LogParam::getQslLabelCustomTopMargin());\n    ui->hSpacingSpinBox->setValue(LogParam::getQslLabelCustomHSpacing());\n    ui->vSpacingSpinBox->setValue(LogParam::getQslLabelCustomVSpacing());\n\n    /* Apply template fields state based on selected template */\n    const QList<LabelTemplate> templates = QSLPrintLabelRenderer::predefinedTemplates();\n    if ( templateIndex >= 0 && templateIndex < templates.size() )\n    {\n        populateTemplateFields(templates.at(templateIndex));\n        setTemplateFieldsEnabled(false);\n    }\n    else\n    {\n        setTemplateFieldsEnabled(true);\n    }\n}\n\nvoid QSLPrintLabelDialog::saveSettings()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setQslLabelTemplate(ui->templateComboBox->currentIndex());\n    LogParam::setQslLabelFooterLeft(ui->footerLeftEdit->text());\n    LogParam::setQslLabelFooterRight(ui->footerRightEdit->text());\n    LogParam::setQslLabelSkip(ui->skipSpinBox->value());\n    LogParam::setQslLabelZoom(zoomPercent);\n    LogParam::setQslLabelPrintBorders(ui->printBordersCheckBox->isChecked());\n    LogParam::setQslLabelDateFormat(ui->dateFormatEdit->text());\n    LogParam::setQslLabelSansFont(ui->sansFontComboBox->currentFont().family());\n    LogParam::setQslLabelMonoFont(ui->monoFontComboBox->currentFont().family());\n    LogParam::setQslLabelExtraColumn(ui->extraColumnComboBox->currentData().toString());\n    LogParam::setQslLabelExtraColumnHeader(ui->columnHeaderEdit->text());\n    LogParam::setQslLabelToRadioText(ui->toRadioTextEdit->text());\n    LogParam::setQslLabelHdrDate(ui->hdrDateEdit->text());\n    LogParam::setQslLabelHdrTime(ui->hdrTimeEdit->text());\n    LogParam::setQslLabelHdrBand(ui->hdrBandEdit->text());\n    LogParam::setQslLabelHdrMode(ui->hdrModeEdit->text());\n    LogParam::setQslLabelHdrQsl(ui->hdrQslEdit->text());\n    LogParam::setQslLabelMaxRows(ui->maxRowsSpinBox->value());\n    LogParam::setQslLabelFontSizeToRadio(ui->toRadioSizeSpinBox->value());\n    LogParam::setQslLabelFontSizeCallsign(ui->callsignSizeSpinBox->value());\n    LogParam::setQslLabelFontSizeHeader(ui->headerSizeSpinBox->value());\n    LogParam::setQslLabelFontSizeData(ui->dataSizeSpinBox->value());\n\n    /* Save custom template fields */\n    LogParam::setQslLabelCustomPageSize(ui->pageSizeComboBox->currentIndex());\n    LogParam::setQslLabelCustomCols(ui->colsSpinBox->value());\n    LogParam::setQslLabelCustomRows(ui->rowsSpinBox->value());\n    LogParam::setQslLabelCustomLabelWidth(ui->labelWidthSpinBox->value());\n    LogParam::setQslLabelCustomLabelHeight(ui->labelHeightSpinBox->value());\n    LogParam::setQslLabelCustomLeftMargin(ui->leftMarginSpinBox->value());\n    LogParam::setQslLabelCustomTopMargin(ui->topMarginSpinBox->value());\n    LogParam::setQslLabelCustomHSpacing(ui->hSpacingSpinBox->value());\n    LogParam::setQslLabelCustomVSpacing(ui->vSpacingSpinBox->value());\n}\n\nvoid QSLPrintLabelDialog::populateTemplateFields(const LabelTemplate &tmpl)\n{\n    FCT_IDENTIFICATION;\n\n    /* Block signals to avoid triggering customTemplateFieldChanged */\n    ui->pageSizeComboBox->blockSignals(true);\n    ui->colsSpinBox->blockSignals(true);\n    ui->rowsSpinBox->blockSignals(true);\n    ui->labelWidthSpinBox->blockSignals(true);\n    ui->labelHeightSpinBox->blockSignals(true);\n    ui->leftMarginSpinBox->blockSignals(true);\n    ui->topMarginSpinBox->blockSignals(true);\n    ui->hSpacingSpinBox->blockSignals(true);\n    ui->vSpacingSpinBox->blockSignals(true);\n\n    int pageSizeIdx = ui->pageSizeComboBox->findData(static_cast<int>(tmpl.pageSize));\n    if ( pageSizeIdx >= 0 )\n        ui->pageSizeComboBox->setCurrentIndex(pageSizeIdx);\n\n    ui->colsSpinBox->setValue(tmpl.cols);\n    ui->rowsSpinBox->setValue(tmpl.rows);\n    ui->labelWidthSpinBox->setValue(tmpl.labelWidthMm);\n    ui->labelHeightSpinBox->setValue(tmpl.labelHeightMm);\n    ui->leftMarginSpinBox->setValue(tmpl.leftMarginMm);\n    ui->topMarginSpinBox->setValue(tmpl.topMarginMm);\n    ui->hSpacingSpinBox->setValue(tmpl.hSpacingMm);\n    ui->vSpacingSpinBox->setValue(tmpl.vSpacingMm);\n\n    ui->pageSizeComboBox->blockSignals(false);\n    ui->colsSpinBox->blockSignals(false);\n    ui->rowsSpinBox->blockSignals(false);\n    ui->labelWidthSpinBox->blockSignals(false);\n    ui->labelHeightSpinBox->blockSignals(false);\n    ui->leftMarginSpinBox->blockSignals(false);\n    ui->topMarginSpinBox->blockSignals(false);\n    ui->hSpacingSpinBox->blockSignals(false);\n    ui->vSpacingSpinBox->blockSignals(false);\n}\n\nvoid QSLPrintLabelDialog::setTemplateFieldsEnabled(bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    ui->pageSizeComboBox->setEnabled(enabled);\n    ui->colsSpinBox->setEnabled(enabled);\n    ui->rowsSpinBox->setEnabled(enabled);\n    ui->labelWidthSpinBox->setEnabled(enabled);\n    ui->labelHeightSpinBox->setEnabled(enabled);\n    ui->leftMarginSpinBox->setEnabled(enabled);\n    ui->topMarginSpinBox->setEnabled(enabled);\n    ui->hSpacingSpinBox->setEnabled(enabled);\n    ui->vSpacingSpinBox->setEnabled(enabled);\n}\n\nLabelTemplate QSLPrintLabelDialog::buildCustomTemplate() const\n{\n    FCT_IDENTIFICATION;\n\n    LabelTemplate tmpl;\n    tmpl.name = tr(\"Custom\");\n    tmpl.orientation = QPageLayout::Portrait;\n    tmpl.pageSize = static_cast<QPageSize::PageSizeId>(ui->pageSizeComboBox->currentData().toInt());\n    tmpl.cols = ui->colsSpinBox->value();\n    tmpl.rows = ui->rowsSpinBox->value();\n    tmpl.labelWidthMm = ui->labelWidthSpinBox->value();\n    tmpl.labelHeightMm = ui->labelHeightSpinBox->value();\n    tmpl.leftMarginMm = ui->leftMarginSpinBox->value();\n    tmpl.topMarginMm = ui->topMarginSpinBox->value();\n    tmpl.hSpacingMm = ui->hSpacingSpinBox->value();\n    tmpl.vSpacingMm = ui->vSpacingSpinBox->value();\n    return tmpl;\n}\n\nvoid QSLPrintLabelDialog::populateExtraColumnCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->extraColumnComboBox->addItem(tr(\"Empty\"), QString());\n\n    QSqlRecord contactsRecord = QSqlDatabase::database().record(\"contacts\");\n    QList<QPair<QString, QString>> dbFieldItems;\n    for ( int i = LogbookModel::ColumnID::COLUMN_ID; i < LogbookModel::ColumnID::COLUMN_LAST_ELEMENT; ++i )\n    {\n        LogbookModel::ColumnID columnID = static_cast<LogbookModel::ColumnID>(i);\n        const QString translation = LogbookModel::getFieldNameTranslation(columnID);\n        if ( translation.isEmpty() )\n            continue;\n\n        const QString dbField = contactsRecord.fieldName(i);\n        if ( dbField.isEmpty() )\n            continue;\n\n        dbFieldItems.append({translation, dbField});\n    }\n\n    std::sort(dbFieldItems.begin(), dbFieldItems.end(),\n              [](const QPair<QString, QString> &a,\n                 const QPair<QString, QString> &b)\n    {\n        return a.first.localeAwareCompare(b.first) < 0;\n    });\n\n    for ( const QPair<QString, QString> &item : static_cast<const QList<QPair<QString, QString>>&>(dbFieldItems) )\n        ui->extraColumnComboBox->addItem(item.first, item.second);\n}\n\nvoid QSLPrintLabelDialog::populateQSLSentCombo()\n{\n    FCT_IDENTIFICATION;\n    QMapIterator<QString, QString> iter(Data::instance()->qslSentEnum);\n    int iter_index = 0;\n    int value_index = 0;\n    while ( iter.hasNext() )\n    {\n        iter.next();\n        ui->qslSentComboBox->addItem(iter.value(), iter.key());\n        if ( iter.key() == \"Q\" ) // Queued by default\n            value_index = iter_index;\n        iter_index++;\n    }\n    ui->qslSentComboBox->setCurrentIndex(value_index);\n}\n\nvoid QSLPrintLabelDialog::toggleDateRange()\n{\n    FCT_IDENTIFICATION;\n\n    ui->startDateEdit->setEnabled(ui->dateRangeCheckBox->isChecked());\n    ui->endDateEdit->setEnabled(ui->dateRangeCheckBox->isChecked());\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::toggleMyCallsign()\n{\n    FCT_IDENTIFICATION;\n\n    ui->myCallsignComboBox->setEnabled(ui->myCallsignCheckBox->isChecked());\n    if ( ui->myCallsignCheckBox->isChecked() )\n        ui->stationProfileCheckBox->setChecked(false);\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::toggleStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationProfileComboBox->setEnabled(ui->stationProfileCheckBox->isChecked());\n    if ( ui->stationProfileCheckBox->isChecked() )\n    {\n        const StationProfile &selectedStationProfile = StationProfilesManager::instance()->getProfile(ui->stationProfileComboBox->currentText());\n        const QString toolTip = tr(\"QSOs matching this station profile\")\n                                + \"<br/>\"\n                                + selectedStationProfile.toHTMLString();\n        ui->stationProfileComboBox->setToolTip(toolTip);\n\n        ui->myCallsignCheckBox->setChecked(false);\n    }\n    else\n        ui->stationProfileComboBox->setToolTip({});\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::toggleQslSent()\n{\n    FCT_IDENTIFICATION;\n\n    ui->qslSentComboBox->setEnabled(ui->qslSentCheckBox->isChecked());\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::toggleUserFilter()\n{\n    FCT_IDENTIFICATION;\n\n    ui->userFilterComboBox->setEnabled(ui->userFilterCheckBox->isChecked());\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::templateChanged(int index)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << index;\n\n    const QList<LabelTemplate> templates = QSLPrintLabelRenderer::predefinedTemplates();\n\n    if ( index >= 0 && index < templates.size() )\n    {\n        /* Predefined template selected - show values, disable fields */\n        populateTemplateFields(templates.at(index));\n        setTemplateFieldsEnabled(false);\n    }\n    else\n    {\n        /* Custom template - enable fields, load custom values from spinboxes */\n        setTemplateFieldsEnabled(true);\n    }\n\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::skipChanged(int value)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << value;\n\n    renderer.setSkipLabels(value);\n    updatePreview();\n}\n\nvoid QSLPrintLabelDialog::zoomChanged(int value)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << value;\n\n    zoomPercent = value;\n    updatePreview();\n}\n\nvoid QSLPrintLabelDialog::customTemplateFieldChanged()\n{\n    FCT_IDENTIFICATION;\n\n    /* Only respond if Custom template is selected */\n    const QList<LabelTemplate> templates = QSLPrintLabelRenderer::predefinedTemplates();\n    int index = ui->templateComboBox->currentIndex();\n\n    if ( index >= 0 && index < templates.size() )\n        return;\n\n    refreshData();\n}\n\nvoid QSLPrintLabelDialog::resizeEvent(QResizeEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    QWidget::resizeEvent(event);\n    updatePreview();\n}\n\nbool QSLPrintLabelDialog::eventFilter(QObject *obj, QEvent *event)\n{\n    if ( obj == ui->previewScrollArea->viewport() && event->type() == QEvent::Wheel )\n    {\n        QWheelEvent *wheelEvent = dynamic_cast<QWheelEvent *>(event);\n        /*\n         * CRTL + Mouse Wheel\n         *\n         * Zoom In/Out\n         */\n        if ( wheelEvent && wheelEvent->modifiers() & Qt::ControlModifier )\n        {\n            QPoint wheelDelta(wheelEvent->angleDelta());\n            int delta = ( wheelDelta.y() > 0 ) ? 1 : -1;\n            int newZoom = zoomPercent + delta * 5;\n            ui->zoomSpinBox->setValue(newZoom);\n            return true;\n        }\n    }\n    return QDialog::eventFilter(obj, event);\n}\n\nQString QSLPrintLabelDialog::buildWhereClause() const\n{\n    FCT_IDENTIFICATION;\n\n    QStringList where;\n    where << \"1 = 1\";\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n        where << \"(datetime(start_time) BETWEEN datetime(:start_date) AND datetime(:end_date))\";\n\n    if ( ui->myCallsignCheckBox->isChecked() )\n        where << \"upper(station_callsign) = upper(:stationCallsign)\";\n\n    if ( ui->stationProfileCheckBox->isChecked() )\n    {\n        const StationProfile &stProfile = StationProfilesManager::instance()->getProfile(\n            ui->stationProfileComboBox->currentText());\n\n        where << QString(\"EXISTS (\"\n                         \"SELECT 1 FROM station_profiles\"\n                         \" WHERE station_profiles.profile_name = :stationProfileName\"\n                         \" AND %1\"\n                         \")\").arg(stProfile.getContactInnerJoin());\n    }\n\n    if ( ui->qslSentCheckBox->isChecked() )\n        where << \"upper(qsl_sent) = upper(:qslSent)\";\n\n    if ( ui->userFilterCheckBox->isChecked() )\n    {\n        QString filterClause = QSOFilterManager::getWhereClause(ui->userFilterComboBox->currentText());\n        if ( !filterClause.isEmpty() )\n            where << filterClause;\n    }\n\n    return where.join(\" AND \");\n}\n\nvoid QSLPrintLabelDialog::bindWhereClause(QSqlQuery &query) const\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->dateRangeCheckBox->isChecked() )\n    {\n        QDate startDate = ui->startDateEdit->date();\n        QDate endDate = ui->endDateEdit->date();\n\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0))\n        query.bindValue(\":start_date\", startDate.startOfDay());\n        query.bindValue(\":end_date\", endDate.endOfDay());\n#else\n        query.bindValue(\":start_date\", QDateTime(startDate));\n        query.bindValue(\":end_date\", QDateTime(endDate));\n#endif\n    }\n\n    if ( ui->myCallsignCheckBox->isChecked() )\n        query.bindValue(\":stationCallsign\", ui->myCallsignComboBox->currentText());\n\n    if ( ui->stationProfileCheckBox->isChecked() )\n        query.bindValue(\":stationProfileName\", ui->stationProfileComboBox->currentText());\n\n    if ( ui->qslSentCheckBox->isChecked() )\n        query.bindValue(\":qslSent\", ui->qslSentComboBox->currentData().toString());\n}\n\nvoid QSLPrintLabelDialog::buildLabels()\n{\n    FCT_IDENTIFICATION;\n\n    labelsData.clear();\n\n    const QString whereClause = buildWhereClause();\n\n    const QString dateFormat = ui->dateFormatEdit->text().trimmed();\n    const QString effectiveDateFormat = dateFormat.isEmpty() ? \"yyyy-MM-dd\" : dateFormat;\n    const int maxRows = ui->maxRowsSpinBox->value();\n\n    const QString extraCol = ui->extraColumnComboBox->currentData().toString();\n    const QString extraColSelect = extraCol.isEmpty()\n                                   ? QString()\n                                   : QString(\", \\\"%1\\\"\").arg(extraCol);\n\n    const QString sql = QString(\"SELECT start_time, callsign, band, mode, submode, \"\n                          \"qsl_rcvd, lotw_qsl_rcvd, eqsl_qsl_rcvd, dcl_qsl_rcvd\"\n                          \"%1 \"\n                          \"FROM contacts \"\n                          \"WHERE %2 \"\n                          \"ORDER BY callsign COLLATE NOCASE ASC, start_time ASC\")\n                          .arg(extraColSelect, whereClause);\n\n    QSqlQuery query;\n\n    if ( !query.prepare(sql) )\n    {\n        qCWarning(runtime) << \"Cannot prepare QSL label query\" << query.lastError().text();\n        return;\n    }\n\n    bindWhereClause(query);\n\n    if ( !query.exec() )\n    {\n        qCWarning(runtime) << \"Cannot execute QSL label query\" << query.lastError().text();\n        return;\n    }\n\n    QString currentCallsign;\n    QList<QSLLabelData::QsoRow> currentRows;\n\n    while ( query.next() )\n    {\n        const QDateTime startTime = query.value(\"start_time\").toDateTime();\n        const QString callsign = query.value(\"callsign\").toString().toUpper();\n        const QString band = query.value(\"band\").toString().toUpper();\n        const QString mode = query.value(\"mode\").toString().toUpper();\n        const QString submode = query.value(\"submode\").toString().toUpper();\n\n        /* Mode normalization:\n         * - If submode is present and non-empty, use submode\n         * - SSB with USB/LSB submode stays SSB\n         * - Otherwise use mode */\n        QString displayMode;\n        if ( mode == \"SSB\"\n             && ( submode == \"USB\" || submode == \"LSB\" ) )\n        {\n            displayMode = \"SSB\";\n        }\n        else if ( !submode.isEmpty() )\n            displayMode = submode.toUpper();\n        else\n            displayMode = mode.toUpper();\n\n        /* QSL logic: TNX if any *_rcvd == 'Y', else PSE */\n        const QString qslRcvd = query.value(\"qsl_rcvd\").toString().toUpper();\n        const QString lotwRcvd = query.value(\"lotw_qsl_rcvd\").toString().toUpper();\n        const QString eqslRcvd = query.value(\"eqsl_qsl_rcvd\").toString().toUpper();\n        const QString dclRcvd = query.value(\"dcl_qsl_rcvd\").toString().toUpper();\n\n        const QString qslText = ( qslRcvd == \"Y\"\n                                  || lotwRcvd == \"Y\"\n                                  || eqslRcvd == \"Y\"\n                                  || dclRcvd == \"Y\" ) ? \"TNX\" : \"PSE\";\n\n        QSLLabelData::QsoRow row;\n        row.date = startTime.toUTC().toString(effectiveDateFormat);\n        row.time = startTime.toUTC().toString(\"HH:mm\");\n        row.band = band;\n        row.mode = displayMode;\n        row.qsl = qslText;\n        row.extra = extraCol.isEmpty() ? QString() : query.value(extraCol).toString();\n\n        /* Group by callsign, split into chunks of 4 QSOs per label */\n        if ( callsign != currentCallsign )\n        {\n            /* Flush previous callsign's rows */\n            while ( !currentRows.isEmpty() )\n            {\n                QSLLabelData label;\n                label.callsign = currentCallsign;\n                int count = qMin(maxRows, currentRows.size());\n                for ( int i = 0; i < count; ++i )\n                    label.qsos.append(currentRows.takeFirst());\n                labelsData.append(label);\n            }\n            currentCallsign = callsign;\n        }\n\n        currentRows.append(row);\n\n        /* If we have maxRows rows, emit a label */\n        if ( currentRows.size() == maxRows )\n        {\n            QSLLabelData label;\n            label.callsign = currentCallsign;\n            for ( int i = 0; i < maxRows; ++i )\n                label.qsos.append(currentRows.takeFirst());\n            labelsData.append(label);\n        }\n    }\n\n    /* Flush remaining rows for the last callsign */\n    while ( !currentRows.isEmpty() )\n    {\n        QSLLabelData label;\n        label.callsign = currentCallsign;\n        int count = qMin(maxRows, currentRows.size());\n        for ( int i = 0; i < count; ++i )\n            label.qsos.append(currentRows.takeFirst());\n        labelsData.append(label);\n    }\n}\n\nvoid QSLPrintLabelDialog::refreshData()\n{\n    FCT_IDENTIFICATION;\n\n    buildLabels();\n\n    /* Set template on renderer */\n    const QList<LabelTemplate> templates = QSLPrintLabelRenderer::predefinedTemplates();\n    int templateIndex = ui->templateComboBox->currentIndex();\n\n    if ( templateIndex >= 0 && templateIndex < templates.size() )\n        renderer.setTemplate(templates.at(templateIndex));\n    else\n        renderer.setTemplate(buildCustomTemplate());\n\n    renderer.setLabels(labelsData);\n    renderer.setSkipLabels(ui->skipSpinBox->value());\n    currentPage = 0;\n\n    updatePreview();\n}\n\nvoid QSLPrintLabelDialog::updatePreview()\n{\n    FCT_IDENTIFICATION;\n\n    renderer.setFooterLeft(ui->footerLeftEdit->text());\n    renderer.setFooterRight(ui->footerRightEdit->text());\n    renderer.setPrintBorders(ui->printBordersCheckBox->isChecked());\n\n    LabelStyleOptions styleOpts;\n    styleOpts.sansFontFamily = ui->sansFontComboBox->currentFont().family();\n    styleOpts.monoFontFamily = ui->monoFontComboBox->currentFont().family();\n    styleOpts.toRadioFontSize = ui->toRadioSizeSpinBox->value();\n    styleOpts.callsignFontSize = ui->callsignSizeSpinBox->value();\n    styleOpts.headerFontSize = ui->headerSizeSpinBox->value();\n    styleOpts.dataFontSize = ui->dataSizeSpinBox->value();\n    const QString extraCol = ui->extraColumnComboBox->currentText();\n    const QString customHeader = ui->columnHeaderEdit->text().trimmed();\n    styleOpts.extraColumnHeader = (extraCol.isEmpty() || ui->extraColumnComboBox->currentIndex() == 0) ? QString()\n                                  : (customHeader.isEmpty() ? extraCol : customHeader);\n    styleOpts.maxQsoRows = ui->maxRowsSpinBox->value();\n\n    const QString toRadioText = ui->toRadioTextEdit->text().trimmed();\n    if ( !toRadioText.isEmpty() )\n        styleOpts.toRadioText = toRadioText;\n\n    const QString hdrDate = ui->hdrDateEdit->text().trimmed();\n    if ( !hdrDate.isEmpty() )\n        styleOpts.hdrDate = hdrDate;\n\n    const QString hdrTime = ui->hdrTimeEdit->text().trimmed();\n    if ( !hdrTime.isEmpty() )\n        styleOpts.hdrTime = hdrTime;\n\n    const QString hdrBand = ui->hdrBandEdit->text().trimmed();\n    if ( !hdrBand.isEmpty() )\n        styleOpts.hdrBand = hdrBand;\n\n    const QString hdrMode = ui->hdrModeEdit->text().trimmed();\n    if ( !hdrMode.isEmpty() )\n        styleOpts.hdrMode = hdrMode;\n\n    const QString hdrQsl = ui->hdrQslEdit->text().trimmed();\n    if ( !hdrQsl.isEmpty() )\n        styleOpts.hdrQsl = hdrQsl;\n\n    renderer.setStyleOptions(styleOpts);\n\n    int totalPages = renderer.pageCount();\n    int totalLabels = renderer.labelCount();\n\n    bool hasLabels = ( totalLabels > 0 );\n    ui->printButton->setEnabled(hasLabels);\n    ui->exportPdfButton->setEnabled(hasLabels);\n\n    ui->statusLabel->setText(tr(\"Labels: %1 (%2 pages)\")\n                                 .arg(totalLabels)\n                                 .arg(totalPages));\n\n    updatePageNavigation();\n\n    if ( totalPages > 0 && currentPage < totalPages )\n    {\n        QImage pageImage = renderer.renderPage(currentPage);\n\n        /* Calculate scaled width: fit-to-viewport * zoom% */\n        int fitWidth = ui->previewScrollArea->viewport()->width() - 10;\n\n        if ( fitWidth > 0 )\n        {\n            int scaledWidth = fitWidth * zoomPercent / 100;\n            QPixmap pixmap = QPixmap::fromImage(pageImage);\n            ui->previewLabel->setPixmap(pixmap.scaledToWidth(scaledWidth, Qt::SmoothTransformation));\n        }\n        else\n        {\n            ui->previewLabel->setPixmap(QPixmap::fromImage(pageImage));\n        }\n        ui->previewLabel->setAlignment(Qt::AlignCenter);\n    }\n    else\n    {\n        ui->previewLabel->clear();\n        ui->previewLabel->setText(tr(\"No matching QSOs found\"));\n        ui->previewLabel->setAlignment(Qt::AlignCenter);\n    }\n}\n\nvoid QSLPrintLabelDialog::updatePageNavigation()\n{\n    FCT_IDENTIFICATION;\n\n    int totalPages = renderer.pageCount();\n\n    ui->prevPageButton->setEnabled(currentPage > 0);\n    ui->nextPageButton->setEnabled(totalPages > 0 && currentPage < totalPages - 1);\n\n    if ( totalPages > 0 )\n        ui->pageLabel->setText(tr(\"Page %1 of %2\").arg(currentPage + 1).arg(totalPages));\n    else\n        ui->pageLabel->setText(tr(\"Page 0 of 0\"));\n}\n\nvoid QSLPrintLabelDialog::prevPage()\n{\n    FCT_IDENTIFICATION;\n\n    if ( currentPage > 0 )\n    {\n        currentPage--;\n        updatePreview();\n    }\n}\n\nvoid QSLPrintLabelDialog::nextPage()\n{\n    FCT_IDENTIFICATION;\n\n    int totalPages = renderer.pageCount();\n    if ( totalPages > 0 && currentPage < totalPages - 1 )\n    {\n        currentPage++;\n        updatePreview();\n    }\n}\n\nvoid QSLPrintLabelDialog::print()\n{\n    FCT_IDENTIFICATION;\n\n    QPrinter printer(QPrinter::HighResolution);\n    QPrintDialog printDialog(&printer, this);\n\n    if ( printDialog.exec() == QDialog::Accepted )\n    {\n        renderer.printAll(&printer);\n        askAndMarkQslSent();\n    }\n}\n\nvoid QSLPrintLabelDialog::exportPdf()\n{\n    FCT_IDENTIFICATION;\n\n    QSettings settings;\n    const QString lastPath = settings.value(\"qsllabel/last_pdf_path\", QDir::homePath()).toString();\n\n    QString filename = QFileDialog::getSaveFileName(this,\n                                                     tr(\"Export PDF\"),\n                                                     lastPath,\n                                                     tr(\"PDF Files (*.pdf)\"));\n    if ( filename.isEmpty() )\n        return;\n\n    settings.setValue(\"qsllabel/last_pdf_path\", QFileInfo(filename).path());\n\n    QPrinter printer(QPrinter::HighResolution);\n    printer.setOutputFormat(QPrinter::PdfFormat);\n    printer.setOutputFileName(filename);\n\n    renderer.printAll(&printer);\n    askAndMarkQslSent();\n}\n\nvoid QSLPrintLabelDialog::askAndMarkQslSent()\n{\n    FCT_IDENTIFICATION;\n\n    const QMessageBox::StandardButton answer = QMessageBox::question(\n        this,\n        tr(\"Mark as Sent\"),\n        tr(\"Mark printed/exported QSOs as sent?\"),\n        QMessageBox::Yes | QMessageBox::No,\n        QMessageBox::No);\n\n    if ( answer != QMessageBox::Yes )\n        return;\n\n    const QString whereClause = buildWhereClause();\n    const QString sql = QString(\"UPDATE contacts \"\n                                \"SET qsl_sent = 'Y', \"\n                                \"qsl_sdate = strftime('%Y-%m-%d', DATETIME('now', 'utc')) \"\n                                \"WHERE %1\").arg(whereClause);\n\n    QSqlQuery query;\n\n    if ( !query.prepare(sql) )\n    {\n        qCWarning(runtime) << \"Cannot prepare mark-sent query\" << query.lastError().text();\n        return;\n    }\n\n    bindWhereClause(query);\n\n    if ( !query.exec() )\n        qCWarning(runtime) << \"Cannot execute mark-sent query\" << query.lastError().text();\n}\n"
  },
  {
    "path": "ui/QSLPrintLabelDialog.h",
    "content": "#ifndef QLOG_UI_QSLPRINTLABELDIALOG_H\n#define QLOG_UI_QSLPRINTLABELDIALOG_H\n\n#include <QDialog>\n\n#include \"core/LogLocale.h\"\n#include \"core/QSLPrintLabelRenderer.h\"\n\nclass QSqlQuery;\n\nnamespace Ui {\nclass QSLPrintLabelDialog;\n}\n\nclass QSLPrintLabelDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSLPrintLabelDialog(QWidget *parent = nullptr);\n    ~QSLPrintLabelDialog();\n\nprivate slots:\n    void toggleDateRange();\n    void toggleMyCallsign();\n    void toggleStationProfile();\n    void toggleQslSent();\n    void toggleUserFilter();\n    void refreshData();\n    void updatePreview();\n    void prevPage();\n    void nextPage();\n    void print();\n    void exportPdf();\n    void templateChanged(int index);\n    void skipChanged(int value);\n    void zoomChanged(int value);\n    void customTemplateFieldChanged();\n\nprotected:\n    void resizeEvent(QResizeEvent* event) override;\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\nprivate:\n    Ui::QSLPrintLabelDialog *ui;\n    LogLocale locale;\n    QSLPrintLabelRenderer renderer;\n    QList<QSLLabelData> labelsData;\n    int currentPage = 0;\n    int zoomPercent = 100;\n\n    void buildLabels();\n    QString buildWhereClause() const;\n    void bindWhereClause(QSqlQuery &query) const;\n    void askAndMarkQslSent();\n    void updatePageNavigation();\n    void saveSettings();\n    void loadSettings();\n    void populateTemplateFields(const LabelTemplate &tmpl);\n    void setTemplateFieldsEnabled(bool enabled);\n    LabelTemplate buildCustomTemplate() const;\n    void populateExtraColumnCombo();\n    void populateQSLSentCombo();\n};\n\n#endif // QLOG_UI_QSLPRINTLABELDIALOG_H\n"
  },
  {
    "path": "ui/QSLPrintLabelDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSLPrintLabelDialog</class>\n <widget class=\"QDialog\" name=\"QSLPrintLabelDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>1108</width>\n    <height>700</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Print QSL Labels</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"mainVerticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"contentLayout\">\n     <item>\n      <widget class=\"QScrollArea\" name=\"settingsScrollArea\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Expanding\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"frameShape\">\n        <enum>QFrame::NoFrame</enum>\n       </property>\n       <property name=\"verticalScrollBarPolicy\">\n        <enum>Qt::ScrollBarAlwaysOn</enum>\n       </property>\n       <property name=\"horizontalScrollBarPolicy\">\n        <enum>Qt::ScrollBarAlwaysOff</enum>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QAbstractScrollArea::AdjustToContents</enum>\n       </property>\n       <property name=\"widgetResizable\">\n        <bool>true</bool>\n       </property>\n       <widget class=\"QWidget\" name=\"settingsScrollWidget\">\n        <property name=\"geometry\">\n         <rect>\n          <x>0</x>\n          <y>0</y>\n          <width>393</width>\n          <height>1300</height>\n         </rect>\n        </property>\n        <layout class=\"QVBoxLayout\" name=\"settingsScrollLayout\">\n         <property name=\"spacing\">\n          <number>2</number>\n         </property>\n         <property name=\"leftMargin\">\n          <number>4</number>\n         </property>\n         <property name=\"topMargin\">\n          <number>4</number>\n         </property>\n         <property name=\"rightMargin\">\n          <number>4</number>\n         </property>\n         <property name=\"bottomMargin\">\n          <number>4</number>\n         </property>\n         <item>\n          <widget class=\"QToolButton\" name=\"filterSectionButton\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Filter</string>\n           </property>\n           <property name=\"checkable\">\n            <bool>true</bool>\n           </property>\n           <property name=\"checked\">\n            <bool>true</bool>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonTextBesideIcon</enum>\n           </property>\n           <property name=\"arrowType\">\n            <enum>Qt::DownArrow</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QGroupBox\" name=\"filterSectionContent\">\n           <property name=\"title\">\n            <string/>\n           </property>\n           <property name=\"flat\">\n            <bool>true</bool>\n           </property>\n           <layout class=\"QFormLayout\" name=\"formLayout\">\n            <property name=\"leftMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"topMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"rightMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"bottomMargin\">\n             <number>4</number>\n            </property>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"dateRangeCheckBox\">\n              <property name=\"text\">\n               <string>Date Range</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <layout class=\"QHBoxLayout\" name=\"dateRangeLayout\">\n              <item>\n               <widget class=\"QDateEdit\" name=\"startDateEdit\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"sizePolicy\">\n                 <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                  <horstretch>0</horstretch>\n                  <verstretch>0</verstretch>\n                 </sizepolicy>\n                </property>\n                <property name=\"calendarPopup\">\n                 <bool>true</bool>\n                </property>\n               </widget>\n              </item>\n              <item>\n               <widget class=\"QDateEdit\" name=\"endDateEdit\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"sizePolicy\">\n                 <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                  <horstretch>0</horstretch>\n                  <verstretch>0</verstretch>\n                 </sizepolicy>\n                </property>\n                <property name=\"calendarPopup\">\n                 <bool>true</bool>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"myCallsignCheckBox\">\n              <property name=\"text\">\n               <string>My Callsign</string>\n              </property>\n              <property name=\"checked\">\n               <bool>true</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QComboBox\" name=\"myCallsignComboBox\">\n              <property name=\"enabled\">\n               <bool>true</bool>\n              </property>\n              <property name=\"sizeAdjustPolicy\">\n               <enum>QComboBox::AdjustToContents</enum>\n              </property>\n             </widget>\n            </item>\n            <item row=\"2\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"stationProfileCheckBox\">\n              <property name=\"text\">\n               <string>Station Profile</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"2\" column=\"1\">\n             <widget class=\"QComboBox\" name=\"stationProfileComboBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"qslSentCheckBox\">\n              <property name=\"text\">\n               <string>QSL Sent</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"1\">\n             <widget class=\"QComboBox\" name=\"qslSentComboBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item row=\"4\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"userFilterCheckBox\">\n              <property name=\"text\">\n               <string>User Filter</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"4\" column=\"1\">\n             <widget class=\"QComboBox\" name=\"userFilterComboBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"templateSectionButton\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Label Template</string>\n           </property>\n           <property name=\"checkable\">\n            <bool>true</bool>\n           </property>\n           <property name=\"checked\">\n            <bool>false</bool>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonTextBesideIcon</enum>\n           </property>\n           <property name=\"arrowType\">\n            <enum>Qt::RightArrow</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QGroupBox\" name=\"templateSectionContent\">\n           <property name=\"title\">\n            <string/>\n           </property>\n           <property name=\"flat\">\n            <bool>true</bool>\n           </property>\n           <layout class=\"QVBoxLayout\" name=\"templateSectionLayout\">\n            <property name=\"leftMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"topMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"rightMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"bottomMargin\">\n             <number>4</number>\n            </property>\n            <item>\n             <widget class=\"QComboBox\" name=\"templateComboBox\"/>\n            </item>\n            <item>\n             <layout class=\"QFormLayout\" name=\"templateDetailsLayout\">\n              <item row=\"0\" column=\"0\">\n               <widget class=\"QLabel\" name=\"pageSizeLabel\">\n                <property name=\"text\">\n                 <string>Page Size:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\">\n               <widget class=\"QComboBox\" name=\"pageSizeComboBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"0\">\n               <widget class=\"QLabel\" name=\"colsLabel\">\n                <property name=\"text\">\n                 <string>Columns:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QSpinBox\" name=\"colsSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"minimum\">\n                 <number>1</number>\n                </property>\n                <property name=\"maximum\">\n                 <number>10</number>\n                </property>\n               </widget>\n              </item>\n              <item row=\"2\" column=\"0\">\n               <widget class=\"QLabel\" name=\"rowsLabel\">\n                <property name=\"text\">\n                 <string>Rows:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"2\" column=\"1\">\n               <widget class=\"QSpinBox\" name=\"rowsSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"minimum\">\n                 <number>1</number>\n                </property>\n                <property name=\"maximum\">\n                 <number>20</number>\n                </property>\n               </widget>\n              </item>\n              <item row=\"3\" column=\"0\">\n               <widget class=\"QLabel\" name=\"labelWidthLabel\">\n                <property name=\"text\">\n                 <string>Label Width:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"3\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"labelWidthSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>10.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>300.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n              <item row=\"4\" column=\"0\">\n               <widget class=\"QLabel\" name=\"labelHeightLabel\">\n                <property name=\"text\">\n                 <string>Label Height:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"4\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"labelHeightSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>10.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>300.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n              <item row=\"5\" column=\"0\">\n               <widget class=\"QLabel\" name=\"leftMarginLabel\">\n                <property name=\"text\">\n                 <string>Left Margin:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"5\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"leftMarginSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>0.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>100.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n              <item row=\"6\" column=\"0\">\n               <widget class=\"QLabel\" name=\"topMarginLabel\">\n                <property name=\"text\">\n                 <string>Top Margin:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"6\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"topMarginSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>0.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>100.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n              <item row=\"7\" column=\"0\">\n               <widget class=\"QLabel\" name=\"hSpacingLabel\">\n                <property name=\"text\">\n                 <string>H Spacing:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"7\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"hSpacingSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>0.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>50.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n              <item row=\"8\" column=\"0\">\n               <widget class=\"QLabel\" name=\"vSpacingLabel\">\n                <property name=\"text\">\n                 <string>V Spacing:</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"8\" column=\"1\">\n               <widget class=\"BaseDoubleSpinBox\" name=\"vSpacingSpinBox\">\n                <property name=\"enabled\">\n                 <bool>false</bool>\n                </property>\n                <property name=\"suffix\">\n                 <string notr=\"true\"> mm</string>\n                </property>\n                <property name=\"decimals\">\n                 <number>1</number>\n                </property>\n                <property name=\"minimum\">\n                 <double>0.000000000000000</double>\n                </property>\n                <property name=\"maximum\">\n                 <double>50.000000000000000</double>\n                </property>\n                <property name=\"singleStep\">\n                 <double>0.500000000000000</double>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </item>\n           </layout>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QToolButton\" name=\"printOptionsSectionButton\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Label Appearance</string>\n           </property>\n           <property name=\"checkable\">\n            <bool>true</bool>\n           </property>\n           <property name=\"checked\">\n            <bool>false</bool>\n           </property>\n           <property name=\"toolButtonStyle\">\n            <enum>Qt::ToolButtonTextBesideIcon</enum>\n           </property>\n           <property name=\"arrowType\">\n            <enum>Qt::RightArrow</enum>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QGroupBox\" name=\"printOptionsSectionContent\">\n           <property name=\"title\">\n            <string/>\n           </property>\n           <property name=\"flat\">\n            <bool>true</bool>\n           </property>\n           <layout class=\"QFormLayout\" name=\"printOptionsLayout\">\n            <property name=\"horizontalSpacing\">\n             <number>6</number>\n            </property>\n            <property name=\"leftMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"topMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"rightMargin\">\n             <number>0</number>\n            </property>\n            <property name=\"bottomMargin\">\n             <number>0</number>\n            </property>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"printBordersCheckBox\">\n              <property name=\"text\">\n               <string>Print Label Borders</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QLabel\" name=\"maxRowsLabel\">\n              <property name=\"text\">\n               <string>QSOs per Label:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QSpinBox\" name=\"maxRowsSpinBox\">\n              <property name=\"minimum\">\n               <number>1</number>\n              </property>\n              <property name=\"maximum\">\n               <number>10</number>\n              </property>\n              <property name=\"value\">\n               <number>4</number>\n              </property>\n             </widget>\n            </item>\n            <item row=\"2\" column=\"0\">\n             <widget class=\"QLabel\" name=\"footerLeftLabel\">\n              <property name=\"text\">\n               <string>Footer Left Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"2\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"footerLeftEdit\"/>\n            </item>\n            <item row=\"3\" column=\"0\">\n             <widget class=\"QLabel\" name=\"footerRightLabel\">\n              <property name=\"text\">\n               <string>Footer Right Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"footerRightEdit\"/>\n            </item>\n            <item row=\"4\" column=\"0\">\n             <widget class=\"QLabel\" name=\"skipLabelsLabel\">\n              <property name=\"text\">\n               <string>Skip Label:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"4\" column=\"1\">\n             <widget class=\"QSpinBox\" name=\"skipSpinBox\">\n              <property name=\"minimum\">\n               <number>0</number>\n              </property>\n              <property name=\"maximum\">\n               <number>99</number>\n              </property>\n             </widget>\n            </item>\n            <item row=\"5\" column=\"0\">\n             <widget class=\"QLabel\" name=\"sansFontLabel\">\n              <property name=\"text\">\n               <string>Sans Font:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"5\" column=\"1\">\n             <widget class=\"QFontComboBox\" name=\"sansFontComboBox\">\n              <property name=\"editable\">\n               <bool>false</bool>\n              </property>\n              <property name=\"currentText\">\n               <string notr=\"true\">Ubuntu Sans</string>\n              </property>\n              <property name=\"sizeAdjustPolicy\">\n               <enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>\n              </property>\n              <property name=\"minimumContentsLength\">\n               <number>16</number>\n              </property>\n             </widget>\n            </item>\n            <item row=\"6\" column=\"0\">\n             <widget class=\"QLabel\" name=\"monoFontLabel\">\n              <property name=\"text\">\n               <string>Mono Font:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"6\" column=\"1\">\n             <widget class=\"QFontComboBox\" name=\"monoFontComboBox\">\n              <property name=\"editable\">\n               <bool>false</bool>\n              </property>\n              <property name=\"currentText\">\n               <string notr=\"true\">Andale Mono</string>\n              </property>\n              <property name=\"sizeAdjustPolicy\">\n               <enum>QComboBox::AdjustToMinimumContentsLengthWithIcon</enum>\n              </property>\n              <property name=\"minimumContentsLength\">\n               <number>16</number>\n              </property>\n              <property name=\"fontFilters\">\n               <set>QFontComboBox::MonospacedFonts</set>\n              </property>\n             </widget>\n            </item>\n            <item row=\"7\" column=\"0\">\n             <widget class=\"QLabel\" name=\"callsignSizeLabel\">\n              <property name=\"text\">\n               <string>Callsign Size:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"7\" column=\"1\">\n             <widget class=\"BaseDoubleSpinBox\" name=\"callsignSizeSpinBox\">\n              <property name=\"suffix\">\n               <string notr=\"true\"> pt</string>\n              </property>\n              <property name=\"decimals\">\n               <number>1</number>\n              </property>\n              <property name=\"minimum\">\n               <double>4.000000000000000</double>\n              </property>\n              <property name=\"maximum\">\n               <double>72.000000000000000</double>\n              </property>\n              <property name=\"singleStep\">\n               <double>0.500000000000000</double>\n              </property>\n              <property name=\"value\">\n               <double>14.000000000000000</double>\n              </property>\n             </widget>\n            </item>\n            <item row=\"8\" column=\"0\">\n             <widget class=\"QLabel\" name=\"toRadioSizeLabel\">\n              <property name=\"text\">\n               <string>&quot;To Radio&quot; Size:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"8\" column=\"1\">\n             <widget class=\"BaseDoubleSpinBox\" name=\"toRadioSizeSpinBox\">\n              <property name=\"suffix\">\n               <string notr=\"true\"> pt</string>\n              </property>\n              <property name=\"decimals\">\n               <number>1</number>\n              </property>\n              <property name=\"minimum\">\n               <double>4.000000000000000</double>\n              </property>\n              <property name=\"maximum\">\n               <double>72.000000000000000</double>\n              </property>\n              <property name=\"singleStep\">\n               <double>0.500000000000000</double>\n              </property>\n              <property name=\"value\">\n               <double>7.500000000000000</double>\n              </property>\n             </widget>\n            </item>\n            <item row=\"9\" column=\"0\">\n             <widget class=\"QLabel\" name=\"toRadioTextLabel\">\n              <property name=\"text\">\n               <string>&quot;To Radio&quot; Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"9\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"toRadioTextEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">To Radio</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"10\" column=\"0\">\n             <widget class=\"QLabel\" name=\"headerSizeLabel\">\n              <property name=\"text\">\n               <string>Header Size:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"10\" column=\"1\">\n             <widget class=\"BaseDoubleSpinBox\" name=\"headerSizeSpinBox\">\n              <property name=\"suffix\">\n               <string notr=\"true\"> pt</string>\n              </property>\n              <property name=\"decimals\">\n               <number>1</number>\n              </property>\n              <property name=\"minimum\">\n               <double>4.000000000000000</double>\n              </property>\n              <property name=\"maximum\">\n               <double>72.000000000000000</double>\n              </property>\n              <property name=\"singleStep\">\n               <double>0.500000000000000</double>\n              </property>\n              <property name=\"value\">\n               <double>7.000000000000000</double>\n              </property>\n             </widget>\n            </item>\n            <item row=\"11\" column=\"0\">\n             <widget class=\"QLabel\" name=\"dataSizeLabel\">\n              <property name=\"text\">\n               <string>Data Size:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"11\" column=\"1\">\n             <widget class=\"BaseDoubleSpinBox\" name=\"dataSizeSpinBox\">\n              <property name=\"suffix\">\n               <string notr=\"true\"> pt</string>\n              </property>\n              <property name=\"decimals\">\n               <number>1</number>\n              </property>\n              <property name=\"minimum\">\n               <double>4.000000000000000</double>\n              </property>\n              <property name=\"maximum\">\n               <double>72.000000000000000</double>\n              </property>\n              <property name=\"singleStep\">\n               <double>0.500000000000000</double>\n              </property>\n              <property name=\"value\">\n               <double>8.000000000000000</double>\n              </property>\n             </widget>\n            </item>\n            <item row=\"12\" column=\"0\">\n             <widget class=\"QLabel\" name=\"hdrDateLabel\">\n              <property name=\"text\">\n               <string>Date Header Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"12\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"hdrDateEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">Date</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"13\" column=\"0\">\n             <widget class=\"QLabel\" name=\"dateFormatLabel\">\n              <property name=\"text\">\n               <string>Date Format:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"13\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"dateFormatEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">yyyy-MM-dd</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"14\" column=\"0\">\n             <widget class=\"QLabel\" name=\"hdrTimeLabel\">\n              <property name=\"text\">\n               <string>Time Header Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"14\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"hdrTimeEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">Time</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"15\" column=\"0\">\n             <widget class=\"QLabel\" name=\"hdrBandLabel\">\n              <property name=\"text\">\n               <string>Band Header Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"15\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"hdrBandEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">Band</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"16\" column=\"0\">\n             <widget class=\"QLabel\" name=\"hdrModeLabel\">\n              <property name=\"text\">\n               <string>Mode Header Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"16\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"hdrModeEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">Mode</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"17\" column=\"0\">\n             <widget class=\"QLabel\" name=\"hdrQslLabel\">\n              <property name=\"text\">\n               <string>QSL Header Text:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"17\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"hdrQslEdit\">\n              <property name=\"placeholderText\">\n               <string notr=\"true\">QSL</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"18\" column=\"0\">\n             <widget class=\"QLabel\" name=\"extraColumnLabel\">\n              <property name=\"text\">\n               <string>Extra Column:</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"18\" column=\"1\">\n             <widget class=\"QComboBox\" name=\"extraColumnComboBox\">\n              <property name=\"sizeAdjustPolicy\">\n               <enum>QComboBox::AdjustToContents</enum>\n              </property>\n             </widget>\n            </item>\n            <item row=\"19\" column=\"0\">\n             <widget class=\"QLabel\" name=\"columnHeaderLabel\">\n              <property name=\"text\">\n               <string>Extra Column Text</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"19\" column=\"1\">\n             <widget class=\"QLineEdit\" name=\"columnHeaderEdit\">\n              <property name=\"placeholderText\">\n               <string>(DB column name)</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"settingsVerticalSpacer\">\n           <property name=\"orientation\">\n            <enum>Qt::Vertical</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>40</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </widget>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"previewLayout\">\n       <item>\n        <widget class=\"QScrollArea\" name=\"previewScrollArea\">\n         <property name=\"widgetResizable\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"scrollAreaWidget\">\n          <property name=\"geometry\">\n           <rect>\n            <x>0</x>\n            <y>0</y>\n            <width>671</width>\n            <height>568</height>\n           </rect>\n          </property>\n          <layout class=\"QVBoxLayout\" name=\"scrollAreaLayout\">\n           <item>\n            <widget class=\"QLabel\" name=\"previewLabel\">\n             <property name=\"text\">\n              <string>No matching QSOs found</string>\n             </property>\n             <property name=\"alignment\">\n              <set>Qt::AlignCenter</set>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n        </widget>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"zoomLayout\">\n         <item>\n          <widget class=\"QLabel\" name=\"zoomLabel\">\n           <property name=\"text\">\n            <string notr=\"true\">Zoom:</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QSlider\" name=\"zoomSlider\">\n           <property name=\"minimum\">\n            <number>25</number>\n           </property>\n           <property name=\"maximum\">\n            <number>200</number>\n           </property>\n           <property name=\"value\">\n            <number>99</number>\n           </property>\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"tickPosition\">\n            <enum>QSlider::TicksBelow</enum>\n           </property>\n           <property name=\"tickInterval\">\n            <number>25</number>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QSpinBox\" name=\"zoomSpinBox\">\n           <property name=\"suffix\">\n            <string notr=\"true\"> %</string>\n           </property>\n           <property name=\"minimum\">\n            <number>25</number>\n           </property>\n           <property name=\"maximum\">\n            <number>200</number>\n           </property>\n           <property name=\"value\">\n            <number>100</number>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"pageNavLayout\">\n         <item>\n          <spacer name=\"pageNavLeftSpacer\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>40</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"prevPageButton\">\n           <property name=\"enabled\">\n            <bool>false</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>32</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"text\">\n            <string notr=\"true\">&lt;</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"pageLabel\">\n           <property name=\"text\">\n            <string>Page 0 of 0</string>\n           </property>\n           <property name=\"alignment\">\n            <set>Qt::AlignCenter</set>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QPushButton\" name=\"nextPageButton\">\n           <property name=\"enabled\">\n            <bool>false</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>32</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"text\">\n            <string notr=\"true\">&gt;</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <spacer name=\"pageNavRightSpacer\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>40</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"buttonLayout\">\n     <item>\n      <widget class=\"QLabel\" name=\"statusLabel\">\n       <property name=\"text\">\n        <string>Labels: 0 (0 pages)</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"buttonSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"printButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>Print</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"document-print\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Maximum</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"exportPdfButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"text\">\n        <string>Export as PDF</string>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"document-save-as\">\n         <normaloff>.</normaloff>.</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Close</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>BaseDoubleSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/BaseDoubleSpinBox.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections>\n  <connection>\n   <sender>zoomSlider</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>zoomSpinBox</receiver>\n   <slot>setValue(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>1017</x>\n     <y>611</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>1095</x>\n     <y>615</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>zoomSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>zoomSlider</receiver>\n   <slot>setValue(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>1095</x>\n     <y>615</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>1017</x>\n     <y>611</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>1057</x>\n     <y>675</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateRangeCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>toggleDateRange()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>71</x>\n     <y>63</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>toggleMyCallsign()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>69</x>\n     <y>101</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationProfileCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>toggleStationProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>81</x>\n     <y>136</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qslSentCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>toggleQslSent()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>62</x>\n     <y>171</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>toggleUserFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>66</x>\n     <y>206</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>startDateEdit</sender>\n   <signal>dateChanged(QDate)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>212</x>\n     <y>65</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>endDateEdit</sender>\n   <signal>dateChanged(QDate)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>334</x>\n     <y>65</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>273</x>\n     <y>102</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationProfileComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>273</x>\n     <y>137</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qslSentComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>273</x>\n     <y>172</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>273</x>\n     <y>207</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>templateComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>templateChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>206</x>\n     <y>281</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>skipSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>skipChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>819</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>footerLeftEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>749</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>footerRightEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>784</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>prevPageButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>prevPage()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>673</x>\n     <y>636</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>nextPageButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>nextPage()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>846</x>\n     <y>636</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>printButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>print()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>837</x>\n     <y>675</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>exportPdfButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>exportPdf()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>947</x>\n     <y>675</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>zoomSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>zoomChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>1059</x>\n     <y>598</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>printBordersCheckBox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>98</x>\n     <y>679</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateFormatEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1139</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>columnHeaderEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1349</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>toRadioTextEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>997</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hdrDateEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1104</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hdrTimeEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1174</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hdrBandEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1209</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hdrModeEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1244</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hdrQslEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1279</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>maxRowsSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>713</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>extraColumnComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>refreshData()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1314</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>sansFontComboBox</sender>\n   <signal>currentFontChanged(QFont)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>855</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>monoFontComboBox</sender>\n   <signal>currentFontChanged(QFont)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>890</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>toRadioSizeSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>961</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignSizeSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>925</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>headerSizeSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1032</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dataSizeSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>updatePreview()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>290</x>\n     <y>1068</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>pageSizeComboBox</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>317</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>colsSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>352</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rowsSpinBox</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>388</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>labelWidthSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>424</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>labelHeightSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>460</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>leftMarginSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>496</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>topMarginSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>532</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hSpacingSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>568</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>vSpacingSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSLPrintLabelDialog</receiver>\n   <slot>customTemplateFieldChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>256</x>\n     <y>604</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>553</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>toggleDateRange()</slot>\n  <slot>toggleMyCallsign()</slot>\n  <slot>toggleStationProfile()</slot>\n  <slot>toggleQslSent()</slot>\n  <slot>toggleUserFilter()</slot>\n  <slot>refreshData()</slot>\n  <slot>templateChanged(int)</slot>\n  <slot>skipChanged(int)</slot>\n  <slot>updatePreview()</slot>\n  <slot>prevPage()</slot>\n  <slot>nextPage()</slot>\n  <slot>print()</slot>\n  <slot>exportPdf()</slot>\n  <slot>zoomChanged(int)</slot>\n  <slot>customTemplateFieldChanged()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/QSODetailDialog.cpp",
    "content": "#include <QPushButton>\n#include <QSqlRecord>\n#include <QCompleter>\n#include <QKeyEvent>\n#include <QProgressDialog>\n#include <QDesktopServices>\n#include <QMessageBox>\n#include <QMovie>\n\n#include \"QSODetailDialog.h\"\n#include \"ui_QSODetailDialog.h\"\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"PaperQSLDialog.h\"\n#include \"service/eqsl/Eqsl.h\"\n#include \"models/SqlListModel.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/Callsign.h\"\n#include \"data/BandPlan.h\"\n#include \"core/LogParam.h\"\n#include \"component/SmartSearchBox.h\"\n#include \"ModeSelectionController.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.qsodetaildialog\");\n\n#define CHANGECSS \"color: orange;\"\n#define SAVE_BUTTON_TEXT 0\n#define EDIT_BUTTON_TEXT 1\n\nQSODetailDialog::QSODetailDialog(const QSqlRecord &qso,\n                                 QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSODetailDialog),\n    mapper(new QDataWidgetMapper(this)),\n    model(new LogbookModelPrivate(this)),\n    editedRecord(new QSqlRecord(qso)),\n    isMainPageLoaded(false),\n    main_page(new WebEnginePage(this)),\n    layerControlHandler(\"qsodetail\", parent)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    /* model setting */\n    model->setFilter(QString(\"id = '%1'\").arg(qso.value(\"id\").toString()));\n    model->select();\n    connect(model, &QSqlTableModel::beforeUpdate, this, &QSODetailDialog::handleBeforeUpdate);\n\n    /* mapView setting */\n    main_page->setWebChannel(&channel);\n    ui->mapView->setPage(main_page);\n    main_page->load(QUrl(QStringLiteral(\"qrc:/res/map/onlinemap.html\")));\n    ui->mapView->setFocusPolicy(Qt::ClickFocus);\n    connect(ui->mapView, &QWebEngineView::loadFinished, this, &QSODetailDialog::mapLoaded);\n    channel.registerObject(\"layerControlHandler\", &layerControlHandler);\n\n    /* Edit Button */\n    editButton = new QPushButton(getButtonText(EDIT_BUTTON_TEXT));\n    ui->buttonBox->addButton(editButton, QDialogButtonBox::ActionRole);\n    connect(editButton, &QPushButton::clicked, this, &QSODetailDialog::editButtonPressed);\n\n    /* Reset Button */\n    resetButton = new QPushButton(tr(\"&Reset\"));\n    ui->buttonBox->addButton(resetButton, QDialogButtonBox::ActionRole);\n    connect(resetButton, &QPushButton::clicked, this, &QSODetailDialog::resetButtonPressed);\n\n    /* Lookup Button */\n    lookupButton = new QPushButton(tr(\"&Lookup\"));\n    ui->buttonBox->addButton(lookupButton, QDialogButtonBox::ActionRole);\n    connect(lookupButton, &QPushButton::clicked, this, &QSODetailDialog::lookupButtonPressed);\n    lookupButtonMovie = new QMovie(this);\n    lookupButtonMovie->setFileName(\":/icons/loading.gif\");\n    connect(lookupButtonMovie, &QMovie::frameChanged, this, [this]\n    {\n          this->lookupButton->setIcon(this->lookupButtonMovie->currentPixmap());\n    });    lookupButtonWaitingStyle(false);\n\n    /* timeformat for DateTime */\n    ui->dateTimeOnEdit->setDisplayFormat(locale.formatDateShortWithYYYY() + \" \" + locale.formatTimeLongWithoutTZ());\n    ui->dateTimeOffEdit->setDisplayFormat(locale.formatDateShortWithYYYY() + \" \" + locale.formatTimeLongWithoutTZ());\n    ui->qslPaperReceiveDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->qslPaperSentDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->qslEqslSentDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n    ui->qslLotwSentDateEdit->setDisplayFormat(locale.formatDateShortWithYYYY());\n\n    /* Mapper setting */\n    mapper->setModel(model);\n    QSOEditMapperDelegate *QSOitemDelegate = new QSOEditMapperDelegate(mapper);\n    mapper->setItemDelegate(QSOitemDelegate);\n    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);\n    connect(QSOitemDelegate, &QSOEditMapperDelegate::keyEscapePressed, this, &QSODetailDialog::resetKeyPressed);\n\n    /* Callbook Signals registration */\n    connect(&callbookManager, &CallbookManager::callsignResult,\n            this, &QSODetailDialog::callsignFound);\n\n    connect(&callbookManager, &CallbookManager::callsignNotFound,\n            this, &QSODetailDialog::callsignNotFound);\n\n    connect(&callbookManager, &CallbookManager::loginFailed,\n            this, &QSODetailDialog::callbookLoginFailed);\n\n    connect(&callbookManager, &CallbookManager::lookupError,\n            this, &QSODetailDialog::callbookError);\n\n    connect(MembershipQE::instance(), &MembershipQE::clubStatusResult,\n            this, &QSODetailDialog::clubQueryResult);\n\n    /*******************/\n    /* Main Screen GUI */\n    /*******************/\n\n    /* ITU Zones Validators */\n    ui->ituEdit->setValidator(new QIntValidator(Data::getITUZMin(), Data::getITUZMax(), this));\n    ui->myITUEdit->setValidator(new QIntValidator(Data::getITUZMin(), Data::getITUZMax(), this));\n\n    /* CQ Zones Validators */\n    ui->cqEdit->setValidator(new QIntValidator(Data::getCQZMin(), Data::getCQZMax(), this));\n    ui->myCQEdit->setValidator(new QIntValidator(Data::getCQZMin(), Data::getCQZMax(), this));\n\n    /* Submode mapping */\n    modeController.reset(new ModeSelectionController(ui->modeEdit, ui->submodeEdit,\n                                                     true, false, false, false, this));\n    modeController->applyCurrentMode();\n\n    /* IOTA Completer */\n    iotaCompleter.reset(new QCompleter(Data::instance()->iotaIDList(), this));\n    iotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    iotaCompleter->setFilterMode(Qt::MatchContains);\n    iotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->iotaEdit->setCompleter(iotaCompleter.data());\n\n    /* SOTA Completer */\n    sotaCompleter.reset(new QCompleter(Data::instance()->sotaIDList(), this));\n    sotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sotaCompleter->setFilterMode(Qt::MatchStartsWith);\n    sotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->sotaEdit->setCompleter(nullptr);\n\n    /* POTA Completer */\n    potaCompleter.reset(new MultiselectCompleter(Data::instance()->potaIDList(), this));\n    potaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    potaCompleter->setFilterMode(Qt::MatchStartsWith);\n    potaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->potaEdit->setCompleter(nullptr);\n\n    /* WWFF Completer */\n    wwffCompleter.reset(new QCompleter(Data::instance()->wwffIDList(), this));\n    wwffCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    wwffCompleter->setFilterMode(Qt::MatchStartsWith);\n    wwffCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->wwffEdit->setCompleter(nullptr);\n\n    /* MyIOTA Completer */\n    myIotaCompleter.reset(new QCompleter(Data::instance()->iotaIDList(), this));\n    myIotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    myIotaCompleter->setFilterMode(Qt::MatchContains);\n    myIotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->myIOTAEdit->setCompleter(myIotaCompleter.data());\n\n    /* MySOTA Completer */\n    mySotaCompleter.reset(new QCompleter(Data::instance()->sotaIDList(), this));\n    mySotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    mySotaCompleter->setFilterMode(Qt::MatchStartsWith);\n    mySotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->mySOTAEdit->setCompleter(nullptr);\n\n    /* MyPOTA Completer */\n    myPotaCompleter.reset(new QCompleter(Data::instance()->potaIDList(), this));\n    myPotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    myPotaCompleter->setFilterMode(Qt::MatchStartsWith);\n    myPotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->myPOTAEdit->setCompleter(nullptr);\n\n    /* MyWWFF Completer */\n    myWWFFCompleter.reset(new QCompleter(Data::instance()->wwffIDList(), this));\n    myWWFFCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    myWWFFCompleter->setFilterMode(Qt::MatchStartsWith);\n    myWWFFCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->myWWFFEdit->setCompleter(nullptr);\n\n    /* SIF Completer */\n    sigCompleter.reset(new QCompleter(Data::instance()->sigIDList(), this));\n    sigCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sigCompleter->setFilterMode(Qt::MatchStartsWith);\n    sigCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->sigEdit->setCompleter(sigCompleter.data());\n\n    /* Combo Mapping */\n    /* do no use Data::qslPaperSentStatusBox for it because\n     * Data::qslPaperSentStatusBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslPaperSentStatusBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->qslPaperSentStatusBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->qslPaperSentStatusBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->qslPaperSentStatusBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->qslPaperSentStatusBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    /* Combo Mapping */\n    /* do no use Data::qslLotwSentStatusBox for it because\n     * Data::qslLotwSentStatusBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslLotwSentStatusBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->qslLotwSentStatusBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->qslLotwSentStatusBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->qslLotwSentStatusBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->qslLotwSentStatusBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    /* Combo Mapping */\n    /* do no use Data::qslEqslSentStatusBox for it because\n     * Data::qslEqslSentStatusBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslEqslSentStatusBox->addItem(tr(\"No\"), QVariant(\"N\"));\n    ui->qslEqslSentStatusBox->addItem(tr(\"Yes\"), QVariant(\"Y\"));\n    ui->qslEqslSentStatusBox->addItem(tr(\"Requested\"), QVariant(\"R\"));\n    ui->qslEqslSentStatusBox->addItem(tr(\"Queued\"), QVariant(\"Q\"));\n    ui->qslEqslSentStatusBox->addItem(tr(\"Ignored\"), QVariant(\"I\"));\n\n    QMapIterator<QString, QString> iter(Data::instance()->qslRcvdEnum);\n\n    while( iter.hasNext() )\n    {\n        iter.next();\n        ui->qslPaperReceiveStatusBox->addItem(iter.value(), iter.key());\n    }\n\n    /* do no use Data::qslSentViaBox for it because\n     * Data::qslSentViaBox has a different ordering.\n     * Ordering below is optimized for a new Contact Widget only\n     */\n    ui->qslSentViaBox->addItem(\"\", QVariant(\"\"));\n    ui->qslSentViaBox->addItem(tr(\"Bureau\"), QVariant(\"B\"));\n    ui->qslSentViaBox->addItem(tr(\"Direct\"), QVariant(\"D\"));\n    ui->qslSentViaBox->addItem(tr(\"Electronic\"), QVariant(\"E\"));\n\n    /* Propagation */\n    QStringListModel* propagationModeModel = new QStringListModel(Data::instance()->propagationModesList(), this);\n    ui->propagationModeEdit->setModel(propagationModeModel);\n\n    /* Sat Modes & sat names */\n    QSqlTableModel* satModel = new QSqlTableModel(ui->satNameEdit);\n    satModel->setTable(\"sat_info\");\n    QCompleter *satCompleter = new QCompleter(ui->satNameEdit);\n    satCompleter->setModel(satModel);\n    satCompleter->setCompletionColumn(satModel->fieldIndex(\"name\"));\n    satCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    ui->satNameEdit->setCompleter(satCompleter);\n    satModel->select();\n\n    QStringList satModesList = Data::instance()->satModeList();\n    satModesList.prepend(\"\");\n    QStringListModel* satModesModel = new QStringListModel(satModesList, this);\n    ui->satModeEdit->setModel(satModesModel);\n\n    /* Country */\n    ui->countryBox->setModel(new SqlListModel(\"SELECT id, translate_to_locale(name), name  \"\n                                              \"FROM dxcc_entities_clublog \"\n                                              \"ORDER BY 2 COLLATE LOCALEAWARE ASC;\", \" \", ui->countryBox));\n    ui->countryBox->setModelColumn(1);\n    ui->countryBox->adjustMaxSize();\n\n    /* My Country Combo */\n    ui->myCountryBox->setModel(new SqlListModel(\"SELECT id, translate_to_locale(name), name  \"\n                                                \"FROM dxcc_entities_clublog \"\n                                                \"ORDER BY 2 COLLATE LOCALEAWARE ASC;\", \" \", ui->myCountryBox));\n    ui->myCountryBox->setModelColumn(1);\n    ui->myCountryBox->adjustMaxSize();\n\n    /* Band Combos */\n    SqlListModel* bandModel = new SqlListModel(\"SELECT name FROM bands ORDER BY start_freq;\", tr(\"Blank\"), this);\n    while ( bandModel->canFetchMore() )\n    {\n        bandModel->fetchMore();\n    }\n    ui->bandTXCombo->setModel(bandModel);\n    ui->bandRXCombo->setModel(bandModel);\n\n    /* Assign Validators */\n    ui->callsignEdit->setValidator(new QRegularExpressionValidator(Callsign::callsignRegEx(), this));\n    ui->myCallsignEdit->setValidator(new QRegularExpressionValidator(Callsign::callsignRegEx(), this));\n    ui->gridEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridRegEx(), this));\n    ui->myGridEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridRegEx(), this));\n    ui->vuccEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridVUCCRegEx(), this));\n    ui->myVUCCEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridVUCCRegEx(), this));\n    ui->fistsEdit->setValidator(new QIntValidator(0, INT_MAX, ui->fistsEdit));\n    ui->fistsCCEdit->setValidator(new QIntValidator(0, INT_MAX, ui->fistsCCEdit));\n    ui->tentenEdit->setValidator(new QIntValidator(0, INT_MAX, ui->tentenEdit));\n    ui->uksmgEdit->setValidator(new QIntValidator(0, INT_MAX, ui->uksmgEdit));\n\n    /***********/\n    /* Mapping */\n    /***********/\n\n    /* Detail */\n    mapper->addMapping(ui->dateTimeOnEdit, LogbookModel::COLUMN_TIME_ON);\n    mapper->addMapping(ui->dateTimeOffEdit, LogbookModel::COLUMN_TIME_OFF);\n    mapper->addMapping(ui->callsignEdit, LogbookModel::COLUMN_CALL);\n    mapper->addMapping(ui->rstSentEdit, LogbookModel::COLUMN_RST_SENT);\n    mapper->addMapping(ui->rstRcvdEdit, LogbookModel::COLUMN_RST_RCVD);\n    mapper->addMapping(ui->modeEdit, LogbookModel::COLUMN_MODE, \"currentText\");\n    mapper->addMapping(ui->submodeEdit, LogbookModel::COLUMN_SUBMODE, \"currentText\");\n    mapper->addMapping(ui->freqRXEdit, LogbookModel::COLUMN_FREQ_RX);\n    mapper->addMapping(ui->freqTXEdit, LogbookModel::COLUMN_FREQUENCY);\n    mapper->addMapping(ui->bandRXCombo, LogbookModel::COLUMN_BAND_RX);\n    mapper->addMapping(ui->bandTXCombo, LogbookModel::COLUMN_BAND);\n    mapper->addMapping(ui->nameEdit, LogbookModel::COLUMN_NAME_INTL);\n    mapper->addMapping(ui->qthEdit, LogbookModel::COLUMN_QTH_INTL);\n    mapper->addMapping(ui->gridEdit, LogbookModel::COLUMN_GRID);\n    mapper->addMapping(ui->commentEdit, LogbookModel::COLUMN_COMMENT_INTL);\n    mapper->addMapping(ui->contEdit, LogbookModel::COLUMN_CONTINENT, \"currentText\");\n    mapper->addMapping(ui->ituEdit, LogbookModel::COLUMN_ITUZ);\n    mapper->addMapping(ui->cqEdit, LogbookModel::COLUMN_CQZ);\n    mapper->addMapping(ui->stateEdit, LogbookModel::COLUMN_STATE);\n    mapper->addMapping(ui->countyEdit, LogbookModel::COLUMN_COUNTY);\n    mapper->addMapping(ui->ageEdit, LogbookModel::COLUMN_AGE);\n    mapper->addMapping(ui->iotaEdit, LogbookModel::COLUMN_IOTA);\n    mapper->addMapping(ui->sotaEdit, LogbookModel::COLUMN_SOTA_REF);\n    mapper->addMapping(ui->potaEdit, LogbookModel::COLUMN_POTA_REF);\n    mapper->addMapping(ui->sigEdit, LogbookModel::COLUMN_SIG_INTL);\n    mapper->addMapping(ui->sigInfoEdit, LogbookModel::COLUMN_SIG_INFO_INTL);\n    mapper->addMapping(ui->dokEdit, LogbookModel::COLUMN_DARC_DOK);\n    mapper->addMapping(ui->vuccEdit, LogbookModel::COLUMN_VUCC_GRIDS);\n    mapper->addMapping(ui->wwffEdit, LogbookModel::COLUMN_WWFF_REF);\n    mapper->addMapping(ui->countryBox, LogbookModel::COLUMN_DXCC);\n    mapper->addMapping(ui->emailEdit, LogbookModel::COLUMN_EMAIL);\n    mapper->addMapping(ui->urlEdit, LogbookModel::COLUMN_WEB);\n    mapper->addMapping(ui->propagationModeEdit, LogbookModel::COLUMN_PROP_MODE);\n    mapper->addMapping(ui->satNameEdit, LogbookModel::COLUMN_SAT_NAME);\n    mapper->addMapping(ui->satModeEdit,LogbookModel::COLUMN_SAT_MODE);\n    mapper->addMapping(ui->fistsEdit,LogbookModel::COLUMN_FISTS);\n    mapper->addMapping(ui->fistsCCEdit,LogbookModel::COLUMN_FISTS_CC);\n    mapper->addMapping(ui->skccEdit,LogbookModel::COLUMN_SKCC);\n    mapper->addMapping(ui->tentenEdit,LogbookModel::COLUMN_TEN_TEN);\n    mapper->addMapping(ui->uksmgEdit,LogbookModel::COLUMN_UKSMG);\n\n    /* My Station */\n    mapper->addMapping(ui->myCallsignEdit, LogbookModel::COLUMN_STATION_CALLSIGN);\n    mapper->addMapping(ui->myOperatorNameEdit, LogbookModel::COLUMN_MY_NAME_INTL);\n    mapper->addMapping(ui->myCountryBox, LogbookModel::COLUMN_MY_DXCC);\n    mapper->addMapping(ui->myITUEdit, LogbookModel::COLUMN_MY_ITU_ZONE);\n    mapper->addMapping(ui->myCQEdit, LogbookModel::COLUMN_MY_CQ_ZONE);\n    mapper->addMapping(ui->myQTHEdit, LogbookModel::COLUMN_MY_CITY_INTL);\n    mapper->addMapping(ui->myGridEdit, LogbookModel::COLUMN_MY_GRIDSQUARE);\n    mapper->addMapping(ui->mySOTAEdit, LogbookModel::COLUMN_MY_SOTA_REF);\n    mapper->addMapping(ui->myPOTAEdit, LogbookModel::COLUMN_MY_POTA_REF);\n    mapper->addMapping(ui->myIOTAEdit, LogbookModel::COLUMN_MY_IOTA);\n    mapper->addMapping(ui->mySIGEdit, LogbookModel::COLUMN_MY_SIG);\n    mapper->addMapping(ui->mySIGInfoEdit, LogbookModel::COLUMN_MY_SIG_INFO_INTL);\n    mapper->addMapping(ui->myRigEdit, LogbookModel::COLUMN_MY_RIG_INTL);\n    mapper->addMapping(ui->myAntEdit, LogbookModel::COLUMN_MY_ANTENNA_INTL);\n    mapper->addMapping(ui->myVUCCEdit, LogbookModel::COLUMN_MY_VUCC_GRIDS);\n    mapper->addMapping(ui->myWWFFEdit, LogbookModel::COLUMN_MY_WWFF_REF);\n    mapper->addMapping(ui->powerEdit, LogbookModel::COLUMN_TX_POWER);\n    mapper->addMapping(ui->myCountyEdit, LogbookModel::COLUMN_MY_CNTY);\n    mapper->addMapping(ui->myOperatorCallsignEdit, LogbookModel::COLUMN_OPERATOR);\n    mapper->addMapping(ui->myDOKEdit, LogbookModel::COLUMN_MY_DARC_DOK);\n\n    /* Notes */\n    mapper->addMapping(ui->noteEdit, LogbookModel::COLUMN_NOTES_INTL);\n\n    /* QSL */\n    mapper->addMapping(ui->qslPaperSentStatusBox, LogbookModel::COLUMN_QSL_SENT);\n    mapper->addMapping(ui->qslPaperReceiveStatusBox, LogbookModel::COLUMN_QSL_RCVD);\n    mapper->addMapping(ui->qslEqslReceiveDateLabel, LogbookModel::COLUMN_EQSL_QSLRDATE);\n    mapper->addMapping(ui->qslEqslSentDateEdit, LogbookModel::COLUMN_EQSL_QSLSDATE);\n    mapper->addMapping(ui->qslLotwReceiveDateLabel, LogbookModel::COLUMN_LOTW_RCVD_DATE);\n    mapper->addMapping(ui->qslLotwSentDateEdit, LogbookModel::COLUMN_LOTW_SENT_DATE);\n    mapper->addMapping(ui->qslEqslReceiveStatusLabel, LogbookModel::COLUMN_EQSL_QSL_RCVD);\n    mapper->addMapping(ui->qslEqslSentStatusBox, LogbookModel::COLUMN_EQSL_QSL_SENT);\n    mapper->addMapping(ui->qslLotwReceiveStatusLabel, LogbookModel::COLUMN_LOTW_RCVD);\n    mapper->addMapping(ui->qslLotwSentStatusBox, LogbookModel::COLUMN_LOTW_SENT);\n    mapper->addMapping(ui->qslReceivedMsgEdit, LogbookModel::COLUMN_QSLMSG_RCVD, \"text\");\n    mapper->addMapping(ui->qslSentMsgEdit, LogbookModel::COLUMN_QSLMSG_INTL, \"text\");\n    mapper->addMapping(ui->qslSentViaBox, LogbookModel::COLUMN_QSL_SENT_VIA);\n    mapper->addMapping(ui->qslViaEdit, LogbookModel::COLUMN_QSL_VIA);\n    mapper->addMapping(ui->qslPaperReceiveDateEdit, LogbookModel::COLUMN_QSL_RCVD_DATE);\n    mapper->addMapping(ui->qslPaperSentDateEdit, LogbookModel::COLUMN_QSL_SENT_DATE);\n\n    /* Contest */\n    mapper->addMapping(ui->contestIDEdit, LogbookModel::COLUMN_CONTEST_ID);\n    mapper->addMapping(ui->srxEdit, LogbookModel::COLUMN_SRX);\n    mapper->addMapping(ui->srxStringEdit, LogbookModel::COLUMN_SRX_STRING);\n    mapper->addMapping(ui->stxEdit, LogbookModel::COLUMN_STX);\n    mapper->addMapping(ui->stxStringEdit, LogbookModel::COLUMN_STX_STRING);\n\n    /**************/\n    /* Get Record */\n    /**************/\n    //only one record is selected therefore calling toFirst is OK\n\n    blockMappedWidgetSignals(true);\n    mapper->toFirst();\n    blockMappedWidgetSignals(false);\n\n    /* County completer — initialize for the loaded record's DXCC */\n    {\n        const int dxcc = ui->countryBox->currentValue(1).toInt();\n        updateCountyCompleter(dxcc);\n    }\n\n    connect(ui->countryBox, &SmartSearchBox::currentTextChanged,\n            this, [this](const QString &)\n    {\n        updateCountyCompleter(ui->countryBox->currentValue(1).toInt());\n    });\n\n    setReadOnlyMode(true);\n\n    drawDXOnMap(ui->callsignEdit->text(), Gridsquare(ui->gridEdit->text()));\n    drawMyQTHOnMap(ui->myCallsignEdit->text(), Gridsquare(ui->myGridEdit->text()));\n    setStaticMapTime(ui->dateTimeOnEdit->dateTime());\n    refreshDXStatTabs();\n\n    queryMemberList();\n\n    enableWidgetChangeHandlers();\n}\n\nvoid QSODetailDialog::accept()\n{\n    FCT_IDENTIFICATION;\n\n    if (editButton->text() == getButtonText(SAVE_BUTTON_TEXT) )\n    {\n        QMessageBox::StandardButton reply;\n        reply = QMessageBox::question(this, tr(\"Submit changes\"), tr(\"Really submit all changes?\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if (reply == QMessageBox::Yes)\n        {\n            QSODetailDialog::SubmitError error = submitAllChanges();\n            if ( error == QSODetailDialog::SubmitMapperError\n                 || error == QSODetailDialog::SubmitModelError )\n            {\n                QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Cannot save all changes - internal error\"));\n            }\n        }\n    }\n\n    callbookManager.abortQuery();\n\n    done(QDialog::Accepted);\n}\n\nvoid QSODetailDialog::keyPressEvent(QKeyEvent *evt)\n{\n    FCT_IDENTIFICATION;\n\n    /* suppress Enter press because it automatically save all changes */\n    if( evt->key() == Qt::Key_Enter\n        || evt->key() == Qt::Key_Return )\n    {\n        return;\n    }\n    QDialog::keyPressEvent(evt);\n}\n\nQSODetailDialog::~QSODetailDialog()\n{\n    FCT_IDENTIFICATION;\n\n    delete editedRecord;\n    delete ui;\n}\n\nvoid QSODetailDialog::editButtonPressed()\n{\n    FCT_IDENTIFICATION;\n\n    if ( editButton->text() == getButtonText(SAVE_BUTTON_TEXT) )\n    {\n        QSODetailDialog::SubmitError error = submitAllChanges();\n        if ( error == QSODetailDialog::SubmitCancelledByUser )\n        {\n            /* an user wants to fix invalid fields, edit mode remains active */\n            return;\n        }\n        else if ( error == QSODetailDialog::SubmitMapperError\n                  || error == QSODetailDialog::SubmitModelError )\n        {\n            QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Cannot save all changes - try to reset all changes\"));\n            /* edit mode remains active to fix a possible problem */\n            return;\n        }\n\n        setReadOnlyMode(true);\n    }\n    else\n    {\n        setReadOnlyMode(false);\n        /* Re-set completer — Qt loses the completer connection after setReadOnly(true/false) cycle */\n        updateCountyCompleter(ui->countryBox->currentValue(1).toInt());\n        timeLockDiff = ui->dateTimeOnEdit->dateTime().msecsTo(ui->dateTimeOffEdit->dateTime());\n        freqLockDiff = ui->freqTXEdit->value() -  ui->freqRXEdit->value();\n    }\n}\n\nvoid QSODetailDialog::resetButtonPressed()\n{\n    FCT_IDENTIFICATION;\n\n    blockMappedWidgetSignals(true);\n    mapper->revert();\n    blockMappedWidgetSignals(false);\n\n    queryMemberList();\n\n    setReadOnlyMode(true);\n    doValidation();\n}\n\nvoid QSODetailDialog::lookupButtonPressed()\n{\n    FCT_IDENTIFICATION;\n\n    callbookLookupStart();\n    callbookManager.queryCallsign(ui->callsignEdit->text());\n}\n\n/* called when qdatawidgetmapper reverts a widget value by pressing ESC */\nvoid QSODetailDialog::resetKeyPressed(QObject *inObject)\n{\n    FCT_IDENTIFICATION;\n\n    QWidget *widget = qobject_cast<QWidget*>(inObject);\n    if ( widget )\n    {\n        // datawidgetmapper resets a value when ESC is pressed\n        // therefore it is needed to reset stylesheet when resetKey (ESC) is pressed\n        widget->setStyleSheet(\"\");\n    }\n}\n\nvoid QSODetailDialog::setReadOnlyMode(bool inReadOnly)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << inReadOnly;\n\n    for ( int i = 0; i < LogbookModel::COLUMN_LAST_ELEMENT; i++)\n    {\n        QWidget *widget = mapper->mappedWidgetAt(i);\n\n        if ( !widget ) continue;\n\n        if ( QLineEdit *line = qobject_cast<QLineEdit*>(widget) )\n        {\n            line->setReadOnly(inReadOnly);\n            if ( inReadOnly )\n            {\n                line->setStyleSheet(\"\");\n            }\n        }\n        else if ( QTextEdit *edit = qobject_cast<QTextEdit*>(widget) )\n        {\n            edit->setReadOnly(inReadOnly);\n            if ( inReadOnly )\n            {\n                edit->setStyleSheet(\"\");\n            }\n        }\n        else if ( QDoubleSpinBox *spin = qobject_cast<QDoubleSpinBox*>(widget) )\n        {\n            spin->setReadOnly(inReadOnly);\n            if ( inReadOnly )\n            {\n                spin->setStyleSheet(\"\");\n            }\n        }\n        else if ( QDateTimeEdit *datetime = qobject_cast<QDateTimeEdit*>(widget) )\n        {\n            datetime->setReadOnly(inReadOnly);\n            if ( inReadOnly )\n            {\n                datetime->setStyleSheet(\"\");\n            }\n        }\n        else if ( qobject_cast<QLabel*>(widget) )\n        {\n            //do nothing - naturally readonly\n        }\n        else if ( QComboBox *combo = qobject_cast<QComboBox*>(widget) )\n        {\n            combo->setEnabled(!inReadOnly);\n            if ( inReadOnly )\n            {\n                combo->setStyleSheet(\"\");\n            }\n        }\n        else if ( widget )\n        {\n            widget->setEnabled(!inReadOnly);\n            if ( inReadOnly )\n            {\n                widget->setStyleSheet(\"\");\n            }\n        }\n    }\n\n    if ( ui->propagationModeEdit->currentText() != Data::instance()->propagationModeIDToText(\"SAT\") )\n    {\n        /* Do not enable sat fields when SAT prop is not selected */\n        ui->satModeEdit->setCurrentIndex(-1);\n        ui->satNameEdit->clear();\n        ui->satModeEdit->setEnabled(false);\n        ui->satNameEdit->setEnabled(false);\n    }\n    else\n    {\n        ui->satNameEdit->setEnabled(true);\n    }\n\n    editButton->setText((( inReadOnly) ? getButtonText(EDIT_BUTTON_TEXT)\n                                       : getButtonText(SAVE_BUTTON_TEXT) ));\n\n    ui->timeLockButton->setEnabled(!inReadOnly);\n    ui->freqLockButton->setEnabled(!inReadOnly);\n    resetButton->setEnabled(!inReadOnly);\n\n    lookupButton->setEnabled(!inReadOnly && callbookManager.isActive());\n\n    if ( ui->qslEqslReceiveStatusLabel->property(\"originvalue\").toString() != \"Y\" )\n    {\n        ui->qslEqslPicButton->setEnabled(false);\n    }\n\n    setWindowTitle( (inReadOnly)? tr(\"QSO Detail\") : tr(\"Edit QSO\"));\n}\n\nvoid QSODetailDialog::modeChanged(QString)\n{\n    FCT_IDENTIFICATION;\n\n    if ( modeController.isNull() )\n        return;\n\n    modeController->applyCurrentMode();\n\n    queryMemberList();\n}\n\nvoid QSODetailDialog::showPaperButton()\n{\n    FCT_IDENTIFICATION;\n    PaperQSLDialog dialog(*editedRecord);\n    dialog.exec();\n}\n\nvoid QSODetailDialog::showEQSLButton()\n{\n    FCT_IDENTIFICATION;\n\n    QProgressDialog* dialog = new QProgressDialog(tr(\"Downloading eQSL Image\"), tr(\"Cancel\"), 0, 0, this);\n    dialog->setWindowModality(Qt::WindowModal);\n    dialog->setRange(0, 0);\n    dialog->setAutoClose(true);\n    dialog->show();\n\n    EQSLQSLDownloader *eQSL = new EQSLQSLDownloader(dialog);\n\n    connect(eQSL, &EQSLQSLDownloader::QSLImageFound, this, [dialog, eQSL](QString imgFile)\n    {\n        dialog->done(0);\n        QDesktopServices::openUrl(QUrl::fromLocalFile(imgFile));\n        eQSL->deleteLater();\n    });\n\n    connect(eQSL, &EQSLQSLDownloader::QSLImageError, this, [this, dialog, eQSL](const QString &error)\n    {\n        dialog->done(1);\n        QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"eQSL Download Image failed: \") + error);\n        eQSL->deleteLater();\n    });\n\n    connect(dialog, &QProgressDialog::canceled, this, [eQSL]()\n    {\n        qCDebug(runtime)<< \"Operation canceled\";\n        eQSL->abortDownload();\n        eQSL->deleteLater();\n    });\n\n    eQSL->getQSLImage(*editedRecord);\n}\n\nvoid QSODetailDialog::dateTimeOnChanged(const QDateTime &timeOn)\n{\n    FCT_IDENTIFICATION;\n\n    ui->dateTimeOffEdit->blockSignals(true);\n\n    if ( ui->timeLockButton->isChecked() )\n    {\n        ui->dateTimeOffEdit->setDateTime(timeOn.addMSecs(timeLockDiff));\n        ui->dateTimeOffEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n    else if ( ui->dateTimeOffEdit->dateTime() < timeOn )\n    {\n        ui->dateTimeOffEdit->setDateTime(timeOn);\n        ui->dateTimeOffEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n\n    ui->dateTimeOffEdit->blockSignals(false);\n}\n\nvoid QSODetailDialog::dateTimeOffChanged(const QDateTime &timeOff)\n{\n    FCT_IDENTIFICATION;\n\n    ui->dateTimeOnEdit->blockSignals(true);\n\n    if ( ui->timeLockButton->isChecked() )\n    {\n        ui->dateTimeOnEdit->setDateTime(timeOff.addMSecs(-timeLockDiff));\n        ui->dateTimeOnEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n    else if ( ui->dateTimeOnEdit->dateTime() > timeOff )\n    {\n        ui->dateTimeOnEdit->setDateTime(timeOff);\n        ui->dateTimeOnEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n\n    ui->dateTimeOnEdit->blockSignals(false);\n}\n\nvoid QSODetailDialog::freqTXChanged(double)\n{\n    FCT_IDENTIFICATION;\n\n    ui->freqRXEdit->blockSignals(true);\n\n    if ( ui->freqLockButton->isChecked()\n         && ui->freqRXEdit->value() != 0.0 )\n    {\n        double shiftedRX = ui->freqTXEdit->value() - freqLockDiff;\n        ui->freqRXEdit->setValue((shiftedRX < 0.0) ? 0.0 : shiftedRX);\n        ui->freqRXEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n\n    ui->freqRXEdit->blockSignals(false);\n\n    // TODO: qlog should call queryMemberList but for saving time we will omit it.\n    // queryMemberList();\n}\n\nvoid QSODetailDialog::freqRXChanged(double)\n{\n    FCT_IDENTIFICATION;\n\n    ui->freqTXEdit->blockSignals(true);\n\n    if ( ui->freqLockButton->isChecked() )\n    {\n        double shiftedTX = ui->freqRXEdit->value() + freqLockDiff;\n        ui->freqTXEdit->setValue((shiftedTX < 0.0) ? 0.0 : shiftedTX);\n        ui->freqTXEdit->setStyleSheet(CHANGECSS); //change handles are off, mark field as \"changed\" manually\n    }\n\n    ui->freqTXEdit->blockSignals(false);\n}\n\nvoid QSODetailDialog::timeLockToggled(bool toggled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << toggled;\n\n    if ( toggled )\n    {\n        if ( ui->dateTimeOffEdit->dateTime() < ui->dateTimeOnEdit->dateTime() )\n        {\n            ui->dateTimeOffEdit->blockSignals(true);\n            ui->dateTimeOffEdit->setDateTime(ui->dateTimeOnEdit->dateTime());\n            ui->dateTimeOffEdit->blockSignals(false);\n            timeLockDiff =  0;\n        }\n        else\n        {\n            timeLockDiff = ui->dateTimeOnEdit->dateTime().msecsTo(ui->dateTimeOffEdit->dateTime());\n        }\n    }\n}\n\nvoid QSODetailDialog::freqLockToggled(bool toggled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << toggled;\n\n    if ( toggled )\n    {\n        freqLockDiff = ui->freqTXEdit->value() - ui->freqRXEdit->value();\n    }\n}\n\nvoid QSODetailDialog::callsignChanged(const QString &)\n{\n    FCT_IDENTIFICATION;\n\n    refreshDXStatTabs();\n}\n\nvoid QSODetailDialog::callsignEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    queryMemberList();\n}\n\nvoid QSODetailDialog::queryMemberList()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->callsignEdit->text().size() >= 3 )\n    {\n        MembershipQE::instance()->asyncQueryDetails(ui->callsignEdit->text(),\n                                                    BandPlan::freq2Band(ui->freqTXEdit->value()).name,\n                                                    ui->modeEdit->currentText());\n    }\n}\n\nvoid QSODetailDialog::propagationModeChanged(const QString &propModeText)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << propModeText;\n\n    if ( propModeText == Data::instance()->propagationModeIDToText(\"SAT\") )\n    {\n        ui->satModeEdit->setEnabled(true);\n        ui->satNameEdit->setEnabled(true);\n    }\n    else\n    {\n        ui->satModeEdit->setCurrentIndex(-1);\n        ui->satNameEdit->clear();\n        ui->satModeEdit->setEnabled(false);\n        ui->satNameEdit->setEnabled(false);\n    }\n}\n\nbool QSODetailDialog::doValidation()\n{\n    FCT_IDENTIFICATION;\n\n    bool allValid = true;\n\n    const QList<QLabel *> &list = findChildren<QLabel *>();\n\n    for ( QLabel *label : list )\n    {\n        if ( label ) label->setToolTip(QString());\n    }\n\n    allValid &= highlightInvalid(ui->callsignLabel,\n                                 ui->callsignEdit->text().isEmpty(),\n                                 tr(\"DX Callsign must not be empty\"));\n\n    allValid &= highlightInvalid(ui->callsignLabel,\n                                 !ui->callsignEdit->text().isEmpty() && !ui->callsignEdit->hasAcceptableInput(),\n                                 tr(\"DX callsign has an incorrect format\"));\n\n    allValid &= highlightInvalid(ui->freqTXLabel,\n                                 ui->freqTXEdit->value() == 0.0 && ui->bandTXCombo->currentIndex() == 0,\n                                 tr(\"TX Frequency or Band must be filled\"));\n\n    const Band &bandTX = BandPlan::freq2Band(ui->freqTXEdit->value());\n    const QString &bandTXString = bandTX.name;\n\n    allValid &= highlightInvalid(ui->bandLabel,\n                                 ui->freqTXEdit->value() != 0.0 && ui->bandTXCombo->currentText() != bandTXString,\n                                 tr(\"TX Band should be \") + \"<b>\" + (bandTXString.isEmpty() ? \"OOB\" : bandTXString) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->bandLabel,\n                                 ui->freqTXEdit->value() == 0.0 && ui->bandTXCombo->currentIndex() == 0,\n                                 tr(\"TX Frequency or Band must be filled\"));\n\n    const Band &bandRX = BandPlan::freq2Band(ui->freqRXEdit->value());\n    const QString &bandRXString = bandRX.name;\n\n    allValid &= highlightInvalid(ui->bandLabel,\n                                 ui->freqRXEdit->value() != 0.0 && ui->bandRXCombo->currentText() != bandRXString,\n                                 tr(\"RX Band should be \") + \"<b>\" + (bandRXString.isEmpty() ? \"OOB\" : bandRXString) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->gridLabel,\n                                 !ui->gridEdit->text().isEmpty() && !ui->gridEdit->hasAcceptableInput(),\n                                 tr(\"DX Grid has an incorrect format\"));\n\n    const DxccEntity &dxccEntity = Data::instance()->lookupDxccClublog(ui->callsignEdit->text(), ui->dateTimeOnEdit->dateTime());\n\n    allValid &= highlightInvalid(ui->countryLabel,\n                                 dxccEntity.dxcc && ui->countryBox->currentText() != QCoreApplication::translate(\"DBStrings\", dxccEntity.country.toUtf8().constData()),\n                                 tr(\"Based on callsign, DXCC Country is different from the entered value - expecting \") + \"<b> \" + QCoreApplication::translate(\"DBStrings\", dxccEntity.country.toUtf8().constData()) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->contLabel,\n                                 dxccEntity.dxcc && ui->contEdit->currentText() != dxccEntity.cont,\n                                 tr(\"Based on callsign, DXCC Continent is different from the entered value - expecting \") + \"<b> \" + dxccEntity.cont + \"</b>\");\n\n    allValid &= highlightInvalid(ui->ituLabel,\n                                 dxccEntity.dxcc && ui->ituEdit->text() != QString::number(dxccEntity.ituz),\n                                 tr(\"Based on callsign, DXCC ITU is different from the entered value - expecting \") + \"<b> \" + QString::number(dxccEntity.ituz) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->cqLabel,\n                                 dxccEntity.dxcc && ui->cqEdit->text() != QString::number(dxccEntity.cqz),\n                                 tr(\"Based on callsign, DXCC CQZ is different from the entered value - expecting \") + \"<b> \" + QString::number(dxccEntity.cqz) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->vuccLabel,\n                                 !ui->vuccEdit->text().isEmpty() && !ui->vuccEdit->hasAcceptableInput(),\n                                 tr(\"VUCC has an incorrect format\"));\n\n    const QString &expectedSatMode = (bandTX.satDesignator.isEmpty() || bandRX.satDesignator.isEmpty() ) ? \"\"\n                                                                                                         : bandTX.satDesignator + bandRX.satDesignator;\n    allValid &= highlightInvalid(ui->satModeLabel,\n                                 ui->satModeEdit->currentIndex() > 0 && Data::instance()->satModeTextToID(ui->satModeEdit->currentText()) != expectedSatMode,\n                                 tr(\"Based on Frequencies, Sat Mode should be \") + \"<b>\" + ( (expectedSatMode.isEmpty()) ? tr(\"blank\") : expectedSatMode) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->satNameLabel,\n                                 Data::instance()->propagationModeTextToID(ui->propagationModeEdit->currentText()) == \"SAT\" && ui->satNameEdit->text().isEmpty(),\n                                 tr(\"Sat name must not be empty\"));\n\n    const DxccEntity &myDxccEntity = Data::instance()->lookupDxccClublog(ui->myCallsignEdit->text(), ui->dateTimeOnEdit->dateTime());\n\n    allValid &= highlightInvalid(ui->myCallsignLabel,\n                                 ui->myCallsignEdit->text().isEmpty(),\n                                 tr(\"Own Callsign must not be empty\"));\n\n    allValid &= highlightInvalid(ui->myCallsignLabel,\n                                 !ui->myCallsignEdit->text().isEmpty() && !ui->myCallsignEdit->hasAcceptableInput(),\n                                 tr(\"Own callsign has an incorrect format\"));\n\n    allValid &= highlightInvalid(ui->myGridLabel,\n                                 !ui->myGridEdit->text().isEmpty() && !ui->myGridEdit->hasAcceptableInput(),\n                                 tr(\"DX Grid has an incorrect format\"));\n\n    allValid &= highlightInvalid(ui->myVUCCLabel,\n                                 !ui->myVUCCEdit->text().isEmpty() && !ui->myVUCCEdit->hasAcceptableInput(),\n                                 tr(\"Own VUCC Grids have an incorrect format\"));\n\n    allValid &= highlightInvalid(ui->myITULabel,\n                                 myDxccEntity.dxcc && ui->myITUEdit->text() != QString::number(myDxccEntity.ituz),\n                                 tr(\"Based on own callsign, own DXCC ITU is different from the entered value - expecting \") + \"<b> \" + QString::number(myDxccEntity.ituz) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->myCQLabel,\n                                 myDxccEntity.dxcc && ui->myCQEdit->text() != QString::number(myDxccEntity.cqz),\n                                 tr(\"Based on own callsign, own DXCC CQZ is different from the entered value - expecting \") + \"<b> \" + QString::number(myDxccEntity.cqz) + \"</b>\");\n\n    allValid &= highlightInvalid(ui->myCountryLabel,\n                                 myDxccEntity.dxcc && ui->myCountryBox->currentText() != QCoreApplication::translate(\"DBStrings\", myDxccEntity.country.toUtf8().constData()),\n                                 tr(\"Based on own callsign, own DXCC Country is different from the entered value - expecting \") + \"<b> \" + QCoreApplication::translate(\"DBStrings\", myDxccEntity.country.toUtf8().constData()) + \"</b>\");\n\n    SOTAEntity sotaInfo;\n    POTAEntity potaInfo;\n\n    if ( !ui->sotaEdit->text().isEmpty() )\n    {\n        sotaInfo = Data::instance()->lookupSOTA(ui->sotaEdit->text());\n    }\n\n    if ( !ui->potaEdit->text().isEmpty() )\n    {\n        potaInfo = Data::instance()->lookupPOTA(ui->potaEdit->text());\n    }\n\n    allValid &= highlightInvalid(ui->qthLabel,\n                                 sotaInfo.summitCode.toUpper() == ui->sotaEdit->text().toUpper()\n                                 && !sotaInfo.summitName.isEmpty()\n                                 && ui->qthEdit->text().toUpper() != sotaInfo.summitName.toUpper(),\n                                 tr(\"Based on SOTA Summit, QTH does not match SOTA Summit Name - expecting \")+ \"<b> \" + sotaInfo.summitName + \"</b>\");\n\n    Gridsquare SOTAGrid(sotaInfo.latitude, sotaInfo.longitude);\n\n    allValid &= highlightInvalid(ui->gridLabel,\n                                 sotaInfo.summitCode.toUpper() == ui->sotaEdit->text().toUpper()\n                                 && !sotaInfo.summitName.isEmpty()\n                                 && SOTAGrid.isValid()\n                                 && ui->gridEdit->text().toUpper() != SOTAGrid.getGrid().toUpper(),\n                                 tr(\"Based on SOTA Summit, Grid does not match SOTA Grid - expecting \")+ \"<b> \" + SOTAGrid.getGrid() + \"</b>\");\n\n    allValid &= highlightInvalid(ui->qthLabel,\n                                 potaInfo.reference.toUpper() == ui->potaEdit->text().toUpper()\n                                 && !potaInfo.name.isEmpty()\n                                 && ui->qthEdit->text().toUpper() != potaInfo.name.toUpper(),\n                                 tr(\"Based on POTA record, QTH does not match POTA Name - expecting \")+ \"<b> \" + potaInfo.name + \"</b>\");\n\n    Gridsquare POTAGrid(potaInfo.grid);\n\n    allValid &= highlightInvalid(ui->gridLabel,\n                                 potaInfo.reference.toUpper() == ui->potaEdit->text().toUpper()\n                                 && !potaInfo.name.isEmpty()\n                                 && POTAGrid.isValid()\n                                 && ui->gridEdit->text().toUpper() != POTAGrid.getGrid().toUpper(),\n                                 tr(\"Based on POTA record, Grid does not match POTA Grid - expecting \")+ \"<b> \" + POTAGrid.getGrid() + \"</b>\");\n\n    SOTAEntity mySotaInfo;\n    POTAEntity myPotaInfo;\n\n    if ( !ui->mySOTAEdit->text().isEmpty() )\n    {\n        mySotaInfo = Data::instance()->lookupSOTA(ui->mySOTAEdit->text());\n    }\n\n    if ( !ui->myPOTAEdit->text().isEmpty() )\n    {\n        myPotaInfo = Data::instance()->lookupPOTA(ui->myPOTAEdit->text());\n    }\n\n    allValid &= highlightInvalid(ui->myQTHLabel,\n                                 mySotaInfo.summitCode.toUpper() == ui->mySOTAEdit->text().toUpper()\n                                 && !mySotaInfo.summitName.isEmpty()\n                                 && ui->myQTHEdit->text().toUpper() != mySotaInfo.summitName.toUpper(),\n                                 tr(\"Based on SOTA Summit, my QTH does not match SOTA Summit Name - expecting \")+ \"<b> \" + mySotaInfo.summitName + \"</b>\");\n\n    Gridsquare MySOTAGrid(mySotaInfo.latitude, mySotaInfo.longitude);\n\n    allValid &= highlightInvalid(ui->myGridLabel,\n                                 mySotaInfo.summitCode.toUpper() == ui->mySOTAEdit->text().toUpper()\n                                 && !mySotaInfo.summitName.isEmpty()\n                                 && MySOTAGrid.isValid()\n                                 && ui->myGridEdit->text().toUpper() != MySOTAGrid.getGrid().toUpper(),\n                                 tr(\"Based on SOTA Summit, my Grid does not match SOTA Grid - expecting \")+ \"<b> \" + MySOTAGrid.getGrid() + \"</b>\");\n\n    allValid &= highlightInvalid(ui->myQTHLabel,\n                                 myPotaInfo.reference.toUpper() == ui->myPOTAEdit->text().toUpper()\n                                 && !myPotaInfo.name.isEmpty()\n                                 && ui->myQTHEdit->text().toUpper() != myPotaInfo.name.toUpper(),\n                                 tr(\"Based on POTA record, my QTH does not match POTA Name - expecting \")+ \"<b> \" + myPotaInfo.name + \"</b>\");\n\n    Gridsquare myPOTAGrid(myPotaInfo.grid);\n\n    allValid &= highlightInvalid(ui->myGridLabel,\n                                 myPotaInfo.reference.toUpper() == ui->myPOTAEdit->text().toUpper()\n                                 && !myPotaInfo.name.isEmpty()\n                                 && myPOTAGrid.isValid()\n                                 && ui->myGridEdit->text().toUpper() != myPOTAGrid.getGrid().toUpper(),\n                                 tr(\"Based on POTA record, my Grid does not match POTA Grid - expecting \")+ \"<b> \" + myPOTAGrid.getGrid() + \"</b>\");\n\n    allValid &= highlightInvalid(ui->lotwHeaderLabel,\n                                 ui->qslLotwSentDateEdit->date() != ui->qslLotwSentDateEdit->minimumDate()\n                                 && ui->qslLotwSentStatusBox->currentData().toString() == \"N\",\n                                 tr(\"LoTW Sent Status to <b>No</b> does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank\"));\n\n    allValid &= highlightInvalid(ui->lotwHeaderLabel,\n                                 ui->qslLotwSentDateEdit->date() == ui->qslLotwSentDateEdit->minimumDate()\n                                 && ( ui->qslLotwSentStatusBox->currentData().toString() == \"Y\"\n                                 //     || ui->qslLotwSentStatusBox->currentData().toString() == \"Q\" // QLog does not set date for Q state\n                                 //     || ui->qslLotwSentStatusBox->currentData().toString() == \"I\" // QLog does not set date for I state\n                                 ),\n                                 tr(\"Date should be present for LoTW Sent Status <b>Yes</b>\"));\n\n    allValid &= highlightInvalid(ui->eqslHeaderLabel,\n                                 ui->qslEqslSentDateEdit->date() != ui->qslEqslSentDateEdit->minimumDate()\n                                 && ui->qslEqslSentStatusBox->currentData().toString() == \"N\",\n                                 tr(\"eQSL Sent Status to <b>No</b> does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank\"));\n\n    allValid &= highlightInvalid(ui->eqslHeaderLabel,\n                                 ui->qslEqslSentDateEdit->date() == ui->qslEqslSentDateEdit->minimumDate()\n                                 && ( ui->qslEqslSentStatusBox->currentData().toString() == \"Y\"\n                                 //     || ui->qslEqslSentStatusBox->currentData().toString() == \"Q\" // QLog does not set date for Q state\n                                 //     || ui->qslEqslSentStatusBox->currentData().toString() == \"I\" // QLog does not set date for I state\n                                 ),\n                                 tr(\"Date should be present for eQSL Sent Status <b>Yes</b>\"));\n\n    allValid &= highlightInvalid(ui->qslSentLabel,\n                                 ui->qslPaperSentDateEdit->date() != ui->qslPaperSentDateEdit->minimumDate()\n                                 && ui->qslPaperSentStatusBox->currentData().toString() == \"N\",\n                                 tr(\"Paper Sent Status to <b>No</b> does not make any sense if QSL Sent Date is set. Set Date to 1.1.1900 to leave the date field blank\"));\n\n    allValid &= highlightInvalid(ui->qslSentLabel,\n                                 ui->qslPaperSentDateEdit->date() == ui->qslPaperSentDateEdit->minimumDate()\n                                 && ( ui->qslPaperSentStatusBox->currentData().toString() == \"Y\"\n                                 //     || ui->qslPaperSentStatusBox->currentData().toString() == \"Q\" // QLog does not set date for Q state\n                                 //     || ui->qslPaperSentStatusBox->currentData().toString() == \"I\" // QLog does not set date for I state\n                                 ),\n                                 tr(\"Date should be present for Paper Sent Status <b>Yes</b>\"));\n\n    qCDebug(runtime) << \"Validation result: \" << allValid;\n    return allValid;\n}\n\nvoid QSODetailDialog::doValidationDateTime(const QDateTime &)\n{\n    doValidation();\n}\n\nvoid QSODetailDialog::doValidationDouble(double)\n{\n    doValidation();\n}\n\nvoid QSODetailDialog::mapLoaded(bool)\n{\n    FCT_IDENTIFICATION;\n\n    isMainPageLoaded = true;\n\n    /* which layers will be active */\n    postponedScripts += layerControlHandler.generateMapMenuJS(true,\n                                                              true,\n                                                              false,\n                                                              false,\n                                                              false,\n                                                              false,\n                                                              false,\n                                                              false,\n                                                              true);\n\n    main_page->runJavaScript(postponedScripts);\n\n    const QPalette &defaultPalette = this->palette();\n    const QColor &text = defaultPalette.color(QPalette::WindowText);\n    const QColor &window = defaultPalette.color(QPalette::Window);\n    bool isDark = text.lightness() > window.lightness();\n\n    if ( isDark )\n    {\n        QString themeJavaScript = \"map.getPanes().tilePane.style.webkitFilter=\\\"brightness(0.6) invert(1) contrast(3) hue-rotate(200deg) saturate(0.3) brightness(0.9)\\\";\";\n        main_page->runJavaScript(themeJavaScript);\n    }\n\n    layerControlHandler.restoreLayerControlStates(main_page);\n}\n\nvoid QSODetailDialog::myGridChanged(const QString &newGrid)\n{\n    FCT_IDENTIFICATION;\n\n    drawMyQTHOnMap(ui->myCallsignEdit->text(), Gridsquare(newGrid));\n\n    return;\n}\n\nvoid QSODetailDialog::DXGridChanged(const QString &newGrid)\n{\n    FCT_IDENTIFICATION;\n\n    drawDXOnMap(ui->callsignEdit->text(), Gridsquare(newGrid));\n\n    return;\n}\n\nvoid QSODetailDialog::callsignFound(const CallbookResponseData &data)\n{\n    FCT_IDENTIFICATION;\n\n    callbookLookupFinished();\n\n    /* blank or not fully filled then update it */\n    const QString fnamelname = QString(\"%1 %2\").arg(data.fname, data.lname);\n\n    if (  ui->nameEdit->text().isEmpty()\n          || data.name_fmt.contains(ui->nameEdit->text())\n          || fnamelname.contains(ui->nameEdit->text())\n          || data.nick.contains(ui->nameEdit->text()) )\n    {\n        QString name = data.name_fmt;\n\n        if ( name.isEmpty() )\n            name = ( data.fname.isEmpty() && data.lname.isEmpty() ) ? data.nick\n                                                                    : fnamelname;\n        ui->nameEdit->setText(name);\n    }\n\n    if ( ui->gridEdit->text().isEmpty()\n         || data.gridsquare.contains(ui->gridEdit->text()) )\n        ui->gridEdit->setText(data.gridsquare);\n\n    if ( ui->qthEdit->text().isEmpty()\n         || data.qth.contains(ui->qthEdit->text()))\n        ui->qthEdit->setText(data.qth);\n\n    if ( ui->dokEdit->text().isEmpty() )    ui->dokEdit->setText(data.dok);\n    if ( ui->iotaEdit->text().isEmpty() )   ui->iotaEdit->setText(data.iota);\n    if ( ui->emailEdit->text().isEmpty() )  ui->emailEdit->setText(data.email);\n    if ( ui->countyEdit->text().isEmpty() ) ui->countyEdit->setText(data.county);\n    if ( ui->qslViaEdit->text().isEmpty() ) ui->qslViaEdit->setText(data.qsl_via);\n    if ( ui->urlEdit->text().isEmpty() )    ui->urlEdit->setText(data.url);\n    if ( ui->stateEdit->text().isEmpty() )  ui->stateEdit->setText(data.us_state);\n    if ( ui->ituEdit->text().isEmpty() )    ui->ituEdit->setText(data.ituz);\n    if ( ui->cqEdit->text().isEmpty() )     ui->cqEdit->setText(data.cqz);\n}\n\nvoid QSODetailDialog::callsignNotFound(const QString &)\n{\n    FCT_IDENTIFICATION;\n\n    /* Do not show any info, not needed */\n    callbookLookupFinished();\n}\n\nvoid QSODetailDialog::callbookLoginFailed(const QString&)\n{\n    FCT_IDENTIFICATION;\n\n    /* It is not needed to show an Error dialog because Login failed emits also callbookError signal */\n    /* QLog will show only callbookError */\n    //QMessageBox::critical(this, tr(\"QLog Error\"), callbookString + \" \" + tr(\"Callbook login failed\"));\n}\n\nvoid QSODetailDialog::callbookError(const QString &error)\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::critical(this, tr(\"QLog Error\"), tr(\"Callbook error: \") + error);\n}\n\nvoid QSODetailDialog::handleBeforeUpdate(int, QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    emit contactUpdated(record);\n}\n\nvoid QSODetailDialog::sotaChanged(const QString &newSOTA)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newSOTA.length() >= 3 )\n    {\n        ui->sotaEdit->setCompleter(sotaCompleter.data());\n    }\n    else\n    {\n        ui->sotaEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::potaChanged(const QString &newPOTA)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newPOTA.length() >= 3 )\n    {\n        ui->potaEdit->setCompleter(potaCompleter.data());\n    }\n    else\n    {\n        ui->potaEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::wwffChanged(const QString &newWWFF)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newWWFF.length() >= 3 )\n    {\n        ui->wwffEdit->setCompleter(wwffCompleter.data());\n    }\n    else\n    {\n        ui->wwffEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::mySotaChanged(const QString &newSOTA)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newSOTA.length() >= 3 )\n    {\n        ui->mySOTAEdit->setCompleter(sotaCompleter.data());\n    }\n    else\n    {\n        ui->mySOTAEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::myPOTAChanged(const QString &newPOTA)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newPOTA.length() >= 3 )\n    {\n        ui->myPOTAEdit->setCompleter(potaCompleter.data());\n    }\n    else\n    {\n        ui->myPOTAEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::myWWFFChanged(const QString &newWWFF)\n{\n    FCT_IDENTIFICATION;\n\n    if ( newWWFF.length() >= 3 )\n    {\n        ui->myWWFFEdit->setCompleter(wwffCompleter.data());\n    }\n    else\n    {\n        ui->myWWFFEdit->setCompleter(nullptr);\n    }\n}\n\nvoid QSODetailDialog::clubQueryResult(const QString &in_callsign,\n                                      QMap<QString, ClubStatusQuery::ClubInfo> data)\n{\n    FCT_IDENTIFICATION;\n\n    if ( in_callsign != ui->callsignEdit->text().toUpper() )\n    {\n        // do not need this result\n        return;\n    }\n\n    QString memberText;\n\n    QMapIterator<QString, ClubStatusQuery::ClubInfo> clubs(data);\n\n    QPalette palette;\n\n    //\"<font color='red'>Hello</font> <font color='green'>World</font>\"\n    while ( clubs.hasNext() )\n    {\n        clubs.next();\n        QColor color = Data::statusToColor(static_cast<DxccStatus>(clubs.value().status), false, palette.color(QPalette::Text));\n        memberText.append(QString(\"<font color='%1'>%2</font>&nbsp;&nbsp;&nbsp;\").arg(Data::colorToHTMLColor(color), clubs.key()));\n    }\n    ui->memberListLabel->setText(memberText);\n}\n\nbool QSODetailDialog::highlightInvalid(QLabel *labelWidget, bool cond, const QString &toolTip)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << labelWidget->objectName()\n                                 << cond\n                                 << toolTip;\n\n    QString currToolTip(labelWidget->toolTip());\n\n    if ( cond )\n    {\n        if ( ! currToolTip.contains(toolTip) )\n        {\n            currToolTip.append(tr(\"<b>Warning: </b>\") + toolTip + \"<br>\");\n        }\n    }\n    else\n    {\n        currToolTip.remove(tr(\"<b>Warning: </b>\") + toolTip + \"<br>\");\n    }\n\n    if ( currToolTip.isEmpty() )\n    {\n        labelWidget->setStyleSheet(\"\");\n    }\n    else\n    {\n        labelWidget->setStyleSheet(\"color: black; border-radius: 5px; background: yellow;\");\n    }\n\n    labelWidget->setToolTip(currToolTip);\n    return !cond;\n}\n\nvoid QSODetailDialog::blockMappedWidgetSignals(bool inBlocking)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << inBlocking;\n\n    for ( int i = 0; i < LogbookModel::COLUMN_LAST_ELEMENT; i++)\n    {\n        QWidget *widget = mapper->mappedWidgetAt(i);\n\n        if ( widget )\n        {\n            widget->blockSignals(inBlocking);\n        }\n    }\n\n    ui->modeEdit->blockSignals(false); //exception - submode must be filled based on Mode combobox\n}\n\nvoid QSODetailDialog::drawDXOnMap(const QString &label, const Gridsquare &dxGrid)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << label << dxGrid;\n\n    if ( !dxGrid.isValid() )\n    {\n        return;\n    }\n\n    QString stationString;\n    QString popupString = label;\n\n    Gridsquare myGrid = Gridsquare(ui->myGridEdit->text());\n    double distance = 0;\n\n    if (dxGrid.distanceTo(myGrid, distance))\n    {\n        QString unit;\n        distance = Gridsquare::distance2localeUnitDistance(distance, unit, locale);\n        popupString.append(QString(\"</br> %1 %2\").arg(QString::number(distance, 'f', 0), unit));\n    }\n\n    double lat = dxGrid.getLatitude();\n    double lon = dxGrid.getLongitude();\n    // do not wrap the points\n    double delta = lon - myGrid.getLongitude();\n    if ( delta > 180 )\n        lon -= 360;\n    if ( delta < -180 )\n        lon += 360;\n\n    stationString.append(QString(\"[[\\\"%1\\\", %2, %3, yellowIcon]]\").arg(popupString).arg(lat).arg(lon));\n\n    QString shortPath = QString(\"[%1, %2, %3, %4]\")\n                            .arg(myGrid.getLatitude())\n                            .arg(myGrid.getLongitude())\n                            .arg(lat)\n                            .arg(lon);\n\n    QString javaScript = QString(\"grids_confirmed = [];\"\n                                 \"grids_worked = [];\"\n                                 \"drawPoints(%1);\"\n                                 \"drawShortPaths([%2]);\"\n                                 \"maidenheadConfWorked.redraw();\"\n                                 \"flyToPoint(%3[0], 6);\")\n                             .arg(stationString, shortPath, stationString);\n\n    qCDebug(runtime) << javaScript;\n\n    if ( !isMainPageLoaded )\n    {\n        postponedScripts.append(javaScript);\n    }\n    else\n    {\n        main_page->runJavaScript(javaScript);\n    }\n}\n\nvoid QSODetailDialog::drawMyQTHOnMap(const QString &label, const Gridsquare &myGrid)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << label << myGrid;\n\n    if ( ! myGrid.isValid() )\n    {\n        return;\n    }\n\n    QString stationString;\n    double lat = myGrid.getLatitude();\n    double lon = myGrid.getLongitude();\n    stationString.append(QString(\"[[\\\"%1\\\", %2, %3, homeIcon]]\").arg(label).arg(lat).arg(lon));\n\n    QString javaScript = QString(\"grids_confirmed = [];\"\n                                 \"grids_worked = [];\"\n                                 \"drawPointsGroup2(%1);\"\n                                 \"maidenheadConfWorked.redraw();\").arg(stationString);\n\n    qCDebug(runtime) << javaScript;\n\n    if ( !isMainPageLoaded )\n    {\n        postponedScripts.append(javaScript);\n    }\n    else\n    {\n        main_page->runJavaScript(javaScript);\n    }\n}\n\nvoid QSODetailDialog::setStaticMapTime(const QDateTime &dateTime)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << dateTime;\n\n    QString javaScript = QString(\"setStaticMapTime(new Date(%1));\").arg(dateTime.toMSecsSinceEpoch());\n\n    qCDebug(runtime) << javaScript;\n\n    if (!isMainPageLoaded) {\n        postponedScripts.append(javaScript);\n    } else {\n        main_page->runJavaScript(javaScript);\n    }\n}\n\nvoid QSODetailDialog::enableWidgetChangeHandlers()\n{\n    FCT_IDENTIFICATION;\n\n    for ( int i = 0; i < LogbookModel::COLUMN_LAST_ELEMENT; i++)\n    {\n        QWidget *widget = mapper->mappedWidgetAt(i);\n\n        if ( !widget ) continue;\n\n        if ( QLineEdit *line = qobject_cast<QLineEdit*>(widget) )\n        {\n            connect(line, &QLineEdit::textChanged, this, &QSODetailDialog::doValidation);\n            connect(line, &QLineEdit::textChanged, this, [line]()\n            {\n                line->setStyleSheet(CHANGECSS);\n            });\n        }\n        else if ( QTextEdit *edit = qobject_cast<QTextEdit*>(widget) )\n        {\n            connect(edit, &QTextEdit::textChanged, this, &QSODetailDialog::doValidation);\n            connect(edit, &QTextEdit::textChanged, this, [edit]()\n            {\n                edit->setStyleSheet(CHANGECSS);\n            });\n        }\n        else if ( QDoubleSpinBox *spin = qobject_cast<QDoubleSpinBox*>(widget) )\n        {\n            connect(spin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, &QSODetailDialog::doValidationDouble);\n            connect(spin, QOverload<double>::of(&QDoubleSpinBox::valueChanged), this, [spin](double)\n            {\n                spin->setStyleSheet(CHANGECSS);\n            });\n        }\n        else if ( QDateTimeEdit *datetime = qobject_cast<QDateTimeEdit*>(widget) )\n        {\n            connect(datetime, &QDateTimeEdit::dateTimeChanged, this, &QSODetailDialog::doValidationDateTime);\n            connect(datetime, &QDateTimeEdit::dateTimeChanged, this, [datetime](QDateTime)\n            {\n                datetime->setStyleSheet(CHANGECSS);\n            });\n        }\n        else if ( QComboBox *combo = qobject_cast<QComboBox*>(widget) )\n        {\n            connect(combo, &QComboBox::currentTextChanged, this, &QSODetailDialog::doValidation);\n            connect(combo, &QComboBox::currentTextChanged, this, [combo](QString)\n            {\n                combo->setStyleSheet(CHANGECSS);\n            });\n        }\n        else if ( SmartSearchBox *combo = qobject_cast<SmartSearchBox*>(widget) )\n        {\n            connect(combo, &SmartSearchBox::currentTextChanged, this, &QSODetailDialog::doValidation);\n            connect(combo, &SmartSearchBox::currentTextChanged, this, [combo](QString)\n            {\n                combo->setStyleSheet(CHANGECSS);\n            });\n        }\n    }\n}\n\nvoid QSODetailDialog::updateCountyCompleter(int dxcc)\n{\n    FCT_IDENTIFICATION;\n\n    ui->countyEdit->setCompleter(nullptr);\n    countyCompleter.reset(Data::createCountyCompleter(dxcc, this));\n    ui->countyEdit->setCompleter(countyCompleter.data());\n}\n\nvoid QSODetailDialog::lookupButtonWaitingStyle(bool isWaiting)\n{\n    FCT_IDENTIFICATION;\n\n    if ( isWaiting )\n    {\n        lookupButtonMovie->start();\n    }\n    else\n    {\n        lookupButtonMovie->stop();\n\n        QIcon icon;\n        icon.addFile(QString::fromUtf8(\":/icons/baseline-search-24px.svg\"));\n        lookupButton->setIcon(icon);\n    }\n}\n\nQSODetailDialog::SubmitError QSODetailDialog::submitAllChanges()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ! doValidation() )\n    {\n        QMessageBox::StandardButton reply;\n        reply = QMessageBox::question(this, tr(\"Validation\"), tr(\"Yellow marked fields are invalid.<p>Nevertheless, save the changes?</p>\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if (reply != QMessageBox::Yes) return QSODetailDialog::SubmitCancelledByUser;\n    }\n\n    if ( ! mapper->submit() )\n    {\n        qWarning(\"Mapper was not submitted\");\n        return QSODetailDialog::SubmitMapperError;\n    }\n\n    if ( ! model->submit() )\n    {\n        qWarning(\"Model was not submitted\");\n        return QSODetailDialog::SubmitModelError;\n    }\n\n    return QSODetailDialog::SubmitOK;\n}\n\nvoid QSODetailDialog::callbookLookupFinished()\n{\n    FCT_IDENTIFICATION;\n\n    lookupButton->setEnabled(true);\n    resetButton->setEnabled(true);\n    editButton->setEnabled(true);\n    lookupButtonWaitingStyle(false);\n}\n\nvoid QSODetailDialog::callbookLookupStart()\n{\n    FCT_IDENTIFICATION;\n\n    lookupButton->setEnabled(false);\n    resetButton->setEnabled(false);\n    editButton->setEnabled(false);\n    lookupButtonWaitingStyle(true);\n}\n\nvoid QSODetailDialog::refreshDXStatTabs()\n{\n    FCT_IDENTIFICATION;\n\n    const DxccEntity &dxccEntity = Data::instance()->lookupDxccIDClublog(editedRecord->field(\"dxcc\").value().toInt());\n    const Band &currBand = BandPlan::freq2Band(ui->freqTXEdit->value());\n\n    ui->dxccTableWidget->setDxcc(dxccEntity.dxcc, currBand);\n    ui->stationTableWidget->setDxCallsign(ui->callsignEdit->text(), currBand);\n}\n\nconst QString QSODetailDialog::getButtonText(int index) const\n{\n    FCT_IDENTIFICATION;\n\n    static const char *buttonText[] =\n    {\n        QT_TR_NOOP(\"&Save\"),\n        QT_TR_NOOP(\"&Edit\")\n    };\n\n    return tr(buttonText[index]);\n}\n\nvoid QSOEditMapperDelegate::setEditorData(QWidget *editor,\n                                          const QModelIndex &index) const\n{\n    if ( editor->objectName() == \"qslSentBox\"\n         || editor->objectName() == \"qslSentViaBox\"\n         || editor->objectName() == \"qslPaperSentStatusBox\"\n         || editor->objectName() == \"qslPaperReceiveStatusBox\"\n         || editor->objectName() == \"qslLotwSentStatusBox\"\n         || editor->objectName() == \"qslEqslSentStatusBox\"\n         )\n    {\n        QComboBox* combo = qobject_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            combo->setCurrentIndex(combo->findData(index.data()));\n        }\n        return;\n    }\n    else if ( editor->objectName() == \"propagationModeEdit\" )\n    {\n        QComboBox* combo = qobject_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            combo->setCurrentText(Data::instance()->propagationModeIDToText(index.data().toString()));\n        }\n        return;\n    }\n    else if ( editor->objectName() == \"satModeEdit\" )\n    {\n        QComboBox* combo = qobject_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            combo->setCurrentText(Data::instance()->satModeIDToText(index.data().toString()));\n        }\n        return;\n    }\n    else if ( editor->objectName() == \"qslEqslReceiveDateLabel\"\n              || editor->objectName() == \"qslLotwReceiveDateLabel\" )\n    {\n        QLabel* label = qobject_cast<QLabel*>(editor);\n\n        if ( label )\n        {\n            if ( !index.data().toString().isEmpty() )\n            {\n                label->setText(index.data().toDate().toString(locale.formatDateShortWithYYYY()));\n            }\n        }\n        return;\n    }\n    else if ( editor->objectName() == \"qslEqslReceiveStatusLabel\"\n              || editor->objectName() == \"qslLotwReceiveStatusLabel\"\n            )\n    {\n        QLabel* label = qobject_cast<QLabel*>(editor);\n\n        if ( label )\n        {\n          QString statusIcon = QString(\"<img src=':/icons/%1-24px.svg'></td>\").arg((index.data().toString() == \"Y\") ? \"done\" : \"close\");\n          label->setText(statusIcon);\n          label->setProperty(\"originvalue\", index.data());\n        }\n        return;\n    }\n    else if ( editor->objectName() == \"countryBox\"\n              || editor->objectName() == \"myCountryBox\" )\n    {\n        SmartSearchBox* combo = qobject_cast<SmartSearchBox*>(editor);\n\n        if ( combo )\n            combo->setCurrentValue(index.data(), 1);\n        return;\n    }\n    else if ( editor->objectName() == \"noteEdit\" )\n    {\n        QTextEdit *textEdit = static_cast<QTextEdit*>(editor);\n\n        if ( textEdit )\n        {\n            QString value = index.data().toString();\n            textEdit->setPlainText(value);\n            textEdit->setAcceptRichText(false);\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"freqRXEdit\" )\n    {\n        QDoubleSpinBox *spin = static_cast<QDoubleSpinBox*>(editor);\n\n        if ( spin )\n        {\n            spin->setValue(index.data().toDouble());\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"qslPaperReceiveDateEdit\"\n              || editor->objectName() == \"qslPaperSentDateEdit\"\n              || editor->objectName() == \"qslLotwSentDateEdit\"\n              || editor->objectName() == \"qslEqslSentDateEdit\" )\n    {\n        QDateEdit *dateEdit = qobject_cast<QDateEdit*>(editor);\n\n        if ( dateEdit )\n        {\n            if ( !index.data().toDate().isValid() )\n            {\n                dateEdit->setDate(dateEdit->minimumDate());\n                return;\n            }\n        }\n    }\n\n    QItemDelegate::setEditorData(editor, index);\n\n    // Hack: all NewContactEditLines should display\n    // an initial part of the line.\n    // Do not insert this functionality to NewContactEditLines because\n    // this function is wanted only for the QSODetail Widget.\n    NewContactEditLine* lineEdit = qobject_cast<NewContactEditLine*>(editor);\n    if ( lineEdit )\n    {\n        lineEdit->home(false);\n    }\n}\n\nvoid QSOEditMapperDelegate::setModelData(QWidget *editor,\n                                         QAbstractItemModel *model,\n                                         const QModelIndex &index) const\n{\n    /* ALL combos with Data */\n    if ( editor->objectName() == \"qslSentBox\"\n         || editor->objectName() == \"qslSentViaBox\"\n         || editor->objectName() == \"qslPaperSentStatusBox\"\n         || editor->objectName() == \"qslPaperReceiveStatusBox\"\n         || editor->objectName() == \"qslLotwSentStatusBox\"\n         || editor->objectName() == \"qslEqslSentStatusBox\"\n       )\n    {\n        QComboBox* combo = static_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            model->setData(index, combo->currentData());\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"propagationModeEdit\" )\n    {\n        QComboBox* combo = static_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            model->setData(index, Data::instance()->propagationModeTextToID(combo->currentText()));\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"satModeEdit\" )\n    {\n        QComboBox* combo = static_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            model->setData(index, Data::instance()->satModeTextToID(combo->currentText()));\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"noteEdit\" )\n    {\n        QTextEdit *textEdit = static_cast<QTextEdit*>(editor);\n\n        if ( textEdit )\n        {\n            model->setData(index, textEdit->toPlainText());\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"qslPaperReceiveDateEdit\"\n              || editor->objectName() == \"qslPaperSentDateEdit\"\n              || editor->objectName() == \"qslLotwSentDateEdit\"\n              || editor->objectName() == \"qslEqslSentDateEdit\" )\n    {\n        QDateEdit *dateEdit = qobject_cast<QDateEdit*>(editor);\n\n        if ( dateEdit )\n        {\n            if ( dateEdit->date() == dateEdit->minimumDate() )\n            {\n                 model->setData(index, QVariant());\n            }\n            else\n            {\n                 model->setData(index, dateEdit->date());\n            }\n            return;\n        }\n    }\n    else if ( editor->objectName() == \"countryBox\"\n              || editor->objectName() == \"myCountryBox\")\n    {\n        SmartSearchBox *box = qobject_cast<SmartSearchBox*>(editor);\n\n        if ( box )\n        {\n            int row = box->currentIndex();\n            QVariant dataDXCC;\n            QVariant dataCountryEN;\n\n            if ( row > 0 ) // the first line is an empty line\n            {\n                dataDXCC = box->currentValue(1);\n                dataCountryEN = box->currentValue(3);\n            }\n\n            model->setData(index, dataDXCC);\n            model->setData(model->index(index.row(),\n                                        (editor->objectName() == \"countryBox\" ) ? LogbookModel::COLUMN_COUNTRY_INTL\n                                                                                : LogbookModel::COLUMN_MY_COUNTRY_INTL),\n                           dataCountryEN);\n        }\n        return;\n    }\n    else if (    editor->objectName() == \"qslEqslReceiveDateLabel\"\n              || editor->objectName() == \"qslEqslReceiveStatusLabel\"\n              || editor->objectName() == \"qslLotwReceiveDateLabel\"\n              || editor->objectName() == \"qslLotwReceiveStatusLabel\"\n            )\n    {\n        /* do not save */\n        return;\n    }\n    else if ( editor->objectName() == \"bandRXCombo\"\n              || editor->objectName() == \"bandTXCombo\" )\n    {\n        QComboBox* combo = static_cast<QComboBox*>(editor);\n\n        if ( combo )\n        {\n            if ( combo->currentIndex() == 0 )\n            {\n                model->setData(index, QVariant());\n            }\n            else\n            {\n                model->setData(index, combo->currentText());\n            }\n        }\n        return;\n    }\n\n    QItemDelegate::setModelData(editor, model, index);\n}\n\nbool QSOEditMapperDelegate::eventFilter(QObject *object, QEvent *event)\n{\n\n    /* need to be eventFilter before Key Press IF because\n     * this signal is used to reset Stylesheet for widget that is reset. And emit\n     * has to be callled at the end of operation */\n    bool ret = QItemDelegate::eventFilter(object, event);\n\n    if (event->type() == QEvent::KeyPress) {\n        if (static_cast<QKeyEvent*>(event)->key() == Qt::Key_Escape)\n        {\n            emit keyEscapePressed(object);\n        }\n    }\n\n    return ret;\n}\n\nQSODetailDialog::LogbookModelPrivate::LogbookModelPrivate(QObject *parent, QSqlDatabase db)\n    : LogbookModel(parent, db)\n{\n    setTable(\"contacts\");\n    setEditStrategy(QSqlTableModel::OnRowChange);\n}\n\nQVariant QSODetailDialog::LogbookModelPrivate::data(const QModelIndex &index, int role) const\n{\n    return QSqlTableModel::data(index, role); // clazy:exclude=skipped-base-method\n}\n\nbool QSODetailDialog::LogbookModelPrivate::setData(const QModelIndex &index, const QVariant &value, int role)\n{\n    bool main_update_result = true;\n    bool depend_update_result = true;\n\n    if ( role == Qt::EditRole )\n    {\n        switch ( index.column() )\n        {\n\n        case COLUMN_CALL:\n        {\n            const QString &pfxRef = Callsign(value.toString()).getWPXPrefix();\n\n            if ( !pfxRef.isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_PREFIX), QVariant(pfxRef), role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        case COLUMN_GRID:\n        {\n            if ( ! value.toString().isEmpty() )\n            {\n                Gridsquare newgrid(value.toString());\n\n                if ( newgrid.isValid() )\n                {\n                    Gridsquare mygrid(QSqlTableModel::data(this->index(index.row(), COLUMN_MY_GRIDSQUARE), Qt::DisplayRole).toString()); // clazy:exclude=skipped-base-method\n                    double distance;\n\n                    if ( mygrid.distanceTo(newgrid, distance) )\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(distance),role); // clazy:exclude=skipped-base-method\n                    }\n                    else\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role); // clazy:exclude=skipped-base-method\n                    }\n                }\n                else\n                {\n                    /* do not update field with invalid Grid */\n                    depend_update_result = false;\n                }\n            }\n            else\n            {\n                /* empty grid is valid (when removing a value); need to remove also Distance */\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        case COLUMN_MY_GRIDSQUARE:\n        {\n            if ( ! value.toString().isEmpty() )\n            {\n                Gridsquare mynewGrid(value.toString());\n\n                if ( mynewGrid.isValid() )\n                {\n                    Gridsquare dxgrid(QSqlTableModel::data(this->index(index.row(), COLUMN_GRID), Qt::DisplayRole).toString()); // clazy:exclude=skipped-base-method\n                    double distance;\n\n                    if ( mynewGrid.distanceTo(dxgrid, distance) )\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(distance),role); // clazy:exclude=skipped-base-method\n                    }\n                    else\n                    {\n                        depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role); // clazy:exclude=skipped-base-method\n                    }\n                }\n                else\n                {\n                    /* do not update field with invalid Grid */\n                    depend_update_result = false;\n                }\n            }\n            else\n            {\n                /* empty grid is valid (when removing a value); need to remove also Distance */\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_DISTANCE), QVariant(),role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        case COLUMN_ADDRESS_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ADDRESS), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_COMMENT_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COMMENT), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_COUNTRY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_COUNTRY), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_ANTENNA_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ANTENNA), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_CITY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_CITY), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_COUNTRY_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_COUNTRY), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_NAME_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_NAME), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_POSTAL_CODE_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_POSTAL_CODE), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_RIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_RIG), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_SIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_SIG), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_SIG_INFO_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_SIG_INFO), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_MY_STREET_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_STREET), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_NAME_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_NAME), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_NOTES_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_NOTES), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_QSLMSG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_QSLMSG), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_QTH_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_QTH), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_RIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_RIG), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_SIG_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_SIG), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_SIG_INFO_INTL:\n        {\n            depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_SIG_INFO), Data::removeAccents(value.toString()),role); // clazy:exclude=skipped-base-method\n            break;\n        }\n\n        case COLUMN_SOTA_REF:\n        {\n            SOTAEntity sotaInfo = Data::instance()->lookupSOTA(value.toString());\n            if ( sotaInfo.summitCode.toUpper() == value.toString().toUpper()\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ALTITUDE), sotaInfo.altm, role); // clazy:exclude=skipped-base-method\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_ALTITUDE), QVariant(), role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n\n        case COLUMN_MY_SOTA_REF:\n        {\n            SOTAEntity sotaInfo = Data::instance()->lookupSOTA(value.toString());\n            if ( sotaInfo.summitCode.toUpper() == value.toString().toUpper()\n                 && !sotaInfo.summitName.isEmpty() )\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ALTITUDE), sotaInfo.altm, role); // clazy:exclude=skipped-base-method\n            }\n            else\n            {\n                depend_update_result = QSqlTableModel::setData(this->index(index.row(), COLUMN_MY_ALTITUDE), QVariant(), role); // clazy:exclude=skipped-base-method\n            }\n            break;\n        }\n       }\n       //updateExternalServicesUploadStatus(index, role, depend_update_result);\n\n       if ( depend_update_result )\n       {\n           switch ( index.column() )\n           {\n           case COLUMN_FREQUENCY:\n           case COLUMN_FREQ_RX:\n           case COLUMN_TX_POWER:\n               /* store NULL when 0.0MHz */\n               main_update_result = QSqlTableModel::setData(index, ( value.toDouble() == 0.0 ) ? QVariant() // clazy:exclude=skipped-base-method\n                                                                                               : value, role);\n               break;\n\n           case COLUMN_SOTA_REF:\n           case COLUMN_MY_SOTA_REF:\n           case COLUMN_POTA_REF:\n           case COLUMN_MY_POTA_REF:\n           case COLUMN_IOTA:\n           case COLUMN_MY_IOTA:\n           case COLUMN_MY_GRIDSQUARE:\n           case COLUMN_CALL:\n           case COLUMN_GRID:\n           case COLUMN_VUCC_GRIDS:\n           case COLUMN_MY_VUCC_GRIDS:\n           case COLUMN_MY_WWFF_REF:\n           case COLUMN_WWFF_REF:\n           case COLUMN_STATION_CALLSIGN:\n           case COLUMN_OPERATOR:\n           case COLUMN_DARC_DOK:\n           case COLUMN_MY_DARC_DOK:\n               main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? value.toString().toUpper() // clazy:exclude=skipped-base-method\n                                                                                                   : QVariant(), role);\n               break;\n\n           case COLUMN_ADDRESS_INTL:\n           case COLUMN_COMMENT_INTL:\n           case COLUMN_COUNTRY_INTL:\n           case COLUMN_MY_ANTENNA_INTL:\n           case COLUMN_MY_CITY_INTL:\n           case COLUMN_MY_COUNTRY_INTL:\n           case COLUMN_MY_NAME_INTL:\n           case COLUMN_MY_POSTAL_CODE_INTL:\n           case COLUMN_MY_RIG_INTL:\n           case COLUMN_MY_SIG_INTL:\n           case COLUMN_MY_SIG_INFO_INTL:\n           case COLUMN_MY_STREET_INTL:\n           case COLUMN_NAME_INTL:\n           case COLUMN_NOTES_INTL:\n           case COLUMN_QSLMSG_INTL:\n           case COLUMN_QTH_INTL:\n           case COLUMN_RIG_INTL:\n           case COLUMN_SIG_INTL:\n           case COLUMN_SIG_INFO_INTL:\n               main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? value              // clazy:exclude=skipped-base-method\n                                                                                                   : QVariant(), role);\n               break;\n\n           default:\n               main_update_result = QSqlTableModel::setData(index, ( !value.toString().isEmpty() ) ? Data::removeAccents(value.toString()) // clazy:exclude=skipped-base-method\n                                                                                                   : QVariant(), role);\n           }\n       }\n    }\n\n    return main_update_result && depend_update_result;\n}\n"
  },
  {
    "path": "ui/QSODetailDialog.h",
    "content": "#ifndef QLOG_UI_QSODETAILDIALOG_H\n#define QLOG_UI_QSODETAILDIALOG_H\n\n#include <QDialog>\n#include <QDataWidgetMapper>\n#include <QItemDelegate>\n#include <QLabel>\n#include <QPointer>\n#include <QCompleter>\n#include <QWebChannel>\n\n#include \"models/LogbookModel.h\"\n#include \"data/Gridsquare.h\"\n#include \"core/CallbookManager.h\"\n#include \"ui/MapWebChannelHandler.h\"\n#include \"ui/WebEnginePage.h\"\n#include \"core/MembershipQE.h\"\n#include \"core/LogLocale.h\"\n#include \"ui/component/MultiselectCompleter.h\"\n\nnamespace Ui {\nclass QSODetailDialog;\n}\n\nclass ModeSelectionController;\n\nclass QSOEditMapperDelegate : public QItemDelegate\n{\n        Q_OBJECT\npublic:\n    QSOEditMapperDelegate(QObject *parent = 0) : QItemDelegate(parent) {};\n    void setEditorData(QWidget *editor,\n                           const QModelIndex &index) const override;\n    void setModelData(QWidget *editor,\n                          QAbstractItemModel *model,\n                          const QModelIndex &index) const override;\nsignals:\n    void keyEscapePressed(QObject *);\n\nprivate:\n    bool eventFilter(QObject *object, QEvent *event) override;\n    LogLocale locale;\n};\n\nclass QSODetailDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSODetailDialog(const QSqlRecord &qso,\n                             QWidget *parent = nullptr);\n    void accept() override;\n    void keyPressEvent(QKeyEvent *evt) override;\n    ~QSODetailDialog();\n\nsignals:\n    void contactUpdated(QSqlRecord&);\n\nprivate slots:\n    void editButtonPressed();\n    void resetButtonPressed();\n    void lookupButtonPressed();\n    void resetKeyPressed(QObject *);\n    void setReadOnlyMode(bool);\n    void modeChanged(QString);\n    void showPaperButton();\n    void showEQSLButton();\n    void dateTimeOnChanged(const QDateTime &);\n    void dateTimeOffChanged(const QDateTime &);\n    void freqTXChanged(double);\n    void freqRXChanged(double);\n    void timeLockToggled(bool);\n    void freqLockToggled(bool);\n    void callsignChanged(const QString&);\n    void callsignEditFinished();\n    void queryMemberList();\n    void propagationModeChanged(const QString &);\n    bool doValidation();\n    void doValidationDateTime(const QDateTime&);\n    void doValidationDouble(double);\n    void mapLoaded(bool);\n    void myGridChanged(const QString&);\n    void DXGridChanged(const QString&);\n    void callsignFound(const CallbookResponseData &data);\n    void callsignNotFound(const QString&);\n    void callbookLoginFailed(const QString&);\n    void callbookError(const QString&);\n    void handleBeforeUpdate(int, QSqlRecord&);\n    void sotaChanged(const QString&);\n    void potaChanged(const QString&);\n    void wwffChanged(const QString&);\n    void mySotaChanged(const QString&);\n    void myPOTAChanged(const QString&);\n    void myWWFFChanged(const QString&);\n    void clubQueryResult(const QString &in_callsign,\n                         QMap<QString, ClubStatusQuery::ClubInfo> data);\n    void updateCountyCompleter(int dxcc);\n\nprivate:\n    /* It is modified logbook model when only basic\n     * validation are done. The extended validations\n     * are done in Form itself */\n    class LogbookModelPrivate : public LogbookModel\n    {\n\n    public:\n        explicit LogbookModelPrivate(QObject* parent = nullptr, QSqlDatabase db = QSqlDatabase());\n\n        QVariant data(const QModelIndex &index, int role) const override;\n        bool setData(const QModelIndex &index, const QVariant &value, int role) override;\n    };\n\n    enum SubmitError\n    {\n        SubmitOK = 0,\n        SubmitCancelledByUser = 1,\n        SubmitMapperError = 2,\n        SubmitModelError = 3\n    };\n\n    bool highlightInvalid(QLabel *, bool, const QString&);\n    void blockMappedWidgetSignals(bool);\n    void drawDXOnMap(const QString &label, const Gridsquare &dxGrid);\n    void drawMyQTHOnMap(const QString &label, const Gridsquare &myGrid);\n    void setStaticMapTime(const QDateTime &dateTime);\n    void enableWidgetChangeHandlers();\n    void lookupButtonWaitingStyle(bool);\n    SubmitError submitAllChanges();\n    void callbookLookupFinished();\n    void callbookLookupStart();\n    void refreshDXStatTabs();\n    const QString getButtonText(int index) const;\n\n    Ui::QSODetailDialog *ui;\n    QPointer<QDataWidgetMapper> mapper;\n    QPointer<LogbookModelPrivate> model;\n    QSqlRecord *editedRecord;\n    QPointer<QPushButton> editButton;\n    QPointer<QPushButton> resetButton;\n    QPointer<QPushButton> lookupButton;\n    QPointer<QMovie> lookupButtonMovie;\n    qint64 timeLockDiff;\n    double freqLockDiff;\n    bool isMainPageLoaded;\n    QPointer<WebEnginePage> main_page;\n    QString postponedScripts;\n    CallbookManager callbookManager;\n    QScopedPointer<QCompleter> iotaCompleter;\n    QScopedPointer<QCompleter> myIotaCompleter;\n    QScopedPointer<QCompleter> sotaCompleter;\n    QScopedPointer<QCompleter> mySotaCompleter;\n    QScopedPointer<MultiselectCompleter> potaCompleter;\n    QScopedPointer<QCompleter> myPotaCompleter;\n    QScopedPointer<QCompleter> wwffCompleter;\n    QScopedPointer<QCompleter> myWWFFCompleter;\n    QScopedPointer<QCompleter> sigCompleter;\n    QScopedPointer<QCompleter> countyCompleter;\n    QScopedPointer<ModeSelectionController> modeController;\n    QWebChannel channel;\n    MapWebChannelHandler layerControlHandler;\n    LogLocale locale;\n};\n\n#endif // QLOG_UI_QSODETAILDIALOG_H\n"
  },
  {
    "path": "ui/QSODetailDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSODetailDialog</class>\n <widget class=\"QDialog\" name=\"QSODetailDialog\">\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"maximumSize\">\n   <size>\n    <width>16777215</width>\n    <height>764</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string/>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"topMargin\">\n    <number>4</number>\n   </property>\n   <item>\n    <layout class=\"QGridLayout\" name=\"gridLayout\">\n     <property name=\"horizontalSpacing\">\n      <number>6</number>\n     </property>\n     <property name=\"verticalSpacing\">\n      <number>0</number>\n     </property>\n     <item row=\"1\" column=\"1\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n       <item>\n        <widget class=\"QDateTimeEdit\" name=\"dateTimeOnEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::StrongFocus</enum>\n         </property>\n         <property name=\"buttonSymbols\">\n          <enum>QAbstractSpinBox::UpDownArrows</enum>\n         </property>\n         <property name=\"displayFormat\">\n          <string>dd/MM/yyyy HH:mm:ss</string>\n         </property>\n         <property name=\"timeSpec\">\n          <enum>Qt::UTC</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QDateTimeEdit\" name=\"dateTimeOffEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::StrongFocus</enum>\n         </property>\n         <property name=\"displayFormat\">\n          <string>dd/MM/yyyy HH:mm:ss</string>\n         </property>\n         <property name=\"timeSpec\">\n          <enum>Qt::UTC</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"1\" column=\"2\">\n      <widget class=\"QPushButton\" name=\"timeLockButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>24</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"mouseTracking\">\n        <bool>true</bool>\n       </property>\n       <property name=\"styleSheet\">\n        <string notr=\"true\">QPushButton {   \n                    color:none;   \n                    border:none; \n                }   \n                QPushButton:checked{\n                    background-color: none;\n                    border: none; \n                }\n                QPushButton:hover{  \n                    background-color: none; \n                    border: none; \n                }  </string>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"icon\">\n        <iconset resource=\"../res/icons/icons.qrc\">\n         <normaloff>:/icons/disconnect.svg</normaloff>\n         <normalon>:/icons/connect.svg</normalon>:/icons/disconnect.svg</iconset>\n       </property>\n       <property name=\"iconSize\">\n        <size>\n         <width>24</width>\n         <height>24</height>\n        </size>\n       </property>\n       <property name=\"checkable\">\n        <bool>true</bool>\n       </property>\n       <property name=\"checked\">\n        <bool>true</bool>\n       </property>\n       <property name=\"default\">\n        <bool>false</bool>\n       </property>\n       <property name=\"flat\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"3\">\n      <widget class=\"NewContactEditLine\" name=\"callsignEdit\">\n       <property name=\"enabled\">\n        <bool>true</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>400</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>20</pointsize>\n         <bold>true</bold>\n        </font>\n       </property>\n       <property name=\"maxLength\">\n        <number>25</number>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"4\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n       <item>\n        <widget class=\"QLabel\" name=\"rstSentLabel\">\n         <property name=\"text\">\n          <string>RSTs</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"rstRcvdLabel\">\n         <property name=\"text\">\n          <string>RSTr</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"0\" column=\"6\">\n      <widget class=\"QLabel\" name=\"modeLabel\">\n       <property name=\"text\">\n        <string>Mode</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <item>\n        <widget class=\"QLabel\" name=\"timeOnLabel\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>Time On</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"timeOffLabel\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>Time Off</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"1\" column=\"6\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_11\">\n       <item>\n        <widget class=\"QComboBox\" name=\"modeEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::WheelFocus</enum>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QComboBox\" name=\"submodeEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"focusPolicy\">\n          <enum>Qt::WheelFocus</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"1\" column=\"8\">\n      <widget class=\"QPushButton\" name=\"freqLockButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>24</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"mouseTracking\">\n        <bool>true</bool>\n       </property>\n       <property name=\"styleSheet\">\n        <string notr=\"true\">QPushButton {   \n                    color:none;   \n                    border:none; \n                }   \n                QPushButton:checked{\n                    background-color: none;\n                    border: none; \n                }\n                QPushButton:hover{  \n                    background-color: none; \n                    border: none; \n                }  </string>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"icon\">\n        <iconset resource=\"../res/icons/icons.qrc\">\n         <normaloff>:/icons/disconnect.svg</normaloff>\n         <normalon>:/icons/connect.svg</normalon>:/icons/disconnect.svg</iconset>\n       </property>\n       <property name=\"iconSize\">\n        <size>\n         <width>24</width>\n         <height>24</height>\n        </size>\n       </property>\n       <property name=\"checkable\">\n        <bool>true</bool>\n       </property>\n       <property name=\"checked\">\n        <bool>true</bool>\n       </property>\n       <property name=\"flat\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"5\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n       <item>\n        <widget class=\"NewContactEditLine\" name=\"rstSentEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"maximumSize\">\n          <size>\n           <width>65</width>\n           <height>16777215</height>\n          </size>\n         </property>\n         <property name=\"font\">\n          <font>\n           <pointsize>11</pointsize>\n          </font>\n         </property>\n         <property name=\"text\">\n          <string/>\n         </property>\n         <property name=\"maxLength\">\n          <number>25</number>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"NewContactEditLine\" name=\"rstRcvdEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"maximumSize\">\n          <size>\n           <width>65</width>\n           <height>16777215</height>\n          </size>\n         </property>\n         <property name=\"font\">\n          <font>\n           <pointsize>11</pointsize>\n          </font>\n         </property>\n         <property name=\"text\">\n          <string notr=\"true\"/>\n         </property>\n         <property name=\"maxLength\">\n          <number>25</number>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"0\" column=\"3\">\n      <widget class=\"QLabel\" name=\"callsignLabel\">\n       <property name=\"text\">\n        <string>Callsign</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"7\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n         <item>\n          <widget class=\"QLabel\" name=\"freqTXLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>TX: </string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"FreqQSpinBox\" name=\"freqTXEdit\">\n           <property name=\"enabled\">\n            <bool>true</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"specialValueText\">\n            <string>Blank</string>\n           </property>\n           <property name=\"keyboardTracking\">\n            <bool>false</bool>\n           </property>\n           <property name=\"suffix\">\n            <string> MHz</string>\n           </property>\n           <property name=\"decimals\">\n            <number>5</number>\n           </property>\n           <property name=\"maximum\">\n            <double>7500000.000000000000000</double>\n           </property>\n           <property name=\"singleStep\">\n            <double>0.001000000000000</double>\n           </property>\n           <property name=\"value\">\n            <double>0.000000000000000</double>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QComboBox\" name=\"bandTXCombo\"/>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n         <item>\n          <widget class=\"QLabel\" name=\"freqRXLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>RX: </string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"FreqQSpinBox\" name=\"freqRXEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"specialValueText\">\n            <string>Blank</string>\n           </property>\n           <property name=\"keyboardTracking\">\n            <bool>false</bool>\n           </property>\n           <property name=\"suffix\">\n            <string notr=\"true\"> MHz</string>\n           </property>\n           <property name=\"decimals\">\n            <number>5</number>\n           </property>\n           <property name=\"maximum\">\n            <double>7500000.000000000000000</double>\n           </property>\n           <property name=\"singleStep\">\n            <double>0.001000000000000</double>\n           </property>\n           <property name=\"value\">\n            <double>0.000000000000000</double>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QComboBox\" name=\"bandRXCombo\"/>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n     <item row=\"0\" column=\"7\">\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_14\">\n       <item>\n        <widget class=\"QLabel\" name=\"frequencyLabel\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>Frequency</string>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"horizontalSpacer_6\">\n         <property name=\"orientation\">\n          <enum>Qt::Horizontal</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>40</width>\n           <height>20</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"bandLabel\">\n         <property name=\"text\">\n          <string>Band</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QGridLayout\" name=\"gridLayout_2\">\n     <property name=\"horizontalSpacing\">\n      <number>6</number>\n     </property>\n     <property name=\"verticalSpacing\">\n      <number>0</number>\n     </property>\n     <item row=\"1\" column=\"3\">\n      <widget class=\"NewContactEditLine\" name=\"commentEdit\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>16777215</width>\n         <height>16777215</height>\n        </size>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <widget class=\"QLabel\" name=\"qthLabel\">\n       <property name=\"text\">\n        <string>QTH</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"nameLabel\">\n       <property name=\"text\">\n        <string>Name</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"2\">\n      <widget class=\"QLabel\" name=\"gridLabel\">\n       <property name=\"text\">\n        <string>Gridsquare</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"2\">\n      <widget class=\"NewContactEditLine\" name=\"gridEdit\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>120</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"maxLength\">\n        <number>12</number>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"3\">\n      <widget class=\"QLabel\" name=\"commentLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Comment</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"NewContactEditLine\" name=\"nameEdit\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>180</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"maxLength\">\n        <number>50</number>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"NewContactEditLine\" name=\"qthEdit\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>250</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"maxLength\">\n        <number>75</number>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"noteLabel\">\n       <property name=\"text\">\n        <string>My Notes</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n       <property name=\"rightMargin\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <widget class=\"QTextEdit\" name=\"noteEdit\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Expanding\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"minimumSize\">\n          <size>\n           <width>400</width>\n           <height>200</height>\n          </size>\n         </property>\n         <property name=\"acceptRichText\">\n          <bool>false</bool>\n         </property>\n         <property name=\"textInteractionFlags\">\n          <set>Qt::TextEditorInteraction</set>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QWebEngineView\" name=\"mapView\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"minimumSize\">\n          <size>\n           <width>600</width>\n           <height>0</height>\n          </size>\n         </property>\n         <property name=\"maximumSize\">\n          <size>\n           <width>16777215</width>\n           <height>16777215</height>\n          </size>\n         </property>\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::NoContextMenu</enum>\n         </property>\n         <property name=\"url\">\n          <url>\n           <string>about:blank</string>\n          </url>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Maximum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"focusPolicy\">\n      <enum>Qt::StrongFocus</enum>\n     </property>\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"tabDetails\">\n      <attribute name=\"title\">\n       <string>&amp;Details</string>\n      </attribute>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"countryLabel\">\n           <property name=\"text\">\n            <string>Country</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"contLabel\">\n           <property name=\"text\">\n            <string>Cont</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"ituLabel\">\n           <property name=\"text\">\n            <string>ITU</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"ituEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>50</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"maxLength\">\n            <number>2</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"cqLabel\">\n           <property name=\"text\">\n            <string>CQ</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"cqEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>50</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"maxLength\">\n            <number>2</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"stateLabel\">\n           <property name=\"text\">\n            <string>State</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"stateEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>200</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"countyLabel\">\n           <property name=\"text\">\n            <string>County</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"countyEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>200</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"0\">\n          <widget class=\"QLabel\" name=\"ageLabel\">\n           <property name=\"text\">\n            <string>Age</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"ageEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"maximumSize\">\n            <size>\n             <width>50</width>\n             <height>16777215</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"contEdit\">\n           <property name=\"enabled\">\n            <bool>true</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::WheelFocus</enum>\n           </property>\n           <property name=\"sizeAdjustPolicy\">\n            <enum>QComboBox::AdjustToContents</enum>\n           </property>\n           <item>\n            <property name=\"text\">\n             <string/>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>AF</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>AN</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>AS</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>EU</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>NA</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>OC</string>\n            </property>\n           </item>\n           <item>\n            <property name=\"text\">\n             <string>SA</string>\n            </property>\n           </item>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"0\">\n          <widget class=\"QLabel\" name=\"vuccLabel\">\n           <property name=\"text\">\n            <string>VUCC</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"vuccEdit\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"toolTip\">\n            <string>two or four adjacent Gridsquares, each four characters long, (ex. EN98,FM08,EM97,FM07)</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"SmartSearchBox\" name=\"countryBox\" native=\"true\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_2\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"iotaLabel\">\n           <property name=\"text\">\n            <string>IOTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"iotaEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"potaLabel\">\n           <property name=\"text\">\n            <string>POTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"potaEdit\"/>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"sotaLabel\">\n           <property name=\"text\">\n            <string>SOTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"sotaEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"wwffLabel\">\n           <property name=\"text\">\n            <string>WWFF</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"wwffEdit\"/>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"sigLabel\">\n           <property name=\"text\">\n            <string>SIG</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"sigEdit\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"sigInfoLabel\">\n           <property name=\"text\">\n            <string>SIG Info</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"sigInfoEdit\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_7\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <property name=\"leftMargin\">\n          <number>0</number>\n         </property>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"fistsLabel\">\n           <property name=\"text\">\n            <string>FISTS</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"fistsEdit\"/>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"skccLabel\">\n           <property name=\"text\">\n            <string>SKCC</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"tentenLabel\">\n           <property name=\"text\">\n            <string>Ten-Ten</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"uksmgLabel\">\n           <property name=\"text\">\n            <string>UKSMG</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"skccEdit\"/>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"tentenEdit\"/>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"uksmgEdit\"/>\n         </item>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"dokLabel\">\n           <property name=\"text\">\n            <string>DOK</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"dokEdit\">\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"toolTip\">\n            <string>the contacted station's DARC DOK (District Location Code) (ex. A01)</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"fistsCCLabel\">\n           <property name=\"text\">\n            <string>FISTS CC</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"QLineEdit\" name=\"fistsCCEdit\"/>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_3\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"emailLabel\">\n           <property name=\"text\">\n            <string>E-Mail</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"emailEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"urlLabel\">\n           <property name=\"text\">\n            <string>URL</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"urlEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"propagationModeLabel\">\n           <property name=\"text\">\n            <string>Propagation Mode</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"propagationModeEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>300</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::WheelFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"satNameLabel\">\n           <property name=\"text\">\n            <string>Satellite Name</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"QLineEdit\" name=\"satNameEdit\">\n           <property name=\"enabled\">\n            <bool>false</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"satModeLabel\">\n           <property name=\"text\">\n            <string>Satellite Mode</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"satModeEdit\">\n           <property name=\"enabled\">\n            <bool>false</bool>\n           </property>\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>300</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::WheelFocus</enum>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"dxStatTab\">\n      <attribute name=\"title\">\n       <string>D&amp;X Stats</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_10\">\n       <item>\n        <widget class=\"QLabel\" name=\"dxccTableLabel\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>&lt;b&gt;DXCC Statistics&lt;/b&gt;</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"DxccTableWidget\" name=\"dxccTableWidget\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"verticalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"horizontalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustToContentsOnFirstShow</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>45</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>23</number>\n         </attribute>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"stationTableLabel\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>&lt;b&gt;Station Statistics&lt;/b&gt;</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"DxccTableWidget\" name=\"stationTableWidget\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"verticalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"horizontalScrollBarPolicy\">\n          <enum>Qt::ScrollBarAlwaysOff</enum>\n         </property>\n         <property name=\"sizeAdjustPolicy\">\n          <enum>QAbstractScrollArea::AdjustToContents</enum>\n         </property>\n         <property name=\"editTriggers\">\n          <set>QAbstractItemView::NoEditTriggers</set>\n         </property>\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"horizontalHeaderDefaultSectionSize\">\n          <number>45</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>23</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tabMyStation\">\n      <attribute name=\"title\">\n       <string>M&amp;y Station</string>\n      </attribute>\n      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_16\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_5\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myCallsignLabel\">\n           <property name=\"text\">\n            <string>Callsign</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myCallsignEdit\"/>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myOperatorNameLabel\">\n           <property name=\"text\">\n            <string>Operator Name</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myOperatorNameEdit\"/>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myCountryLabel\">\n           <property name=\"text\">\n            <string>Country</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_15\">\n           <item>\n            <widget class=\"QLabel\" name=\"myITULabel\">\n             <property name=\"text\">\n              <string>ITU</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"NewContactEditLine\" name=\"myITUEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"maximumSize\">\n              <size>\n               <width>50</width>\n               <height>16777215</height>\n              </size>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"myCQLabel\">\n             <property name=\"text\">\n              <string>CQ</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"NewContactEditLine\" name=\"myCQEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"maximumSize\">\n              <size>\n               <width>50</width>\n               <height>16777215</height>\n              </size>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_7\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myGridLabel\">\n           <property name=\"text\">\n            <string>Gridsquare</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myGridEdit\"/>\n         </item>\n         <item row=\"6\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myQTHLabel\">\n           <property name=\"text\">\n            <string>QTH</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myQTHEdit\"/>\n         </item>\n         <item row=\"7\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myCountyLabel\">\n           <property name=\"text\">\n            <string>County</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myCountyEdit\"/>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myOperatorCallsignLabel\">\n           <property name=\"text\">\n            <string>Operator Callsign</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myOperatorCallsignEdit\"/>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"SmartSearchBox\" name=\"myCountryBox\" native=\"true\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"label\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_4\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myIOTALabel\">\n           <property name=\"text\">\n            <string>IOTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myIOTAEdit\"/>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myPOTALabel\">\n           <property name=\"text\">\n            <string>POTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myPOTAEdit\"/>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"mySOTALabel\">\n           <property name=\"text\">\n            <string>SOTA</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"mySOTAEdit\"/>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myWWFFLabel\">\n           <property name=\"text\">\n            <string>WWFF</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myWWFFEdit\"/>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"mySIGLabel\">\n           <property name=\"text\">\n            <string>SIG</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"mySIGEdit\"/>\n         </item>\n         <item row=\"6\" column=\"0\">\n          <widget class=\"QLabel\" name=\"mySIGInfoLabel\">\n           <property name=\"text\">\n            <string>Sig Info</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"mySIGInfoEdit\"/>\n         </item>\n         <item row=\"7\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myVUCCEdit\"/>\n         </item>\n         <item row=\"7\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myVUCCLabel\">\n           <property name=\"text\">\n            <string>VUCC</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myDOKLabel\">\n           <property name=\"text\">\n            <string>DOK</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myDOKEdit\"/>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QFormLayout\" name=\"formLayout_6\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myRigLabel\">\n           <property name=\"text\">\n            <string>Rig</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myRigEdit\"/>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"myAntLabel\">\n           <property name=\"text\">\n            <string>Antenna</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"myAntEdit\"/>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"powerLabel\">\n           <property name=\"text\">\n            <string>Power</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <widget class=\"BaseDoubleSpinBox\" name=\"powerEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::ClickFocus</enum>\n           </property>\n           <property name=\"specialValueText\">\n            <string>Blank</string>\n           </property>\n           <property name=\"suffix\">\n            <string> W</string>\n           </property>\n           <property name=\"decimals\">\n            <number>3</number>\n           </property>\n           <property name=\"maximum\">\n            <double>1000000.000000000000000</double>\n           </property>\n           <property name=\"value\">\n            <double>0.000000000000000</double>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tabQSL\">\n      <attribute name=\"title\">\n       <string>&amp;QSL</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <item>\n        <layout class=\"QGridLayout\" name=\"gridLayout_3\">\n         <property name=\"verticalSpacing\">\n          <number>4</number>\n         </property>\n         <item row=\"1\" column=\"2\">\n          <spacer name=\"horizontalSpacer_4\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeType\">\n            <enum>QSizePolicy::Maximum</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>20</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n         <item row=\"5\" column=\"4\">\n          <widget class=\"QPushButton\" name=\"qslEqslPicButton\">\n           <property name=\"enabled\">\n            <bool>true</bool>\n           </property>\n           <property name=\"text\">\n            <string>Show QSL Card</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n           <item>\n            <widget class=\"QDateEdit\" name=\"qslPaperReceiveDateEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"specialValueText\">\n              <string>Blank</string>\n             </property>\n             <property name=\"dateTime\">\n              <datetime>\n               <hour>0</hour>\n               <minute>0</minute>\n               <second>0</second>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </datetime>\n             </property>\n             <property name=\"minimumDate\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslPaperReceiveStatusBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>105</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an incoming QSL card has been received; the QSO has been confirmed by the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - an incoming QSL card has not been received; the QSO has not been confirmed by the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the logging station has requested a QSL card; the logging station has requested the QSO be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"0\" column=\"2\">\n          <widget class=\"QLabel\" name=\"label_3\">\n           <property name=\"text\">\n            <string notr=\"true\"/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"3\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n           <item>\n            <widget class=\"QLabel\" name=\"qslLotwReceiveDateLabel\">\n             <property name=\"text\">\n              <string>-</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"qslLotwReceiveStatusLabel\">\n             <property name=\"text\">\n              <string>-</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"3\" column=\"1\">\n          <widget class=\"QComboBox\" name=\"qslSentViaBox\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>105</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::WheelFocus</enum>\n           </property>\n          </widget>\n         </item>\n         <item row=\"3\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslSentViaLabel\">\n           <property name=\"text\">\n            <string>QSL Sent via</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"1\">\n          <widget class=\"NewContactEditLine\" name=\"qslViaEdit\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"minimumSize\">\n            <size>\n             <width>0</width>\n             <height>0</height>\n            </size>\n           </property>\n           <property name=\"focusPolicy\">\n            <enum>Qt::StrongFocus</enum>\n           </property>\n           <property name=\"maxLength\">\n            <number>25</number>\n           </property>\n          </widget>\n         </item>\n         <item row=\"4\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslViaLabel\">\n           <property name=\"text\">\n            <string>QSL via</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"7\" column=\"1\" colspan=\"4\">\n          <widget class=\"QLineEdit\" name=\"qslReceivedMsgEdit\"/>\n         </item>\n         <item row=\"2\" column=\"4\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n           <item>\n            <widget class=\"QDateEdit\" name=\"qslEqslSentDateEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"specialValueText\">\n              <string>Blank</string>\n             </property>\n             <property name=\"minimumDate\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n             <property name=\"date\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslEqslSentStatusBox\">\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n           <item>\n            <widget class=\"QDateEdit\" name=\"qslPaperSentDateEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"specialValueText\">\n              <string>Blank</string>\n             </property>\n             <property name=\"dateTime\">\n              <datetime>\n               <hour>0</hour>\n               <minute>0</minute>\n               <second>0</second>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </datetime>\n             </property>\n             <property name=\"minimumDate\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslPaperSentStatusBox\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"minimumSize\">\n              <size>\n               <width>105</width>\n               <height>0</height>\n              </size>\n             </property>\n             <property name=\"focusPolicy\">\n              <enum>Qt::WheelFocus</enum>\n             </property>\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslReceiveLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Received</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"4\">\n          <widget class=\"QLabel\" name=\"eqslHeaderLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"font\">\n            <font>\n             <bold>true</bold>\n            </font>\n           </property>\n           <property name=\"text\">\n            <string>eQSL</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"1\">\n          <widget class=\"QPushButton\" name=\"qslPaperPicButton\">\n           <property name=\"enabled\">\n            <bool>true</bool>\n           </property>\n           <property name=\"text\">\n            <string>Manage QSL Card</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"4\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n           <item>\n            <widget class=\"QLabel\" name=\"qslEqslReceiveDateLabel\">\n             <property name=\"text\">\n              <string>-</string>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"qslEqslReceiveStatusLabel\">\n             <property name=\"text\">\n              <string>-</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"padding\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <widget class=\"QLabel\" name=\"paperHeaderLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Maximum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"font\">\n            <font>\n             <bold>true</bold>\n            </font>\n           </property>\n           <property name=\"text\">\n            <string>Paper</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"5\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslReceiveStatusLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslSentLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string>Sent</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"3\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n           <item>\n            <widget class=\"QDateEdit\" name=\"qslLotwSentDateEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"specialValueText\">\n              <string>Blank</string>\n             </property>\n             <property name=\"minimumDate\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n             <property name=\"date\">\n              <date>\n               <year>1900</year>\n               <month>1</month>\n               <day>1</day>\n              </date>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QComboBox\" name=\"qslLotwSentStatusBox\">\n             <property name=\"toolTip\">\n              <string>&lt;b&gt;Yes&lt;/b&gt; - an outgoing QSL card has been sent; the QSO has been uploaded to, and accepted by, the online service&lt;br/&gt;&lt;b&gt;No&lt;/b&gt; - do not send an outgoing QSL card; do not upload the QSO to the online service&lt;br/&gt;&lt;b&gt;Requested&lt;/b&gt; - the contacted station has requested a QSL card; the contacted station has requested the QSO be uploaded to the online service&lt;br/&gt;&lt;b&gt;Queued&lt;/b&gt; - an outgoing QSL card has been selected to be sent; a QSO has been selected to be uploaded to the online service&lt;br/&gt;</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item row=\"7\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslReceivedMsgLabel\">\n           <property name=\"text\">\n            <string>QSLr Message</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"3\">\n          <widget class=\"QLabel\" name=\"lotwHeaderLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Preferred\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"font\">\n            <font>\n             <bold>true</bold>\n            </font>\n           </property>\n           <property name=\"text\">\n            <string>LoTW</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"0\">\n          <widget class=\"QLabel\" name=\"qslSentMsgLabel\">\n           <property name=\"text\">\n            <string>QSLs Message</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"6\" column=\"1\" colspan=\"4\">\n          <widget class=\"QLineEdit\" name=\"qslSentMsgEdit\"/>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tabContest\">\n      <attribute name=\"title\">\n       <string>&amp;Contest</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n         <item>\n          <layout class=\"QFormLayout\" name=\"formLayout_9\">\n           <item row=\"0\" column=\"0\">\n            <widget class=\"QLabel\" name=\"contestIDLabel\">\n             <property name=\"text\">\n              <string>Contest ID</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"0\" column=\"1\">\n            <widget class=\"NewContactEditLine\" name=\"contestIDEdit\"/>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"srxLabel\">\n             <property name=\"text\">\n              <string>RcvNr</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"NewContactEditLine\" name=\"srxEdit\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"srxStringLabel\">\n             <property name=\"text\">\n              <string>RcvExch</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"NewContactEditLine\" name=\"srxStringEdit\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"0\">\n            <widget class=\"QLabel\" name=\"stxLabel\">\n             <property name=\"text\">\n              <string>SendNr</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"1\">\n            <widget class=\"NewContactEditLine\" name=\"stxEdit\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n           <item row=\"4\" column=\"0\">\n            <widget class=\"QLabel\" name=\"stxStringLabel\">\n             <property name=\"text\">\n              <string>SendExch</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"4\" column=\"1\">\n            <widget class=\"NewContactEditLine\" name=\"stxStringEdit\">\n             <property name=\"enabled\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </item>\n         <item>\n          <spacer name=\"horizontalSpacer_3\">\n           <property name=\"orientation\">\n            <enum>Qt::Horizontal</enum>\n           </property>\n           <property name=\"sizeType\">\n            <enum>QSizePolicy::Expanding</enum>\n           </property>\n           <property name=\"sizeHint\" stdset=\"0\">\n            <size>\n             <width>40</width>\n             <height>20</height>\n            </size>\n           </property>\n          </spacer>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_13\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <property name=\"rightMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"memberLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Member:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"memberListLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\"/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_5\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n     <property name=\"centerButtons\">\n      <bool>false</bool>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>QWebEngineView</class>\n   <extends>QWidget</extends>\n   <header location=\"global\">QtWebEngineWidgets/QWebEngineView</header>\n  </customwidget>\n  <customwidget>\n   <class>NewContactEditLine</class>\n   <extends>QLineEdit</extends>\n   <header>ui/component/EditLine.h</header>\n  </customwidget>\n  <customwidget>\n   <class>DxccTableWidget</class>\n   <extends>QTableView</extends>\n   <header>ui/DxccTableWidget.h</header>\n  </customwidget>\n  <customwidget>\n   <class>FreqQSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/FreqQSpinBox.h</header>\n  </customwidget>\n  <customwidget>\n   <class>SmartSearchBox</class>\n   <extends>QWidget</extends>\n   <header>ui/component/SmartSearchBox.h</header>\n   <container>1</container>\n  </customwidget>\n  <customwidget>\n   <class>BaseDoubleSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/BaseDoubleSpinBox.h</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>dateTimeOnEdit</tabstop>\n  <tabstop>dateTimeOffEdit</tabstop>\n  <tabstop>timeLockButton</tabstop>\n  <tabstop>callsignEdit</tabstop>\n  <tabstop>rstSentEdit</tabstop>\n  <tabstop>rstRcvdEdit</tabstop>\n  <tabstop>modeEdit</tabstop>\n  <tabstop>submodeEdit</tabstop>\n  <tabstop>freqTXEdit</tabstop>\n  <tabstop>freqRXEdit</tabstop>\n  <tabstop>bandTXCombo</tabstop>\n  <tabstop>bandRXCombo</tabstop>\n  <tabstop>freqLockButton</tabstop>\n  <tabstop>nameEdit</tabstop>\n  <tabstop>qthEdit</tabstop>\n  <tabstop>gridEdit</tabstop>\n  <tabstop>commentEdit</tabstop>\n  <tabstop>noteEdit</tabstop>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>countryBox</tabstop>\n  <tabstop>contEdit</tabstop>\n  <tabstop>ituEdit</tabstop>\n  <tabstop>cqEdit</tabstop>\n  <tabstop>stateEdit</tabstop>\n  <tabstop>countyEdit</tabstop>\n  <tabstop>ageEdit</tabstop>\n  <tabstop>vuccEdit</tabstop>\n  <tabstop>iotaEdit</tabstop>\n  <tabstop>potaEdit</tabstop>\n  <tabstop>sotaEdit</tabstop>\n  <tabstop>wwffEdit</tabstop>\n  <tabstop>sigEdit</tabstop>\n  <tabstop>sigInfoEdit</tabstop>\n  <tabstop>dokEdit</tabstop>\n  <tabstop>fistsEdit</tabstop>\n  <tabstop>fistsCCEdit</tabstop>\n  <tabstop>skccEdit</tabstop>\n  <tabstop>tentenEdit</tabstop>\n  <tabstop>uksmgEdit</tabstop>\n  <tabstop>emailEdit</tabstop>\n  <tabstop>urlEdit</tabstop>\n  <tabstop>propagationModeEdit</tabstop>\n  <tabstop>satNameEdit</tabstop>\n  <tabstop>satModeEdit</tabstop>\n  <tabstop>dxccTableWidget</tabstop>\n  <tabstop>myCallsignEdit</tabstop>\n  <tabstop>myOperatorNameEdit</tabstop>\n  <tabstop>myOperatorCallsignEdit</tabstop>\n  <tabstop>myCountryBox</tabstop>\n  <tabstop>myITUEdit</tabstop>\n  <tabstop>myCQEdit</tabstop>\n  <tabstop>myGridEdit</tabstop>\n  <tabstop>myQTHEdit</tabstop>\n  <tabstop>myCountyEdit</tabstop>\n  <tabstop>myDOKEdit</tabstop>\n  <tabstop>myIOTAEdit</tabstop>\n  <tabstop>myPOTAEdit</tabstop>\n  <tabstop>mySOTAEdit</tabstop>\n  <tabstop>myWWFFEdit</tabstop>\n  <tabstop>mySIGEdit</tabstop>\n  <tabstop>mySIGInfoEdit</tabstop>\n  <tabstop>myVUCCEdit</tabstop>\n  <tabstop>myRigEdit</tabstop>\n  <tabstop>myAntEdit</tabstop>\n  <tabstop>qslPaperReceiveDateEdit</tabstop>\n  <tabstop>qslPaperReceiveStatusBox</tabstop>\n  <tabstop>qslPaperSentDateEdit</tabstop>\n  <tabstop>qslPaperSentStatusBox</tabstop>\n  <tabstop>qslLotwSentDateEdit</tabstop>\n  <tabstop>qslLotwSentStatusBox</tabstop>\n  <tabstop>qslEqslSentDateEdit</tabstop>\n  <tabstop>qslEqslSentStatusBox</tabstop>\n  <tabstop>qslSentViaBox</tabstop>\n  <tabstop>qslViaEdit</tabstop>\n  <tabstop>qslPaperPicButton</tabstop>\n  <tabstop>qslEqslPicButton</tabstop>\n  <tabstop>contestIDEdit</tabstop>\n  <tabstop>srxEdit</tabstop>\n  <tabstop>srxStringEdit</tabstop>\n  <tabstop>stxEdit</tabstop>\n  <tabstop>stxStringEdit</tabstop>\n  <tabstop>stationTableWidget</tabstop>\n  <tabstop>qslReceivedMsgEdit</tabstop>\n  <tabstop>qslSentMsgEdit</tabstop>\n </tabstops>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>864</x>\n     <y>751</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>354</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>864</x>\n     <y>751</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>354</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>modeEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>modeChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>694</x>\n     <y>70</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>354</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qslPaperPicButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>showPaperButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>317</x>\n     <y>662</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>309</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qslEqslPicButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>showEQSLButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>661</x>\n     <y>662</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>309</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateTimeOnEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>dateTimeOnChanged(QDateTime)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>163</x>\n     <y>41</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateTimeOffEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>dateTimeOffChanged(QDateTime)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>163</x>\n     <y>74</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>timeLockButton</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>timeLockToggled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>266</x>\n     <y>58</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>callsignChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>424</x>\n     <y>58</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>propagationModeEdit</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>propagationModeChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>738</x>\n     <y>496</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>565</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>gridEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>DXGridChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>511</x>\n     <y>128</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>508</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myGridEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>myGridChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>237</x>\n     <y>496</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>508</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>freqLockButton</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>freqLockToggled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>995</x>\n     <y>58</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>508</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>freqRXEdit</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>freqRXChanged(double)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>896</x>\n     <y>75</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>508</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>freqTXEdit</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>freqTXChanged(double)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>896</x>\n     <y>41</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>508</x>\n     <y>380</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>sotaEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>sotaChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>362</x>\n     <y>467</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>mySOTAEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>mySotaChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>539</x>\n     <y>467</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myWWFFEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>myWWFFChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>539</x>\n     <y>591</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wwffEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>wwffChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>362</x>\n     <y>622</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>potaEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>potaChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>362</x>\n     <y>488</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myPOTAEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>myPOTAChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>539</x>\n     <y>457</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>344</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>callsignEdit</sender>\n   <signal>editingFinished()</signal>\n   <receiver>QSODetailDialog</receiver>\n   <slot>callsignEditFinished()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>410</x>\n     <y>53</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>513</x>\n     <y>356</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>modeChanged(QString)</slot>\n  <slot>showPaperButton()</slot>\n  <slot>showEQSLButton()</slot>\n  <slot>dateTimeOnChanged(QDateTime)</slot>\n  <slot>dateTimeOffChanged(QDateTime)</slot>\n  <slot>timeLockToggled(bool)</slot>\n  <slot>callsignChanged(QString)</slot>\n  <slot>propagationModeChanged(QString)</slot>\n  <slot>DXGridChanged(QString)</slot>\n  <slot>myGridChanged(QString)</slot>\n  <slot>freqLockToggled(bool)</slot>\n  <slot>freqTXChanged(double)</slot>\n  <slot>freqRXChanged(double)</slot>\n  <slot>sotaChanged(QString)</slot>\n  <slot>mySotaChanged(QString)</slot>\n  <slot>wwffChanged(QString)</slot>\n  <slot>myWWFFChanged(QString)</slot>\n  <slot>potaChanged(QString)</slot>\n  <slot>myPOTAChanged(QString)</slot>\n  <slot>callsignEditFinished()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/QSOFilterDetail.cpp",
    "content": "#include <QStringListModel>\n#include <QMessageBox>\n#include <QDateTimeEdit>\n#include <QStackedWidget>\n#include \"QSOFilterDetail.h\"\n#include \"ui_QSOFilterDetail.h\"\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"core/QSOFilterManager.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.qsofilterdetail\");\n\nQSOFilterDetail::QSOFilterDetail(const QString &filterName, QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSOFilterDetail),\n    filterName(filterName),\n    condCount(0)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    if ( ! filterName.isEmpty() )\n        loadFilter(filterName);\n    else\n    {\n        /* get Filters name from DB to checking whether a new filter name\n         * will be unique */\n        filterNamesList = QSOFilterManager::instance()->getFilterList();\n    }\n}\n\nQSOFilterDetail::~QSOFilterDetail()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid QSOFilterDetail::addCondition(int fieldIdx, int operatorId, QString value)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << \"FieldIDX: \" << fieldIdx << \" Operator: \" << operatorId << \" Value: \" << value;\n\n    QHBoxLayout* conditionLayout = new QHBoxLayout();\n    conditionLayout->setObjectName(QString::fromUtf8(\"conditionLayout%1\").arg(condCount));\n\n    /***************/\n    /* Field Combo */\n    /***************/\n    QComboBox* fieldNameCombo = new QComboBox(this);\n    fieldNameCombo->setObjectName(QString::fromUtf8(\"fieldNameCombo%1\").arg(condCount));\n    QSizePolicy sizePolicy1(QSizePolicy::Maximum, QSizePolicy::Fixed);\n    sizePolicy1.setHorizontalStretch(0);\n    sizePolicy1.setVerticalStretch(0);\n    sizePolicy1.setHeightForWidth(fieldNameCombo->sizePolicy().hasHeightForWidth());\n    fieldNameCombo->setSizePolicy(sizePolicy1);\n\n    QList<QPair<LogbookModel::ColumnID, QString>> items;\n\n    for ( int i = LogbookModel::ColumnID::COLUMN_ID; i < LogbookModel::ColumnID::COLUMN_LAST_ELEMENT; ++i )\n    {\n        LogbookModel::ColumnID columnID = static_cast<LogbookModel::ColumnID>(i);\n        items.append({columnID, LogbookModel::getFieldNameTranslation(columnID)});\n    }\n\n    std::sort(items.begin(), items.end(), [](const QPair<LogbookModel::ColumnID, QString>& a,\n                                             const QPair<LogbookModel::ColumnID, QString>& b)\n    {\n        return a.second.localeAwareCompare(b.second) < 0;\n    });\n\n    for (const auto& item : items)\n        fieldNameCombo->addItem(item.second, item.first);\n\n    /* Do not set combo value here because we will connect signal Change later */\n    conditionLayout->addWidget(fieldNameCombo);\n\n    /*******************/\n    /* Condition Combo */\n    /*******************/\n    QComboBox* conditionCombo = new QComboBox(this);\n    conditionCombo->addItem(QString(tr(\"Equal\")));\n    conditionCombo->addItem(QString(tr(\"Not Equal\")));\n    conditionCombo->addItem(QString(tr(\"Contains\")));\n    conditionCombo->addItem(QString(tr(\"Not Contains\")));\n    conditionCombo->addItem(QString(tr(\"Greater Than\")));\n    conditionCombo->addItem(QString(tr(\"Less Than\")));\n    conditionCombo->addItem(QString(tr(\"Starts with\")));\n    conditionCombo->addItem(QString(tr(\"RegExp\")));\n    conditionCombo->setObjectName(QString::fromUtf8(\"conditionCombo%1\").arg(condCount));\n\n    if ( operatorId >= 0 )\n        conditionCombo->setCurrentIndex(operatorId);\n\n    conditionLayout->addWidget(conditionCombo);\n\n    /**************/\n    /* Value Edit */\n    /**************/\n\n    QSizePolicy sizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);\n    sizePolicy.setHorizontalStretch(0);\n    sizePolicy.setVerticalStretch(0);\n\n    // use stack to change Line and Date Edit - it will depend on column from combo selection\n    QStackedWidget* stacked = new QStackedWidget(this);\n    stacked->setObjectName(QString::fromUtf8(\"stackedValueEdit%1\").arg(condCount));\n    stacked->setMaximumSize(QSize(16777215, 30));\n    stacked->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);\n    stacked->setSizePolicy(sizePolicy);\n\n    stacked->addWidget(createLineEdit(value, condCount, sizePolicy));\n    stacked->addWidget(createDateEdit(value, condCount, sizePolicy));\n    stacked->addWidget(createDateTimeEdit(value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->qslSentEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->qslSentViaEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->qslRcvdEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->uploadStatusEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->antPathEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->boolEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->qsoCompleteEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->downloadStatusEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->morseKeyTypeEnum, value, condCount, sizePolicy));\n    stacked->addWidget(createComboBox(Data::instance()->eqslAgEnum, value, condCount, sizePolicy));\n\n    conditionLayout->addWidget(stacked);\n\n    // connect field combo and stacked widged to switch correct Edit Widget\n    connect(fieldNameCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),\n            this, [this, stacked, value, fieldNameCombo](int)\n    {\n        /* Index is mapped the same way as LogbookModel columns\n           Therefore, we can use Column aliases here\n         */\n        int fieldIndex = fieldNameCombo->currentData().toInt();\n\n        if ( this->isDateField(fieldIndex) )\n            stacked->setCurrentIndex(1); //Date Edit\n        else if ( this->isDateTimeField(fieldIndex) )\n            stacked->setCurrentIndex(2); //DateTime edit\n        else if ( this->isQSLSentField(fieldIndex) )\n            stacked->setCurrentIndex(3);\n        else if ( this->isQSLSentViaField(fieldIndex) )\n            stacked->setCurrentIndex(4);\n        else if ( this->isQSLRcvdField(fieldIndex) )\n            stacked->setCurrentIndex(5);\n        else if ( this->isUploadStatusField(fieldIndex) )\n            stacked->setCurrentIndex(6);\n        else if ( this->isAntPathField(fieldIndex) )\n            stacked->setCurrentIndex(7);\n        else if ( this->isBoolField(fieldIndex) )\n            stacked->setCurrentIndex(8);\n        else if ( this->isQSOCompleteField(fieldIndex) )\n            stacked->setCurrentIndex(9);\n        else if ( this->isDownloadStatusField(fieldIndex))\n            stacked->setCurrentIndex(10);\n        else if ( this->isMorseKeyTypeField(fieldIndex))\n            stacked->setCurrentIndex(11);\n        else if ( this->isEqslAgTypeField(fieldIndex))\n            stacked->setCurrentIndex(12);\n        else\n            stacked->setCurrentIndex(0);\n    });\n\n    /* Set FieldNameCombo here to update Stacked Widget */\n    if ( fieldIdx >= 0 )\n    {\n        int index = fieldNameCombo->findData(fieldIdx);\n        if (index != -1)\n            fieldNameCombo->setCurrentIndex(index);\n    }\n\n    /*****************/\n    /* Remove Button */\n    /*****************/\n    QPushButton* removeButton = new QPushButton(tr(\"Remove\"), this);\n    removeButton->setObjectName(QString::fromUtf8(\"removeButton%1\").arg(condCount));\n\n    conditionLayout->addWidget(removeButton);\n\n    connect(removeButton, &QPushButton::clicked, this, [conditionLayout]()\n    {\n        QLayoutItem *item = NULL;\n        while ((item = conditionLayout->takeAt(0)) != 0)\n        {\n            delete item->widget();\n            delete item;\n        }\n        conditionLayout->deleteLater();\n    });\n\n    /**************************/\n    /* Add to the main layout */\n    /**************************/\n    ui->conditionsLayout->addLayout(conditionLayout);\n\n    condCount++;\n}\n\nvoid QSOFilterDetail::loadFilter(const QString &filterName)\n{\n    FCT_IDENTIFICATION;\n\n    ui->filterLineEdit->setText(filterName);\n    ui->filterLineEdit->setEnabled(false);\n\n    const QSOFilter &filter = QSOFilterManager::instance()->getFilter(filterName);\n\n    if ( filter.filterName == filterName )\n    {\n        ui->matchingCombo->setCurrentIndex(filter.machingType);\n\n        for ( const QSOFilterRule &rule : filter.rules )\n            addCondition(rule.tableFieldIndex, rule.operatorID, rule.value);\n    }\n}\n\nbool QSOFilterDetail::filterExists(const QString &filterName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << filterName;\n\n    return filterNamesList.contains(filterName);\n}\n\nbool QSOFilterDetail::isDateField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_QSL_RCVD_DATE\n                 || index == LogbookModel::COLUMN_QSL_SENT_DATE\n                 || index == LogbookModel::COLUMN_LOTW_RCVD_DATE\n                 || index == LogbookModel::COLUMN_LOTW_SENT_DATE\n                 || index == LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_DATE\n                 || index == LogbookModel::COLUMN_EQSL_QSLRDATE\n                 || index == LogbookModel::COLUMN_EQSL_QSLSDATE\n                 || index == LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_DATE\n                 || index == LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_DATE\n                 || index == LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_DATE\n                 || index == LogbookModel::COLUMN_DCL_QSLRDATE\n                 || index == LogbookModel::COLUMN_DCL_QSLSDATE\n                 || index == LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_DATE);\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isDateTimeField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_TIME_ON\n                 || index == LogbookModel::COLUMN_TIME_OFF );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isQSLSentField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_QSL_SENT\n                 || index == LogbookModel::COLUMN_LOTW_SENT\n                 || index == LogbookModel::COLUMN_EQSL_QSL_SENT\n                 || index == LogbookModel::COLUMN_DCL_QSL_SENT);\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isQSLSentViaField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_QSL_SENT_VIA\n                 || index == LogbookModel::COLUMN_QSL_RCVD_VIA );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isQSLRcvdField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_QSL_RCVD\n                 || index == LogbookModel::COLUMN_LOTW_RCVD\n                 || index == LogbookModel::COLUMN_EQSL_QSL_RCVD\n                 || index == LogbookModel::COLUMN_DCL_QSL_RCVD);\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isUploadStatusField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_CLUBLOG_QSO_UPLOAD_STATUS\n                 || index == LogbookModel::COLUMN_HRDLOG_QSO_UPLOAD_STATUS\n                 || index == LogbookModel::COLUMN_QRZCOM_QSO_UPLOAD_STATUS\n                 || index == LogbookModel::COLUMN_HAMLOGEU_QSO_UPLOAD_STATUS\n                 || index == LogbookModel::COLUMN_HAMQTH_QSO_UPLOAD_STATUS);\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isAntPathField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_ANT_PATH );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isBoolField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = (    index == LogbookModel::COLUMN_FORCE_INIT\n                 || index == LogbookModel::COLUMN_QSO_RANDOM\n                 || index == LogbookModel::COLUMN_SILENT_KEY\n                 || index == LogbookModel::COLUMN_SWL);\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isQSOCompleteField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = ( index == LogbookModel::COLUMN_QSO_COMPLETE );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isDownloadStatusField(int index)\n{\n    FCT_IDENTIFICATION;\n\n    bool ret = ( index == LogbookModel::COLUMN_QRZCOM_QSO_DOWNLOAD_STATUS );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isMorseKeyTypeField(int index)\n{\n    bool ret = ( index == LogbookModel::COLUMN_MORSE_KEY_TYPE\n                 || index == LogbookModel::COLUMN_MY_MORSE_KEY_TYPE );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nbool QSOFilterDetail::isEqslAgTypeField(int index)\n{\n    bool ret = ( index == LogbookModel::COLUMN_EQSL_AG );\n\n    qCDebug(function_parameters) << index << \" return \" << ret;\n    return ret;\n}\n\nQComboBox* QSOFilterDetail::createComboBox(const QMap<QString, QString> &mapping,\n                                           const QString &value, const int identifier,\n                                           const QSizePolicy &sizepolicy)\n{\n    FCT_IDENTIFICATION;\n\n    QComboBox* combo = new QComboBox();\n    combo->setObjectName(QString::fromUtf8(\"valueCombo%1\").arg(identifier));\n    combo->setFocusPolicy(Qt::ClickFocus);\n\n    QMapIterator<QString, QString> iter(mapping);\n    int iter_index = 0;\n    int value_index = 0;\n    while ( iter.hasNext() )\n    {\n        iter.next();\n        combo->addItem(iter.value(), iter.key());\n        if ( ! value.isEmpty() && iter.key() == value )\n            value_index = iter_index;\n        iter_index++;\n    }\n    combo->setCurrentIndex(value_index);\n    combo->setSizePolicy(sizepolicy);\n\n    return combo;\n}\n\nQDateEdit *QSOFilterDetail::createDateEdit(const QString &value, const int identified,\n                                           const QSizePolicy &sizepolicy)\n{\n    FCT_IDENTIFICATION;\n\n\n    QDateEdit* valueDate = new QDateEdit();\n    valueDate->setObjectName(QString::fromUtf8(\"valueDateEdit%1\").arg(identified));\n    valueDate->setFocusPolicy(Qt::ClickFocus);\n    valueDate->setCalendarPopup(true);\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n    valueDate->setTimeZone(QTimeZone::UTC);\n#else\n    valueDate->setTimeSpec(Qt::UTC);\n#endif\n    valueDate->setDisplayFormat(locale.formatDateShortWithYYYY());\n    valueDate->setSizePolicy(sizepolicy);\n    if ( !value.isEmpty() )\n        valueDate->setDate(QDate::fromString(value, \"yyyy-MM-dd\"));\n    return valueDate;\n}\n\nQDateTimeEdit *QSOFilterDetail::createDateTimeEdit(const QString &value, const int identified,\n                                                   const QSizePolicy &sizepolicy)\n{\n    FCT_IDENTIFICATION;\n\n    QDateTimeEdit* valueDateTime = new QDateTimeEdit();\n    valueDateTime->setObjectName(QString::fromUtf8(\"valueDateTimeEdit%1\").arg(identified));\n    valueDateTime->setFocusPolicy(Qt::ClickFocus);\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n    valueDateTime->setTimeZone(QTimeZone::UTC);\n#else\n    valueDateTime->setTimeSpec(Qt::UTC);\n#endif\n    valueDateTime->setDisplayFormat(locale.formatDateShortWithYYYY()\n                                    + \" \" + locale.formatTimeLongWithoutTZ());\n    valueDateTime->setSizePolicy(sizepolicy);\n    if ( !value.isEmpty() )\n    {\n        QDateTime dtValue = QDateTime::fromString(value, \"yyyy-MM-ddTHH:mm:ss\");\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n        dtValue.setTimeZone(QTimeZone::UTC);\n#else\n        dtValue.setTimeSpec(Qt::UTC);\n#endif\n        valueDateTime->setDateTime(dtValue);\n    }\n    return valueDateTime;\n\n}\n\nQLineEdit *QSOFilterDetail::createLineEdit(const QString &value, const int identified,\n                                           const QSizePolicy &sizepolicy)\n{\n    FCT_IDENTIFICATION;\n\n    QLineEdit* valueEdit = new QLineEdit();\n    valueEdit->setObjectName(QString::fromUtf8(\"valueLineEdit%1\").arg(identified));\n    valueEdit->setSizePolicy(sizepolicy);\n    valueEdit->setText(value);\n    return valueEdit;\n}\n\nvoid QSOFilterDetail::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->filterLineEdit->text().isEmpty() )\n    {\n        ui->filterLineEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( filterExists(ui->filterLineEdit->text()) )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Info\"),\n                              QMessageBox::tr(\"Filter name is already exists.\"));\n        return;\n    }\n\n    const QList<QHBoxLayout *> &conditionLayouts = ui->conditionsLayout->findChildren<QHBoxLayout *>();\n\n    QSOFilter filter;\n\n    filter.filterName = ui->filterLineEdit->text();\n    filter.machingType = ui->matchingCombo->currentIndex();\n\n    for ( auto &condition: conditionLayouts )\n    {\n        QSOFilterRule rule;\n\n        for ( int i = 0; i < 3; i++ )\n        {\n\n            QString objectName = condition->itemAt(i)->widget()->objectName();\n\n            if ( objectName.contains(\"fieldNameCombo\") )\n                rule.tableFieldIndex = dynamic_cast<QComboBox*>(condition->itemAt(i)->widget())->currentData().toInt();\n            else if ( objectName.contains(\"conditionCombo\") )\n                rule.operatorID = dynamic_cast<QComboBox*>(condition->itemAt(i)->widget())->currentIndex();\n            else if ( objectName.contains(\"stackedValueEdit\") )\n            {\n                QStackedWidget* editStack = dynamic_cast<QStackedWidget*>(condition->itemAt(i)->widget());\n\n                QWidget* stackedEdit = editStack->currentWidget();\n\n                if ( stackedEdit )\n                {\n                    QString stacketEditObjName = stackedEdit->objectName();\n\n                    if ( stacketEditObjName.contains(\"valueLineEdit\") )\n                    {\n                        QLineEdit* editLine = dynamic_cast<QLineEdit*>(stackedEdit);\n                        rule.value = editLine->text();\n                    }\n                    else if ( stacketEditObjName.contains(\"valueDateEdit\") )\n                    {\n                        QDateEdit* dateTimeEdit = dynamic_cast<QDateEdit*>(stackedEdit);\n                        rule.value = dateTimeEdit->date().toString(Qt::ISODate);\n                    }\n                    else if ( stacketEditObjName.contains(\"valueDateTimeEdit\") )\n                    {\n                        QDateTimeEdit* dateEdit = dynamic_cast<QDateTimeEdit*>(stackedEdit);\n                        rule.value = dateEdit->dateTime().toString(\"yyyy-MM-ddTHH:mm:ss\");\n                    }\n                    else if ( stacketEditObjName.contains(\"valueCombo\") )\n                    {\n                        QComboBox* combo = dynamic_cast<QComboBox*>(stackedEdit);\n                        rule.value = combo->currentData().toString();\n                        if ( rule.value == \" \") // empty value\n                            rule.value = QString();\n                    }\n                }\n                else\n                    qCritical(runtime) << \"Unexpected empty Stack - null pointer\";\n            }\n            else\n                qWarning() << \"Unknown object name\"  << objectName;\n        }\n\n        filter.addRule(rule);\n    }\n\n    if ( !QSOFilterManager::instance()->save(filter) )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"Cannot update QSO Filter Conditions\"));\n        return;\n    }\n\n    accept();\n}\n\nvoid QSOFilterDetail::filterNameChanged(const QString &newFilterName)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n    p.setColor(QPalette::Text, (filterExists(newFilterName)) ? Qt::red\n                                                             : qApp->palette().text().color());\n    ui->filterLineEdit->setPalette(p);\n}\n"
  },
  {
    "path": "ui/QSOFilterDetail.h",
    "content": "#ifndef QLOG_UI_QSOFILTERDETAIL_H\n#define QLOG_UI_QSOFILTERDETAIL_H\n\n#include <QDialog>\n#include <QHBoxLayout>\n#include <QComboBox>\n#include <QDateEdit>\n#include <QDateTimeEdit>\n#include \"core/LogLocale.h\"\n\nnamespace Ui {\nclass QSOFilterDetail;\n}\n\nclass QSOFilterDetail : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSOFilterDetail(const QString &filterName = QString(), QWidget *parent = nullptr);\n    ~QSOFilterDetail();\n\npublic slots:\n    void addCondition(int fieldIdx = -1, int operatorId = -1, QString value = QString());\n    void save();\n    void filterNameChanged(const QString&);\n\nprivate:\n    Ui::QSOFilterDetail *ui;\n    QString filterName;\n    int condCount;\n    QStringList filterNamesList;\n\nprivate:\n    void loadFilter(const QString &filterName);\n    bool filterExists(const QString &filterName);\n    bool isDateField(int index);\n    bool isDateTimeField(int index);\n    bool isQSLSentField(int index);\n    bool isQSLSentViaField(int index);\n    bool isQSLRcvdField(int index);\n    bool isUploadStatusField(int index);\n    bool isAntPathField(int index);\n    bool isBoolField(int index);\n    bool isQSOCompleteField(int index);\n    bool isDownloadStatusField(int index);\n    bool isMorseKeyTypeField(int index);\n    bool isEqslAgTypeField(int index);\n    QComboBox* createComboBox(const QMap<QString, QString>&, const QString&,\n                              const int identifier, const QSizePolicy&);\n    QDateEdit* createDateEdit(const QString&, const int, const QSizePolicy&);\n    QDateTimeEdit* createDateTimeEdit(const QString&, const int, const QSizePolicy&);\n    QLineEdit* createLineEdit(const QString&, const int, const QSizePolicy&);\n\n    LogLocale locale;\n};\n\n#endif // QLOG_UI_QSOFILTERDETAIL_H\n"
  },
  {
    "path": "ui/QSOFilterDetail.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSOFilterDetail</class>\n <widget class=\"QDialog\" name=\"QSOFilterDetail\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>648</width>\n    <height>173</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>QSO Filter Detail</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <layout class=\"QFormLayout\" name=\"titleLayout\">\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QLabel\" name=\"filterNameLabel\">\n         <property name=\"text\">\n          <string>Filter Name:</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <widget class=\"QLabel\" name=\"matchingLabel\">\n         <property name=\"text\">\n          <string>Find QSO which match</string>\n         </property>\n        </widget>\n       </item>\n       <item row=\"0\" column=\"1\">\n        <widget class=\"QLineEdit\" name=\"filterLineEdit\">\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"1\">\n        <widget class=\"QComboBox\" name=\"matchingCombo\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <item>\n          <property name=\"text\">\n           <string>All the following conditions</string>\n          </property>\n         </item>\n         <item>\n          <property name=\"text\">\n           <string>Any of the following conditions</string>\n          </property>\n         </item>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeType\">\n        <enum>QSizePolicy::Preferred</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer_2\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeType\">\n      <enum>QSizePolicy::Preferred</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>10</width>\n       <height>20</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <layout class=\"QVBoxLayout\" name=\"conditionsLayout\"/>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QPushButton\" name=\"addConditionButton\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"text\">\n        <string>Add Condition</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>QSOFilterDetail</receiver>\n   <slot>save()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSOFilterDetail</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addConditionButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSOFilterDetail</receiver>\n   <slot>addCondition()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>80</x>\n     <y>148</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>174</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>filterLineEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>QSOFilterDetail</receiver>\n   <slot>filterNameChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>542</x>\n     <y>29</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>459</x>\n     <y>165</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>addCondition()</slot>\n  <slot>save()</slot>\n  <slot>filterNameChanged(QString)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/QSOFilterDialog.cpp",
    "content": "#include <QSqlQuery>\n#include <QSqlDatabase>\n#include <QSqlError>\n#include <QSqlTableModel>\n#include \"QSOFilterDialog.h\"\n#include \"ui_QSOFilterDialog.h\"\n#include \"core/debug.h\"\n#include \"ui/QSOFilterDetail.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.qsofilterdialog\");\n\nQSOFilterDialog::QSOFilterDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::QSOFilterDialog)\n{\n    FCT_IDENTIFICATION;\n    ui->setupUi(this);\n\n    filterModel = new QSqlTableModel(ui->filtersListView);\n    filterModel->setTable(\"qso_filters\");\n    ui->filtersListView->setModel(filterModel);\n    ui->filtersListView->setModelColumn(filterModel->fieldIndex(\"filter_name\"));\n    ui->filtersListView->setSelectionMode(QAbstractItemView::SingleSelection);\n    filterModel->select();\n}\n\nQSOFilterDialog::~QSOFilterDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid QSOFilterDialog::addFilter()\n{\n    FCT_IDENTIFICATION;\n    QSOFilterDetail dialog(QString(), this);\n    dialog.exec();\n    filterModel->select();\n}\n\nvoid QSOFilterDialog::removeFilter()\n{\n    FCT_IDENTIFICATION;\n\n    filterModel->removeRow(ui->filtersListView->currentIndex().row());\n    ui->filtersListView->clearSelection();\n    filterModel->select();\n}\n\nvoid QSOFilterDialog::editFilter(QModelIndex idx)\n{\n    FCT_IDENTIFICATION;\n\n    QString filterName = ui->filtersListView->model()->data(idx).toString();\n\n    QSOFilterDetail dialog(filterName, this);\n    dialog.exec();\n}\n\nvoid QSOFilterDialog::editFilterButton()\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndexList &list = ui->filtersListView->selectionModel()->selectedIndexes();\n    if ( !list.empty() )\n        editFilter(list.first());\n}\n"
  },
  {
    "path": "ui/QSOFilterDialog.h",
    "content": "#ifndef QLOG_UI_QSOFILTERDIALOG_H\n#define QLOG_UI_QSOFILTERDIALOG_H\n\n#include <QSqlTableModel>\n#include <QDialog>\n\n\nnamespace Ui {\nclass QSOFilterDialog;\n}\n\nclass QSOFilterDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit QSOFilterDialog(QWidget *parent = nullptr);\n    ~QSOFilterDialog();\n\nprivate:\n    Ui::QSOFilterDialog *ui;\n    QSqlTableModel* filterModel;\n\npublic slots:\n    void addFilter();\n    void removeFilter();\n    void editFilter(QModelIndex);\n    void editFilterButton();\n};\n\n#endif // QLOG_UI_QSOFILTERDIALOG_H\n"
  },
  {
    "path": "ui/QSOFilterDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>QSOFilterDialog</class>\n <widget class=\"QDialog\" name=\"QSOFilterDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>386</width>\n    <height>290</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>QSO Filters</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox\">\n       <property name=\"title\">\n        <string>Filters</string>\n       </property>\n       <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n        <item>\n         <widget class=\"QListView\" name=\"filtersListView\">\n          <property name=\"editTriggers\">\n           <set>QAbstractItemView::NoEditTriggers</set>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"addFilterButton\">\n         <property name=\"text\">\n          <string>Add</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"editFilterButton\">\n         <property name=\"text\">\n          <string>Edit</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"removeFilterButton\">\n         <property name=\"text\">\n          <string>Remove</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>addFilterButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>addFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>29</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>removeFilterButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>removeFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>70</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>filtersListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>editFilter(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>224</x>\n     <y>202</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>editFilterButton</sender>\n   <signal>clicked()</signal>\n   <receiver>QSOFilterDialog</receiver>\n   <slot>editFilterButton()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>485</x>\n     <y>188</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>269</x>\n     <y>208</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>addFilter()</slot>\n  <slot>removeFilter()</slot>\n  <slot>editFilter(QModelIndex)</slot>\n  <slot>editFilterButton()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/QTableQSOView.cpp",
    "content": "#include <QAbstractItemModel>\n#include <QKeyEvent>\n#include \"QTableQSOView.h\"\n#include \"models/LogbookModel.h\"\n\nQTableQSOView::QTableQSOView(QWidget *parent) :\n    QTableView(parent)\n{ }\n\nvoid QTableQSOView::commitData(QWidget *editor)\n{\n    QTableView::commitData(editor);\n\n    QAbstractItemModel *model = this->model();\n    QVariant value = model->data(this->currentIndex(), Qt::EditRole);\n    int currRow = this->currentIndex().row();\n    int currCol = this->currentIndex().column();\n\n    /* Group Editing Support */\n    /* If rows are selected then update them*/\n    const QModelIndexList &selectedRows = this->selectionModel()->selectedRows();\n\n    for ( const QModelIndex &index : selectedRows )\n    {\n        if ( index.row() != currRow // Do not update the same row again\n             /* Protect selected columns against group editing */\n             && currCol != LogbookModel::COLUMN_CALL\n             && currCol != LogbookModel::COLUMN_TIME_ON\n             && currCol != LogbookModel::COLUMN_TIME_OFF )\n        {\n            model->setData(model->index(index.row(),currCol), value, Qt::EditRole);\n        }\n    }\n\n    emit dataCommitted();\n}\n\nvoid QTableQSOView::keyPressEvent(QKeyEvent *event)\n{\n    if ( event->key() == Qt::Key_F2 )\n    {\n        return;\n    }\n\n    QTableView::keyPressEvent(event);\n};\n\n"
  },
  {
    "path": "ui/QTableQSOView.h",
    "content": "#ifndef QLOG_UI_QTABLEQSOVIEW_H\n#define QLOG_UI_QTABLEQSOVIEW_H\n\n#include <QTableView>\n#include <QObject>\n\nclass QTableQSOView : public QTableView\n{\n    Q_OBJECT\n\nsignals:\n    void dataCommitted();\n\npublic:\n    explicit QTableQSOView(QWidget *parent = nullptr);\n    void commitData(QWidget *editor) override;\n    void keyPressEvent(QKeyEvent *event) override;\n};\n\n#endif // QLOG_UI_QTABLEQSOVIEW_H\n"
  },
  {
    "path": "ui/RigWidget.cpp",
    "content": "#include \"RigWidget.h\"\n#include \"ui_RigWidget.h\"\n#include \"rig/macros.h\"\n#include \"core/debug.h\"\n#include \"data/Data.h\"\n#include \"service/hrdlog/HRDLog.h\"\n#include \"data/BandPlan.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.rigwidget\");\n\nRigWidget::RigWidget(QWidget *parent) :\n    QWidget(parent),\n    lastSeenFreq(0.0),\n    rigOnline(false),\n    splitEnabled(false),\n    ui(new Ui::RigWidget),\n    hrdlog(new HRDLogUploader(this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n    ui->freqLabel->setSelectionModeEnabled(false);\n    ui->freqLabel->setDebounceEnabled(true);\n    ui->freqLabel->setDebounceIntervalMs(250);\n    ui->freqLabel->setLocale(QLocale::c());\n    connect(ui->freqLabel, &FreqQSpinBox::debouncedValueChanged,\n            this, &RigWidget::freqChanged);\n\n    ui->txFreqLabel->setVisible(false);\n    ui->txFreqLabel->setSelectionModeEnabled(false);\n    ui->txFreqLabel->setDebounceEnabled(true);\n    ui->txFreqLabel->setDebounceIntervalMs(250);\n    ui->txFreqLabel->setLocale(QLocale::c());\n    connect(ui->txFreqLabel, &FreqQSpinBox::debouncedValueChanged,\n            this, &RigWidget::txFreqChanged);\n\n    ui->splitOffButton->setVisible(false);\n    connect(ui->splitOffButton, &QToolButton::clicked,\n            this, []() { Rig::instance()->setSplit(false); });\n\n    QStringListModel* rigModel = new QStringListModel(this);\n    ui->rigProfilCombo->setModel(rigModel);\n    ui->rigProfilCombo->setStyleSheet(\"QComboBox {color: red}\");\n\n    QSqlTableModel* bandComboModel = new QSqlTableModel(this);\n    bandComboModel->setTable(\"bands\");\n    bandComboModel->setSort(bandComboModel->fieldIndex(\"start_freq\"), Qt::AscendingOrder);\n    ui->bandComboBox->setModel(bandComboModel);\n    ui->bandComboBox->setModelColumn(bandComboModel->fieldIndex(\"name\"));\n\n    bandComboModel->select();\n\n    QStringListModel* modesModel = new QStringListModel(this);\n    ui->modeComboBox->setModel(modesModel);\n\n    refreshRigProfileCombo();\n\n    QTimer *onAirTimer = new QTimer(this);\n    connect(onAirTimer, &QTimer::timeout, this, &RigWidget::sendOnAirState);\n    onAirTimer->start(ONAIR_INTERVAL * 1000);\n    resetRigInfo();\n\n    rigDisconnected();\n}\n\nRigWidget::~RigWidget()\n{\n    FCT_IDENTIFICATION;\n\n    hrdlog->deleteLater();\n    delete ui;\n}\n\nvoid RigWidget::updateFrequency(VFOID vfoid, double vfoFreq, double ritFreq, double xitFreq)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << vfoid << vfoFreq << ritFreq << xitFreq;\n\n    if ( vfoid == VFO2 )\n    {\n        // TX VFO frequency update (only when split is active)\n        ui->txFreqLabel->blockSignals(true);\n        ui->txFreqLabel->setValue(vfoFreq);\n        ui->txFreqLabel->blockSignals(false);\n        ui->txFreqLabel->setReadOnly(true);\n        return;\n    }\n\n    // VFO1 — RX frequency\n    ui->freqLabel->blockSignals(true);\n    ui->freqLabel->setValue(vfoFreq);\n    ui->freqLabel->blockSignals(false);\n    const QString &bandName = BandPlan::freq2Band(vfoFreq).name;\n\n    if ( bandName != ui->bandComboBox->currentText() )\n    {\n        ui->bandComboBox->blockSignals(true);\n        saveLastSeenFreq();\n        ui->bandComboBox->setCurrentText(bandName);\n        ui->bandComboBox->blockSignals(false);\n    }\n    lastSeenFreq = vfoFreq;\n}\n\nvoid RigWidget::updateSplit(VFOID, bool enabled)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << enabled;\n\n    splitEnabled = enabled;\n    ui->txFreqLabel->setVisible(enabled);\n    ui->splitOffButton->setVisible(enabled);\n}\n\nvoid RigWidget::updateMode(VFOID vfoid, const QString &rawMode, const QString &mode,\n                           const QString &submode, qint32)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<mode;\n\n    Q_UNUSED(submode)\n    Q_UNUSED(vfoid)\n\n    ui->modeLabel->setText(rawMode);\n\n    if ( mode != ui->modeComboBox->currentText() )\n    {\n        ui->modeComboBox->blockSignals(true);\n        ui->modeComboBox->setCurrentText(rawMode);\n        ui->modeComboBox->blockSignals(false);\n    }\n\n    lastSeenMode = mode;\n}\n\nvoid RigWidget::updatePWR(VFOID vfoid, double pwr)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<pwr;\n\n    Q_UNUSED(vfoid)\n\n    ui->pwrLabel->setText(QString(tr(\"PWR: %1W\")).arg(pwr));\n}\n\nvoid RigWidget::updateVFO(VFOID vfoid, const QString &vfo)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<vfo;\n\n    Q_UNUSED(vfoid)\n\n    ui->vfoLabel->setText(vfo);\n}\n\nvoid RigWidget::updateXIT(VFOID, double xit)\n{\n    FCT_IDENTIFICATION;\n\n    if ( xit != 0.0 )\n    {\n        ui->xitOffset->setVisible(true);\n        QString unit;\n        unsigned char decP;\n        double xitDisplay = Data::MHz2UserFriendlyFreq(xit, unit, decP);\n        ui->xitOffset->setText(QString(\"XIT: %1 %2\").arg(QString::number(xitDisplay, 'f', decP),\n                                                          unit));\n    }\n    else\n    {\n        ui->xitOffset->setVisible(false);\n    }\n}\n\nvoid RigWidget::updateRIT(VFOID, double rit)\n{\n    FCT_IDENTIFICATION;\n\n    if ( rit != 0.0 )\n    {\n        ui->ritOffset->setVisible(true);\n        QString unit;\n        unsigned char decP;\n        double ritDisplay = Data::MHz2UserFriendlyFreq(rit, unit, decP);\n        ui->ritOffset->setText(QString(\"RIT: %1 %2\").arg(QString::number(ritDisplay, 'f', decP),\n                                                         unit));\n    }\n    else\n    {\n        ui->ritOffset->setVisible(false);\n    }\n}\n\nvoid RigWidget::updatePTT(VFOID, bool ptt)\n{\n    FCT_IDENTIFICATION;\n\n    ui->pttLabel->setText(ptt ? \"TX\" : \"RX\");\n\n    if ( ptt )\n        ui->pttLabel->setStyleSheet(\"QLabel { font-weight: bold; color: white; border-radius: 8px; background-color: red; padding: 2px 4px; }\");\n    else\n        ui->pttLabel->setStyleSheet(\"QLabel { font-weight: bold; padding: 2px 4px; }\");\n}\n\nvoid RigWidget::bandComboChanged(const QString &newBand)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(runtime) << \"new Band:\" << newBand;\n\n    saveLastSeenFreq();\n\n    QSqlTableModel* bandComboModel = dynamic_cast<QSqlTableModel*>(ui->bandComboBox->model());\n    QSqlRecord record = bandComboModel->record(ui->bandComboBox->currentIndex());\n\n    double newFreq = record.value(\"start_freq\").toDouble();\n\n    if ( ! record.value(\"last_seen_freq\").toString().isEmpty() )\n    {\n        newFreq = record.value(\"last_seen_freq\").toDouble();\n    }\n\n    qCDebug(runtime) << \"Tunning freq: \" << newFreq;\n\n    Rig::instance()->setFrequency(MHz(newFreq));\n}\n\nvoid RigWidget::modeComboChanged(const QString &newMode)\n{\n    FCT_IDENTIFICATION;\n\n    Rig::instance()->setRawMode(newMode);\n}\n\nvoid RigWidget::rigProfileComboChanged(const QString &profileName)\n{\n    FCT_IDENTIFICATION;\n    qCDebug(function_parameters) << profileName;\n\n    RigProfilesManager::instance()->setCurProfile1(profileName);\n    refreshBandCombo();\n    refreshModeCombo();\n    resetRigInfo();\n\n    ui->pttLabel->setVisible(rigOnline && RigProfilesManager::instance()->getCurProfile1().getPTTInfo);\n    emit rigProfileChanged();\n}\n\nvoid RigWidget::refreshRigProfileCombo()\n{\n    ui->rigProfilCombo->blockSignals(true);\n\n    RigProfilesManager *rigManager =  RigProfilesManager::instance();\n\n    QStringList currProfiles = rigManager->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->rigProfilCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( rigManager->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->rigProfilCombo->setCurrentText(currProfiles.first());\n        rigProfileComboChanged(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->rigProfilCombo->setCurrentText(rigManager->getCurProfile1().profileName);\n    }\n\n    updateRIT(VFO1, rigManager->getCurProfile1().ritOffset);\n    updateXIT(VFO1, rigManager->getCurProfile1().xitOffset);\n\n    ui->pttLabel->setVisible(rigOnline && RigProfilesManager::instance()->getCurProfile1().getPTTInfo);\n\n    ui->rigProfilCombo->blockSignals(false);\n    refreshBandCombo();\n    refreshModeCombo();\n}\n\nvoid RigWidget::refreshBandCombo()\n{\n    FCT_IDENTIFICATION;\n\n    QString currSelection = ui->bandComboBox->currentText();\n    const RigProfile &profile = RigProfilesManager::instance()->getCurProfile1();\n\n    ui->bandComboBox->blockSignals(true);\n    QSqlTableModel *bandComboModel = dynamic_cast<QSqlTableModel*>(ui->bandComboBox->model());\n    bandComboModel->setFilter(QString(\"enabled = 1 AND start_freq >= %1 AND end_freq <= %2\").arg(profile.txFreqStart + profile.xitOffset)\n                                                                                            .arg(profile.txFreqEnd + profile.xitOffset));\n    bandComboModel->select();\n    ui->bandComboBox->setCurrentText(currSelection);\n    ui->bandComboBox->blockSignals(false);\n}\n\nvoid RigWidget::refreshModeCombo()\n{\n    FCT_IDENTIFICATION;\n\n    QString currSelection = ui->modeComboBox->currentText();\n\n    ui->modeComboBox->blockSignals(true);\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->modeComboBox->model());\n    model->setStringList(Rig::instance()->getAvailableRawModes());\n    ui->modeComboBox->setCurrentText(currSelection);\n    ui->modeComboBox->blockSignals(false);\n}\n\nvoid RigWidget::reloadSettings()\n{\n    FCT_IDENTIFICATION;\n\n    refreshRigProfileCombo();\n}\n\nvoid RigWidget::rigConnected()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigProfilCombo->setStyleSheet(\"QComboBox {color: green}\");\n    rigOnline = true;\n    ui->bandComboBox->blockSignals(true);\n    ui->modeComboBox->blockSignals(true);\n    ui->bandComboBox->setEnabled(true);\n    ui->modeComboBox->setEnabled(true);\n    ui->modeComboBox->blockSignals(false);\n    ui->bandComboBox->blockSignals(false);\n    ui->freqLabel->setReadOnly(false);\n    ui->txFreqLabel->setReadOnly(false);\n    ui->pttLabel->setVisible(RigProfilesManager::instance()->getCurProfile1().getPTTInfo);\n    refreshModeCombo();\n}\n\nvoid RigWidget::rigDisconnected()\n{\n    FCT_IDENTIFICATION;\n\n    ui->bandComboBox->blockSignals(true);\n    ui->modeComboBox->blockSignals(true);\n\n    saveLastSeenFreq();\n    ui->rigProfilCombo->setStyleSheet(\"QComboBox {color: red}\");\n    rigOnline = false;\n    resetRigInfo();\n\n    ui->bandComboBox->setEnabled(false);\n    ui->modeComboBox->setEnabled(false);\n\n    ui->modeComboBox->blockSignals(false);\n    ui->bandComboBox->blockSignals(false);\n\n    ui->freqLabel->setReadOnly(true);\n    ui->txFreqLabel->setReadOnly(true);\n    ui->pttLabel->setVisible(false);\n}\n\nvoid RigWidget::bandUp()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigOnline )\n        return;\n\n    int currentIndex = ui->bandComboBox->currentIndex();\n\n    if ( currentIndex < ui->bandComboBox->count() - 1)\n        ui->bandComboBox->setCurrentIndex(currentIndex + 1);\n}\n\nvoid RigWidget::bandDown()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigOnline )\n        return;\n\n    int currentIndex = ui->bandComboBox->currentIndex();\n\n    if ( currentIndex > 0 )\n        ui->bandComboBox->setCurrentIndex(currentIndex - 1);\n}\n\nvoid RigWidget::setBand(const QString &band)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << band;\n\n    if ( !rigOnline )\n        return;\n\n    ui->bandComboBox->setCurrentText(band);\n}\n\nvoid RigWidget::sendOnAirState()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigOnline && HRDLogBase::getOnAirEnabled() )\n    {\n        hrdlog->sendOnAir(lastSeenFreq, lastSeenMode);\n    }\n}\n\nvoid RigWidget::freqChanged(double)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigOnline ) return;\n\n    Rig::instance()->setFrequency(MHz(ui->freqLabel->value()));\n}\n\nvoid RigWidget::txFreqChanged(double)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !rigOnline || !splitEnabled ) return;\n\n    Rig::instance()->setFrequency(VFO2, MHz(ui->txFreqLabel->value()));\n}\n\nvoid RigWidget::resetRigInfo()\n{\n    QString empty;\n\n    updateMode(VFO1, empty, empty, empty, 0);\n    ui->pwrLabel->setText(QString(\"\"));\n    updateVFO(VFO1, empty);\n    updateFrequency(VFO1, 0, 0, 0);\n    updateSplit(VFO1, false);\n    updateRIT(VFO1, RigProfilesManager::instance()->getCurProfile1().ritOffset);\n    updateXIT(VFO1, RigProfilesManager::instance()->getCurProfile1().xitOffset);\n    updatePTT(VFO1, false);\n}\n\nvoid RigWidget::saveLastSeenFreq()\n{\n    FCT_IDENTIFICATION;\n\n    if ( rigOnline && lastSeenFreq != 0.0 )\n    {\n        qCDebug(runtime) << \"Last Seen Freq\" << lastSeenFreq;\n        QSqlTableModel *bandComboModel = dynamic_cast<QSqlTableModel*>(ui->bandComboBox->model());\n\n        QModelIndexList bandIndex = bandComboModel->match(bandComboModel->index(0,bandComboModel->fieldIndex(\"name\")),\n                                                          Qt::DisplayRole,\n                                                          BandPlan::freq2Band(lastSeenFreq).name,1, Qt::MatchExactly);\n        if ( bandIndex.size() > 0 )\n        {\n            bandComboModel->setData(bandComboModel->index(bandIndex.at(0).row(),\n                                                          bandComboModel->fieldIndex(\"last_seen_freq\")),\n                                    lastSeenFreq);\n            bandComboModel->submitAll();\n        }\n    }\n}\n"
  },
  {
    "path": "ui/RigWidget.h",
    "content": "#ifndef QLOG_UI_RIGWIDGET_H\n#define QLOG_UI_RIGWIDGET_H\n\n#include <QWidget>\n#include \"rig/Rig.h\"\n#include \"service/hrdlog/HRDLog.h\"\n\nnamespace Ui {\nclass RigWidget;\n}\n\nclass RigWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit RigWidget(QWidget *parent = nullptr);\n    ~RigWidget();\n\nsignals:\n    void rigProfileChanged();\n\npublic slots:\n    void updateFrequency(VFOID, double, double, double);\n    void updateSplit(VFOID, bool);\n    void updateMode(VFOID, const QString&, const QString&,\n                    const QString&, qint32);\n    void updatePWR(VFOID, double);\n    void updateVFO(VFOID, const QString&);\n    void updateXIT(VFOID, double);\n    void updateRIT(VFOID, double);\n    void updatePTT(VFOID, bool);\n    void bandComboChanged(const QString&);\n    void modeComboChanged(const QString&);\n    void rigProfileComboChanged(const QString&);\n    void refreshRigProfileCombo();\n    void refreshBandCombo();\n    void refreshModeCombo();\n    void reloadSettings();\n    void rigConnected();\n    void rigDisconnected();\n    void bandUp();\n    void bandDown();\n    void setBand(const QString &band);\n\nprivate slots:\n    void sendOnAirState();\n    void freqChanged(double);\n    void txFreqChanged(double);\n\nprivate:\n\n    // On AIR pinging to HRDLog [in sec]\n    const int ONAIR_INTERVAL = 60;\n\n    void resetRigInfo();\n    void saveLastSeenFreq();\n    double lastSeenFreq;\n    QString lastSeenMode;\n    bool rigOnline;\n    bool splitEnabled;\n\n    Ui::RigWidget *ui;\n    HRDLogUploader *hrdlog;\n};\n\n#endif // QLOG_UI_RIGWIDGET_H\n"
  },
  {
    "path": "ui/RigWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>RigWidget</class>\n <widget class=\"QWidget\" name=\"RigWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>354</width>\n    <height>112</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>2</number>\n   </property>\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QComboBox\" name=\"rigProfilCombo\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"bandComboBox\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"modeComboBox\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <item>\n      <widget class=\"QLabel\" name=\"pttLabel\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>30</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string>RX</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"pwrLabel\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>16777215</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"vfoLabel\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>60</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"modeLabel\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>60</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"FreqQSpinBox\" name=\"freqLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Expanding\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>20</pointsize>\n        </font>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::NoFocus</enum>\n       </property>\n       <property name=\"styleSheet\">\n        <string notr=\"true\">QDoubleSpinBox { background: transparent; border: none; padding: 0px; }\n      QAbstractSpinBox::lineEdit { background: transparent; border: none; padding: 0px; margin: 0px; }</string>\n       </property>\n       <property name=\"frame\">\n        <bool>false</bool>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n       <property name=\"buttonSymbols\">\n        <enum>QAbstractSpinBox::NoButtons</enum>\n       </property>\n       <property name=\"specialValueText\">\n        <string>Disconnected</string>\n       </property>\n       <property name=\"showGroupSeparator\" stdset=\"0\">\n        <bool>false</bool>\n       </property>\n       <property name=\"suffix\">\n        <string> MHz</string>\n       </property>\n       <property name=\"decimals\">\n        <number>5</number>\n       </property>\n       <property name=\"maximum\">\n        <double>7500000.000000000000000</double>\n       </property>\n       <property name=\"singleStep\">\n        <double>0.001000000000000</double>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"FreqQSpinBox\" name=\"txFreqLabel\">\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Expanding\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"font\">\n        <font>\n         <pointsize>12</pointsize>\n        </font>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::NoFocus</enum>\n       </property>\n       <property name=\"styleSheet\">\n        <string notr=\"true\">QDoubleSpinBox { background: transparent; border: none; padding: 0px; color: #ef6c00; }\nQAbstractSpinBox::lineEdit { background: transparent; border: none; padding: 0px; margin: 0px; color: #ef6c00; }</string>\n       </property>\n       <property name=\"frame\">\n        <bool>false</bool>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n       <property name=\"readOnly\">\n        <bool>true</bool>\n       </property>\n       <property name=\"buttonSymbols\">\n        <enum>QAbstractSpinBox::NoButtons</enum>\n       </property>\n       <property name=\"showGroupSeparator\" stdset=\"0\">\n        <bool>false</bool>\n       </property>\n       <property name=\"suffix\">\n        <string> MHz</string>\n       </property>\n       <property name=\"decimals\">\n        <number>5</number>\n       </property>\n       <property name=\"maximum\">\n        <double>7500000.000000000000000</double>\n       </property>\n       <property name=\"singleStep\">\n        <double>0.001000000000000</double>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QToolButton\" name=\"splitOffButton\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::NoFocus</enum>\n       </property>\n       <property name=\"toolTip\">\n        <string>Disable Split</string>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"icon\">\n        <iconset theme=\"edit-clear\"/>\n       </property>\n       <property name=\"iconSize\">\n        <size>\n         <width>12</width>\n         <height>12</height>\n        </size>\n       </property>\n       <property name=\"autoRaise\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QLabel\" name=\"ritOffset\">\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>RIT: 0.00000 MHz</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"xitOffset\">\n       <property name=\"font\">\n        <font>\n         <pointsize>8</pointsize>\n        </font>\n       </property>\n       <property name=\"text\">\n        <string>XIT: 0.00000 MHz</string>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>40</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>FreqQSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/FreqQSpinBox.h</header>\n  </customwidget>\n </customwidgets>\n <resources/>\n <connections>\n  <connection>\n   <sender>rigProfilCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>RigWidget</receiver>\n   <slot>rigProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>70</x>\n     <y>28</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>102</x>\n     <y>54</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>bandComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>RigWidget</receiver>\n   <slot>bandComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>178</x>\n     <y>28</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>209</x>\n     <y>135</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>modeComboBox</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>RigWidget</receiver>\n   <slot>modeComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>270</x>\n     <y>28</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>101</x>\n     <y>86</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>rigProfileComboChanged(QString)</slot>\n  <slot>bandComboChanged(QString)</slot>\n  <slot>modeComboChanged(QString)</slot>\n  <slot>freqChanged(double)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/RigctldAdvancedDialog.cpp",
    "content": "#include <QFileDialog>\n#include <QMessageBox>\n#include <QPushButton>\n\n#include \"RigctldAdvancedDialog.h\"\n#include \"ui_RigctldAdvancedDialog.h\"\n#include \"rig/RigctldManager.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.rigctldadvanceddialog\");\n\nRigctldAdvancedDialog::RigctldAdvancedDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::RigctldAdvancedDialog),\n    m_versionUpdateTimer(new QTimer(this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n#ifdef QLOG_FLATPAK\n    ui->pathEdit->setEnabled(false);\n    ui->browseButton->setEnabled(false);\n    ui->autoButton->setEnabled(false);\n    ui->pathEdit->setPlaceholderText(tr(\"Cannot be changed\"));\n#endif\n\n    m_versionUpdateTimer->setSingleShot(true);\n    m_versionUpdateTimer->setInterval(500);\n    connect(m_versionUpdateTimer, &QTimer::timeout, this, &RigctldAdvancedDialog::updateVersionLabel);\n    connect(ui->pathEdit, &QLineEdit::textChanged, this, [this]() {\n        m_versionUpdateTimer->start();\n    });\n\n    updateVersionLabel();\n}\n\nRigctldAdvancedDialog::~RigctldAdvancedDialog()\n{\n    FCT_IDENTIFICATION;\n    delete ui;\n}\n\nvoid RigctldAdvancedDialog::setPath(const QString &path)\n{\n    ui->pathEdit->blockSignals(true);\n    ui->pathEdit->setText(path);\n    ui->pathEdit->blockSignals(false);\n    updateVersionLabel();\n}\n\nQString RigctldAdvancedDialog::getPath() const\n{\n    return ui->pathEdit->text().trimmed();\n}\n\nvoid RigctldAdvancedDialog::setArgs(const QString &args)\n{\n    ui->argsEdit->setText(args);\n}\n\nQString RigctldAdvancedDialog::getArgs() const\n{\n    return ui->argsEdit->text().trimmed();\n}\n\nvoid RigctldAdvancedDialog::autoDetectPath()\n{\n    FCT_IDENTIFICATION;\n\n    const QString detectedPath = RigctldManager::findRigctldPath();\n\n    if ( detectedPath.isEmpty() )\n    {\n        updateVersionLabel();\n        QMessageBox::warning(this, tr(\"Auto Detect\"),\n                             tr(\"rigctld was not found on this system.\\n\"\n                                \"Please install Hamlib or specify the path manually.\"));\n    }\n    else\n        setPath(detectedPath);\n}\n\nvoid RigctldAdvancedDialog::browsePath()\n{\n    FCT_IDENTIFICATION;\n\n#ifdef Q_OS_WIN\n    const QString filter = tr(\"Executable (*.exe);;All files (*.*)\");\n#else\n    const QString filter = tr(\"All files (*)\");\n#endif\n    const QString folder = (ui->pathEdit->text().isEmpty() ) ? QDir::rootPath()\n                                                             : ui->pathEdit->text();\n\n    const QString path = QFileDialog::getOpenFileName(this,\n                                                tr(\"Select rigctld executable\"),\n                                                folder,\n                                                filter);\n    if ( !path.isEmpty() )\n        setPath(path);\n}\n\nvoid RigctldAdvancedDialog::updateVersionLabel()\n{\n    FCT_IDENTIFICATION;\n\n    const QString path = ui->pathEdit->text().trimmed();\n    const bool isAutoDetect = path.isEmpty();\n\n    // When autodetect, resolve the path to show it to the user\n    const QString resolvedPath = isAutoDetect ? RigctldManager::findRigctldPath() : path;\n    const QString NOTFOUND = QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\").arg(tr(\"Not found\"));\n\n    if ( resolvedPath.isEmpty() )\n    {\n        ui->versionValueLabel->setText(NOTFOUND);\n        return;\n    }\n\n    const RigctldVersion version = RigctldManager::getVersion(resolvedPath);\n\n    if ( !version.isValid() )\n    {\n        ui->versionValueLabel->setText(NOTFOUND);\n        return;\n    }\n\n    const QString versionStr = QString(\"<span style=\\\"color: green;\\\">✓ %1.%2.%3</span>\")\n                                                   .arg(version.major)\n                                                   .arg(version.minor)\n                                                   .arg(version.patch);\n\n    if ( isAutoDetect )\n        ui->versionValueLabel->setText(QString(\"%1 (%2)\").arg(versionStr, resolvedPath));\n    else\n        ui->versionValueLabel->setText(versionStr);\n}\n"
  },
  {
    "path": "ui/RigctldAdvancedDialog.h",
    "content": "#ifndef QLOG_UI_RIGCTLDADVANCEDDIALOG_H\n#define QLOG_UI_RIGCTLDADVANCEDDIALOG_H\n\n#include <QDialog>\n#include <QTimer>\n\nnamespace Ui {\nclass RigctldAdvancedDialog;\n}\n\nclass RigctldAdvancedDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit RigctldAdvancedDialog(QWidget *parent = nullptr);\n    ~RigctldAdvancedDialog();\n\n    void setPath(const QString &path);\n    QString getPath() const;\n\n    void setArgs(const QString &args);\n    QString getArgs() const;\n\nprivate slots:\n    void autoDetectPath();\n    void browsePath();\n    void updateVersionLabel();\n\nprivate:\n    Ui::RigctldAdvancedDialog *ui;\n    QTimer *m_versionUpdateTimer;\n};\n\n#endif // QLOG_UI_RIGCTLDADVANCEDDIALOG_H\n"
  },
  {
    "path": "ui/RigctldAdvancedDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>RigctldAdvancedDialog</class>\n <widget class=\"QDialog\" name=\"RigctldAdvancedDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>631</width>\n    <height>149</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Rigctld Advanced Settings</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QFormLayout\" name=\"formLayout\">\n     <item row=\"0\" column=\"0\">\n      <widget class=\"QLabel\" name=\"pathLabel\">\n       <property name=\"text\">\n        <string>Rigctld Path:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"0\" column=\"1\">\n      <layout class=\"QHBoxLayout\" name=\"pathLayout\">\n       <item>\n        <widget class=\"QLineEdit\" name=\"pathEdit\">\n         <property name=\"placeholderText\">\n          <string>Leave empty for auto-detection</string>\n         </property>\n         <property name=\"clearButtonEnabled\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"browseButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"text\">\n          <string>Browse</string>\n         </property>\n         <property name=\"icon\">\n          <iconset theme=\"folder-open\">\n           <normaloff>.</normaloff>.</iconset>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"autoButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"toolTip\">\n          <string>Auto-detect Rigctld path</string>\n         </property>\n         <property name=\"text\">\n          <string>Auto-Detect</string>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item row=\"1\" column=\"0\">\n      <widget class=\"QLabel\" name=\"versionLabel\">\n       <property name=\"text\">\n        <string>Rigctld Version:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"1\" column=\"1\">\n      <widget class=\"QLabel\" name=\"versionValueLabel\">\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"0\">\n      <widget class=\"QLabel\" name=\"argsLabel\">\n       <property name=\"text\">\n        <string>Additional Arguments:</string>\n       </property>\n      </widget>\n     </item>\n     <item row=\"2\" column=\"1\">\n      <widget class=\"QLineEdit\" name=\"argsEdit\">\n       <property name=\"placeholderText\">\n        <string>e.g. -v -v for verbose logging</string>\n       </property>\n       <property name=\"clearButtonEnabled\">\n        <bool>true</bool>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <spacer name=\"verticalSpacer\">\n     <property name=\"orientation\">\n      <enum>Qt::Vertical</enum>\n     </property>\n     <property name=\"sizeHint\" stdset=\"0\">\n      <size>\n       <width>20</width>\n       <height>10</height>\n      </size>\n     </property>\n    </spacer>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>RigctldAdvancedDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>RigctldAdvancedDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>autoButton</sender>\n   <signal>clicked()</signal>\n   <receiver>RigctldAdvancedDialog</receiver>\n   <slot>autoDetectPath()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>474</x>\n     <y>24</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>273</x>\n     <y>61</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>browseButton</sender>\n   <signal>clicked()</signal>\n   <receiver>RigctldAdvancedDialog</receiver>\n   <slot>browsePath()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>520</x>\n     <y>24</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>273</x>\n     <y>61</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>autoDetectPath()</slot>\n  <slot>browsePath()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/RotatorWidget.cpp",
    "content": "#include <QGraphicsScene>\n#include <QGraphicsEllipseItem>\n#include <QMenu>\n#include <QMouseEvent>\n#include \"rotator/Rotator.h\"\n#include \"rotator/Rotator.h\"\n#include \"RotatorWidget.h\"\n#include \"ui_RotatorWidget.h\"\n#include \"core/debug.h\"\n#include \"data/Gridsquare.h\"\n#include \"data/StationProfile.h\"\n#include \"data/RotUsrButtonsProfile.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.rotatorwidget\");\n\nRotatorWidget::RotatorWidget(QWidget *parent) :\n    QWidget(parent),\n    antennaNeedle(nullptr),\n    requestedAzimuthNeedle(nullptr),\n    QSOAzimuthNeedle(nullptr),\n    waitingFirstValue(true),\n    compassScene(nullptr),\n    ui(new Ui::RotatorWidget),\n    antennaAzimuth(0.0),\n    requestedAzimuth(qQNaN()),\n    qsoAzimuth(qQNaN()),\n    contact(nullptr)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    redrawMap();\n\n    QStringListModel* rotModel = new QStringListModel(this);\n    ui->rotProfileCombo->setModel(rotModel);\n    ui->rotProfileCombo->setStyleSheet(\"QComboBox {color: red}\");\n    refreshRotProfileCombo();\n\n    QStringListModel* userButtonModel = new QStringListModel(this);\n    ui->userButtonsProfileCombo->setModel(userButtonModel);\n    refreshRotUserButtonProfileCombo();\n\n    QMenu *qsoBearingMenu = new QMenu(this);\n    qsoBearingMenu->addAction(ui->actionQSO_SP);\n    qsoBearingMenu->addAction(ui->actionQSO_LP);\n\n    ui->qsoBearingButton->setMenu(qsoBearingMenu);\n    ui->qsoBearingButton->setDefaultAction(ui->actionQSO_SP);\n\n    rotDisconnected();\n}\n\nvoid RotatorWidget::gotoPosition()\n{\n    FCT_IDENTIFICATION;\n\n    setBearing(ui->gotoDoubleSpinBox->value());\n}\n\ndouble RotatorWidget::getQSOBearing()\n{\n    FCT_IDENTIFICATION;\n\n    double qsoBearing = (contact) ? contact->getQSOBearing()\n                                  : qQNaN();\n\n    qCDebug(runtime) << \"QSO Bearing:\" << qsoBearing;\n\n    return qsoBearing;\n}\n\nvoid RotatorWidget::shortcutComboMove(int step)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << step;\n\n    int count = ui->userButtonsProfileCombo->count();\n    int currIndex = ui->userButtonsProfileCombo->currentIndex();\n\n    if ( count > 0\n         && currIndex != -1\n         && step < count )\n    {\n        int nextIndex = currIndex + step;\n        nextIndex += (1 - nextIndex / count) * count;\n        ui->userButtonsProfileCombo->setCurrentIndex(nextIndex % count);\n    }\n}\n\nvoid RotatorWidget::qsoBearingLP()\n{\n    FCT_IDENTIFICATION;\n\n    ui->qsoBearingButton->setDefaultAction(ui->actionQSO_LP);\n\n    double qsoBearing = getQSOBearing();\n\n    if ( qIsNaN(qsoBearing) )\n        return;\n\n    qsoBearing -= 180;\n\n    if ( qsoBearing < 0 )\n        qsoBearing += 360;\n\n    setBearing(qsoBearing);\n}\n\nvoid RotatorWidget::qsoBearingSP()\n{\n    FCT_IDENTIFICATION;\n\n    ui->qsoBearingButton->setDefaultAction(ui->actionQSO_SP);\n\n    setBearing(getQSOBearing());\n}\n\nvoid RotatorWidget::setRequestedAz(double requestedAz)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << requestedAz;\n\n    if ( qIsNaN(requestedAz) )\n        return;\n\n    requestedAzimuth = requestedAz;\n    if ( requestedAzimuthNeedle )\n    {\n        requestedAzimuthNeedle->show();\n        requestedAzimuthNeedle->setRotation(requestedAz);\n    }\n}\n\nvoid RotatorWidget::setBearing(double in_azimuth)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_azimuth;\n\n    if ( qIsNaN(in_azimuth) || !ui->gotoDoubleSpinBox->isEnabled() )\n        return;\n\n    setRequestedAz(in_azimuth);\n    Rotator::instance()->setPosition(in_azimuth, 0);\n}\n\nvoid RotatorWidget::positionChanged(double in_azimuth, double in_elevation)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << in_azimuth <<in_elevation;\n\n    antennaAzimuth = (in_azimuth < 0.0 ) ? 360.0 + in_azimuth : in_azimuth;\n    if ( antennaNeedle) antennaNeedle->setRotation(antennaAzimuth);\n    if ( waitingFirstValue )\n    {\n        waitingFirstValue = false;\n        if ( requestedAzimuthNeedle) requestedAzimuthNeedle->setRotation(in_azimuth);\n    }\n    ui->gotoDoubleSpinBox->blockSignals(true);\n    ui->gotoDoubleSpinBox->setValue(antennaAzimuth);\n    ui->gotoDoubleSpinBox->blockSignals(false);\n\n    if ( qIsNaN(requestedAzimuth) || !qIsFinite(requestedAzimuth) )\n    {\n        qWarning() << \"Invalid value in RotatorWidget::positionChanged:\" << requestedAzimuth;\n        return;\n    }\n\n    if (qIsNaN(in_azimuth) || !qIsFinite(in_azimuth))\n    {\n        qWarning() << \"Invalid value in RotatorWidget::positionChanged:\" << in_azimuth;\n        return;\n    }\n\n    if ( qAbs(qRound(requestedAzimuth) - qRound(in_azimuth)) <= AZIMUTH_DEAD_BAND\n         && requestedAzimuthNeedle )\n        requestedAzimuthNeedle->hide();\n}\n\nvoid RotatorWidget::setQSOBearing(double , double )\n{\n    FCT_IDENTIFICATION;\n\n    if ( !QSOAzimuthNeedle )\n        return;\n\n    qsoAzimuth = getQSOBearing();\n\n    qCDebug(runtime) << qsoAzimuth;\n\n    if ( !qIsNaN(qsoAzimuth) )\n    {\n        QSOAzimuthNeedle->show();\n        QSOAzimuthNeedle->setRotation(qsoAzimuth);\n    }\n    else\n        QSOAzimuthNeedle->hide();\n}\n\nvoid RotatorWidget::shortcutProfileIncrease()\n{\n    FCT_IDENTIFICATION;\n\n    shortcutComboMove(1);\n}\n\nvoid RotatorWidget::shortcutProfileDecrease()\n{\n    FCT_IDENTIFICATION;\n\n     shortcutComboMove(-1);\n}\n\nvoid RotatorWidget::showEvent(QShowEvent* event)\n{\n    FCT_IDENTIFICATION;\n\n    ui->compassView->fitInView(compassScene->sceneRect(), Qt::KeepAspectRatio);\n    QWidget::showEvent(event);\n}\n\nvoid RotatorWidget::resizeEvent(QResizeEvent* event)\n{\n    FCT_IDENTIFICATION;\n\n    ui->compassView->fitInView(compassScene->sceneRect(), Qt::KeepAspectRatio);\n    QWidget::resizeEvent(event);\n}\n\nvoid RotatorWidget::mousePressEvent(QMouseEvent *event)\n{\n    FCT_IDENTIFICATION;\n\n    if( event->button() == Qt::LeftButton )\n    {\n        QPointF clickPos = ui->compassView->mapToScene(ui->compassView->mapFromGlobal(\n#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))\n                                                                                      event->globalPosition().toPoint()\n#else\n                                                                                      event->globalPos()\n#endif\n                                                                                     ));\n\n        qreal dx = clickPos.x();\n        qreal dy = -1 * clickPos.y();\n\n        if ( qSqrt(qPow(dx, 2) + qPow(dy, 2)) <= GLOBE_RADIUS ) // distance between click and center of the globe\n        {\n            double angle = qRadiansToDegrees(qAtan2(dx, dy));\n\n            if ( angle < 0 )\n                angle += 360;\n\n            setBearing(std::round(angle));\n        }\n    }\n\n    QWidget::mousePressEvent(event);\n}\n\nvoid RotatorWidget::userButton1()\n{\n    FCT_IDENTIFICATION;\n\n    double bearing = RotUsrButtonsProfilesManager::instance()->getCurProfile1().bearings[0];\n    if ( bearing >= 0 ) setBearing(bearing);\n}\n\nvoid RotatorWidget::userButton2()\n{\n    FCT_IDENTIFICATION;\n\n    double bearing = RotUsrButtonsProfilesManager::instance()->getCurProfile1().bearings[1];\n    if ( bearing >= 0 ) setBearing(bearing);\n}\n\nvoid RotatorWidget::userButton3()\n{\n    FCT_IDENTIFICATION;\n\n    double bearing = RotUsrButtonsProfilesManager::instance()->getCurProfile1().bearings[2];\n    if ( bearing >= 0 ) setBearing(bearing);\n}\n\nvoid RotatorWidget::userButton4()\n{\n    FCT_IDENTIFICATION;\n\n    double bearing = RotUsrButtonsProfilesManager::instance()->getCurProfile1().bearings[3];\n    if ( bearing >= 0 ) setBearing(bearing);\n}\n\nvoid RotatorWidget::refreshRotProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotProfileCombo->blockSignals(true);\n\n    QStringList currProfiles = RotProfilesManager::instance()->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->rotProfileCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( RotProfilesManager::instance()->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->rotProfileCombo->setCurrentText(currProfiles.first());\n        rotProfileComboChanged(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->rotProfileCombo->setCurrentText(RotProfilesManager::instance()->getCurProfile1().profileName);\n    }\n\n    ui->rotProfileCombo->blockSignals(false);\n}\n\nvoid RotatorWidget::refreshRotUserButtonProfileCombo()\n{\n    FCT_IDENTIFICATION;\n\n    ui->userButtonsProfileCombo->blockSignals(true);\n\n    RotUsrButtonsProfilesManager *buttonManager =  RotUsrButtonsProfilesManager::instance();\n\n    QStringList currProfiles = buttonManager->profileNameList();\n    QStringListModel* model = dynamic_cast<QStringListModel*>(ui->userButtonsProfileCombo->model());\n\n    model->setStringList(currProfiles);\n\n    if ( buttonManager->getCurProfile1().profileName.isEmpty()\n         && currProfiles.count() > 0 )\n    {\n        /* changing profile from empty to something */\n        ui->userButtonsProfileCombo->setCurrentText(currProfiles.first());\n    }\n    else\n    {\n        /* no profile change, just refresh the combo and preserve current profile */\n        ui->userButtonsProfileCombo->setCurrentText(buttonManager->getCurProfile1().profileName);\n    }\n\n    rotUserButtonProfileComboChanged(ui->userButtonsProfileCombo->currentText());\n\n    ui->userButtonsProfileCombo->blockSignals(false);\n}\n\nvoid RotatorWidget::refreshRotUserButtons()\n{\n    FCT_IDENTIFICATION;\n\n    RotUsrButtonsProfile profile = RotUsrButtonsProfilesManager::instance()->getCurProfile1();\n\n    setUserButtonDesc(ui->userButton_1,\n                      profile.shortDescs[0],\n                      profile.bearings[0]);\n    setUserButtonDesc(ui->userButton_2,\n                      profile.shortDescs[1],\n                      profile.bearings[1]);\n    setUserButtonDesc(ui->userButton_3,\n                      profile.shortDescs[2],\n                      profile.bearings[2]);\n    setUserButtonDesc(ui->userButton_4,\n                      profile.shortDescs[3],\n                      profile.bearings[3]);\n}\n\nvoid RotatorWidget::setUserButtonDesc(QPushButton *button,\n                                      const QString &desc,\n                                      const double value)\n{\n    FCT_IDENTIFICATION;\n\n    if ( value >= 0 )\n    {\n        button->setText(desc);\n        button->setEnabled(true);\n    }\n    else\n        button->setText(\"\");\n}\n\nvoid RotatorWidget::redrawMap()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !ui )\n        return;\n\n    if ( compassScene )\n        compassScene->deleteLater();\n\n    compassScene = new QGraphicsScene(this);\n    ui->compassView->setScene(compassScene);\n    ui->compassView->setStyleSheet(\"background-color: transparent;\");\n\n    QImage source(\":/res/map/nasabluemarble.jpg\");\n    QImage map(MAP_RESOLUTION, MAP_RESOLUTION, QImage::Format_ARGB32);\n    const Gridsquare myGrid(StationProfilesManager::instance()->getCurProfile1().locator);\n\n    double lat = myGrid.getLatitude();\n    double lon = myGrid.getLongitude();\n\n    if ( qIsNaN(lat) || qIsNaN(lon) )\n        return;\n\n    // transform image to azimuthal map\n    const int mapWidth = map.width();\n    const int mapHeight = map.height();\n    const int srcWidth = source.width();\n    const int srcHeight = source.height();\n\n    const double lambda0 = (lon / 180.0) * M_PI;\n    const double phi1 = - (lat / 90.0) * (0.5 * M_PI);\n    const double sinPhi1 = sin(phi1);\n    const double cosPhi1 = cos(phi1);\n    const double twoPI = 2.0 * M_PI;\n\n    for (int x = 0; x < mapWidth; x++)\n    {\n        double x2 = twoPI * (static_cast<double>(x) / static_cast<double>(mapWidth) - 0.5);\n\n        for (int y = 0; y < mapHeight; y++)\n        {\n            double y2 = twoPI * (static_cast<double>(y) / static_cast<double>(mapHeight) - 0.5);\n            double c = sqrt(x2 * x2 + y2 * y2);\n\n            if ( c < M_PI )\n            {\n                double phi = phi1;\n                double lambda = lambda0;\n\n                if ( c != 0.0 )\n                {\n                    double sinC = sin(c);\n                    double cosC = cos(c);\n                    phi = asin(cosC * sinPhi1 + (y2 * sinC * cosPhi1) / c);\n                    lambda = lambda0 + atan2(x2 * sinC, c * cosPhi1 * cosC - y2 * sinPhi1 * sinC);\n                }\n\n                double s = (lambda / twoPI) + 0.5;\n                double t = (phi / M_PI) + 0.5;\n\n                int x3 = static_cast<int>(s * srcWidth);\n                int y3 = static_cast<int>(t * srcHeight);\n\n                x3 = (x3 % srcWidth + srcWidth) % srcWidth;\n                y3 = (y3 % srcHeight + srcHeight) % srcHeight;\n\n                map.setPixelColor(x, y, source.pixelColor(x3, y3));\n            }\n            else\n                map.setPixelColor(x, y, QColor(0, 0, 0, 0));\n        }\n    }\n\n    // draw azimuthal map\n    QGraphicsPixmapItem *pixMapItem = compassScene->addPixmap(QPixmap::fromImage(map));\n    pixMapItem->moveBy(-MAP_RESOLUTION/2, -MAP_RESOLUTION/2);\n    pixMapItem->setTransformOriginPoint(MAP_RESOLUTION/2, MAP_RESOLUTION/2);\n    pixMapItem->setScale(GLOBE_RADIUS * 2/MAP_RESOLUTION);\n\n    // circle around the globe - globe \"antialiasing\"\n    compassScene->addEllipse(-100, -100, GLOBE_RADIUS * 2, GLOBE_RADIUS * 2,\n                             QPen(QColor(100, 100, 100)),\n                             QBrush(QColor(0, 0, 0),\n                             Qt::NoBrush));\n\n    // point in the middle of globe\n    compassScene->addEllipse(-1, -1, 2, 2,\n                             QPen(Qt::NoPen),\n                             QBrush(QColor(0, 0, 0),\n                             Qt::SolidPattern));\n\n    // draw needles\n    QPainterPath path;\n    path.lineTo(-2, 0);\n    path.lineTo(0, -90);\n    path.lineTo(2, 0);\n    path.closeSubpath();\n\n    QPainterPath path2;\n    path2.lineTo(-1, 0);\n    path2.lineTo(0, -90);\n    path2.lineTo(1, 0);\n    path2.closeSubpath();\n\n    requestedAzimuthNeedle = compassScene->addPath(QPainterPath(path2),\n                                                   QPen(Qt::NoPen),\n                                                   QBrush(QColor(255,255,255),\n                                                          Qt::SolidPattern));\n    if ( !qIsNaN(requestedAzimuth) )\n        requestedAzimuthNeedle->setRotation(requestedAzimuth);\n    else\n        requestedAzimuthNeedle->hide();\n\n    antennaNeedle = compassScene->addPath(path,\n                                          QPen(QColor(0, 0, 0, 150)),\n                                          QBrush(QColor(255, 191, 0),\n                                          Qt::SolidPattern));\n    antennaNeedle->setRotation(antennaAzimuth);\n    if ( !ui->gotoButton->isEnabled() )\n        antennaNeedle->hide();\n\n    QSOAzimuthNeedle = compassScene->addPath(QPainterPath(path2),\n                                             QPen(Qt::NoPen),\n                                             QBrush(QColor(255,0,255),\n                                             Qt::SolidPattern));\n\n    setQSOBearing(qQNaN(), qQNaN()); // only call the function; input parameters are ignored\n}\n\nvoid RotatorWidget::rotProfileComboChanged(QString profileName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << profileName;\n\n    RotProfilesManager::instance()->setCurProfile1(profileName);\n\n    emit rotProfileChanged();\n}\n\nvoid RotatorWidget::rotUserButtonProfileComboChanged(QString profileName)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << profileName;\n\n    RotUsrButtonsProfilesManager::instance()->setCurProfile1(profileName);\n\n    refreshRotUserButtons();\n\n    emit rotUserButtonChanged();\n}\n\nvoid RotatorWidget::reloadSettings()\n{\n    FCT_IDENTIFICATION;\n\n    refreshRotProfileCombo();\n    refreshRotUserButtonProfileCombo();\n}\n\nvoid RotatorWidget::rotConnected()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotProfileCombo->setStyleSheet(\"QComboBox {color: green}\");\n    ui->gotoDoubleSpinBox->setEnabled(true);\n    ui->gotoButton->setEnabled(true);\n    ui->qsoBearingButton->setEnabled(true);\n    ui->userButtonsProfileCombo->setEnabled(true);\n    ui->leftButton->setVisible(ui->userButtonsProfileCombo->count()>1);\n    ui->rightButton->setVisible(ui->userButtonsProfileCombo->count()>1);\n    refreshRotUserButtons();\n    waitingFirstValue = true;\n    if ( antennaNeedle ) antennaNeedle->show();\n}\n\nvoid RotatorWidget::rotDisconnected()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotProfileCombo->setStyleSheet(\"QComboBox {color: red}\");\n    ui->gotoDoubleSpinBox->setEnabled(false);\n    ui->gotoButton->setEnabled(false);\n    ui->qsoBearingButton->setEnabled(false);\n    ui->userButtonsProfileCombo->setEnabled(false);\n    ui->userButton_1->setEnabled(false);\n    ui->userButton_2->setEnabled(false);\n    ui->userButton_3->setEnabled(false);\n    ui->userButton_4->setEnabled(false);\n    ui->leftButton->setVisible(false);\n    ui->rightButton->setVisible(false);\n    if ( antennaNeedle ) antennaNeedle->hide();\n    if ( requestedAzimuthNeedle) requestedAzimuthNeedle->hide();\n    requestedAzimuth = qQNaN();\n}\n\nRotatorWidget::~RotatorWidget()\n{\n    delete ui;\n}\n\nvoid RotatorWidget::registerContactWidget(const NewContactWidget *contactWidget)\n{\n    FCT_IDENTIFICATION;\n\n    contact = contactWidget;\n}\n"
  },
  {
    "path": "ui/RotatorWidget.h",
    "content": "#ifndef QLOG_UI_ROTATORWIDGET_H\n#define QLOG_UI_ROTATORWIDGET_H\n\n#include <QWidget>\n#include <QGraphicsPixmapItem>\n#include <QPushButton>\n#include \"ui/NewContactWidget.h\"\n\nnamespace Ui {\nclass RotatorWidget;\n}\n\nclass QGraphicsScene;\nclass QGraphicsPathItem;\n\nclass RotatorWidget : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit RotatorWidget(QWidget *parent = nullptr);\n    ~RotatorWidget();\n    void registerContactWidget(const NewContactWidget*);\n\nsignals:\n    void rotProfileChanged();\n    void rotUserButtonChanged();\n\npublic slots:\n    void setBearing(double);\n    void positionChanged(double, double);\n    void redrawMap();\n    void rotProfileComboChanged(QString);\n    void rotUserButtonProfileComboChanged(QString);\n    void reloadSettings();\n    void rotConnected();\n    void rotDisconnected();\n    void refreshRotProfileCombo();\n    void setQSOBearing(double, double);\n    void shortcutProfileIncrease();\n    void shortcutProfileDecrease();\n\nprotected:\n    void showEvent(QShowEvent* event);\n    void resizeEvent(QResizeEvent* event);\n    virtual void mousePressEvent(QMouseEvent *event);\n\nprivate slots:\n    void userButton1();\n    void userButton2();\n    void userButton3();\n    void userButton4();\n    void gotoPosition();\n    void qsoBearingLP();\n    void qsoBearingSP();\n    void setRequestedAz(double);\n\nprivate:\n\n    void refreshRotUserButtonProfileCombo();\n    void refreshRotUserButtons();\n    void setUserButtonDesc(QPushButton *button, const QString&, const double);\n    double getQSOBearing();\n    void shortcutComboMove(int);\n\n    QGraphicsPathItem* antennaNeedle;\n    QGraphicsPathItem* requestedAzimuthNeedle;\n    QGraphicsPathItem* QSOAzimuthNeedle;\n    bool waitingFirstValue;\n    QGraphicsScene* compassScene;\n    Ui::RotatorWidget *ui;\n    double antennaAzimuth;\n    double requestedAzimuth;\n    double qsoAzimuth;\n    const NewContactWidget *contact;\n\n    const int MAP_RESOLUTION = 1000;\n    const float GLOBE_RADIUS = 100.0;\n    const int AZIMUTH_DEAD_BAND = 2;\n};\n\n#endif // QLOG_UI_ROTATORWIDGET_H\n"
  },
  {
    "path": "ui/RotatorWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>RotatorWidget</class>\n <widget class=\"QWidget\" name=\"RotatorWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>387</width>\n    <height>257</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n     <item>\n      <widget class=\"QComboBox\" name=\"rotProfileCombo\">\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"sizeAdjustPolicy\">\n        <enum>QComboBox::AdjustToContents</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QComboBox\" name=\"userButtonsProfileCombo\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QLabel\" name=\"azLabel\">\n       <property name=\"text\">\n        <string>Az:</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"BaseDoubleSpinBox\" name=\"gotoDoubleSpinBox\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"alignment\">\n        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n       </property>\n       <property name=\"suffix\">\n        <string>°</string>\n       </property>\n       <property name=\"decimals\">\n        <number>1</number>\n       </property>\n       <property name=\"maximum\">\n        <double>359.899999999999977</double>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"gotoButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::ClickFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string>Goto</string>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QGraphicsView\" name=\"compassView\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"frameShape\">\n      <enum>QFrame::NoFrame</enum>\n     </property>\n     <property name=\"frameShadow\">\n      <enum>QFrame::Plain</enum>\n     </property>\n     <property name=\"renderHints\">\n      <set>QPainter::Antialiasing|QPainter::SmoothPixmapTransform|QPainter::TextAntialiasing</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <property name=\"rightMargin\">\n      <number>0</number>\n     </property>\n     <property name=\"bottomMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <spacer name=\"horizontalSpacer_2\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n     <item>\n      <widget class=\"QToolButton\" name=\"qsoBearingButton\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"focusPolicy\">\n        <enum>Qt::NoFocus</enum>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n       <property name=\"popupMode\">\n        <enum>QToolButton::MenuButtonPopup</enum>\n       </property>\n       <property name=\"toolButtonStyle\">\n        <enum>Qt::ToolButtonTextOnly</enum>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"leftButton\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>15</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"toolTip\">\n        <string>Previous Button Profile</string>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\"/>\n       </property>\n       <property name=\"icon\">\n        <iconset resource=\"../res/icons/icons.qrc\">\n         <normaloff>:/icons/baseline-play_back-24px.svg</normaloff>:/icons/baseline-play_back-24px.svg</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"userButton_1\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"userButton_2\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"userButton_3\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"userButton_4\">\n       <property name=\"enabled\">\n        <bool>false</bool>\n       </property>\n       <property name=\"sizePolicy\">\n        <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n         <horstretch>0</horstretch>\n         <verstretch>0</verstretch>\n        </sizepolicy>\n       </property>\n       <property name=\"maximumSize\">\n        <size>\n         <width>50</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"text\">\n        <string/>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QPushButton\" name=\"rightButton\">\n       <property name=\"maximumSize\">\n        <size>\n         <width>15</width>\n         <height>16777215</height>\n        </size>\n       </property>\n       <property name=\"toolTip\">\n        <string>Next Button Profile</string>\n       </property>\n       <property name=\"text\">\n        <string notr=\"true\"/>\n       </property>\n       <property name=\"icon\">\n        <iconset resource=\"../res/icons/icons.qrc\">\n         <normaloff>:/icons/baseline-play_arrow-24px.svg</normaloff>:/icons/baseline-play_arrow-24px.svg</iconset>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <spacer name=\"horizontalSpacer_3\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"sizeHint\" stdset=\"0\">\n        <size>\n         <width>40</width>\n         <height>20</height>\n        </size>\n       </property>\n      </spacer>\n     </item>\n    </layout>\n   </item>\n  </layout>\n  <action name=\"actionQSO_LP\">\n   <property name=\"text\">\n    <string>QSO LP</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>QSO Long Path</string>\n   </property>\n  </action>\n  <action name=\"actionQSO_SP\">\n   <property name=\"text\">\n    <string>QSO SP</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>QSO Short Path</string>\n   </property>\n  </action>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>BaseDoubleSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/BaseDoubleSpinBox.h</header>\n  </customwidget>\n </customwidgets>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>gotoButton</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>gotoPosition()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>353</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>132</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>rotProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>61</x>\n     <y>25</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>132</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userButton_1</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>userButton1()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>123</x>\n     <y>243</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>177</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userButton_2</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>userButton2()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>177</x>\n     <y>243</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>177</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userButton_3</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>userButton3()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>231</x>\n     <y>243</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>177</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userButton_4</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>userButton4()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>285</x>\n     <y>243</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>177</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userButtonsProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>rotUserButtonProfileComboChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>135</x>\n     <y>13</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>177</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionQSO_LP</sender>\n   <signal>triggered()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>qsoBearingLP()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>193</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionQSO_SP</sender>\n   <signal>triggered()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>qsoBearingSP()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>193</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>gotoDoubleSpinBox</sender>\n   <signal>valueChanged(double)</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>setRequestedAz(double)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>265</x>\n     <y>14</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>193</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rightButton</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>shortcutProfileIncrease()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>335</x>\n     <y>241</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>193</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>leftButton</sender>\n   <signal>clicked()</signal>\n   <receiver>RotatorWidget</receiver>\n   <slot>shortcutProfileDecrease()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>84</x>\n     <y>241</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>193</x>\n     <y>128</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>gotoPosition()</slot>\n  <slot>rotProfileComboChanged(QString)</slot>\n  <slot>userButton1()</slot>\n  <slot>userButton2()</slot>\n  <slot>userButton3()</slot>\n  <slot>userButton4()</slot>\n  <slot>rotUserButtonProfileComboChanged(QString)</slot>\n  <slot>qsoBearingSP()</slot>\n  <slot>qsoBearingLP()</slot>\n  <slot>setRequestedAz(double)</slot>\n  <slot>shortcutProfileIncrease()</slot>\n  <slot>shortcutProfileDecrease()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/SettingsDialog.cpp",
    "content": "#include <QStringListModel>\n#include <QSqlTableModel>\n#include <QFileDialog>\n#include <QMessageBox>\n#include <QDesktopServices>\n#include <QStandardItemModel>\n#include <QProgressDialog>\n\n#include \"SettingsDialog.h\"\n#include \"ui_SettingsDialog.h\"\n#include \"models/RigTypeModel.h\"\n#include \"models/RotTypeModel.h\"\n#include \"service/GenericCallbook.h\"\n#include \"service/qrzcom/QRZ.h\"\n#include \"service/hamqth/HamQTH.h\"\n#include \"service/lotw/Lotw.h\"\n#include \"service/clublog/ClubLog.h\"\n#include \"service/eqsl/Eqsl.h\"\n#include \"service/hrdlog/HRDLog.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"core/debug.h\"\n#include \"data/StationProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"data/Data.h\"\n#include \"data/Gridsquare.h\"\n#include \"core/WsjtxUDPReceiver.h\"\n#include \"core/NetworkNotification.h\"\n#include \"rig/Rig.h\"\n#include \"rig/RigCaps.h\"\n#include \"rotator/Rotator.h\"\n#include \"rotator/RotCaps.h\"\n#include \"core/LogParam.h\"\n#include \"data/Callsign.h\"\n#include \"core/MembershipQE.h\"\n#include \"models/SqlListModel.h\"\n#include \"service/kstchat/KSTChat.h\"\n#include \"data/HostsPortString.h\"\n#include \"models/ShortcutEditorModel.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"data/SerialPort.h\"\n#include \"service/cloudlog/Cloudlog.h\"\n#include \"ui/RigctldAdvancedDialog.h\"\n#include \"cwkey/drivers/CWWinKey.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.settingsdialog\");\n\nvoid SettingsDialog::refreshProfileView(QAbstractItemView *view, const QStringList &names)\n{\n    QStringListModel *model = static_cast<QStringListModel*>(view->model());\n    if ( model ) model->setStringList(names);\n}\n\nvoid SettingsDialog::disableCapCheckbox(QCheckBox *checkbox)\n{\n    checkbox->setChecked(false);\n    checkbox->setEnabled(false);\n}\n\nvoid SettingsDialog::initProfileListView(QAbstractItemView *view)\n{\n    view->setModel(new QStringListModel(view));\n}\n\nvoid SettingsDialog::populateFlowControlCombo(QComboBox *combo)\n{\n    combo->addItem(tr(\"None\"), SerialPort::SERIAL_FLOWCONTROL_NONE);\n    combo->addItem(tr(\"Hardware\"), SerialPort::SERIAL_FLOWCONTROL_HARDWARE);\n    combo->addItem(tr(\"Software\"), SerialPort::SERIAL_FLOWCONTROL_SOFTWARE);\n}\n\nvoid SettingsDialog::populateParityCombo(QComboBox *combo)\n{\n    combo->addItem(tr(\"No\"), SerialPort::SERIAL_PARITY_NO);\n    combo->addItem(tr(\"Even\"), SerialPort::SERIAL_PARITY_EVEN);\n    combo->addItem(tr(\"Odd\"), SerialPort::SERIAL_PARITY_ODD);\n    combo->addItem(tr(\"Mark\"), SerialPort::SERIAL_PARITY_MARK);\n    combo->addItem(tr(\"Space\"), SerialPort::SERIAL_PARITY_SPACE);\n}\n\nvoid SettingsDialog::populateSignalCombo(QComboBox *combo)\n{\n    combo->addItem(tr(\"None\"), SerialPort::SERIAL_SIGNAL_NONE);\n    combo->addItem(tr(\"High\"), SerialPort::SERIAL_SIGNAL_HIGH);\n    combo->addItem(tr(\"Low\"), SerialPort::SERIAL_SIGNAL_LOW);\n}\n\nvoid SettingsDialog::setComboByData(QComboBox *combo, const QVariant &data, int fallback)\n{\n    const int idx = combo->findData(data);\n    combo->setCurrentIndex((idx < 0) ? fallback : idx);\n}\n\nvoid SettingsDialog::updateOffsetSpinBox(QCheckBox *checkbox, QDoubleSpinBox *spinBox)\n{\n    if ( checkbox->isChecked() )\n    {\n        spinBox->setValue(0.0);\n        spinBox->setEnabled(false);\n    }\n    else\n        spinBox->setEnabled(true);\n}\n\nvoid SettingsDialog::deleteSelectedProfiles(QAbstractItemView *view,\n                                            const std::function<void(const QString &)> &removeProfile)\n{\n    const QModelIndexList selectedRows = view->selectionModel()->selectedRows();\n    for ( const QModelIndex &index : selectedRows )\n    {\n        removeProfile(view->model()->data(index).toString());\n        view->model()->removeRow(index.row());\n    }\n    view->clearSelection();\n}\n\nSettingsDialog::SettingsDialog(MainWindow *parent) :\n    QDialog(parent),\n    stationProfManager(StationProfilesManager::instance()),\n    rigProfManager(RigProfilesManager::instance()),\n    rotProfManager(RotProfilesManager::instance()),\n    antProfManager(AntProfilesManager::instance()),\n    cwKeyProfManager(CWKeyProfilesManager::instance()),\n    cwShortcutProfManager(CWShortcutProfilesManager::instance()),\n    rotUsrButtonsProfManager(RotUsrButtonsProfilesManager::instance()),\n    countyCompleter(nullptr),\n    ui(new Ui::SettingsDialog),\n    sotaFallback(false),\n    potaFallback(false),\n    wwffFallback(false),\n    tqslVersionTimer(new QTimer(this))\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->dateFormatResultLabel->setVisible(false);\n    ui->dateFormatStringEdit->setVisible(false);\n    ui->dateFormatDocLabel->setVisible(false);\n\n    ui->rigPortTypeCombo->addItem(tr(\"Serial\"));\n    ui->rigPortTypeCombo->addItem(tr(\"Network\"));\n    ui->rigPortTypeCombo->addItem(tr(\"Special - Omnirig\"));\n\n#ifdef QLOG_FLATPAK\n    ui->lotwTextMessage->setVisible(true);\n    ui->tqslPathEdit->setEnabled(false);\n    ui->tqslPathEdit->setPlaceholderText(tr(\"Cannot be changed\"));\n    ui->tqslPathButton->setEnabled(false);\n    ui->tqslAutoButton->setEnabled(false);\n#else\n    ui->lotwTextMessage->setVisible(false);\n#endif\n\n    tqslVersionTimer->setSingleShot(true);\n    tqslVersionTimer->setInterval(500);\n    connect(tqslVersionTimer, &QTimer::timeout, this, &SettingsDialog::updateTQSLVersionLabel);\n    connect(ui->tqslPathEdit, &QLineEdit::textChanged, this, [this]() {\n        tqslVersionTimer->start();\n    });\n\n    RotTypeModel* rotTypeModel = new RotTypeModel(ui->rotModelSelect);\n    ui->rotModelSelect->setModel(rotTypeModel);\n\n    initProfileListView(ui->rotProfilesListView);\n    initProfileListView(ui->rotUsrButtonListView);\n    initProfileListView(ui->antProfilesListView);\n    initProfileListView(ui->cwProfilesListView);\n    initProfileListView(ui->cwShortcutListView);\n    initProfileListView(ui->stationProfilesListView);\n\n    QStringListModel* cwKeysModel = new QStringListModel(ui->rigAssignedCWKeyCombo);\n    ui->rigAssignedCWKeyCombo->setModel(cwKeysModel);\n\n    /* Rig Models must be initialized after rigAssignedCWKeyCombo model !!!! */\n    /* becase rigChanged is called and it constain uninitialized\n     * CW Model */\n    RigTypeModel* rigTypeModel = new RigTypeModel(ui->rigModelSelect);\n    ui->rigModelSelect->setModel(rigTypeModel);\n\n    for ( const QPair<int, QString> &driver : Rig::instance()->getDriverList() )\n        ui->rigInterfaceCombo->addItem(driver.second, driver.first);\n\n    for ( const QPair<int, QString> &driver : Rotator::instance()->getDriverList() )\n        ui->rotInterfaceCombo->addItem(driver.second, driver.first);\n\n    initProfileListView(ui->rigProfilesListView);\n\n    /* Country Combo */\n    SqlListModel* countryModel = new SqlListModel(\"SELECT id, translate_to_locale(name), name  \"\n                                                  \"FROM dxcc_entities_ad1c \"\n                                                  \"ORDER BY 2 COLLATE LOCALEAWARE ASC;\", \" \", ui->stationCountryCombo);\n    while ( countryModel->canFetchMore() )\n        countryModel->fetchMore();\n\n    ui->stationCountryCombo->setModel(countryModel);\n    ui->stationCountryCombo->setModelColumn(1);\n\n    ShortcutEditorModel *shortcutModel = new ShortcutEditorModel( parent->getUserDefinedShortcutActionList(),\n                                                                  parent->getBuiltInStaticShortcutList(), ui->shortcutsTableView);\n    ui->shortcutsTableView->setModel(shortcutModel);\n    ui->shortcutsTableView->horizontalHeader()->setSectionResizeMode(ShortcutEditorModel::COLUMN_DESCRIPTION, QHeaderView::Stretch);\n    ui->shortcutsTableView->setItemDelegateForColumn(ShortcutEditorModel::COLUMN_SHORTCUT, new ShortcutDelegate(ui->shortcutsTableView));\n    connect(shortcutModel, &ShortcutEditorModel::conflictDetected, this, [this](const QString& text)\n    {\n        ui->shortcutInfoLabel->setText(\"<b>\" + text + \"</b>\");\n    });\n\n    connect(shortcutModel, &ShortcutEditorModel::dataChanged, this, [this]()\n    {\n        ui->shortcutInfoLabel->clear();\n    });\n\n    ui->stationCQZEdit->setValidator(new QIntValidator(Data::getCQZMin(), Data::getCQZMax(), ui->stationCQZEdit));\n    ui->stationITUEdit->setValidator(new QIntValidator(Data::getITUZMin(), Data::getITUZMax(), ui->stationITUEdit));\n\n    modeTableModel = new QSqlTableModel(ui->modeTableView);\n    modeTableModel->setTable(\"modes\");\n    modeTableModel->setEditStrategy(QSqlTableModel::OnFieldChange);\n    modeTableModel->setSort(1, Qt::AscendingOrder);\n    modeTableModel->setHeaderData(1, Qt::Horizontal, tr(\"Name\"));\n    modeTableModel->setHeaderData(3, Qt::Horizontal, tr(\"Report\"));\n    modeTableModel->setHeaderData(4, Qt::Horizontal, tr(\"DXCC\"));\n    modeTableModel->setHeaderData(5, Qt::Horizontal, tr(\"State\"));\n    ui->modeTableView->setModel(modeTableModel);\n\n    ui->modeTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n    ui->modeTableView->hideColumn(0);\n    ui->modeTableView->hideColumn(2);\n    ui->modeTableView->setItemDelegateForColumn(1, new ReadOnlyDelegate(ui->modeTableView));\n    ui->modeTableView->setItemDelegateForColumn(4, new ComboFormatDelegate(QStringList() << \"CW\"<< \"PHONE\" << \"DIGITAL\", ui->modeTableView));\n    ui->modeTableView->setItemDelegateForColumn(5, new CheckBoxDelegate(ui->modeTableView));\n    modeTableModel->select();\n\n    bandTableModel = new QSqlTableModel(ui->bandTableView);\n    bandTableModel->setTable(\"bands\");\n    bandTableModel->setEditStrategy(QSqlTableModel::OnFieldChange);\n    bandTableModel->setSort(2, Qt::AscendingOrder);\n    bandTableModel->setHeaderData(1, Qt::Horizontal, tr(\"Name\"));\n    bandTableModel->setHeaderData(2, Qt::Horizontal, tr(\"Start (MHz)\"));\n    bandTableModel->setHeaderData(3, Qt::Horizontal, tr(\"End (MHz)\"));\n    bandTableModel->setHeaderData(4, Qt::Horizontal, tr(\"State\"));\n    bandTableModel->setHeaderData(6, Qt::Horizontal, tr(\"SAT Mode\"));\n    ui->bandTableView->setModel(bandTableModel);\n\n    ui->bandTableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n    ui->bandTableView->horizontalHeader()->moveSection(6, 4);\n    ui->bandTableView->hideColumn(0); // primary key\n    ui->bandTableView->hideColumn(5); // last_seen_freq\n    ui->bandTableView->setItemDelegateForColumn(1, new ReadOnlyDelegate(ui->bandTableView));\n    ui->bandTableView->setItemDelegateForColumn(2, new UnitFormatDelegate(\"\", 6, 0.001, ui->bandTableView));\n    ui->bandTableView->setItemDelegateForColumn(3, new UnitFormatDelegate(\"\", 6, 0.001, ui->bandTableView));\n    ui->bandTableView->setItemDelegateForColumn(4,new CheckBoxDelegate(ui->bandTableView));\n\n    bandTableModel->select();\n\n    ui->stationCallsignEdit->setValidator(new QRegularExpressionValidator(Callsign::callsignRegEx(), ui->stationCallsignEdit));\n    ui->stationOperatorCallsignEdit->setValidator(new QRegularExpressionValidator(Callsign::callsignRegEx(), ui->stationOperatorCallsignEdit));\n    ui->stationLocatorEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridRegEx(), ui->stationLocatorEdit));\n    ui->stationVUCCEdit->setValidator(new QRegularExpressionValidator(Gridsquare::gridVUCCRegEx(), ui->stationVUCCEdit));\n\n    /* https://stackoverflow.com/questions/13145397/regex-for-multicast-ip-address */\n    static QRegularExpression multicastAddress(\"^2(?:2[4-9]|3\\\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\\\d|1\\\\d\\\\d|[1-9]\\\\d?|0)){3}$\");\n\n    ui->wsjtMulticastAddressEdit->setValidator(new QRegularExpressionValidator(multicastAddress, ui->wsjtMulticastAddressEdit));\n    const QRegularExpression hostsPortRe = HostsPortString::hostsPortRegEx();\n    QLineEdit * const hostsPortEdits[] =\n    {\n        ui->wsjtForwardEdit, ui->notifQSOEdit,\n        ui->notifDXSpotsEdit, ui->notifWSJTXCQSpotsEdit,\n        ui->notifSpotAlertEdit, ui->notifRigEdit\n    };\n\n    for ( QLineEdit *edit : hostsPortEdits )\n        edit->setValidator(new QRegularExpressionValidator(hostsPortRe, edit));\n\n    iotaCompleter = new QCompleter(Data::instance()->iotaIDList(), ui->stationIOTAEdit);\n    iotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    iotaCompleter->setFilterMode(Qt::MatchContains);\n    iotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->stationIOTAEdit->setCompleter(iotaCompleter);\n\n    sotaCompleter = new QCompleter(Data::instance()->sotaIDList(), ui->stationSOTAEdit);\n    sotaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sotaCompleter->setFilterMode(Qt::MatchStartsWith);\n    sotaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->stationSOTAEdit->setCompleter(nullptr);\n\n    wwffCompleter = new QCompleter(Data::instance()->wwffIDList(), ui->stationWWFFEdit);\n    wwffCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    wwffCompleter->setFilterMode(Qt::MatchStartsWith);\n    wwffCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->stationWWFFEdit->setCompleter(nullptr);\n\n    potaCompleter = new MultiselectCompleter(Data::instance()->potaIDList(), ui->stationPOTAEdit);\n    potaCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    potaCompleter->setFilterMode(Qt::MatchStartsWith);\n    potaCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->stationPOTAEdit->setCompleter(nullptr);\n\n    sigCompleter = new QCompleter(Data::instance()->sigIDList(), ui->stationSIGEdit);\n    sigCompleter->setCaseSensitivity(Qt::CaseInsensitive);\n    sigCompleter->setFilterMode(Qt::MatchStartsWith);\n    sigCompleter->setModelSorting(QCompleter::CaseSensitivelySortedModel);\n    ui->stationSIGEdit->setCompleter(sigCompleter);\n\n    connect(ui->stationCountryCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),\n            this, [this](int row)\n    {\n        const QModelIndex &idx = ui->stationCountryCombo->model()->index(row, 0);\n        updateCountyCompleter(ui->stationCountryCombo->model()->data(idx).toInt());\n    });\n\n    ui->primaryCallbookCombo->addItem(tr(\"Disabled\"), QVariant(GenericCallbook::CALLBOOK_NAME));\n    ui->primaryCallbookCombo->addItem(tr(\"HamQTH\"),   QVariant(HamQTHCallbook::CALLBOOK_NAME));\n    ui->primaryCallbookCombo->addItem(tr(\"QRZ.com\"),  QVariant(QRZCallbook::CALLBOOK_NAME));\n\n    populateFlowControlCombo(ui->rigFlowControlSelect);\n    populateParityCombo(ui->rigParitySelect);\n    populateFlowControlCombo(ui->rotFlowControlSelect);\n    populateParityCombo(ui->rotParitySelect);\n\n    ui->cwModelSelect->addItem(tr(\"Dummy\"), CWKey::DUMMY_KEYER);\n    ui->cwModelSelect->addItem(tr(\"Morse Over CAT\"), CWKey::MORSEOVERCAT);\n    ui->cwModelSelect->addItem(tr(\"WinKey\"), CWKey::WINKEY_KEYER);\n    ui->cwModelSelect->addItem(tr(\"CWDaemon\"), CWKey::CWDAEMON_KEYER);\n    ui->cwModelSelect->addItem(tr(\"FLDigi\"), CWKey::FLDIGI_KEYER);\n    ui->cwModelSelect->setCurrentIndex(ui->cwModelSelect->findData(DEFAULT_CWKEY_MODEL));\n\n    ui->cwKeyModeSelect->addItem(tr(\"Single Paddle\"), CWKey::SINGLE_PADDLE);\n    ui->cwKeyModeSelect->addItem(tr(\"IAMBIC A\"), CWKey::IAMBIC_A);\n    ui->cwKeyModeSelect->addItem(tr(\"IAMBIC B\"), CWKey::IAMBIC_B);\n    ui->cwKeyModeSelect->addItem(tr(\"Ultimate\"), CWKey::ULTIMATE);\n    ui->cwKeyModeSelect->setCurrentIndex(ui->cwKeyModeSelect->findData(CWKey::IAMBIC_B));\n\n    const QList<QPair<QString, int>> sideToneFreqsList = CWWinKey::sidetoneFrequencies();\n    for ( const QPair<QString, int> &f : sideToneFreqsList )\n        ui->cwSidetoneFreqCombo->addItem(f.first, f.second);\n    ui->cwSidetoneFreqCombo->setCurrentIndex(ui->cwSidetoneFreqCombo->findData(CWWinKey::defaultSidetoneFrequency()));\n\n    populateSignalCombo(ui->rigDTRCombo);\n    populateSignalCombo(ui->rigRTSCombo);\n\n    /* disable WSJTX Multicast by default */\n    joinMulticastChanged(false);\n\n    generateMembershipCheckboxes();\n\n    readSettings();\n}\n\nvoid SettingsDialog::save()\n{\n    FCT_IDENTIFICATION;\n\n    if ( stationProfManager->profileNameList().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Please, define at least one Station Locations Profile\"));\n        return;\n    }\n\n    const QString pleaseModifyTXT = tr(\"Press <b>Modify</b> to confirm the profile changes or <b>Cancel</b>.\");\n\n    struct PendingModify { QPushButton *button; int tabIndex; int equipTabIndex; };\n    const PendingModify modifyChecks[] =\n    {\n        {ui->stationAddProfileButton,       0, -1},\n        {ui->antAddProfileButton,           1,  0},\n        {ui->cwAddProfileButton,            1,  1},\n        {ui->cwShortcutAddProfileButton,    1,  1},\n        {ui->rigAddProfileButton,           1,  2},\n        {ui->rotAddProfileButton,           1,  3},\n        {ui->rotUsrButtonAddProfileButton,  1,  3},\n    };\n    for ( const PendingModify &check : modifyChecks )\n    {\n        if ( check.button->text() == tr(\"Modify\") )\n        {\n            ui->tabWidget->setCurrentIndex(check.tabIndex);\n            if ( check.equipTabIndex >= 0 )\n                ui->equipmentTabWidget->setCurrentIndex(check.equipTabIndex);\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"), pleaseModifyTXT);\n            return;\n        }\n    }\n\n    if ( ui->wsjtMulticastCheckbox->isChecked()\n         && ! ui->wsjtMulticastAddressEdit->hasAcceptableInput())\n    {\n        ui->tabWidget->setCurrentIndex(8);\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"WSJTX Multicast is enabled but the Address is not a multicast address.\"));\n        return;\n    }\n\n    if ( !ui->wsjtForwardEdit->text().isEmpty() )\n    {\n        HostsPortString list(ui->wsjtForwardEdit->text());\n        if ( list.hasLocalIPWithPort(ui->wsjtPortSpin->value()) )\n        {\n            ui->tabWidget->setCurrentIndex(8);\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"Loop detected. Raw UDP forward uses the same port as the WSJT-X receiving port.\"));\n            return;\n        }\n    }\n\n    writeSettings();\n    accept();\n}\n\nvoid SettingsDialog::addRigProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->rigProfileNameEdit->text().isEmpty() )\n    {\n        ui->rigProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ! ui->rigPortEdit->text().isEmpty()\n         && ! ui->rigPortEdit->hasAcceptableInput())\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Rig port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device\"));\n        return;\n    }\n\n    if ( ui->rigStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING )\n    {\n        if ( ui->rigPTTTypeCombo->currentIndex() != PTT_TYPE_NONE_INDEX\n             && ui->rigPTTTypeCombo->currentIndex() != PTT_TYPE_CAT_INDEX\n             && ui->rigPTTPortEdit->text().isEmpty() )\n        {\n            ui->rigPTTPortEdit->setPlaceholderText(tr(\"Must not be empty\"));\n            return;\n        }\n\n        if ( ! ui->rigPTTPortEdit->text().isEmpty()\n             && ! ui->rigPTTPortEdit->hasAcceptableInput() )\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"Rig PTT port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device\"));\n            return;\n        }\n    }\n\n    if ( ui->rigTXFreqMaxSpinBox->value() == 0.0 )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"<b>TX Range</b>: Max Frequency must not be 0.\"));\n\n        return;\n    }\n\n    if ( ui->rigTXFreqMaxSpinBox->value() <= ui->rigTXFreqMinSpinBox->value() )\n    {\n        QMessageBox::critical(nullptr, QMessageBox::tr(\"QLog Error\"),\n                              QMessageBox::tr(\"<b>TX Range</b>: Max Frequency must not be under Min Frequency.\"));\n\n        return;\n    }\n\n    if ( ui->rigAddProfileButton->text() == tr(\"Modify\"))\n        ui->rigAddProfileButton->setText(tr(\"Add\"));\n\n    RigProfile profile;\n\n    profile.profileName = ui->rigProfileNameEdit->text();\n    profile.driver = ui->rigInterfaceCombo->currentData().toInt();\n    profile.model = ui->rigModelSelect->currentData().toInt();\n    profile.txFreqStart = ui->rigTXFreqMinSpinBox->value();\n    profile.txFreqEnd = ui->rigTXFreqMaxSpinBox->value();\n\n    if ( ui->rigStackedWidget->currentIndex() == STACKED_WIDGET_NETWORK_SETTING )\n    {\n        profile.hostname = ui->rigHostNameEdit->text();\n        profile.netport = ui->rigNetPortSpin->value();\n    }\n\n    if ( ui->rigStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING )\n    {\n        profile.portPath = ui->rigPortEdit->text();\n        profile.baudrate =  ui->rigBaudSelect->currentText().toInt();\n        profile.databits = ui->rigDataBitsSelect->currentText().toInt();\n        profile.stopbits = ui->rigStopBitsSelect->currentText().toFloat();\n        profile.flowcontrol = ui->rigFlowControlSelect->currentData().toString();\n        profile.parity = ui->rigParitySelect->currentData().toString();\n        profile.pttType = ui->rigPTTTypeCombo->currentData().toString();\n        profile.pttPortPath = ui->rigPTTPortEdit->text();\n        profile.rts = ui->rigRTSCombo->currentData().toString();\n        profile.dtr = ui->rigDTRCombo->currentData().toString();\n        profile.civAddr = ui->rigCIVAddrSpinBox->value();\n    }\n\n    if ( ui->rigPollIntervalSpinBox->isEnabled() )\n    {\n        profile.pollInterval = ui->rigPollIntervalSpinBox->value();\n    }\n\n    profile.ritOffset = ui->rigRXOffsetSpinBox->value();\n    profile.xitOffset = ui->rigTXOffsetSpinBox->value();\n    profile.defaultPWR = ui->rigPWRDefaultSpinBox->value();\n    profile.assignedCWKey = ui->rigAssignedCWKeyCombo->currentText();\n\n    profile.getFreqInfo = ui->rigGetFreqCheckBox->isChecked();\n    profile.getModeInfo = ui->rigGetModeCheckBox->isChecked();\n    profile.getVFOInfo = ui->rigGetVFOCheckBox->isChecked();\n    profile.getPWRInfo = ui->rigGetPWRCheckBox->isChecked();\n    profile.getRITInfo = ui->rigGetRITCheckBox->isChecked();\n    profile.getXITInfo = ui->rigGetXITCheckBox->isChecked();\n    profile.getPTTInfo = ui->rigGetPTTStateCheckBox->isChecked();\n    profile.QSYWiping = ui->rigQSYWipingCheckBox->isChecked();\n    profile.getKeySpeed = ui->rigGetKeySpeedCheckBox->isChecked();\n    profile.keySpeedSync = ui->rigKeySpeedSyncCheckBox->isChecked();\n    profile.dxSpot2Rig = ui->rigDXSpots2RigCheckBox->isChecked();\n    profile.getSplitInfo = ui->rigGetSplitCheckBox->isChecked();\n\n    // Rigctld sharing settings\n    profile.shareRigctld = ui->rigShareCheckBox->isChecked();\n    profile.rigctldPort = ui->rigSharePortSpinBox->value();\n    profile.rigctldPath = rigctldPath;\n    profile.rigctldArgs = rigctldArgs;\n\n    rigProfManager->addProfile(profile.profileName, profile);\n\n    refreshRigProfilesView();\n\n    clearRigProfileForm();\n}\n\nvoid SettingsDialog::delRigProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->rigProfilesListView, [this](const QString &name) {\n        rigProfManager->removeProfile(name);\n    });\n    clearRigProfileForm();\n}\n\nvoid SettingsDialog::doubleClickRigProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    const RigProfile &profile = rigProfManager->getProfile(ui->rigProfilesListView->model()->data(i).toString());\n\n    ui->rigProfileNameEdit->setText(profile.profileName);\n\n    ui->rigInterfaceCombo->setCurrentIndex(ui->rigInterfaceCombo->findData(profile.driver));\n    ui->rigModelSelect->setCurrentIndex(ui->rigModelSelect->findData(profile.model));\n\n    int portIndex;\n    switch ( profile.getPortType() )\n    {\n    case RigProfile::SERIAL_ATTACHED:\n        portIndex = RIGPORT_SERIAL_INDEX;\n        break;\n    case RigProfile::NETWORK_ATTACHED:\n        portIndex = RIGPORT_NETWORK_INDEX;\n        break;\n    case RigProfile::SPECIAL_OMNIRIG_ATTACHED:\n        portIndex = RIGPORT_SPECIAL_OMNIRIG_INDEX;\n        break;\n    default:\n        qWarning() << \"cannot set correct Rig Port - unsupported\" << profile.getPortType();\n        portIndex = RIGPORT_SERIAL_INDEX;\n    }\n\n    ui->rigPortTypeCombo->setCurrentIndex(portIndex);\n    ui->rigPortEdit->setText(profile.portPath);\n    ui->rigHostNameEdit->setText(profile.hostname);\n    ui->rigNetPortSpin->setValue(profile.netport);\n    ui->rigBaudSelect->setCurrentText(QString::number(profile.baudrate));\n    ui->rigDataBitsSelect->setCurrentText(QString::number(profile.databits));\n    ui->rigStopBitsSelect->setCurrentText(QString::number(profile.stopbits));\n\n    ui->rigPollIntervalSpinBox->setValue(profile.pollInterval);\n    ui->rigTXFreqMinSpinBox->setValue(profile.txFreqStart);\n    ui->rigTXFreqMaxSpinBox->setValue(profile.txFreqEnd);\n    ui->rigPWRDefaultSpinBox->setValue(profile.defaultPWR);\n    ui->rigAssignedCWKeyCombo->setCurrentText(profile.assignedCWKey);\n    ui->rigGetFreqCheckBox->setChecked(profile.getFreqInfo);\n    ui->rigGetModeCheckBox->setChecked(profile.getModeInfo);\n    ui->rigGetVFOCheckBox->setChecked(profile.getVFOInfo);\n    ui->rigGetPWRCheckBox->setChecked(profile.getPWRInfo);\n    ui->rigGetRITCheckBox->setChecked(profile.getRITInfo);\n    ui->rigGetXITCheckBox->setChecked(profile.getXITInfo);\n    ui->rigRXOffsetSpinBox->setValue(profile.ritOffset);\n    ui->rigTXOffsetSpinBox->setValue(profile.xitOffset);\n    ui->rigGetPTTStateCheckBox->setChecked(profile.getPTTInfo);\n    ui->rigQSYWipingCheckBox->setChecked(profile.QSYWiping);\n    ui->rigGetKeySpeedCheckBox->setChecked(profile.getKeySpeed);\n    ui->rigKeySpeedSyncCheckBox->setChecked(profile.keySpeedSync);\n    ui->rigDXSpots2RigCheckBox->setChecked(profile.dxSpot2Rig);\n    ui->rigGetSplitCheckBox->setChecked(profile.getSplitInfo);\n\n    setComboByData(ui->rigFlowControlSelect, profile.flowcontrol.toLower());\n    setComboByData(ui->rigParitySelect, profile.parity.toLower());\n\n    const RigCaps &caps = Rig::instance()->getRigCaps(static_cast<Rig::DriverID>(profile.driver), profile.model);\n\n    setComboByData(ui->rigPTTTypeCombo, profile.pttType, PTT_TYPE_CAT_INDEX);\n    ui->rigPTTPortEdit->setText(profile.pttPortPath);\n    setComboByData(ui->rigRTSCombo, profile.rts, PTT_TYPE_CAT_INDEX);\n    setComboByData(ui->rigDTRCombo, profile.dtr, PTT_TYPE_CAT_INDEX);\n\n    ui->rigCIVAddrSpinBox->setValue(( profile.civAddr >= 0 ) ? profile.civAddr : CIVADDR_DISABLED_VALUE);\n\n    // Rigctld sharing settings\n    ui->rigShareCheckBox->setChecked(profile.shareRigctld);\n    ui->rigSharePortSpinBox->setValue(profile.rigctldPort);\n    rigctldPath = profile.rigctldPath;\n    rigctldArgs = profile.rigctldArgs;\n\n    setUIBasedOnRigCaps(caps);\n    updateRigShareEnabled();\n\n    ui->rigAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearRigProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigProfileNameEdit->setPlaceholderText(QString());\n    ui->rigPortEdit->setPlaceholderText(QString());\n    ui->rigHostNameEdit->setPlaceholderText(QString());\n    ui->rigPTTPortEdit->setPlaceholderText(QString());\n\n    ui->rigProfileNameEdit->clear();\n    ui->rigTXFreqMinSpinBox->setValue(0.0);\n    ui->rigTXFreqMaxSpinBox->setValue(0.0);\n    ui->rigPWRDefaultSpinBox->setValue(100.0);\n    ui->rigAssignedCWKeyCombo->setCurrentIndex(0);\n    ui->rigPollIntervalSpinBox->setValue(500.0);\n    ui->rigPortEdit->clear();\n    ui->rigHostNameEdit->clear();\n    ui->rigNetPortSpin->setValue(RIG_NET_DEFAULT_PORT);\n    ui->rigBaudSelect->setCurrentIndex(0);\n    ui->rigDataBitsSelect->setCurrentIndex(0);\n    ui->rigStopBitsSelect->setCurrentIndex(0);\n    ui->rigFlowControlSelect->setCurrentIndex(0);\n    ui->rigDTRCombo->setCurrentIndex(0);\n    ui->rigRTSCombo->setCurrentIndex(0);\n    ui->rigParitySelect->setCurrentIndex(0);\n    ui->rigGetFreqCheckBox->setChecked(true);\n    ui->rigGetModeCheckBox->setChecked(true);\n    ui->rigGetVFOCheckBox->setChecked(true);\n    ui->rigGetPWRCheckBox->setChecked(true);\n    ui->rigGetRITCheckBox->setChecked(false);\n    ui->rigGetXITCheckBox->setChecked(false);\n    ui->rigRXOffsetSpinBox->setValue(0.0);\n    ui->rigTXOffsetSpinBox->setValue(0.0);\n    ui->rigGetPTTStateCheckBox->setChecked(false);\n    ui->rigQSYWipingCheckBox->setChecked(true);\n    ui->rigGetKeySpeedCheckBox->setChecked(true);\n    ui->rigKeySpeedSyncCheckBox->setChecked(false);\n    ui->rigDXSpots2RigCheckBox->setChecked(false);\n    ui->rigAddProfileButton->setText(tr(\"Add\"));\n    ui->rigPTTPortEdit->clear();\n    ui->rigCIVAddrSpinBox->setValue(CIVADDR_DISABLED_VALUE);\n    ui->rigGetSplitCheckBox->setChecked(false);\n\n    // Rigctld sharing settings\n    ui->rigShareCheckBox->setChecked(false);\n    ui->rigSharePortSpinBox->setValue(4532);\n    rigctldPath.clear();\n    rigctldArgs.clear();\n\n    rigChanged(ui->rigModelSelect->currentIndex());\n    updateRigShareEnabled();\n}\n\nvoid SettingsDialog::rigRXOffsetChanged(int)\n{\n    FCT_IDENTIFICATION;\n    updateOffsetSpinBox(ui->rigGetRITCheckBox, ui->rigRXOffsetSpinBox);\n}\n\nvoid SettingsDialog::rigTXOffsetChanged(int)\n{\n    FCT_IDENTIFICATION;\n    updateOffsetSpinBox(ui->rigGetXITCheckBox, ui->rigTXOffsetSpinBox);\n}\n\nvoid SettingsDialog::rigGetFreqChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigQSYWipingCheckBox->setChecked(ui->rigGetFreqCheckBox->isChecked());\n    ui->rigQSYWipingCheckBox->setEnabled(ui->rigGetFreqCheckBox->isChecked());\n}\n\nvoid SettingsDialog::rigPortTypeChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index;\n\n    switch (index)\n    {\n    // Serial\n    case RIGPORT_SERIAL_INDEX:\n    {\n        const RigCaps &caps = Rig::instance()->getRigCaps(static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt()),\n                                                          ui->rigModelSelect->currentData().toInt());\n        ui->rigStackedWidget->setCurrentIndex(STACKED_WIDGET_SERIAL_SETTING);\n        ui->rigDataBitsSelect->setCurrentText(QString::number(caps.serialDataBits));\n        ui->rigStopBitsSelect->setCurrentText(QString::number(caps.serialStopBits));\n        ui->rigHostNameEdit->clear();\n    }\n        break;\n\n    // Network\n    case RIGPORT_NETWORK_INDEX:\n        ui->rigStackedWidget->setCurrentIndex(STACKED_WIDGET_NETWORK_SETTING);\n        ui->rigPortEdit->clear();\n        ui->rigNetPortSpin->setValue(RIG_NET_DEFAULT_PORT);\n        break;\n\n    // Omnirig Special\n    case RIGPORT_SPECIAL_OMNIRIG_INDEX:\n        ui->rigStackedWidget->setCurrentIndex(STACKED_WIDGET_SPECIAL_OMNIRIG_SETTING);\n        ui->rigHostNameEdit->clear();\n        ui->rigPortEdit->clear();\n        break;\n    default:\n        qWarning() << \"Unsupported Rig Port\" << index;\n    }\n}\n\nvoid SettingsDialog::rigInterfaceChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    RigTypeModel* rigTypeModel = qobject_cast<RigTypeModel*> (ui->rigModelSelect->model());\n\n    if ( !rigTypeModel )\n        return;\n\n    ui->rigPortTypeCombo->removeItem(STACKED_WIDGET_SPECIAL_OMNIRIG_SETTING);\n\n    Rig::DriverID driverID = static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt());\n\n    if ( driverID == Rig::OMNIRIG_DRIVER\n        || driverID == Rig::OMNIRIGV2_DRIVER )\n    {\n        ui->rigPortTypeCombo->insertItem(STACKED_WIDGET_SPECIAL_OMNIRIG_SETTING, tr(\"Special - Omnirig\"));\n    }\n\n    rigTypeModel->select(driverID);\n    ui->rigModelSelect->setCurrentIndex(( driverID == Rig::HAMLIB_DRIVER ) ? ui->rigModelSelect->findData(Rig::DEFAULT_MODEL)\n                                                                           : 0 );\n    ui->rigPTTTypeCombo->clear();\n    setComboByData(ui->rigRTSCombo, SerialPort::SERIAL_SIGNAL_NONE);\n    setComboByData(ui->rigDTRCombo, SerialPort::SERIAL_SIGNAL_NONE);\n\n    const QList<QPair<QString, QString>> &pttTypes = Rig::instance()->getPTTTypeList(static_cast<Rig::DriverID>(driverID));\n\n    for ( const QPair<QString, QString> &type : pttTypes )\n        ui->rigPTTTypeCombo->addItem(type.second, type.first);\n\n    ui->rigRTSCombo->setVisible((driverID == Rig::HAMLIB_DRIVER));\n    ui->rigDTRCombo->setVisible((driverID == Rig::HAMLIB_DRIVER));\n    ui->rigPTTTypeCombo->setVisible(( driverID == Rig::HAMLIB_DRIVER ));\n    ui->rigPTTTypeLabel->setVisible(( driverID == Rig::HAMLIB_DRIVER ));\n    ui->rigPTTPortEdit->setVisible(( driverID == Rig::HAMLIB_DRIVER ));\n    ui->rigPTTPortLabel->setVisible(( driverID == Rig::HAMLIB_DRIVER ));\n    ui->rigPTTTypeCombo->setCurrentIndex(( driverID == Rig::HAMLIB_DRIVER ) ? PTT_TYPE_CAT_INDEX : 0);\n}\n\nvoid SettingsDialog::rigPTTTypeChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigPTTPortEdit->setVisible((index != PTT_TYPE_CAT_INDEX && index != PTT_TYPE_NONE_INDEX));\n    ui->rigPTTPortLabel->setVisible((index != PTT_TYPE_CAT_INDEX && index != PTT_TYPE_NONE_INDEX));\n    if ( index == PTT_TYPE_CAT_INDEX || index == PTT_TYPE_NONE_INDEX )\n        ui->rigPTTPortEdit->clear();\n}\n\nvoid SettingsDialog::addRotProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->rotProfileNameEdit->text().isEmpty() )\n    {\n        ui->rotProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ! ui->rotPortEdit->text().isEmpty()\n         && ! ui->rotPortEdit->hasAcceptableInput() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Rotator port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device\"));\n        return;\n    }\n\n    if ( ui->rotAddProfileButton->text() == tr(\"Modify\"))\n        ui->rotAddProfileButton->setText(tr(\"Add\"));\n\n    RotProfile profile;\n\n    profile.profileName = ui->rotProfileNameEdit->text();\n    profile.driver = ui->rotInterfaceCombo->currentData().toInt();\n    profile.model = ui->rotModelSelect->currentData().toInt();\n\n    if ( ui->rotStackedWidget->currentIndex() == STACKED_WIDGET_NETWORK_SETTING )\n    {\n        profile.hostname = ui->rotHostNameEdit->text();\n        profile.netport = ui->rotNetPortSpin->value();\n    }\n\n    if ( ui->rotStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING )\n    {\n        profile.portPath = ui->rotPortEdit->text();\n        profile.baudrate =  ui->rotBaudSelect->currentText().toInt();\n        profile.databits = ui->rotDataBitsSelect->currentText().toInt();\n        profile.stopbits = ui->rotStopBitsSelect->currentText().toFloat();\n        profile.flowcontrol = ui->rotFlowControlSelect->currentData().toString();\n        profile.parity = ui->rotParitySelect->currentData().toString();\n    }\n\n    rotProfManager->addProfile(profile.profileName, profile);\n\n    refreshRotProfilesView();\n\n    clearRotProfileForm();\n}\n\nvoid SettingsDialog::delRotProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->rotProfilesListView, [this](const QString &name) {\n        rotProfManager->removeProfile(name);\n    });\n    clearRotProfileForm();\n}\n\nvoid SettingsDialog::refreshRotProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->rotProfilesListView, rotProfManager->profileNameList());\n}\n\nvoid SettingsDialog::doubleClickRotProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    const RotProfile &profile = rotProfManager->getProfile(ui->rotProfilesListView->model()->data(i).toString());\n\n    ui->rotProfileNameEdit->setText(profile.profileName);\n\n    ui->rotInterfaceCombo->setCurrentIndex(ui->rotInterfaceCombo->findData(profile.driver));\n\n    ui->rotPortTypeCombo->setCurrentIndex( (profile.getPortType() == RotProfile::SERIAL_ATTACHED) ? ROTPORT_SERIAL_INDEX\n                                                                                                  : ROTPORT_NETWORK_INDEX);\n    ui->rotModelSelect->setCurrentIndex(ui->rotModelSelect->findData(profile.model));\n\n    ui->rotPortEdit->setText(profile.portPath);\n    ui->rotHostNameEdit->setText(profile.hostname);\n    ui->rotNetPortSpin->setValue(profile.netport);\n    ui->rotBaudSelect->setCurrentText(QString::number(profile.baudrate));\n    ui->rotDataBitsSelect->setCurrentText(QString::number(profile.databits));\n    ui->rotStopBitsSelect->setCurrentText(QString::number(profile.stopbits));\n\n    setComboByData(ui->rotFlowControlSelect, profile.flowcontrol.toLower());\n    setComboByData(ui->rotParitySelect, profile.parity.toLower());\n\n    ui->rotAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearRotProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotProfileNameEdit->setPlaceholderText(QString());\n    ui->rotPortEdit->setPlaceholderText(QString());\n    ui->rotHostNameEdit->setPlaceholderText(QString());\n\n    ui->rotProfileNameEdit->clear();\n    ui->rotPortEdit->clear();\n    ui->rotHostNameEdit->clear();\n    ui->rotBaudSelect->setCurrentIndex(0);\n    ui->rotDataBitsSelect->setCurrentIndex(0);\n    ui->rotStopBitsSelect->setCurrentIndex(0);\n    ui->rotFlowControlSelect->setCurrentIndex(0);\n    ui->rotParitySelect->setCurrentIndex(0);\n\n    rotInterfaceChanged(ui->rotInterfaceCombo->currentIndex());\n    ui->rotAddProfileButton->setText(tr(\"Add\"));\n}\n\nvoid SettingsDialog::rotPortTypeChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    switch (index)\n    {\n    // Serial\n    case ROTPORT_SERIAL_INDEX:\n    {\n        const RotCaps &caps = Rotator::instance()->getRotCaps(static_cast<Rotator::DriverID>(ui->rotInterfaceCombo->currentData().toInt()),\n                                                              ui->rotModelSelect->currentData().toInt());\n        ui->rotStackedWidget->setCurrentIndex(STACKED_WIDGET_SERIAL_SETTING);\n        ui->rotDataBitsSelect->setCurrentText(QString::number(caps.serialDataBits));\n        ui->rotStopBitsSelect->setCurrentText(QString::number(caps.serialStopBits));\n        ui->rotHostNameEdit->clear();\n    }\n        break;\n\n        // Network\n    case RIGPORT_NETWORK_INDEX:\n        ui->rotStackedWidget->setCurrentIndex(STACKED_WIDGET_NETWORK_SETTING);\n        ui->rotPortEdit->clear();\n        ui->rotNetPortSpin->setValue(ROT_NET_DEFAULT_PORT);\n        break;\n    default:\n        qWarning() << \"Unsupported Rot Port\" << index;\n    }\n\n}\nvoid SettingsDialog::rotInterfaceChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    RotTypeModel* rotTypeModel = qobject_cast<RotTypeModel*> (ui->rotModelSelect->model());\n\n    if ( !rotTypeModel )\n        return;\n\n    Rotator::DriverID driverID = static_cast<Rotator::DriverID>(ui->rotInterfaceCombo->currentData().toInt());\n\n    rotTypeModel->select(driverID);\n\n    if ( driverID == Rotator::HAMLIB_DRIVER )\n    {\n        ui->rotModelSelect->setCurrentIndex(ui->rotModelSelect->findData(Rig::DEFAULT_MODEL));\n        ui->rotNetPortSpin->setValue(ROT_NET_DEFAULT_PORT);\n    }\n    else\n    {\n        ui->rotModelSelect->setCurrentIndex(0);\n        ui->rotNetPortSpin->setValue(ROT_NET_DEFAULT_PSTROT);\n    }\n}\n\nvoid SettingsDialog::addRotUsrButtonsProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->rotUsrButtonProfileNameEdit->text().isEmpty() )\n    {\n        ui->rotUsrButtonProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ui->rotUsrButtonAddProfileButton->text() == tr(\"Modify\"))\n    {\n        ui->rotUsrButtonAddProfileButton->setText(tr(\"Add\"));\n    }\n\n    RotUsrButtonsProfile profile;\n\n    profile.profileName = ui->rotUsrButtonProfileNameEdit->text();\n\n    QLineEdit * const buttonEdits[] = { ui->rotUsrButton1Edit, ui->rotUsrButton2Edit, ui->rotUsrButton3Edit, ui->rotUsrButton4Edit };\n    QSpinBox * const spinBoxes[]   = { ui->rotUsrButtonSpinBox1, ui->rotUsrButtonSpinBox2, ui->rotUsrButtonSpinBox3, ui->rotUsrButtonSpinBox4 };\n    for ( int i = 0; i < 4; ++i )\n    {\n        profile.shortDescs[i] = buttonEdits[i]->text();\n        profile.bearings[i]   = spinBoxes[i]->value();\n    }\n\n    rotUsrButtonsProfManager->addProfile(profile.profileName, profile);\n\n    refreshRotUsrButtonsProfilesView();\n\n    clearRotUsrButtonsProfileForm();\n}\n\nvoid SettingsDialog::delRotUsrButtonsProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->rotUsrButtonListView, [this](const QString &name) {\n        rotUsrButtonsProfManager->removeProfile(name);\n    });\n    clearRotUsrButtonsProfileForm();\n}\n\nvoid SettingsDialog::refreshRotUsrButtonsProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->rotUsrButtonListView, rotUsrButtonsProfManager->profileNameList());\n}\n\nvoid SettingsDialog::doubleClickRotUsrButtonsProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    RotUsrButtonsProfile profile = rotUsrButtonsProfManager->getProfile(ui->rotUsrButtonListView->model()->data(i).toString());\n\n    ui->rotUsrButtonProfileNameEdit->setText(profile.profileName);\n\n    QLineEdit * const buttonEdits[] = { ui->rotUsrButton1Edit, ui->rotUsrButton2Edit, ui->rotUsrButton3Edit, ui->rotUsrButton4Edit };\n    QSpinBox * const spinBoxes[]   = { ui->rotUsrButtonSpinBox1, ui->rotUsrButtonSpinBox2, ui->rotUsrButtonSpinBox3, ui->rotUsrButtonSpinBox4 };\n    for ( int i = 0; i < 4; ++i )\n    {\n        buttonEdits[i]->setText(profile.shortDescs[i]);\n        spinBoxes[i]->setValue(profile.bearings[i]);\n    }\n\n    ui->rotUsrButtonAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearRotUsrButtonsProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotUsrButtonProfileNameEdit->setPlaceholderText(QString());\n    ui->rotUsrButtonProfileNameEdit->clear();\n\n    QLineEdit * const buttonEdits[] = { ui->rotUsrButton1Edit, ui->rotUsrButton2Edit, ui->rotUsrButton3Edit, ui->rotUsrButton4Edit };\n    QSpinBox * const spinBoxes[]   = { ui->rotUsrButtonSpinBox1, ui->rotUsrButtonSpinBox2, ui->rotUsrButtonSpinBox3, ui->rotUsrButtonSpinBox4 };\n    for ( int i = 0; i < 4; ++i )\n    {\n        buttonEdits[i]->clear();\n        spinBoxes[i]->setValue(-1);\n    }\n\n    ui->rotUsrButtonAddProfileButton->setText(tr(\"Add\"));\n}\n\nvoid SettingsDialog::addAntProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->antProfileNameEdit->text().isEmpty() )\n    {\n        ui->antProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ui->antAddProfileButton->text() == tr(\"Modify\"))\n    {\n        ui->antAddProfileButton->setText(tr(\"Add\"));\n    }\n\n    AntProfile profile;\n\n    profile.profileName = ui->antProfileNameEdit->text();\n    profile.description = ui->antDescEdit->toPlainText();\n    profile.azimuthBeamWidth = ui->antAzBeamWidthSpinBox->value();\n    profile.azimuthOffset = ui->antAzOffsetSpinBox->value();\n\n    antProfManager->addProfile(profile.profileName, profile);\n\n    refreshAntProfilesView();\n\n    clearAntProfileForm();\n\n}\n\nvoid SettingsDialog::delAntProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->antProfilesListView, [this](const QString &name) {\n        antProfManager->removeProfile(name);\n    });\n    clearAntProfileForm();\n}\n\nvoid SettingsDialog::refreshAntProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->antProfilesListView, antProfManager->profileNameList());\n}\n\nvoid SettingsDialog::doubleClickAntProfile(QModelIndex i)\n{\n    AntProfile profile = antProfManager->getProfile(ui->antProfilesListView->model()->data(i).toString());\n\n    ui->antProfileNameEdit->setText(profile.profileName);\n    ui->antDescEdit->setPlainText(profile.description);\n    ui->antAzBeamWidthSpinBox->setValue(profile.azimuthBeamWidth);\n    ui->antAzOffsetSpinBox->setValue(profile.azimuthOffset);\n\n    ui->antAddProfileButton->setText(tr(\"Modify\"));\n\n}\n\nvoid SettingsDialog::clearAntProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->antProfileNameEdit->setPlaceholderText(QString());\n\n    ui->antProfileNameEdit->clear();\n    ui->antDescEdit->clear();\n    ui->antAzBeamWidthSpinBox->setValue(0.0);\n    ui->antAzOffsetSpinBox->setValue(0.0);\n\n    ui->antAddProfileButton->setText(tr(\"Add\"));\n}\n\nvoid SettingsDialog::addCWKeyProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->cwProfileNameEdit->text().isEmpty() )\n    {\n        ui->cwProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ! ui->cwPortEdit->text().isEmpty()\n         && ! ui->cwPortEdit->hasAcceptableInput() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"CW Keyer port must be a valid COM port.<br>For Windows use COMxx, for unix-like OS use a path to device\"));\n        return;\n    }\n\n    CWKeyProfile cwKeyNewProfile;\n\n    cwKeyNewProfile.model = CWKey::intToTypeID(ui->cwModelSelect->currentData().toInt());\n    cwKeyNewProfile.profileName = ui->cwProfileNameEdit->text();\n    cwKeyNewProfile.defaultSpeed = ui->cwDefaulSpeed->value();\n    cwKeyNewProfile.keyMode = CWKey::intToModeID(ui->cwKeyModeSelect->currentData().toInt());\n\n    cwKeyNewProfile.hostname = ( ui->cwStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING ) ?\n                QString() :\n                ui->cwHostNameEdit->text();\n\n    cwKeyNewProfile.netport = ( ui->cwStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING ) ?\n                0 :\n                ui->cwNetPortSpin->value();\n\n    cwKeyNewProfile.portPath = ( ui->cwStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING ) ?\n                ui->cwPortEdit->text() :\n                QString();\n\n    cwKeyNewProfile.baudrate = ( ui->cwStackedWidget->currentIndex() == STACKED_WIDGET_SERIAL_SETTING ) ?\n                ui->cwBaudSelect->currentText().toInt() :\n                0;\n\n    QStringList noMorseCATSupportRigs;\n\n    if ( cwKeyNewProfile.model == CWKey::MORSEOVERCAT )\n    {\n        // changing Key to Morse Over CAT model\n        // needed to verify if all rigs where the key is assigned, supports Morse over CAT\n        const QStringList &availableRigProfileNames = rigProfManager->profileNameList();\n\n        for ( const QString &rigProfileName : availableRigProfileNames )\n        {\n            qCDebug(runtime) << \"Checking Rig Profile\" << rigProfileName;\n            const RigProfile &testedRig = rigProfManager->getProfile(rigProfileName);\n\n            if ( testedRig.assignedCWKey == cwKeyNewProfile.profileName )\n            {\n                if ( Rig::instance()->getRigCaps(static_cast<Rig::DriverID>(testedRig.driver),\n                                                 testedRig.model).canSendMorse )\n                {\n                    qCDebug(runtime) << testedRig.profileName << \" has morse support - OK\";\n                }\n                else\n                {\n                    qCDebug(runtime) << \"no morse support for \" << testedRig.profileName << \" - must not change\";\n                    noMorseCATSupportRigs << testedRig.profileName;\n                }\n            }\n        }\n    }\n\n    cwKeyNewProfile.paddleSwap = cwKeyNewProfile.model == CWKey::WINKEY_KEYER\n                                 && cwKeyNewProfile.keyMode != CWKey::SINGLE_PADDLE\n                                 && ui->cwSwapPaddlesCheckbox->isEnabled()\n                                 && ui->cwSwapPaddlesCheckbox->isChecked();\n\n    cwKeyNewProfile.paddleOnlySidetone = cwKeyNewProfile.model == CWKey::WINKEY_KEYER\n                                      && ui->cwPaddleOnlySidetoneCheckbox->isEnabled()\n                                      && ui->cwPaddleOnlySidetoneCheckbox->isChecked();\n\n    cwKeyNewProfile.sidetoneFrequency = ( cwKeyNewProfile.model == CWKey::WINKEY_KEYER\n                                          || cwKeyNewProfile.model == CWKey::CWDAEMON_KEYER )\n                                        ? ui->cwSidetoneFreqCombo->currentData().toInt()\n                                        : CWWinKey::defaultSidetoneFrequency();\n\n    if ( ! noMorseCATSupportRigs.isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Cannot change the CW Keyer Model to <b>Morse over CAT</b><br>No Morse over CAT support for Rig(s) <b>%1</b>\").arg(noMorseCATSupportRigs.join(\", \")));\n        return;\n    }\n\n    if ( ui->cwAddProfileButton->text() == tr(\"Modify\"))\n    {\n        ui->cwAddProfileButton->setText(tr(\"Add\"));\n    }\n\n    cwKeyProfManager->addProfile(cwKeyNewProfile.profileName, cwKeyNewProfile);\n\n    refreshCWKeyProfilesView();\n    clearCWKeyProfileForm();\n    refreshRigAssignedCWKeyCombo();\n}\n\nvoid SettingsDialog::delCWKeyProfile()\n{\n    FCT_IDENTIFICATION;\n\n\n    const QModelIndexList cwSelectedRows = ui->cwProfilesListView->selectionModel()->selectedRows();\n    for ( const QModelIndex &index : cwSelectedRows )\n    {\n        QStringList  dependentRigs;\n        QString removedCWProfile = ui->cwProfilesListView->model()->data(index).toString();\n        const QStringList &availableRigProfileNames = rigProfManager->profileNameList();\n\n        /* needed to verify whether removed Key is not used in Rig Profile as an assigned Key*/\n        for ( const QString &rigProfileName : availableRigProfileNames )\n        {\n            qCDebug(runtime) << \"Checking Rig Profile\" << rigProfileName;\n            RigProfile testedRig = rigProfManager->getProfile(rigProfileName);\n            if ( testedRig.assignedCWKey == removedCWProfile )\n                dependentRigs << testedRig.profileName;\n        }\n\n        if ( dependentRigs.isEmpty() )\n        {\n            cwKeyProfManager->removeProfile(removedCWProfile);\n            ui->cwProfilesListView->model()->removeRow(index.row());\n        }\n        else\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"Cannot delete the CW Keyer Profile<br>The CW Key Profile is used by Rig(s): <b>%1</b>\").arg(dependentRigs.join(\", \")));\n        }\n\n        dependentRigs.clear();\n    }\n    ui->cwProfilesListView->clearSelection();\n\n    clearCWKeyProfileForm();\n\n    refreshRigAssignedCWKeyCombo();\n}\n\nvoid SettingsDialog::refreshCWKeyProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->cwProfilesListView, cwKeyProfManager->profileNameList());\n}\n\nvoid SettingsDialog::doubleClickCWKeyProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    CWKeyProfile profile = cwKeyProfManager->getProfile(ui->cwProfilesListView->model()->data(i).toString());\n\n    ui->cwProfileNameEdit->setText(profile.profileName);\n    ui->cwModelSelect->setCurrentIndex(ui->cwModelSelect->findData(profile.model));\n    ui->cwDefaulSpeed->setValue(profile.defaultSpeed);\n    ui->cwKeyModeSelect->setCurrentIndex(ui->cwKeyModeSelect->findData(profile.keyMode));\n    ui->cwPortEdit->setText(profile.portPath);\n    ui->cwBaudSelect->setCurrentText(QString::number(profile.baudrate));\n    ui->cwHostNameEdit->setText(profile.hostname);\n    ui->cwNetPortSpin->setValue(profile.netport);\n    ui->cwSwapPaddlesCheckbox->setChecked(profile.paddleSwap);\n    ui->cwPaddleOnlySidetoneCheckbox->setChecked(profile.paddleOnlySidetone);\n    {\n        int idx = ui->cwSidetoneFreqCombo->findData(profile.sidetoneFrequency);\n        ui->cwSidetoneFreqCombo->setCurrentIndex(idx >= 0 ? idx : ui->cwSidetoneFreqCombo->findData(CWWinKey::defaultSidetoneFrequency()));\n    }\n\n    ui->cwAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearCWKeyProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwProfileNameEdit->setPlaceholderText(QString());\n    ui->cwProfileNameEdit->clear();\n    ui->cwModelSelect->setCurrentIndex(ui->cwModelSelect->findData(DEFAULT_CWKEY_MODEL));\n    ui->cwKeyModeSelect->setCurrentIndex(ui->cwKeyModeSelect->findData(CWKey::IAMBIC_B));\n    ui->cwDefaulSpeed->setValue(CW_DEFAULT_KEY_SPEED);\n    ui->cwPortEdit->clear();\n    ui->cwBaudSelect->setCurrentIndex(0);\n    ui->cwHostNameEdit->clear();\n    ui->cwNetPortSpin->setValue(CW_NET_CWDAEMON_PORT);\n    ui->cwSwapPaddlesCheckbox->setChecked(false);\n    ui->cwPaddleOnlySidetoneCheckbox->setChecked(false);\n    ui->cwSidetoneFreqCombo->setCurrentIndex(ui->cwSidetoneFreqCombo->findData(CWWinKey::defaultSidetoneFrequency()));\n\n    ui->cwAddProfileButton->setText(tr(\"Add\"));\n}\n\nvoid SettingsDialog::addCWShortcutProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->cwShortcutProfileNameEdit->text().isEmpty() )\n    {\n        ui->cwShortcutProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ui->cwShortcutAddProfileButton->text() == tr(\"Modify\"))\n        ui->cwShortcutAddProfileButton->setText(tr(\"Add\"));\n\n    CWShortcutProfile profile;\n\n    profile.profileName = ui->cwShortcutProfileNameEdit->text();\n\n    QLineEdit * const shortEdits[] = { ui->cwShortcutF1ShortEdit, ui->cwShortcutF2ShortEdit, ui->cwShortcutF3ShortEdit, ui->cwShortcutF4ShortEdit, ui->cwShortcutF5ShortEdit, ui->cwShortcutF6ShortEdit, ui->cwShortcutF7ShortEdit };\n    QLineEdit * const macroEdits[] = { ui->cwShortcutF1MacroEdit, ui->cwShortcutF2MacroEdit, ui->cwShortcutF3MacroEdit, ui->cwShortcutF4MacroEdit, ui->cwShortcutF5MacroEdit, ui->cwShortcutF6MacroEdit, ui->cwShortcutF7MacroEdit };\n    for ( int i = 0; i < 7; ++i )\n    {\n        profile.shortDescs[i] = shortEdits[i]->text();\n        profile.macros[i]     = macroEdits[i]->text();\n    }\n\n    cwShortcutProfManager->addProfile(profile.profileName, profile);\n\n    refreshCWShortcutProfilesView();\n\n    clearCWShortcutProfileForm();\n}\n\nvoid SettingsDialog::delCWShortcutProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->cwShortcutListView, [this](const QString &name) {\n        cwShortcutProfManager->removeProfile(name);\n    });\n    clearCWShortcutProfileForm();\n}\n\nvoid SettingsDialog::refreshCWShortcutProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->cwShortcutListView, cwShortcutProfManager->profileNameList());\n}\n\nvoid SettingsDialog::doubleClickCWShortcutProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    CWShortcutProfile profile = cwShortcutProfManager->getProfile(ui->cwShortcutListView->model()->data(i).toString());\n\n    ui->cwShortcutProfileNameEdit->setText(profile.profileName);\n\n    QLineEdit * const shortEdits[] = { ui->cwShortcutF1ShortEdit, ui->cwShortcutF2ShortEdit, ui->cwShortcutF3ShortEdit, ui->cwShortcutF4ShortEdit, ui->cwShortcutF5ShortEdit, ui->cwShortcutF6ShortEdit, ui->cwShortcutF7ShortEdit };\n    QLineEdit * const macroEdits[] = { ui->cwShortcutF1MacroEdit, ui->cwShortcutF2MacroEdit, ui->cwShortcutF3MacroEdit, ui->cwShortcutF4MacroEdit, ui->cwShortcutF5MacroEdit, ui->cwShortcutF6MacroEdit, ui->cwShortcutF7MacroEdit };\n    for ( int i = 0; i < 7; ++i )\n    {\n        shortEdits[i]->setText(profile.shortDescs[i]);\n        macroEdits[i]->setText(profile.macros[i]);\n    }\n\n    ui->cwShortcutAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearCWShortcutProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwShortcutProfileNameEdit->setPlaceholderText(QString());\n    ui->cwShortcutProfileNameEdit->clear();\n\n    QLineEdit * const shortEdits[] = { ui->cwShortcutF1ShortEdit, ui->cwShortcutF2ShortEdit, ui->cwShortcutF3ShortEdit, ui->cwShortcutF4ShortEdit, ui->cwShortcutF5ShortEdit, ui->cwShortcutF6ShortEdit, ui->cwShortcutF7ShortEdit };\n    QLineEdit * const macroEdits[] = { ui->cwShortcutF1MacroEdit, ui->cwShortcutF2MacroEdit, ui->cwShortcutF3MacroEdit, ui->cwShortcutF4MacroEdit, ui->cwShortcutF5MacroEdit, ui->cwShortcutF6MacroEdit, ui->cwShortcutF7MacroEdit };\n    for ( int i = 0; i < 7; ++i )\n    {\n        shortEdits[i]->clear();\n        macroEdits[i]->clear();\n    }\n\n    ui->cwShortcutAddProfileButton->setText(tr(\"Add\"));\n}\n\nvoid SettingsDialog::refreshRigProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->rigProfilesListView, rigProfManager->profileNameList());\n}\n\nvoid SettingsDialog::refreshStationProfilesView()\n{\n    FCT_IDENTIFICATION;\n    refreshProfileView(ui->stationProfilesListView, stationProfManager->profileNameList());\n}\n\nvoid SettingsDialog::addStationProfile()\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->stationProfileNameEdit->text().isEmpty() )\n    {\n        ui->stationProfileNameEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ui->stationCallsignEdit->text().isEmpty() )\n    {\n        ui->stationCallsignEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ui->stationLocatorEdit->text().isEmpty() )\n    {\n        ui->stationLocatorEdit->setPlaceholderText(tr(\"Must not be empty\"));\n        return;\n    }\n\n    if ( ! ui->stationCallsignEdit->hasAcceptableInput() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Callsign has an invalid format\"));\n        return;\n    }\n\n    if ( !ui->stationOperatorCallsignEdit->text().isEmpty()\n         && ! ui->stationOperatorCallsignEdit->hasAcceptableInput() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Operator Callsign has an invalid format\"));\n        return;\n    }\n\n    if ( ! ui->stationLocatorEdit->hasAcceptableInput() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Gridsquare has an invalid format\"));\n        return;\n    }\n\n    if ( ! ui->stationVUCCEdit->text().isEmpty() )\n    {\n        if ( ! ui->stationVUCCEdit->hasAcceptableInput() )\n        {\n            QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                                 QMessageBox::tr(\"VUCC Grids have an invalid format (must be 2 or 4 Gridsquares separated by ',')\"));\n            return;\n        }\n    }\n\n    if ( ui->stationCountryCombo->currentIndex() == 0 )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Country must not be empty\"));\n        return;\n    }\n\n    if ( ui->stationCQZEdit->text().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"CQZ must not be empty\"));\n        return;\n    }\n\n    if ( ui->stationITUEdit->text().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"ITU must not be empty\"));\n        return;\n    }\n\n    if ( ui->stationAddProfileButton->text() == tr(\"Modify\"))\n    {\n        ui->stationAddProfileButton->setText(tr(\"Add\"));\n    }\n\n    StationProfile profile;\n\n    profile.profileName = ui->stationProfileNameEdit->text();\n    profile.callsign = ui->stationCallsignEdit->text().toUpper();\n    profile.locator = ui->stationLocatorEdit->text().toUpper();\n    profile.operatorName = ui->stationOperatorEdit->text();\n    profile.operatorCallsign = ui->stationOperatorCallsignEdit->text().toUpper();\n    profile.qthName = ui->stationQTHEdit->text();\n    profile.iota = ui->stationIOTAEdit->text().toUpper();\n    profile.sota = ui->stationSOTAEdit->text().toUpper();\n    profile.pota = ui->stationPOTAEdit->text().toUpper();\n    profile.sig = ui->stationSIGEdit->text();\n    profile.sigInfo = ui->stationSIGInfoEdit->text();\n    profile.vucc = ui->stationVUCCEdit->text().toUpper();\n    profile.wwff = ui->stationWWFFEdit->text().toUpper();\n    profile.cqz = ui->stationCQZEdit->text().toInt();\n    profile.ituz = ui->stationITUEdit->text().toInt();\n    profile.county = ui->stationCountyEdit->text();\n    profile.darcDOK = ui->stationDarcDokEdit->text().toUpper();\n\n    int row = ui->stationCountryCombo->currentIndex();\n    const QModelIndex &idxDXCC = ui->stationCountryCombo->model()->index(row,0);\n    const QVariant &dataDXCC = ui->stationCountryCombo->model()->data(idxDXCC);\n    const QModelIndex &idxCountryEN = ui->stationCountryCombo->model()->index(row,2);\n    QVariant dataCountryEN = ui->stationCountryCombo->model()->data(idxCountryEN);\n    profile.dxcc = dataDXCC.toInt();\n    profile.country = dataCountryEN.toString();\n\n    stationProfManager->addProfile(profile.profileName, profile);\n\n    refreshStationProfilesView();\n\n    clearStationProfileForm();\n\n}\n\nvoid SettingsDialog::deleteStationProfile()\n{\n    FCT_IDENTIFICATION;\n    deleteSelectedProfiles(ui->stationProfilesListView, [this](const QString &name) {\n        stationProfManager->removeProfile(name);\n    });\n    clearStationProfileForm();\n}\n\nvoid SettingsDialog::doubleClickStationProfile(QModelIndex i)\n{\n    FCT_IDENTIFICATION;\n\n    StationProfile profile = stationProfManager->getProfile(ui->stationProfilesListView->model()->data(i).toString());\n\n    ui->stationProfileNameEdit->setText(profile.profileName);\n    ui->stationCallsignEdit->blockSignals(true);\n    ui->stationCallsignEdit->setText(profile.callsign);\n    setValidationResultColor(ui->stationCallsignEdit);\n    ui->stationCallsignEdit->blockSignals(false);\n    ui->stationLocatorEdit->setText(profile.locator);\n    ui->stationOperatorEdit->setText(profile.operatorName);\n    ui->stationOperatorCallsignEdit->setText(profile.operatorCallsign);\n    ui->stationQTHEdit->setText(profile.qthName);\n    ui->stationIOTAEdit->setText(profile.iota);\n    ui->stationSOTAEdit->blockSignals(true);\n    ui->stationSOTAEdit->setText(profile.sota);\n    ui->stationSOTAEdit->blockSignals(false);\n    ui->stationPOTAEdit->blockSignals(true);\n    ui->stationPOTAEdit->setText(profile.pota);\n    ui->stationPOTAEdit->blockSignals(false);\n    ui->stationSIGEdit->setText(profile.sig);\n    ui->stationSIGInfoEdit->setText(profile.sigInfo);\n    ui->stationVUCCEdit->setText(profile.vucc);\n    ui->stationWWFFEdit->blockSignals(true);\n    ui->stationWWFFEdit->setText(profile.wwff);\n    ui->stationWWFFEdit->blockSignals(false);\n    ui->stationCQZEdit->setText(QString::number(profile.cqz));\n    ui->stationITUEdit->setText(QString::number(profile.ituz));\n    ui->stationCountyEdit->setText(profile.county);\n    ui->stationDarcDokEdit->setText(profile.darcDOK);\n    const QModelIndexList &countryIndex = ui->stationCountryCombo->model()->match(ui->stationCountryCombo->model()->index(0,0),\n                                                                           Qt::DisplayRole, profile.dxcc,\n                                                                           1, Qt::MatchExactly);\n    if ( countryIndex.size() >= 1 )\n        ui->stationCountryCombo->setCurrentIndex(countryIndex.at(0).row());\n\n    updateCountyCompleter(profile.dxcc);\n\n    ui->stationAddProfileButton->setText(tr(\"Modify\"));\n}\n\nvoid SettingsDialog::clearStationProfileForm()\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationProfileNameEdit->clear();\n    ui->stationProfileNameEdit->setPlaceholderText(QString());\n    ui->stationCallsignEdit->clear();\n    ui->stationCallsignEdit->setPlaceholderText(QString());\n    ui->stationLocatorEdit->clear();\n    ui->stationLocatorEdit->setPlaceholderText(QString());\n    ui->stationOperatorEdit->clear();\n    ui->stationOperatorCallsignEdit->clear();\n    ui->stationQTHEdit->clear();\n    ui->stationSOTAEdit->clear();\n    ui->stationPOTAEdit->clear();\n    ui->stationIOTAEdit->clear();\n    ui->stationSIGEdit->clear();\n    ui->stationSIGInfoEdit->clear();\n    ui->stationVUCCEdit->clear();\n    ui->stationWWFFEdit->clear();\n    ui->stationCQZEdit->clear();\n    ui->stationITUEdit->clear();\n    ui->stationCountryCombo->setCurrentIndex(0);\n    ui->stationCountyEdit->clear();\n    ui->stationDarcDokEdit->clear();\n\n    ui->stationAddProfileButton->setText(tr(\"Add\"));\n}\n\n/* This function is called when an user change Rig Combobox */\n/* new rig entered */\nvoid SettingsDialog::rigChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<index;\n\n    refreshRigAssignedCWKeyCombo();\n\n    int rigID = ui->rigModelSelect->currentData().toInt();\n    Rig::DriverID driverID = static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt());\n    const RigCaps &caps = Rig::instance()->getRigCaps(driverID, rigID);\n\n    if ( driverID == Rig::OMNIRIG_DRIVER\n         || driverID == Rig::OMNIRIGV2_DRIVER )\n    {\n        ui->rigPortTypeCombo->setCurrentIndex(RIGPORT_SPECIAL_OMNIRIG_INDEX);\n        ui->rigPortTypeCombo->setEnabled(false);\n    }\n    else\n    {\n        ui->rigPortTypeCombo->setCurrentIndex(caps.isNetworkOnly ? RIGPORT_NETWORK_INDEX : RIGPORT_SERIAL_INDEX);\n        ui->rigPortTypeCombo->setEnabled(!caps.isNetworkOnly);\n\n        if ( !caps.isNetworkOnly )\n        {\n            ui->rigDataBitsSelect->setCurrentText(QString::number(caps.serialDataBits));\n            ui->rigStopBitsSelect->setCurrentText(QString::number(caps.serialStopBits));\n        }\n    }\n\n    ui->rigPollIntervalSpinBox->setEnabled(caps.needPolling);\n\n    /* Set default rig Caps */\n    ui->rigGetFreqCheckBox->setEnabled(true);\n    ui->rigGetFreqCheckBox->setChecked(true);\n\n    ui->rigGetModeCheckBox->setEnabled(true);\n    ui->rigGetModeCheckBox->setChecked(true);\n\n    ui->rigGetVFOCheckBox->setEnabled(true);\n    ui->rigGetVFOCheckBox->setChecked(true);\n\n    ui->rigGetPWRCheckBox->setEnabled(true);\n    ui->rigGetPWRCheckBox->setChecked(true);\n\n    ui->rigGetRITCheckBox->setEnabled(true);\n    ui->rigGetRITCheckBox->setChecked(false);\n\n    ui->rigGetXITCheckBox->setEnabled(true);\n    ui->rigGetXITCheckBox->setChecked(false);\n\n    ui->rigGetPTTStateCheckBox->setEnabled(true);\n    if ( ui->rigPortTypeCombo->currentIndex() == RIGPORT_SPECIAL_OMNIRIG_INDEX\n         || driverID == Rig::TCI_DRIVER )\n        ui->rigGetPTTStateCheckBox->setChecked(true);\n    else\n        ui->rigGetPTTStateCheckBox->setChecked(false);\n\n    ui->rigQSYWipingCheckBox->setEnabled(true);\n    ui->rigQSYWipingCheckBox->setChecked(true);\n\n    ui->rigGetKeySpeedCheckBox->setEnabled(true);\n    ui->rigGetKeySpeedCheckBox->setChecked(true);\n\n    ui->rigKeySpeedSyncCheckBox->setEnabled(true);\n    ui->rigKeySpeedSyncCheckBox->setChecked(false);\n\n    ui->rigDXSpots2RigCheckBox->setEnabled(true);\n    ui->rigDXSpots2RigCheckBox->setChecked(false);\n\n    ui->rigGetSplitCheckBox->setEnabled(true);\n    ui->rigGetSplitCheckBox->setChecked(true);\n\n    setUIBasedOnRigCaps(caps);\n}\n\nvoid SettingsDialog::rotChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index;\n\n    int rotID = ui->rotModelSelect->currentData().toInt();\n\n    Rotator::DriverID driverID = static_cast<Rotator::DriverID>(ui->rotInterfaceCombo->currentData().toInt());\n    const RotCaps &caps = Rotator::instance()->getRotCaps(driverID, rotID);\n\n    if ( caps.isNetworkOnly )\n    {\n        ui->rotPortTypeCombo->setCurrentIndex(ROTPORT_NETWORK_INDEX);\n        ui->rotPortTypeCombo->setEnabled(false);\n    }\n    else\n        ui->rotPortTypeCombo->setEnabled(true);\n\n    if ( ui->rotPortTypeCombo->currentIndex() == RIGPORT_SERIAL_INDEX )\n    {\n        ui->rotDataBitsSelect->setCurrentText(QString::number(caps.serialDataBits));\n        ui->rotStopBitsSelect->setCurrentText(QString::number(caps.serialStopBits));\n    }\n}\n\nvoid SettingsDialog::cwKeyChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    const CWKey::CWKeyTypeID currentType = CWKey::intToTypeID(ui->cwModelSelect->currentData().toInt());\n\n    ui->cwDefaulSpeed->setValue(CW_DEFAULT_KEY_SPEED);\n\n    ui->cwStackedWidget->setCurrentIndex(( CWKey::isNetworkKey(currentType) ) ? STACKED_WIDGET_NETWORK_SETTING\n                                                                              : STACKED_WIDGET_SERIAL_SETTING);\n    if ( currentType == CWKey::MORSEOVERCAT\n         || currentType == CWKey::CWDAEMON_KEYER\n         || currentType == CWKey::FLDIGI_KEYER )\n    {\n        ui->cwBaudSelect->setEnabled(false);\n        ui->cwPortEdit->clear();\n        ui->cwPortEdit->setEnabled(false);\n        ui->cwKeyModeSelect->setEnabled(false);\n        ui->cwDefaulSpeed->setEnabled(true);\n        ui->cwSwapPaddlesCheckbox->setEnabled(false);\n        ui->cwPaddleOnlySidetoneCheckbox->setEnabled(false);\n        ui->cwSidetoneFreqCombo->setEnabled(currentType == CWKey::CWDAEMON_KEYER);\n\n        if ( currentType == CWKey::CWDAEMON_KEYER )\n        {\n            ui->cwNetPortSpin->setValue(CW_NET_CWDAEMON_PORT);\n        }\n        else if ( currentType == CWKey::FLDIGI_KEYER )\n        {\n            ui->cwDefaulSpeed->setEnabled(false);\n            ui->cwNetPortSpin->setValue(CW_NET_FLDIGI_PORT);\n            ui->cwDefaulSpeed->setValue(CW_KEY_SPEED_DISABLED);\n        }\n\n        return;\n    }\n    else   // WINKEYS\n    {\n        ui->cwBaudSelect->setEnabled(true);\n        ui->cwPortEdit->setEnabled(true);\n        ui->cwKeyModeSelect->setEnabled(true);\n        ui->cwDefaulSpeed->setEnabled(true);\n        ui->cwSwapPaddlesCheckbox->setEnabled(true);\n        ui->cwPaddleOnlySidetoneCheckbox->setEnabled(currentType == CWKey::WINKEY_KEYER);\n        ui->cwSidetoneFreqCombo->setEnabled(currentType == CWKey::WINKEY_KEYER);\n    }\n\n    ui->cwBaudSelect->setCurrentText(( currentType == CWKey::WINKEY_KEYER ) ? \"1200\"\n                                                                            : \"115200\");\n}\n\nvoid SettingsDialog::cwModeChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwSwapPaddlesCheckbox->setEnabled( CWKey::intToTypeID(ui->cwModelSelect->currentData().toInt()) == CWKey::WINKEY_KEYER\n                                           && CWKey::intToModeID(ui->cwKeyModeSelect->currentData().toInt()) != CWKey::SINGLE_PADDLE );\n}\n\nvoid SettingsDialog::rigStackWidgetChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    ui->rigPortEdit->clear();\n    ui->rigHostNameEdit->clear();\n}\n\nvoid SettingsDialog::rotStackWidgetChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    ui->rotPortEdit->clear();\n    ui->rotHostNameEdit->clear();\n}\n\nvoid SettingsDialog::cwKeyStackWidgetChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    ui->cwPortEdit->clear();\n    ui->cwHostNameEdit->clear();\n}\n\nvoid SettingsDialog::tqslPathBrowse()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &lastPath = ( ui->tqslPathEdit->text().isEmpty() ) ? QDir::rootPath()\n                                                                     : ui->tqslPathEdit->text();\n\n    QString filename = QFileDialog::getOpenFileName(this,\n                                                    tr(\"Select File\"),\n                                                    lastPath,\n#if defined(Q_OS_WIN)\n                                                    \"TQSL (*.exe)\",\n#elif defined(Q_OS_MACOS)\n                                                    \"TQSL (*.app)\",\n#else\n                                                    \"TQSL (tqsl)\",\n#endif\n                                                    nullptr,\n#if defined(Q_OS_LINUX)\n                                                    // Do not use the Native Dialog under Linux because the dialog is case-sensitive.\n                                                    // QT variant looks different but it is case-insensitive.\n                                                    // More information:\n                                                    // https://stackoverflow.com/questions/34858220/qt-how-to-set-a-case-insensitive-filter-on-qfiledialog\n                                                    // https://bugreports.qt.io/browse/QTBUG-51712\n                                                    QFileDialog::DontUseNativeDialog\n#else\n                                                    QFileDialog::Options()\n#endif\n                                                   );\n    if ( !filename.isEmpty() )\n    {\n        ui->tqslPathEdit->setText(filename);\n    }\n}\n\nvoid SettingsDialog::tqslAutoDetect()\n{\n    FCT_IDENTIFICATION;\n\n    const QString detectedPath = LotwBase::findTQSLPath();\n\n    if ( detectedPath.isEmpty() )\n    {\n        updateTQSLVersionLabel();\n        QMessageBox::warning(this, tr(\"Auto Detect\"),\n                             tr(\"TQSL was not found on this system.\\n\"\n                                \"Please install TQSL or specify the path manually.\"));\n    }\n    else\n    {\n        ui->tqslPathEdit->setText(detectedPath);\n    }\n}\n\nvoid SettingsDialog::updateTQSLVersionLabel()\n{\n    FCT_IDENTIFICATION;\n\n    const QString path = ui->tqslPathEdit->text().trimmed();\n    const bool isAutoDetect = path.isEmpty();\n    const QString resolvedPath = isAutoDetect ? LotwBase::findTQSLPath() : path;\n    const QString NOTFOUND = QString(\"<span style=\\\"color: red;\\\">✗ %1</span>\").arg(tr(\"Not found\"));\n\n    if ( resolvedPath.isEmpty() )\n    {\n        ui->tqslVersionValueLabel->setText(NOTFOUND);\n        return;\n    }\n\n    const TQSLVersion version = LotwBase::getTQSLVersion(resolvedPath);\n\n    if ( !version.isValid() )\n    {\n        ui->tqslVersionValueLabel->setText(NOTFOUND);\n        return;\n    }\n\n    const QString versionStr = QString(\"<span style=\\\"color: green;\\\">✓ %1.%2.%3</span>\")\n                                   .arg(version.major)\n                                   .arg(version.minor)\n                                   .arg(version.patch);\n\n    if ( isAutoDetect )\n        ui->tqslVersionValueLabel->setText(QString(\"%1 (%2)\").arg(versionStr, resolvedPath));\n    else\n        ui->tqslVersionValueLabel->setText(versionStr);\n}\n\nvoid SettingsDialog::stationCallsignChanged()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->stationCallsignEdit);\n\n    const QString &callsign = ui->stationCallsignEdit->text();\n    const DxccEntity &dxccEntity = Data::instance()->lookupDxcc(callsign);\n\n    if ( dxccEntity.dxcc )\n    {\n        ui->stationITUEdit->setText(QString::number(dxccEntity.ituz));\n        ui->stationCQZEdit->setText(QString::number(dxccEntity.cqz));\n        const QModelIndexList &countryIndex = ui->stationCountryCombo->model()->match(ui->stationCountryCombo->model()->index(0,0),\n                                                                               Qt::DisplayRole, dxccEntity.dxcc,\n                                                                               1, Qt::MatchExactly);\n        if ( countryIndex.size() >= 1 )\n            ui->stationCountryCombo->setCurrentIndex(countryIndex.at(0).row());\n    }\n    else\n    {\n        ui->stationCountryCombo->setCurrentIndex(0);\n        ui->stationCQZEdit->clear();\n        ui->stationITUEdit->clear();\n    }\n}\n\nvoid SettingsDialog::adjustLocatorTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->stationLocatorEdit);\n}\n\nvoid SettingsDialog::adjustVUCCLocatorTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->stationVUCCEdit);\n}\n\nvoid SettingsDialog::adjustRotCOMPortTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->rotPortEdit);\n}\n\nvoid SettingsDialog::adjustRigCOMPortTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->rigPortEdit);\n}\n\nvoid SettingsDialog::adjustCWKeyCOMPortTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->cwPortEdit);\n}\n\nvoid SettingsDialog::adjustOperatorTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->stationOperatorCallsignEdit);\n}\n\nvoid SettingsDialog::cancelled()\n{\n    FCT_IDENTIFICATION;\n\n    if ( stationProfManager->profileNameList().isEmpty() )\n    {\n        QMessageBox::warning(nullptr, QMessageBox::tr(\"QLog Warning\"),\n                             QMessageBox::tr(\"Please, define at least one Station Locations Profile\"));\n        return;\n    }\n\n    reject();\n}\n\nvoid SettingsDialog::sotaChanged(const QString &newSOTA)\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationSOTAEdit->setCompleter(( newSOTA.length() >= 3 ) ? sotaCompleter : nullptr);\n    ui->stationQTHEdit->clear();\n    ui->stationLocatorEdit->clear();\n}\n\nvoid SettingsDialog::sotaEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    SOTAEntity sotaInfo = Data::instance()->lookupSOTA(ui->stationSOTAEdit->text());\n\n    if ( sotaInfo.summitCode.toUpper() == ui->stationSOTAEdit->text().toUpper()\n         && !sotaInfo.summitName.isEmpty() )\n    {\n        sotaFallback = false;\n        ui->stationQTHEdit->setText(sotaInfo.summitName);\n        Gridsquare SOTAGrid(sotaInfo.latitude, sotaInfo.longitude);\n        if ( SOTAGrid.isValid() )\n            ui->stationLocatorEdit->setText(SOTAGrid.getGrid());\n    }\n    else if ( !ui->stationPOTAEdit->text().isEmpty() && !potaFallback )\n    {\n        potaFallback = true;\n        potaEditFinished();\n    }\n    else if ( !ui->stationWWFFEdit->text().isEmpty() && !wwffFallback )\n    {\n        wwffFallback = true;\n        wwffEditFinished();\n    }\n}\n\nvoid SettingsDialog::potaChanged(const QString &newPOTA)\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationPOTAEdit->setCompleter(( newPOTA.length() >= 3 ) ? potaCompleter : nullptr);\n    ui->stationQTHEdit->clear();\n    ui->stationLocatorEdit->clear();\n}\n\nvoid SettingsDialog::potaEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    QStringList potaList = ui->stationPOTAEdit->text().split(\"@\");\n    QString potaString;\n\n    if ( !potaList.isEmpty() )\n        potaString = potaList[0];\n    else\n        potaString = ui->stationPOTAEdit->text();\n\n    POTAEntity potaInfo = Data::instance()->lookupPOTA(potaString);\n\n    if ( potaInfo.reference.toUpper() == potaString.toUpper()\n         && !potaInfo.name.isEmpty() )\n    {\n        potaFallback = false;\n        ui->stationQTHEdit->setText(potaInfo.name);\n        Gridsquare POTAGrid(potaInfo.grid);\n        if ( POTAGrid.isValid() )\n            ui->stationLocatorEdit->setText(POTAGrid.getGrid());\n    }\n    else if ( !ui->stationSOTAEdit->text().isEmpty() && !sotaFallback )\n    {\n        sotaEditFinished();\n    }\n    else if ( !ui->stationWWFFEdit->text().isEmpty() && !wwffFallback )\n    {\n        wwffEditFinished();\n    }\n}\n\nvoid SettingsDialog::wwffChanged(const QString &newWWFF)\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationWWFFEdit->setCompleter(( newWWFF.length() >= 3 ) ? wwffCompleter : nullptr);\n\n    if ( ui->stationSOTAEdit->text().isEmpty() )\n    {\n        //do not clear IOTA - IOTA info seems to be not reliable from WWFF and IOTA\n        //can be added manually by operator\n        ui->stationQTHEdit->clear();\n    }\n}\n\nvoid SettingsDialog::wwffEditFinished()\n{\n    FCT_IDENTIFICATION;\n\n    WWFFEntity wwffInfo = Data::instance()->lookupWWFF(ui->stationWWFFEdit->text());\n\n    if ( wwffInfo.reference.toUpper() == ui->stationWWFFEdit->text().toUpper()\n         && !wwffInfo.name.isEmpty()\n         && ui->stationQTHEdit->text().isEmpty() )\n    {\n        wwffFallback = false;\n        ui->stationQTHEdit->setText(wwffInfo.name);\n        if ( ! wwffInfo.iota.isEmpty()\n             && wwffInfo.iota != \"-\" )\n        ui->stationIOTAEdit->setText(wwffInfo.iota.toUpper());\n    }\n    else if ( !ui->stationSOTAEdit->text().isEmpty() && !sotaFallback )\n    {\n        sotaEditFinished();\n    }\n    else if ( !ui->stationPOTAEdit->text().isEmpty() && !potaFallback )\n    {\n        potaEditFinished();\n    }\n}\n\nvoid SettingsDialog::primaryCallbookChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index;\n\n    QString primaryCallbookSelection = ui->primaryCallbookCombo->itemData(index).toString();\n\n    if ( primaryCallbookSelection == GenericCallbook::CALLBOOK_NAME )\n    {\n        ui->secondaryCallbookCombo->clear();\n        ui->secondaryCallbookCombo->setEnabled(false);\n    }\n    else if ( primaryCallbookSelection == HamQTHCallbook::CALLBOOK_NAME )\n    {\n        ui->secondaryCallbookCombo->setEnabled(true);\n        ui->secondaryCallbookCombo->clear();\n        ui->secondaryCallbookCombo->addItem(tr(\"Disabled\"), QVariant(GenericCallbook::CALLBOOK_NAME));\n        ui->secondaryCallbookCombo->addItem(tr(\"QRZ.com\"),  QVariant(QRZCallbook::CALLBOOK_NAME));\n    }\n    else if ( primaryCallbookSelection == QRZCallbook::CALLBOOK_NAME )\n    {\n        ui->secondaryCallbookCombo->setEnabled(true);\n        ui->secondaryCallbookCombo->clear();\n        ui->secondaryCallbookCombo->addItem(tr(\"Disabled\"), QVariant(GenericCallbook::CALLBOOK_NAME));\n        ui->secondaryCallbookCombo->addItem(tr(\"HamQTH\"),  QVariant(HamQTHCallbook::CALLBOOK_NAME));\n    }\n}\n\nvoid SettingsDialog::secondaryCallbookChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index;\n}\n\nvoid SettingsDialog::assignedKeyChanged(int index)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << index;\n\n    ui->rigKeySpeedSyncCheckBox->setEnabled(true);\n    ui->rigKeySpeedSyncCheckBox->setChecked(false);\n\n    const RigCaps &caps = Rig::instance()->getRigCaps(static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt()),\n                                                      ui->rigModelSelect->currentData().toInt());\n\n    setUIBasedOnRigCaps(caps);\n}\n\nvoid SettingsDialog::testWebLookupURL()\n{\n    FCT_IDENTIFICATION;\n\n    QDesktopServices::openUrl(GenericCallbook::getWebLookupURL(stationProfManager->getCurProfile1().callsign,\n                                                               ui->webLookupURLEdit->text()));\n}\n\nvoid SettingsDialog::joinMulticastChanged(int state)\n{\n    FCT_IDENTIFICATION;\n\n    ui->wsjtMulticastAddressLabel->setVisible(state);\n    ui->wsjtMulticastAddressEdit->setVisible(state);\n    ui->wsjtMulticastTTLLabel->setVisible(state);\n    ui->wsjtMulticastTTLSpin->setVisible(state);\n}\n\nvoid SettingsDialog::adjustWSJTXMulticastAddrTextColor()\n{\n    FCT_IDENTIFICATION;\n\n    setValidationResultColor(ui->wsjtMulticastAddressEdit);\n}\n\nvoid SettingsDialog::hrdlogSettingChanged()\n{\n    FCT_IDENTIFICATION;\n\n    ui->hrdlogOnAirCheckBox->setEnabled(!ui->hrdlogCallsignEdit->text().isEmpty()\n                                         && !ui->hrdlogUploadCodeEdit->text().isEmpty());\n    if ( !ui->hrdlogOnAirCheckBox->isEnabled() )\n        ui->hrdlogOnAirCheckBox->setChecked(false);\n}\n\nvoid SettingsDialog::clublogSettingChanged()\n{\n    FCT_IDENTIFICATION;\n\n    ui->clublogUploadImmediatelyCheckbox->setEnabled(!ui->clublogEmailEdit->text().isEmpty()\n                                                 && !ui->clublogPasswordEdit->text().isEmpty());\n    if ( !ui->clublogUploadImmediatelyCheckbox->isEnabled() )\n        ui->clublogUploadImmediatelyCheckbox->setChecked(false);\n}\n\nvoid SettingsDialog::updateDateFormatResult()\n{\n    FCT_IDENTIFICATION;\n\n    ui->dateFormatResultLabel->setText(QDate::currentDate().toString(ui->dateFormatStringEdit->text()));\n}\n\nvoid SettingsDialog::rigFlowControlChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    // if HW handshake is enabled then RTS must be None\n    bool isHWControlEnabled = (ui->rigFlowControlSelect->currentData().toString() == SerialPort::SERIAL_FLOWCONTROL_HARDWARE);\n\n    if ( isHWControlEnabled )\n        setComboByData(ui->rigRTSCombo, SerialPort::SERIAL_SIGNAL_NONE);\n    ui->rigRTSCombo->setEnabled(!isHWControlEnabled);\n}\n\nvoid SettingsDialog::showRigctldAdvanced()\n{\n    FCT_IDENTIFICATION;\n\n    RigctldAdvancedDialog dialog(this);\n    dialog.setPath(rigctldPath);\n    dialog.setArgs(rigctldArgs);\n\n    if (dialog.exec() == QDialog::Accepted)\n    {\n        rigctldPath = dialog.getPath();\n        rigctldArgs = dialog.getArgs();\n    }\n}\n\nvoid SettingsDialog::rigShareChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    updateRigShareEnabled();\n}\n\nvoid SettingsDialog::updateRigShareEnabled()\n{\n    FCT_IDENTIFICATION;\n\n    Rig::DriverID driverID = static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt());\n    int portType = ui->rigPortTypeCombo->currentIndex();\n\n    // Share rigctld is only available for Hamlib driver with serial connection\n    bool canShare = (driverID == Rig::HAMLIB_DRIVER) && (portType == RIGPORT_SERIAL_INDEX);\n\n    ui->rigShareCheckBox->setEnabled(canShare);\n    ui->rigSharePortSpinBox->setEnabled(canShare && ui->rigShareCheckBox->isChecked());\n    ui->rigShareAdvancedButton->setEnabled(canShare && ui->rigShareCheckBox->isChecked());\n\n    if ( !canShare )\n    {\n        ui->rigShareCheckBox->setChecked(false);\n\n        if (driverID != Rig::HAMLIB_DRIVER)\n            ui->rigShareCheckBox->setToolTip(tr(\"Rig sharing is only available for Hamlib driver\"));\n        else\n            ui->rigShareCheckBox->setToolTip(tr(\"Rig sharing is not available for network connection\"));\n    }\n    else\n        ui->rigShareCheckBox->setToolTip(tr(\"Start rigctld daemon to share rig with other applications (e.g. WSJT-X)\"));\n}\n\nvoid SettingsDialog::qrzAddCallsignAPIKey()\n{\n    FCT_IDENTIFICATION;\n\n    QAbstractItemModel *model = ui->qrzCallsignApiKeyTableView->model();\n\n    int newRow = model->rowCount();\n    model->insertRow(newRow);\n    QModelIndex index = model->index(newRow, 0);\n    ui->qrzCallsignApiKeyTableView->setCurrentIndex(index);\n    ui->qrzCallsignApiKeyTableView->edit(index);\n}\n\nvoid SettingsDialog::qrzDelCallsignAPIKey()\n{\n    FCT_IDENTIFICATION;\n\n    QModelIndex index = ui->qrzCallsignApiKeyTableView->currentIndex();\n    if ( !index.isValid() ) return;\n\n    ui->qrzCallsignApiKeyTableView->model()->removeRow(index.row());\n}\n\nvoid SettingsDialog::onDeleteAllPasswords()\n{\n    FCT_IDENTIFICATION;\n\n    CredentialStore::instance()->deleteAllPasswords();\n    QMessageBox::information(this, tr(\"Delete Passwords\"), tr(\"All passwords have been deleted\"));\n\n    // It is necessary to close the dialog, because we would have to delete\n    // all the passwords in the dialog. It would be safer to close it.\n    reject();\n}\n\nvoid SettingsDialog::onDeleteAllQSOs()\n{\n    FCT_IDENTIFICATION;\n\n    QProgressDialog *progress = new QProgressDialog(tr(\"Deleting all QSOs...\"), QString(), 0, 0, this);\n    progress->setWindowModality(Qt::ApplicationModal);\n    progress->setMinimumDuration(0);\n    progress->setAttribute(Qt::WA_DeleteOnClose, true);\n    progress->show();\n\n    QTimer::singleShot(0, this, [this, progress]()\n    {\n        QSqlQuery query;\n        bool ok = query.exec(QStringLiteral(\"DELETE FROM contacts\"));\n\n        if (!ok)\n            qCDebug(runtime) << \"Cannot delete QSOs:\" << query.lastError().text();\n\n        progress->close();\n\n        if (!ok)\n            QMessageBox::warning(this, tr(\"Error\"), tr(\"Failed to delete all QSOs.\"));\n        accept();\n    });\n}\n\nvoid SettingsDialog::readSettings()\n{\n    FCT_IDENTIFICATION;\n\n    refreshStationProfilesView();\n    refreshRigProfilesView();\n    refreshRotProfilesView();\n    refreshRotUsrButtonsProfilesView();\n    refreshAntProfilesView();\n    refreshCWKeyProfilesView();\n    refreshCWShortcutProfilesView();\n    refreshRigAssignedCWKeyCombo();\n\n    /************/\n    /* Callbook */\n    /************/\n\n    int primaryCallbookIndex = ui->primaryCallbookCombo->findData(LogParam::getPrimaryCallbook(GenericCallbook::CALLBOOK_NAME));\n\n    ui->primaryCallbookCombo->setCurrentIndex(primaryCallbookIndex);\n\n    int secondaryCallbookIndex = ui->secondaryCallbookCombo->findData(LogParam::getSecondaryCallbook(GenericCallbook::CALLBOOK_NAME));\n\n    ui->secondaryCallbookCombo->setCurrentIndex(secondaryCallbookIndex);\n\n    ui->hamQthUsernameEdit->setText(HamQTHBase::getUsername());\n    ui->hamQthPasswordEdit->setText(HamQTHBase::getPasswd());\n\n    ui->qrzUsernameEdit->setText(QRZBase::getUsername());\n    ui->qrzPasswordEdit->setText(QRZBase::getPasswd(QRZBase::getUsername()));\n\n    ui->webLookupURLEdit->setText(GenericCallbook::getWebLookupURL(\"\", QString(), false));\n\n    /********/\n    /* LoTW */\n    /********/\n    ui->lotwUsernameEdit->setText(LotwBase::getUsername());\n    ui->lotwPasswordEdit->setText(LotwBase::getPasswd());\n    ui->tqslPathEdit->setText(LotwBase::getTQSLPath());\n    updateTQSLVersionLabel();\n\n    /***********/\n    /* ClubLog */\n    /***********/\n    ui->clublogEmailEdit->setText(ClubLogBase::getEmail());\n    ui->clublogPasswordEdit->setText(ClubLogBase::getPasswd());\n    ui->clublogUploadImmediatelyCheckbox->setChecked(ClubLogBase::isUploadImmediatelyEnabled());\n\n    /********/\n    /* eQSL */\n    /********/\n    ui->eqslUsernameEdit->setText(EQSLBase::getUsername());\n    ui->eqslPasswordEdit->setText(EQSLBase::getPasswd());\n\n    /**********/\n    /* HRDLog */\n    /**********/\n    ui->hrdlogCallsignEdit->setText(HRDLogBase::getRegisteredCallsign());\n    ui->hrdlogUploadCodeEdit->setText(HRDLogBase::getUploadCode());\n    ui->hrdlogOnAirCheckBox->setChecked(HRDLogBase::getOnAirEnabled());\n\n    /***********/\n    /* QRZ.COM */\n    /***********/\n    ui->qrzApiKeyEdit->setText(QRZBase::getLogbookAPIKey(QRZBase::getInternalAPIUsername()));\n    generateQRZAPICallsignTable();\n\n    /***********/\n    /* Wavelog */\n    /***********/\n    ui->wavelogAddQSOEndpointEdit->setText(CloudlogBase::getAPIEndpoint());\n    ui->wavelogApiKeyEdit->setText(CloudlogBase::getLogbookAPIKey());\n\n    /***********************/\n    /* Others - DXCC Group */\n    /***********************/\n    ui->dxccConfirmedByLotwCheckBox->setChecked(LogParam::getDxccConfirmedByLotwState());\n    ui->dxccConfirmedByPaperCheckBox->setChecked(LogParam::getDxccConfirmedByPaperState());\n    ui->dxccConfirmedByEqslCheckBox->setChecked(LogParam::getDxccConfirmedByEqslState());\n\n    /***************/\n    /* ON4KST Chat */\n    /***************/\n    ui->kstUsernameEdit->setText(KSTChat::getUsername());\n    ui->kstPasswordEdit->setText(KSTChat::getPasswd());\n\n    /***********/\n    /* MEMBERS */\n    /***********/\n\n\n    /***********/\n    /* NETWORK */\n    /***********/\n\n    ui->wsjtPortSpin->setValue(WsjtxUDPReceiver::getConfigPort());\n    ui->wsjtForwardEdit->setText(WsjtxUDPReceiver::getConfigForwardAddresses());\n    ui->wsjtMulticastCheckbox->setChecked(WsjtxUDPReceiver::getConfigMulticastJoin());\n    ui->wsjtMulticastAddressEdit->setText(WsjtxUDPReceiver::getConfigMulticastAddress());\n    ui->wsjtMulticastTTLSpin->setValue(WsjtxUDPReceiver::getConfigMulticastTTL());\n    ui->wsjtColorCqSpotsCheckbox->setChecked(WsjtxUDPReceiver::getConfigOutputColorCQSpot());\n\n    ui->notifLogIDEdit->setText(LogParam::getLogID());\n    ui->notifQSOEdit->setText(NetworkNotification::getNotifQSOAdiAddrs());\n    ui->notifDXSpotsEdit->setText(NetworkNotification::getNotifDXSpotAddrs());\n    ui->notifWSJTXCQSpotsEdit->setText(NetworkNotification::getNotifWSJTXCQSpotAddrs());\n    ui->notifSpotAlertEdit->setText(NetworkNotification::getNotifSpotAlertAddrs());\n    ui->notifRigEdit->setText(NetworkNotification::getNotifRigStateAddrs());\n\n    /*******/\n    /* GUI */\n    /*******/\n    bool timeformat24 = locale.getSettingUse24hformat();\n    ui->timeFormat24RadioButton->setChecked(timeformat24);\n    ui->timeFormat12RadioButton->setChecked(!timeformat24);\n\n    bool dateSystemFormat = locale.getSettingUseSystemDateFormat();\n    ui->dateFormatSystemRadioButton->setChecked(dateSystemFormat);\n    ui->dateFormatCustomRadioButton->setChecked(!dateSystemFormat);\n    ui->dateFormatStringEdit->setText(locale.getSettingDateFormat());\n\n    bool unitFormatMetric =  locale.getSettingUseMetric();\n    ui->unitFormatMetricRadioButton->setChecked(unitFormatMetric);\n    ui->unitFormatImperialRadioButton->setChecked(!unitFormatMetric);\n\n    /******************/\n    /* END OF Reading */\n    /******************/\n}\n\nvoid SettingsDialog::writeSettings()\n{\n    FCT_IDENTIFICATION;\n\n    stationProfManager->save();\n    rigProfManager->save();\n    rotProfManager->save();\n    rotUsrButtonsProfManager->save();\n    antProfManager->save();\n    cwKeyProfManager->save();\n    cwShortcutProfManager->save();\n\n    /************/\n    /* Callbook */\n    /************/\n    HamQTHBase::saveUsernamePassword(ui->hamQthUsernameEdit->text(),\n                                 ui->hamQthPasswordEdit->text());\n\n    QRZBase::saveUsernamePassword(ui->qrzUsernameEdit->text(),\n                              ui->qrzPasswordEdit->text());\n\n    LogParam::setPrimaryCallbook(ui->primaryCallbookCombo->itemData(ui->primaryCallbookCombo->currentIndex()).toString());\n    LogParam::setSecondaryCallbook(ui->secondaryCallbookCombo->itemData(ui->secondaryCallbookCombo->currentIndex()).toString());\n    LogParam::setCallbookWebLookupURL(ui->webLookupURLEdit->text());\n\n    /********/\n    /* LoTW */\n    /********/\n\n    LotwBase::saveUsernamePassword(ui->lotwUsernameEdit->text(),\n                               ui->lotwPasswordEdit->text());\n    LotwBase::saveTQSLPath(ui->tqslPathEdit->text());\n\n    /***********/\n    /* ClubLog */\n    /***********/\n    ClubLogBase::saveUsernamePassword(ui->clublogEmailEdit->text(),\n                                  ui->clublogPasswordEdit->text());\n\n    ClubLogBase::saveUploadImmediatelyConfig(ui->clublogUploadImmediatelyCheckbox->isChecked());\n\n    /********/\n    /* eQSL */\n    /********/\n\n    EQSLBase::saveUsernamePassword(ui->eqslUsernameEdit->text(),\n                               ui->eqslPasswordEdit->text());\n\n    /**********/\n    /* HRDLog */\n    /**********/\n    HRDLogBase::saveUploadCode(ui->hrdlogCallsignEdit->text(),\n                           ui->hrdlogUploadCodeEdit->text());\n    HRDLogBase::saveOnAirEnabled(ui->hrdlogOnAirCheckBox->isChecked());\n\n    /***********/\n    /* QRZ.COM */\n    /***********/\n    QRZBase::saveLogbookAPIKey(ui->qrzApiKeyEdit->text(), QRZBase::getInternalAPIUsername());\n    saveQRZAPICallsignTable();\n\n    /***********/\n    /* Wavelog */\n    /***********/\n    CloudlogBase::setAPIEndpoint(ui->wavelogAddQSOEndpointEdit->text());\n    CloudlogBase::saveLogbookAPIKey(ui->wavelogApiKeyEdit->text());\n\n    /***********************/\n    /* Others - DXCC Group */\n    /***********************/\n    LogParam::setDxccConfirmedByLotwState(ui->dxccConfirmedByLotwCheckBox->isChecked());\n    LogParam::setDxccConfirmedByPaperState(ui->dxccConfirmedByPaperCheckBox->isChecked());\n    LogParam::setDxccConfirmedByEqslState(ui->dxccConfirmedByEqslCheckBox->isChecked());\n\n    /***************/\n    /* ON4KST Chat */\n    /***************/\n    KSTChat::saveUsernamePassword(ui->kstUsernameEdit->text(),\n                                  ui->kstPasswordEdit->text());\n\n    /***********/\n    /* MEMBERS */\n    /***********/\n\n    QStringList enabledLists;\n\n    for ( QCheckBox* item: static_cast<const QList<QCheckBox *>&>(memberListCheckBoxes) )\n    {\n        if ( item->isChecked() )\n        {\n            enabledLists << item->text();\n        }\n    }\n    MembershipQE::saveEnabledClubLists(enabledLists);\n\n    /***********/\n    /* NETWORK */\n    /***********/\n    WsjtxUDPReceiver::saveConfigPort(ui->wsjtPortSpin->value());\n    WsjtxUDPReceiver::saveConfigForwardAddresses(ui->wsjtForwardEdit->text());\n    WsjtxUDPReceiver::saveConfigMulticastJoin(ui->wsjtMulticastCheckbox->isChecked());\n    WsjtxUDPReceiver::saveConfigMulticastAddress(ui->wsjtMulticastAddressEdit->text());\n    WsjtxUDPReceiver::saveConfigMulticastTTL(ui->wsjtMulticastTTLSpin->value());\n    WsjtxUDPReceiver::saveConfigOutputColorCQSpot(ui->wsjtColorCqSpotsCheckbox->isChecked());\n    NetworkNotification::saveNotifQSOAdiAddrs(ui->notifQSOEdit->text());\n    NetworkNotification::saveNotifDXSpotAddrs(ui->notifDXSpotsEdit->text());\n    NetworkNotification::saveNotifWSJTXCQSpotAddrs(ui->notifWSJTXCQSpotsEdit->text());\n    NetworkNotification::saveNotifSpotAlertAddrs(ui->notifSpotAlertEdit->text());\n    NetworkNotification::saveNotifRigStateAddrs(ui->notifRigEdit->text());\n\n    /*******/\n    /* GUI */\n    /*******/\n    locale.setSettingUse24hformat(ui->timeFormat24RadioButton->isChecked());\n\n    bool systemDateChecked = ui->dateFormatSystemRadioButton->isChecked();\n    locale.setSettingUseSystemDateFormat(systemDateChecked);\n    if ( !systemDateChecked )\n        locale.setSettingDateFormat(ui->dateFormatStringEdit->text());\n\n    locale.setSettingUseMetric(ui->unitFormatMetricRadioButton->isChecked());\n}\n\n/* this function is called when user modify rig progile\n * there may be situations where hamlib change the cap\n * for rig and it is necessary to change the settings of the rig.\n * This feature does it */\nvoid SettingsDialog::setUIBasedOnRigCaps(const RigCaps &caps)\n{\n    FCT_IDENTIFICATION;\n\n    if ( !caps.canGetFreq ) disableCapCheckbox(ui->rigGetFreqCheckBox);\n    if ( !caps.canGetMode ) disableCapCheckbox(ui->rigGetModeCheckBox);\n    if ( !caps.canGetVFO ) disableCapCheckbox(ui->rigGetVFOCheckBox);\n    if ( !caps.canGetPWR )disableCapCheckbox(ui->rigGetPWRCheckBox);\n    if ( !caps.canGetRIT )disableCapCheckbox(ui->rigGetRITCheckBox);\n    if ( !caps.canGetXIT )disableCapCheckbox(ui->rigGetXITCheckBox);\n    if ( !caps.canGetPTT )disableCapCheckbox(ui->rigGetPTTStateCheckBox);\n    if ( !ui->rigGetFreqCheckBox->isChecked() )disableCapCheckbox(ui->rigQSYWipingCheckBox);\n    if ( !caps.canGetKeySpeed )\n    {\n        disableCapCheckbox(ui->rigGetKeySpeedCheckBox);\n        disableCapCheckbox(ui->rigKeySpeedSyncCheckBox);\n    }\n    if ( !caps.canProcessDXSpot )disableCapCheckbox(ui->rigDXSpots2RigCheckBox);\n    if ( !caps.canGetSplit )disableCapCheckbox(ui->rigGetSplitCheckBox);\n    if ( ui->rigAssignedCWKeyCombo->currentText() != EMPTY_CWKEY_PROFILE )\n    {\n        CWKeyProfile selectedKeyProfile;\n        selectedKeyProfile = cwKeyProfManager->getProfile(ui->rigAssignedCWKeyCombo->currentText());\n        if ( ! caps.canGetKeySpeed\n             || (selectedKeyProfile.model == CWKey::MORSEOVERCAT) )\n        {\n            ui->rigKeySpeedSyncCheckBox->setChecked(false);\n            ui->rigKeySpeedSyncCheckBox->setEnabled(false);\n        }\n    }\n    if ( !caps.isCIVAddrSupported )ui->rigCIVAddrSpinBox->setValue(CIVADDR_DISABLED_VALUE);\n\n    ui->rigCIVAddrLabel->setVisible(caps.isCIVAddrSupported);\n    ui->rigCIVAddrSpinBox->setVisible(caps.isCIVAddrSupported);\n\n}\n\n/* Based on selected Rig model, it is needed to prepare AssignedCWKeyCombo\n * content\n * The combo has to contain only supported keyes\n * If selected rig does not support MORSE over CAT then Combo must not contain\n * CW Key profiles where Morse Over CAT is used.\n */\nvoid SettingsDialog::refreshRigAssignedCWKeyCombo()\n{\n    FCT_IDENTIFICATION;\n\n    const QString &cwKeyName = ui->rigAssignedCWKeyCombo->currentText();\n    const QStringList &availableCWProfileNames = cwKeyProfManager->profileNameList();\n    QStringList approvedCWProfiles;\n\n    const RigCaps &caps = Rig::instance()->getRigCaps(static_cast<Rig::DriverID>(ui->rigInterfaceCombo->currentData().toInt()),\n                                                      ui->rigModelSelect->currentData().toInt());\n\n    approvedCWProfiles << EMPTY_CWKEY_PROFILE; // add empty profile (like NONE)\n\n    if ( caps.canSendMorse )\n    {\n        approvedCWProfiles << availableCWProfileNames;\n    }\n    else\n    {\n        // remove unsupported Morse Over CAT Profile Names\n        for ( const QString &cwProfileName : availableCWProfileNames )\n        {\n            const CWKeyProfile  &testedKey = cwKeyProfManager->getProfile(cwProfileName);\n            if ( testedKey.model != CWKey::MORSEOVERCAT )\n            {\n                approvedCWProfiles << cwProfileName;\n            }\n        }\n    }\n\n    QStringListModel* model = static_cast<QStringListModel*>(ui->rigAssignedCWKeyCombo->model());\n    if ( model ) model->setStringList(approvedCWProfiles);\n\n    ui->rigAssignedCWKeyCombo->setCurrentText(cwKeyName);\n}\n\nvoid SettingsDialog::setValidationResultColor(QLineEdit *editBox)\n{\n    FCT_IDENTIFICATION;\n\n    QPalette p;\n\n    if ( ! editBox )\n        return;\n\n    p.setColor( QPalette::Text, ( ! editBox->hasAcceptableInput() ) ? Qt::red : qApp->palette().text().color());\n    editBox->setPalette(p);\n}\n\nvoid SettingsDialog::generateMembershipCheckboxes()\n{\n    FCT_IDENTIFICATION;\n\n    QSqlTableModel membershipDirectoryModel;\n    membershipDirectoryModel.setTable(\"membership_directory\");\n    membershipDirectoryModel.setSort(0, Qt::AscendingOrder);\n    membershipDirectoryModel.select();\n    QStringList currentlyEnabledLists = MembershipQE::getEnabledClubLists();\n\n    for ( int i = 0 ; i < membershipDirectoryModel.rowCount(); i++ )\n    {\n        QCheckBox *columnCheckbox = new QCheckBox(this);\n\n        const QString shortDesc = membershipDirectoryModel.data(membershipDirectoryModel.index(i, membershipDirectoryModel.fieldIndex(\"short_desc\"))).toString();\n        const QString longDesc = membershipDirectoryModel.data(membershipDirectoryModel.index(i, membershipDirectoryModel.fieldIndex(\"long_desc\"))).toString();\n        const QString records = membershipDirectoryModel.data(membershipDirectoryModel.index(i, membershipDirectoryModel.fieldIndex(\"num_records\"))).toString();\n\n        columnCheckbox->setText(shortDesc);\n        columnCheckbox->setToolTip(longDesc + QString(\" (\" + tr(\"members\") + \": %1)\").arg(records));\n        columnCheckbox->setChecked(currentlyEnabledLists.contains(shortDesc));\n        memberListCheckBoxes.append(columnCheckbox);\n        ui->clubListGrig->addWidget(columnCheckbox, i / 6, i % 6);\n    }\n\n    if ( memberListCheckBoxes.isEmpty() )\n        ui->clubListGrig->addWidget(new QLabel(tr(\"Required internet connection during application start\")));\n}\n\nvoid SettingsDialog::generateQRZAPICallsignTable()\n{\n    FCT_IDENTIFICATION;\n\n    QStandardItemModel* tableModel = new QStandardItemModel(ui->qrzCallsignApiKeyTableView);\n    tableModel->setHorizontalHeaderLabels({tr(\"Callsign\"), tr(\"API Key\")});\n\n    const QStringList &addlCallsign = QRZBase::getLogbookAPIAddlCallsigns();\n\n    for ( const QString &callsign : addlCallsign )\n    {\n        QList<QStandardItem*> rowItems({new QStandardItem(callsign),\n                                        new QStandardItem(QRZBase::getLogbookAPIKey(callsign))});\n        tableModel->appendRow(rowItems);\n    }\n\n    ui->qrzCallsignApiKeyTableView->setModel(tableModel);\n    ui->qrzCallsignApiKeyTableView->resizeColumnsToContents();\n    ui->qrzCallsignApiKeyTableView->setItemDelegateForColumn(0, new UpperCaseUniqueDelegate(this));\n    ui->qrzCallsignApiKeyTableView->setItemDelegateForColumn(1, new PasswordDelegate(this));\n}\n\nvoid SettingsDialog::saveQRZAPICallsignTable()\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &addlCallsignsAPIList = LogParam::getQRZCOMAPICallsignsList();\n    for ( const QString &callsign : addlCallsignsAPIList)\n    {\n        qCDebug(runtime) << \"Deleting QRZ Callsign API\" << callsign;\n        QRZBase::saveLogbookAPIKey({}, callsign); // side-effect - an empty key causes deleting its old value in the secure store.\n    }\n\n    // delete original list of callsigns\n    QRZBase::setLogbookAPIAddlCallsigns({});\n\n    QAbstractItemModel *model = ui->qrzCallsignApiKeyTableView->model();\n    QStringList newAddlCallsignsAPIList;\n    for ( int row = 0; row < model->rowCount(); ++row )\n    {\n        const QString &newCallsign = model->data(model->index(row, 0)).toString();\n        if ( !newCallsign.isEmpty() )\n        {\n            qCDebug(runtime) << \"Saving a new QRZ callsign API\" << newCallsign;\n            const QString &newPassword = model->data(model->index(row, 1)).toString();\n            if ( !newPassword.isEmpty() ) newAddlCallsignsAPIList.append(newCallsign);\n            QRZBase::saveLogbookAPIKey(newPassword, newCallsign);\n        }\n    }\n    if ( !newAddlCallsignsAPIList.isEmpty() )\n        QRZBase::setLogbookAPIAddlCallsigns(newAddlCallsignsAPIList);\n}\n\nvoid SettingsDialog::updateCountyCompleter(int dxcc)\n{\n    FCT_IDENTIFICATION;\n\n    ui->stationCountyEdit->setCompleter(nullptr);\n    delete countyCompleter;\n    countyCompleter = nullptr;\n    if ( dxcc == 0 )\n        return;\n    countyCompleter = Data::createCountyCompleter(dxcc, this);\n    ui->stationCountyEdit->setCompleter(countyCompleter);\n}\n\nSettingsDialog::~SettingsDialog() {\n    FCT_IDENTIFICATION;\n\n    sotaCompleter->deleteLater();\n    iotaCompleter->deleteLater();\n    sigCompleter->deleteLater();\n    if ( countyCompleter )\n        countyCompleter->deleteLater();\n    delete ui;\n}\n"
  },
  {
    "path": "ui/SettingsDialog.h",
    "content": "#ifndef QLOG_UI_SETTINGSDIALOG_H\n#define QLOG_UI_SETTINGSDIALOG_H\n\n#include <QAbstractItemView>\n#include <QDialog>\n#include <functional>\n#include <QModelIndex>\n#include <QSqlTableModel>\n#include <QCompleter>\n#include <QTimer>\n#include <hamlib/rig.h>\n#include <QLineEdit>\n#include <QComboBox>\n#include <QCheckBox>\n#include <QDoubleSpinBox>\n\n#include \"data/StationProfile.h\"\n#include \"data/RigProfile.h\"\n#include \"data/RotProfile.h\"\n#include \"data/AntProfile.h\"\n#include \"data/CWKeyProfile.h\"\n#include \"data/CWShortcutProfile.h\"\n#include \"data/RotUsrButtonsProfile.h\"\n#include \"core/LogLocale.h\"\n#include \"ui/MainWindow.h\"\n#include \"ui/component/MultiselectCompleter.h\"\n#include \"rig/RigCaps.h\"\n\nnamespace Ui {\nclass SettingsDialog;\n}\n\nclass QSqlTableModel;\n\nclass SettingsDialog : public QDialog {\n    Q_OBJECT\n\npublic:\n    explicit SettingsDialog(MainWindow *parent = nullptr);\n    ~SettingsDialog();\n\npublic slots:\n    void save();\n\n    void addRigProfile();\n    void delRigProfile();\n    void refreshRigProfilesView();\n    void doubleClickRigProfile(QModelIndex);\n    void clearRigProfileForm();\n    void rigRXOffsetChanged(int);\n    void rigTXOffsetChanged(int);\n    void rigGetFreqChanged(int);\n    void rigPortTypeChanged(int);\n    void rigInterfaceChanged(int);\n    void rigPTTTypeChanged(int);\n\n    void addRotProfile();\n    void delRotProfile();\n    void refreshRotProfilesView();\n    void doubleClickRotProfile(QModelIndex);\n    void clearRotProfileForm();\n    void rotPortTypeChanged(int);\n    void rotInterfaceChanged(int);\n\n    void addRotUsrButtonsProfile();\n    void delRotUsrButtonsProfile();\n    void refreshRotUsrButtonsProfilesView();\n    void doubleClickRotUsrButtonsProfile(QModelIndex);\n    void clearRotUsrButtonsProfileForm();\n\n    void addAntProfile();\n    void delAntProfile();\n    void refreshAntProfilesView();\n    void doubleClickAntProfile(QModelIndex);\n    void clearAntProfileForm();\n\n    void addCWKeyProfile();\n    void delCWKeyProfile();\n    void refreshCWKeyProfilesView();\n    void doubleClickCWKeyProfile(QModelIndex);\n    void clearCWKeyProfileForm();\n\n    void addCWShortcutProfile();\n    void delCWShortcutProfile();\n    void refreshCWShortcutProfilesView();\n    void doubleClickCWShortcutProfile(QModelIndex);\n    void clearCWShortcutProfileForm();\n\n    void refreshStationProfilesView();\n    void addStationProfile();\n    void deleteStationProfile();\n    void doubleClickStationProfile(QModelIndex);\n    void clearStationProfileForm();\n\n    void rigChanged(int);\n    void rotChanged(int);\n    void cwKeyChanged(int);\n    void cwModeChanged(int);\n    void rigStackWidgetChanged(int);\n    void rotStackWidgetChanged(int);\n    void cwKeyStackWidgetChanged(int);\n    void tqslPathBrowse();\n    void tqslAutoDetect();\n    void updateTQSLVersionLabel();\n    void stationCallsignChanged();\n    void adjustLocatorTextColor();\n    void adjustVUCCLocatorTextColor();\n    void adjustRotCOMPortTextColor();\n    void adjustRigCOMPortTextColor();\n    void adjustCWKeyCOMPortTextColor();\n    void adjustOperatorTextColor();\n    void cancelled();\n    void sotaChanged(const QString&);\n    void sotaEditFinished();\n    void potaChanged(const QString&);\n    void potaEditFinished();\n    void wwffChanged(const QString&);\n    void wwffEditFinished();\n    void primaryCallbookChanged(int);\n    void secondaryCallbookChanged(int);\n    void assignedKeyChanged(int);\n    void testWebLookupURL();\n    void joinMulticastChanged(int);\n    void adjustWSJTXMulticastAddrTextColor();\n    void hrdlogSettingChanged();\n    void clublogSettingChanged();\n    void updateDateFormatResult();\n    void rigFlowControlChanged(int);\n    void showRigctldAdvanced();\n    void rigShareChanged(int);\n\n    void qrzAddCallsignAPIKey();\n    void qrzDelCallsignAPIKey();\n\n    void onDeleteAllPasswords();\n    void onDeleteAllQSOs();\n\nprivate:\n    void readSettings();\n    void writeSettings();\n    void setUIBasedOnRigCaps(const RigCaps&);\n    void refreshRigAssignedCWKeyCombo();\n    void updateRigShareEnabled();\n    void setValidationResultColor(QLineEdit *);\n    void generateMembershipCheckboxes();\n    static void refreshProfileView(QAbstractItemView *view, const QStringList &names);\n    static void disableCapCheckbox(QCheckBox *checkbox);\n    static void initProfileListView(QAbstractItemView *view);\n    static void populateFlowControlCombo(QComboBox *combo);\n    static void populateParityCombo(QComboBox *combo);\n    static void populateSignalCombo(QComboBox *combo);\n    static void setComboByData(QComboBox *combo, const QVariant &data, int fallback = 0);\n    static void updateOffsetSpinBox(QCheckBox *checkbox, QDoubleSpinBox *spinBox);\n    static void deleteSelectedProfiles(QAbstractItemView *view,\n                                       const std::function<void(const QString &)> &removeProfile);\n    void generateQRZAPICallsignTable();\n    void saveQRZAPICallsignTable();\n    void updateCountyCompleter(int dxcc);\n\n    static constexpr int STACKED_WIDGET_SERIAL_SETTING          = 0;\n    static constexpr int STACKED_WIDGET_NETWORK_SETTING         = 1;\n    static constexpr int STACKED_WIDGET_SPECIAL_OMNIRIG_SETTING = 2;\n\n    static constexpr int RIGPORT_SERIAL_INDEX          = 0;\n    static constexpr int RIGPORT_NETWORK_INDEX         = 1;\n    static constexpr int RIGPORT_SPECIAL_OMNIRIG_INDEX = 2;\n\n    static constexpr int ROTPORT_SERIAL_INDEX  = 0;\n    static constexpr int ROTPORT_NETWORK_INDEX = 1;\n\n    static constexpr int RIG_NET_DEFAULT_PORT   = 4532;\n    static constexpr int ROT_NET_DEFAULT_PORT   = 4533;\n    static constexpr int ROT_NET_DEFAULT_PSTROT = 12000;\n    static constexpr int CW_NET_CWDAEMON_PORT   = 6789;\n    static constexpr int CW_NET_FLDIGI_PORT     = 7362;\n    static constexpr int CW_DEFAULT_KEY_SPEED   = 20;\n    static constexpr int CW_KEY_SPEED_DISABLED  = 0;\n\n    static constexpr int PTT_TYPE_NONE_INDEX    = 0;\n    static constexpr int PTT_TYPE_CAT_INDEX     = 1;\n    static constexpr int CIVADDR_DISABLED_VALUE = -1;\n\n    static constexpr const char* EMPTY_CWKEY_PROFILE = \" \";\n\n    QSqlTableModel* modeTableModel;\n    QSqlTableModel* bandTableModel;\n    StationProfilesManager *stationProfManager;\n    RigProfilesManager *rigProfManager;\n    RotProfilesManager *rotProfManager;\n    AntProfilesManager *antProfManager;\n    CWKeyProfilesManager *cwKeyProfManager;\n    CWShortcutProfilesManager *cwShortcutProfManager;\n    RotUsrButtonsProfilesManager *rotUsrButtonsProfManager;\n    QCompleter *sotaCompleter;\n    QCompleter *iotaCompleter;\n    QCompleter *wwffCompleter;\n    MultiselectCompleter *potaCompleter;\n    QCompleter *sigCompleter;\n    QCompleter *countyCompleter;\n    QList<QCheckBox*> memberListCheckBoxes;\n    Ui::SettingsDialog *ui;\n    LogLocale locale;\n    bool sotaFallback;\n    bool potaFallback;\n    bool wwffFallback;\n    QString rigctldPath;\n    QString rigctldArgs;\n    QTimer *tqslVersionTimer;\n};\n\n#endif // QLOG_UI_SETTINGSDIALOG_H\n"
  },
  {
    "path": "ui/SettingsDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>SettingsDialog</class>\n <widget class=\"QDialog\" name=\"SettingsDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>800</width>\n    <height>836</height>\n   </rect>\n  </property>\n  <property name=\"minimumSize\">\n   <size>\n    <width>770</width>\n    <height>0</height>\n   </size>\n  </property>\n  <property name=\"maximumSize\">\n   <size>\n    <width>800</width>\n    <height>16777215</height>\n   </size>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Settings</string>\n  </property>\n  <property name=\"modal\">\n   <bool>true</bool>\n  </property>\n  <layout class=\"QGridLayout\" name=\"gridLayout\">\n   <item row=\"2\" column=\"0\">\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Save</set>\n     </property>\n    </widget>\n   </item>\n   <item row=\"0\" column=\"0\">\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <property name=\"documentMode\">\n      <bool>false</bool>\n     </property>\n     <widget class=\"QWidget\" name=\"stationTab\">\n      <attribute name=\"title\">\n       <string>Station</string>\n      </attribute>\n      <layout class=\"QGridLayout\" name=\"gridLayout_2\">\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QGroupBox\" name=\"stationProfileGroup\">\n         <property name=\"title\">\n          <string> Profiles</string>\n         </property>\n         <layout class=\"QGridLayout\" name=\"gridLayout_4\">\n          <property name=\"verticalSpacing\">\n           <number>2</number>\n          </property>\n          <item row=\"10\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationSOTALabel\">\n            <property name=\"text\">\n             <string>SOTA</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"12\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationIOTALabel\">\n            <property name=\"text\">\n             <string>IOTA</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"10\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationSOTAEdit\">\n            <property name=\"toolTip\">\n             <string>SOTA (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"11\" column=\"4\">\n           <widget class=\"QLineEdit\" name=\"stationSIGEdit\">\n            <property name=\"toolTip\">\n             <string>SIG (Optional parameter).</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"7\" column=\"2\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_31\">\n            <property name=\"spacing\">\n             <number>6</number>\n            </property>\n            <property name=\"bottomMargin\">\n             <number>0</number>\n            </property>\n            <item>\n             <widget class=\"QLabel\" name=\"stationITULabel\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>ITU</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLineEdit\" name=\"stationITUEdit\">\n              <property name=\"maximumSize\">\n               <size>\n                <width>40</width>\n                <height>16777215</height>\n               </size>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"stationCQZLabel\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>CQZ</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLineEdit\" name=\"stationCQZEdit\">\n              <property name=\"maximumSize\">\n               <size>\n                <width>40</width>\n                <height>16777215</height>\n               </size>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <spacer name=\"horizontalSpacer\">\n              <property name=\"orientation\">\n               <enum>Qt::Horizontal</enum>\n              </property>\n              <property name=\"sizeHint\" stdset=\"0\">\n               <size>\n                <width>5</width>\n                <height>5</height>\n               </size>\n              </property>\n             </spacer>\n            </item>\n           </layout>\n          </item>\n          <item row=\"6\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationCountyLabel\">\n            <property name=\"text\">\n             <string>County</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"12\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationIOTAEdit\">\n            <property name=\"toolTip\">\n             <string>IOTA  (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"8\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationQTHEdit\">\n            <property name=\"toolTip\">\n             <string>QTH Name (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"10\" column=\"4\">\n           <widget class=\"QLineEdit\" name=\"stationWWFFEdit\">\n            <property name=\"toolTip\">\n             <string>World Wide Flora &amp; Fauna (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"14\" column=\"1\">\n           <widget class=\"QLabel\" name=\"label_5\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"2\" colspan=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationOperatorEdit\">\n            <property name=\"toolTip\">\n             <string>Operator name (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"11\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationPOTALabel\">\n            <property name=\"text\">\n             <string>POTA</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"8\" column=\"4\">\n           <widget class=\"QLineEdit\" name=\"stationVUCCEdit\">\n            <property name=\"toolTip\">\n             <string>VUCC  Grids (Optional parameter). Ex. EN98,FM08,EM97,FM07</string>\n            </property>\n            <property name=\"inputMask\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"5\" column=\"1\">\n           <widget class=\"QLabel\" name=\"label_7\">\n            <property name=\"text\">\n             <string>Country</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"6\" column=\"2\" colspan=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationCountyEdit\">\n            <property name=\"toolTip\">\n             <string>Station County Location (Optional parameter)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"12\" column=\"3\">\n           <widget class=\"QLabel\" name=\"stationSIGInfoLabel\">\n            <property name=\"text\">\n             <string>SIG Info</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"1\">\n           <widget class=\"QLabel\" name=\"label_8\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"7\" column=\"4\">\n           <widget class=\"QLineEdit\" name=\"stationLocatorEdit\">\n            <property name=\"toolTip\">\n             <string>Station Gridsquare (Mandatory parameter)</string>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n            <property name=\"maxLength\">\n             <number>12</number>\n            </property>\n           </widget>\n          </item>\n          <item row=\"8\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationQTHLabel\">\n            <property name=\"text\">\n             <string>QTH</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"9\" column=\"1\">\n           <widget class=\"QLabel\" name=\"label_2\">\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationProfileNameLabel\">\n            <property name=\"text\">\n             <string>Profile Name</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"10\" column=\"3\">\n           <widget class=\"QLabel\" name=\"stationWWFFLabel\">\n            <property name=\"text\">\n             <string>WWFF</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"0\" rowspan=\"16\">\n           <widget class=\"QListView\" name=\"stationProfilesListView\">\n            <property name=\"focusPolicy\">\n             <enum>Qt::NoFocus</enum>\n            </property>\n            <property name=\"contextMenuPolicy\">\n             <enum>Qt::NoContextMenu</enum>\n            </property>\n            <property name=\"toolTip\">\n             <string>List of all available Station Profiles</string>\n            </property>\n            <property name=\"editTriggers\">\n             <set>QAbstractItemView::NoEditTriggers</set>\n            </property>\n           </widget>\n          </item>\n          <item row=\"12\" column=\"4\">\n           <widget class=\"QLineEdit\" name=\"stationSIGInfoEdit\">\n            <property name=\"toolTip\">\n             <string>SIG Information (Optional parameter)</string>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"2\" colspan=\"3\">\n           <widget class=\"QLineEdit\" name=\"stationProfileNameEdit\">\n            <property name=\"toolTip\">\n             <string>Profile name that is used as the alias for the Callsign, Gridsquare, Operator name, and QTH (required parameter) </string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"5\" column=\"2\" colspan=\"3\">\n           <widget class=\"QComboBox\" name=\"stationCountryCombo\"/>\n          </item>\n          <item row=\"11\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationPOTAEdit\"/>\n          </item>\n          <item row=\"1\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationCallsignEdit\">\n            <property name=\"toolTip\">\n             <string>Callsign (Mandatory parameter)</string>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n            <property name=\"maxLength\">\n             <number>25</number>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationOperatorCallsignEdit\">\n            <property name=\"toolTip\">\n             <string>Callsign of operator (Optional parameter, if different from station callsign)</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationOperatorLabel\">\n            <property name=\"text\">\n             <string>Operator Name</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"8\" column=\"3\">\n           <widget class=\"QLabel\" name=\"stationVUCCLabel\">\n            <property name=\"text\">\n             <string>VUCC</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationCallsignLabel\">\n            <property name=\"text\">\n             <string>Station Callsign</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"7\" column=\"3\">\n           <widget class=\"QLabel\" name=\"stationLocatorLabel\">\n            <property name=\"text\">\n             <string>Gridsquare</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"11\" column=\"3\">\n           <widget class=\"QLabel\" name=\"stationSIGLabel\">\n            <property name=\"text\">\n             <string>SIG</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"1\">\n           <widget class=\"QLabel\" name=\"label\">\n            <property name=\"text\">\n             <string>Operator Callsign</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"15\" column=\"1\" colspan=\"4\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_12\">\n            <item>\n             <widget class=\"QPushButton\" name=\"stationAddProfileButton\">\n              <property name=\"text\">\n               <string>Add</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QPushButton\" name=\"stationDelProfileButton\">\n              <property name=\"text\">\n               <string>Delete</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item row=\"13\" column=\"1\">\n           <widget class=\"QLabel\" name=\"stationDarcDokLabel\">\n            <property name=\"text\">\n             <string>DOK</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"13\" column=\"2\">\n           <widget class=\"QLineEdit\" name=\"stationDarcDokEdit\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item row=\"1\" column=\"0\">\n        <spacer name=\"verticalSpacer_4\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"equipmentTab\">\n      <attribute name=\"title\">\n       <string>Equipment</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_7\">\n       <item>\n        <widget class=\"QTabWidget\" name=\"equipmentTabWidget\">\n         <property name=\"currentIndex\">\n          <number>0</number>\n         </property>\n         <property name=\"documentMode\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"antennasTab\">\n          <attribute name=\"title\">\n           <string>Antennas</string>\n          </attribute>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_10\">\n           <item>\n            <widget class=\"QGroupBox\" name=\"antennasProfileGroup\">\n             <property name=\"title\">\n              <string>Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_7\">\n              <item row=\"0\" column=\"4\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"antProfileGroup\">\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>400</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_17\">\n                 <item row=\"0\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"antProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"0\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"antProfileNameEdit\">\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"antDescLabel\">\n                   <property name=\"text\">\n                    <string>Description</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <widget class=\"QTextEdit\" name=\"antDescEdit\">\n                   <property name=\"acceptRichText\">\n                    <bool>false</bool>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"antAzBeamWidthLabel\">\n                   <property name=\"text\">\n                    <string>Azimuth Beamwidth </string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"antAzOffsetLabel\">\n                   <property name=\"text\">\n                    <string>Azimuth Offset</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <widget class=\"BaseDoubleSpinBox\" name=\"antAzBeamWidthSpinBox\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"toolTip\">\n                    <string>Valid range value is 0° - 100° (0° Unspecified)</string>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Unspecified</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"decimals\">\n                    <number>1</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <double>100.000000000000000</double>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"1\">\n                  <widget class=\"BaseDoubleSpinBox\" name=\"antAzOffsetSpinBox\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"decimals\">\n                    <number>1</number>\n                   </property>\n                   <property name=\"minimum\">\n                    <double>-180.000000000000000</double>\n                   </property>\n                   <property name=\"maximum\">\n                    <double>180.000000000000000</double>\n                   </property>\n                  </widget>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"4\">\n               <widget class=\"QPushButton\" name=\"antAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"5\">\n               <widget class=\"QPushButton\" name=\"antDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"0\" rowspan=\"2\" colspan=\"4\">\n               <widget class=\"QListView\" name=\"antProfilesListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available Antennas</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"verticalSpacer_6\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>0</width>\n               <height>0</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"cwTab\">\n          <attribute name=\"title\">\n           <string>CW Keyers</string>\n          </attribute>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_8\">\n           <item>\n            <widget class=\"QGroupBox\" name=\"cwProfileGroup\">\n             <property name=\"title\">\n              <string>Keyer Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_8\">\n              <item row=\"0\" column=\"1\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"cwProfileGroup_2\">\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>400</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <property name=\"flat\">\n                 <bool>false</bool>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_21\">\n                 <property name=\"verticalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <item row=\"0\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"cwProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"0\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwProfileNameEdit\">\n                   <property name=\"toolTip\">\n                    <string/>\n                   </property>\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"cwModelLabel\">\n                   <property name=\"text\">\n                    <string>Model</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <widget class=\"QComboBox\" name=\"cwModelSelect\"/>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"cwKeyModeLabel\">\n                   <property name=\"text\">\n                    <string>Keyer Mode</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_37\">\n                   <property name=\"spacing\">\n                    <number>12</number>\n                   </property>\n                   <item>\n                    <widget class=\"QComboBox\" name=\"cwKeyModeSelect\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"cwSwapPaddlesCheckbox\">\n                     <property name=\"text\">\n                      <string>Swap Paddles</string>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"3\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_43\">\n                   <property name=\"spacing\">\n                    <number>12</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"cwPaddleOnlySidetoneCheckbox\">\n                     <property name=\"text\">\n                      <string>Paddle Only Sidetone</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwSidetoneFreqLabel\">\n                     <property name=\"text\">\n                      <string>Sidetone Freq:</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QComboBox\" name=\"cwSidetoneFreqCombo\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"4\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"cwDefaultSpeedLabel\">\n                   <property name=\"text\">\n                    <string>Default Speed</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"4\" column=\"1\">\n                  <widget class=\"QSpinBox\" name=\"cwDefaulSpeed\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>N/A</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string> WPM</string>\n                   </property>\n                   <property name=\"minimum\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <number>999</number>\n                   </property>\n                   <property name=\"value\">\n                    <number>20</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"5\" column=\"0\" colspan=\"2\">\n                  <widget class=\"QStackedWidget\" name=\"cwStackedWidget\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"frameShape\">\n                    <enum>QFrame::NoFrame</enum>\n                   </property>\n                   <property name=\"currentIndex\">\n                    <number>0</number>\n                   </property>\n                   <widget class=\"QWidget\" name=\"cwSerialPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_22\">\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"cwPortLabel\">\n                       <property name=\"text\">\n                        <string>Port</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <widget class=\"SerialPortEditLine\" name=\"cwPortEdit\">\n                       <property name=\"toolTip\">\n                        <string>Use COMxx for Window or path to COM port under Unix-like OS</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"1\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"cwBaudLabel\">\n                       <property name=\"text\">\n                        <string>Baudrate</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"1\" column=\"1\">\n                      <widget class=\"QComboBox\" name=\"cwBaudSelect\">\n                       <item>\n                        <property name=\"text\">\n                         <string>115200</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>57600</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>38400</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>19200</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>9600</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>4800</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>2400</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>1200</string>\n                        </property>\n                       </item>\n                      </widget>\n                     </item>\n                    </layout>\n                   </widget>\n                   <widget class=\"QWidget\" name=\"cwNetworkPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_23\">\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"cwHostNameLabel\">\n                       <property name=\"text\">\n                        <string>Host Name</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <widget class=\"QLineEdit\" name=\"cwHostNameEdit\"/>\n                     </item>\n                     <item row=\"1\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"cwNetPortLabel\">\n                       <property name=\"text\">\n                        <string>Port</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"1\" column=\"1\">\n                      <widget class=\"QSpinBox\" name=\"cwNetPortSpin\">\n                       <property name=\"toolTip\">\n                        <string>HamLib does not support to change a destination port.</string>\n                       </property>\n                       <property name=\"minimum\">\n                        <number>1024</number>\n                       </property>\n                       <property name=\"maximum\">\n                        <number>65535</number>\n                       </property>\n                       <property name=\"value\">\n                        <number>6789</number>\n                       </property>\n                      </widget>\n                     </item>\n                    </layout>\n                   </widget>\n                  </widget>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QPushButton\" name=\"cwAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"0\" rowspan=\"2\">\n               <widget class=\"QListView\" name=\"cwProfilesListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available CW Keyers</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"2\">\n               <widget class=\"QPushButton\" name=\"cwDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QGroupBox\" name=\"cwShortcutProfileGroup\">\n             <property name=\"title\">\n              <string>CW Shortcut Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_9\">\n              <item row=\"1\" column=\"2\">\n               <widget class=\"QPushButton\" name=\"cwShortcutDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QPushButton\" name=\"cwShortcutAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"cwShortcutGroup\">\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>400</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_24\">\n                 <property name=\"verticalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <item row=\"0\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"cwShortcutProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"0\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutProfileNameEdit\">\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_13\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF1Label\">\n                     <property name=\"text\">\n                      <string>F1</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF1ShortEdit\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"minimumSize\">\n                      <size>\n                       <width>0</width>\n                       <height>0</height>\n                      </size>\n                     </property>\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"text\">\n                      <string/>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>7</number>\n                     </property>\n                     <property name=\"frame\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF1MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                   <property name=\"inputMask\">\n                    <string/>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF2Label\">\n                     <property name=\"text\">\n                      <string>F2</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF2ShortEdit\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF2MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF3MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"4\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF4MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"5\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF5MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"6\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF6MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"7\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"cwShortcutF7MacroEdit\">\n                   <property name=\"toolTip\">\n                    <string>&lt;DXCALL&gt; = DX Callsign\n&lt;NAME&gt; = DX Operator Name\n&lt;RST&gt; = Report 599\n&lt;RSTN&gt; = Report 5NN\n&lt;GREETING&gt; = Greenting GM/GA/GE\n&lt;QTH&gt; = QTH\n&lt;MYCALL&gt; = My Callsign\n&lt;MYNAME&gt; = My Name\n&lt;MYQTH&gt; = My QTH\n&lt;MYLOCATOR&gt; = My Gridsquare\n&lt;MYGRID&gt; = My Gridsquare\n&lt;MYSIG&gt; = My SIG\n&lt;MYSIGINFO&gt; = My SIG Information\n&lt;MYIOTA&gt; = My IOTA\n&lt;MYSOTA&gt; = MY SOTA\n&lt;MYWWFT&gt; = My WWFT\n&lt;MYVUCC&gt; = MY VUCC\n&lt;MYPWR&gt; = My Power in W\n&lt;EXCHSTR&gt; = Contest Exchange Message\n&lt;EXCHNR&gt; = Contest Exchange Serial Number\n&lt;EXCHNRN&gt; = Contest Exchange Serial Number (9→N, 0→T)\n&lt;+&gt; = Speed +5 WPM (&lt;++&gt; = +10 WPM, etc.)\n&lt;-&gt; = Speed -5 WPM (&lt;--&gt; = -10 WPM, etc.)\n</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_19\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF3Label\">\n                     <property name=\"text\">\n                      <string>F3</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF3ShortEdit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"4\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_20\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF4Label\">\n                     <property name=\"text\">\n                      <string>F4</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF4ShortEdit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"5\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_21\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF5Label\">\n                     <property name=\"text\">\n                      <string>F5</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF5ShortEdit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"6\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_22\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF6Label\">\n                     <property name=\"text\">\n                      <string>F6</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF6ShortEdit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"7\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_23\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"cwShortcutF7Label\">\n                     <property name=\"text\">\n                      <string>F7</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"cwShortcutF7ShortEdit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"0\" rowspan=\"2\">\n               <widget class=\"QListView\" name=\"cwShortcutListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available CW Shortcuts Profiles</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"rigsTab\">\n          <attribute name=\"title\">\n           <string>Rigs</string>\n          </attribute>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_9\">\n           <property name=\"spacing\">\n            <number>4</number>\n           </property>\n           <property name=\"leftMargin\">\n            <number>4</number>\n           </property>\n           <property name=\"topMargin\">\n            <number>4</number>\n           </property>\n           <property name=\"rightMargin\">\n            <number>4</number>\n           </property>\n           <property name=\"bottomMargin\">\n            <number>4</number>\n           </property>\n           <item>\n            <widget class=\"QGroupBox\" name=\"rigsProfileGroup_2\">\n             <property name=\"title\">\n              <string>Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_3\">\n              <property name=\"leftMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"topMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"rightMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"bottomMargin\">\n               <number>4</number>\n              </property>\n              <property name=\"spacing\">\n               <number>4</number>\n              </property>\n              <item row=\"1\" column=\"2\">\n               <widget class=\"QPushButton\" name=\"rigDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QPushButton\" name=\"rigAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"rigProfileGroup\">\n                <property name=\"sizePolicy\">\n                 <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n                  <horstretch>0</horstretch>\n                  <verstretch>0</verstretch>\n                 </sizepolicy>\n                </property>\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>410</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <property name=\"flat\">\n                 <bool>false</bool>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_7\">\n                 <property name=\"horizontalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <property name=\"verticalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <property name=\"leftMargin\">\n                  <number>4</number>\n                 </property>\n                 <property name=\"topMargin\">\n                  <number>4</number>\n                 </property>\n                 <property name=\"rightMargin\">\n                  <number>4</number>\n                 </property>\n                 <property name=\"bottomMargin\">\n                  <number>4</number>\n                 </property>\n                 <item row=\"0\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"0\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"rigProfileNameEdit\">\n                   <property name=\"toolTip\">\n                    <string/>\n                   </property>\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigInterfaceLabel\">\n                   <property name=\"text\">\n                    <string>Interface</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n                   <item>\n                    <widget class=\"QComboBox\" name=\"rigInterfaceCombo\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QComboBox\" name=\"rigModelSelect\"/>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"txRangeLabel\">\n                   <property name=\"toolTip\">\n                    <string>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</string>\n                   </property>\n                   <property name=\"text\">\n                    <string>TX Range</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n                   <item>\n                    <widget class=\"BaseDoubleSpinBox\" name=\"rigTXFreqMinSpinBox\">\n                     <property name=\"toolTip\">\n                      <string>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</string>\n                     </property>\n                     <property name=\"suffix\">\n                      <string> MHz</string>\n                     </property>\n                     <property name=\"maximum\">\n                      <double>250000.000000000000000</double>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rigTXFreqSepLabel\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Preferred\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"text\">\n                      <string>-</string>\n                     </property>\n                     <property name=\"alignment\">\n                      <set>Qt::AlignCenter</set>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"BaseDoubleSpinBox\" name=\"rigTXFreqMaxSpinBox\">\n                     <property name=\"toolTip\">\n                      <string>Minimum and maximum TX frequencies. Specific ranges are derived from allowed Band in the Setting.</string>\n                     </property>\n                     <property name=\"suffix\">\n                      <string> MHz</string>\n                     </property>\n                     <property name=\"maximum\">\n                      <double>250000.000000000000000</double>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"3\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigOffsetsLabel\">\n                   <property name=\"text\">\n                    <string>Offsets</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n                   <item>\n                    <widget class=\"BaseDoubleSpinBox\" name=\"rigRXOffsetSpinBox\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Enter manually RIT or Transverter Offset</string>\n                     </property>\n                     <property name=\"prefix\">\n                      <string>RX: </string>\n                     </property>\n                     <property name=\"suffix\">\n                      <string> MHz</string>\n                     </property>\n                     <property name=\"decimals\">\n                      <number>5</number>\n                     </property>\n                     <property name=\"minimum\">\n                      <double>-9999999.999989999458194</double>\n                     </property>\n                     <property name=\"maximum\">\n                      <double>9999999.999989999458194</double>\n                     </property>\n                     <property name=\"value\">\n                      <double>0.000000000000000</double>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <spacer name=\"horizontalSpacer_10\">\n                     <property name=\"orientation\">\n                      <enum>Qt::Horizontal</enum>\n                     </property>\n                     <property name=\"sizeType\">\n                      <enum>QSizePolicy::Expanding</enum>\n                     </property>\n                     <property name=\"sizeHint\" stdset=\"0\">\n                      <size>\n                       <width>40</width>\n                       <height>20</height>\n                      </size>\n                     </property>\n                    </spacer>\n                   </item>\n                   <item>\n                    <widget class=\"BaseDoubleSpinBox\" name=\"rigTXOffsetSpinBox\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Enter manually XIT or Transverter offset</string>\n                     </property>\n                     <property name=\"prefix\">\n                      <string>TX: </string>\n                     </property>\n                     <property name=\"suffix\">\n                      <string> MHz</string>\n                     </property>\n                     <property name=\"decimals\">\n                      <number>5</number>\n                     </property>\n                     <property name=\"minimum\">\n                      <double>-9999999.999989999458194</double>\n                     </property>\n                     <property name=\"maximum\">\n                      <double>9999999.999989999458194</double>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"4\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigPWRDefaultLabel\">\n                   <property name=\"text\">\n                    <string>Default PWR</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"4\" column=\"1\">\n                  <widget class=\"BaseDoubleSpinBox\" name=\"rigPWRDefaultSpinBox\">\n                   <property name=\"toolTip\">\n                    <string>Enter default PWR (ex. when Rig is disconnected)</string>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Blank</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string> W</string>\n                   </property>\n                   <property name=\"decimals\">\n                    <number>3</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <double>1000000.000000000000000</double>\n                   </property>\n                   <property name=\"value\">\n                    <double>100.000000000000000</double>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"5\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigAssignedCWKeyLabel\">\n                   <property name=\"text\">\n                    <string>Assigned CW Keyer</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"5\" column=\"1\">\n                  <widget class=\"QComboBox\" name=\"rigAssignedCWKeyCombo\"/>\n                 </item>\n                 <item row=\"6\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigFeaturesLabel\">\n                   <property name=\"text\">\n                    <string>Rig Features</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"6\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n                   <property name=\"topMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetModeCheckBox\">\n                     <property name=\"text\">\n                      <string>Mode</string>\n                     </property>\n                     <property name=\"checked\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetVFOCheckBox\">\n                     <property name=\"text\">\n                      <string>VFO</string>\n                     </property>\n                     <property name=\"checked\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetFreqCheckBox\">\n                     <property name=\"text\">\n                      <string>Freq</string>\n                     </property>\n                     <property name=\"checked\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"7\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n                   <property name=\"topMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigQSYWipingCheckBox\">\n                     <property name=\"text\">\n                      <string>QSY Wiping</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetPWRCheckBox\">\n                     <property name=\"text\">\n                      <string>Power</string>\n                     </property>\n                     <property name=\"checked\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetPTTStateCheckBox\">\n                     <property name=\"text\">\n                      <string>PTT State</string>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"8\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"dummyLabel\">\n                   <property name=\"text\">\n                    <string/>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"8\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetXITCheckBox\">\n                     <property name=\"text\">\n                      <string>TX Offset (XIT)</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetRITCheckBox\">\n                     <property name=\"text\">\n                      <string>RX Offset (RIT)</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetSplitCheckBox\">\n                     <property name=\"text\">\n                      <string>Split</string>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"9\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigGetKeySpeedCheckBox\">\n                     <property name=\"text\">\n                      <string>CW Keyer Speed</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigKeySpeedSyncCheckBox\">\n                     <property name=\"text\">\n                      <string>CW Speed Sync</string>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"10\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigDXSpots2RigCheckBox\">\n                     <property name=\"text\">\n                      <string>DX Spots to Rig</string>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"11\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_39\">\n                   <property name=\"topMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QCheckBox\" name=\"rigShareCheckBox\">\n                     <property name=\"toolTip\">\n                      <string>Start rigctld daemon to share rig with other applications (e.g. WSJT-X)</string>\n                     </property>\n                     <property name=\"text\">\n                      <string>Share Rig via port</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QSpinBox\" name=\"rigSharePortSpinBox\">\n                     <property name=\"minimum\">\n                      <number>1024</number>\n                     </property>\n                     <property name=\"maximum\">\n                      <number>65535</number>\n                     </property>\n                     <property name=\"value\">\n                      <number>4532</number>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QPushButton\" name=\"rigShareAdvancedButton\">\n                     <property name=\"text\">\n                      <string>Advanced...</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <spacer name=\"horizontalSpacer_9\">\n                     <property name=\"orientation\">\n                      <enum>Qt::Horizontal</enum>\n                     </property>\n                     <property name=\"sizeHint\" stdset=\"0\">\n                      <size>\n                       <width>40</width>\n                       <height>20</height>\n                      </size>\n                     </property>\n                    </spacer>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"12\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rigPortTypeLabel\">\n                   <property name=\"text\">\n                    <string>Port Type</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"12\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_40\">\n                   <item>\n                    <widget class=\"QComboBox\" name=\"rigPortTypeCombo\"/>\n                   </item>\n                   <item>\n                    <spacer name=\"horizontalSpacer_81\">\n                     <property name=\"orientation\">\n                      <enum>Qt::Horizontal</enum>\n                     </property>\n                     <property name=\"sizeHint\" stdset=\"0\">\n                      <size>\n                       <width>40</width>\n                       <height>20</height>\n                      </size>\n                     </property>\n                    </spacer>\n                   </item>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rigPollIntervalLabel\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"text\">\n                      <string>Poll Interval</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QSpinBox\" name=\"rigPollIntervalSpinBox\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"suffix\">\n                      <string> ms</string>\n                     </property>\n                     <property name=\"minimum\">\n                      <number>100</number>\n                     </property>\n                     <property name=\"maximum\">\n                      <number>60000</number>\n                     </property>\n                     <property name=\"value\">\n                      <number>500</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"13\" column=\"0\" colspan=\"2\">\n                  <widget class=\"QStackedWidget\" name=\"rigStackedWidget\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Maximum\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"frameShape\">\n                    <enum>QFrame::NoFrame</enum>\n                   </property>\n                   <property name=\"currentIndex\">\n                    <number>0</number>\n                   </property>\n                   <widget class=\"QWidget\" name=\"rigSerialPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_9\">\n                     <property name=\"formAlignment\">\n                      <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>\n                     </property>\n                     <property name=\"horizontalSpacing\">\n                      <number>6</number>\n                     </property>\n                     <property name=\"verticalSpacing\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigPortLabel\">\n                       <property name=\"text\">\n                        <string>Rig Port</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <widget class=\"SerialPortEditLine\" name=\"rigPortEdit\">\n                       <property name=\"sizePolicy\">\n                        <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                         <horstretch>0</horstretch>\n                         <verstretch>0</verstretch>\n                        </sizepolicy>\n                       </property>\n                       <property name=\"toolTip\">\n                        <string>Use COMxx for Window or path to COM port under Unix-like OS</string>\n                       </property>\n                       <property name=\"text\">\n                        <string/>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"2\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigBaudLabel\">\n                       <property name=\"sizePolicy\">\n                        <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n                         <horstretch>0</horstretch>\n                         <verstretch>0</verstretch>\n                        </sizepolicy>\n                       </property>\n                       <property name=\"text\">\n                        <string>Baudrate</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"2\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_26\">\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigBaudSelect\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <property name=\"focusPolicy\">\n                          <enum>Qt::StrongFocus</enum>\n                         </property>\n                         <item>\n                          <property name=\"text\">\n                           <string notr=\"true\">115200</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>57600</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>38400</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>19200</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>9600</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>4800</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>2400</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string notr=\"true\">1200</string>\n                          </property>\n                         </item>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigCIVAddrLabel\">\n                         <property name=\"text\">\n                          <string>CIV Addr</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                         <property name=\"margin\">\n                          <number>2</number>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QSpinBox\" name=\"rigCIVAddrSpinBox\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <property name=\"specialValueText\">\n                          <string>Auto</string>\n                         </property>\n                         <property name=\"prefix\">\n                          <string notr=\"true\">0x</string>\n                         </property>\n                         <property name=\"minimum\">\n                          <number>-1</number>\n                         </property>\n                         <property name=\"maximum\">\n                          <number>255</number>\n                         </property>\n                         <property name=\"displayIntegerBase\">\n                          <number>16</number>\n                         </property>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                     <item row=\"5\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigFlowControlLabel\">\n                       <property name=\"sizePolicy\">\n                        <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Preferred\">\n                         <horstretch>0</horstretch>\n                         <verstretch>0</verstretch>\n                        </sizepolicy>\n                       </property>\n                       <property name=\"minimumSize\">\n                        <size>\n                         <width>0</width>\n                         <height>0</height>\n                        </size>\n                       </property>\n                       <property name=\"text\">\n                        <string>Flow Control</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"5\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_17\">\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigFlowControlSelect\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigParityLabel\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <property name=\"text\">\n                          <string>Parity</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                         <property name=\"indent\">\n                          <number>2</number>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigParitySelect\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                     <item row=\"7\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigPTTTypeLabel\">\n                       <property name=\"text\">\n                        <string>PTT Type</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"7\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_32\">\n                       <property name=\"spacing\">\n                        <number>6</number>\n                       </property>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigPTTTypeCombo\"/>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigPTTPortLabel\">\n                         <property name=\"text\">\n                          <string>PTT Port</string>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"SerialPortEditLine\" name=\"rigPTTPortEdit\"/>\n                       </item>\n                      </layout>\n                     </item>\n                     <item row=\"6\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_381\">\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigDTRCombo\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigRTSLabel\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <property name=\"text\">\n                          <string>RTS</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                         <property name=\"indent\">\n                          <number>2</number>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigRTSCombo\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                     <item row=\"6\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigDTRLabel\">\n                       <property name=\"sizePolicy\">\n                        <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n                         <horstretch>0</horstretch>\n                         <verstretch>0</verstretch>\n                        </sizepolicy>\n                       </property>\n                       <property name=\"text\">\n                        <string>DTR</string>\n                       </property>\n                       <property name=\"alignment\">\n                        <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"3\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigDataBitsLabel\">\n                       <property name=\"text\">\n                        <string>Data Bits</string>\n                       </property>\n                       <property name=\"alignment\">\n                        <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"3\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_41\">\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigDataBitsSelect\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <item>\n                          <property name=\"text\">\n                           <string>8</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>7</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>6</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>5</string>\n                          </property>\n                         </item>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigStopBitsLabel\">\n                         <property name=\"text\">\n                          <string>Stop Bits</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                         <property name=\"margin\">\n                          <number>2</number>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rigStopBitsSelect\">\n                         <property name=\"sizePolicy\">\n                          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                           <horstretch>0</horstretch>\n                           <verstretch>0</verstretch>\n                          </sizepolicy>\n                         </property>\n                         <item>\n                          <property name=\"text\">\n                           <string>1</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>2</string>\n                          </property>\n                         </item>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                    </layout>\n                   </widget>\n                   <widget class=\"QWidget\" name=\"rigNetworkPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_8\">\n                     <property name=\"horizontalSpacing\">\n                      <number>6</number>\n                     </property>\n                     <property name=\"verticalSpacing\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rigHostNameLabel\">\n                       <property name=\"text\">\n                        <string>Host Name</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_27\">\n                       <property name=\"spacing\">\n                        <number>10</number>\n                       </property>\n                       <item>\n                        <widget class=\"QLineEdit\" name=\"rigHostNameEdit\"/>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rigNetPortLabel\">\n                         <property name=\"text\">\n                          <string>Port</string>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QSpinBox\" name=\"rigNetPortSpin\">\n                         <property name=\"toolTip\">\n                          <string/>\n                         </property>\n                         <property name=\"minimum\">\n                          <number>1</number>\n                         </property>\n                         <property name=\"maximum\">\n                          <number>65535</number>\n                         </property>\n                         <property name=\"value\">\n                          <number>4532</number>\n                         </property>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                    </layout>\n                   </widget>\n                   <widget class=\"QWidget\" name=\"rigSpecialOmni\"/>\n                  </widget>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"0\" rowspan=\"2\">\n               <widget class=\"QListView\" name=\"rigProfilesListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available Rigs</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"rotsTab\">\n          <attribute name=\"title\">\n           <string>Rotators</string>\n          </attribute>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_11\">\n           <item>\n            <widget class=\"QGroupBox\" name=\"rotsProfileGroup_2\">\n             <property name=\"title\">\n              <string>Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_5\">\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QPushButton\" name=\"rotAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"2\">\n               <widget class=\"QPushButton\" name=\"rotDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"0\" rowspan=\"2\">\n               <widget class=\"QListView\" name=\"rotProfilesListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available Rigs</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"rotProfileGroup\">\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>400</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_18\">\n                 <property name=\"verticalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <item row=\"1\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rotProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"rotProfileNameEdit\">\n                   <property name=\"toolTip\">\n                    <string/>\n                   </property>\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rotInterfaceLabel\">\n                   <property name=\"text\">\n                    <string>Interface</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_42\">\n                   <item>\n                    <widget class=\"QComboBox\" name=\"rotInterfaceCombo\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"sizeAdjustPolicy\">\n                      <enum>QComboBox::AdjustToContentsOnFirstShow</enum>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QComboBox\" name=\"rotModelSelect\"/>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"4\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rotPortTypeLabel\">\n                   <property name=\"text\">\n                    <string>Port Type</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"4\" column=\"1\">\n                  <widget class=\"QComboBox\" name=\"rotPortTypeCombo\">\n                   <item>\n                    <property name=\"text\">\n                     <string>Serial</string>\n                    </property>\n                   </item>\n                   <item>\n                    <property name=\"text\">\n                     <string>Network</string>\n                    </property>\n                   </item>\n                  </widget>\n                 </item>\n                 <item row=\"5\" column=\"0\" colspan=\"2\">\n                  <widget class=\"QStackedWidget\" name=\"rotStackedWidget\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Expanding\" vsizetype=\"Expanding\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"frameShape\">\n                    <enum>QFrame::NoFrame</enum>\n                   </property>\n                   <property name=\"currentIndex\">\n                    <number>0</number>\n                   </property>\n                   <widget class=\"QWidget\" name=\"rotSerialPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_19\">\n                     <property name=\"verticalSpacing\">\n                      <number>4</number>\n                     </property>\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rotPortLabel\">\n                       <property name=\"text\">\n                        <string>Port</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <widget class=\"SerialPortEditLine\" name=\"rotPortEdit\">\n                       <property name=\"toolTip\">\n                        <string>Use COMxx for Window or path to COM port under Unix-like OS</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"1\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rotBaudLabel\">\n                       <property name=\"text\">\n                        <string>Baudrate</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"1\" column=\"1\">\n                      <widget class=\"QComboBox\" name=\"rotBaudSelect\">\n                       <item>\n                        <property name=\"text\">\n                         <string>115200</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>57600</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>38400</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>19200</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>9600</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>4800</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>2400</string>\n                        </property>\n                       </item>\n                       <item>\n                        <property name=\"text\">\n                         <string>1200</string>\n                        </property>\n                       </item>\n                      </widget>\n                     </item>\n                     <item row=\"2\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rotDataBitsLabel\">\n                       <property name=\"text\">\n                        <string>Data Bits</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"4\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rotFlowControlLabel\">\n                       <property name=\"text\">\n                        <string>Flow Control</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"2\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_29\">\n                       <property name=\"spacing\">\n                        <number>6</number>\n                       </property>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rotDataBitsSelect\">\n                         <item>\n                          <property name=\"text\">\n                           <string>8</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>7</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>6</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>5</string>\n                          </property>\n                         </item>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rotStopBitsLabel\">\n                         <property name=\"text\">\n                          <string>Stop Bits</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rotStopBitsSelect\">\n                         <item>\n                          <property name=\"text\">\n                           <string>1</string>\n                          </property>\n                         </item>\n                         <item>\n                          <property name=\"text\">\n                           <string>2</string>\n                          </property>\n                         </item>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                     <item row=\"4\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_30\">\n                       <property name=\"spacing\">\n                        <number>6</number>\n                       </property>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rotFlowControlSelect\"/>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rotParityLabel\">\n                         <property name=\"text\">\n                          <string>Parity</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QComboBox\" name=\"rotParitySelect\"/>\n                       </item>\n                      </layout>\n                     </item>\n                    </layout>\n                   </widget>\n                   <widget class=\"QWidget\" name=\"rotNetworkPage\">\n                    <layout class=\"QFormLayout\" name=\"formLayout_20\">\n                     <property name=\"verticalSpacing\">\n                      <number>2</number>\n                     </property>\n                     <property name=\"leftMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"topMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"rightMargin\">\n                      <number>0</number>\n                     </property>\n                     <property name=\"bottomMargin\">\n                      <number>0</number>\n                     </property>\n                     <item row=\"0\" column=\"0\">\n                      <widget class=\"QLabel\" name=\"rotHostNameLabel\">\n                       <property name=\"text\">\n                        <string>Host Name</string>\n                       </property>\n                      </widget>\n                     </item>\n                     <item row=\"0\" column=\"1\">\n                      <layout class=\"QHBoxLayout\" name=\"horizontalLayout_28\">\n                       <property name=\"spacing\">\n                        <number>8</number>\n                       </property>\n                       <item>\n                        <widget class=\"QLineEdit\" name=\"rotHostNameEdit\"/>\n                       </item>\n                       <item>\n                        <widget class=\"QLabel\" name=\"rotNetPortLabel\">\n                         <property name=\"text\">\n                          <string>Port</string>\n                         </property>\n                         <property name=\"alignment\">\n                          <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n                         </property>\n                        </widget>\n                       </item>\n                       <item>\n                        <widget class=\"QSpinBox\" name=\"rotNetPortSpin\">\n                         <property name=\"toolTip\">\n                          <string/>\n                         </property>\n                         <property name=\"minimum\">\n                          <number>1</number>\n                         </property>\n                         <property name=\"maximum\">\n                          <number>65535</number>\n                         </property>\n                         <property name=\"value\">\n                          <number>4533</number>\n                         </property>\n                        </widget>\n                       </item>\n                      </layout>\n                     </item>\n                    </layout>\n                   </widget>\n                  </widget>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QGroupBox\" name=\"groupBox_2\">\n             <property name=\"title\">\n              <string>User Buttons Profiles</string>\n             </property>\n             <layout class=\"QGridLayout\" name=\"gridLayout_10\">\n              <item row=\"0\" column=\"0\" rowspan=\"2\">\n               <widget class=\"QListView\" name=\"rotUsrButtonListView\">\n                <property name=\"focusPolicy\">\n                 <enum>Qt::NoFocus</enum>\n                </property>\n                <property name=\"contextMenuPolicy\">\n                 <enum>Qt::NoContextMenu</enum>\n                </property>\n                <property name=\"toolTip\">\n                 <string>List of all available CW Shortcuts Profiles</string>\n                </property>\n                <property name=\"editTriggers\">\n                 <set>QAbstractItemView::NoEditTriggers</set>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"1\">\n               <widget class=\"QPushButton\" name=\"rotUsrButtonAddProfileButton\">\n                <property name=\"text\">\n                 <string>Add</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"1\" column=\"2\">\n               <widget class=\"QPushButton\" name=\"rotUsrButtonDelProfileButton\">\n                <property name=\"text\">\n                 <string>Delete</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\" colspan=\"2\">\n               <widget class=\"QGroupBox\" name=\"rotUsrButtonGroup\">\n                <property name=\"minimumSize\">\n                 <size>\n                  <width>400</width>\n                  <height>0</height>\n                 </size>\n                </property>\n                <property name=\"title\">\n                 <string/>\n                </property>\n                <layout class=\"QFormLayout\" name=\"formLayout_25\">\n                 <property name=\"verticalSpacing\">\n                  <number>2</number>\n                 </property>\n                 <item row=\"0\" column=\"0\">\n                  <widget class=\"QLabel\" name=\"rotUsrButtonProfileNameLabel\">\n                   <property name=\"text\">\n                    <string>Profile Name</string>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"0\" column=\"1\">\n                  <widget class=\"QLineEdit\" name=\"rotUsrButtonProfileNameEdit\">\n                   <property name=\"maxLength\">\n                    <number>25</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"1\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_15\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rotUsrButton1Label\">\n                     <property name=\"text\">\n                      <string>Button 1</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"rotUsrButton1Edit\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"minimumSize\">\n                      <size>\n                       <width>0</width>\n                       <height>0</height>\n                      </size>\n                     </property>\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"text\">\n                      <string/>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>7</number>\n                     </property>\n                     <property name=\"frame\">\n                      <bool>true</bool>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"2\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_16\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rotUsrButton2Label\">\n                     <property name=\"text\">\n                      <string>Button 2</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"rotUsrButton2Edit\">\n                     <property name=\"sizePolicy\">\n                      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                       <horstretch>0</horstretch>\n                       <verstretch>0</verstretch>\n                      </sizepolicy>\n                     </property>\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"3\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_24\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rotUsrButton3Label\">\n                     <property name=\"text\">\n                      <string>Button 3</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"rotUsrButton3Edit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"4\" column=\"0\">\n                  <layout class=\"QHBoxLayout\" name=\"horizontalLayout_25\">\n                   <property name=\"rightMargin\">\n                    <number>0</number>\n                   </property>\n                   <property name=\"bottomMargin\">\n                    <number>0</number>\n                   </property>\n                   <item>\n                    <widget class=\"QLabel\" name=\"rotUsrButton4Label\">\n                     <property name=\"text\">\n                      <string>Button 4</string>\n                     </property>\n                    </widget>\n                   </item>\n                   <item>\n                    <widget class=\"QLineEdit\" name=\"rotUsrButton4Edit\">\n                     <property name=\"maximumSize\">\n                      <size>\n                       <width>60</width>\n                       <height>16777215</height>\n                      </size>\n                     </property>\n                     <property name=\"toolTip\">\n                      <string>Short Desciption of the Button (up to 7 chars)</string>\n                     </property>\n                     <property name=\"maxLength\">\n                      <number>5</number>\n                     </property>\n                    </widget>\n                   </item>\n                  </layout>\n                 </item>\n                 <item row=\"1\" column=\"1\">\n                  <widget class=\"QSpinBox\" name=\"rotUsrButtonSpinBox1\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Blank</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"minimum\">\n                    <number>-1</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <number>359</number>\n                   </property>\n                   <property name=\"value\">\n                    <number>-1</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"2\" column=\"1\">\n                  <widget class=\"QSpinBox\" name=\"rotUsrButtonSpinBox2\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Blank</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"minimum\">\n                    <number>-1</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <number>359</number>\n                   </property>\n                   <property name=\"value\">\n                    <number>-1</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"3\" column=\"1\">\n                  <widget class=\"QSpinBox\" name=\"rotUsrButtonSpinBox3\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Blank</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"minimum\">\n                    <number>-1</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <number>359</number>\n                   </property>\n                   <property name=\"value\">\n                    <number>-1</number>\n                   </property>\n                  </widget>\n                 </item>\n                 <item row=\"4\" column=\"1\">\n                  <widget class=\"QSpinBox\" name=\"rotUsrButtonSpinBox4\">\n                   <property name=\"sizePolicy\">\n                    <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                     <horstretch>0</horstretch>\n                     <verstretch>0</verstretch>\n                    </sizepolicy>\n                   </property>\n                   <property name=\"specialValueText\">\n                    <string>Blank</string>\n                   </property>\n                   <property name=\"suffix\">\n                    <string>°</string>\n                   </property>\n                   <property name=\"minimum\">\n                    <number>-1</number>\n                   </property>\n                   <property name=\"maximum\">\n                    <number>359</number>\n                   </property>\n                   <property name=\"singleStep\">\n                    <number>1</number>\n                   </property>\n                   <property name=\"value\">\n                    <number>-1</number>\n                   </property>\n                  </widget>\n                 </item>\n                </layout>\n               </widget>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"verticalSpacer_7\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>40</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </widget>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"callbooTab\">\n      <attribute name=\"title\">\n       <string>Callbook</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_11\">\n         <property name=\"title\">\n          <string>Query Order</string>\n         </property>\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n          <item>\n           <widget class=\"QGroupBox\" name=\"groupBox_12\">\n            <property name=\"title\">\n             <string>Primary</string>\n            </property>\n            <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n             <item>\n              <widget class=\"QComboBox\" name=\"primaryCallbookCombo\"/>\n             </item>\n            </layout>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QGroupBox\" name=\"groupBox_13\">\n            <property name=\"title\">\n             <string>Secondary</string>\n            </property>\n            <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n             <item>\n              <widget class=\"QComboBox\" name=\"secondaryCallbookCombo\"/>\n             </item>\n            </layout>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox\">\n         <property name=\"title\">\n          <string>HamQTH</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_3\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"hamQthUsernameLabel\">\n            <property name=\"text\">\n             <string>Username</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"hamQthUsernameEdit\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"hamQthPasswordLabel\">\n            <property name=\"text\">\n             <string>Password</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"hamQthPasswordEdit\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n            <property name=\"echoMode\">\n             <enum>QLineEdit::Password</enum>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_10\">\n         <property name=\"title\">\n          <string>QRZ.com</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_12\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"qrzUsernameLabel\">\n            <property name=\"text\">\n             <string>Username</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"qrzUsernameEdit\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"qrzPasswordLabel\">\n            <property name=\"text\">\n             <string>Password</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"qrzPasswordEdit\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n            <property name=\"echoMode\">\n             <enum>QLineEdit::Password</enum>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <widget class=\"QLabel\" name=\"qrzNotice\">\n            <property name=\"text\">\n             <string>&lt;b&gt;Notice:&lt;/b&gt; At least a QRZ XML Subscription is recommended to access detailed information. Without a subscription, you will obtain limited data from QRZ, such as missing grid and other fields.</string>\n            </property>\n            <property name=\"wordWrap\">\n             <bool>true</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QLabel\" name=\"qrzNoticePadding\">\n            <property name=\"text\">\n             <string notr=\"true\"/>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_3\">\n         <property name=\"title\">\n          <string>Web Lookup Button</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_10\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"webLookupURLLabel\">\n            <property name=\"text\">\n             <string>URL</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_18\">\n            <item>\n             <widget class=\"QLineEdit\" name=\"webLookupURLEdit\">\n              <property name=\"toolTip\">\n               <string>Specify the URL to use for quick search. The &lt;DXCALL&gt; macro will be replaced by the current callsign</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QPushButton\" name=\"webLookupURLTestButton\">\n              <property name=\"toolTip\">\n               <string>Test URL with your Callsign</string>\n              </property>\n              <property name=\"text\">\n               <string>Test</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"clubsTab\">\n      <attribute name=\"title\">\n       <string>Clubs</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_17\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"clubListGroup\">\n         <property name=\"title\">\n          <string>Active Lists</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_12\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"clubListGrig\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_10\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"syncQSLTab\">\n      <attribute name=\"title\">\n       <string>Sync &amp;&amp; QSL</string>\n      </attribute>\n      <layout class=\"QGridLayout\" name=\"gridLayout_6\">\n       <item row=\"1\" column=\"0\">\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item row=\"0\" column=\"0\">\n        <widget class=\"QTabWidget\" name=\"tabWidget_2\">\n         <property name=\"tabShape\">\n          <enum>QTabWidget::Rounded</enum>\n         </property>\n         <property name=\"currentIndex\">\n          <number>0</number>\n         </property>\n         <property name=\"documentMode\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"clublogSyncQSLTab\">\n          <attribute name=\"title\">\n           <string>ClubLog</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_14\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_12\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"clublogEmailLabel\">\n             <property name=\"text\">\n              <string>E-Mail</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"clublogEmailEdit\"/>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"clublogPasswordLabel\">\n             <property name=\"text\">\n              <string>Password</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"clublogPasswordEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"0\">\n            <widget class=\"QLabel\" name=\"clublogUploadImmediatelyLabel\">\n             <property name=\"text\">\n              <string>Immediately Upload</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"1\">\n            <widget class=\"QCheckBox\" name=\"clublogUploadImmediatelyCheckbox\">\n             <property name=\"enabled\">\n              <bool>false</bool>\n             </property>\n             <property name=\"toolTip\">\n              <string>QSOs are uploaded immediately</string>\n             </property>\n             <property name=\"text\">\n              <string notr=\"true\"/>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"eqslSyncQSLTab\">\n          <attribute name=\"title\">\n           <string>eQSL</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_5\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_14\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"eqslUsernameLabel\">\n             <property name=\"text\">\n              <string>Username</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"eqslUsernameEdit\"/>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"eqslPasswordLabel\">\n             <property name=\"text\">\n              <string>Password</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"eqslPasswordEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"hrdlogSyncQSLTab\">\n          <attribute name=\"title\">\n           <string>HRDLog</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_16\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"hrdlogCallsignLabel\">\n             <property name=\"text\">\n              <string>Callsign</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"hrdlogCallsignEdit\"/>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"hrdlogUploadCodeLabel\">\n             <property name=\"toolTip\">\n              <string>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</string>\n             </property>\n             <property name=\"text\">\n              <string>Upload Code</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"hrdlogUploadCodeEdit\">\n             <property name=\"toolTip\">\n              <string>It is not a password. It is the upload code received via email after the registration to HRDLOG..net</string>\n             </property>\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"0\">\n            <widget class=\"QLabel\" name=\"hrdlogOnAirLabel\">\n             <property name=\"toolTip\">\n              <string>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</string>\n             </property>\n             <property name=\"text\">\n              <string>Send On-Air</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"1\">\n            <widget class=\"QCheckBox\" name=\"hrdlogOnAirCheckBox\">\n             <property name=\"enabled\">\n              <bool>false</bool>\n             </property>\n             <property name=\"toolTip\">\n              <string>If it is enabled and Rig is connected then QLog periodically sends On-Air messages to HRDLog</string>\n             </property>\n             <property name=\"text\">\n              <string/>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"lotwSyncQSLTab\">\n          <attribute name=\"title\">\n           <string>LoTW</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_11\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_18\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"lotwUsernameLabel\">\n             <property name=\"text\">\n              <string>Username</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"lotwUsernameEdit\"/>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"lotwPasswordLabel\">\n             <property name=\"text\">\n              <string>Password</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"lotwPasswordEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"0\">\n            <widget class=\"QLabel\" name=\"lotwtqslPathLabel\">\n             <property name=\"text\">\n              <string>TQSL Path</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"3\" column=\"1\">\n            <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n             <item>\n              <widget class=\"QLineEdit\" name=\"tqslPathEdit\">\n               <property name=\"placeholderText\">\n                <string>Leave empty for auto-detection</string>\n               </property>\n               <property name=\"clearButtonEnabled\">\n                <bool>true</bool>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"QPushButton\" name=\"tqslPathButton\">\n               <property name=\"text\">\n                <string>Browse</string>\n               </property>\n               <property name=\"icon\">\n                <iconset theme=\"folder-open\">\n                 <normaloff>.</normaloff>.</iconset>\n               </property>\n              </widget>\n             </item>\n             <item>\n              <widget class=\"QPushButton\" name=\"tqslAutoButton\">\n               <property name=\"toolTip\">\n                <string>Auto-detect TQSL path</string>\n               </property>\n               <property name=\"text\">\n                <string>Auto-Detect</string>\n               </property>\n              </widget>\n             </item>\n            </layout>\n           </item>\n           <item row=\"4\" column=\"0\">\n            <widget class=\"QLabel\" name=\"tqslVersionLabel\">\n             <property name=\"text\">\n              <string>TQSL Version</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"4\" column=\"1\">\n            <widget class=\"QLabel\" name=\"tqslVersionValueLabel\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string/>\n             </property>\n            </widget>\n           </item>\n           <item row=\"5\" column=\"1\">\n            <widget class=\"QLabel\" name=\"lotwTextMessage\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"text\">\n              <string>Using an internal TQSL instance</string>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"qrzSyncQSLTab\">\n          <attribute name=\"title\">\n           <string>QRZ.com</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_4\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_9\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"qrzApiKeyLabel\">\n             <property name=\"text\">\n              <string>Default API Key</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"qrzApiKeyEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <spacer name=\"verticalSpacer_20\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Maximum</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"3\" column=\"0\" colspan=\"2\">\n            <widget class=\"QGroupBox\" name=\"groupBox_5\">\n             <property name=\"title\">\n              <string>Callsign-specific API Keys</string>\n             </property>\n             <layout class=\"QVBoxLayout\" name=\"verticalLayout_16\">\n              <item>\n               <widget class=\"QTableView\" name=\"qrzCallsignApiKeyTableView\">\n                <property name=\"alternatingRowColors\">\n                 <bool>true</bool>\n                </property>\n                <property name=\"selectionMode\">\n                 <enum>QAbstractItemView::SingleSelection</enum>\n                </property>\n                <property name=\"verticalScrollMode\">\n                 <enum>QAbstractItemView::ScrollPerPixel</enum>\n                </property>\n                <property name=\"horizontalScrollMode\">\n                 <enum>QAbstractItemView::ScrollPerPixel</enum>\n                </property>\n                <attribute name=\"horizontalHeaderMinimumSectionSize\">\n                 <number>300</number>\n                </attribute>\n                <attribute name=\"horizontalHeaderStretchLastSection\">\n                 <bool>true</bool>\n                </attribute>\n                <attribute name=\"verticalHeaderVisible\">\n                 <bool>false</bool>\n                </attribute>\n               </widget>\n              </item>\n              <item>\n               <layout class=\"QHBoxLayout\" name=\"horizontalLayout_34\">\n                <property name=\"bottomMargin\">\n                 <number>0</number>\n                </property>\n                <item>\n                 <widget class=\"QPushButton\" name=\"qrzCallsignApiKeyAddButton\">\n                  <property name=\"text\">\n                   <string>Add</string>\n                  </property>\n                 </widget>\n                </item>\n                <item>\n                 <spacer name=\"horizontalSpacer_7\">\n                  <property name=\"orientation\">\n                   <enum>Qt::Horizontal</enum>\n                  </property>\n                  <property name=\"sizeType\">\n                   <enum>QSizePolicy::Maximum</enum>\n                  </property>\n                  <property name=\"sizeHint\" stdset=\"0\">\n                   <size>\n                    <width>60</width>\n                    <height>20</height>\n                   </size>\n                  </property>\n                 </spacer>\n                </item>\n                <item>\n                 <widget class=\"QPushButton\" name=\"qrzCallsignApiKeyDelButton\">\n                  <property name=\"text\">\n                   <string>Delete</string>\n                  </property>\n                 </widget>\n                </item>\n               </layout>\n              </item>\n             </layout>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"wavelog\">\n          <attribute name=\"title\">\n           <string>Wavelog</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_13\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_21\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"wavelogAddQSOEndpointLabel\">\n             <property name=\"text\">\n              <string>Endpoint</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"wavelogAddQSOEndpointEdit\">\n             <property name=\"text\">\n              <string notr=\"true\">https://localhost/index.php/api/qso</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"wavelogApiKeyLabel\">\n             <property name=\"text\">\n              <string>API Key</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"wavelogApiKeyEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n         <widget class=\"QWidget\" name=\"othersTab\">\n          <attribute name=\"title\">\n           <string>Others</string>\n          </attribute>\n          <layout class=\"QVBoxLayout\" name=\"verticalLayout_15\">\n           <item>\n            <widget class=\"QGroupBox\" name=\"groupBox_4\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n             <property name=\"title\">\n              <string>DXCC</string>\n             </property>\n             <layout class=\"QFormLayout\" name=\"formLayout_6\">\n              <item row=\"0\" column=\"0\">\n               <widget class=\"QLabel\" name=\"dxccConfirmedByLabel\">\n                <property name=\"text\">\n                 <string>Status Confirmed By</string>\n                </property>\n               </widget>\n              </item>\n              <item row=\"0\" column=\"1\">\n               <layout class=\"QHBoxLayout\" name=\"horizontalLayout_33\">\n                <property name=\"spacing\">\n                 <number>10</number>\n                </property>\n                <property name=\"leftMargin\">\n                 <number>20</number>\n                </property>\n                <item>\n                 <widget class=\"QCheckBox\" name=\"dxccConfirmedByLotwCheckBox\">\n                  <property name=\"text\">\n                   <string>LoTW</string>\n                  </property>\n                 </widget>\n                </item>\n                <item>\n                 <widget class=\"QCheckBox\" name=\"dxccConfirmedByPaperCheckBox\">\n                  <property name=\"text\">\n                   <string>Paper</string>\n                  </property>\n                 </widget>\n                </item>\n                <item>\n                 <widget class=\"QCheckBox\" name=\"dxccConfirmedByEqslCheckBox\">\n                  <property name=\"text\">\n                   <string>eQSL</string>\n                  </property>\n                 </widget>\n                </item>\n                <item>\n                 <spacer name=\"horizontalSpacer_2\">\n                  <property name=\"orientation\">\n                   <enum>Qt::Horizontal</enum>\n                  </property>\n                  <property name=\"sizeHint\" stdset=\"0\">\n                   <size>\n                    <width>0</width>\n                    <height>0</height>\n                   </size>\n                  </property>\n                 </spacer>\n                </item>\n               </layout>\n              </item>\n             </layout>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"verticalSpacer_5\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>40</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </widget>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"chatTab\">\n      <attribute name=\"title\">\n       <string>Chat</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_13\">\n       <item>\n        <widget class=\"QTabWidget\" name=\"tabWidget_3\">\n         <property name=\"currentIndex\">\n          <number>0</number>\n         </property>\n         <property name=\"documentMode\">\n          <bool>true</bool>\n         </property>\n         <widget class=\"QWidget\" name=\"kstTab\">\n          <attribute name=\"title\">\n           <string notr=\"true\">ON4KST</string>\n          </attribute>\n          <layout class=\"QFormLayout\" name=\"formLayout_15\">\n           <item row=\"0\" column=\"1\">\n            <spacer name=\"verticalSpacer_23\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"1\" column=\"0\">\n            <widget class=\"QLabel\" name=\"kstUsernameLabel\">\n             <property name=\"text\">\n              <string>Username</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"1\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"kstUsernameEdit\"/>\n           </item>\n           <item row=\"2\" column=\"0\">\n            <widget class=\"QLabel\" name=\"kstPasswordLabel\">\n             <property name=\"text\">\n              <string>Password</string>\n             </property>\n            </widget>\n           </item>\n           <item row=\"2\" column=\"1\">\n            <widget class=\"QLineEdit\" name=\"kstPasswordEdit\">\n             <property name=\"echoMode\">\n              <enum>QLineEdit::Password</enum>\n             </property>\n            </widget>\n           </item>\n           <item row=\"4\" column=\"1\">\n            <spacer name=\"verticalSpacer_24\">\n             <property name=\"orientation\">\n              <enum>Qt::Vertical</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>0</width>\n               <height>0</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item row=\"3\" column=\"1\">\n            <widget class=\"QLabel\" name=\"kstSecurityNoticeLabel\">\n             <property name=\"text\">\n              <string>&lt;b&gt;Security Notice:&lt;/b&gt; QLog stores all passwords in the Secure Storage. Unfortunately, ON4KST uses a protocol where this password is sent over an unsecured channel as plaintext.&lt;/p&gt;&lt;p&gt;Please exercise caution when choosing your password for this service, as your password is sent over an unsecured channel in plaintext form.&lt;/p&gt;</string>\n             </property>\n             <property name=\"wordWrap\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n          </layout>\n         </widget>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_22\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"bandsTab\">\n      <attribute name=\"title\">\n       <string>Bands</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QTableView\" name=\"bandTableView\">\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>20</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"modesTab\">\n      <attribute name=\"title\">\n       <string>Modes</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <item>\n        <widget class=\"QLabel\" name=\"label_3\">\n         <property name=\"text\">\n          <string>The '&gt;' character is interpreted as a marker for the initial cursor position in the Report column. &lt;br/&gt;Ex.: '5&gt;9' means the cursor will be positioned on the second character</string>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QTableView\" name=\"modeTableView\">\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderStretchLastSection\">\n          <bool>true</bool>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>20</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"networkTab\">\n      <attribute name=\"title\">\n       <string>Network</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_15\">\n         <property name=\"title\">\n          <string>Wsjtx</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_2\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"wsjtForwardLabel\">\n            <property name=\"text\">\n             <string>Raw UDP Forward</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"wsjtForwardEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt;List of IP addresses to which QLog forwards raw UDP WSJT-X packets.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"wsjtPortLabel\">\n            <property name=\"text\">\n             <string>Port </string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QSpinBox\" name=\"wsjtPortSpin\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"toolTip\">\n             <string>Port where QLog listens an incoming traffic from WSJT-X</string>\n            </property>\n            <property name=\"minimum\">\n             <number>1025</number>\n            </property>\n            <property name=\"maximum\">\n             <number>65534</number>\n            </property>\n            <property name=\"value\">\n             <number>2237</number>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"0\">\n           <widget class=\"QLabel\" name=\"wsjtMulticastCheckboxLabel\">\n            <property name=\"text\">\n             <string>Join Multicast</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_14\">\n            <item>\n             <widget class=\"QLineEdit\" name=\"wsjtMulticastAddressEdit\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"MinimumExpanding\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Specify Multicast Address. &lt;br&gt;On some Linux systems it may be necessary to enable multicast on the loop-back network interface.</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"wsjtMulticastTTLLabel\">\n              <property name=\"text\">\n               <string>TTL</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QSpinBox\" name=\"wsjtMulticastTTLSpin\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"toolTip\">\n               <string>Time-To-Live determines the range&lt;br&gt; over which a multicast packet is propagated in your intranet. </string>\n              </property>\n              <property name=\"minimum\">\n               <number>1</number>\n              </property>\n              <property name=\"maximum\">\n               <number>255</number>\n              </property>\n              <property name=\"value\">\n               <number>1</number>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n          <item row=\"4\" column=\"0\">\n           <widget class=\"QLabel\" name=\"wsjtMulticastAddressLabel\">\n            <property name=\"text\">\n             <string>Multicast Address</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"1\">\n           <widget class=\"QCheckBox\" name=\"wsjtMulticastCheckbox\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"toolTip\">\n             <string>Enable/Disable Multicast option for WSJTX</string>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QLabel\" name=\"wsjtColorCqSpotsLabel\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"text\">\n             <string>Color CQ Spots</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <widget class=\"QCheckBox\" name=\"wsjtColorCqSpotsCheckbox\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"toolTip\">\n             <string>Enable/Disable sending color-coded status indicators back to WSJT-X for each callsign calling CQ</string>\n            </property>\n            <property name=\"text\">\n             <string/>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_17\">\n         <property name=\"title\">\n          <string>Notifications</string>\n         </property>\n         <layout class=\"QFormLayout\" name=\"formLayout_16\">\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifLogIDLabel\">\n            <property name=\"text\">\n             <string>LogID</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifLogIDEdit\">\n            <property name=\"enabled\">\n             <bool>true</bool>\n            </property>\n            <property name=\"toolTip\">\n             <string>&lt;p&gt;Assigned LogID to the current log.&lt;/p&gt;The LogID is sent in the Network Nofitication messages as a unique instance identified.&lt;p&gt; The ID is generated automatically and cannot be changed&lt;/&gt;</string>\n            </property>\n            <property name=\"readOnly\">\n             <bool>true</bool>\n            </property>\n            <property name=\"clearButtonEnabled\">\n             <bool>false</bool>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifDXSpotsLabel\">\n            <property name=\"text\">\n             <string>DX Spots</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifDXSpotsEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with DX Cluster Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifSpotAlertLabel\">\n            <property name=\"text\">\n             <string>Spot Alerts</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"2\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifSpotAlertEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about user Spot Alerts.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifQSOLabel\">\n            <property name=\"text\">\n             <string>QSO Changes </string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"3\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifQSOEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets about a new/updated/deleted QSO in the log.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifWSJTXCQSpotsLabel\">\n            <property name=\"text\">\n             <string>Wsjtx CQ Spots</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"4\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifWSJTXCQSpotsEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt; List of IP addresses to which QLog sends  UDP notification packets with WSJTX CQ Spots.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"5\" column=\"0\">\n           <widget class=\"QLabel\" name=\"notifRigLabel\">\n            <property name=\"text\">\n             <string>Rig Status</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"5\" column=\"1\">\n           <widget class=\"QLineEdit\" name=\"notifRigEdit\">\n            <property name=\"toolTip\">\n             <string>&lt;p&gt; List of IP addresses to which QLog sends UDP notification packets when Rig State changes.&lt;/p&gt;The IP addresses are separated by a space and have the form IP:PORT</string>\n            </property>\n            <property name=\"placeholderText\">\n             <string>ex. 192.168.1.1:1234 192.168.2.1:1234</string>\n            </property>\n           </widget>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_3\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>0</width>\n           <height>0</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"guiTab\">\n      <attribute name=\"title\">\n       <string>GUI</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_14\">\n       <item>\n        <layout class=\"QFormLayout\" name=\"dateTimeFormatLayout\">\n         <item row=\"0\" column=\"0\">\n          <widget class=\"QLabel\" name=\"dateFormatLabel\">\n           <property name=\"text\">\n            <string>Date Format</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"0\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_36\">\n           <item>\n            <widget class=\"QRadioButton\" name=\"dateFormatSystemRadioButton\">\n             <property name=\"text\">\n              <string>System</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup_2</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QRadioButton\" name=\"dateFormatCustomRadioButton\">\n             <property name=\"text\">\n              <string>Custom</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup_2</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QLineEdit\" name=\"dateFormatStringEdit\">\n             <property name=\"sizePolicy\">\n              <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n               <horstretch>0</horstretch>\n               <verstretch>0</verstretch>\n              </sizepolicy>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_5\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"dateFormatResultLabel\">\n             <property name=\"text\">\n              <string/>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_4\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeType\">\n              <enum>QSizePolicy::Fixed</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>20</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n           <item>\n            <widget class=\"QLabel\" name=\"dateFormatDocLabel\">\n             <property name=\"text\">\n              <string>&lt;a href=&quot;https://doc.qt.io/qt-6/qdate.html#fromString-1&quot;&gt;Time Format Documentation&lt;/a&gt;</string>\n             </property>\n             <property name=\"openExternalLinks\">\n              <bool>true</bool>\n             </property>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_6\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"1\" column=\"0\">\n          <widget class=\"QLabel\" name=\"timeFormatLabel\">\n           <property name=\"text\">\n            <string>Time Format</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"1\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_35\">\n           <item>\n            <widget class=\"QRadioButton\" name=\"timeFormat24RadioButton\">\n             <property name=\"text\">\n              <string>24-hour</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QRadioButton\" name=\"timeFormat12RadioButton\">\n             <property name=\"text\">\n              <string>AM/PM</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_3\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n         <item row=\"2\" column=\"0\">\n          <widget class=\"QLabel\" name=\"unitFormatLabel\">\n           <property name=\"text\">\n            <string>Unit System</string>\n           </property>\n          </widget>\n         </item>\n         <item row=\"2\" column=\"1\">\n          <layout class=\"QHBoxLayout\" name=\"horizontalLayout_38\">\n           <item>\n            <widget class=\"QRadioButton\" name=\"unitFormatMetricRadioButton\">\n             <property name=\"text\">\n              <string>Metric</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup_3</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <widget class=\"QRadioButton\" name=\"unitFormatImperialRadioButton\">\n             <property name=\"text\">\n              <string>Imperial</string>\n             </property>\n             <attribute name=\"buttonGroup\">\n              <string notr=\"true\">buttonGroup_3</string>\n             </attribute>\n            </widget>\n           </item>\n           <item>\n            <spacer name=\"horizontalSpacer_8\">\n             <property name=\"orientation\">\n              <enum>Qt::Horizontal</enum>\n             </property>\n             <property name=\"sizeHint\" stdset=\"0\">\n              <size>\n               <width>40</width>\n               <height>20</height>\n              </size>\n             </property>\n            </spacer>\n           </item>\n          </layout>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"shortcutInfoLabel\">\n         <property name=\"text\">\n          <string/>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QTableView\" name=\"shortcutsTableView\">\n         <property name=\"alternatingRowColors\">\n          <bool>true</bool>\n         </property>\n         <property name=\"selectionMode\">\n          <enum>QAbstractItemView::NoSelection</enum>\n         </property>\n         <property name=\"verticalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <property name=\"horizontalScrollMode\">\n          <enum>QAbstractItemView::ScrollPerPixel</enum>\n         </property>\n         <attribute name=\"horizontalHeaderMinimumSectionSize\">\n          <number>300</number>\n         </attribute>\n         <attribute name=\"verticalHeaderMinimumSectionSize\">\n          <number>20</number>\n         </attribute>\n         <attribute name=\"verticalHeaderDefaultSectionSize\">\n          <number>20</number>\n         </attribute>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"dangeZoneTab\">\n      <attribute name=\"title\">\n       <string>Danger Zone</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_18\">\n       <item>\n        <spacer name=\"verticalSpacer_15\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QLabel\" name=\"dangerLabel\">\n         <property name=\"text\">\n          <string>&lt;b&gt;⚠ This is a danger zone. Proceed with caution, as actions performed here cannot be undone and may have a significant impact on your log.&lt;/b&gt;</string>\n         </property>\n         <property name=\"alignment\">\n          <set>Qt::AlignCenter</set>\n         </property>\n         <property name=\"wordWrap\">\n          <bool>true</bool>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_13\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"deleteAllQSOsButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"styleSheet\">\n          <string notr=\"true\">QPushButton {background-color: red;}</string>\n         </property>\n         <property name=\"text\">\n          <string>Delete All QSOs</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_8\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n       <item>\n        <widget class=\"QPushButton\" name=\"deleteAllPasswordsButton\">\n         <property name=\"sizePolicy\">\n          <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n           <horstretch>0</horstretch>\n           <verstretch>0</verstretch>\n          </sizepolicy>\n         </property>\n         <property name=\"styleSheet\">\n          <string notr=\"true\">QPushButton {background-color: red;}</string>\n         </property>\n         <property name=\"text\">\n          <string>Delete All Passwords from the Secure Store</string>\n         </property>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_11\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>BaseDoubleSpinBox</class>\n   <extends>QDoubleSpinBox</extends>\n   <header>ui/component/BaseDoubleSpinBox.h</header>\n  </customwidget>\n  <customwidget>\n   <class>SerialPortEditLine</class>\n   <extends>QLineEdit</extends>\n   <header>ui/component/EditLine.h</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>stationProfileNameEdit</tabstop>\n  <tabstop>stationCallsignEdit</tabstop>\n  <tabstop>stationOperatorEdit</tabstop>\n  <tabstop>stationOperatorCallsignEdit</tabstop>\n  <tabstop>stationCountryCombo</tabstop>\n  <tabstop>stationCountyEdit</tabstop>\n  <tabstop>stationITUEdit</tabstop>\n  <tabstop>stationCQZEdit</tabstop>\n  <tabstop>stationLocatorEdit</tabstop>\n  <tabstop>stationQTHEdit</tabstop>\n  <tabstop>stationVUCCEdit</tabstop>\n  <tabstop>stationSOTAEdit</tabstop>\n  <tabstop>stationWWFFEdit</tabstop>\n  <tabstop>stationPOTAEdit</tabstop>\n  <tabstop>stationSIGEdit</tabstop>\n  <tabstop>stationIOTAEdit</tabstop>\n  <tabstop>stationSIGInfoEdit</tabstop>\n  <tabstop>stationDarcDokEdit</tabstop>\n  <tabstop>stationAddProfileButton</tabstop>\n  <tabstop>stationDelProfileButton</tabstop>\n  <tabstop>antProfileNameEdit</tabstop>\n  <tabstop>antDescEdit</tabstop>\n  <tabstop>antAzBeamWidthSpinBox</tabstop>\n  <tabstop>antAzOffsetSpinBox</tabstop>\n  <tabstop>antAddProfileButton</tabstop>\n  <tabstop>antDelProfileButton</tabstop>\n  <tabstop>cwProfileNameEdit</tabstop>\n  <tabstop>cwModelSelect</tabstop>\n  <tabstop>cwKeyModeSelect</tabstop>\n  <tabstop>cwSwapPaddlesCheckbox</tabstop>\n  <tabstop>cwPaddleOnlySidetoneCheckbox</tabstop>\n  <tabstop>cwSidetoneFreqCombo</tabstop>\n  <tabstop>cwDefaulSpeed</tabstop>\n  <tabstop>cwPortEdit</tabstop>\n  <tabstop>cwBaudSelect</tabstop>\n  <tabstop>cwAddProfileButton</tabstop>\n  <tabstop>cwDelProfileButton</tabstop>\n  <tabstop>cwShortcutProfileNameEdit</tabstop>\n  <tabstop>cwShortcutF1ShortEdit</tabstop>\n  <tabstop>cwShortcutF1MacroEdit</tabstop>\n  <tabstop>cwShortcutF2ShortEdit</tabstop>\n  <tabstop>cwShortcutF2MacroEdit</tabstop>\n  <tabstop>cwShortcutF3ShortEdit</tabstop>\n  <tabstop>cwShortcutF3MacroEdit</tabstop>\n  <tabstop>cwShortcutF4ShortEdit</tabstop>\n  <tabstop>cwShortcutF4MacroEdit</tabstop>\n  <tabstop>cwShortcutF5ShortEdit</tabstop>\n  <tabstop>cwShortcutF5MacroEdit</tabstop>\n  <tabstop>cwShortcutF6ShortEdit</tabstop>\n  <tabstop>cwShortcutF6MacroEdit</tabstop>\n  <tabstop>cwShortcutF7ShortEdit</tabstop>\n  <tabstop>cwShortcutF7MacroEdit</tabstop>\n  <tabstop>cwShortcutAddProfileButton</tabstop>\n  <tabstop>cwShortcutDelProfileButton</tabstop>\n  <tabstop>rigProfileNameEdit</tabstop>\n  <tabstop>rigInterfaceCombo</tabstop>\n  <tabstop>rigModelSelect</tabstop>\n  <tabstop>rigTXFreqMinSpinBox</tabstop>\n  <tabstop>rigTXFreqMaxSpinBox</tabstop>\n  <tabstop>rigRXOffsetSpinBox</tabstop>\n  <tabstop>rigTXOffsetSpinBox</tabstop>\n  <tabstop>rigPWRDefaultSpinBox</tabstop>\n  <tabstop>rigAssignedCWKeyCombo</tabstop>\n  <tabstop>rigGetModeCheckBox</tabstop>\n  <tabstop>rigGetVFOCheckBox</tabstop>\n  <tabstop>rigGetFreqCheckBox</tabstop>\n  <tabstop>rigQSYWipingCheckBox</tabstop>\n  <tabstop>rigGetPWRCheckBox</tabstop>\n  <tabstop>rigGetPTTStateCheckBox</tabstop>\n  <tabstop>rigGetXITCheckBox</tabstop>\n  <tabstop>rigGetRITCheckBox</tabstop>\n  <tabstop>rigGetSplitCheckBox</tabstop>\n  <tabstop>rigGetKeySpeedCheckBox</tabstop>\n  <tabstop>rigKeySpeedSyncCheckBox</tabstop>\n  <tabstop>rigDXSpots2RigCheckBox</tabstop>\n  <tabstop>rigShareCheckBox</tabstop>\n  <tabstop>rigSharePortSpinBox</tabstop>\n  <tabstop>rigShareAdvancedButton</tabstop>\n  <tabstop>rigPortTypeCombo</tabstop>\n  <tabstop>rigPollIntervalSpinBox</tabstop>\n  <tabstop>cwNetPortSpin</tabstop>\n  <tabstop>rigPortEdit</tabstop>\n  <tabstop>rigBaudSelect</tabstop>\n  <tabstop>rigCIVAddrSpinBox</tabstop>\n  <tabstop>rigDataBitsSelect</tabstop>\n  <tabstop>rigStopBitsSelect</tabstop>\n  <tabstop>rigFlowControlSelect</tabstop>\n  <tabstop>rigParitySelect</tabstop>\n  <tabstop>rigHostNameEdit</tabstop>\n  <tabstop>rigDTRCombo</tabstop>\n  <tabstop>rigRTSCombo</tabstop>\n  <tabstop>rigPTTTypeCombo</tabstop>\n  <tabstop>rigPTTPortEdit</tabstop>\n  <tabstop>rigNetPortSpin</tabstop>\n  <tabstop>rigAddProfileButton</tabstop>\n  <tabstop>rigDelProfileButton</tabstop>\n  <tabstop>rotProfileNameEdit</tabstop>\n  <tabstop>rotInterfaceCombo</tabstop>\n  <tabstop>rotModelSelect</tabstop>\n  <tabstop>rotPortTypeCombo</tabstop>\n  <tabstop>rotPortEdit</tabstop>\n  <tabstop>rotBaudSelect</tabstop>\n  <tabstop>rotDataBitsSelect</tabstop>\n  <tabstop>rotStopBitsSelect</tabstop>\n  <tabstop>rotFlowControlSelect</tabstop>\n  <tabstop>rotParitySelect</tabstop>\n  <tabstop>rotHostNameEdit</tabstop>\n  <tabstop>rotNetPortSpin</tabstop>\n  <tabstop>rotAddProfileButton</tabstop>\n  <tabstop>rotDelProfileButton</tabstop>\n  <tabstop>rotUsrButtonProfileNameEdit</tabstop>\n  <tabstop>rotUsrButton1Edit</tabstop>\n  <tabstop>rotUsrButtonSpinBox1</tabstop>\n  <tabstop>rotUsrButton2Edit</tabstop>\n  <tabstop>rotUsrButtonSpinBox2</tabstop>\n  <tabstop>rotUsrButton3Edit</tabstop>\n  <tabstop>rotUsrButtonSpinBox3</tabstop>\n  <tabstop>rotUsrButton4Edit</tabstop>\n  <tabstop>rotUsrButtonSpinBox4</tabstop>\n  <tabstop>rotUsrButtonAddProfileButton</tabstop>\n  <tabstop>rotUsrButtonDelProfileButton</tabstop>\n  <tabstop>primaryCallbookCombo</tabstop>\n  <tabstop>secondaryCallbookCombo</tabstop>\n  <tabstop>hamQthUsernameEdit</tabstop>\n  <tabstop>hamQthPasswordEdit</tabstop>\n  <tabstop>qrzUsernameEdit</tabstop>\n  <tabstop>qrzPasswordEdit</tabstop>\n  <tabstop>webLookupURLEdit</tabstop>\n  <tabstop>webLookupURLTestButton</tabstop>\n  <tabstop>clublogEmailEdit</tabstop>\n  <tabstop>clublogPasswordEdit</tabstop>\n  <tabstop>clublogUploadImmediatelyCheckbox</tabstop>\n  <tabstop>eqslUsernameEdit</tabstop>\n  <tabstop>eqslPasswordEdit</tabstop>\n  <tabstop>hrdlogCallsignEdit</tabstop>\n  <tabstop>hrdlogUploadCodeEdit</tabstop>\n  <tabstop>hrdlogOnAirCheckBox</tabstop>\n  <tabstop>lotwUsernameEdit</tabstop>\n  <tabstop>lotwPasswordEdit</tabstop>\n  <tabstop>tqslPathEdit</tabstop>\n  <tabstop>tqslPathButton</tabstop>\n  <tabstop>tqslAutoButton</tabstop>\n  <tabstop>qrzApiKeyEdit</tabstop>\n  <tabstop>qrzCallsignApiKeyTableView</tabstop>\n  <tabstop>qrzCallsignApiKeyAddButton</tabstop>\n  <tabstop>qrzCallsignApiKeyDelButton</tabstop>\n  <tabstop>wavelogAddQSOEndpointEdit</tabstop>\n  <tabstop>wavelogApiKeyEdit</tabstop>\n  <tabstop>dxccConfirmedByLotwCheckBox</tabstop>\n  <tabstop>dxccConfirmedByPaperCheckBox</tabstop>\n  <tabstop>dxccConfirmedByEqslCheckBox</tabstop>\n  <tabstop>bandTableView</tabstop>\n  <tabstop>modeTableView</tabstop>\n  <tabstop>wsjtForwardEdit</tabstop>\n  <tabstop>wsjtPortSpin</tabstop>\n  <tabstop>wsjtColorCqSpotsCheckbox</tabstop>\n  <tabstop>wsjtMulticastCheckbox</tabstop>\n  <tabstop>wsjtMulticastAddressEdit</tabstop>\n  <tabstop>wsjtMulticastTTLSpin</tabstop>\n  <tabstop>notifLogIDEdit</tabstop>\n  <tabstop>notifDXSpotsEdit</tabstop>\n  <tabstop>notifSpotAlertEdit</tabstop>\n  <tabstop>notifQSOEdit</tabstop>\n  <tabstop>notifWSJTXCQSpotsEdit</tabstop>\n  <tabstop>notifRigEdit</tabstop>\n  <tabstop>tabWidget</tabstop>\n  <tabstop>tabWidget_2</tabstop>\n  <tabstop>cwHostNameEdit</tabstop>\n  <tabstop>equipmentTabWidget</tabstop>\n  <tabstop>tabWidget_3</tabstop>\n  <tabstop>kstUsernameEdit</tabstop>\n  <tabstop>kstPasswordEdit</tabstop>\n  <tabstop>dateFormatSystemRadioButton</tabstop>\n  <tabstop>dateFormatCustomRadioButton</tabstop>\n  <tabstop>dateFormatStringEdit</tabstop>\n  <tabstop>timeFormat24RadioButton</tabstop>\n  <tabstop>timeFormat12RadioButton</tabstop>\n  <tabstop>unitFormatMetricRadioButton</tabstop>\n  <tabstop>unitFormatImperialRadioButton</tabstop>\n  <tabstop>shortcutsTableView</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>stationWWFFEdit</sender>\n   <signal>editingFinished()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>wwffEditFinished()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>651</x>\n     <y>288</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>439</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigGetXITCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigTXOffsetChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>333</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>347</x>\n     <y>399</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>antAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addAntProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>434</x>\n     <y>397</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotStackedWidget</sender>\n   <signal>currentChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rotStackWidgetChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationSOTAEdit</sender>\n   <signal>editingFinished()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>sotaEditFinished()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>472</x>\n     <y>288</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>439</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addCWKeyProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>79</x>\n     <y>97</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>408</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigPortEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustRigCOMPortTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>462</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationLocatorEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustLocatorTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>531</x>\n     <y>212</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationVUCCEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustVUCCLocatorTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>531</x>\n     <y>240</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>377</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>secondaryCallbookCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>secondaryCallbookChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>473</x>\n     <y>135</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>377</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwModelSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>cwKeyChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>124</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addRigProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>79</x>\n     <y>110</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigModelSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>462</x>\n     <y>127</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>413</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>antDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delAntProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>637</x>\n     <y>397</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotModelSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rotChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>120</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotProfilesListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickRotProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>58</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwShortcutDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delCWShortcutProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationSOTAEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>sotaChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>472</x>\n     <y>288</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>377</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>antProfilesListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickAntProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>153</x>\n     <y>184</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigGetFreqCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigGetFreqChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>333</x>\n     <y>119</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>408</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwProfilesListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickCWKeyProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>58</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>408</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addRotProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>79</x>\n     <y>106</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigStackedWidget</sender>\n   <signal>currentChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigStackWidgetChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>462</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>primaryCallbookCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>primaryCallbookChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>154</x>\n     <y>135</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>377</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwShortcutAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addCWShortcutProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>87</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delRigProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>110</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwShortcutListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickCWShortcutProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>73</x>\n     <y>125</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationCallsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>stationCallsignChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>531</x>\n     <y>128</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationWWFFEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>wwffChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>651</x>\n     <y>288</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>335</x>\n     <y>439</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delRotProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>106</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delCWKeyProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>97</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>408</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwStackedWidget</sender>\n   <signal>currentChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>cwKeyStackWidgetChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigGetRITCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigRXOffsetChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>461</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>347</x>\n     <y>399</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationProfilesListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickStationProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>210</x>\n     <y>220</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>tqslPathButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>tqslPathBrowse()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>711</x>\n     <y>546</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>tqslAutoButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>tqslAutoDetect()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>780</x>\n     <y>546</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addStationProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>454</x>\n     <y>393</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwPortEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustCWKeyCOMPortTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotPortEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustRotCOMPortTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>338</x>\n     <y>463</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>deleteStationProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>650</x>\n     <y>393</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigProfilesListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickRigProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>58</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>349</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>save()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>344</x>\n     <y>758</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>297</x>\n     <y>188</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>cancelled()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>344</x>\n     <y>758</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>297</x>\n     <y>188</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigAssignedCWKeyCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>assignedKeyChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>462</x>\n     <y>121</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>333</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationPOTAEdit</sender>\n   <signal>editingFinished()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>potaEditFinished()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>472</x>\n     <y>316</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>348</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationPOTAEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>potaChanged(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>472</x>\n     <y>316</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>348</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wsjtMulticastCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>joinMulticastChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>174</x>\n     <y>156</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wsjtMulticastAddressEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustWSJTXMulticastAddrTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>404</x>\n     <y>183</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotUsrButtonAddProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>addRotUsrButtonsProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>79</x>\n     <y>112</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotUsrButtonDelProfileButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>delRotUsrButtonsProfile()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>100</x>\n     <y>112</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotUsrButtonListView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>doubleClickRotUsrButtonsProfile(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>58</x>\n     <y>122</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>340</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>webLookupURLTestButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>testWebLookupURL()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>651</x>\n     <y>423</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>362</x>\n     <y>392</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigPortTypeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigPortTypeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>462</x>\n     <y>116</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>362</x>\n     <y>383</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotPortTypeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rotPortTypeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>452</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>362</x>\n     <y>383</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hrdlogCallsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>hrdlogSettingChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>431</x>\n     <y>351</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>372</x>\n     <y>383</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>hrdlogUploadCodeEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>hrdlogSettingChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>431</x>\n     <y>382</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>372</x>\n     <y>383</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigInterfaceCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigInterfaceChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>566</x>\n     <y>172</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>390</x>\n     <y>383</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clublogPasswordEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>clublogSettingChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>443</x>\n     <y>154</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>390</x>\n     <y>382</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clublogEmailEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>clublogSettingChanged()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>443</x>\n     <y>123</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>390</x>\n     <y>382</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rotInterfaceCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rotInterfaceChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>587</x>\n     <y>173</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>390</x>\n     <y>396</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigPTTTypeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigPTTTypeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>407</x>\n     <y>661</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>396</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>stationOperatorCallsignEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>adjustOperatorTextColor()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>465</x>\n     <y>174</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>397</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateFormatCustomRadioButton</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>dateFormatStringEdit</receiver>\n   <slot>setVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>241</x>\n     <y>91</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>358</x>\n     <y>91</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateFormatCustomRadioButton</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>dateFormatResultLabel</receiver>\n   <slot>setVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>241</x>\n     <y>91</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>435</x>\n     <y>91</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateFormatStringEdit</sender>\n   <signal>textChanged(QString)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>updateDateFormatResult()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>358</x>\n     <y>91</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>397</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>dateFormatCustomRadioButton</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>dateFormatDocLabel</receiver>\n   <slot>setVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>241</x>\n     <y>91</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>609</x>\n     <y>91</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qrzCallsignApiKeyAddButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>qrzAddCallsignAPIKey()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>193</x>\n     <y>412</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>397</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>qrzCallsignApiKeyDelButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>qrzDelCallsignAPIKey()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>575</x>\n     <y>412</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>397</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>cwKeyModeSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>cwModeChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>496</x>\n     <y>201</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>397</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigFlowControlSelect</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigFlowControlChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>415</x>\n     <y>662</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>422</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigShareCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigShareChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>455</x>\n     <y>527</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigShareAdvancedButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>showRigctldAdvanced()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>688</x>\n     <y>527</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigInterfaceCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigShareChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>564</x>\n     <y>162</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>rigPortTypeCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>rigShareChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>437</x>\n     <y>559</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>384</x>\n     <y>424</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>deleteAllQSOsButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>onDeleteAllQSOs()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>399</x>\n     <y>421</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>399</x>\n     <y>417</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>deleteAllPasswordsButton</sender>\n   <signal>clicked()</signal>\n   <receiver>SettingsDialog</receiver>\n   <slot>onDeleteAllPasswords()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>399</x>\n     <y>611</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>399</x>\n     <y>417</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>save()</slot>\n  <slot>addRigProfile()</slot>\n  <slot>delRigProfile()</slot>\n  <slot>rigChanged(int)</slot>\n  <slot>rotChanged(int)</slot>\n  <slot>addAntProfile()</slot>\n  <slot>delAntProfile()</slot>\n  <slot>tqslPathBrowse()</slot>\n  <slot>tqslAutoDetect()</slot>\n  <slot>addStationProfile()</slot>\n  <slot>deleteStationProfile()</slot>\n  <slot>doubleClickStationProfile(QModelIndex)</slot>\n  <slot>stationCallsignChanged()</slot>\n  <slot>adjustLocatorTextColor()</slot>\n  <slot>eqslDirBrowse()</slot>\n  <slot>cancelled()</slot>\n  <slot>adjustVUCCLocatorTextColor()</slot>\n  <slot>sotaChanged(QString)</slot>\n  <slot>primaryCallbookChanged(int)</slot>\n  <slot>secondaryCallbookChanged(int)</slot>\n  <slot>paperDirBrowse()</slot>\n  <slot>doubleClickRigProfile(QModelIndex)</slot>\n  <slot>doubleClickAntProfile(QModelIndex)</slot>\n  <slot>addRotProfile()</slot>\n  <slot>delRotProfile()</slot>\n  <slot>doubleClickRotProfile(QModelIndex)</slot>\n  <slot>rigRXOffsetChanged(int)</slot>\n  <slot>rigTXOffsetChanged(int)</slot>\n  <slot>rigGetFreqChanged(int)</slot>\n  <slot>doubleClickCWKeyProfile(QModelIndex)</slot>\n  <slot>addCWKeyProfile()</slot>\n  <slot>delCWKeyProfile()</slot>\n  <slot>doubleClickCWShortcutProfile(QModelIndex)</slot>\n  <slot>addCWShortcutProfile()</slot>\n  <slot>delCWShortcutProfile()</slot>\n  <slot>cwKeyChanged(int)</slot>\n  <slot>adjustCWKeyCOMPortTextColor()</slot>\n  <slot>adjustRigCOMPortTextColor()</slot>\n  <slot>adjustRotCOMPortTextColor()</slot>\n  <slot>rigStackWidgetChanged(int)</slot>\n  <slot>rotStackWidgetChanged(int)</slot>\n  <slot>cwKeyStackWidgetChanged(int)</slot>\n  <slot>sotaEditFinished()</slot>\n  <slot>wwffEditFinished()</slot>\n  <slot>wwffChanged(QString)</slot>\n  <slot>assignedKeyChanged(int)</slot>\n  <slot>potaEditFinished()</slot>\n  <slot>potaChanged(QString)</slot>\n  <slot>joinMulticastChanged(int)</slot>\n  <slot>adjustWSJTXMulticastAddrTextColor()</slot>\n  <slot>doubleClickRotUsrButtonsProfile(QModelIndex)</slot>\n  <slot>delRotUsrButtonsProfile()</slot>\n  <slot>addRotUsrButtonsProfile()</slot>\n  <slot>testWebLookupURL()</slot>\n  <slot>rigPortTypeChanged(int)</slot>\n  <slot>rotPortTypeChanged(int)</slot>\n  <slot>hrdlogSettingChanged()</slot>\n  <slot>rigInterfaceChanged(int)</slot>\n  <slot>clublogSettingChanged()</slot>\n  <slot>rotInterfaceChanged(int)</slot>\n  <slot>rigPTTTypeChanged(int)</slot>\n  <slot>adjustOperatorTextColor()</slot>\n  <slot>updateDateFormatResult()</slot>\n  <slot>qrzAddCallsignAPIKey()</slot>\n  <slot>qrzDelCallsignAPIKey()</slot>\n  <slot>cwModeChanged(int)</slot>\n  <slot>rigFlowControlChanged(int)</slot>\n  <slot>rigShareChanged(int)</slot>\n  <slot>showRigctldAdvanced()</slot>\n  <slot>onDeleteAllQSOs()</slot>\n  <slot>onDeleteAllPasswords()</slot>\n </slots>\n <buttongroups>\n  <buttongroup name=\"buttonGroup_3\"/>\n  <buttongroup name=\"buttonGroup_2\"/>\n  <buttongroup name=\"buttonGroup\"/>\n </buttongroups>\n</ui>\n"
  },
  {
    "path": "ui/ShowUploadDialog.cpp",
    "content": "#include \"ShowUploadDialog.h\"\n#include \"ui_ShowUploadDialog.h\"\n#include <QPushButton>\n\nShowUploadDialog::ShowUploadDialog(const QString &qsoList, QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::ShowUploadDialog)\n{\n    ui->setupUi(this);\n    ui->qsoText->insertPlainText(qsoList);\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"Upload\"));\n}\n\nShowUploadDialog::~ShowUploadDialog()\n{\n    delete ui;\n}\n"
  },
  {
    "path": "ui/ShowUploadDialog.h",
    "content": "#ifndef QLOG_UI_SHOWUPLOADDIALOG_H\n#define QLOG_UI_SHOWUPLOADDIALOG_H\n\n#include <QDialog>\n\nnamespace Ui {\nclass ShowUploadDialog;\n}\n\nclass ShowUploadDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit ShowUploadDialog(const QString &qsoList, QWidget *parent = nullptr);\n    ~ShowUploadDialog();\n\nprivate:\n    Ui::ShowUploadDialog *ui;\n};\n\n#endif // QLOG_UI_SHOWUPLOADDIALOG_H\n"
  },
  {
    "path": "ui/ShowUploadDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>ShowUploadDialog</class>\n <widget class=\"QDialog\" name=\"ShowUploadDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>558</width>\n    <height>386</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>QSOs to Upload</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Selected QSO</string>\n     </property>\n     <property name=\"flat\">\n      <bool>false</bool>\n     </property>\n     <property name=\"checkable\">\n      <bool>false</bool>\n     </property>\n     <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n      <item>\n       <widget class=\"QPlainTextEdit\" name=\"qsoText\">\n        <property name=\"enabled\">\n         <bool>true</bool>\n        </property>\n        <property name=\"readOnly\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>ShowUploadDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>ShowUploadDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/SplashScreen.h",
    "content": "#ifndef QLOG_UI_SPLASHSCREEN_H\n#define QLOG_UI_SPLASHSCREEN_H\n\n#include <QSplashScreen>\n#include <QThread>\n#include <QApplication>\n\nclass SplashScreen : public QSplashScreen\n{\npublic:\n    explicit SplashScreen(const QPixmap &pixmap = QPixmap()) : QSplashScreen(pixmap) {}\n\nprivate:\n    bool painted=false;\n\n\n    void paintEvent(QPaintEvent* e) override\n    {\n        QSplashScreen::paintEvent(e);\n        painted=true;\n    }\npublic:\n    void ensureFirstPaint() const\n    {\n        while(!painted)\n        {\n            QThread::usleep(1e3);\n            qApp->processEvents();\n        }\n    }\n};\n\n#endif // QLOG_UI_SPLASHSCREEN_H\n"
  },
  {
    "path": "ui/StatisticsWidget.cpp",
    "content": "#include <QChart>\n#include <QChartView>\n#include <QBarSet>\n#include <QBarCategoryAxis>\n#include <QValueAxis>\n#include <QBarSeries>\n#include <QSqlQuery>\n#include <QDateTime>\n#include <QDebug>\n#include <QComboBox>\n#include <QStringListModel>\n#include <QGraphicsLayout>\n#include <QMessageBox>\n#include \"StatisticsWidget.h\"\n#include \"ui_StatisticsWidget.h\"\n#include \"core/debug.h\"\n#include \"models/SqlListModel.h\"\n#include \"data/Gridsquare.h\"\n#include \"core/QSOFilterManager.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.statisticswidget\");\n\nvoid StatisticsWidget::mainStatChanged(int idx)\n{\n     FCT_IDENTIFICATION;\n\n     qCDebug(function_parameters) << idx;\n\n     setSubTypesCombo(idx);\n     refreshGraph();\n}\n\nvoid StatisticsWidget::refreshWidget()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !isVisible() )\n        return;\n\n    refreshCombos();\n    refreshGraph();\n}\n\nvoid StatisticsWidget::refreshGraph()\n{\n     FCT_IDENTIFICATION;\n\n     if ( !isVisible() )\n         return;\n\n     QStringList genericFilter;\n\n     genericFilter << \" 1 = 1 \"; //just initialization - use only in case of empty Options\n\n     if ( ui->myCallCombo->currentIndex() != 0 )\n         genericFilter << \" (station_callsign = '\" + ui->myCallCombo->currentText() + \"') \";\n\n     if ( ui->myGridCombo->currentIndex() != 0 )\n     {\n         if ( ui->myGridCombo->currentText().isEmpty() )\n             genericFilter << \" (my_gridsquare is NULL) \";\n         else\n             genericFilter << \" (my_gridsquare = '\" + ui->myGridCombo->currentText() + \"') \";\n     }\n\n     if ( ui->myRigCombo->currentIndex() != 0 )\n     {\n         if ( ui->myRigCombo->currentText().isEmpty() )\n             genericFilter << \" (my_rig is NULL) \";\n         else\n             genericFilter << \" (my_rig = '\" + ui->myRigCombo->currentText() + \"') \";\n     }\n\n     if ( ui->myAntennaCombo->currentIndex() != 0 )\n     {\n         if ( ui->myAntennaCombo->currentText().isEmpty() )\n             genericFilter << \" (my_antenna is NULL) \";\n         else\n             genericFilter << \" (my_antenna = '\" + ui->myAntennaCombo->currentText() + \"') \";\n     }\n\n     if ( ui->bandCombo->currentIndex() != 0 &&  ! ui->bandCombo->currentText().isEmpty() )\n         genericFilter << \" (band = '\" + ui->bandCombo->currentText() + \"') \";\n\n     if ( ui->useDateRangeCheckBox->isChecked() )\n         genericFilter << \" (datetime(start_time) BETWEEN datetime('\" + ui->startDateEdit->dateTime().toString(\"yyyy-MM-dd HH:mm:ss\")\n                          + \"') AND datetime('\" + ui->endDateEdit->dateTime().toString(\"yyyy-MM-dd HH:mm:ss\") + \"') ) \";\n\n     if ( ui->userFilterCombo->currentIndex() > 0 )\n         genericFilter <<  QSOFilterManager::instance()->getWhereClause(ui->userFilterCombo->currentText());\n\n     qCDebug(runtime) << \"main \" << ui->statTypeMainCombo->currentIndex()\n                      << \" secondary \" << ui->statTypeSecCombo->currentIndex();\n\n     /****************/\n     /* QSO Per .... */\n     /****************/\n     if ( ui->statTypeMainCombo->currentIndex() == 0 )\n     {\n         QString stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n\n         case 0: // Year\n         case 1: // Month\n         case 2: // Day in Week\n         case 3: // Hour\n         {\n             QString startGenerator = \"1\";\n             QString endGenerator = \"12\";\n             QString formatGenerator = \"%m\";\n             QString XYMapping = \"col1, SUM(cnt)\";\n\n             if ( ui->statTypeSecCombo->currentIndex() == 0 )\n             {\n                 if ( ui->useDateRangeCheckBox->isChecked() )\n                 {\n                     startGenerator = ui->startDateEdit->date().toString(\"yyyy\");\n                     endGenerator = ui->endDateEdit->date().toString(\"yyyy\");\n                 }\n                 else\n                 {\n                    startGenerator = \"CAST(MIN(start_time) as INTEGER) from contacts\";\n                    endGenerator = \" (select strftime('%Y', DATE()))\";\n                 }\n                 formatGenerator = \"%Y\";\n             }\n             else if ( ui->statTypeSecCombo->currentIndex() == 1 )\n             {\n                 startGenerator = \"1\";\n                 endGenerator = \"12\";\n                 formatGenerator = \"%m\";\n             }\n             else if ( ui->statTypeSecCombo->currentIndex() == 2 )\n             {\n                 startGenerator = \"0\";\n                 endGenerator = \"6\";\n                 formatGenerator = \"%w\";\n                 XYMapping = \"case col1 when 0 THEN '\" + tr(\"Sun\") + \"' \"\n                             \"WHEN 1 THEN '\" + tr(\"Mon\") + \"' \"\n                             \"WHEN 2 THEN '\" + tr(\"Tue\") + \"' \"\n                             \"WHEN 3 THEN '\" + tr(\"Wed\") + \"' \"\n                             \"WHEN 4 THEN '\" + tr(\"Thu\") + \"' \"\n                             \"WHEN 5 THEN '\" + tr(\"Fri\") + \"' \"\n                             \"ELSE '\" + tr(\"Sat\") + \"' END, \"\n                             \"SUM(cnt) \";\n             }\n             else if ( ui->statTypeSecCombo->currentIndex() == 3 )\n             {\n                 startGenerator = \"0\";\n                 endGenerator = \"23\";\n                 formatGenerator = \"%H\";\n             }\n\n             stmt = \"WITH RECURSIVE cnt(incnt) AS ( \"\n                    \" SELECT \" + startGenerator + \" \"\n                    \" UNION ALL \"\n                    \" SELECT incnt + 1 \"\n                    \" FROM cnt \"\n                    \" WHERE incnt < \" + endGenerator + \" \"\n                    \" ) \"\n                    \" SELECT \" + XYMapping + \" \"\n                    \" FROM \"\n                    \" ( \"\n                    \"   SELECT  incnt as col1, 0 as cnt from cnt \"\n                    \"   UNION ALL \"\n                    \"   SELECT CAST(strftime('\" + formatGenerator +\"', start_time) as INTEGER) as col1, count(1) as cnt \"\n                    \"   FROM contacts \"\n                    \"   WHERE \" + genericFilter.join(\" AND \") + \" \"\n                    \"   GROUP BY col1 \"\n                    \" ) \"\n                    \" GROUP BY col1 \"\n                    \" ORDER BY col1\";\n         }\n             break;\n         case 4:  // Mode\n             stmt = \"SELECT IFNULL(mode, '\" + tr(\"Not specified\") + \"'), COUNT(1) FROM contacts WHERE \"\n                     + genericFilter.join(\" AND \") + \" GROUP BY mode ORDER BY mode\";\n             break;\n         case 5:  // Band\n             stmt = \"SELECT IFNULL(band, '\" + tr(\"Not specified\") + \"'), cnt \"\n                    \" FROM (SELECT c.band, b.start_freq, COUNT(1) AS cnt FROM contacts c LEFT JOIN bands b ON c.band = b.name\"\n                    \" WHERE \"\n                    + genericFilter.join(\" AND \")\n                    + \" GROUP BY band, start_freq) ORDER BY start_freq\";\n             break;\n         case 6:  // Continent\n             stmt = \"SELECT IFNULL(cont, '\" + tr(\"Not specified\") + \"'), COUNT(1) FROM contacts WHERE \"\n                    + genericFilter.join(\" AND \")\n                    + \" GROUP BY cont ORDER BY cont\";\n             break;\n         case 7:  // Prop Mode\n             stmt = \"SELECT IFNULL(prop_mode, '\" + tr(\"Not specified\") + \"'), COUNT(1) FROM contacts WHERE \"\n                    + genericFilter.join(\" AND \") + \" GROUP BY prop_mode ORDER BY prop_mode\";\n             break;\n         }\n\n         qCDebug(runtime) << stmt;\n\n         QSqlQuery query(stmt);\n\n         drawBarGraphs(ui->statTypeMainCombo->currentText()\n                       + \" \"\n                       + ui->statTypeSecCombo->currentText(),\n                       query);\n     }\n     /************/\n     /* Percents */\n     /************/\n     else if ( ui->statTypeMainCombo->currentIndex() == 1 )\n     {\n         QString stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n\n         case 0:  // Confirmed/Not Confirmed\n             stmt = \"SELECT (1.0 * COUNT(1)/(SELECT COUNT(1) AS total_cnt FROM contacts WHERE \"\n                    + genericFilter.join(\" AND \") +\")) * 100 FROM contacts WHERE \"\n                    + genericFilter.join(\" AND \")\n                    + \" AND (eqsl_qsl_rcvd = 'Y' OR lotw_qsl_rcvd = 'Y' OR qsl_rcvd = 'Y')\";\n             break;\n         }\n\n         QSqlQuery query(stmt);\n\n         qCDebug(runtime) << stmt;\n         QPieSeries *series = new QPieSeries();\n\n         query.next();\n\n         float confirmed = query.value(0).toInt();\n         float notConfirmed = 100.0 - confirmed;\n\n         series->append(tr(\"Confirmed \") + QString::number(confirmed) + \"%\", confirmed);\n         series->append(tr(\"Not Confirmed \") + QString::number(notConfirmed) + \"%\", notConfirmed);\n         series->setLabelsVisible(true);\n\n         drawPieGraph(QString(), series);\n     }\n     /**********/\n     /* TOP 10 */\n     /**********/\n     else if ( ui->statTypeMainCombo->currentIndex() == 2 )\n     {\n         QString stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n         case 0:  // Countries\n             stmt = \"SELECT translate_to_locale(COALESCE(d.name, c.dxcc)) as dxcc_display, COUNT(1) AS cnt \"\n                    \"FROM ( SELECT * FROM contacts WHERE \" + genericFilter.join(\" AND \") + \") c LEFT JOIN dxcc_entities_clublog d ON c.dxcc = d.id \"\n                    \"GROUP BY dxcc_display ORDER BY cnt DESC LIMIT 10\";\n             break;\n         case 1:  // Big squares\n             stmt = \"SELECT SUBSTR(gridsquare,1,4), COUNT(1) AS cnt FROM contacts WHERE gridsquare IS NOT NULL GROUP by SUBSTR(gridsquare,1,4) ORDER BY cnt DESC LIMIT 10\";\n             break;\n         }\n\n         qCDebug(runtime) << stmt;\n\n         QSqlQuery query(stmt);\n\n         drawBarGraphs(ui->statTypeMainCombo->currentText()\n                       + \" \"\n                       + ui->statTypeSecCombo->currentText(),\n                       query);\n\n     }\n     /*************/\n     /* Histogram */\n     /*************/\n     else if ( ui->statTypeMainCombo->currentIndex() == 3 )\n     {\n         QString stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n         case 0:  // Distance\n             QString distCoef = QString::number(Gridsquare::localeDistanceCoef(locale));\n             stmt = QString(\"WITH hist AS ( \"\n                    \" SELECT CAST((distance * %1)/500.00 AS INTEGER) * 500 as dist_floor, \"\n                    \" COUNT(1) AS count \"\n                    \" FROM contacts \"\n                    \" WHERE \" + genericFilter.join(\" AND \") + \" AND distance IS NOT NULL \"\n                    \" GROUP BY 1 \"\n                    \" ORDER BY 1 \"\n                    \" ) \"\n                    //\" SELECT dist_floor || ' - ' || (dist_floor + 500) as dist_range, count \"\n                    \"SELECT dist_floor as dist_range, count \"\n                    \" FROM hist \"\n                    \" ORDER BY 1\").arg(distCoef);\n             break;\n         }\n\n         qCDebug(runtime) << stmt;\n\n         QSqlQuery query(stmt);\n\n         drawBarGraphs(ui->statTypeMainCombo->currentText()\n                       + \" \"\n                       + ui->statTypeSecCombo->currentText(),\n                       query);\n     }\n     /***************/\n     /* Show on Map */\n     /***************/\n     else if ( ui->statTypeMainCombo->currentIndex() == 4 )\n     {\n         QStringList confirmed(\"1=2 \");\n\n         if ( ui->eqslCheckBox->isChecked() )\n             confirmed << \" eqsl_qsl_rcvd = 'Y' \";\n\n         if ( ui->lotwCheckBox->isChecked() )\n             confirmed << \" lotw_qsl_rcvd = 'Y' \";\n\n         if ( ui->paperCheckBox->isChecked() )\n             confirmed << \" qsl_rcvd = 'Y' \";\n\n         QString innerCase = \" CASE WHEN (\" + confirmed.join(\"or\") + \") THEN 1 ELSE 0 END \";\n         QString stmtMyLocations = \"SELECT DISTINCT my_gridsquare FROM contacts WHERE \" + genericFilter.join(\" AND \");\n         QSqlQuery myLocations(stmtMyLocations);\n\n         qCDebug(runtime) << stmtMyLocations;\n\n         drawMyLocationsOnMap(myLocations);\n\n         QString stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n         case 0: // QSOs\n         case 1: // Confirmed & WorkedGrids\n             stmt = \"SELECT callsign, gridsquare, my_gridsquare, SUM(confirmed) FROM (SELECT callsign, gridsquare, my_gridsquare,\"\n                        + innerCase +\" AS confirmed FROM contacts WHERE gridsquare is not NULL AND \"\n                        + genericFilter.join(\" AND \") +\" ) GROUP BY callsign, gridsquare, my_gridsquare\";\n             break;\n         case 2: // ODX\n             QString unit;\n             Gridsquare::distance2localeUnitDistance(0, unit, locale);\n             QString distCoef = QString::number(Gridsquare::localeDistanceCoef(locale));\n             QString sel = QString(\"SELECT callsign || '<br>' || CAST(ROUND(distance * %1,0) AS INT) || ' %2', gridsquare, my_gridsquare, \").arg(distCoef, unit);\n\n             stmt = sel + innerCase + \" AS confirmed FROM contacts WHERE \"\n                        + genericFilter.join(\" AND \") + \" AND distance = (SELECT MAX(distance) FROM contacts WHERE \"\n                        + genericFilter.join(\" AND \") + \")\";\n             break;\n         }\n\n         QSqlQuery query(stmt);\n         qCDebug(runtime) << stmt;\n\n         switch ( ui->statTypeSecCombo->currentIndex() )\n         {\n         case 0:\n         case 2:\n             drawPointsOnMap(query);\n             break;\n\n         case 1:\n             drawFilledGridsOnMap(query);\n             break;\n         }\n\n         ui->stackedWidget->setCurrentIndex(1);\n     }\n}\n\nvoid StatisticsWidget::dateRangeCheckBoxChanged(int)\n{\n    FCT_IDENTIFICATION;\n\n    if ( ui->useDateRangeCheckBox->isChecked() )\n    {\n        ui->startDateEdit->setEnabled(true);\n        ui->endDateEdit->setEnabled(true);\n    }\n    else\n    {\n        ui->startDateEdit->setEnabled(false);\n        ui->endDateEdit->setEnabled(false);\n    }\n\n    refreshGraph();\n}\n\nvoid StatisticsWidget::mapLoaded(bool)\n{\n    FCT_IDENTIFICATION;\n\n    isMainPageLoaded = true;\n\n    /* which layers will be active */\n    postponedScripts += layerControlHandler.generateMapMenuJS(true, false, false, false, false, false, false, false, true);\n    main_page->runJavaScript(postponedScripts);\n\n    layerControlHandler.restoreLayerControlStates(main_page);\n}\n\nvoid StatisticsWidget::changeTheme(int theme, bool isDark)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << theme << isDark;\n\n    QString themeJavaScript;\n\n    if (isDark) /* dark mode */\n        themeJavaScript = \"map.getPanes().tilePane.style.webkitFilter=\\\"brightness(0.6) invert(1) contrast(3) hue-rotate(200deg) saturate(0.3) brightness(0.9)\\\";\";\n    else\n        themeJavaScript = \"map.getPanes().tilePane.style.webkitFilter=\\\"\\\";\";\n\n    if ( !isMainPageLoaded )\n        postponedScripts.append(themeJavaScript);\n    else\n        main_page->runJavaScript(themeJavaScript);\n}\n\nStatisticsWidget::StatisticsWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::StatisticsWidget),\n    main_page(new WebEnginePage(this)),\n    isMainPageLoaded(false),\n    layerControlHandler(\"statistics\", parent)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    ui->myCallCombo->setModel(new QStringListModel(this));\n    ui->myGridCombo->setModel(new QStringListModel(this));\n    ui->myRigCombo->setModel(new QStringListModel(this));\n    ui->myAntennaCombo->setModel(new QStringListModel(this));\n    ui->bandCombo->setModel(new QStringListModel(this));\n    ui->userFilterCombo->setModel(QSOFilterManager::QSOFilterModel(tr(\"No User Filter\"),\n                                                                   ui->userFilterCombo));\n\n    ui->startDateEdit->setDisplayFormat(locale.formatDateTimeShortWithYYYY());\n    ui->startDateEdit->setDate(QDate::currentDate().addDays(DEFAULT_STAT_RANGE));\n    ui->startDateEdit->setTime(QTime::fromMSecsSinceStartOfDay(0));\n    ui->endDateEdit->setDisplayFormat(locale.formatDateTimeShortWithYYYY());\n    ui->endDateEdit->setDate(QDate::currentDate());\n    ui->endDateEdit->setTime(QTime::fromMSecsSinceStartOfDay(86399999));\n\n    ui->graphView->setRenderHint(QPainter::Antialiasing);\n    ui->graphView->setChart(new QChart());\n\n    main_page->setWebChannel(&channel);\n    ui->mapView->setPage(main_page);\n    connect(ui->mapView, &QWebEngineView::loadFinished, this, &StatisticsWidget::mapLoaded);\n    main_page->load(QUrl(QStringLiteral(\"qrc:/res/map/onlinemap.html\")));\n    ui->mapView->setFocusPolicy(Qt::ClickFocus);\n    channel.registerObject(\"layerControlHandler\", &layerControlHandler);\n}\n\nStatisticsWidget::~StatisticsWidget()\n{\n    FCT_IDENTIFICATION;\n    main_page->deleteLater();\n    delete ui;\n}\n\nbool StatisticsWidget::event(QEvent *event)\n{\n    if (event->type() == QEvent::Show)\n    {\n        // We will not use refreshWidget here, even though at first glance it appears\n        // to do the same thing. The difference is that we want class constructor to be as fast as possible.\n        // Therefore, in the constructor, we do not populate the combo boxes. As a result, they are empty\n        // when first displayed and need to be loaded and then combos for Rig, Ant, etc., can be set.\n        refreshCombos();\n        ui->statTypeMainCombo->blockSignals(true);\n        ui->statTypeMainCombo->setCurrentIndex(0);\n        ui->statTypeMainCombo->blockSignals(false);\n        setSubTypesCombo(ui->statTypeMainCombo->currentIndex());\n        ui->myRigCombo->blockSignals(true);\n        ui->myRigCombo->setCurrentIndex(0);\n        ui->myRigCombo->blockSignals(false);\n        ui->myAntennaCombo->blockSignals(true);\n        ui->myAntennaCombo->setCurrentIndex(0);\n        ui->myAntennaCombo->blockSignals(false);\n        ui->userFilterCombo->blockSignals(true);\n        ui->userFilterCombo->setCurrentIndex(0);\n        ui->userFilterCombo->blockSignals(false);\n        refreshGraph();\n    }\n    return QWidget::event(event);  // Propagate the event further\n}\n\nvoid StatisticsWidget::drawBarGraphs(const QString &title, QSqlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n    if ( query.lastQuery().isEmpty() ) return;\n\n    QChart *chart = ui->graphView->chart();\n\n    if ( chart != nullptr )\n        chart->deleteLater();\n\n    chart = new QChart();\n    QBarSet* set = new QBarSet(title, chart);\n    QBarCategoryAxis* axisX = new QBarCategoryAxis(chart);\n    QBarSeries* series = new QBarSeries(chart);\n    QValueAxis *axisY = new QValueAxis(chart);\n\n    while ( query.next() )\n    {\n        axisX->append(query.value(0).toString());\n        *set << query.value(1).toInt();\n    }\n\n    series->append(set);\n    chart->addSeries(series);\n    chart->addAxis(axisX, Qt::AlignBottom);\n    series->attachAxis(axisX);\n\n    axisY->setTickCount(10);\n    chart->addAxis(axisY, Qt::AlignLeft);\n    series->attachAxis(axisY);\n    axisY->applyNiceNumbers();\n    axisY->setLabelFormat(\"%d\");\n\n    series->setLabelsPosition(QAbstractBarSeries::LabelsInsideEnd);\n    series->setLabelsVisible(true);\n\n    chart->setTitle(title);\n    chart->legend()->hide();\n    chart->setAnimationOptions(QChart::SeriesAnimations);\n    chart->layout()->setContentsMargins(0, 0, 0, 0);\n    chart->setBackgroundRoundness(0);\n\n    ui->stackedWidget->setCurrentIndex(0);\n    ui->graphView->setChart(chart);\n}\n\nvoid StatisticsWidget::drawPieGraph(const QString &title, QPieSeries *series)\n{\n    FCT_IDENTIFICATION;\n\n    QChart *chart = ui->graphView->chart();\n\n    if ( chart != nullptr )\n        chart->deleteLater();\n\n    chart = new QChart();\n\n    chart->setAnimationOptions(QChart::SeriesAnimations);\n    chart->addSeries(series);\n    chart->legend()->hide();\n    chart->setTitle(title);\n\n    ui->stackedWidget->setCurrentIndex(0);\n    ui->graphView->setChart(chart);\n}\n\nvoid StatisticsWidget::drawMyLocationsOnMap(QSqlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n    if ( query.lastQuery().isEmpty() )\n        return;\n\n    QStringList locationIcons;\n    QStringList rawLocationsPoint;\n\n    while ( query.next() )\n    {\n        const QString &loc = query.value(0).toString();\n        const Gridsquare stationGrid(loc);\n\n        if ( stationGrid.isValid() )\n        {\n            double lat = stationGrid.getLatitude();\n            double lon = stationGrid.getLongitude();\n            locationIcons.append(QString(\"[\\\"%1\\\", %2, %3, homeIcon]\").arg(loc).arg(lat).arg(lon));\n            rawLocationsPoint.append(QString(\"[%1, %2]\").arg(lat).arg(lon));\n        }\n    }\n\n    QString javaScript = QString(\"grids_confirmed = [];\"\n                                 \"grids_worked = [];\"\n                                 \"drawPointsGroup2([%1]);\"\n                                 \"maidenheadConfWorked.redraw();\"\n                                 \"map.panTo([0, L.latLngBounds([%2]).getCenter().lng]);\").arg(locationIcons.join(\",\"), rawLocationsPoint.join(\",\"));\n\n    qCDebug(runtime) << javaScript;\n\n    if ( !isMainPageLoaded )\n        postponedScripts.append(javaScript);\n    else\n        main_page->runJavaScript(javaScript);\n}\n\nvoid StatisticsWidget::drawPointsOnMap(QSqlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n    if ( query.lastQuery().isEmpty() )\n        return;\n\n    QList<QString> stations;\n    QList<QString> shortPaths;\n\n    qulonglong count = 0;\n\n    while ( query.next() )\n    {\n        const Gridsquare stationGrid(query.value(1).toString());\n        const Gridsquare myStationGrid(query.value(2).toString());\n        if ( stationGrid.isValid() )\n        {\n            count++;\n            double lat = stationGrid.getLatitude();\n            double lon = stationGrid.getLongitude();\n\n            // do not wrap the points\n            double delta = lon - myStationGrid.getLongitude();\n            if ( delta > 180 )\n                lon -= 360;\n            if ( delta < -180 )\n                lon += 360;\n            stations.append(QString(\"[\\\"%1\\\", %2, %3, %4]\").arg(query.value(0).toString())\n                                                           .arg(lat)\n                                                           .arg(lon)\n                                                           .arg((query.value(3).toInt()) > 0 ? \"greenIconSmall\" : \"yellowIconSmall\"));\n            shortPaths.append(QString(\"[%1, %2, %3, %4]\")\n                                  .arg(myStationGrid.getLatitude())\n                                  .arg(myStationGrid.getLongitude())\n                                  .arg(lat)\n                                  .arg(lon));\n        }\n    }\n\n    if ( count > 50000 )\n    {\n        QMessageBox::StandardButton reply;\n        reply = QMessageBox::question(this, tr(\"Statistics\"), tr(\"Over 50000 QSOs. Display them?\"),\n                                      QMessageBox::Yes|QMessageBox::No);\n\n        if ( reply != QMessageBox::Yes )\n            stations.clear();\n    }\n\n    QString javaScript = QString(\"grids_confirmed = [];\"\n                                 \"grids_worked = [];\"\n                                 \"drawPointsBusy([%1], '%2');\"\n                                 \"drawShortPathsBusy([%3], '%4');\"\n                                 \"maidenheadConfWorked.redraw();\").arg(stations.join(\",\"),\n                                                                       tr(\"Rendering QSOs...\"),\n                                                                       shortPaths.join(\",\"),\n                                                                       tr(\"Rendering QSOs...\"));\n\n    qCDebug(runtime) << javaScript;\n\n    if ( !isMainPageLoaded )\n        postponedScripts.append(javaScript);\n    else\n        main_page->runJavaScript(javaScript);\n}\n\nvoid StatisticsWidget::drawFilledGridsOnMap(QSqlQuery &query)\n{\n    FCT_IDENTIFICATION;\n\n\n    if ( query.lastQuery().isEmpty() ) return;\n\n    QList<QString> confirmedGrids;\n    QList<QString> workedGrids;\n\n    while ( query.next() )\n    {\n        if ( query.value(3).toInt() > 0 && ! confirmedGrids.contains(query.value(1).toString()) )\n            confirmedGrids << QString(\"\\\"\" + query.value(1).toString() + \"\\\"\");\n        else\n            workedGrids << QString(\"\\\"\" + query.value(1).toString() + \"\\\"\");\n    }\n\n    QString javaScript = QString(\"grids_confirmed = [ %1 ]; \"\n                                 \"grids_worked = [ %2 ];\"\n                                 \"mylocations = [];\"\n                                 \"drawPointsBusy([], '');\"\n                                 \"drawShortPathsBusy([], '');\"\n                                 \"maidenheadConfWorked.redraw();\").arg(confirmedGrids.join(\",\"), workedGrids.join(\",\"));\n\n    qCDebug(runtime) << javaScript;\n\n    if ( !isMainPageLoaded )\n        postponedScripts.append(javaScript);\n    else\n        main_page->runJavaScript(javaScript);\n}\n\nvoid StatisticsWidget::refreshCombos()\n{\n    FCT_IDENTIFICATION;\n\n    refreshCombo(ui->myCallCombo, QLatin1String(\"SELECT DISTINCT UPPER(station_callsign) FROM contacts ORDER BY station_callsign\"));\n    refreshCombo(ui->myRigCombo, QLatin1String(\"SELECT DISTINCT my_rig FROM contacts ORDER BY my_rig\"));\n    refreshCombo(ui->myAntennaCombo, QLatin1String(\"SELECT DISTINCT my_antenna FROM contacts ORDER BY my_antenna\"));\n    refreshCombo(ui->bandCombo, QLatin1String(\"SELECT DISTINCT band FROM contacts c, bands b WHERE c.band = b.name ORDER BY b.start_freq;\"));\n    refreshCombo(ui->myGridCombo, QLatin1String(\"SELECT DISTINCT UPPER(my_gridsquare) FROM contacts ORDER BY my_gridsquare\"));\n    SqlListModel *sqlModel = qobject_cast<SqlListModel*>(ui->userFilterCombo->model());\n    if ( sqlModel ) sqlModel->refresh();\n}\n\nvoid StatisticsWidget::setSubTypesCombo(int mainTypeIdx)\n{\n    FCT_IDENTIFICATION;\n\n    ui->statTypeSecCombo->blockSignals(true);\n\n    ui->statTypeSecCombo->clear();\n\n    ui->lotwCheckBox->setEnabled(false);\n    ui->eqslCheckBox->setEnabled(false);\n    ui->paperCheckBox->setEnabled(false);\n\n    switch ( mainTypeIdx )\n    {\n    /* QSOs per */\n    case 0:\n    {\n        ui->statTypeSecCombo->addItem(tr(\"Year\"));\n        ui->statTypeSecCombo->addItem(tr(\"Month\"));\n        ui->statTypeSecCombo->addItem(tr(\"Day in Week\"));\n        ui->statTypeSecCombo->addItem(tr(\"Hour\"));\n        ui->statTypeSecCombo->addItem(tr(\"Mode\"));\n        ui->statTypeSecCombo->addItem(tr(\"Band\"));\n        ui->statTypeSecCombo->addItem(tr(\"Continent\"));\n        ui->statTypeSecCombo->addItem(tr(\"Propagation Mode\"));\n    }\n    break;\n\n    /* Percents */\n    case 1:\n    {\n        ui->statTypeSecCombo->addItem(tr(\"Confirmed / Not Confirmed\"));\n    }\n    break;\n\n    /* TOP 10 */\n    case 2:\n    {\n        ui->statTypeSecCombo->addItem(tr(\"Countries\"));\n        ui->statTypeSecCombo->addItem(tr(\"Big Gridsquares\"));\n    }\n    break;\n\n    /* Histogram */\n    case 3:\n    {\n        QString unit;\n        Gridsquare::distance2localeUnitDistance(0, unit, locale);\n        ui->statTypeSecCombo->addItem(tr(\"Distance\") + QString(\" [%1]\").arg(unit));\n    }\n    break;\n\n    /* Show on Map */\n    case 4:\n    {\n        ui->statTypeSecCombo->addItem(tr(\"QSOs\"));\n        ui->statTypeSecCombo->addItem(tr(\"Confirmed/Worked Grids\"));\n        ui->statTypeSecCombo->addItem(tr(\"ODX\"));\n        ui->lotwCheckBox->setEnabled(true);\n        ui->eqslCheckBox->setEnabled(true);\n        ui->paperCheckBox->setEnabled(true);\n    }\n    break;\n    }\n\n    ui->statTypeSecCombo->blockSignals(false);\n}\n\nvoid StatisticsWidget::refreshCombo(QComboBox * combo,\n                                    const QString &sqlQeury)\n{\n    FCT_IDENTIFICATION;\n\n    QString currSelection = combo->currentText();\n\n    combo->blockSignals(true);\n    combo->setModel(new SqlListModel(sqlQeury,tr(\"All\"), this));\n    combo->setCurrentText(currSelection);\n    combo->blockSignals(false);\n}\n"
  },
  {
    "path": "ui/StatisticsWidget.h",
    "content": "#ifndef QLOG_UI_STATISTICSWIDGET_H\n#define QLOG_UI_STATISTICSWIDGET_H\n\n#include <QWidget>\n#include <QSqlQuery>\n#include <QPieSeries>\n#include <QComboBox>\n#include <QWebChannel>\n\n#include \"ui/MapWebChannelHandler.h\"\n#include \"ui/WebEnginePage.h\"\n#include \"core/LogLocale.h\"\n\nnamespace Ui {\nclass StatisticsWidget;\n}\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\nusing namespace QtCharts;\n#endif\n\nclass StatisticsWidget : public QWidget\n{\n    Q_OBJECT\n\npublic slots:\n    void mainStatChanged(int);\n    void dateRangeCheckBoxChanged(int);\n    void mapLoaded(bool);\n    void changeTheme(int, bool isDark);\n    void refreshWidget();\n\nprivate slots:\n    void refreshGraph();\n\npublic:\n    explicit StatisticsWidget(QWidget *parent = nullptr);\n    ~StatisticsWidget();\n\nprotected:\n    bool event(QEvent *event) override;\n\nprivate:\n\n    void drawBarGraphs(const QString &title, QSqlQuery &query);\n    void drawPieGraph(const QString &title, QPieSeries* series);\n    void drawMyLocationsOnMap(QSqlQuery &);\n    void drawPointsOnMap(QSqlQuery&);\n    void drawFilledGridsOnMap(QSqlQuery&);\n    void refreshCombos();\n    void setSubTypesCombo(int mainTypeIdx);\n    void refreshCombo(QComboBox * combo, const QString &sqlQeury);\n\nprivate:\n    Ui::StatisticsWidget *ui;\n    WebEnginePage *main_page;\n    bool isMainPageLoaded;\n    QString postponedScripts;\n    QWebChannel channel;\n    MapWebChannelHandler layerControlHandler;\n    LogLocale locale;\n\n\n    // default statistics interval [in days]\n    const int DEFAULT_STAT_RANGE = -1;\n\n};\n\n#endif // QLOG_UI_STATISTICSWIDGET_H\n"
  },
  {
    "path": "ui/StatisticsWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>StatisticsWidget</class>\n <widget class=\"QWidget\" name=\"StatisticsWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>1058</width>\n    <height>730</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Statistics</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"spacing\">\n    <number>2</number>\n   </property>\n   <property name=\"leftMargin\">\n    <number>6</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>6</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>6</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>6</number>\n   </property>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n     <property name=\"topMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <property name=\"spacing\">\n        <number>9</number>\n       </property>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox\">\n         <property name=\"title\">\n          <string/>\n         </property>\n         <layout class=\"QGridLayout\" name=\"gridLayout\">\n          <property name=\"leftMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"spacing\">\n           <number>3</number>\n          </property>\n          <item row=\"2\" column=\"0\">\n           <widget class=\"QLabel\" name=\"rangeLabel\">\n            <property name=\"text\">\n             <string>Date Range</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"1\">\n           <widget class=\"QComboBox\" name=\"userFilterCombo\"/>\n          </item>\n          <item row=\"2\" column=\"1\" colspan=\"3\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n            <item>\n             <widget class=\"QCheckBox\" name=\"useDateRangeCheckBox\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string/>\n              </property>\n              <property name=\"checked\">\n               <bool>false</bool>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QDateTimeEdit\" name=\"startDateEdit\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"buttonSymbols\">\n               <enum>QAbstractSpinBox::UpDownArrows</enum>\n              </property>\n              <property name=\"specialValueText\">\n               <string/>\n              </property>\n              <property name=\"keyboardTracking\">\n               <bool>true</bool>\n              </property>\n              <property name=\"showGroupSeparator\" stdset=\"0\">\n               <bool>false</bool>\n              </property>\n              <property name=\"date\">\n               <date>\n                <year>1999</year>\n                <month>12</month>\n                <day>25</day>\n               </date>\n              </property>\n              <property name=\"displayFormat\">\n               <string notr=\"true\">yyyy-MM-dd HH:mm</string>\n              </property>\n              <property name=\"calendarPopup\">\n               <bool>true</bool>\n              </property>\n              <property name=\"timeSpec\">\n               <enum>Qt::UTC</enum>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QLabel\" name=\"toLabel\">\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"text\">\n               <string>to</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QDateTimeEdit\" name=\"endDateEdit\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"sizePolicy\">\n               <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n                <horstretch>0</horstretch>\n                <verstretch>0</verstretch>\n               </sizepolicy>\n              </property>\n              <property name=\"wrapping\">\n               <bool>false</bool>\n              </property>\n              <property name=\"frame\">\n               <bool>true</bool>\n              </property>\n              <property name=\"keyboardTracking\">\n               <bool>true</bool>\n              </property>\n              <property name=\"showGroupSeparator\" stdset=\"0\">\n               <bool>false</bool>\n              </property>\n              <property name=\"displayFormat\">\n               <string notr=\"true\">yyyy-MM-dd HH:mm</string>\n              </property>\n              <property name=\"calendarPopup\">\n               <bool>true</bool>\n              </property>\n              <property name=\"timeSpec\">\n               <enum>Qt::UTC</enum>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <spacer name=\"horizontalSpacer\">\n              <property name=\"orientation\">\n               <enum>Qt::Horizontal</enum>\n              </property>\n              <property name=\"sizeHint\" stdset=\"0\">\n               <size>\n                <width>40</width>\n                <height>20</height>\n               </size>\n              </property>\n             </spacer>\n            </item>\n           </layout>\n          </item>\n          <item row=\"0\" column=\"2\">\n           <widget class=\"QLabel\" name=\"bandLabel\">\n            <property name=\"text\">\n             <string>Band</string>\n            </property>\n            <property name=\"alignment\">\n             <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"0\">\n           <widget class=\"QLabel\" name=\"userFilterLabel\">\n            <property name=\"text\">\n             <string>User Filter</string>\n            </property>\n            <property name=\"alignment\">\n             <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>\n            </property>\n           </widget>\n          </item>\n          <item row=\"0\" column=\"3\">\n           <widget class=\"QComboBox\" name=\"bandCombo\"/>\n          </item>\n          <item row=\"1\" column=\"0\">\n           <widget class=\"QLabel\" name=\"label_2\">\n            <property name=\"text\">\n             <string>Confirmed by</string>\n            </property>\n           </widget>\n          </item>\n          <item row=\"1\" column=\"1\">\n           <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n            <item>\n             <widget class=\"QCheckBox\" name=\"lotwCheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"text\">\n               <string>LoTW</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"eqslCheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"text\">\n               <string>eQSL</string>\n              </property>\n             </widget>\n            </item>\n            <item>\n             <widget class=\"QCheckBox\" name=\"paperCheckBox\">\n              <property name=\"enabled\">\n               <bool>false</bool>\n              </property>\n              <property name=\"text\">\n               <string>Paper</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"groupBox_2\">\n         <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n          <property name=\"leftMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"topMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"rightMargin\">\n           <number>0</number>\n          </property>\n          <property name=\"bottomMargin\">\n           <number>0</number>\n          </property>\n          <item>\n           <widget class=\"QLabel\" name=\"label\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"text\">\n             <string>Graph Type</string>\n            </property>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QComboBox\" name=\"statTypeMainCombo\">\n            <property name=\"sizePolicy\">\n             <sizepolicy hsizetype=\"Fixed\" vsizetype=\"Fixed\">\n              <horstretch>0</horstretch>\n              <verstretch>0</verstretch>\n             </sizepolicy>\n            </property>\n            <property name=\"layoutDirection\">\n             <enum>Qt::LeftToRight</enum>\n            </property>\n            <property name=\"insertPolicy\">\n             <enum>QComboBox::NoInsert</enum>\n            </property>\n            <property name=\"sizeAdjustPolicy\">\n             <enum>QComboBox::AdjustToContentsOnFirstShow</enum>\n            </property>\n            <item>\n             <property name=\"text\">\n              <string>QSOs per</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Percents</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Top 10</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Histogram</string>\n             </property>\n            </item>\n            <item>\n             <property name=\"text\">\n              <string>Show on Map</string>\n             </property>\n            </item>\n           </widget>\n          </item>\n          <item>\n           <widget class=\"QComboBox\" name=\"statTypeSecCombo\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <widget class=\"QGroupBox\" name=\"groupBox_3\">\n       <property name=\"title\">\n        <string/>\n       </property>\n       <layout class=\"QFormLayout\" name=\"formLayout\">\n        <property name=\"horizontalSpacing\">\n         <number>3</number>\n        </property>\n        <property name=\"verticalSpacing\">\n         <number>10</number>\n        </property>\n        <property name=\"leftMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"topMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"rightMargin\">\n         <number>0</number>\n        </property>\n        <property name=\"bottomMargin\">\n         <number>0</number>\n        </property>\n        <item row=\"0\" column=\"0\">\n         <widget class=\"QLabel\" name=\"myCalLabel\">\n          <property name=\"text\">\n           <string>My Callsign</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"0\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"myCallCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"0\">\n         <widget class=\"QLabel\" name=\"myGridLabel\">\n          <property name=\"text\">\n           <string>My Gridsquare</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"1\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"myGridCombo\"/>\n        </item>\n        <item row=\"2\" column=\"0\">\n         <widget class=\"QLabel\" name=\"myRigLabel\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string>My Rig</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"2\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"myRigCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"0\">\n         <widget class=\"QLabel\" name=\"myAntennaLabel\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Preferred\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string>My Antenna</string>\n          </property>\n         </widget>\n        </item>\n        <item row=\"3\" column=\"1\">\n         <widget class=\"QComboBox\" name=\"myAntennaCombo\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n         </widget>\n        </item>\n       </layout>\n      </widget>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QStackedWidget\" name=\"stackedWidget\">\n     <property name=\"currentIndex\">\n      <number>1</number>\n     </property>\n     <widget class=\"QWidget\" name=\"graphPage\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <property name=\"spacing\">\n        <number>2</number>\n       </property>\n       <property name=\"leftMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>2</number>\n       </property>\n       <item>\n        <widget class=\"QChartView\" name=\"graphView\"/>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"mapPage\">\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <property name=\"spacing\">\n        <number>2</number>\n       </property>\n       <property name=\"leftMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"topMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"rightMargin\">\n        <number>2</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>2</number>\n       </property>\n       <item>\n        <widget class=\"QWebEngineView\" name=\"mapView\">\n         <property name=\"contextMenuPolicy\">\n          <enum>Qt::NoContextMenu</enum>\n         </property>\n        </widget>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <customwidgets>\n  <customwidget>\n   <class>QWebEngineView</class>\n   <extends>QWidget</extends>\n   <header location=\"global\">QtWebEngineWidgets/QWebEngineView</header>\n  </customwidget>\n  <customwidget>\n   <class>QChartView</class>\n   <extends>QGraphicsView</extends>\n   <header>QtCharts</header>\n  </customwidget>\n </customwidgets>\n <tabstops>\n  <tabstop>userFilterCombo</tabstop>\n  <tabstop>bandCombo</tabstop>\n  <tabstop>lotwCheckBox</tabstop>\n  <tabstop>eqslCheckBox</tabstop>\n  <tabstop>paperCheckBox</tabstop>\n  <tabstop>useDateRangeCheckBox</tabstop>\n  <tabstop>startDateEdit</tabstop>\n  <tabstop>endDateEdit</tabstop>\n  <tabstop>statTypeMainCombo</tabstop>\n  <tabstop>statTypeSecCombo</tabstop>\n  <tabstop>myCallCombo</tabstop>\n  <tabstop>myGridCombo</tabstop>\n  <tabstop>myRigCombo</tabstop>\n  <tabstop>myAntennaCombo</tabstop>\n  <tabstop>graphView</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>statTypeMainCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>mainStatChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>594</x>\n     <y>85</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>642</x>\n     <y>303</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>useDateRangeCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>dateRangeCheckBoxChanged(int)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>253</x>\n     <y>185</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>642</x>\n     <y>303</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>statTypeSecCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>818</x>\n     <y>85</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>745</x>\n     <y>604</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myGridCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>594</x>\n     <y>137</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>604</x>\n     <y>599</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>234</x>\n     <y>137</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>387</x>\n     <y>602</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myAntennaCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>1042</x>\n     <y>137</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>1001</x>\n     <y>605</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myRigCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>818</x>\n     <y>137</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>1102</x>\n     <y>606</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>startDateEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>412</x>\n     <y>191</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>234</x>\n     <y>602</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>endDateEdit</sender>\n   <signal>dateTimeChanged(QDateTime)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>593</x>\n     <y>191</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>79</x>\n     <y>603</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>bandCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>818</x>\n     <y>190</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>657</x>\n     <y>504</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>lotwCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>525</x>\n     <y>221</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>657</x>\n     <y>504</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>eqslCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>671</x>\n     <y>221</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>657</x>\n     <y>504</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>paperCheckBox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>817</x>\n     <y>221</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>657</x>\n     <y>504</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>userFilterCombo</sender>\n   <signal>currentIndexChanged(int)</signal>\n   <receiver>StatisticsWidget</receiver>\n   <slot>refreshGraph()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>216</x>\n     <y>27</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>528</x>\n     <y>364</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>mainStatChanged(int)</slot>\n  <slot>refreshGraph()</slot>\n  <slot>dateRangeCheckBoxChanged(int)</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/UploadQSODialog.cpp",
    "content": "#include <qpushbutton.h>\n#include <QProgressDialog>\n#include <QMessageBox>\n#include \"UploadQSODialog.h\"\n#include \"ui_UploadQSODialog.h\"\n#include \"core/debug.h\"\n#include \"models/SqlListModel.h\"\n#include \"core/LogParam.h\"\n#include \"data/StationProfile.h\"\n#include \"service/clublog/ClubLog.h\"\n#include \"service/eqsl/Eqsl.h\"\n#include \"service/lotw/Lotw.h\"\n#include \"service/qrzcom/QRZ.h\"\n#include \"service/hrdlog/HRDLog.h\"\n#include \"service/cloudlog/Cloudlog.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.uploadqsodialog\");\n\nUploadQSODialog::UploadQSODialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::UploadQSODialog),\n    detailQSOsModel(new QStandardItemModel(this)),\n    executeQueryEnabled(false)\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    onlineServices.insert(LOTWID, UploadTask(LOTWID,\n                                       tr(\"LoTW\"),\n                                       new LotwUploader(this),\n                                       \"lotw_qsl_sent\",\n                                       \"lotw_qslsdate\",\n                                       ui->lotwCheckbox,\n                                       ui->lotwNumberLabel,\n                                       !LotwBase::getUsername().isEmpty()));\n\n    onlineServices.insert(EQSLID, UploadTask(EQSLID,\n                                       tr(\"eQSL\"),\n                                       new EQSLUploader(this),\n                                       \"eqsl_qsl_sent\",\n                                       \"eqsl_qslsdate\",\n                                       ui->eqslCheckbox,\n                                       ui->eqslNumberLabel,\n                                       !EQSLBase::getUsername().isEmpty()));\n\n    onlineServices.insert(CLUBLOGID, UploadTask(CLUBLOGID,\n                                          tr(\"Clublog\"),\n                                          new ClubLogUploader(this),\n                                          \"clublog_qso_upload_status\",\n                                          \"clublog_qso_upload_date\",\n                                          ui->clublogCheckbox,\n                                          ui->clublogNumberLabel,\n                                          !ClubLogBase::getEmail().isEmpty()));\n\n    onlineServices.insert(HRDLOGID, UploadTask(HRDLOGID,\n                                         tr(\"HRDLog\"),\n                                         new HRDLogUploader(this),\n                                         \"hrdlog_qso_upload_status\",\n                                         \"hrdlog_qso_upload_date\",\n                                         ui->hrdlogCheckbox,\n                                         ui->hrdlogNumberLabel,\n                                         !HRDLogBase::getRegisteredCallsign().isEmpty()));\n\n    onlineServices.insert(QRZCOMID, UploadTask(QRZCOMID,\n                                         tr(\"QRZ.com\"),\n                                         new QRZUploader(this),\n                                         \"qrzcom_qso_upload_status\",\n                                         \"qrzcom_qso_upload_date\",\n                                         ui->qrzCheckbox,\n                                         ui->qrzNumberLabel,\n                                        !QRZBase::getLogbookAPIKey(QRZBase::getInternalAPIUsername()).isEmpty()));\n\n    onlineServices.insert(WAVELOGID, UploadTask(WAVELOGID,\n                                         tr(\"Wavelog\"),\n                                         new CloudlogUploader(this),\n                                         \"contacts_autovalue.wavelog_qso_upload_status\",\n                                         \"contacts_autovalue.wavelog_qso_upload_date\",\n                                         ui->wavelogCheckbox,\n                                         ui->wavelogNumberLabel,\n                                        !CloudlogBase::getLogbookAPIKey().isEmpty()));\n\n    ui->buttonBox->button(QDialogButtonBox::Ok)->setText(tr(\"&Upload\"));\n\n    ui->myCallsignCombo->blockSignals(true);\n    ui->myGridCombo->blockSignals(true);\n\n    // based on LoTW source code and ADIF spec - priority STATION_CALLSIGN, OPERATOR\n    ui->myCallsignCombo->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(COALESCE(NULLIF(TRIM(station_callsign), ''), TRIM(operator))) \"\n                                                   \"FROM contacts \"\n                                                   \"WHERE station_callsign IS NOT NULL OR operator IS NOT NULL \"\n                                                   \"ORDER BY station_callsign\", \"\", ui->myCallsignCombo));\n    ui->myStationProfileCombo->setModel(new SqlListModel(\"SELECT DISTINCT profile_name FROM station_profiles ORDER BY profile_name\", \"\", ui->myStationProfileCombo));\n\n    setEQSLSettingVisible(false);\n    setClublogSettingVisible(false);\n    setLotwSettingVisible(false);\n    setQSODetailVisible(false);\n    setWavelogSettingVisible(false);\n\n    // First entry is empty (no -l argument will be passed to TQSL).\n    tqslLocations = LotwBase::getTQSLStationLocations();\n    ui->lotwLocationCombo->addItem(tr(\"Unspecified\"), QString());\n    for ( const TQSLStationLocation &loc : static_cast<const QList<TQSLStationLocation>>(tqslLocations) )\n    {\n        QString displayText = loc.name;\n        QStringList details;\n        if ( !loc.callsign.isEmpty() )\n            details << loc.callsign;\n        if ( !loc.grid.isEmpty() )\n            details << loc.grid.toUpper();\n        if ( !details.isEmpty() )\n            displayText += \" (\" + details.join(\", \") + \")\";\n        ui->lotwLocationCombo->addItem(displayText, loc.name);\n    }\n\n    connect(ui->lotwLocationCombo, QOverload<int>::of(&QComboBox::currentIndexChanged),\n            this, &UploadQSODialog::updateLotwLocationWarning);\n\n    loadDialogState();\n    getWavelogStationID();\n    ui->myCallsignCombo->blockSignals(false);\n    ui->myGridCombo->blockSignals(false);\n    executeQueryEnabled = true;\n    executeQuery();\n}\n\nUploadQSODialog::~UploadQSODialog()\n{\n    FCT_IDENTIFICATION;\n\n    allSelectedQSOs.clear();\n    detailQSOsModel->deleteLater();\n    delete ui;\n}\n\nvoid UploadQSODialog::showQSODetails()\n{\n    FCT_IDENTIFICATION;\n\n    setQSODetailVisible(!ui->detailQSOView->isVisible());\n}\n\nvoid UploadQSODialog::setEQSLSettingVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->eqslGroup->setVisible(visible);\n    adjustSize();\n}\n\nvoid UploadQSODialog::setClublogSettingVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->clublogGroup->setVisible(visible);\n    adjustSize();\n}\n\nvoid UploadQSODialog::setLotwSettingVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->lotwGroup->setVisible(visible);\n    adjustSize();\n}\n\nvoid UploadQSODialog::setWavelogSettingVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->wavelogGroup->setVisible(visible);\n    adjustSize();\n}\n\nvoid UploadQSODialog::setQSODetailVisible(bool visible)\n{\n    FCT_IDENTIFICATION;\n\n    ui->detailQSOView->setVisible(visible);\n    ui->line->setVisible(visible);\n    ui->showQSOButton->setText(visible ? tr(\"Hide QSOs...\") : tr(\"Show QSOs...\"));\n    adjustSize();\n}\n\nvoid UploadQSODialog::loadDialogState()\n{\n    FCT_IDENTIFICATION;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    ui->clublogCheckbox->setChecked(ui->clublogCheckbox->isEnabled() && LogParam::getUploadServiceState(\"clublog\"));\n    ui->eqslCheckbox->setChecked(ui->eqslCheckbox->isEnabled() && LogParam::getUploadServiceState(\"eqsl\"));\n    ui->lotwCheckbox->setChecked(ui->lotwCheckbox->isEnabled() && LogParam::getUploadServiceState(\"lotw\"));\n    ui->hrdlogCheckbox->setChecked(ui->hrdlogCheckbox->isEnabled() && LogParam::getUploadServiceState(\"hrdlog\"));\n    ui->qrzCheckbox->setChecked(ui->qrzCheckbox->isEnabled() && LogParam::getUploadServiceState(\"qrzcom\"));\n    ui->wavelogCheckbox->setChecked(ui->wavelogCheckbox->isEnabled() && LogParam::getUploadServiceState(\"wavelog\"));\n\n    int index = ui->myCallsignCombo->findText(profile.callsign);\n\n    if ( index >= 0 )\n        ui->myCallsignCombo->setCurrentIndex(index);\n    else\n        ui->myCallsignCombo->setCurrentText(LogParam::getUploadQSOLastCall());\n\n    handleCallsignChange(ui->myCallsignCombo->currentText());\n\n    ui->myGridCombo->setCurrentIndex(0); // ANY value\n\n    index = ui->myStationProfileCombo->findText(profile.profileName);\n    ui->myStationProfileCombo->setCurrentIndex( ( index >= 0 ) ? index : -1);\n\n    ui->eqslQSLComment->setChecked(LogParam::getUploadeqslQSLComment());\n    ui->eqslQSLMessage->setChecked(LogParam::getUploadeqslQSLMessage());\n    ui->eqslQTHProfileEdit->setText(LogParam::getUploadeqslQTHProfile());\n    ui->myStationProfileCheckbox->setChecked(LogParam::getUploadQSOFilterType() == 1);\n    ui->wavelogStationIDSpin->setValue(LogParam::getCloudlogStationID());\n\n    const int locIdx = ui->lotwLocationCombo->findData(LogParam::getUploadLoTWLocation());\n    ui->lotwLocationCombo->setCurrentIndex(locIdx >= 0 ? locIdx : 0);\n\n    updateLotwLocationWarning();\n}\n\nvoid UploadQSODialog::saveDialogState()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setUploadServiceState(\"clublog\", ui->clublogCheckbox->isChecked());\n    LogParam::setUploadServiceState(\"eqsl\", ui->eqslCheckbox->isChecked());\n    LogParam::setUploadServiceState(\"lotw\", ui->lotwCheckbox->isChecked());\n    LogParam::setUploadServiceState(\"hrdlog\", ui->hrdlogCheckbox->isChecked());\n    LogParam::setUploadServiceState(\"qrzcom\", ui->qrzCheckbox->isChecked());\n    LogParam::setUploadServiceState(\"wavelog\", ui->wavelogCheckbox->isChecked());\n    LogParam::setUploadQSOLastCall(ui->myCallsignCombo->currentText());\n    LogParam::setUploadeqslQSLComment(ui->eqslQSLComment->isChecked());\n    LogParam::setUploadeqslQSLMessage(ui->eqslQSLMessage->isChecked());\n    LogParam::setUploadeqslQTHProfile(ui->eqslQTHProfileEdit->text());\n    LogParam::setUploadQSOFilterType(ui->myCallsignCheckbox->isChecked() ? 0 : 1);\n    LogParam::setCloudlogStationID(ui->wavelogStationIDSpin->value());\n    LogParam::setUploadLoTWLocation(ui->lotwLocationCombo->currentData().toString());\n}\n\nvoid UploadQSODialog::processNextUploader()\n{\n    FCT_IDENTIFICATION;\n\n    if ( uploadTaskQueue.isEmpty() )\n    {\n        uploadFinished();\n        return;\n    }\n\n    currentTask = uploadTaskQueue.takeFirst();\n    GenericQSOUploader *uploader = currentTask.getUploader();\n\n    if ( !uploader )\n    {\n        qWarning() << \"Uploader is null - skipping\";\n        uploadFinished();\n        return;\n    }\n\n    qCDebug(runtime) << \"Uploading to\" << currentTask.getServiceName();\n\n    QProgressDialog* dialog = new QProgressDialog(tr(\"Uploading to %1\").arg(currentTask.getServiceName()),\n                                                  tr(\"Cancel\"), 0, 0, this);\n    dialog->setWindowModality(Qt::WindowModal);\n    dialog->setValue(0);\n    dialog->setAttribute(Qt::WA_DeleteOnClose, true);\n    dialog->show();\n\n    connect(uploader, &GenericQSOUploader::uploadedQSO, this, [this, dialog, uploader](qulonglong qsoID)\n    {\n        // this part updates one QSO - it is use in case of services when a batch upload\n        // is not supported\n        qCDebug(runtime) << \"signal uploadedQSO\";\n\n        QString contactIDField(\"id\");\n        QString tableName(\"contacts\");\n        QString statusField = currentTask.getDBUploadStatusFieldName();\n        QString dateField = currentTask.getDBUploadDateFieldName();\n\n        if ( currentTask.getServiceID() == WAVELOGID )\n        {\n             statusField.remove(\"contacts_autovalue.\"); // sqlite does not support aliases in the Update statement.\n             dateField.remove(\"contacts_autovalue.\");\n             contactIDField = \"contactid\";\n             tableName = \"contacts_autovalue\";\n        }\n\n        const QString &statement = QString(\"UPDATE %1 \"\n                                          \"SET %2='Y', %3 = strftime('%Y-%m-%d',DATETIME('now', 'utc')) \"\n                                          \"WHERE %4 = :qsoID\").arg(tableName, statusField, dateField, contactIDField);\n\n        qCDebug(runtime) << statement;\n\n        // update in-DB record\n        QSqlQuery updateQuery;\n        updateQuery.prepare(statement);\n        updateQuery.bindValue(\":qsoID\", qsoID);\n\n        if ( ! updateQuery.exec() )\n        {\n            const QString &taskName = currentTask.getServiceName();\n            qWarning() << \"Cannot Update\" << taskName\n                       << \"Upload status for QSO number \" << qsoID\n                       << updateQuery.lastError().text();\n            uploader->abortRequest();\n            dialog->done(QDialog::Accepted);\n            QMessageBox::warning(this, tr(\"QLog Warning - %1\").arg(taskName), tr(\"Cannot update QSO Status\"));\n            processNextUploader();\n        }\n\n        // update in-memory record\n        auto recordRef = allSelectedQSOs.value(qsoID);\n        if ( !recordRef.isNull() )\n        {\n            recordRef->setValue(statusField, \"Y\");\n\n            // I don't know but it seems that RETURNING clause does not work under QT.\n            // So I'll set it to the current QT date.\n            recordRef->setValue(dateField, QDateTime::currentDateTimeUtc().date().toString(Qt::ISODate));\n        }\n\n        dialog->setValue(dialog->value() + 1);\n    });\n\n    connect(uploader, &GenericQSOUploader::uploadFinished, this, [dialog, this]()\n    {\n        qCDebug(runtime) << \"signal uploadFinished\";\n\n        // this part updates all uploaded QSOs - it is use in case of services when a batch upload\n        // is supported\n\n        dialog->done(QDialog::Accepted);\n        if ( currentTask.getServiceID() != HRDLOGID\n             && currentTask.getServiceID() != QRZCOMID\n             && currentTask.getServiceID() != WAVELOGID )\n        {\n\n            const QString statusField = currentTask.getDBUploadStatusFieldName();\n            const QString dateField = currentTask.getDBUploadDateFieldName();\n            const QList<qulonglong> idsToUpdate = currentTask.getQSOIDs();\n\n            QStringList idStrings;\n\n            for ( qulonglong id : idsToUpdate )\n                idStrings.append(QString::number(id));\n\n            QString statement = QString(\"UPDATE contacts \"\n                                        \"SET %1='Y', %2 = strftime('%Y-%m-%d',DATETIME('now', 'utc')) \"\n                                        \"WHERE id IN (%3) \").arg(statusField, dateField, idStrings.join(\",\"));\n\n            QSqlQuery updateQuery;\n            updateQuery.prepare(statement);\n\n            if ( !updateQuery.exec() )\n                qWarning() << \"Cannot update\" << currentTask.getServiceName()\n                           << \"Upload status in DB\" << updateQuery.lastError().text();\n            else\n                currentTask.updateAllDBFieldValue(statusField, \"Y\",\n                                                  dateField, QDateTime::currentDateTimeUtc().date().toString(Qt::ISODate));\n        }\n        processNextUploader();\n    });\n\n    connect(uploader, &GenericQSOUploader::uploadError, this, [this, dialog](const QString &msg)\n    {\n        qWarning() <<  currentTask.getServiceName() << \"Upload Error: \" << msg;\n        dialog->done(QDialog::Accepted);\n        QMessageBox::warning(this, tr(\"QLog Warning - %1\").arg(currentTask.getServiceName()),\n                             tr(\"Cannot upload the QSO(s): \") + msg);\n        processNextUploader();\n    });\n\n    connect(dialog, &QProgressDialog::canceled, this, [this, uploader]()\n    {\n        qCDebug(runtime)<< \"Operation canceled\";\n        uploader->abortRequest();\n        uploadFinished();\n    });\n\n    QVariantMap uploadConfig;\n\n    // Special params for selected services\n    switch ( currentTask.getServiceID() )\n    {\n    case LOTWID:\n    {\n        // Pass the selected TQSL location as -l argument; index 0 = let TQSL choose\n        if ( ui->lotwLocationCombo->currentIndex() > 0)\n            uploadConfig = LotwUploader::generateUploadConfigMap(ui->lotwLocationCombo->currentData().toString());\n        break;\n    }\n    case EQSLID:\n        uploadConfig = EQSLUploader::generateUploadConfigMap(ui->eqslQTHProfileEdit->text(),\n                                                             ui->eqslQSLNone->isChecked(),\n                                                             ui->eqslQSLComment->isChecked());\n        break;\n    case CLUBLOGID:\n        uploadConfig = ClubLogUploader::generateUploadConfigMap(ui->myCallsignCombo->currentText(),\n                                                                ui->clublogClearCheckbox->isChecked());\n        break;\n    case WAVELOGID:\n        uploadConfig = CloudlogUploader::generateUploadConfigMap(ui->wavelogStationIDSpin->value());\n        break;\n    default:\n        break;\n    }\n\n    const QList<QSqlRecord> &list = currentTask.getQSOList();\n\n    // set progress bar range for services that do not support the batch upload\n    if ( currentTask.getServiceID() == HRDLOGID\n         || currentTask.getServiceID() == QRZCOMID\n         || currentTask.getServiceID() == WAVELOGID )\n        dialog->setRange(0, list.size());\n\n    uploader->uploadQSOList(list, uploadConfig);\n}\n\nvoid UploadQSODialog::startUploadQueue()\n{\n    FCT_IDENTIFICATION;\n\n    saveDialogState();\n\n    for ( auto it = onlineServices.begin(); it != onlineServices.end(); ++it )\n        if ( !it.value().isQSOListEmpty() )\n            uploadTaskQueue.append(it.value());\n\n    if ( uploadTaskQueue.isEmpty() )\n    {\n         QMessageBox::information(this, tr(\"QLog Information\"), tr(\"No QSO found to upload.\"));\n         return;\n    }\n\n    processNextUploader();\n}\n\nvoid UploadQSODialog::uploadFinished()\n{\n    FCT_IDENTIFICATION;\n\n    QMessageBox::information(this, tr(\"QLog Information\"), tr(\"QSO(s) were uploaded to the selected services\"));\n    accept();\n}\n\nvoid UploadQSODialog::updateQSONumbers()\n{\n    FCT_IDENTIFICATION;\n\n    for ( auto it = onlineServices.begin(); it != onlineServices.end(); ++it )\n        it->updateQSONumberLabel();\n}\n\nvoid UploadQSODialog::getWavelogStationID()\n{\n    FCT_IDENTIFICATION;\n\n    CloudlogUploader *ptr = qobject_cast<CloudlogUploader*>(onlineServices.value(WAVELOGID).getUploader());\n\n    if ( ptr )\n    {\n        connect(ptr, &CloudlogUploader::stationIDsUpdated, this, [ptr, this]()\n        {\n            availableWavelogStationIDs = ptr->getAvailableStationIDs();\n            updateWavelogStationLabel();\n        });\n\n        ptr->sendStationInfoReq();\n    }\n}\n\nvoid UploadQSODialog::executeQuery()\n{\n    FCT_IDENTIFICATION;\n\n    if ( !executeQueryEnabled )\n    {\n        qCDebug(runtime) << \"query disabled\";\n        return;\n    }\n\n    allSelectedQSOs.clear();\n    detailQSOsModel->clear();\n    detailQSOsModel->setHorizontalHeaderLabels({tr(\"Time\"), tr(\"Callsign\"), tr(\"Mode\"), tr(\"Upload to\")});\n\n    QStringList qslUploadStatuses = {\"'M'\", \"'R'\", \"'Q'\"}; // joined \"Upload status\" and \"sent status\"\n    if ( ui->includeStatusNoCheckbox->isChecked() ) qslUploadStatuses << \"'N'\";\n    if ( ui->includeIgnoreCheckbox->isChecked() ) qslUploadStatuses << \"'I'\";\n\n    const QString whereTemplate(\"((UPPER(%1) in (%2) OR %1 IS NULL) %3)\");\n    const QString statusColumnTemplate(\"CASE WHEN (%1) THEN 1 ELSE 0 END AS status_%2\");\n    QStringList serviceSelectConditions;\n    QStringList serviceStatusColumns;\n\n    // prepare all params for building WHERE Clause\n    for ( auto it = onlineServices.begin(); it != onlineServices.end(); ++it )\n    {\n        UploadTask &task = it.value();\n        task.clearEnqueuedQSOs();\n\n        if ( !task.isChecked() ) continue;\n\n        QStringList uploadStatuses(qslUploadStatuses);\n\n        if ( it.key() == WAVELOGID )\n        {\n            if ( ui->wavelogReuploadCheckbox->isChecked() )\n                uploadStatuses << \"'Y'\";\n            else\n                // Wavelog reports duplicates as errors with translated error messages.\n                // QLog cannot reliably distinguish between a duplicate and a real error.\n                // Therefore, it is necessary to ensure that QLog sends only\n                // new QSOs to Cloudlog/Wavelog.\n                // Currently only two statues are use for Wavelog - Y/M - removing M (Modified)\n                uploadStatuses.removeAll(\"'M'\");\n        }\n\n        if ( it.key() == CLUBLOGID && ui->clublogClearCheckbox->isChecked() )\n        {\n            //reupload all QSOs (except N)\n            uploadStatuses << \"'Y'\";\n        }\n\n        QString addlCondition = ( it.key() == LOTWID && ui->lotwCheckbox->isChecked() )\n                                ? \"AND (upper(prop_mode) NOT IN ('INTERNET', 'RPT', 'ECH', 'IRL') OR prop_mode IS NULL)\"\n                                : \"\";\n\n        const QString serviceSelectCondition = whereTemplate.arg(task.getDBUploadStatusFieldName(),\n                                                                 uploadStatuses.join(\",\"),\n                                                                 addlCondition);\n        serviceSelectConditions << serviceSelectCondition;\n        serviceStatusColumns << statusColumnTemplate.arg(serviceSelectCondition,\n                                                         QString::number(task.getServiceID()));\n    }\n\n    const StationProfile &selectedStationProfile = StationProfilesManager::instance()->getProfile(ui->myStationProfileCombo->currentText());\n\n    if ( ui->myStationProfileCheckbox->isChecked() )\n    {\n        QString toolTip = tr(\"The values below will be used when an input record does not contain the ADIF values\") + \"<br/>\"\n                             + selectedStationProfile.toHTMLString();\n        ui->myStationProfileCombo->setToolTip(toolTip);\n    }\n\n    if ( serviceSelectConditions.isEmpty() )\n    {\n        updateQSONumbers();\n        qCDebug(runtime) << \"No service checked\";\n        ui->detailQSOView->setModel(nullptr);\n        return;\n    }\n\n    QString selectStatement;\n    QStringList whereParts;\n\n    whereParts << \"(\" + serviceSelectConditions.join(\" OR \") + \")\";\n\n    // Prepare Upload QSO Query\n    QSqlQuery uploadQSOQuery;\n\n    if ( ui->myCallsignCheckbox->isChecked() )\n    {\n        whereParts << QLatin1String(\"COALESCE(NULLIF(TRIM(station_callsign), ''), TRIM(operator)) = :station_callsign\");\n\n        if ( !ui->myGridCombo->currentText().isEmpty() && ui->myGridCombo->currentIndex() > 0 )\n            whereParts << QLatin1String(\"my_gridsquare = :my_gridsquare\");\n\n        selectStatement = QString(\"SELECT *, %1 FROM contacts INNER JOIN contacts_autovalue ON contacts.id = contacts_autovalue.contactid \"\n                                  \"WHERE %2 ORDER BY start_time\").arg(serviceStatusColumns.join(\", \"),\n                                                                      whereParts.join(\" AND \"));\n        if ( !uploadQSOQuery.prepare(selectStatement) )\n        {\n            qCDebug(runtime) << \"Cannot prepare SQL 1\" << selectStatement;\n            return;\n        }\n        uploadQSOQuery.bindValue(\":station_callsign\", ui->myCallsignCombo->currentText().trimmed());\n        uploadQSOQuery.bindValue(\":my_gridsquare\", ui->myGridCombo->currentText().trimmed());\n\n    }\n    else\n    {\n        whereParts << QLatin1String(\"station_profiles.profile_name = :profile_name\");\n\n        selectStatement = QString(\"SELECT contacts.*, contacts_autovalue.*, %1 \"\n                                  \"FROM contacts inner join station_profiles on %2 INNER JOIN contacts_autovalue ON contacts.id = contacts_autovalue.contactid \"\n                                  \"WHERE %3 ORDER BY start_time\").arg(serviceStatusColumns.join(\", \"),\n                                                                      selectedStationProfile.getContactInnerJoin(),\n                                                                      whereParts.join(\" AND \") );\n\n        if ( !uploadQSOQuery.prepare(selectStatement) )\n        {\n            qCDebug(runtime) << \"Cannot prepare SQL 2\" << selectStatement;\n            return;\n        }\n        uploadQSOQuery.bindValue(\":profile_name\", selectedStationProfile.profileName);\n    }\n\n    qCDebug(runtime) << selectStatement << uploadQSOQuery.boundValues();\n\n    if ( !uploadQSOQuery.exec() )\n    {\n        qCWarning(runtime) << \"cannot execute statement\" << uploadQSOQuery.lastError().text();\n        return;\n    }\n\n    QList<QStandardItem*> rowItems;\n    QStringList serviceNames;\n\n    // update QSO Detail and QSO list\n    while ( uploadQSOQuery.next() )\n    {\n        rowItems.clear();\n        serviceNames.clear();\n\n        auto rec = QSharedPointer<QSqlRecord>::create(uploadQSOQuery.record());\n        allSelectedQSOs.insert(rec->value(\"id\").toULongLong(), rec);\n\n        bool eqslUploadStatus = rec->value(\"status_\" + QString::number(ServiceID::EQSLID)).toBool();\n        bool lotwUploadStatus = rec->value(\"status_\" + QString::number(ServiceID::LOTWID)).toBool();\n\n        for ( auto it = onlineServices.begin(); it != onlineServices.end(); ++it )\n        {\n            UploadTask &task = it.value();\n\n            if ( !task.isChecked() ) continue;\n\n            ServiceID taskID = task.getServiceID();\n            bool forUploadMarked = false;\n\n            // set forUploadMarked according to service dependency.\n            switch (taskID)\n            {\n            case EQSLID: forUploadMarked = eqslUploadStatus; break;\n            case LOTWID: forUploadMarked = lotwUploadStatus; break;\n            case CLUBLOGID: forUploadMarked = lotwUploadStatus || rec->value(\"status_\" + QString::number(taskID)).toBool(); break; // depends on the LoTW Receive field\n            case HRDLOGID: forUploadMarked = eqslUploadStatus || lotwUploadStatus || rec->value(\"status_\" + QString::number(taskID)).toBool(); break; //depends on EQSL and LoTW fields\n            case QRZCOMID: forUploadMarked = (! serviceNames.empty()) || rec->value(\"status_\" + QString::number(taskID)).toBool(); break; // all fields are sent\n            case WAVELOGID: forUploadMarked = rec->value(\"status_\" + QString::number(taskID)).toBool(); break;\n            default: forUploadMarked = false;\n            }\n\n            if ( forUploadMarked )\n            {\n                serviceNames << task.getServiceName();\n                task.addQSO(rec);\n            }\n        }\n        rowItems << new QStandardItem(rec->value(\"start_time\").toDateTime()\n                                                              .toTimeZone(QTimeZone::utc())\n                                                              .toString(locale.formatDateTimeShortWithYYYY()));\n        rowItems << new QStandardItem(rec->value(\"callsign\").toString());\n        rowItems << new QStandardItem(rec->value(\"mode\").toString());\n        rowItems << new QStandardItem(serviceNames.join(\", \"));\n        detailQSOsModel->appendRow(rowItems);\n    }\n    ui->detailQSOView->setModel(detailQSOsModel);\n    ui->detailQSOView->resizeColumnsToContents();\n    updateQSONumbers();\n    updateLotwLocationWarning();\n    qCDebug(runtime) << \"finiched\";\n}\n\nvoid UploadQSODialog::handleCallsignChange(const QString &myCallsign)\n{\n    FCT_IDENTIFICATION;\n\n    ui->myGridLabel->blockSignals(true);\n    ui->myGridCombo->setModel(new SqlListModel(\"SELECT DISTINCT UPPER(my_gridsquare) \"\n                                               \"FROM contacts \"\n                                               \"WHERE COALESCE(NULLIF(TRIM(station_callsign), ''), TRIM(operator)) ='\" + QString(myCallsign).replace(\"'\", \"''\") + \"' ORDER BY my_gridsquare\", tr(\"Any\"), ui->myGridCombo));\n    ui->myGridCombo->setCurrentIndex(0);\n    executeQuery();\n    ui->myGridLabel->blockSignals(false);\n    updateLotwLocationWarning();\n}\n\nvoid UploadQSODialog::updateLotwLocationWarning()\n{\n    FCT_IDENTIFICATION;\n\n    // selected \"Unspecified\" – nothing to validate\n    if ( ui->lotwLocationCombo->currentIndex() <= 0 )\n    {\n        ui->lotwLocationWarningLabel->setVisible(false);\n        return;\n    }\n\n    QString filterCallsign;\n    QString filterGrid;\n    bool checkGrid = false;\n\n    if ( ui->myCallsignCheckbox->isChecked() )\n    {\n        filterCallsign = ui->myCallsignCombo->currentText().toUpper().trimmed();\n        // myGridCombo index 0 means \"Any\" – skip the grid check in that case\n        checkGrid = ui->myGridCombo->currentIndex() > 0;\n        if ( checkGrid )\n            filterGrid = ui->myGridCombo->currentText().toUpper().trimmed();\n    }\n    else\n    {\n        // Station Profile mode\n        const StationProfile &profile = StationProfilesManager::instance()->getProfile(ui->myStationProfileCombo->currentText());\n        filterCallsign = profile.callsign.toUpper().trimmed();\n        checkGrid = !profile.locator.trimmed().isEmpty();\n        if ( checkGrid )\n            filterGrid = profile.locator.toUpper().trimmed();\n    }\n\n    const QString selectedName = ui->lotwLocationCombo->currentData().toString();\n\n    for ( const TQSLStationLocation &loc : static_cast<const QList<TQSLStationLocation>>(tqslLocations) )\n    {\n        if ( loc.name != selectedName )\n            continue;\n\n        const bool callsignMismatch = !loc.callsign.isEmpty()\n                                      && !filterCallsign.isEmpty()\n                                      && loc.callsign.toUpper() != filterCallsign;\n\n        // Compare only the 4-character grid square prefix\n        const bool gridMismatch = checkGrid\n                                  && !loc.grid.isEmpty()\n                                  && loc.grid.toUpper().left(4) != filterGrid.left(4);\n\n        if ( callsignMismatch && gridMismatch )\n        {\n            ui->lotwLocationWarningLabel->setText(\n                QString(\"⚠ \") + tr(\"Location callsign (%1) and grid (%2) do not match selected filters\")\n                                .arg(loc.callsign, loc.grid.toUpper()));\n        }\n        else if ( callsignMismatch )\n        {\n            ui->lotwLocationWarningLabel->setText(\n                QString(\"⚠ \") + tr(\"Location callsign (%1) does not match selected callsign (%2)\")\n                                .arg(loc.callsign, filterCallsign));\n        }\n        else if ( gridMismatch )\n        {\n            ui->lotwLocationWarningLabel->setText(\n                QString(\"⚠ \") + tr(\"Location grid (%1) does not match selected grid (%2)\")\n                                .arg(loc.grid.toUpper(), filterGrid));\n        }\n\n        ui->lotwLocationWarningLabel->setVisible(callsignMismatch || gridMismatch);\n        return;\n    }\n\n    ui->lotwLocationWarningLabel->setVisible(false);\n}\n\nvoid UploadQSODialog::updateWavelogStationLabel()\n{\n    FCT_IDENTIFICATION;\n\n    const CloudlogUploader::StationProfile &currProfile = availableWavelogStationIDs.value(ui->wavelogStationIDSpin->value());\n\n    ui->wavelogStationIDProfileLabel->setText(( currProfile.station_id == ui->wavelogStationIDSpin->value()) ? currProfile.station_profile_name + \" [\" + currProfile.station_callsign + \" / \" + currProfile.station_gridsquare + \"]\"\n                                                                                                             : tr(\"Unknown\"));\n}\n"
  },
  {
    "path": "ui/UploadQSODialog.h",
    "content": "#ifndef UPLOADQSODIALOG_H\n#define UPLOADQSODIALOG_H\n\n#include <QDialog>\n#include <QAbstractButton>\n#include <QQueue>\n#include <QCheckBox>\n#include <QSqlQuery>\n#include <QStandardItemModel>\n#include <QLabel>\n\n#include \"core/LogLocale.h\"\n#include \"service/GenericQSOUploader.h\"\n#include \"service/cloudlog/Cloudlog.h\"\n#include \"service/lotw/Lotw.h\"\n\nnamespace Ui {\nclass UploadQSODialog;\n}\n\nclass UploadQSODialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit UploadQSODialog(QWidget *parent = nullptr);\n    ~UploadQSODialog();\n\nprivate slots:\n    void showQSODetails();\n    void setEQSLSettingVisible(bool visible);\n    void setClublogSettingVisible(bool visible);\n    void setLotwSettingVisible(bool visible);\n    void setWavelogSettingVisible(bool visible);\n    void startUploadQueue();\n    void executeQuery();\n    void handleCallsignChange(const QString &);\n    void updateWavelogStationLabel();\n\nprivate:\n\n    // The order is important here, because some services\n    // send fields from other services.\n    enum ServiceID\n    {\n        UNKNOWN = 0,\n        LOTWID = 1,     // independent\n        EQSLID = 2,     // independent\n        CLUBLOGID = 3,  // depends on the LoTW Receive field\n        HRDLOGID = 4,   // depends on EQSL and LoTW fields\n        QRZCOMID = 5,   // all fields are sent\n        WAVELOGID = 6,    // all fiedls are sent\n    };\n\n    class UploadTask\n    {\n    public:\n        UploadTask() : serviceID(UNKNOWN), uploader(nullptr), controElement(nullptr),\n                       qsoNumberLabel(nullptr) {};\n\n        UploadTask(ServiceID id,\n                   const QString &serviceName,\n                   GenericQSOUploader *uploader,\n                   const QString &dbUploadStatusFieldName,\n                   const QString &dbUploadDateFieldName,\n                   QCheckBox *enableWidget,\n                   QLabel *qsoCountLabel,\n                   bool isActivable):\n            serviceID(id), serviceName(serviceName),\n            uploader(uploader), controElement(enableWidget),\n            dbUploadStatusFieldName(dbUploadStatusFieldName), dbUploadDateFieldName(dbUploadDateFieldName),\n            qsoNumberLabel(qsoCountLabel)\n        {\n            enableWidget->setEnabled(isActivable);\n            enableWidget->setToolTip((isActivable) ? \"\"\n                                                   : tr(\"Service is not configured properly.<p> Please, use <b>Settings</b> dialog to configure it.</p>\"));\n        };\n\n        ~UploadTask() {};\n\n        ServiceID getServiceID() const {return serviceID;};\n        void addQSO(QSharedPointer<QSqlRecord> record) {qsoRefs.append(record); qsoIds.append(record->value(\"id\").toULongLong());};\n        void clearEnqueuedQSOs() {qsoRefs.clear(); qsoIds.clear();};\n        const QList<QSqlRecord> getQSOList() const\n        {\n            QList<QSqlRecord> retList;\n            const QList<QWeakPointer<QSqlRecord>> localRefs = qsoRefs;\n            for ( const QWeakPointer<QSqlRecord>& weak : localRefs )\n            {\n                QSharedPointer<QSqlRecord> shared = weak.toStrongRef();\n                if (shared) retList.append(*shared);\n            }\n            return retList;\n        };\n        const QList<qulonglong>& getQSOIDs() const { return qsoIds; };\n        bool isChecked() {return (controElement) ? controElement->isChecked() : false;};\n        const QString& getDBUploadStatusFieldName() const {return dbUploadStatusFieldName;};\n        const QString& getDBUploadDateFieldName() const {return dbUploadDateFieldName;};\n        const QString& getServiceName() const {return serviceName;};\n        GenericQSOUploader *getUploader() const {return uploader;};\n        void updateQSONumberLabel() {qsoNumberLabel->setText((isChecked()) ? \"(\" + QString::number(qsoRefs.size()) + \")\"\n                                                                         : \"\");};\n        bool isQSOListEmpty() const {return qsoRefs.isEmpty(); };\n        void updateAllDBFieldValue(const QString &column1, const QVariant &value1,\n                                   const QString &column2, const QVariant &value2) const\n        {\n            const QList<QWeakPointer<QSqlRecord>> localRefs = qsoRefs;\n            for ( const QWeakPointer<QSqlRecord>& weak : localRefs )\n            {\n                QSharedPointer<QSqlRecord> shared = weak.toStrongRef();\n                if ( shared )\n                {\n                    shared->setValue(column1, value1);\n                    shared->setValue(column2, value2);\n                }\n            }\n        };\n\n    private:\n        ServiceID serviceID;\n        QString serviceName;\n        GenericQSOUploader *uploader;\n        QList<QWeakPointer<QSqlRecord>> qsoRefs;\n        QList<qulonglong> qsoIds;\n        QCheckBox *controElement;\n        QString dbUploadStatusFieldName;\n        QString dbUploadDateFieldName;\n        QLabel *qsoNumberLabel;\n    };\n\n    QMap<ServiceID, UploadTask> onlineServices;\n    QHash<qulonglong, QSharedPointer<QSqlRecord>> allSelectedQSOs;\n    Ui::UploadQSODialog *ui;\n    LogLocale locale;\n    QList<UploadTask> uploadTaskQueue;\n    QStandardItemModel *detailQSOsModel;\n    UploadTask currentTask;\n    QMap<uint, CloudlogUploader::StationProfile> availableWavelogStationIDs;\n    QList<TQSLStationLocation> tqslLocations;\n    bool executeQueryEnabled;\n    void updateLotwLocationWarning();\n    void setQSODetailVisible(bool visible);\n    void loadDialogState();\n    void saveDialogState();\n    void processNextUploader();\n    void uploadFinished();\n    void updateQSONumbers();\n    void getWavelogStationID();\n\n    const uint WAVELOG_MAX_STATIONID = 99999;\n};\n\n#endif // UPLOADQSODIALOG_H\n"
  },
  {
    "path": "ui/UploadQSODialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>UploadQSODialog</class>\n <widget class=\"QDialog\" name=\"UploadQSODialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>597</width>\n    <height>819</height>\n   </rect>\n  </property>\n  <property name=\"sizePolicy\">\n   <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Minimum\">\n    <horstretch>0</horstretch>\n    <verstretch>0</verstretch>\n   </sizepolicy>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Upload QSOs</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_5\">\n     <property name=\"spacing\">\n      <number>0</number>\n     </property>\n     <property name=\"bottomMargin\">\n      <number>10</number>\n     </property>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_4\">\n         <property name=\"rightMargin\">\n          <number>10</number>\n         </property>\n         <item>\n          <widget class=\"QCheckBox\" name=\"eqslCheckbox\">\n           <property name=\"text\">\n            <string>eQSL</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"eqslNumberLabel\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_6\">\n         <property name=\"rightMargin\">\n          <number>10</number>\n         </property>\n         <item>\n          <widget class=\"QCheckBox\" name=\"lotwCheckbox\">\n           <property name=\"text\">\n            <string>LoTW</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"lotwNumberLabel\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_7\">\n         <property name=\"rightMargin\">\n          <number>5</number>\n         </property>\n         <item>\n          <widget class=\"QCheckBox\" name=\"qrzCheckbox\">\n           <property name=\"text\">\n            <string>QRZ.com</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"qrzNumberLabel\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_8\">\n         <property name=\"rightMargin\">\n          <number>5</number>\n         </property>\n         <item>\n          <widget class=\"QCheckBox\" name=\"clublogCheckbox\">\n           <property name=\"text\">\n            <string>Clublog</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"clublogNumberLabel\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n     <item>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n       <property name=\"spacing\">\n        <number>0</number>\n       </property>\n       <property name=\"bottomMargin\">\n        <number>0</number>\n       </property>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_9\">\n         <property name=\"rightMargin\">\n          <number>5</number>\n         </property>\n         <item>\n          <widget class=\"QCheckBox\" name=\"hrdlogCheckbox\">\n           <property name=\"text\">\n            <string>HRDLog</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"hrdlogNumberLabel\">\n           <property name=\"sizePolicy\">\n            <sizepolicy hsizetype=\"Preferred\" vsizetype=\"Maximum\">\n             <horstretch>0</horstretch>\n             <verstretch>0</verstretch>\n            </sizepolicy>\n           </property>\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_11\">\n         <item>\n          <widget class=\"QCheckBox\" name=\"wavelogCheckbox\">\n           <property name=\"text\">\n            <string>Wavelog</string>\n           </property>\n           <attribute name=\"buttonGroup\">\n            <string notr=\"true\">uploadButtonGroup</string>\n           </attribute>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QLabel\" name=\"wavelogNumberLabel\">\n           <property name=\"text\">\n            <string/>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n      </layout>\n     </item>\n    </layout>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"groupBox\">\n     <property name=\"title\">\n      <string>Filters</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QRadioButton\" name=\"myStationProfileCheckbox\">\n        <property name=\"text\">\n         <string>Station Profile</string>\n        </property>\n        <attribute name=\"buttonGroup\">\n         <string notr=\"true\">filterButtonGroup</string>\n        </attribute>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"myStationProfileCombo\">\n        <property name=\"enabled\">\n         <bool>false</bool>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QRadioButton\" name=\"myCallsignCheckbox\">\n        <property name=\"text\">\n         <string>My Callsign</string>\n        </property>\n        <property name=\"checked\">\n         <bool>true</bool>\n        </property>\n        <attribute name=\"buttonGroup\">\n         <string notr=\"true\">filterButtonGroup</string>\n        </attribute>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_10\">\n        <item>\n         <widget class=\"QComboBox\" name=\"myCallsignCombo\"/>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"myGridLabel\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string>Gridsquare</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QComboBox\" name=\"myGridCombo\"/>\n        </item>\n       </layout>\n      </item>\n      <item row=\"2\" column=\"0\">\n       <widget class=\"QLabel\" name=\"inludeQSOLabel\">\n        <property name=\"text\">\n         <string>Include QSOs Status</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"2\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n        <item>\n         <widget class=\"QCheckBox\" name=\"includeStatusNoCheckbox\">\n          <property name=\"toolTip\">\n           <string>Under normal circumstances this status means &lt;b&gt;&quot;do not send&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</string>\n          </property>\n          <property name=\"text\">\n           <string>No</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QCheckBox\" name=\"includeIgnoreCheckbox\">\n          <property name=\"statusTip\">\n           <string>Under normal circumstances this status means &lt;b&gt;&quot;Ignore/Invalid&quot;&lt;/b&gt;.&lt;br/&gt;However, it may sometimes be wanted to ignore this setting when sending a QSL.</string>\n          </property>\n          <property name=\"text\">\n           <string>Ignore</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>40</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"eqslGroup\">\n     <property name=\"enabled\">\n      <bool>true</bool>\n     </property>\n     <property name=\"title\">\n      <string>eQSL</string>\n     </property>\n     <property name=\"flat\">\n      <bool>false</bool>\n     </property>\n     <property name=\"checkable\">\n      <bool>false</bool>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_2\">\n      <property name=\"verticalSpacing\">\n       <number>2</number>\n      </property>\n      <property name=\"leftMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>4</number>\n      </property>\n      <item row=\"1\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n        <item>\n         <widget class=\"QRadioButton\" name=\"eqslQSLNone\">\n          <property name=\"text\">\n           <string>None</string>\n          </property>\n          <property name=\"checked\">\n           <bool>true</bool>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"eqslQSLMessage\">\n          <property name=\"text\">\n           <string>QSLs Message</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QRadioButton\" name=\"eqslQSLComment\">\n          <property name=\"text\">\n           <string>Comment</string>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_4\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::MinimumExpanding</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>1</width>\n            <height>1</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"eqslQSLMessageLabel\">\n        <property name=\"text\">\n         <string>QSL Message Field</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"eqslQTHProfileLabel\">\n        <property name=\"text\">\n         <string>QTH Profile</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QLineEdit\" name=\"eqslQTHProfileEdit\"/>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"clublogGroup\">\n     <property name=\"title\">\n      <string>Clublog</string>\n     </property>\n     <property name=\"checkable\">\n      <bool>false</bool>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_3\">\n      <property name=\"horizontalSpacing\">\n       <number>4</number>\n      </property>\n      <property name=\"verticalSpacing\">\n       <number>2</number>\n      </property>\n      <property name=\"leftMargin\">\n       <number>6</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>4</number>\n      </property>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QCheckBox\" name=\"clublogClearCheckbox\">\n        <property name=\"sizePolicy\">\n         <sizepolicy hsizetype=\"Minimum\" vsizetype=\"Preferred\">\n          <horstretch>0</horstretch>\n          <verstretch>0</verstretch>\n         </sizepolicy>\n        </property>\n        <property name=\"toolTip\">\n         <string>This option deletes all QSOs in the Clublog&lt;br&gt;and based on filter, it uploads all QSOs regardless of their status.</string>\n        </property>\n        <property name=\"text\">\n         <string notr=\"true\"/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"clublogClearLabel\">\n        <property name=\"text\">\n         <string>Clear Clublog and reupload QSOs</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"lotwGroup\">\n     <property name=\"title\">\n      <string>LoTW / TQSL</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"lotwFormLayout\">\n      <property name=\"leftMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"topMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"rightMargin\">\n       <number>4</number>\n      </property>\n      <property name=\"bottomMargin\">\n       <number>4</number>\n      </property>\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"lotwLocationLabel\">\n        <property name=\"text\">\n         <string>TQSL Station Location</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <widget class=\"QComboBox\" name=\"lotwLocationCombo\"/>\n      </item>\n      <item row=\"1\" column=\"0\" colspan=\"2\">\n       <widget class=\"QLabel\" name=\"lotwLocationWarningLabel\">\n        <property name=\"visible\">\n         <bool>false</bool>\n        </property>\n        <property name=\"styleSheet\">\n         <string notr=\"true\">color: orange;</string>\n        </property>\n        <property name=\"wordWrap\">\n         <bool>true</bool>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QGroupBox\" name=\"wavelogGroup\">\n     <property name=\"title\">\n      <string>Wavelog</string>\n     </property>\n     <layout class=\"QFormLayout\" name=\"formLayout_4\">\n      <item row=\"0\" column=\"0\">\n       <widget class=\"QLabel\" name=\"wavelogStationIDLabel\">\n        <property name=\"text\">\n         <string>Station Profile ID</string>\n        </property>\n       </widget>\n      </item>\n      <item row=\"0\" column=\"1\">\n       <layout class=\"QHBoxLayout\" name=\"horizontalLayout_12\">\n        <item>\n         <widget class=\"QSpinBox\" name=\"wavelogStationIDSpin\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Fixed\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"minimum\">\n           <number>1</number>\n          </property>\n          <property name=\"maximum\">\n           <number>99999</number>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <widget class=\"QLabel\" name=\"wavelogStationIDProfileLabel\">\n          <property name=\"sizePolicy\">\n           <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Preferred\">\n            <horstretch>0</horstretch>\n            <verstretch>0</verstretch>\n           </sizepolicy>\n          </property>\n          <property name=\"text\">\n           <string/>\n          </property>\n         </widget>\n        </item>\n        <item>\n         <spacer name=\"horizontalSpacer_2\">\n          <property name=\"orientation\">\n           <enum>Qt::Horizontal</enum>\n          </property>\n          <property name=\"sizeType\">\n           <enum>QSizePolicy::Expanding</enum>\n          </property>\n          <property name=\"sizeHint\" stdset=\"0\">\n           <size>\n            <width>60</width>\n            <height>20</height>\n           </size>\n          </property>\n         </spacer>\n        </item>\n       </layout>\n      </item>\n      <item row=\"1\" column=\"1\">\n       <widget class=\"QCheckBox\" name=\"wavelogReuploadCheckbox\">\n        <property name=\"text\">\n         <string notr=\"true\"/>\n        </property>\n       </widget>\n      </item>\n      <item row=\"1\" column=\"0\">\n       <widget class=\"QLabel\" name=\"label\">\n        <property name=\"text\">\n         <string>Reupload All</string>\n        </property>\n       </widget>\n      </item>\n     </layout>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"Line\" name=\"line\">\n     <property name=\"enabled\">\n      <bool>true</bool>\n     </property>\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTableView\" name=\"detailQSOView\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::NoFocus</enum>\n     </property>\n     <property name=\"editTriggers\">\n      <set>QAbstractItemView::NoEditTriggers</set>\n     </property>\n     <property name=\"tabKeyNavigation\">\n      <bool>false</bool>\n     </property>\n     <property name=\"showDropIndicator\" stdset=\"0\">\n      <bool>false</bool>\n     </property>\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::NoSelection</enum>\n     </property>\n     <property name=\"verticalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"horizontalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"wordWrap\">\n      <bool>false</bool>\n     </property>\n     <property name=\"cornerButtonEnabled\">\n      <bool>false</bool>\n     </property>\n     <attribute name=\"horizontalHeaderCascadingSectionResizes\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderVisible\">\n      <bool>false</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderCascadingSectionResizes\">\n      <bool>true</bool>\n     </attribute>\n    </widget>\n   </item>\n   <item>\n    <layout class=\"QHBoxLayout\" name=\"horizontalLayout_3\">\n     <property name=\"bottomMargin\">\n      <number>0</number>\n     </property>\n     <item>\n      <widget class=\"QPushButton\" name=\"showQSOButton\">\n       <property name=\"text\">\n        <string>Show QSOs...</string>\n       </property>\n      </widget>\n     </item>\n     <item>\n      <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n       <property name=\"orientation\">\n        <enum>Qt::Horizontal</enum>\n       </property>\n       <property name=\"standardButtons\">\n        <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n       </property>\n      </widget>\n     </item>\n    </layout>\n   </item>\n  </layout>\n </widget>\n <tabstops>\n  <tabstop>eqslCheckbox</tabstop>\n  <tabstop>qrzCheckbox</tabstop>\n  <tabstop>hrdlogCheckbox</tabstop>\n  <tabstop>lotwCheckbox</tabstop>\n  <tabstop>clublogCheckbox</tabstop>\n  <tabstop>wavelogCheckbox</tabstop>\n  <tabstop>myStationProfileCheckbox</tabstop>\n  <tabstop>myStationProfileCombo</tabstop>\n  <tabstop>myCallsignCheckbox</tabstop>\n  <tabstop>myCallsignCombo</tabstop>\n  <tabstop>myGridCombo</tabstop>\n  <tabstop>includeStatusNoCheckbox</tabstop>\n  <tabstop>includeIgnoreCheckbox</tabstop>\n  <tabstop>eqslQTHProfileEdit</tabstop>\n  <tabstop>eqslQSLNone</tabstop>\n  <tabstop>eqslQSLMessage</tabstop>\n  <tabstop>eqslQSLComment</tabstop>\n  <tabstop>clublogClearCheckbox</tabstop>\n  <tabstop>lotwLocationCombo</tabstop>\n  <tabstop>wavelogStationIDSpin</tabstop>\n  <tabstop>wavelogReuploadCheckbox</tabstop>\n  <tabstop>showQSOButton</tabstop>\n </tabstops>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>startUploadQueue()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>366</x>\n     <y>512</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>434</x>\n     <y>512</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>showQSOButton</sender>\n   <signal>clicked()</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>showQSODetails()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>61</x>\n     <y>512</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>244</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>uploadButtonGroup</sender>\n   <signal>buttonToggled(QAbstractButton*,bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>244</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>eqslCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>setEQSLSettingVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>224</x>\n     <y>20</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>259</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clublogCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>setClublogSettingVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>360</x>\n     <y>44</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>259</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>handleCallsignChange(QString)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>361</x>\n     <y>81</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>267</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myGridCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>361</x>\n     <y>113</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>267</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>includeStatusNoCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>184</x>\n     <y>145</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>267</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>includeIgnoreCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>249</x>\n     <y>145</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>267</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>clublogClearCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>408</x>\n     <y>269</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>267</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>myCallsignCombo</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>62</x>\n     <y>83</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>237</x>\n     <y>85</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>myGridLabel</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>62</x>\n     <y>83</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>359</x>\n     <y>85</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myCallsignCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>myGridCombo</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>62</x>\n     <y>83</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>480</x>\n     <y>85</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myStationProfileCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>myStationProfileCombo</receiver>\n   <slot>setEnabled(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>74</x>\n     <y>117</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>358</x>\n     <y>118</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>filterButtonGroup</sender>\n   <signal>buttonToggled(QAbstractButton*,bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>283</x>\n     <y>283</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>myStationProfileCombo</sender>\n   <signal>currentTextChanged(QString)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>373</x>\n     <y>125</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>298</x>\n     <y>310</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>lotwCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>setLotwSettingVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>224</x>\n     <y>44</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>285</x>\n     <y>259</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wavelogCheckbox</sender>\n   <signal>toggled(bool)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>setWavelogSettingVisible(bool)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>442</x>\n     <y>49</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>298</x>\n     <y>310</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wavelogReuploadCheckbox</sender>\n   <signal>stateChanged(int)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>executeQuery()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>453</x>\n     <y>423</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>298</x>\n     <y>310</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>wavelogStationIDSpin</sender>\n   <signal>valueChanged(int)</signal>\n   <receiver>UploadQSODialog</receiver>\n   <slot>updateWavelogStationLabel()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>187</x>\n     <y>424</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>298</x>\n     <y>350</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>showQSODetails()</slot>\n  <slot>setEQSLSettingVisible(bool)</slot>\n  <slot>setClublogSettingVisible(bool)</slot>\n  <slot>executeQuery()</slot>\n  <slot>handleCallsignChange(QString)</slot>\n  <slot>startUploadQueue()</slot>\n  <slot>setWavelogSettingVisible(bool)</slot>\n  <slot>setLotwSettingVisible(bool)</slot>\n  <slot>updateWavelogStationLabel()</slot>\n </slots>\n <buttongroups>\n  <buttongroup name=\"uploadButtonGroup\">\n   <property name=\"exclusive\">\n    <bool>false</bool>\n   </property>\n  </buttongroup>\n  <buttongroup name=\"filterButtonGroup\"/>\n </buttongroups>\n</ui>\n"
  },
  {
    "path": "ui/WebEnginePage.cpp",
    "content": "#include <QCoreApplication>\n#include <QDesktopServices>\n#include <QWebEngineProfile>\n#include \"WebEnginePage.h\"\n#include \"core/debug.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.webenginepage\");\n\nWebEnginePage::WebEnginePage(QObject *parent)\n    : QWebEnginePage{parent}\n{\n    FCT_IDENTIFICATION;\n\n    QString userAgent = QString(\"%1/%2 (+https://github.com/foldynl/QLog)\")\n                            .arg(QCoreApplication::applicationName(), VERSION);\n    profile()->setHttpUserAgent(userAgent);\n}\n\nbool WebEnginePage::acceptNavigationRequest(const QUrl &url,\n                                             QWebEnginePage::NavigationType type,\n                                             bool isMainFrame)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters) << url << type << isMainFrame;\n\n    if ( isMainFrame && type == QWebEnginePage::NavigationTypeLinkClicked )\n    {\n        QDesktopServices::openUrl(url);\n        return false;\n    }\n\n    return QWebEnginePage::acceptNavigationRequest(url, type, isMainFrame);\n}\n\nvoid WebEnginePage::javaScriptConsoleMessage(JavaScriptConsoleMessageLevel level,\n                                             const QString &message,\n                                             int lineNumber,\n                                             const QString &sourceID)\n{\n    FCT_IDENTIFICATION;\n\n    Q_UNUSED(lineNumber);\n    Q_UNUSED(sourceID);\n\n    qCDebug(runtime)<<\"level: \" << level <<\"; message: \"<<message;\n}\n"
  },
  {
    "path": "ui/WebEnginePage.h",
    "content": "#ifndef QLOG_UI_WEBENGINEPAGE_H\n#define QLOG_UI_WEBENGINEPAGE_H\n\n#include <QWebEnginePage>\n\nclass WebEnginePage : public QWebEnginePage\n{\npublic:\n    explicit WebEnginePage(QObject *parent = nullptr);\n\nprotected:\n    bool acceptNavigationRequest(const QUrl &url,\n                                 QWebEnginePage::NavigationType type,\n                                 bool isMainFrame) override;\n    void javaScriptConsoleMessage(QWebEnginePage::JavaScriptConsoleMessageLevel level,\n                                  const QString &message,\n                                  int lineNumber,\n                                  const QString &sourceID) override;\n};\n\n#endif // QLOG_UI_WEBENGINEPAGE_H\n"
  },
  {
    "path": "ui/WsjtxFilterDialog.cpp",
    "content": "#include \"WsjtxFilterDialog.h\"\n#include \"ui_WsjtxFilterDialog.h\"\n#include \"core/debug.h\"\n#include \"data/Dxcc.h\"\n#include \"core/MembershipQE.h\"\n#include \"data/Gridsquare.h\"\n#include \"core/LogParam.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.wsjtxfilterdialog\");\n\nWsjtxFilterDialog::WsjtxFilterDialog(QWidget *parent) :\n    QDialog(parent),\n    ui(new Ui::WsjtxFilterDialog)\n{\n    ui->setupUi(this);\n\n    QString unit;\n    Gridsquare::distance2localeUnitDistance(0, unit, locale);\n    ui->distanceSpinBox->setSuffix(\" \" + unit);\n\n    /*********************/\n    /* Status Checkboxes */\n    /*********************/\n    uint statusSetting = LogParam::getWsjtxFilterDxccStatus();\n\n    ui->newEntityCheckBox->setChecked(statusSetting & DxccStatus::NewEntity);\n    ui->newBandCheckBox->setChecked(statusSetting & DxccStatus::NewBand);\n    ui->newModeCheckBox->setChecked(statusSetting & DxccStatus::NewMode);\n    ui->newSlotCheckBox->setChecked(statusSetting & DxccStatus::NewSlot);\n    ui->workedCheckBox->setChecked(statusSetting & DxccStatus::Worked);\n    ui->confirmedCheckBox->setChecked(statusSetting & DxccStatus::Confirmed);\n\n    /************************/\n    /* Continent Checkboxes */\n    /************************/\n    const QString &contregexp = LogParam::getWsjtxFilterContRE();\n\n    ui->afCheckBox->setChecked(contregexp.contains(\"|AF\"));\n    ui->anCheckBox->setChecked(contregexp.contains(\"|AN\"));\n    ui->asCheckBox->setChecked(contregexp.contains(\"|AS\"));\n    ui->euCheckBox->setChecked(contregexp.contains(\"|EU\"));\n    ui->naCheckBox->setChecked(contregexp.contains(\"|NA\"));\n    ui->ocCheckBox->setChecked(contregexp.contains(\"|OC\"));\n    ui->saCheckBox->setChecked(contregexp.contains(\"|SA\"));\n\n    /*************/\n    /* Distance  */\n    /*************/\n    ui->distanceSpinBox->setValue(LogParam::getWsjtxFilterDistance());\n\n    /********/\n    /* SNR  */\n    /********/\n    ui->snrSpinBox->setValue(LogParam::getWsjtxFilterSNR());\n\n    /**********/\n    /* MEMBER */\n    /**********/\n\n    generateMembershipCheckboxes();\n}\n\nvoid WsjtxFilterDialog::accept()\n{\n    FCT_IDENTIFICATION;    \n\n    /*********************/\n    /* Status Checkboxes */\n    /*********************/\n    uint status = 0;\n\n    if ( ui->newEntityCheckBox->isChecked() ) status |=  DxccStatus::NewEntity;\n    if ( ui->newBandCheckBox->isChecked() ) status |=  DxccStatus::NewBand;\n    if ( ui->newModeCheckBox->isChecked() ) status |=  DxccStatus::NewMode;\n    if ( ui->newSlotCheckBox->isChecked() ) status |=  DxccStatus::NewSlot;\n    if ( ui->workedCheckBox->isChecked() ) status |=  DxccStatus::Worked;\n    if ( ui->confirmedCheckBox->isChecked() ) status |=  DxccStatus::Confirmed;\n    LogParam::setWsjtxFilterDxccStatus(status);\n\n    /************************/\n    /* Continent Checkboxes */\n    /************************/\n    QString contregexp = \"NOTHING\";\n    if ( ui->afCheckBox->isChecked() ) contregexp.append(\"|AF\");\n    if ( ui->anCheckBox->isChecked() ) contregexp.append(\"|AN\");\n    if ( ui->asCheckBox->isChecked() ) contregexp.append(\"|AS\");\n    if ( ui->euCheckBox->isChecked() ) contregexp.append(\"|EU\");\n    if ( ui->naCheckBox->isChecked() ) contregexp.append(\"|NA\");\n    if ( ui->ocCheckBox->isChecked() ) contregexp.append(\"|OC\");\n    if ( ui->saCheckBox->isChecked() ) contregexp.append(\"|SA\");\n    LogParam::setWsjtxFilterContRE(contregexp);\n\n    /*************/\n    /* Distance  */\n    /*************/\n    LogParam::setWsjtxFilterDistance(ui->distanceSpinBox->value());\n\n    /********/\n    /* SNR  */\n    /********/\n    LogParam::setWsjtxFilterSNR(ui->snrSpinBox->value());\n\n    /**********/\n    /* MEMBER */\n    /**********/\n\n    QStringList memberList;\n\n    if ( ui->memberGroupBox->isChecked() )\n    {\n        memberList.append(\"DUMMYCLUB\");\n\n        for ( QCheckBox* item: static_cast<const QList<QCheckBox *>&>(memberListCheckBoxes) )\n            if ( item->isChecked() ) memberList.append(item->text());\n    }\n    LogParam::setWsjtxMemberlists(memberList);\n\n    done(QDialog::Accepted);\n}\n\nvoid WsjtxFilterDialog::generateMembershipCheckboxes()\n{\n    FCT_IDENTIFICATION;\n\n    const QStringList &currentFilter = LogParam::getWsjtxMemberlists();\n    const QStringList &enabledLists = MembershipQE::getEnabledClubLists();\n\n    for ( int i = 0 ; i < enabledLists.size(); i++)\n    {\n        QCheckBox *columnCheckbox = new QCheckBox(this);\n        const QString &shortDesc = enabledLists.at(i);\n\n        columnCheckbox->setText(shortDesc);\n        columnCheckbox->setChecked(currentFilter.contains(shortDesc));\n        memberListCheckBoxes.append(columnCheckbox);\n    }\n\n    if ( memberListCheckBoxes.size() == 0 )\n    {\n        ui->dxMemberGrid->addWidget(new QLabel(tr(\"No Club List is enabled\")));\n    }\n    else\n    {\n        int elementIndex = 0;\n\n        for ( QCheckBox* item: static_cast<const QList<QCheckBox *>&>(memberListCheckBoxes) )\n        {\n            ui->dxMemberGrid->addWidget(item, elementIndex / 3, elementIndex % 3);\n            elementIndex++;\n        }\n    }\n\n    ui->memberGroupBox->setChecked((currentFilter.size() != 0));\n}\n\nWsjtxFilterDialog::~WsjtxFilterDialog()\n{\n    delete ui;\n}\n"
  },
  {
    "path": "ui/WsjtxFilterDialog.h",
    "content": "#ifndef QLOG_UI_WSJTXFILTERDIALOG_H\n#define QLOG_UI_WSJTXFILTERDIALOG_H\n\n#include <QDialog>\n#include <QCheckBox>\n#include <QSet>\n\n#include \"core/LogLocale.h\"\n\nnamespace Ui {\nclass WsjtxFilterDialog;\n}\n\nclass WsjtxFilterDialog : public QDialog\n{\n    Q_OBJECT\n\npublic:\n    explicit WsjtxFilterDialog(QWidget *parent = nullptr);\n    ~WsjtxFilterDialog();\n    void accept() override;\n\nprivate:\n    Ui::WsjtxFilterDialog *ui;\n    QList<QCheckBox*> memberListCheckBoxes;\n    QSet<QString> dxMemberFilter;\n    LogLocale locale;\n\n    void generateMembershipCheckboxes();\n\n};\n\n#endif // QLOG_UI_WSJTXFILTERDIALOG_H\n"
  },
  {
    "path": "ui/WsjtxFilterDialog.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>WsjtxFilterDialog</class>\n <widget class=\"QDialog\" name=\"WsjtxFilterDialog\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>373</width>\n    <height>434</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>WSJTX Filters</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <item>\n    <widget class=\"QTabWidget\" name=\"tabWidget\">\n     <property name=\"currentIndex\">\n      <number>0</number>\n     </property>\n     <widget class=\"QWidget\" name=\"general\">\n      <attribute name=\"title\">\n       <string>General Filters</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_2\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"statusGroupBox\">\n         <property name=\"title\">\n          <string>Log Status</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_3\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"gridLayout\">\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"newBandCheckBox\">\n              <property name=\"text\">\n               <string>New Band</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"newModeCheckBox\">\n              <property name=\"text\">\n               <string>New Mode</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"newEntityCheckBox\">\n              <property name=\"text\">\n               <string>New Entity</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"newSlotCheckBox\">\n              <property name=\"text\">\n               <string>New Slot</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"workedCheckBox\">\n              <property name=\"text\">\n               <string>Worked</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"2\">\n             <widget class=\"QCheckBox\" name=\"confirmedCheckBox\">\n              <property name=\"text\">\n               <string>Confirmed</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <widget class=\"QGroupBox\" name=\"continentGroupBox\">\n         <property name=\"title\">\n          <string>Continent</string>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_4\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"gridLayout_2\">\n            <item row=\"2\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"naCheckBox\">\n              <property name=\"text\">\n               <string>North America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"euCheckBox\">\n              <property name=\"text\">\n               <string>Europe</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"2\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"saCheckBox\">\n              <property name=\"text\">\n               <string>South America</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"afCheckBox\">\n              <property name=\"text\">\n               <string>Africa</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"0\" column=\"1\">\n             <widget class=\"QCheckBox\" name=\"anCheckBox\">\n              <property name=\"text\">\n               <string>Antarctica</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"1\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"asCheckBox\">\n              <property name=\"text\">\n               <string>Asia</string>\n              </property>\n             </widget>\n            </item>\n            <item row=\"3\" column=\"0\">\n             <widget class=\"QCheckBox\" name=\"ocCheckBox\">\n              <property name=\"text\">\n               <string>Oceania</string>\n              </property>\n             </widget>\n            </item>\n           </layout>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout\">\n         <item>\n          <widget class=\"QLabel\" name=\"distanceLabel\">\n           <property name=\"text\">\n            <string>Distance more than</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QSpinBox\" name=\"distanceSpinBox\">\n           <property name=\"suffix\">\n            <string/>\n           </property>\n           <property name=\"maximum\">\n            <number>40075</number>\n           </property>\n           <property name=\"value\">\n            <number>0</number>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <layout class=\"QHBoxLayout\" name=\"horizontalLayout_2\">\n         <item>\n          <widget class=\"QLabel\" name=\"snrLabel\">\n           <property name=\"text\">\n            <string>SNR better than</string>\n           </property>\n          </widget>\n         </item>\n         <item>\n          <widget class=\"QSpinBox\" name=\"snrSpinBox\">\n           <property name=\"suffix\">\n            <string> dB</string>\n           </property>\n           <property name=\"minimum\">\n            <number>-41</number>\n           </property>\n           <property name=\"value\">\n            <number>-40</number>\n           </property>\n          </widget>\n         </item>\n        </layout>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n     <widget class=\"QWidget\" name=\"tab\">\n      <attribute name=\"title\">\n       <string>Extended Filters</string>\n      </attribute>\n      <layout class=\"QVBoxLayout\" name=\"verticalLayout_5\">\n       <item>\n        <widget class=\"QGroupBox\" name=\"memberGroupBox\">\n         <property name=\"title\">\n          <string>Member</string>\n         </property>\n         <property name=\"checkable\">\n          <bool>true</bool>\n         </property>\n         <property name=\"checked\">\n          <bool>true</bool>\n         </property>\n         <layout class=\"QVBoxLayout\" name=\"verticalLayout_6\">\n          <item>\n           <layout class=\"QGridLayout\" name=\"dxMemberGrid\"/>\n          </item>\n         </layout>\n        </widget>\n       </item>\n       <item>\n        <spacer name=\"verticalSpacer_2\">\n         <property name=\"orientation\">\n          <enum>Qt::Vertical</enum>\n         </property>\n         <property name=\"sizeHint\" stdset=\"0\">\n          <size>\n           <width>20</width>\n           <height>40</height>\n          </size>\n         </property>\n        </spacer>\n       </item>\n      </layout>\n     </widget>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QDialogButtonBox\" name=\"buttonBox\">\n     <property name=\"orientation\">\n      <enum>Qt::Horizontal</enum>\n     </property>\n     <property name=\"standardButtons\">\n      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>\n     </property>\n    </widget>\n   </item>\n  </layout>\n </widget>\n <resources/>\n <connections>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>accepted()</signal>\n   <receiver>WsjtxFilterDialog</receiver>\n   <slot>accept()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>248</x>\n     <y>254</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>157</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>buttonBox</sender>\n   <signal>rejected()</signal>\n   <receiver>WsjtxFilterDialog</receiver>\n   <slot>reject()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>316</x>\n     <y>260</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>286</x>\n     <y>274</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n</ui>\n"
  },
  {
    "path": "ui/WsjtxWidget.cpp",
    "content": "#include <QDebug>\n#include <QSortFilterProxyModel>\n#include <QScrollBar>\n\n#include \"WsjtxWidget.h\"\n#include \"ui_WsjtxWidget.h\"\n#include \"data/Data.h\"\n#include \"core/debug.h\"\n#include \"rig/Rig.h\"\n#include \"rig/macros.h\"\n#include \"data/StationProfile.h\"\n#include \"ui/ColumnSettingDialog.h\"\n#include \"ui/WsjtxFilterDialog.h\"\n#include \"data/Gridsquare.h\"\n#include \"ui/component/StyleItemDelegate.h\"\n#include \"data/BandPlan.h\"\n#include \"core/LogParam.h\"\n#include \"core/PotaQE.h\"\n#include \"core/WsjtxUDPReceiver.h\"\n\nMODULE_IDENTIFICATION(\"qlog.ui.wsjtxswidget\");\n\nWsjtxWidget::WsjtxWidget(QWidget *parent) :\n    QWidget(parent),\n    ui(new Ui::WsjtxWidget),\n    cqRE(\"(^(?:(?P<word1>(?:CQ|DE|QRZ)(?:\\\\s?DX|\\\\s(?:[A-Z]{1,4}|\\\\d{3}))|[A-Z0-9\\\\/]+|\\\\.{3})\\\\s)(?:(?P<word2>[A-Z0-9\\\\/]+)(?:\\\\s(?P<word3>[-+A-Z0-9]+)(?:\\\\s(?P<word4>(?:OOO|(?!RR73)[A-R]{2}[0-9]{2})))?)?)?)\")\n{\n    FCT_IDENTIFICATION;\n\n    ui->setupUi(this);\n\n    wsjtxTableModel = new WsjtxTableModel(this);\n\n    proxyModel = new QSortFilterProxyModel(this);\n    proxyModel->setSourceModel(wsjtxTableModel);\n    proxyModel->setSortRole(Qt::UserRole);\n\n    ui->tableView->setModel(proxyModel);\n    ui->tableView->setSortingEnabled(true);\n    ui->tableView->sortByColumn(WsjtxTableModel::COLUMN_LAST_ACTIVITY, Qt::DescendingOrder);\n    ui->tableView->setItemDelegateForColumn(WsjtxTableModel::COLUMN_DISTANCE,\n                                            new DistanceFormatDelegate(1, 0.1, ui->tableView));\n    ui->tableView->horizontalHeader()->setSectionsMovable(true);\n    ui->tableView->addAction(ui->actionFilter);\n    ui->tableView->addAction(ui->actionDisplayedColumns);\n\n    restoreTableHeaderState();\n\n    reloadSetting();\n}\n\nvoid WsjtxWidget::decodeReceived(WsjtxDecode decode)\n{\n    FCT_IDENTIFICATION;\n\n    qCDebug(function_parameters)<<decode.message;\n\n    const StationProfile &profile = StationProfilesManager::instance()->getCurProfile1();\n\n    if ( decode.message.startsWith(\"CQ\") )\n    {\n        QRegularExpressionMatch match = cqRE.match((decode.message));\n\n        if (  match.hasMatch() )\n        {\n            WsjtxEntry entry;\n\n            entry.dateTime = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n            entry.decode = decode;\n            entry.callsign = match.captured(3);\n            entry.grid = match.captured(4);\n            entry.dxcc = Data::instance()->lookupDxcc(entry.callsign);\n            entry.status = Data::instance()->dxccStatus(entry.dxcc.dxcc, currBand, BandPlan::MODE_GROUP_STRING_DIGITAL);\n            entry.receivedTime = QDateTime::currentDateTimeUtc();\n            entry.freq = currFreq;\n            entry.band = currBand;\n            entry.decodedMode = status.mode;\n            entry.bandPlanMode = ( status.mode == \"FT8\" ) ? BandPlan::BAND_MODE_FT8\n                   : ( status.mode == \"FT4\" ) ? BandPlan::BAND_MODE_FT4\n                   : ( status.mode == \"FT2\" ) ? BandPlan::BAND_MODE_FT2\n                   : BandPlan::BAND_MODE_DIGITAL;\n            entry.modeGroupString = BandPlan::bandMode2BandModeGroupString(entry.bandPlanMode);\n            entry.spotter = profile.callsign.toUpper();\n            entry.comment = decode.message;\n            entry.dxcc_spotter = Data::instance()->lookupDxcc(entry.spotter);\n            // fix dxcc_spotter based on station prifile setting - cont is not calculated\n            entry.dxcc_spotter.country = profile.country;\n            entry.dxcc_spotter.cqz = profile.cqz;\n            entry.dxcc_spotter.ituz = profile.ituz;\n            entry.dxcc_spotter.dxcc = profile.dxcc;\n            entry.distance = 0.0;\n            entry.potaRef = PotaQE::instance()->findReferenceId(Callsign(entry.callsign), entry.freq).reference;\n            if ( !entry.potaRef.isEmpty() )\n            {\n                entry.containsPOTA = true;\n                entry.comment.append(\" [+] POTA \" + entry.potaRef);\n            }\n            entry.callsign_member = MembershipQE::instance()->query(entry.callsign);\n            entry.dupeCount = Data::countDupe(entry.callsign, entry.band, BandPlan::MODE_GROUP_STRING_DIGITAL);\n            if ( !profile.locator.isEmpty() )\n            {\n                Gridsquare myGrid(profile.locator);\n                double distance;\n\n                if ( myGrid.distanceTo(Gridsquare(entry.grid), distance) )\n                {\n                    entry.distance = round(distance);\n                }\n            }\n\n            emit CQSpot(entry);\n\n            QString unit;\n            qCDebug(runtime)\n                    << \"Continent\" << entry.dxcc.cont.contains(contregexp)\n                    << \"Continent RegExp\" << contregexp\n                    << \"DX Status\" << (entry.status & dxccStatusFilter)\n                    << \"Distance\" << (entry.distance >= distanceFilter)\n                    << \"Curr Distance\" << entry.distance << distanceFilter\n                    << \"SNR\"<< (entry.decode.snr >= snrFilter )\n                    << \"Current SNR\" << snrFilter\n                    << \"Member\" << ( dxMemberFilter.size() == 0\n                         || (dxMemberFilter.size()\n                             && entry.memberList2Set().intersects(dxMemberFilter)));\n\n            if ( entry.dxcc.cont.contains(contregexp)\n                 && ( entry.status & dxccStatusFilter )\n                 && Gridsquare::distance2localeUnitDistance(entry.distance, unit, locale) >= distanceFilter\n                 && entry.decode.snr >= snrFilter\n                 && ( dxMemberFilter.size() == 0\n                      || (dxMemberFilter.size() && entry.memberList2Set().intersects(dxMemberFilter)))\n                  && entry.dupeCount == 0\n               )\n            {\n                wsjtxTableModel->addOrReplaceEntry(entry);\n                emit filteredCQSpot(entry);\n            }\n        }\n    }\n    else\n    {\n        const QStringList &decodedElements = decode.message.split(\" \");\n\n        if ( decodedElements.count() > 1 )\n        {\n            WsjtxEntry entry;\n            entry.callsign = decodedElements.at(1);\n\n            if ( wsjtxTableModel->callsignExists(entry) )\n            {\n                entry.dateTime = QDateTime::currentDateTime().toTimeZone(QTimeZone::utc());\n                entry.dxcc = Data::instance()->lookupDxcc(entry.callsign);\n                entry.status = Data::instance()->dxccStatus(entry.dxcc.dxcc, currBand, BandPlan::MODE_GROUP_STRING_DIGITAL);\n                entry.decode = decode;\n                entry.receivedTime = QDateTime::currentDateTimeUtc();\n                entry.freq = currFreq;\n                entry.band = currBand;\n                entry.decodedMode = status.mode;\n                entry.comment = decode.message;\n                entry.bandPlanMode = ( status.mode == \"FT8\" ) ? BandPlan::BAND_MODE_FT8\n                   : ( status.mode == \"FT4\" ) ? BandPlan::BAND_MODE_FT4\n                   : ( status.mode == \"FT2\" ) ? BandPlan::BAND_MODE_FT2\n                   : BandPlan::BAND_MODE_DIGITAL;\n                entry.modeGroupString = BandPlan::bandMode2BandModeGroupString(entry.bandPlanMode);\n                entry.spotter = profile.callsign.toUpper();\n                entry.dxcc_spotter = Data::instance()->lookupDxcc(entry.spotter);\n                // fix dxcc_spotter based on station prifile setting - cont is not calculated\n                entry.dxcc_spotter.country = profile.country;\n                entry.dxcc_spotter.cqz = profile.cqz;\n                entry.dxcc_spotter.ituz = profile.ituz;\n                entry.dxcc_spotter.dxcc = profile.dxcc;\n                entry.distance = 0.0;\n                entry.dupeCount = Data::countDupe(entry.callsign, entry.band, BandPlan::MODE_GROUP_STRING_DIGITAL);\n                // it is not needed to update entry.callsign_clubs because addOrReplaceEntry does not\n                // update it. Only CQ provides the club membeship info\n\n                wsjtxTableModel->addOrReplaceEntry(entry);\n                emit filteredCQSpot(entry);\n                emit updatedCQSpot(entry);\n            }\n        }\n    }\n\n    wsjtxTableModel->spotAging();\n\n    ui->tableView->repaint();\n}\n\nvoid WsjtxWidget::statusReceived(WsjtxStatus newStatus)\n{\n    FCT_IDENTIFICATION;\n\n    if ( this->status.dial_freq != newStatus.dial_freq )\n    {\n        currFreq = Hz2MHz(newStatus.dial_freq);\n        currBand = BandPlan::freq2Band(currFreq).name;\n        clearTable();\n    }\n\n    if ( this->status.dx_call != newStatus.dx_call\n         || this->status.dx_grid != newStatus.dx_grid )\n    {\n        emit callsignSelected(newStatus.dx_call, newStatus.dx_grid, newStatus.id);\n    }\n\n    if ( this->status.mode != newStatus.mode )\n    {\n        wsjtxTableModel->setCurrentSpotPeriod(WsjtxUDPReceiver::modePeriodLength(newStatus.mode)); /*currently, only Status has a correct Mode in the message */\n        clearTable();\n    }\n\n    if ( !Rig::instance()->isRigConnected() )\n    {\n        const QPair<QString, QString>& legacy = Data::instance()->legacyMode(newStatus.mode);\n        QString mode = ( !legacy.first.isEmpty() ) ? legacy.first\n                                                   : newStatus.mode.toUpper();\n        QString submode = ( !legacy.first.isEmpty() ) ? legacy.second\n                                                      : QString();\n        emit modeChanged(VFO1, newStatus.mode, mode, submode, 0);\n        emit frequencyChanged(VFO1, currFreq, currFreq, currFreq);\n    }\n\n    status = newStatus;\n    wsjtxTableModel->spotAging();\n    ui->tableView->repaint();\n}\n\nvoid WsjtxWidget::tableViewDoubleClicked(QModelIndex index)\n{\n    FCT_IDENTIFICATION;\n\n    const QModelIndex &source_index = proxyModel->mapToSource(index);\n\n    const WsjtxEntry entry = wsjtxTableModel->getEntry(source_index);\n    //emit callsignSelected(entry.callsign, entry.grid); // it is not needed to send this - Qlog receives the change via WSJTX\n    emit reply(entry);\n}\n\nvoid WsjtxWidget::callsignClicked(QString callsign)\n{\n    FCT_IDENTIFICATION;\n\n    const WsjtxEntry entry = wsjtxTableModel->getEntry(callsign);\n    if ( entry.callsign.isEmpty() )\n        return;\n\n    emit callsignSelected(callsign, entry.grid, entry.decode.id);\n    emit reply(entry);\n}\n\nvoid WsjtxWidget::tableViewClicked(QModelIndex)\n{\n    FCT_IDENTIFICATION;\n\n    //const QModelIndex &source_index = proxyModel->mapToSource(index);\n\n    //lastSelectedCallsign = wsjtxTableModel->getEntry(source_index).callsign;\n}\n\nvoid WsjtxWidget::updateSpotsStatusWhenQSOAdded(const QSqlRecord &record)\n{\n    FCT_IDENTIFICATION;\n\n    wsjtxTableModel->removeSpot(record.value(\"callsign\").toString());\n}\n\nvoid WsjtxWidget::displayedColumns()\n{\n    FCT_IDENTIFICATION;\n\n    ColumnSettingSimpleDialog dialog(ui->tableView);\n    dialog.exec();\n    saveTableHeaderState();\n}\n\nvoid WsjtxWidget::actionFilter()\n{\n    FCT_IDENTIFICATION;\n\n    WsjtxFilterDialog dialog;\n\n    if (dialog.exec() == QDialog::Accepted)\n    {\n        reloadSetting();\n        clearTable();\n    }\n}\n\nuint WsjtxWidget::dxccStatusFilterValue() const\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getWsjtxFilterDxccStatus();\n}\n\nQString WsjtxWidget::contFilterRegExp() const\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getWsjtxFilterContRE();\n}\n\nint WsjtxWidget::getDistanceFilterValue() const\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getWsjtxFilterDistance();\n}\n\nint WsjtxWidget::getSNRFilterValue() const\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getWsjtxFilterSNR();\n}\n\nQStringList WsjtxWidget::dxMemberList() const\n{\n    FCT_IDENTIFICATION;\n\n    return LogParam::getWsjtxMemberlists();\n}\n\nvoid WsjtxWidget::reloadSetting()\n{\n    FCT_IDENTIFICATION;\n\n    contregexp.setPatternOptions(QRegularExpression::CaseInsensitiveOption);\n    contregexp.setPattern(contFilterRegExp());\n    dxccStatusFilter = dxccStatusFilterValue();\n    distanceFilter = getDistanceFilterValue();\n    snrFilter = getSNRFilterValue();\n    QStringList tmp = dxMemberList();\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))\n    dxMemberFilter = QSet<QString>(tmp.begin(), tmp.end());\n#else /* Due to ubuntu 20.04 where qt5.12 is present */\n    dxMemberFilter = QSet<QString>(QSet<QString>::fromList(tmp));\n#endif\n\n    ui->filteredLabel->setVisible(isFilterEnabled());\n}\n\nvoid WsjtxWidget::clearTable()\n{\n    FCT_IDENTIFICATION;\n\n    wsjtxTableModel->clear();\n    emit spotsCleared();\n}\n\nvoid WsjtxWidget::saveTableHeaderState()\n{\n    FCT_IDENTIFICATION;\n\n    LogParam::setWsjtxWidgetState(ui->tableView->horizontalHeader()->saveState());\n}\n\nvoid WsjtxWidget::restoreTableHeaderState()\n{\n    FCT_IDENTIFICATION;\n\n    const QByteArray &state = LogParam::getWsjtxWidgetState();\n\n    if (!state.isEmpty())\n    {\n        ui->tableView->horizontalHeader()->restoreState(state);\n    }\n}\n\nbool WsjtxWidget::isFilterEnabled()\n{\n    FCT_IDENTIFICATION;\n\n    return dxccStatusFilter != (DxccStatus::NewEntity | DxccStatus::NewBand |\n                                DxccStatus::NewMode   | DxccStatus::NewSlot |\n                                DxccStatus::Worked    | DxccStatus::Confirmed)\n        || contregexp.pattern().count(\"|\") != 7\n        || distanceFilter > 0\n        || snrFilter > -41\n        || !dxMemberFilter.isEmpty();\n}\n\nWsjtxWidget::~WsjtxWidget()\n{\n    FCT_IDENTIFICATION;\n\n    delete ui;\n}\n\nvoid WsjtxWidget::finalizeBeforeAppExit()\n{\n    FCT_IDENTIFICATION;\n\n    saveTableHeaderState();\n}\n"
  },
  {
    "path": "ui/WsjtxWidget.h",
    "content": "#ifndef QLOG_UI_WSJTXWIDGET_H\n#define QLOG_UI_WSJTXWIDGET_H\n\n#include <QWidget>\n#include <QAbstractTableModel>\n#include <QSortFilterProxyModel>\n#include \"data/WsjtxEntry.h\"\n#include \"models/WsjtxTableModel.h\"\n#include \"rig/Rig.h\"\n#include \"component/ShutdownAwareWidget.h\"\n\n#include \"core/LogLocale.h\"\n#include \"data/WsjtxStatus.h\"\n\nnamespace Ui {\nclass WsjtxWidget;\n}\n\nclass WsjtxWidget : public QWidget, public ShutdownAwareWidget\n{\n    Q_OBJECT\n\npublic:\n    explicit WsjtxWidget(QWidget *parent = nullptr);\n    ~WsjtxWidget();\n    virtual void finalizeBeforeAppExit() override;\n\npublic slots:\n    void decodeReceived(WsjtxDecode);\n    void statusReceived(WsjtxStatus);\n    void tableViewDoubleClicked(QModelIndex);\n    void callsignClicked(QString);\n    void tableViewClicked(QModelIndex);\n    void updateSpotsStatusWhenQSOAdded(const QSqlRecord &record);\n\nprivate slots:\n    void displayedColumns();\n    void actionFilter();\n\nsignals:\n    void callsignSelected(QString callsign, QString grid, QString id);\n    void reply(WsjtxEntry);\n    void CQSpot(WsjtxEntry);\n    void filteredCQSpot(WsjtxEntry);\n    void updatedCQSpot(WsjtxEntry);\n    void spotsCleared();\n    void frequencyChanged(VFOID, double, double, double);\n    void modeChanged(VFOID, QString, QString, QString, qint32);\n\nprivate:\n    uint dxccStatusFilterValue() const;\n    QString contFilterRegExp() const;\n    int getDistanceFilterValue() const;\n    int getSNRFilterValue() const;\n    QStringList dxMemberList() const;\n    void reloadSetting();\n    void clearTable();\n\n    WsjtxTableModel* wsjtxTableModel;\n    WsjtxStatus status;\n    QString currBand;\n    double currFreq;\n    Ui::WsjtxWidget *ui;\n    QSortFilterProxyModel *proxyModel;\n    QRegularExpression contregexp;\n    QRegularExpression cqRE;\n    int distanceFilter;\n    int snrFilter;\n    uint dxccStatusFilter;\n    QSet<QString> dxMemberFilter;\n    LogLocale locale;\n\n    void saveTableHeaderState();\n    void restoreTableHeaderState();\n    bool isFilterEnabled();\n};\n\n#endif // QLOG_UI_WSJTXWIDGET_H\n"
  },
  {
    "path": "ui/WsjtxWidget.ui",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<ui version=\"4.0\">\n <class>WsjtxWidget</class>\n <widget class=\"QWidget\" name=\"WsjtxWidget\">\n  <property name=\"geometry\">\n   <rect>\n    <x>0</x>\n    <y>0</y>\n    <width>400</width>\n    <height>300</height>\n   </rect>\n  </property>\n  <property name=\"windowTitle\">\n   <string>Form</string>\n  </property>\n  <layout class=\"QVBoxLayout\" name=\"verticalLayout\">\n   <property name=\"leftMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"topMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"rightMargin\">\n    <number>0</number>\n   </property>\n   <property name=\"bottomMargin\">\n    <number>0</number>\n   </property>\n   <item>\n    <widget class=\"QLabel\" name=\"filteredLabel\">\n     <property name=\"sizePolicy\">\n      <sizepolicy hsizetype=\"Maximum\" vsizetype=\"Maximum\">\n       <horstretch>0</horstretch>\n       <verstretch>0</verstretch>\n      </sizepolicy>\n     </property>\n     <property name=\"styleSheet\">\n      <string notr=\"true\">color: red</string>\n     </property>\n     <property name=\"text\">\n      <string>Filtered</string>\n     </property>\n     <property name=\"alignment\">\n      <set>Qt::AlignCenter</set>\n     </property>\n     <property name=\"textInteractionFlags\">\n      <set>Qt::NoTextInteraction</set>\n     </property>\n    </widget>\n   </item>\n   <item>\n    <widget class=\"QTableView\" name=\"tableView\">\n     <property name=\"focusPolicy\">\n      <enum>Qt::ClickFocus</enum>\n     </property>\n     <property name=\"contextMenuPolicy\">\n      <enum>Qt::ActionsContextMenu</enum>\n     </property>\n     <property name=\"sizeAdjustPolicy\">\n      <enum>QAbstractScrollArea::AdjustToContents</enum>\n     </property>\n     <property name=\"editTriggers\">\n      <set>QAbstractItemView::NoEditTriggers</set>\n     </property>\n     <property name=\"tabKeyNavigation\">\n      <bool>false</bool>\n     </property>\n     <property name=\"alternatingRowColors\">\n      <bool>true</bool>\n     </property>\n     <property name=\"selectionMode\">\n      <enum>QAbstractItemView::SingleSelection</enum>\n     </property>\n     <property name=\"selectionBehavior\">\n      <enum>QAbstractItemView::SelectRows</enum>\n     </property>\n     <property name=\"verticalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"horizontalScrollMode\">\n      <enum>QAbstractItemView::ScrollPerPixel</enum>\n     </property>\n     <property name=\"sortingEnabled\">\n      <bool>true</bool>\n     </property>\n     <attribute name=\"horizontalHeaderMinimumSectionSize\">\n      <number>24</number>\n     </attribute>\n     <attribute name=\"horizontalHeaderDefaultSectionSize\">\n      <number>100</number>\n     </attribute>\n     <attribute name=\"horizontalHeaderHighlightSections\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"horizontalHeaderShowSortIndicator\" stdset=\"0\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"horizontalHeaderStretchLastSection\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderVisible\">\n      <bool>true</bool>\n     </attribute>\n     <attribute name=\"verticalHeaderMinimumSectionSize\">\n      <number>20</number>\n     </attribute>\n     <attribute name=\"verticalHeaderDefaultSectionSize\">\n      <number>20</number>\n     </attribute>\n     <attribute name=\"verticalHeaderStretchLastSection\">\n      <bool>false</bool>\n     </attribute>\n    </widget>\n   </item>\n  </layout>\n  <action name=\"actionDisplayedColumns\">\n   <property name=\"text\">\n    <string>Column Visibility...</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Which columns should be displayed</string>\n   </property>\n  </action>\n  <action name=\"actionFilter\">\n   <property name=\"icon\">\n    <iconset resource=\"../res/icons/icons.qrc\">\n     <normaloff>:/icons/filter_list-24px.svg</normaloff>:/icons/filter_list-24px.svg</iconset>\n   </property>\n   <property name=\"text\">\n    <string>Filter...</string>\n   </property>\n   <property name=\"toolTip\">\n    <string>Filter Spots</string>\n   </property>\n  </action>\n </widget>\n <resources>\n  <include location=\"../res/icons/icons.qrc\"/>\n </resources>\n <connections>\n  <connection>\n   <sender>tableView</sender>\n   <signal>doubleClicked(QModelIndex)</signal>\n   <receiver>WsjtxWidget</receiver>\n   <slot>tableViewDoubleClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>199</x>\n     <y>181</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>tableView</sender>\n   <signal>clicked(QModelIndex)</signal>\n   <receiver>WsjtxWidget</receiver>\n   <slot>tableViewClicked(QModelIndex)</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>199</x>\n     <y>162</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionDisplayedColumns</sender>\n   <signal>triggered()</signal>\n   <receiver>WsjtxWidget</receiver>\n   <slot>displayedColumns()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n  <connection>\n   <sender>actionFilter</sender>\n   <signal>triggered()</signal>\n   <receiver>WsjtxWidget</receiver>\n   <slot>actionFilter()</slot>\n   <hints>\n    <hint type=\"sourcelabel\">\n     <x>-1</x>\n     <y>-1</y>\n    </hint>\n    <hint type=\"destinationlabel\">\n     <x>199</x>\n     <y>149</y>\n    </hint>\n   </hints>\n  </connection>\n </connections>\n <slots>\n  <slot>tableViewDoubleClicked(QModelIndex)</slot>\n  <slot>tableViewClicked(QModelIndex)</slot>\n  <slot>displayedColumns()</slot>\n  <slot>actionFilter()</slot>\n </slots>\n</ui>\n"
  },
  {
    "path": "ui/component/BaseDoubleSpinBox.cpp",
    "content": "#include <QKeyEvent>\n#include \"BaseDoubleSpinBox.h\"\n\nBaseDoubleSpinBox::BaseDoubleSpinBox(QWidget *parent) :\n    QDoubleSpinBox(parent)\n{\n    setLocale(QLocale::C);\n}\n\nvoid BaseDoubleSpinBox::keyPressEvent(QKeyEvent *event)\n{\n    if ( event->key() == ',' ) return; // supress\n\n    QDoubleSpinBox::keyPressEvent(event);\n}\n"
  },
  {
    "path": "ui/component/BaseDoubleSpinBox.h",
    "content": "#ifndef BASEDOUBLESPINBOX_H\n#define BASEDOUBLESPINBOX_H\n\n#include <QDoubleSpinBox>\n\nclass BaseDoubleSpinBox : public QDoubleSpinBox\n{\npublic:\n    BaseDoubleSpinBox(QWidget *parent = nullptr);\n    virtual ~BaseDoubleSpinBox(){};\n\nprotected:\n    virtual void keyPressEvent(QKeyEvent *event) override;\n};\n\n#endif // BASEDOUBLESPINBOX_H\n"
  },
  {
    "path": "ui/component/ButtonStyle.h",
    "content": "/*\n * This is nearly complete Material design Switch widget implementation in qtwidgets module.\n * More info: https://material.io/design/components/selection-controls.html#switches\n * Copyright (C) 2018 Iman Ahmadvand\n *\n * This is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * It is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n*/\n\n#ifndef QLOG_UI_COMPONENT_BUTTONSTYLE_H\n#define QLOG_UI_COMPONENT_BUTTONSTYLE_H\n\n#include <QtCore/qeasingcurve.h>\n#include <QFont>\n#include <QMargins>\n#include <QColor>\n#include <QPixmap>\n#include <QPainter>\n\n\n\nQ_DECL_IMPORT void qt_blurImage(QPainter *p, QImage &blurImage, qreal radius, bool quality, bool alphaOnly, int transposed = 0); // src/widgets/effects/qpixmapfilter.cpp\n\nnamespace Style {\n\n#define cyan500 QColor(\"#00bcd4\")\n#define gray50 QColor(\"#fafafa\")\n#define gray400 QColor(\"#bdbdbd\")\n\n    using Type = QEasingCurve::Type;\n\n    struct Animation {\n        Animation() = default;\n        Animation(Type _easing, int _duration) :easing{ _easing }, duration{ _duration } {\n\n        }\n\n        Type easing;\n        int duration;\n    };\n\n    struct Switch {\n        Switch() :\n            height{ 24 },\n            //font{ QFont(\"Roboto medium\", 13) },\n            indicatorMargin{ QMargins(8, 8, 8, 8) },\n            thumbOnBrush{ cyan500 },\n            thumbOnOpacity{ 1 },\n            trackOnBrush{ cyan500 },\n            trackOnOpacity{ 0.5 },\n            thumbOffBrush{ gray50 },\n            thumbOffOpacity{ 1 },\n            trackOffBrush{ Qt::black },\n            trackOffOpacity{ 0.38 },\n            thumbDisabled{ gray400 },\n            thumbDisabledOpacity{ 1 },\n            trackDisabled{ Qt::black },\n            trackDisabledOpacity{ 0.12 },\n            textColor{ Qt::black },\n            disabledTextOpacity{ 0.26 },\n            thumbBrushAnimation{ Animation(Type::Linear, 150) },\n            trackBrushAnimation{ Animation(Type::Linear, 150) },\n            thumbPosAniamtion{ Animation(Type::InOutQuad, 150) } {\n\n        }\n\n        int height;\n        QFont font;\n        QMargins indicatorMargin;\n        QColor thumbOnBrush;\n        double thumbOnOpacity;\n        QColor trackOnBrush;\n        double trackOnOpacity;\n        QColor thumbOffBrush;\n        double thumbOffOpacity;\n        QColor trackOffBrush;\n        double trackOffOpacity;\n        QColor thumbDisabled;\n        double thumbDisabledOpacity;\n        QColor trackDisabled;\n        double trackDisabledOpacity;\n        QColor textColor;\n        double disabledTextOpacity;\n        Animation thumbBrushAnimation;\n        Animation trackBrushAnimation;\n        Animation thumbPosAniamtion;\n    };\n\n    inline QPixmap drawShadowEllipse(qreal radius, qreal elevation, const QColor& color) {\n        auto px = QPixmap(radius * 2, radius * 2);\n        px.fill(Qt::transparent);\n\n        { // draw ellipes\n            QPainter p(&px);\n            p.setBrush(color);\n            p.setPen(Qt::NoPen);\n            p.setRenderHint(QPainter::Antialiasing, true);\n            p.drawEllipse(QRectF(0, 0, px.size().width(), px.size().height()).center(), radius - elevation, radius - elevation);\n        }\n\n        QImage tmp(px.size(), QImage::Format_ARGB32_Premultiplied);\n        tmp.setDevicePixelRatio(px.devicePixelRatioF());\n        tmp.fill(0);\n        QPainter tmpPainter(&tmp);\n        tmpPainter.setCompositionMode(QPainter::CompositionMode_Source);\n        tmpPainter.drawPixmap(QPointF(), px);\n        tmpPainter.end();\n\n        // blur the alpha channel\n        QImage blurred(tmp.size(), QImage::Format_ARGB32_Premultiplied);\n        blurred.setDevicePixelRatio(px.devicePixelRatioF());\n        blurred.fill(0);\n        {\n            QPainter blurPainter(&blurred);\n            qt_blurImage(&blurPainter, tmp, elevation * 4., true, false);\n        }\n\n        tmp = blurred;\n\n        return QPixmap::fromImage(tmp);\n    }\n\n} // namespace Style\n\n#endif // QLOG_UI_COMPONENT_BUTTONSTYLE_H\n\n"
  },
  {
    "path": "ui/component/EditLine.cpp",
    "content": "#include <QFocusEvent>\n#include <QCompleter>\n#include <QSerialPortInfo>\n#include <QDir>\n#include <QAbstractItemView>\n#include \"EditLine.h\"\n\n\nNewContactEditLine::NewContactEditLine(QWidget *parent) :\n    QLineEdit(parent),\n    spaceForbiddenFlag(false)\n{\n\n}\n\nvoid NewContactEditLine::focusInEvent(QFocusEvent *event)\n{\n    QLineEdit::focusInEvent(event);\n\n    Qt::FocusReason reason = event->reason();\n\n    if ( reason != Qt::ActiveWindowFocusReason &&\n         reason != Qt::PopupFocusReason )\n    {\n        end(false);\n        emit focusIn();\n    }\n\n    //Deselect text when focus\n    if ( hasSelectedText() && reason != Qt::PopupFocusReason )\n    {\n        deselect();\n    }\n}\n\nvoid NewContactEditLine::focusOutEvent(QFocusEvent *event)\n{\n    QLineEdit::focusOutEvent(event);\n\n    Qt::FocusReason reason = event->reason();\n\n    if ( reason != Qt::ActiveWindowFocusReason &&\n         reason != Qt::PopupFocusReason )\n    {\n        home(false);\n        emit focusOut();\n    }\n}\n\nvoid NewContactEditLine::keyPressEvent(QKeyEvent *event)\n{\n    if ( spaceForbiddenFlag && event->key() == Qt::Key_Space )\n        focusNextChild();\n    else\n        QLineEdit::keyPressEvent(event);\n}\n\nvoid NewContactEditLine::setText(const QString &text)\n{\n    QLineEdit::setText(text);\n    home(false);\n}\n\nvoid NewContactEditLine::spaceForbidden(bool inSpaceForbidden)\n{\n    spaceForbiddenFlag = inSpaceForbidden;\n}\n\nNewContactRSTEditLine::NewContactRSTEditLine(QWidget *parent) :\n    NewContactEditLine(parent),\n    focusInSelectionOffset(0)\n{\n    setInputMask(\"xxxxxxx;\");\n}\n\nvoid NewContactRSTEditLine::setSelectionOffset(int offset)\n{\n    focusInSelectionOffset = offset;\n}\n\nvoid NewContactRSTEditLine::setMaxLength(int len)\n{\n    NewContactEditLine::setMaxLength(len);\n    setInputMask(QString(len, 'x') + ';');\n}\n\nvoid NewContactRSTEditLine::focusInEvent(QFocusEvent *event)\n{\n    NewContactEditLine::focusInEvent(event);\n\n    int position = 0;\n\n    if ( event->reason() != Qt::PopupFocusReason && !text().isEmpty() && text().length() >= focusInSelectionOffset )\n        position = focusInSelectionOffset;\n\n    setCursorPosition(position);\n}\n\nSerialPortEditLine::SerialPortEditLine(QWidget *parent) :\n    QLineEdit(parent)\n{\n    const QList<QSerialPortInfo> &ports = QSerialPortInfo::availablePorts();\n    QStringList portNames;\n\n#if defined(Q_OS_WIN)\n    for (const QSerialPortInfo &port : ports)\n        portNames << port.portName();\n#elif defined(Q_OS_MACOS)\n    for (const QSerialPortInfo &port : ports)\n        portNames << QString(\"/dev/%1\").arg(port.portName());\n#else\n    // In the case of Linux, it is good to use /dev/serial/by-id\n    // because it does not change over time.\n    // obtain /dev/serial/by-id files\n    QDir dir(\"/dev/serial/by-id\");\n    const QStringList &symlinks = dir.entryList(QDir::System | QDir::Readable | QDir::NoDotAndDotDot);\n\n    for ( const QSerialPortInfo &port : ports )\n    {\n        QString dev = QString(\"/dev/%1\").arg(port.portName());\n        QString niceName = dev;\n\n        // try to find symlink\n        for ( const QString &entry : symlinks )\n        {\n            QString fullPath = dir.absoluteFilePath(entry);\n            QFileInfo fi(fullPath);\n            if ( fi.canonicalFilePath() == dev )\n            {\n                niceName = fullPath;\n                break;\n            }\n        }\n        portNames << niceName;\n    }\n#endif\n    QCompleter *completer = new QCompleter(portNames, this);\n    QAbstractItemView *popup = completer->popup();\n    popup->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n    popup->setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);\n    setCompleter(completer);\n}\n\nvoid SerialPortEditLine::focusInEvent(QFocusEvent *event)\n{\n    QLineEdit::focusInEvent(event);\n#if defined(Q_OS_WIN)\n    completer()->setCompletionPrefix(\"COM\");\n    completer()->complete();\n#else\n    completer()->setCompletionPrefix(\"/dev/\");\n    completer()->complete();\n#endif\n}\n"
  },
  {
    "path": "ui/component/EditLine.h",
    "content": "#ifndef QLOG_UI_COMPONENT_EDITLINE_H\n#define QLOG_UI_COMPONENT_EDITLINE_H\n\n#include <QObject>\n#include <QLineEdit>\n\nclass NewContactEditLine : public QLineEdit\n{\n    Q_OBJECT\n\npublic:\n    explicit NewContactEditLine(QWidget *parent = nullptr);\n    void setText(const QString & text);\n    void spaceForbidden(bool);\n\nsignals:\n    void focusIn();\n    void focusOut();\n\nprotected:\n    void focusInEvent(QFocusEvent* event) override;\n    void focusOutEvent(QFocusEvent* event) override;\n    void keyPressEvent(QKeyEvent *event) override;\n    bool spaceForbiddenFlag;\n};\n\nclass NewContactRSTEditLine : public NewContactEditLine\n{\n    Q_OBJECT\n\npublic:\n    explicit NewContactRSTEditLine(QWidget *parent = nullptr);\n    void setSelectionOffset(int offset);\n    void setMaxLength(int len);\n\nprotected:\n    void focusInEvent(QFocusEvent* event) override;\n    int focusInSelectionOffset;\n};\n\nclass SerialPortEditLine : public QLineEdit\n{\n    Q_OBJECT\n\npublic:\n    explicit SerialPortEditLine(QWidget *parent = nullptr);\n\nprotected:\n    void focusInEvent(QFocusEvent* event) override;\n};\n\n#endif // QLOG_UI_COMPONENT_EDITLINE_H\n"
  },
  {
    "path": "ui/component/FreqQSpinBox.cpp",
    "content": "#include \"ui/component/FreqQSpinBox.h\"\n#include <QKeyEvent>\n#include <QLineEdit>\n#include \"data/BandPlan.h\"\n\nFreqQSpinBox::FreqQSpinBox(QWidget *parent) :\n    BaseDoubleSpinBox(parent),\n    selectionModeEnabled(true)\n{\n    loadBands();\n\n    debounceTimer.setSingleShot(true);\n    connect(&debounceTimer, &QTimer::timeout,\n            this, &FreqQSpinBox::flushDebounced);\n    connect(this, QOverload<double>::of(&QDoubleSpinBox::valueChanged),\n            this, &FreqQSpinBox::onValueChangedImmediate);\n}\n\nvoid FreqQSpinBox::setSelectionModeEnabled(bool enabled)\n{\n    selectionModeEnabled = enabled;\n\n    if ( !enabled )\n        if (auto le = lineEdit()) le->deselect();\n}\n\nvoid FreqQSpinBox::setDebounceEnabled(bool enabled)\n{\n    if ( debounceEnabled == enabled ) return;\n\n    debounceEnabled = enabled;\n\n    if ( !debounceEnabled )\n    {\n        if ( debounceTimer.isActive() )debounceTimer.stop();\n        flushDebounced();\n    }\n}\n\nvoid FreqQSpinBox::setDebounceIntervalMs(int ms)\n{\n    debounceMs = qMax(0, ms);\n}\n\nvoid FreqQSpinBox::loadBands()\n{\n    enabledBands = BandPlan::bandsList(false, true);\n}\n\nvoid FreqQSpinBox::keyPressEvent(QKeyEvent *event)\n{\n    if ( isReadOnly() )\n    {\n        BaseDoubleSpinBox::keyPressEvent(event);\n        return;\n    }\n\n    if ( event->key() == Qt::Key_PageUp )\n    {\n        increaseByBand();\n        event->accept();\n        return;\n    }\n    else if ( event->key() == Qt::Key_PageDown )\n    {\n        decreaseByBand();\n        event->accept();\n        return;\n    }\n\n    BaseDoubleSpinBox::keyPressEvent(event);\n}\n\nvoid FreqQSpinBox::wheelEvent(QWheelEvent *event)\n{\n    if ( isReadOnly() )\n    {\n        BaseDoubleSpinBox::wheelEvent(event);\n        return;\n    }\n\n    if ( event->modifiers() & Qt::ControlModifier )\n    {\n        if ( event->angleDelta().y() > 0 )\n            increaseByBand();\n        else\n            decreaseByBand();\n        event->accept();\n        return;\n    }\n    BaseDoubleSpinBox::wheelEvent(event);\n}\n\nvoid FreqQSpinBox::stepBy(int steps)\n{\n    BaseDoubleSpinBox::stepBy(steps);\n\n    if ( !selectionModeEnabled )\n        if (auto le = lineEdit()) le->deselect();\n}\n\nvoid FreqQSpinBox::onValueChangedImmediate(double v)\n{\n    if ( !debounceEnabled )\n    {\n        emit debouncedValueChanged(v);\n        return;\n    }\n\n    pendingValue = v;\n    hasPending = true;\n\n    if ( debounceMs == 0 )\n    {\n        flushDebounced();\n        return;\n    }\n    debounceTimer.start(debounceMs);\n}\n\nvoid FreqQSpinBox::flushDebounced()\n{\n    if ( !hasPending ) return;\n\n    hasPending = false;\n    emit debouncedValueChanged(pendingValue);\n}\n\nvoid FreqQSpinBox::increaseByBand()\n{\n    if ( enabledBands.size() == 0 )\n        return;\n\n    for ( const Band &band : static_cast<const QList<Band>&>(enabledBands) )\n    {\n        if ( band.start > value() )\n        {\n            setValue(band.start);\n            maybeSelectAll();\n            return;\n        }\n    }\n}\n\nvoid FreqQSpinBox::decreaseByBand()\n{\n    if ( enabledBands.size() == 0 )\n        return;\n\n    double result = enabledBands.at(0).start;\n\n    for ( const Band &band : static_cast<const QList<Band>&>(enabledBands) )\n    {\n        if ( band.start < value() )\n            result = band.start;\n    }\n\n    setValue(result);\n    maybeSelectAll();\n}\n\nvoid FreqQSpinBox::maybeSelectAll()\n{\n    if ( !selectionModeEnabled ) return;\n\n    selectAll();\n}\n"
  },
  {
    "path": "ui/component/FreqQSpinBox.h",
    "content": "#ifndef QLOG_UI_COMPONENT_FREQQSPINBOX_H\n#define QLOG_UI_COMPONENT_FREQQSPINBOX_H\n\n#include <data/Band.h>\n#include \"ui/component/BaseDoubleSpinBox.h\"\n\nclass FreqQSpinBox : public BaseDoubleSpinBox\n{\n    Q_OBJECT\n\npublic:\n    FreqQSpinBox(QWidget *parent = nullptr);\n    virtual ~FreqQSpinBox() {};\n    void setSelectionModeEnabled(bool enabled);\n    void setDebounceEnabled(bool enabled);\n    void setDebounceIntervalMs(int ms);\n\npublic slots:\n    void loadBands();\n\nsignals:\n    void debouncedValueChanged(double value);\n\nprotected:\n    virtual void keyPressEvent(QKeyEvent *event) override;\n    virtual void wheelEvent(QWheelEvent *event) override;\n    virtual void stepBy(int steps) override;\n\nprivate slots:\n    void onValueChangedImmediate(double v);\n    void flushDebounced();\n\nprivate:\n    void increaseByBand();\n    void decreaseByBand();\n    void maybeSelectAll();\n\n    QList<Band> enabledBands;\n    bool selectionModeEnabled;\n    QTimer debounceTimer;\n    int    debounceMs = 150;\n    bool   debounceEnabled = false;\n    double pendingValue = 0.0;\n    bool   hasPending = false;\n};\n\n#endif // QLOG_UI_COMPONENT_FREQQSPINBOX_H\n"
  },
  {
    "path": "ui/component/MultiselectCompleter.cpp",
    "content": "#include <QLineEdit>\n#include \"ui/component/MultiselectCompleter.h\"\n\nMultiselectCompleter::MultiselectCompleter(const QStringList& items, QObject* parent)\n    : QCompleter(items, parent)\n{\n}\n\nQString MultiselectCompleter::pathFromIndex( const QModelIndex& index ) const\n{\n    QString path = QCompleter::pathFromIndex(index);\n    const QString &text = static_cast<QLineEdit*>(widget())->text();\n\n    int pos = text.lastIndexOf(',');\n    if ( pos >= 0 )\n        path = text.left(pos) + \", \" + path;\n\n    return path;\n}\n\nQStringList MultiselectCompleter::splitPath( const QString& path ) const\n{\n    int pos = path.lastIndexOf(',') + 1;\n    while ( pos < path.length() && path.at(pos) == QLatin1Char(' ') )\n        pos++;\n\n    return QStringList(path.mid(pos));\n}\n"
  },
  {
    "path": "ui/component/MultiselectCompleter.h",
    "content": "#ifndef QLOG_UI_COMPONENT_MULTISELECTCOMPLETER_H\n#define QLOG_UI_COMPONENT_MULTISELECTCOMPLETER_H\n\n#include <QCompleter>\n\nclass MultiselectCompleter : public QCompleter\n{\n    Q_OBJECT\n\npublic:\n    explicit MultiselectCompleter(const QStringList &items,\n                                  QObject *parent = nullptr);\n    ~MultiselectCompleter() {};\n\npublic:\n    QString pathFromIndex( const QModelIndex& index ) const;\n    QStringList splitPath( const QString& path ) const;\n};\n\n#endif // QLOG_UI_COMPONENT_MULTISELECTCOMPLETER_H\n"
  },
  {
    "path": "ui/component/RepeatButton.cpp",
    "content": "#include <QMouseEvent>\n#include <QApplication>\n#include <QPainter>\n#include <QProgressBar>\n#include \"RepeatButton.h\"\n\nRepeatButton::RepeatButton(QWidget *parent) :\n    QPushButton(parent),\n    timer(new QTimer(this)),\n    interval(0),\n    progress(0)\n{   \n    connect(timer, &QTimer::timeout, this, &RepeatButton::onTimeout);\n    connect(&updateTimer, &QTimer::timeout, this, &RepeatButton::updateProgress);\n\n    QProgressBar bar;\n    filledColor = bar.palette().color(QPalette::Highlight);\n    filledColor.setAlpha(128);\n}\n\nvoid RepeatButton::stop()\n{\n    timer->stop();\n    updateTimer.stop();\n    progress = 0;\n    update();\n}\n\nvoid RepeatButton::handleClick()\n{\n    lastPressTime = QDateTime::currentDateTime();\n\n    if ( !timer->isActive() )\n    {\n        interval = 0;\n        QPushButton::click();\n    }\n    else\n        stop();\n}\n\nvoid RepeatButton::resetInterval()\n{\n    lastPressTime = QDateTime();\n    interval = 0;\n}\n\nvoid RepeatButton::repeatClick()\n{\n    if ( timer->isActive() ) return;\n\n    repeateEventDetected();\n    QPushButton::click();\n}\n\nvoid RepeatButton::repeateEventDetected()\n{\n    if ( interval == 0 )\n    {\n        if ( lastPressTime.isNull() ) return;\n        interval = lastPressTime.msecsTo(QDateTime::currentDateTime());\n    }\n    startRepeating();\n}\n\nvoid RepeatButton::startRepeating()\n{\n    if ( interval > 0 )\n    {\n        timer->start(interval);\n        updateTimer.start(20);\n        elapsed.start();\n    }\n}\n\nvoid RepeatButton::mousePressEvent(QMouseEvent *event)\n{\n    if ( event->button() == Qt::LeftButton )\n    {\n        if( QApplication::keyboardModifiers() & Qt::ShiftModifier )\n            repeateEventDetected();\n        else\n        {\n            handleClick();\n            return;\n        }\n    }\n    QPushButton::mousePressEvent(event);\n}\n\nvoid RepeatButton::paintEvent(QPaintEvent *event)\n{\n    QPushButton::paintEvent(event);\n\n    if ( timer->isActive() )\n    {\n        QPainter p(this);\n        p.setRenderHint(QPainter::Antialiasing);\n        p.setBrush(filledColor);\n        p.setPen(Qt::NoPen);\n\n        int fillWidth = width() * progress / 100;\n        QRect rect(0, 0, fillWidth, height());\n        p.drawRect(rect);\n    }\n}\n\nvoid RepeatButton::onTimeout()\n{\n    QPushButton::click();\n    elapsed.restart();\n}\n\nvoid RepeatButton::updateProgress()\n{\n    if ( timer->isActive() )\n    {\n        int i_progress = elapsed.elapsed() * 100 / interval;\n        progress = qMin(i_progress, 100);\n        update();\n    }\n}\n\n\n"
  },
  {
    "path": "ui/component/RepeatButton.h",
    "content": "#ifndef REPEATBUTTON_H\n#define REPEATBUTTON_H\n\n#include <QPushButton>\n#include <QElapsedTimer>\n#include <QTimer>\n#include <QDateTime>\n\nclass RepeatButton : public QPushButton\n{\n    Q_OBJECT\npublic:\n    RepeatButton(QWidget *parent = nullptr);\n\npublic slots:\n    void repeatClick();\n    void stop();\n    void handleClick();\n    void resetInterval();\n\nprotected:\n    void mousePressEvent(QMouseEvent *event) override;\n    void paintEvent(QPaintEvent *event) override;\n\nprivate slots:\n    void onTimeout();\n    void updateProgress();\n\nprivate:\n    void startRepeating();\n    void repeateEventDetected();\n    QTimer *timer;\n    QTimer updateTimer;\n    QDateTime lastPressTime;\n    QElapsedTimer elapsed;\n    int interval = 0;\n    int progress = 0;\n    QColor filledColor;\n};\n\n#endif // REPEATBUTTON_H\n"
  },
  {
    "path": "ui/component/ShutdownAwareWidget.h",
    "content": "#ifndef QLOG_UI_COMPONENT_SHUTDOWNAWAREWIDGET_H\n#define QLOG_UI_COMPONENT_SHUTDOWNAWAREWIDGET_H\n\nclass ShutdownAwareWidget\n{\npublic:\n    virtual ~ShutdownAwareWidget() {};\n    virtual void finalizeBeforeAppExit() = 0;\n};\n\n#endif // QLOG_UI_COMPONENT_SHUTDOWNAWAREWIDGET_H\n"
  },
  {
    "path": "ui/component/SmartSearchBox.cpp",
    "content": "#include \"SmartSearchBox.h\"\n\n#include <QVBoxLayout>\n#include <QStandardItem>\n#include <QAbstractTableModel>\n#include <QPushButton>\n#include <QEvent>\n#include <QKeyEvent>\n#include <QTimer>\n#include <QCoreApplication>\n#include \"models/SqlListModel.h\"\n\nSmartSearchBox::SmartSearchBox(QWidget *parent)\n    : QWidget(parent),\n      searchField(new QLineEdit(this)),\n      listView(new QListView(this)),\n      popup(new QDialog(this, Qt::Popup)),\n      filterModel(new QSortFilterProxyModel(this)),\n      selectedColumn(0),\n      maxRowsInList(10),\n      highlightWhenEnable(false)\n{\n    filterModel->setSourceModel(nullptr);\n    filterModel->setFilterCaseSensitivity(Qt::CaseInsensitive);\n    filterModel->setFilterRole(Qt::DisplayRole);\n\n    listView->setModel(filterModel);\n    listView->setObjectName(\"SearchListView\");\n\n    searchField->setClearButtonEnabled(true);\n    searchField->setObjectName(\"SearchBox\");\n    searchField->setPlaceholderText(tr(\"Search\"));\n\n    QVBoxLayout *popupLayout = new QVBoxLayout(popup);\n    popupLayout->setContentsMargins(5, 5, 5, 5);\n    popupLayout->addWidget(searchField);\n    popupLayout->addWidget(listView);\n    popup->setLayout(popupLayout);\n    popup->setObjectName(\"SearchPopup\");\n\n    connect(searchField, &QLineEdit::textChanged, this, &SmartSearchBox::onTextChanged);\n    connect(listView, &QListView::clicked, this, &SmartSearchBox::onItemClicked);\n\n    openButton = new QPushButton(this);\n    connect(openButton, &QPushButton::clicked, this, [this]()\n    {\n        popup->move(mapToGlobal(QPoint(0, height())));\n        popup->show();\n        adjustPopupSize();\n        searchField->setFocus();\n    });\n\n    QVBoxLayout *mainLayout = new QVBoxLayout(this);\n    mainLayout->setContentsMargins(0, 0, 0, 0);\n    mainLayout->addWidget(openButton);\n    setLayout(mainLayout);\n\n    searchField->installEventFilter(this);\n    listView->installEventFilter(this);\n    popup->installEventFilter(this);\n\n    connect(popup, &QDialog::finished, this, [this]()\n    {\n        searchField->clear();\n    });\n\n    setFocusProxy(openButton);\n}\n\nvoid SmartSearchBox::setModel(QAbstractItemModel *model)\n{\n    if ( !model ) return ;\n\n    SqlListModel *sqlModel = qobject_cast<SqlListModel*>(model);\n\n    if ( sqlModel )\n        while (sqlModel->canFetchMore()) sqlModel->fetchMore();\n\n    filterModel->setSourceModel(model);\n}\n\nvoid SmartSearchBox::onTextChanged(const QString &text)\n{\n    filterModel->setFilterRegularExpression(QRegularExpression::escape(text));\n\n    if ( filterModel->rowCount() == 0 )\n    {\n        listView->clearSelection();\n        return;\n    }\n\n    QModelIndex indexToSelect;\n\n    if (text.isEmpty())\n        indexToSelect = currentValueSourceIndex.isValid()  ? filterModel->mapFromSource(currentValueSourceIndex)\n                                                           : filterModel->index(0, selectedColumn);\n    else\n        indexToSelect = filterModel->index(0, selectedColumn);\n\n    if ( indexToSelect.isValid() )\n        listView->setCurrentIndex(indexToSelect);\n}\n\nvoid SmartSearchBox::onItemClicked(const QModelIndex &index)\n{\n    const QModelIndex &sourceIndex = filterModel->mapToSource(index);\n    currentValueSourceIndex = sourceIndex;\n    popup->hide();\n    searchField->clear();\n    changeButtonText(currentText());\n}\n\nbool SmartSearchBox::eventFilter(QObject *obj, QEvent *event)\n{\n\n    // This is a hack for pressing the ESC key for closing the Widget\n    // It is defined as a Global Shortcut, but the problem is that the global shortcut consumes this event.\n    // Therefore, the event never reaches this widget.\n    // A suitable event was found for the ESC key press that is generated and does not negatively affect\n    // the other widget functionalities.\n    if ( event->type() == QEvent::KeyRelease\n         && obj == popup\n         && !this->hasFocus() && !popup->hasFocus() && !searchField->hasFocus() && ! listView->hasFocus())\n    {\n        searchField->clear();\n        popup->hide();\n        return QWidget::eventFilter(obj, event);\n    }\n\n    if ( event->type() != QEvent::KeyPress )\n        return QWidget::eventFilter(obj, event);\n\n    QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);\n    int key = keyEvent->key();\n\n    if ( obj == searchField )\n    {\n        if ( (key == Qt::Key_Down || key == Qt::Key_Up) && filterModel->rowCount() > 0 )\n        {\n            listView->setFocus();\n\n            QModelIndex currIndex = listView->currentIndex();\n            int currentRow = currIndex.isValid() ? currIndex.row()\n                                                    : (key == Qt::Key_Up ? filterModel->rowCount() : -1);\n            int nextRow = currentRow + (key == Qt::Key_Down ? 1 : -1);\n\n            if ( nextRow < 0 ) nextRow = 0;\n            else if ( nextRow >= filterModel->rowCount() ) nextRow = filterModel->rowCount() - 1;\n\n            listView->setCurrentIndex(filterModel->index(nextRow, selectedColumn));\n            return true;\n        }\n\n        if ( key == Qt::Key_Return || key == Qt::Key_Enter )\n        {\n            QModelIndex index = listView->currentIndex();\n            if ( index.isValid() )\n                onItemClicked(index);\n            return true;\n        }\n    }\n    else if ( obj == listView )\n    {\n        if ( key == Qt::Key_Return || key == Qt::Key_Enter )\n        {\n            QModelIndex index = listView->currentIndex();\n            if (index.isValid())\n                onItemClicked(index);\n            return true;\n        }\n\n        if ( key == Qt::Key_Up && listView->currentIndex().row() == 0 )\n        {\n            searchField->setFocus();\n            return true;\n        }\n\n        if ( !keyEvent->text().isEmpty() )\n        {\n            // send keytext to search widget\n            searchField->setFocus();\n            QKeyEvent forwardedEvent(QEvent::KeyPress, key, keyEvent->modifiers(), keyEvent->text());\n            QCoreApplication::sendEvent(searchField, &forwardedEvent);\n            return true;\n        }\n    }\n\n    return QWidget::eventFilter(obj, event);\n}\n\nvoid SmartSearchBox::adjustPopupSize()\n{\n    if (!filterModel || filterModel->rowCount() == 0)\n        return;\n\n    int popupWidth = listView->sizeHintForColumn(selectedColumn) + 40; // padding\n    listView->setMinimumWidth(popupWidth);\n\n    int visibleRows = qMin(filterModel->rowCount(), maxRowsInList);\n    int rowHeight = listView->sizeHintForRow(0);\n    if (rowHeight <= 0)\n        rowHeight = listView->fontMetrics().height();\n\n    int searchFieldHeight = searchField->sizeHint().height();\n    int popupHeight = searchFieldHeight + (visibleRows * rowHeight) + 20; // margin\n\n    popup->resize(popupWidth + 10, popupHeight);\n}\n\nvoid SmartSearchBox::changeButtonText(const QString &text)\n{\n    if ( openButton->text() != text )\n    {\n        openButton->setText(text);\n        adjustMaxSize();\n        listView->setCurrentIndex(filterModel->mapFromSource(currentValueSourceIndex));\n        emit currentTextChanged(text);\n    }\n\n    openButton->setStyleSheet( ( highlightWhenEnable\n                                 && currentValueSourceIndex.row() > 0) ? \"QPushButton \"\n                                                                  \"{ border: 2px solid red; \"\n                                                                  \"  border-radius: 4px; \"\n                                                                  \"  padding: 2px;}\"\n                                                                : \"\");\n}\n\nvoid SmartSearchBox::setModelColumn(int column)\n{\n    filterModel->setFilterKeyColumn(column);\n    listView->setModelColumn(column);\n    selectedColumn = column;\n}\n\nQVariant SmartSearchBox::currentValue(int column)\n{\n    if ( !filterModel->sourceModel() )\n        return {};\n\n    return filterModel->sourceModel()->data(currentValueSourceIndex, Qt::UserRole + column);\n}\n\nQString SmartSearchBox::currentText() const\n{\n    if ( !filterModel->sourceModel() )\n        return {};\n\n    return filterModel->sourceModel()->data(currentValueSourceIndex).toString();\n}\n\nint SmartSearchBox::currentIndex()\n{\n    if (!filterModel\n        || !filterModel->sourceModel()\n        || !currentValueSourceIndex.isValid() )\n        return 0;\n\n    QModelIndex filteredIndex = filterModel->mapFromSource(currentValueSourceIndex);\n    if (!filteredIndex.isValid())\n        return 0;\n\n    return filteredIndex.row();\n}\n\nvoid SmartSearchBox::setCurrentText(const QString &text)\n{\n    if (!filterModel || !filterModel->sourceModel()) return;\n\n    QAbstractItemModel *model = filterModel->sourceModel();\n\n    // default value is the first row value\n    currentValueSourceIndex = model->index(0, selectedColumn);\n\n    for ( int row = 0; row < model->rowCount(); ++row )\n    {\n        const QModelIndex &index = model->index(row, selectedColumn);\n        QString itemText = index.data(Qt::DisplayRole).toString();\n\n        if ( itemText.compare(text, Qt::CaseInsensitive) == 0 )\n        {\n            currentValueSourceIndex = index;\n            break;\n        }\n    }\n    changeButtonText(currentText());\n}\n\nvoid SmartSearchBox::setCurrentValue(const QVariant var, int column)\n{\n    if (!filterModel || !filterModel->sourceModel()) return;\n\n    QAbstractItemModel *model = filterModel->sourceModel();\n\n    // default value is the first row value\n    currentValueSourceIndex = model->index(0, selectedColumn);\n    for ( int row = 0; row < model->rowCount(); ++row )\n    {\n        const QModelIndex &index = model->index(row, selectedColumn);\n        QVariant userData = index.data(Qt::UserRole + column);\n\n        if ( userData.toString() == var.toString() )\n        {\n            currentValueSourceIndex = index;\n            break;\n        }\n    }\n    changeButtonText(currentText());\n}\n\nvoid SmartSearchBox::adjustMaxSize()\n{\n    if ( !filterModel\n         || filterModel->sourceModel()\n         || filterModel->sourceModel()->rowCount() == 0)\n        return;\n\n    const QModelIndex index = filterModel->sourceModel()->index(0, selectedColumn);\n    if (!index.isValid())\n        return;\n\n    const QString text = filterModel->sourceModel()->data(index).toString();\n\n    if (text.isEmpty())\n        return;\n\n    const QFontMetrics metrics(font());\n    openButton->setMaximumWidth(metrics.horizontalAdvance(text) + 35); // + padding\n}\n\nvoid SmartSearchBox::refreshModel()\n{\n    if ( !filterModel->sourceModel() ) return ;\n\n    SqlListModel *sqlModel = qobject_cast<SqlListModel*>(filterModel->sourceModel());\n\n    if ( sqlModel )\n    {\n        QString text = currentText();\n        sqlModel->refresh();\n        setCurrentText(text);\n    }\n}\n\nvoid SmartSearchBox::setHighlightWhenEnable(bool state)\n{\n    highlightWhenEnable = state;\n}\n"
  },
  {
    "path": "ui/component/SmartSearchBox.h",
    "content": "#ifndef QLOG_UI_COMPONENT_SMARTSEARCHBOX_H\n#define QLOG_UI_COMPONENT_SMARTSEARCHBOX_H\n\n#include <QWidget>\n#include <QSortFilterProxyModel>\n#include <QStringListModel>\n#include <QLineEdit>\n#include <QListView>\n#include <QDialog>\n\nclass SmartSearchBox : public QWidget\n{\n    Q_OBJECT\npublic:\n    explicit SmartSearchBox(QWidget *parent = nullptr);\n\n    void setModel(QAbstractItemModel *model);\n\n    void setModelColumn(int column);\n    QVariant currentValue(int column);\n    QString currentText() const;\n    int currentIndex();\n    void setCurrentText(const QString &text);\n    void setCurrentValue(const QVariant var, int column);\n    void adjustMaxSize();\n    void refreshModel();\n    void setHighlightWhenEnable(bool state);\n\nsignals:\n    void currentTextChanged(QString);\n\nprivate slots:\n    void onTextChanged(const QString &text);\n    void onItemClicked(const QModelIndex &index);\nprotected:\n    bool eventFilter(QObject *obj, QEvent *event) override;\n\nprivate:\n    QLineEdit *searchField;\n    QListView *listView;\n    QDialog *popup;\n    QSortFilterProxyModel *filterModel;\n    QPushButton *openButton;\n    int selectedColumn;\n    int maxRowsInList;\n    QModelIndex currentValueSourceIndex;\n    bool highlightWhenEnable;\n    void adjustPopupSize();\n    void changeButtonText(const QString &text);\n};\n\n#endif // QLOG_UI_COMPONENT_SMARTSEARCHBOX_H\n"
  },
  {
    "path": "ui/component/SqlHighlighter.cpp",
    "content": "#include \"SqlHighlighter.h\"\n#include \"core/debug.h\"\n\n#include <QApplication>\n#include <QColor>\n#include <QFont>\n#include <QPalette>\n\nMODULE_IDENTIFICATION(\"qlog.ui.component.sqlhighlighter\");\n\n// Detect dark mode by checking whether the window background is darker than mid-gray.\nstatic bool detectDarkMode()\n{\n    return QApplication::palette().window().color().lightness() < 128;\n}\n\nconst QStringList &SqlHighlighter::sqlKeywords()\n{\n    static const QStringList keywords = {\n        \"SELECT\", \"FROM\", \"WHERE\", \"AND\", \"OR\", \"NOT\", \"IN\", \"LIKE\", \"BETWEEN\",\n        \"IS\", \"NULL\", \"ORDER\", \"BY\", \"GROUP\", \"HAVING\", \"LIMIT\", \"OFFSET\",\n        \"DISTINCT\", \"ALL\", \"AS\", \"JOIN\", \"LEFT\", \"RIGHT\", \"INNER\", \"OUTER\",\n        \"FULL\", \"CROSS\", \"ON\", \"UNION\", \"INTERSECT\", \"EXCEPT\", \"WITH\",\n        \"RECURSIVE\", \"CASE\", \"WHEN\", \"THEN\", \"ELSE\", \"END\", \"EXISTS\",\n        \"ASC\", \"DESC\", \"COLLATE\", \"CAST\", \"TRUE\", \"FALSE\", \"ROWID\",\n        \"NOCASE\", \"BINARY\"\n    };\n    return keywords;\n}\n\nconst QStringList &SqlHighlighter::sqlFunctions()\n{\n    static const QStringList functions = {\n        \"COUNT\", \"SUM\", \"AVG\", \"MIN\", \"MAX\", \"ABS\", \"LENGTH\", \"LOWER\", \"UPPER\",\n        \"SUBSTR\", \"TRIM\", \"LTRIM\", \"RTRIM\", \"REPLACE\", \"INSTR\", \"PRINTF\",\n        \"ROUND\", \"COALESCE\", \"NULLIF\", \"IFNULL\", \"IIF\", \"TYPEOF\",\n        \"DATE\", \"TIME\", \"DATETIME\", \"JULIANDAY\", \"STRFTIME\",\n        \"RANDOM\", \"HEX\", \"QUOTE\", \"GROUP_CONCAT\", \"JSON_EXTRACT\"\n    };\n    return functions;\n}\n\nSqlHighlighter::SqlHighlighter(QTextDocument *parent)\n    : QSyntaxHighlighter(parent),\n      isDark(detectDarkMode())\n{\n    // -----------------------------------------------------------------------\n    // Color palette - two sets so both themes are readable.\n    //\n    // Dark  colours lifted from VS Code \"Dark+\" defaults.\n    // Light colours lifted from VS Code \"Light+\" defaults.\n    // -----------------------------------------------------------------------\n    const QColor keywordColor  = isDark ? QColor(86,  156, 214) : QColor( 0,   0, 187);\n    const QColor functionColor = isDark ? QColor(220, 220, 170) : QColor(121,  94,  38);\n    const QColor stringColor   = isDark ? QColor(206, 145, 120) : QColor(163,  21,  21);\n    const QColor numberColor   = isDark ? QColor(181, 206, 168) : QColor(  9, 134,  88);\n    const QColor commentColor  = isDark ? QColor(106, 153,  85) : QColor( 10, 121,  10);\n\n    // SQL keywords - bold\n    QTextCharFormat keywordFormat;\n    keywordFormat.setForeground(keywordColor);\n    keywordFormat.setFontWeight(QFont::Bold);\n\n    for ( const QString &kw : sqlKeywords() )\n    {\n        Rule rule;\n        rule.pattern = QRegularExpression(\n            QString(\"\\\\b%1\\\\b\").arg(kw),\n            QRegularExpression::CaseInsensitiveOption);\n        rule.format = keywordFormat;\n        rules.append(rule);\n    }\n\n    // Built-in functions\n    QTextCharFormat functionFormat;\n    functionFormat.setForeground(functionColor);\n\n    for ( const QString &fn : sqlFunctions() )\n    {\n        Rule rule;\n        rule.pattern = QRegularExpression(\n            QString(\"\\\\b%1\\\\b\").arg(fn),\n            QRegularExpression::CaseInsensitiveOption);\n        rule.format = functionFormat;\n        rules.append(rule);\n    }\n\n    // Single-quoted strings\n    QTextCharFormat stringFormat;\n    stringFormat.setForeground(stringColor);\n    Rule stringRule;\n    stringRule.pattern = QRegularExpression(\"'[^']*'\");\n    stringRule.format  = stringFormat;\n    rules.append(stringRule);\n\n    // Numbers\n    QTextCharFormat numberFormat;\n    numberFormat.setForeground(numberColor);\n    Rule numberRule;\n    numberRule.pattern = QRegularExpression(\"\\\\b[0-9]+(\\\\.[0-9]+)?\\\\b\");\n    numberRule.format  = numberFormat;\n    rules.append(numberRule);\n\n    // Single-line comments (--)\n    QTextCharFormat singleLineCommentFormat;\n    singleLineCommentFormat.setForeground(commentColor);\n    Rule slComment;\n    slComment.pattern = QRegularExpression(\"--[^\\n]*\");\n    slComment.format  = singleLineCommentFormat;\n    rules.append(slComment);\n\n    // Multi-line block comment format and delimiters\n    multiLineCommentFormat.setForeground(commentColor);\n    blockCommentStart = QRegularExpression(\"/\\\\*\");\n    blockCommentEnd   = QRegularExpression(\"\\\\*/\");\n\n    // identifierColor is applied in setUserIdentifiers() using m_isDark\n}\n\nvoid SqlHighlighter::setUserIdentifiers(const QStringList &identifiers)\n{\n    identifierRules.clear();\n\n    // Re-derive the identifier color from m_isDark so it stays in sync.\n    const QColor identifierColor = isDark ? QColor(156, 220, 254) : QColor(0, 16, 128);\n\n    QTextCharFormat identifierFormat;\n    identifierFormat.setForeground(identifierColor);\n\n    for (const QString &id : identifiers)\n    {\n        Rule rule;\n        rule.pattern = QRegularExpression(\n            QString(\"\\\\b%1\\\\b\").arg(QRegularExpression::escape(id)),\n            QRegularExpression::CaseInsensitiveOption);\n        rule.format = identifierFormat;\n        identifierRules.append(rule);\n    }\n\n    rehighlight();\n}\n\nvoid SqlHighlighter::highlightBlock(const QString &text)\n{\n    // Schema identifiers first (lowest priority - keywords override them below)\n    for ( const Rule &rule : static_cast<const QVector<Rule>&>(identifierRules) )\n    {\n        QRegularExpressionMatchIterator it = rule.pattern.globalMatch(text);\n        while (it.hasNext())\n        {\n            QRegularExpressionMatch m = it.next();\n            setFormat(m.capturedStart(), m.capturedLength(), rule.format);\n        }\n    }\n\n    // Keywords, functions, strings, numbers, single-line comments\n    for ( const Rule &rule : static_cast<const QVector<Rule>&>(rules) )\n    {\n        QRegularExpressionMatchIterator it = rule.pattern.globalMatch(text);\n        while (it.hasNext())\n        {\n            QRegularExpressionMatch m = it.next();\n            setFormat(m.capturedStart(), m.capturedLength(), rule.format);\n        }\n    }\n\n    // Multi-line block comments - tracked across blocks via block state\n    setCurrentBlockState(0);\n\n    int startIndex = (previousBlockState() == 1) ? 0 : text.indexOf(blockCommentStart);\n\n    while (startIndex >= 0)\n    {\n        QRegularExpressionMatch endMatch = blockCommentEnd.match(text, startIndex);\n        int endIndex = endMatch.capturedStart();\n        int len;\n        if (endIndex == -1)\n        {\n            setCurrentBlockState(1);\n            len = text.length() - startIndex;\n        }\n        else\n        {\n            len = endIndex - startIndex + endMatch.capturedLength();\n        }\n        setFormat(startIndex, len, multiLineCommentFormat);\n        startIndex = text.indexOf(blockCommentStart, startIndex + len);\n    }\n}\n"
  },
  {
    "path": "ui/component/SqlHighlighter.h",
    "content": "#ifndef QLOG_UI_COMPONENT_SQLHIGHLIGHTER_H\n#define QLOG_UI_COMPONENT_SQLHIGHLIGHTER_H\n\n#include <QSyntaxHighlighter>\n#include <QTextCharFormat>\n#include <QRegularExpression>\n#include <QVector>\n\nclass SqlHighlighter : public QSyntaxHighlighter\n{\n    Q_OBJECT\n\npublic:\n    explicit SqlHighlighter(QTextDocument *parent = nullptr);\n    void setUserIdentifiers(const QStringList &identifiers);\n\n    static const QStringList &sqlKeywords();\n    static const QStringList &sqlFunctions();\n\nprotected:\n    void highlightBlock(const QString &text) override;\n\nprivate:\n    struct Rule\n    {\n        QRegularExpression pattern;\n        QTextCharFormat format;\n    };\n\n    QVector<Rule> rules;\n    QVector<Rule> identifierRules;\n\n    QTextCharFormat multiLineCommentFormat;\n    QRegularExpression blockCommentStart;\n    QRegularExpression blockCommentEnd;\n\n    bool isDark;\n};\n\n#endif // QLOG_UI_COMPONENT_SQLHIGHLIGHTER_H\n"
  },
  {
    "path": "ui/component/StyleItemDelegate.h",
    "content": "#ifndef QLOG_UI_STYLEITEMDELEGATE_H\n#define QLOG_UI_STYLEITEMDELEGATE_H\n\n#include <QStyledItemDelegate>\n#include <QItemDelegate>\n#include <QDate>\n#include <QCheckBox>\n#include <QStyleOptionViewItem>\n#include <QPainter>\n#include <QDateTimeEdit>\n#include <QComboBox>\n#include <QAbstractItemModel>\n#include <QDebug>\n#include <QTextEdit>\n#include <QKeySequenceEdit>\n#include <QHBoxLayout>\n#include <QPushButton>\n#include <QApplication>\n#include <QTimeZone>\n#include <QLineEdit>\n#include <QMessageBox>\n#include <QAbstractItemView>\n\n#include \"core/LogLocale.h\"\n#include \"data/Gridsquare.h\"\n#include \"ui/component/BaseDoubleSpinBox.h\"\n\nclass CallsignDelegate : public QStyledItemDelegate {\npublic:\n    CallsignDelegate(QObject* parent = 0) :\n        QStyledItemDelegate(parent) { }\n\n    void initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const {\n        QStyledItemDelegate::initStyleOption(option, index);\n        option->font.setBold(true);\n    }\n};\n\nclass DateFormatDelegate : public QStyledItemDelegate {\nprivate:\n    LogLocale locale;\npublic:\n    DateFormatDelegate(QObject* parent = 0) :\n        QStyledItemDelegate(parent) { }\n\n    QString displayText(const QVariant& value, const QLocale&) const\n    {\n        return value.toDate().toString(locale.formatDateShortWithYYYY());\n    }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        QDateEdit* editor = new QDateEdit(parent);\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n        editor->setTimeZone(QTimeZone::UTC);\n#else\n        editor->setTimeSpec(Qt::UTC);\n#endif\n        editor->setMinimumDate(QDate(1900, 1, 1));\n        editor->setSpecialValueText(tr(\"Blank\"));\n        editor->setDisplayFormat(locale.formatDateShortWithYYYY());\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        QDate value = index.model()->data(index, Qt::EditRole).toDate();\n        QDateEdit* timeEdit = static_cast<QDateEdit*>(editor);\n        timeEdit->setDate(value);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        QDateEdit* dateEdit = static_cast<QDateEdit*>(editor);\n        dateEdit->interpretText();\n        QDateTime value = dateEdit->dateTime();\n        model->setData(index,\n                       ( dateEdit->date() == dateEdit->minimumDate() ) ? QVariant()\n                                                                       : value,\n                       Qt::EditRole);\n    }\n};\n\nclass TimestampFormatDelegate : public QStyledItemDelegate {\nprivate:\n    LogLocale locale;\npublic:\n    TimestampFormatDelegate(QObject* parent = 0) :\n        QStyledItemDelegate(parent) { }\n\n    QString displayText(const QVariant& value, const QLocale&) const\n    {\n        return locale.toString(value.toDateTime().toTimeZone(QTimeZone::utc()), locale.formatDateShortWithYYYY()\n                                                                                + \" \"\n                                                                                + locale.formatTimeLongWithoutTZ());\n    }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        QDateTimeEdit* editor = new QDateTimeEdit(parent);\n\n#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)\n        editor->setTimeZone(QTimeZone::UTC);\n#else\n        editor->setTimeSpec(Qt::UTC);\n#endif\n        editor->setDateTime(QDateTime(QDate(1900, 1, 1), QTime(0, 0, 0)));\n        editor->setSpecialValueText(tr(\"Blank\"));\n        editor->setDisplayFormat(locale.formatDateShortWithYYYY() + \" \" + locale.formatTimeLongWithoutTZ());\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        QDateTime value = index.model()->data(index, Qt::EditRole).toDateTime();\n        QDateTimeEdit* timeEdit = static_cast<QDateTimeEdit*>(editor);\n        timeEdit->setDateTime(value);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        QDateTimeEdit* timeEdit = static_cast<QDateTimeEdit*>(editor);\n        timeEdit->interpretText();\n        QDateTime value = timeEdit->dateTime();\n        model->setData(index,\n                       ( timeEdit->date() == timeEdit->minimumDate() ) ? QVariant()\n                                                                       : value,\n                       Qt::EditRole);\n    }\n};\n\nclass UnitFormatDelegate : public QStyledItemDelegate {\npublic:\n    UnitFormatDelegate(const QString &unit, int precision, double step, QObject* parent = 0) :\n        QStyledItemDelegate(parent), unit(unit), precision(precision), step(step) { }\n\n    void initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const {\n        QStyledItemDelegate::initStyleOption(option, index);\n        option->displayAlignment = Qt::AlignVCenter | Qt::AlignLeft;\n    }\n\n    QString displayText(const QVariant& value, const QLocale&) const {\n        return QString(\"%1 %2\").arg(QString::number(value.toDouble(), 'f', precision), unit);\n    }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        BaseDoubleSpinBox* editor = new BaseDoubleSpinBox(parent);\n        editor->setDecimals(precision);\n        editor->setRange(-1*step, 1e12);\n        editor->setSingleStep(step);\n        editor->setSpecialValueText(\"Empty\");\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        double value = index.model()->data(index, Qt::EditRole).toDouble();\n        BaseDoubleSpinBox* spinBox = static_cast<BaseDoubleSpinBox*>(editor);\n        spinBox->setValue(value);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        BaseDoubleSpinBox* spinBox = static_cast<BaseDoubleSpinBox*>(editor);\n        if (spinBox->text() == \"Empty\" )\n        {\n            model->setData(index, QVariant() , Qt::EditRole);\n            return;\n        }\n        spinBox->interpretText();\n        double value = spinBox->value();\n        model->setData(index,value, Qt::EditRole);\n    }\n\nprivate:\n    QString unit;\n    int precision;\n    double step;\n};\n\nclass DistanceFormatDelegate : public QStyledItemDelegate {\npublic:\n    DistanceFormatDelegate(int precision, double step, QObject* parent = 0) :\n        QStyledItemDelegate(parent), precision(precision), step(step) { }\n\n    void initStyleOption(QStyleOptionViewItem* option, const QModelIndex& index) const {\n        QStyledItemDelegate::initStyleOption(option, index);\n        option->displayAlignment = Qt::AlignVCenter | Qt::AlignLeft;\n    }\n\n    QString displayText(const QVariant& value, const QLocale&) const {\n        QString unit;\n        double displayValue = Gridsquare::distance2localeUnitDistance(value.toDouble(), unit, locale);\n        return QString(\"%1 %2\").arg(QString::number(displayValue, 'f', precision), unit);\n    }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        BaseDoubleSpinBox* editor = new BaseDoubleSpinBox(parent);\n        editor->setDecimals(precision);\n        editor->setRange(-1*step, 1e12);\n        editor->setSingleStep(step);\n        editor->setSpecialValueText(\"Empty\");\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        double value = index.model()->data(index, Qt::EditRole).toDouble();\n        BaseDoubleSpinBox* spinBox = static_cast<BaseDoubleSpinBox*>(editor);\n        spinBox->setValue(value);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        BaseDoubleSpinBox* spinBox = static_cast<BaseDoubleSpinBox*>(editor);\n        if (spinBox->text() == \"Empty\" )\n        {\n            model->setData(index, QVariant() , Qt::EditRole);\n            return;\n        }\n        spinBox->interpretText();\n        double value = spinBox->value();\n        model->setData(index,value, Qt::EditRole);\n    }\n\nprivate:\n    int precision;\n    double step;\n    LogLocale locale;\n};\n\nclass ComboFormatDelegate : public QStyledItemDelegate {\npublic:\n    ComboFormatDelegate(QAbstractTableModel* in_model, QObject* parent = nullptr):\n        QStyledItemDelegate(parent)\n    {\n        model = in_model;\n    }\n    ComboFormatDelegate(QStringList in_list, QObject* parent = nullptr):\n        QStyledItemDelegate(parent)\n    {\n        model = nullptr;\n        list = in_list;\n    }\n\n    ComboFormatDelegate(QMap<QString, QString> in_map, QObject* parent = nullptr):\n        QStyledItemDelegate(parent)\n    {\n        model = nullptr;\n        map = in_map;\n    }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        QComboBox *editor = new QComboBox(parent);\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n\n        QComboBox* combo = static_cast<QComboBox*>(editor);\n        combo->clear();\n\n        if ( model )\n        {\n            combo->setModel(model);\n            combo->setCurrentText(index.model()->data(index).toString());\n        }\n        else if ( ! list.isEmpty() )\n        {\n            combo->addItems(list);\n            combo->setCurrentText(index.model()->data(index).toString());\n        }\n        else if ( ! map.isEmpty() )\n        {\n            QMapIterator<QString, QString> iter(map);\n            int iter_index = 0;\n            int value_index = 0;\n\n            while ( iter.hasNext() )\n            {\n                iter.next();\n                combo->addItem(iter.value(), iter.key());\n                if ( iter.key() == index.model()->data(index).toString() )\n                {\n                    value_index = iter_index;\n                }\n                iter_index++;\n            }\n            combo->setCurrentIndex(value_index);\n        }\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n       QComboBox* combo = static_cast<QComboBox*>(editor);\n       QString curr_value;\n\n       if ( !map.isEmpty() )\n       {\n           curr_value = combo->currentData().toString();\n       }\n       else\n       {\n           curr_value = combo->currentText();\n       }\n\n       if ( curr_value == \" \" )\n       {\n           model->setData(index, QVariant(), Qt::EditRole);\n       }\n       else\n       {\n           model->setData(index, QVariant(curr_value), Qt::EditRole);\n       }\n    }\n\nprivate:\n    QAbstractTableModel *model;\n    QStringList list;\n    QMap<QString, QString> map;\n};\n\n\n\nclass CheckBoxDelegate: public QItemDelegate\n{\n    Q_OBJECT\npublic:\n    CheckBoxDelegate(QObject *parent = nullptr ) : QItemDelegate(parent) {};\n\n    void paint( QPainter *painter,\n                const QStyleOptionViewItem &option,\n                const QModelIndex &index ) const\n    {\n        bool is_enabled = index.model()->data(index, Qt::EditRole).toBool();\n        if ( !is_enabled) painter->fillRect(option.rect, option.palette.dark());\n        drawDisplay(painter,option,option.rect,is_enabled? QString(\"     \").append(tr(\"Enabled\"))\n                                                         : QString(\"     \").append(tr(\"Disabled\")));\n        drawFocus(painter,option,option.rect);\n\n    };\n\n    QWidget *createEditor( QWidget *parent,\n                        const QStyleOptionViewItem &,\n                        const QModelIndex &) const\n    {\n        QCheckBox *theCheckBox = new QCheckBox(parent);\n        connect(theCheckBox, &QCheckBox::toggled, this, &CheckBoxDelegate::setData);\n        return theCheckBox;\n    };\n\n    void setEditorData( QWidget *editor,\n                        const QModelIndex &index ) const\n    {\n        bool val = index.model()->data( index, Qt::EditRole ).toBool();\n        QCheckBox *theCheckBox =  static_cast<QCheckBox*>(editor);\n        theCheckBox->blockSignals(true);\n        theCheckBox->setChecked(val);\n        theCheckBox->blockSignals(false);\n    }\n\n    void setModelData( QWidget *editor,\n                        QAbstractItemModel *model,\n                        const QModelIndex &index ) const\n    {\n        model->setData(index,\n                       static_cast<QCheckBox*>(editor)->isChecked(),\n                       Qt::EditRole);\n    }\n\n\n    void updateEditorGeometry( QWidget *editor,\n                        const QStyleOptionViewItem &option,\n                        const QModelIndex & ) const\n    {\n        editor->setGeometry( option.rect );\n    }\n\nprivate slots:\n\n    void setData(bool )\n    {\n        QCheckBox *cb = qobject_cast<QCheckBox*>(sender());\n        if (!cb) return;\n        emit commitData(cb);\n        emit closeEditor(cb, QAbstractItemDelegate::NoHint);\n    }\n};\n\nclass TextBoxDelegate: public QItemDelegate\n{\n    Q_OBJECT\npublic:\n    TextBoxDelegate(QObject *parent = 0 ) :QItemDelegate(parent){};\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        return new QTextEdit(parent);\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect.x(),option.rect.y(),editor->sizeHint().width(),editor->sizeHint().height());\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        QString value = index.model()->data(index, Qt::EditRole).toString();\n        QTextEdit* textEditor = static_cast<QTextEdit*>(editor);\n        textEditor->setPlainText(value);\n        textEditor->setAcceptRichText(false);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        QTextEdit* textEditor = static_cast<QTextEdit*>(editor);\n        QString value = textEditor->toPlainText();\n        model->setData(index,value, Qt::EditRole);\n    }\n\n    void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const\n    {\n        QString line = index.model()->data(index, Qt::EditRole).toString().simplified();\n\n        drawDisplay(painter,option,option.rect, line);\n        drawFocus(painter, option, option.rect);\n    }\n};\n\nclass KeySequenceEdit : public QWidget\n{\n    Q_OBJECT\n\npublic:\n    KeySequenceEdit(QWidget* parent = nullptr) : QWidget(parent)\n    {\n\n        QHBoxLayout* layout = new QHBoxLayout(this);\n        layout->setContentsMargins(0, 0, 0, 0);\n        QPushButton* clearButton = new QPushButton(QLatin1String(), this);\n        QIcon clearIcon = QApplication::style()->standardIcon(QStyle::SP_LineEditClearButton);\n        clearButton->setIcon(clearIcon);\n        clearButton->setToolTip(tr(\"Clear\"));\n\n        keySequenceEdit = new QKeySequenceEdit(this);\n        layout->addWidget(keySequenceEdit);\n        layout->addWidget(clearButton);\n        connect(clearButton, &QPushButton::clicked, this, [=]()\n        {\n            keySequenceEdit->blockSignals(true);\n            keySequenceEdit->clear();\n            keySequenceEdit->blockSignals(false);\n            emit clearPress();\n        });\n        connect(keySequenceEdit, &QKeySequenceEdit::editingFinished, this, [=]()\n        {\n            emit editingFinished();\n        });\n\n        setFocusProxy(keySequenceEdit);\n    }\n\n    void setKeySequence(const QKeySequence &keySequence)\n    {\n        keySequenceEdit->setKeySequence(keySequence);\n    }\n\n    QKeySequence keySequence() const\n    {\n        return keySequenceEdit->keySequence();\n    }\n\nsignals:\n    void editingFinished();\n    void clearPress();\n\nprivate:\n     QKeySequenceEdit* keySequenceEdit;\n};\n\nclass ShortcutDelegate : public QStyledItemDelegate\n{\n     Q_OBJECT\n\npublic:\n    ShortcutDelegate(QObject* parent = nullptr) : QStyledItemDelegate(parent) { }\n\n    QWidget* createEditor(QWidget* parent,\n                          const QStyleOptionViewItem&,\n                          const QModelIndex&) const\n    {\n        KeySequenceEdit *editor = new KeySequenceEdit(parent);\n        connect(editor, &KeySequenceEdit::editingFinished, this,\n                &ShortcutDelegate::commitAndCloseEditor);\n        connect(editor, &KeySequenceEdit::clearPress, this,\n                &ShortcutDelegate::commitAndCloseEditor);\n        return editor;\n    }\n\n    void updateEditorGeometry(QWidget* editor,\n                              const QStyleOptionViewItem& option,\n                              const QModelIndex&) const\n    {\n        editor->setGeometry(option.rect);\n    }\n\n    void setEditorData(QWidget* editor, const QModelIndex& index) const\n    {\n        KeySequenceEdit *keySequenceEdit = static_cast<KeySequenceEdit *>(editor);\n        keySequenceEdit->blockSignals(true);\n        keySequenceEdit->setKeySequence(index.model()->data(index, Qt::EditRole).toString());\n        keySequenceEdit->blockSignals(false);\n    }\n\n    void setModelData(QWidget* editor, QAbstractItemModel* model,\n                      const QModelIndex& index) const\n    {\n        const KeySequenceEdit *keySequenceEdit = static_cast<KeySequenceEdit *>(editor);\n        model->setData(index, keySequenceEdit->keySequence().toString(QKeySequence::NativeText));\n    }\n\nprivate slots:\n    void commitAndCloseEditor()\n    {\n        KeySequenceEdit *editor = static_cast<KeySequenceEdit *>(sender());\n        QAbstractItemView* view = qobject_cast<QAbstractItemView*>(parent());\n        if ( view && view->indexWidget(view->currentIndex()) != editor )\n        {\n            // if parent view is not active do nothing\n            // otherwise it produces a warning QAbstractItemView::commitData called with an editor that does not belong to this view\n            return;\n        }\n        emit commitData(editor);\n        emit closeEditor(editor, QAbstractItemDelegate::NoHint);\n    }\n};\n\nclass ReadOnlyDelegate : public QStyledItemDelegate {\n    Q_OBJECT\n\npublic:\n    using QStyledItemDelegate::QStyledItemDelegate;\n\n    QWidget *createEditor(QWidget *, const QStyleOptionViewItem &, const QModelIndex &) const override\n    {\n        return nullptr;\n    }\n};\n\nclass UpperCaseDelegate : public QStyledItemDelegate {\n    Q_OBJECT\npublic:\n    using QStyledItemDelegate::QStyledItemDelegate;\n\n    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override\n    {\n        QLineEdit *editor = new QLineEdit(parent);\n        return editor;\n    }\n\n    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override\n    {\n        QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor);\n        if (lineEdit)\n        {\n            QString text = lineEdit->text().toUpper();\n            model->setData(index, text);\n        }\n    }\n};\n\nclass UpperCaseUniqueDelegate : public UpperCaseDelegate {\n    Q_OBJECT\npublic:\n    using UpperCaseDelegate::UpperCaseDelegate;\n\n    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override\n    {\n        QLineEdit *editor = new QLineEdit(parent);\n        return editor;\n    }\n\n    void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const override\n    {\n        QLineEdit *lineEdit = qobject_cast<QLineEdit *>(editor);\n        if (lineEdit)\n        {\n            QString text = lineEdit->text().toUpper();\n            for (int row = 0; row < model->rowCount(); ++row)\n            {\n                if (row == index.row()) continue;\n                if (model->data(model->index(row, index.column()), Qt::EditRole).toString() == text)\n                {\n                    QMessageBox::warning(nullptr, \"Duplicate value\", \"The value must be unique.\");\n                    return;\n                }\n            }\n            model->setData(index, text);\n        }\n    }\n};\n\nclass PasswordDelegate : public QStyledItemDelegate {\n    Q_OBJECT\npublic:\n    using QStyledItemDelegate::QStyledItemDelegate;\n\n    QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &, const QModelIndex &) const override\n    {\n        QLineEdit *editor = new QLineEdit(parent);\n        editor->setEchoMode(QLineEdit::Password);\n        return editor;\n    }\n\n    QString displayText(const QVariant &value, const QLocale &) const override\n    {\n        QLineEdit dummy;\n        dummy.setEchoMode(QLineEdit::Password);\n        dummy.setText(value.toString());\n        return dummy.displayText();\n    }\n};\n\n#endif // QLOG_UI_STYLEITEMDELEGATE_H\n"
  },
  {
    "path": "ui/component/SwitchButton.cpp",
    "content": "/*\n * This is nearly complete Material design Switch widget implementation in qtwidgets module.\n * More info: https://material.io/design/components/selection-controls.html#switches\n * Copyright (C) 2018-2020 Iman Ahmadvand\n *\n * This is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * It is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n*/\n\n#include \"SwitchButton.h\"\n\nAnimator::Animator(QObject* target, QObject* parent) : QVariantAnimation(parent)\n{\n    setTargetObject(target);\n}\n\nAnimator::~Animator() {\n    stop();\n}\n\nQObject* Animator::targetObject() const {\n    return target.data();\n}\n\nvoid Animator::setTargetObject(QObject* _target) {\n    if (target.data() == _target)\n        return;\n\n    if (isRunning()) {\n        qWarning(\"Animation::setTargetObject: you can't change the target of a running animation\");\n        return;\n    }\n\n    target = _target;\n}\n\nvoid Animator::updateCurrentValue(const QVariant& value) {\n    Q_UNUSED(value);\n\n    if (!target.isNull()) {\n        auto update = QEvent(QEvent::StyleAnimationUpdate);\n        update.setAccepted(false);\n        QCoreApplication::sendEvent(target.data(), &update);\n        if (!update.isAccepted())\n            stop();\n    }\n}\n\nvoid Animator::updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) {\n    if (target.isNull() && oldState == Stopped) {\n        qWarning(\"Animation::updateState: Changing state of an animation without target\");\n        return;\n    }\n\n    QVariantAnimation::updateState(newState, oldState);\n\n    if (!endValue().isValid() && direction() == Forward) {\n        qWarning(\"Animation::updateState (%s): starting an animation without end value\", targetObject()->metaObject()->className());\n    }\n}\n\nvoid Animator::setup(int duration, QEasingCurve easing) {\n    setDuration(duration);\n    setEasingCurve(easing);\n}\n\nvoid Animator::interpolate(const QVariant& _start, const QVariant& end) {\n    setStartValue(_start);\n    setEndValue(end);\n    start();\n}\n\nvoid Animator::setCurrentValue(const QVariant& value) {\n    setStartValue(value);\n    setEndValue(value);\n    updateCurrentValue(currentValue());\n}\n\n\n\nSelectionControl::SelectionControl(QWidget* parent) : QAbstractButton(parent) {\n    setObjectName(\"SelectionControl\");\n    setCheckable(true);\n}\n\nSelectionControl::~SelectionControl() {\n\n}\n\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\nvoid SelectionControl::enterEvent(QEvent* e)\n#else\nvoid SelectionControl::enterEvent(QEnterEvent* e)\n#endif\n{\n    setCursor(Qt::PointingHandCursor);\n    QAbstractButton::enterEvent(e);\n}\n\nQt::CheckState SelectionControl::checkState() const {\n    return isChecked() ? Qt::Checked : Qt::Unchecked;\n}\n\nvoid SelectionControl::checkStateSet() {\n    const auto state = checkState();\n    emit stateChanged(state);\n    toggle(state);\n}\n\nvoid SelectionControl::nextCheckState() {\n    QAbstractButton::nextCheckState();\n    SelectionControl::checkStateSet();\n}\n\n\nvoid SwitchButton::init() {\n    setFont(style.font);\n    setObjectName(\"Switch\");\n    setFocusPolicy(Qt::ClickFocus);\n    /* setup animations */\n    thumbBrushAnimation = new Animator{ this, this };\n    trackBrushAnimation = new Animator{ this, this };\n    thumbPosAniamtion = new Animator{ this, this };\n    thumbPosAniamtion->setup(style.thumbPosAniamtion.duration, style.thumbPosAniamtion.easing);\n    trackBrushAnimation->setup(style.trackBrushAnimation.duration, style.trackBrushAnimation.easing);\n    thumbBrushAnimation->setup(style.thumbBrushAnimation.duration, style.thumbBrushAnimation.easing);\n    /* set init values */\n    trackBrushAnimation->setStartValue(colorFromOpacity(style.trackOffBrush, style.trackOffOpacity));\n    trackBrushAnimation->setEndValue(colorFromOpacity(style.trackOffBrush, style.trackOffOpacity));\n    thumbBrushAnimation->setStartValue(colorFromOpacity(style.thumbOffBrush, style.thumbOffOpacity));\n    thumbBrushAnimation->setEndValue(colorFromOpacity(style.thumbOffBrush, style.thumbOffOpacity));\n    /* set standard palettes */\n    auto p = palette();\n    p.setColor(QPalette::Active, QPalette::ButtonText, style.textColor);\n    p.setColor(QPalette::Disabled, QPalette::ButtonText, style.textColor);\n    setPalette(p);\n    setSizePolicy(QSizePolicy(QSizePolicy::Policy::Preferred, QSizePolicy::Policy::Fixed));\n}\n\nQRect SwitchButton::indicatorRect() {\n    const auto w = style.indicatorMargin.left() + style.height + style.indicatorMargin.right();\n    return ltr(this) ? QRect(0, 0, w, style.height) : QRect(width() - w, 0, w, style.height);\n}\n\nQRect SwitchButton::textRect() {\n    const auto w = style.indicatorMargin.left() + style.height + style.indicatorMargin.right();\n    return ltr(this) ? rect().marginsRemoved(QMargins(w, 0, 0, 0)) : rect().marginsRemoved(QMargins(0, 0, w, 0));\n}\n\nSwitchButton::SwitchButton(QWidget* parent) : SelectionControl(parent)\n{\n    init();\n}\n\nSwitchButton::SwitchButton(const QString& text, QWidget* parent) : SwitchButton(parent) {\n    setText(text);\n}\n\nSwitchButton::SwitchButton(const QString& text, const QBrush& brush, QWidget* parent) : SwitchButton(text, parent) {\n    style.thumbOnBrush = brush.color();\n    style.trackOnBrush = brush.color();\n}\n\nSwitchButton::~SwitchButton() {\n\n}\n\nQSize SwitchButton::sizeHint() const {\n    auto h = style.height;\n#if (QT_VERSION >= QT_VERSION_CHECK(5, 11, 0))\n    auto w = style.indicatorMargin.left() + style.height + style.indicatorMargin.right() + fontMetrics().horizontalAdvance(text());\n#else\n    auto w = style.indicatorMargin.left() + style.height + style.indicatorMargin.right() + fontMetrics().width(text());\n#endif\n\n    return QSize(w, h);\n}\n\nvoid SwitchButton::paintEvent(QPaintEvent*) {\n    /* for desktop usage we do not need Radial reaction */\n\n    QPainter p(this);\n\n    const auto _indicatorRect = indicatorRect();\n    const auto _textRect = textRect();\n    auto trackMargin = style.indicatorMargin;\n    trackMargin.setTop(trackMargin.top() + 2);\n    trackMargin.setBottom(trackMargin.bottom() + 2);\n    QRectF trackRect = _indicatorRect.marginsRemoved(trackMargin);\n\n    if (isEnabled()) {\n        p.setOpacity(1.0);\n        p.setPen(Qt::NoPen);\n        /* draw track */\n        p.setBrush(trackBrushAnimation->currentValue().value<QColor>());\n        p.setRenderHint(QPainter::Antialiasing, true);\n        p.drawRoundedRect(trackRect, CORNER_RADIUS, CORNER_RADIUS);\n        p.setRenderHint(QPainter::Antialiasing, false);\n        /* draw thumb */\n        trackRect.setX(trackRect.x() - trackMargin.left() - trackMargin.right() - 2 + thumbPosAniamtion->currentValue().toInt());\n        auto thumbRect = trackRect;\n\n        if (!shadowPixmap.isNull())\n            p.drawPixmap(thumbRect.center() - QPointF(THUMB_RADIUS, THUMB_RADIUS - 1.0), shadowPixmap);\n\n        p.setBrush(thumbBrushAnimation->currentValue().value<QColor>());\n        p.setRenderHint(QPainter::Antialiasing, true);\n        //        qDebug() << thumbRect << thumbPosAniamtion->currentValue();\n        p.drawEllipse(thumbRect.center(), THUMB_RADIUS - SHADOW_ELEVATION - 1.0, THUMB_RADIUS - SHADOW_ELEVATION - 1.0);\n        p.setRenderHint(QPainter::Antialiasing, false);\n\n        /* draw text */\n        if (text().isEmpty())\n            return;\n\n        p.setOpacity(1.0);\n        p.setPen(palette().color(QPalette::Active, QPalette::ButtonText));\n        p.setFont(font());\n        p.drawText(_textRect, Qt::AlignLeft | Qt::AlignVCenter, text());\n    } else {\n        p.setOpacity(style.trackDisabledOpacity);\n        p.setPen(Qt::NoPen);\n        // draw track\n        p.setBrush(style.trackDisabled);\n        p.setRenderHint(QPainter::Antialiasing, true);\n        p.drawRoundedRect(trackRect, CORNER_RADIUS, CORNER_RADIUS);\n        p.setRenderHint(QPainter::Antialiasing, false);\n        // draw thumb\n        p.setOpacity(1.0);\n        if (!isChecked())\n            trackRect.setX(trackRect.x() - trackMargin.left() - trackMargin.right() - 2);\n        else\n            trackRect.setX(trackRect.x() + trackMargin.left() + trackMargin.right() + 2);\n        auto thumbRect = trackRect;\n\n        if (!shadowPixmap.isNull())\n            p.drawPixmap(thumbRect.center() - QPointF(THUMB_RADIUS, THUMB_RADIUS - 1.0), shadowPixmap);\n\n        p.setOpacity(1.0);\n        p.setBrush(style.thumbDisabled);\n        p.setRenderHint(QPainter::Antialiasing, true);\n        p.drawEllipse(thumbRect.center(), THUMB_RADIUS - SHADOW_ELEVATION - 1.0, THUMB_RADIUS - SHADOW_ELEVATION - 1.0);\n\n        /* draw text */\n        if (text().isEmpty())\n            return;\n\n        p.setOpacity(style.disabledTextOpacity);\n        p.setPen(palette().color(QPalette::Disabled, QPalette::ButtonText));\n        p.setFont(font());\n        p.drawText(_textRect, Qt::AlignLeft | Qt::AlignVCenter, text());\n    }\n}\n\nvoid SwitchButton::resizeEvent(QResizeEvent* e) {\n    shadowPixmap = Style::drawShadowEllipse(THUMB_RADIUS, SHADOW_ELEVATION, QColor(0, 0, 0, 70));\n    SelectionControl::resizeEvent(e);\n}\n\nvoid SwitchButton::toggle(Qt::CheckState state) {\n    if (state == Qt::Checked) {\n        const QVariant posEnd = (style.indicatorMargin.left() + style.indicatorMargin.right() + 2) * 2;\n        const QVariant thumbEnd = colorFromOpacity(style.thumbOnBrush, style.thumbOnOpacity);\n        const QVariant trackEnd = colorFromOpacity(style.trackOnBrush, style.trackOnOpacity);\n\n        if (!isVisible()) {\n            thumbPosAniamtion->setCurrentValue(posEnd);\n            thumbBrushAnimation->setCurrentValue(thumbEnd);\n            trackBrushAnimation->setCurrentValue(trackEnd);\n        } else {\n            thumbPosAniamtion->interpolate(0, posEnd);\n            thumbBrushAnimation->interpolate(colorFromOpacity(style.thumbOffBrush, style.thumbOffOpacity), thumbEnd);\n            trackBrushAnimation->interpolate(colorFromOpacity(style.trackOffBrush, style.trackOffOpacity), trackEnd);\n        }\n    } else { // Qt::Unchecked\n        const QVariant posEnd = 0;\n        const QVariant thumbEnd = colorFromOpacity(style.thumbOffBrush, style.thumbOffOpacity);\n        const QVariant trackEnd = colorFromOpacity(style.trackOffBrush, style.trackOffOpacity);\n\n        if (!isVisible()) {\n            thumbPosAniamtion->setCurrentValue(posEnd);\n            thumbBrushAnimation->setCurrentValue(thumbEnd);\n            trackBrushAnimation->setCurrentValue(trackEnd);\n        } else {\n            thumbPosAniamtion->interpolate(thumbPosAniamtion->currentValue().toInt(), posEnd);\n            thumbBrushAnimation->interpolate(colorFromOpacity(style.thumbOnBrush, style.thumbOnOpacity), thumbEnd);\n            trackBrushAnimation->interpolate(colorFromOpacity(style.trackOnBrush, style.trackOnOpacity), trackEnd);\n        }\n    }\n}\n"
  },
  {
    "path": "ui/component/SwitchButton.h",
    "content": "/*\n * This is nearly complete Material design Switch widget implementation in qtwidgets module.\n * More info: https://material.io/design/components/selection-controls.html#switches\n * Copyright (C) 2018-2020 Iman Ahmadvand\n *\n * This is free software: you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation, either version 3 of the License, or\n * (at your option) any later version.\n *\n * It is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n*/\n#ifndef QLOG_UI_COMPONENT_SWITCHBUTTON_H\n#define QLOG_UI_COMPONENT_SWITCHBUTTON_H\n\n#include <QtWidgets>\n#include \"ui/component/ButtonStyle.h\"\n\nclass Animator final : public QVariantAnimation {\n    Q_OBJECT\n    Q_PROPERTY(QObject* targetObject READ targetObject WRITE setTargetObject)\n\n  public:\n    Animator(QObject* target, QObject* parent = nullptr);\n    ~Animator() override;\n\n    QObject* targetObject() const;\n    void setTargetObject(QObject* _target);\n\n    inline bool isRunning() const {\n        return state() == Running;\n    }\n\n  public slots:\n    void setup(int duration, QEasingCurve easing = QEasingCurve::Linear);\n    void interpolate(const QVariant& _start, const QVariant& end);\n    void setCurrentValue(const QVariant&);\n\n  protected:\n    void updateCurrentValue(const QVariant& value) override final;\n    void updateState(QAbstractAnimation::State newState, QAbstractAnimation::State oldState) override final;\n\n  private:\n    QPointer<QObject> target;\n};\n\nclass SelectionControl : public QAbstractButton {\n    Q_OBJECT\n\n  public:\n    explicit SelectionControl(QWidget* parent = nullptr);\n    ~SelectionControl() override;\n\n    Qt::CheckState checkState() const;\n\n  Q_SIGNALS:\n    void stateChanged(int);\n\n  protected:\n#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))\n    void enterEvent(QEvent*) override;\n#else\n    void enterEvent(QEnterEvent*) override;\n#endif\n    void checkStateSet() override;\n    void nextCheckState() override;\n    virtual void toggle(Qt::CheckState state) = 0;\n};\n\nclass SwitchButton final : public SelectionControl {\n    Q_OBJECT\n\n    static constexpr auto CORNER_RADIUS = 8.0;\n    static constexpr auto THUMB_RADIUS = 8.0;\n    static constexpr auto SHADOW_ELEVATION = 2.0;\n\n  public:\n    explicit SwitchButton(QWidget* parent = nullptr);\n    explicit SwitchButton(const QString& text, QWidget* parent = nullptr);\n    explicit SwitchButton(const QString& text, const QBrush&, QWidget* parent = nullptr);\n    ~SwitchButton() override;\n\n    QSize sizeHint() const override final;\n\n  protected:\n    void paintEvent(QPaintEvent*) override final;\n    void resizeEvent(QResizeEvent*) override final;\n    void toggle(Qt::CheckState) override final;\n\n    void init();\n    QRect indicatorRect();\n    QRect textRect();\n\n    static inline QColor colorFromOpacity(const QColor& c, qreal opacity) {\n        return QColor(c.red(), c.green(), c.blue(), qRound(opacity * 255.0));\n    }\n    static inline bool ltr(QWidget* w) {\n        if (nullptr != w)\n            return w->layoutDirection() == Qt::LeftToRight;\n\n        return false;\n    }\n\n  private:\n    Style::Switch style;\n    QPixmap shadowPixmap;\n    QPointer<Animator> thumbBrushAnimation;\n    QPointer<Animator> trackBrushAnimation;\n    QPointer<Animator> thumbPosAniamtion;\n};\n\n#endif // QLOG_UI_COMPONENT_SWITCHBUTTON_H\n"
  }
]